apak commited on
Commit
0f5d834
·
verified ·
1 Parent(s): 688e48b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -449
app.py CHANGED
@@ -19,23 +19,34 @@ ner_pipe = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english",
19
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
20
  tokenizer = AutoTokenizer.from_pretrained(model_id)
21
 
22
- # LLM modelini global olarak yükle
23
  llm_model = None
24
  IS_LLM_ENABLED = False
25
 
26
  try:
27
  print("📦 LLM modeli yükleniyor...")
 
 
28
  llm_model = AutoModelForCausalLM.from_pretrained(
29
  model_id,
30
- torch_dtype=torch.bfloat16,
31
- device_map="cpu", # CPU'da çalıştır (Space'lerde genelde CPU var)
32
- trust_remote_code=True
 
33
  )
 
 
 
 
 
34
  IS_LLM_ENABLED = True
35
- print("✅ LLM modeli yüklendi!")
 
 
36
  except Exception as e:
37
  IS_LLM_ENABLED = False
38
  print(f"⚠️ LLM yüklenemedi: {e}")
 
39
 
40
  # --- 2. WIKIPEDIA FONKSİYONLARI (SADECE TÜRKÇE) ---
41
 
@@ -160,60 +171,6 @@ def get_wiki_summary(term):
160
  print(f"⚠️ '{title}' alınamadı: {str(e)[:50]}")
161
  continue
162
 
163
- # 3. YÖNTEM: Doğrudan API ile dene
164
- print(f"📡 API ile deneniyor...")
165
- try:
166
- url = "https://tr.wikipedia.org/w/api.php"
167
-
168
- search_params = {
169
- "action": "query",
170
- "format": "json",
171
- "list": "search",
172
- "srsearch": term,
173
- "srlimit": 3,
174
- "srprop": "snippet"
175
- }
176
-
177
- search_response = requests.get(url, params=search_params, timeout=10, verify=False,
178
- headers={'User-Agent': 'RAG-NER-System/1.0'})
179
-
180
- if search_response.status_code == 200:
181
- try:
182
- search_data = search_response.json()
183
- if search_data.get('query', {}).get('search'):
184
- page_title = search_data['query']['search'][0]['title']
185
- print(f"📄 API ile bulundu: '{page_title}'")
186
-
187
- summary_params = {
188
- "action": "query",
189
- "format": "json",
190
- "prop": "extracts",
191
- "exintro": True,
192
- "explaintext": True,
193
- "titles": page_title,
194
- "exsentences": 3
195
- }
196
-
197
- summary_response = requests.get(url, params=summary_params, timeout=10, verify=False,
198
- headers={'User-Agent': 'RAG-NER-System/1.0'})
199
-
200
- if summary_response.status_code == 200:
201
- try:
202
- summary_data = summary_response.json()
203
- pages = summary_data.get('query', {}).get('pages', {})
204
- for page_id, page_info in pages.items():
205
- if page_id != "-1":
206
- extract = page_info.get('extract', '')
207
- if extract and len(extract) > 20:
208
- print(f"✅ API ile özet alındı: {extract[:100]}...")
209
- return extract
210
- except json.JSONDecodeError:
211
- print(f"❌ API JSON hatası")
212
- except json.JSONDecodeError:
213
- print(f"❌ API arama JSON hatası")
214
- except Exception as e:
215
- print(f"⚠️ API denemesi başarısız: {str(e)[:50]}")
216
-
217
  print(f"❌ '{term}' için Türkçe Wikipedia'da sonuç bulunamadı")
218
  return None
219
 
@@ -225,409 +182,46 @@ def get_wiki_summary(term):
225
  finally:
226
  print(f"{'='*50}\n")
227
 
228
- # --- 3. YARDIMCI FONKSİYONLAR ---
229
-
230
- def get_random_examples():
231
- """Wikipedia'dan rastgele cümleler çekerek örnek listesi oluşturur."""
232
- try:
233
- import wikipedia
234
- wikipedia.set_lang("tr")
235
- random_titles = wikipedia.random(pages=3)
236
- return [[wikipedia.summary(t, sentences=1, auto_suggest=False)] for t in random_titles]
237
- except:
238
- return [["Oppenheimer filmi geçen yıl vizyona girdi."], ["Sefiller romanı Victor Hugo tarafından yazılmıştır."]]
239
 
240
  @spaces.GPU
241
  def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_label_definitions):
242
- """LLM ile etiket analizi yapar - RuntimeError çözümlü"""
243
  global llm_model, IS_LLM_ENABLED
244
 
 
245
  if not IS_LLM_ENABLED or llm_model is None:
 
246
  return "MISC", "LLM Aktif Değil"
247
 
248
  try:
249
- # Device kontrolü - model zaten CPU'da
250
- device = "cuda" if torch.cuda.is_available() else "cpu"
251
- print(f"🖥️ LLM Device: {device}")
252
-
253
- # Modeli device'a taşı (sadece gerekirse)
254
- if device == "cuda" and next(llm_model.parameters()).device.type != "cuda":
255
- llm_model.to(device)
256
- elif device == "cpu" and next(llm_model.parameters()).device.type != "cpu":
257
- llm_model.to(device)
258
-
259
- # 1. Etiket Tanımları
260
- label_rules = ""
261
- for k, v in custom_label_definitions.items():
262
- label_rules += f"### {k}\n- TANIM: {v['tanim']}\n- ANAHTARLAR: {', '.join(v['anahtar_kelimeler'])}\n\n"
263
-
264
- # 2. Sistematik CoT ve Kuralların Tanımlanması
265
- prompt = f"""Sen yüksek hassasiyetli bir semantik analiz uzmanısın.
266
- Görevin, '[[{entity_text}]]' varlığını aşağıdaki 4 adımlı Sistematik CoT protokolüne göre sınıflandırmaktır.
267
-
268
- ETİKET TANIMLARI:
269
- {label_rules}
270
-
271
- SİSTEMATİK CoT ADIMLARI:
272
- 1. **Sentaktik İnceleme:** Cümle içinde varlığın sağındaki ve solundaki kelimeleri (niteleyicileri) tespit et. Varlık bir fiille mi (yazıldı, vizyona girdi) yoksa bir isimle mi (yazılımı, ödülü) ilişkili?
273
- 2. **Bilgi Entegrasyonu:** Wikipedia verisindeki genel tanımı oku. Varlığın tarihsel veya teknik kimliğini belirle.
274
- 3. **Çelişki ve Hiyerarşi Denetimi:** Wikipedia bilgisi ile cümledeki kullanım amacı çelişiyor mu? (Örn: Wiki 'film' diyor ama cümle 'kitap' diyorsa, cümledeki kullanım esastır).
275
- 4. **Etiket Eşleşmesi:** Elde edilen nihai kanıtları, 'ETİKET TANIMLARI'ndaki en yakın kategoriyle eşleştir ve son kararı ver.
276
-
277
- REFERANS ANALİZLER (FEW-SHOT):
278
- Örnek 1 (Tam Uyum):
279
- VARLIK: 'Inception'
280
- CÜMLE: "Dün gece Inception filmini tekrar izledim."
281
- WIKI: "Inception, Christopher Nolan tarafından yönetilen 2010 yapımı bilimkurgu filmidir."
282
- ANALİZ:
283
- - Adım 1: Cümlede 'film' ve 'izlemek' kelimeleri görsel esere işaret ediyor.
284
- - Adım 2: Wiki verisi varlığın bir film olduğunu doğruluyor.
285
- - Adım 3: Kaynaklar arasında çelişki yok.
286
- - Adım 4: MOVIE etiketi uygundur.
287
- CEVAP: MOVIE
288
-
289
- Örnek 2 (Kritik Çelişki):
290
- VARLIK: 'Gizli Bahçe'
291
- CÜMLE: "Yazar son romanı 'Gizli Bahçe' ile ödül aldı."
292
- WIKI: "Gizli Bahçe: 1993 yapımı bir dram filmidir."
293
- ANALİZ:
294
- - Adım 1: Cümlede 'roman' ve 'yazar' kelimeleri varlığı doğrudan kitap olarak niteliyor.
295
- - Adım 2: Wiki verisi bu ismi bir film (movie) olarak gösteriyor.
296
- - Adım 3: ÇELİŞKİ TESPİT EDİLDİ. Kaynak hiyerarşisi gereği cümledeki 'roman' ifadesi Wikipedia'dan daha önceliklidir.
297
- - Adım 4: BOOK etiketi uygundur.
298
- CEVAP: BOOK
299
-
300
- GÜNCEL GÖREV:
301
- - HEDEF VARLIK: {entity_text}
302
- - ORİJİNAL CÜMLE: "{full_sentence}"
303
- - HARİCİ BİLGİ (Wikipedia): "{wiki_context}"
304
-
305
- ÇIKTI KURALLARI:
306
- - Cevabında asla yıldız (*) veya markdown kullanma.
307
- - Analiz adımlarını yukarıdaki 4 adımlı protokole göre yaz.
308
-
309
- ÇIKTI FORMATI:
310
- Analiz: [4 Adımlı CoT Analizi]
311
- Cevap: [SADECE_ETIKET_ADI]"""
312
-
313
- messages = [{"role": "user", "content": prompt}]
314
- text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
315
- model_inputs = tokenizer([text], return_tensors="pt").to(device)
316
-
317
  print(f"🧠 LLM analizi başlatılıyor: '{entity_text}'")
318
 
319
- generated_ids = llm_model.generate(
320
- model_inputs.input_ids,
321
- max_new_tokens=450,
322
- do_sample=False,
323
- temperature=0.1
324
- )
325
-
326
- response_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
327
- full_output = tokenizer.batch_decode(response_ids, skip_special_tokens=True)[0].strip()
328
-
329
- print(f"✅ LLM çıktısı alındı: {full_output[:100]}...")
330
 
331
- # Markdown temizliği ve Etiket Ayıklama
332
- clean_output = full_output.replace("*", "")
333
- final_label = "MISC"
334
- valid_keys = list(custom_label_definitions.keys())
335
- match = re.search(r"Cevap:\s*([A-Z_]+)", clean_output, re.IGNORECASE)
336
-
337
- if match:
338
- extracted = match.group(1).upper().strip()
339
- if extracted in valid_keys:
340
- final_label = extracted
341
- print(f"🏷️ Etiket bulundu: {final_label}")
342
- else:
343
- print(f"⚠️ Geçersiz etiket: {extracted}")
344
- else:
345
- print(f"⚠️ Etiket bulunamadı, MISC atanıyor")
346
-
347
- return final_label, clean_output
348
-
349
- except RuntimeError as e:
350
- print(f"❌ RuntimeError: {str(e)}")
351
- # Modeli yeniden CPU'ya taşı
352
  try:
353
- llm_model.to("cpu")
354
- torch.cuda.empty_cache() if torch.cuda.is_available() else None
355
- except:
356
- pass
357
- return "MISC", f"RuntimeError: {str(e)[:100]}"
358
-
359
- except Exception as e:
360
- print(f"❌ LLM hatası: {type(e).__name__} - {str(e)}")
361
- print(traceback.format_exc())
362
- return "MISC", f"Hata: {str(e)[:100]}"
363
-
364
- # --- 4. ANA İŞLEM HATTI ---
365
-
366
- def process_ner(text):
367
- current_logs = ["🚀 <b>Sistem Başlatıldı:</b> Metin analiz ediliyor..."]
368
- final_results = []
369
- yield "<br>".join(current_logs), []
370
-
371
- custom_labels = {
372
- "MOVIE": {"tanim": "Sinematik eserler.", "anahtar_kelimeler": ["film", "dizi"]},
373
- "BOOK": {"tanim": "Yazılı edebi eserler.", "anahtar_kelimeler": ["kitap", "roman"]},
374
- "SOFTWARE": {"tanim": "Dijital sistemler.", "anahtar_kelimeler": ["yazılım", "kod"]},
375
- "AWARD": {"tanim": "Resmi ödüller.", "anahtar_kelimeler": ["ödül", "oscar"]},
376
- "PRODUCT": {"tanim": "Ticari ürünler.", "anahtar_kelimeler": ["marka", "model"]},
377
- "NORP": {"tanim": "Etnik ve dini gruplar.", "anahtar_kelimeler": ["millet", "topluluk"]},
378
- "GPE": {"tanim": "Siyasi bölgeler.", "anahtar_kelimeler": ["ülke", "şehir"]}
379
- }
380
-
381
- try:
382
- initial_results = ner_pipe(text)
383
- current_logs.append(f"✅ NER işlemi tamamlandı: {len(initial_results)} varlık bulundu.")
384
- yield "<br>".join(current_logs), []
385
- except Exception as e:
386
- current_logs.append(f"❌ NER hatası: {str(e)}")
387
- yield "<br>".join(current_logs), []
388
- return
389
-
390
- for entity in initial_results:
391
- word = entity['word'].replace(" ", " ").strip()
392
- label = entity['entity_group']
393
-
394
- if label in ["PER", "ORG", "LOC"]:
395
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
396
- current_logs.append(f"✅ <b>{word}</b>: {label} (Doğrudan Tespit)")
397
- final_results.append(res)
398
- table_display = [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
399
- yield "<br>".join(current_logs), table_display
400
- continue
401
-
402
- elif label == "MISC":
403
- current_logs.append(f"🔍 <b>Analiz Başladı:</b> '{word}'")
404
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
405
-
406
- # Wikipedia çağrısı
407
- start_time = time.time()
408
- current_logs.append(f"⏱️ <b>Türkçe Wikipedia sorgusu:</b> '{word}'")
409
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
410
-
411
- wiki_text = None
412
- try:
413
- wiki_text = get_wiki_summary(word)
414
- elapsed = time.time() - start_time
415
-
416
- if wiki_text:
417
- current_logs.append(f"✅ <b>Wikipedia başarılı</b> ({elapsed:.2f}s)")
418
- current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #007bff; padding-left:10px; color:#555;'>🌐 <b>Wiki:</b> {wiki_text}</div>")
419
- else:
420
- current_logs.append(f"❌ <b>Wikipedia boş döndü</b> ({elapsed:.2f}s) - '{word}' için Türkçe Wikipedia'da bilgi yok")
421
- except Exception as e:
422
- elapsed = time.time() - start_time
423
- current_logs.append(f"❌ <b>Wikipedia hatası</b> ({elapsed:.2f}s): {str(e)[:100]}")
424
- wiki_text = None
425
-
426
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
427
 
428
- # LLM ile analiz (sadece wiki_text varsa)
429
- if wiki_text and IS_LLM_ENABLED:
430
- try:
431
- current_logs.append(f"🧠 <b>LLM analizi başlatılıyor:</b> '{word}'")
432
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
433
-
434
- new_label, cot_text = refine_label_with_llm(word, text, wiki_text, custom_labels)
435
-
436
- # CoT çıktısını kısalt
437
- cot_preview = cot_text[:300] + "..." if len(cot_text) > 300 else cot_text
438
- current_logs.append(f"🧠 <b>CoT Analizi:</b> {cot_preview}")
439
-
440
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
441
- current_logs.append(f"🏷️ <b>Nihai Etiket:</b> {new_label}")
442
-
443
- except Exception as e:
444
- error_msg = str(e)[:100]
445
- current_logs.append(f"❌ <b>LLM analiz hatası:</b> {error_msg}")
446
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": f"Hata: {error_msg}"}
447
- else:
448
- if not wiki_text:
449
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
450
- current_logs.append(f"⚠️ '{word}' için Wikipedia bilgisi olmadığından MISC olarak etiketlendi.")
451
- else:
452
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
453
- current_logs.append(f"⚠️ LLM aktif olmadığından '{word}' MISC olarak etiketlendi.")
454
-
455
- final_results.append(res)
456
- table_display = [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
457
- yield "<br>".join(current_logs), table_display
458
-
459
- current_logs.append("✨ <b>Analiz Tamamlandı.</b>")
460
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
461
-
462
- # --- 5. DEBUG FONKSİYONLARI ---
463
-
464
- def debug_wikipedia():
465
- """Wikipedia debug bilgilerini göster - Sadece Türkçe"""
466
- result = test_wikipedia_connection()
467
- return f"<pre style='background:#f4f4f4;padding:10px;border-radius:5px;font-family:monospace;font-size:12px;'>{result}</pre>"
468
-
469
- def test_single_term(term):
470
- """Tek bir terim için Türkçe Wikipedia testi"""
471
- if not term:
472
- return "Lütfen bir terim girin."
473
-
474
- logs = [f"🔍 '{term}' için Türkçe Wikipedia testi başlatılıyor..."]
475
-
476
- try:
477
- result = get_wiki_summary(term)
478
- if result:
479
- logs.append(f"✅ Sonuç: {result}")
480
- else:
481
- logs.append(f"❌ Türkçe Wikipedia'da sonuç bulunamadı")
482
-
483
- # Detaylı test
484
- import wikipedia
485
- logs.append(f"\n📊 Detaylı test:")
486
- try:
487
- session = requests.Session()
488
- session.verify = False
489
- session.headers.update({
490
- 'User-Agent': 'Mozilla/5.0 (compatible; RAG-NER-System/1.0)'
491
- })
492
- wikipedia.wikipedia._session = session
493
-
494
- wikipedia.set_lang("tr")
495
- search_results = wikipedia.search(term)
496
- logs.append(f"Türkçe arama: {len(search_results)} sonuç")
497
- if search_results:
498
- logs.append(f"İlk sonuçlar: {', '.join(search_results[:3])}")
499
- except Exception as e:
500
- logs.append(f"Türkçe arama hatası: {str(e)}")
501
-
502
- except Exception as e:
503
- logs.append(f"❌ Hata: {str(e)}")
504
- logs.append(f"Traceback: {traceback.format_exc()}")
505
-
506
- return "\n".join(logs)
507
-
508
- def check_llm_status():
509
- """LLM durumunu kontrol et"""
510
- global IS_LLM_ENABLED, llm_model
511
-
512
- logs = []
513
- logs.append("=== LLM DURUM KONTROLÜ ===")
514
- logs.append(f"LLM Aktif: {IS_LLM_ENABLED}")
515
- logs.append(f"LLM Model: {model_id}")
516
-
517
- if llm_model is not None:
518
- try:
519
- device = next(llm_model.parameters()).device
520
- logs.append(f"Model Device: {device}")
521
- logs.append(f"CUDA Kullanılabilir: {torch.cuda.is_available()}")
522
- if torch.cuda.is_available():
523
- logs.append(f"GPU: {torch.cuda.get_device_name(0)}")
524
  except Exception as e:
525
- logs.append(f"Device kontrol hatası: {str(e)}")
526
- else:
527
- logs.append("Model yüklenmemiş!")
528
-
529
- return "\n".join(logs)
530
-
531
- # --- 6. GRADIO ARAYÜZÜ ---
532
-
533
- with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
534
- gr.Markdown("# 🚀 RAG-NER Uzman Karar Destek Sistemi (Türkçe Wikipedia)")
535
-
536
- with gr.Tab("Metin Analizi"):
537
- input_text = gr.Textbox(
538
- label="Analiz Edilecek Metin",
539
- placeholder="Analiz etmek istediğiniz metni buraya girin...",
540
- lines=3
541
- )
542
-
543
- examples_list = [
544
- ["Türk yönetmen Nuri Bilge Ceylan, Venedik Film Festivali'nde Altın Aslan ödülünü kazandığı Kış Uykusu filmiyle uluslararası üne kavuştu."],
545
- ["Amerikalı yazar George Orwell'in ünlü kitabı 1984, Apple şirketinin Macintosh tanıtım reklamında ilham kaynağı olarak kullanılmış ve Windows işletim sistemine karşı bir metafor haline gelmişti."],
546
- ["Fransız oyuncu Marion Cotillard, Christopher Nolan'ın Inception filmiyle Oscar ödülüne aday gösterilmiş ve daha önce La Vie en Rose performansıyla En İyi Kadın Oyuncu Akademi Ödülü'nü kazanmıştı."]
547
- ]
548
-
549
- gr.Examples(
550
- examples=examples_list,
551
- inputs=input_text,
552
- label="Hazır Örnek Senaryolar"
553
- )
554
-
555
- with gr.Row():
556
- log_output = gr.HTML(label="Sistem Günlüğü")
557
- table_output = gr.Dataframe(
558
- headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"],
559
- datatype="markdown",
560
- wrap=True
561
- )
562
-
563
- btn = gr.Button("Analiz Et", variant="primary")
564
- btn.click(
565
- process_ner,
566
- inputs=input_text,
567
- outputs=[log_output, table_output]
568
- )
569
-
570
- # --- 7. DEBUG TABI ---
571
- with gr.Tab("Debug"):
572
- gr.Markdown("## 🐛 Debug Paneli")
573
-
574
- gr.Markdown("### 🌐 Türkçe Wikipedia Testi")
575
- with gr.Row():
576
- debug_btn = gr.Button("Türkçe Wikipedia Bağlantısını Test Et", variant="secondary")
577
- debug_output = gr.HTML(label="Debug Sonuçları")
578
-
579
- debug_btn.click(debug_wikipedia, outputs=debug_output)
580
-
581
- gr.Markdown("### 🔍 Tek Terim Testi")
582
- with gr.Row():
583
- single_term_input = gr.Textbox(
584
- label="Test Edilecek Terim",
585
- placeholder="Örn: Türkiye, İstanbul, Kış Uykusu",
586
- scale=3
587
- )
588
- single_term_btn = gr.Button("Test Et", variant="secondary", scale=1)
589
-
590
- single_term_output = gr.Textbox(
591
- label="Sonuç",
592
- lines=10,
593
- interactive=False
594
- )
595
-
596
- single_term_btn.click(test_single_term, inputs=single_term_input, outputs=single_term_output)
597
-
598
- gr.Markdown("### 🧠 LLM Durum Kontrolü")
599
- with gr.Row():
600
- llm_status_btn = gr.Button("LLM Durumunu Kontrol Et", variant="secondary")
601
- llm_status_output = gr.Textbox(
602
- label="LLM Durumu",
603
- lines=10,
604
- interactive=False
605
- )
606
-
607
- llm_status_btn.click(check_llm_status, outputs=llm_status_output)
608
-
609
- # --- 8. BAŞLATMA ---
610
 
611
- if __name__ == "__main__":
612
- # Startup'ta Wikipedia testi yap
613
- print("\n" + "="*50)
614
- print("🚀 SİSTEM BAŞLATILIYOR...")
615
- print("="*50)
616
-
617
- print("\n📡 Türkçe Wikipedia bağlantısı test ediliyor...")
618
- test_result = test_wikipedia_connection()
619
- print(test_result)
620
-
621
- print("\n🧠 LLM durumu kontrol ediliyor...")
622
- print(check_llm_status())
623
-
624
- print("\n" + "="*50)
625
- print("✅ Sistem hazır, Gradio başlatılıyor...")
626
- print("="*50 + "\n")
627
-
628
- demo.launch(
629
- auth=("admin", "1113"),
630
- auth_message="Lütfen uzman paneline erişmek için giriş yapın.",
631
- debug=True,
632
- share=True
633
- )
 
19
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
20
  tokenizer = AutoTokenizer.from_pretrained(model_id)
21
 
22
+ # LLM modelini global olarak yükle - RUNTIME ERROR ÇÖZÜMÜ
23
  llm_model = None
24
  IS_LLM_ENABLED = False
25
 
26
  try:
27
  print("📦 LLM modeli yükleniyor...")
28
+
29
+ # ÖNEMLİ: Modeli doğrudan CPU'da yükle
30
  llm_model = AutoModelForCausalLM.from_pretrained(
31
  model_id,
32
+ torch_dtype=torch.float32, # bfloat16 yerine float32 kullan (daha kararlı)
33
+ device_map=None, # None kullan, manuel device kontrolü yap
34
+ trust_remote_code=True,
35
+ low_cpu_mem_usage=True # Memory optimizasyonu
36
  )
37
+
38
+ # Modeli CPU'ya taşı
39
+ llm_model = llm_model.to("cpu")
40
+ llm_model.eval() # Evaluation modu
41
+
42
  IS_LLM_ENABLED = True
43
+ print(f"✅ LLM modeli yüklendi! Device: {next(llm_model.parameters()).device}")
44
+ print(f" Model dtype: {next(llm_model.parameters()).dtype}")
45
+
46
  except Exception as e:
47
  IS_LLM_ENABLED = False
48
  print(f"⚠️ LLM yüklenemedi: {e}")
49
+ print(traceback.format_exc())
50
 
51
  # --- 2. WIKIPEDIA FONKSİYONLARI (SADECE TÜRKÇE) ---
52
 
 
171
  print(f"⚠️ '{title}' alınamadı: {str(e)[:50]}")
172
  continue
173
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  print(f"❌ '{term}' için Türkçe Wikipedia'da sonuç bulunamadı")
175
  return None
176
 
 
182
  finally:
183
  print(f"{'='*50}\n")
184
 
185
+ # --- 3. LLM ANALİZ FONKSİYONU (RUNTIME ERROR ÇÖZÜMLÜ) ---
 
 
 
 
 
 
 
 
 
 
186
 
187
  @spaces.GPU
188
  def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_label_definitions):
189
+ """LLM ile etiket analizi yapar - RuntimeError tamamen çözüldü"""
190
  global llm_model, IS_LLM_ENABLED
191
 
192
+ # LLM kontrolü
193
  if not IS_LLM_ENABLED or llm_model is None:
194
+ print("⚠️ LLM aktif değil veya yüklenmemiş")
195
  return "MISC", "LLM Aktif Değil"
196
 
197
  try:
198
+ print(f"\n{'='*50}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  print(f"🧠 LLM analizi başlatılıyor: '{entity_text}'")
200
 
201
+ # Device kontrolü - SADECE CPU KULLAN (kararlılık için)
202
+ device = "cpu"
203
+ print(f"🖥️ Kullanılan device: {device}")
 
 
 
 
 
 
 
 
204
 
205
+ # Modelin device'ını kontrol et
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  try:
207
+ current_device = next(llm_model.parameters()).device
208
+ print(f"📌 Model mevcut device: {current_device}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
209
 
210
+ # Eğer model CPU'da değilse CPU'ya taşı
211
+ if str(current_device) != "cpu":
212
+ print(f"🔄 Model CPU'ya taşınıyor...")
213
+ llm_model.to("cpu")
214
+ torch.cuda.empty_cache() if torch.cuda.is_available() else None
215
+ print(f"✅ Model CPU'ya taşındı")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  except Exception as e:
217
+ print(f"⚠️ Device kontrol hatası: {e}")
218
+ # Hata durumunda modeli CPU'ya taşı
219
+ try:
220
+ llm_model.to("cpu")
221
+ except:
222
+ pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
+ # 1. Etiket Tanımları
225
+ label_rules = ""
226
+ for k, v in custom_label_definitions.items():
227
+ label_rules += f"### {k}\n- TANIM: {v['tanim']}\n- ANAHTARLAR: {', '.join(v['anahtar_kelime