apak commited on
Commit
de81b5a
·
verified ·
1 Parent(s): 69cb56d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +13 -18
app.py CHANGED
@@ -4,7 +4,6 @@ from transformers import pipeline
4
  import gradio as gr
5
  import os
6
  import re
7
- # YENİ: Kuantizasyon için ek kütüphane gereksinimi (spaces'te otomatiktir)
8
  # import bitsandbytes # Lokal çalıştırmada gereklidir
9
 
10
  # --- Global Log Listesini Tanımla ---
@@ -12,13 +11,12 @@ _initial_logs = []
12
 
13
  # --- 1. İlk Tarama Modeli (Hızlı NER) ---
14
  _initial_logs.append("1. Standart NER Modeli yükleniyor...")
15
- # GPU varsa 0 (birincil GPU) kullanılır, yoksa -1 (CPU) kullanılır.
16
  device_id = 0 if torch.cuda.is_available() else -1
17
  ner_pipe = pipeline(
18
  "ner",
19
  model="xlm-roberta-large-finetuned-conll03-english",
20
  aggregation_strategy="simple",
21
- device=device_id # Cihaz ID ataması
22
  )
23
  _initial_logs.append("✅ Standart NER Modeli Hazır.")
24
 
@@ -30,24 +28,24 @@ IS_LLM_ENABLED = False
30
 
31
  # Cihaz ayarlarını ve optimizasyonları yapma
32
  if torch.cuda.is_available():
33
- # GPU Optimizations: bfloat16 + 4-bit quantization (en iyi performans/bellek dengesi için)
34
  llm_model_kwargs["torch_dtype"] = torch.bfloat16
35
- llm_model_kwargs["load_in_4bit"] = True # Bellek verimliliği için eklendi
36
  llm_device_map = "auto"
37
  _initial_logs.append("CUDA/GPU desteği bulundu, model **bfloat16 & 4-bit kuantizasyon** ile yüklenecek.")
38
  else:
39
  _initial_logs.append("CUDA desteği bulunamadı, model CPU üzerinde float32 ile yüklenecek.")
40
  llm_device_map = "cpu"
41
 
42
- # YENİ: Qwen gibi modeller için 'trust_remote_code' gerekli olabilir.
43
- llm_model_kwargs["trust_remote_code"] = True
44
 
45
  try:
46
  gen_pipe = pipeline(
47
  "text-generation",
48
  model=model_id,
49
  model_kwargs=llm_model_kwargs,
50
- device_map=llm_device_map
 
51
  )
52
  IS_LLM_ENABLED = True
53
  _initial_logs.append("✅ LLM (Karar Verici) Başarıyla Yüklendi.")
@@ -60,7 +58,11 @@ except Exception as e:
60
 
61
  _initial_logs.append("✅ Modeller Hazır!")
62
 
63
- # --- Wikipedia Fonksiyonu ---
 
 
 
 
64
  wikipedia.set_lang("tr")
65
  def get_wiki_summary(term):
66
  """Wikipedia'dan bir terim için özet bilgi çeker (otomatik öneri ile)."""
@@ -74,7 +76,7 @@ def get_wiki_summary(term):
74
  Exception):
75
  return None
76
 
77
- # --- LLM ile Etiket Rafine Etme Fonksiyonu (RAG Kısıtlamasına Rağmen LLM Hızı İçin Optimize Edildi) ---
78
  def refine_label_with_llm(entity_text, wiki_context, custom_label_definitions):
79
  """LLM kullanarak MISC etiketini özel etiketlerden biriyle rafine eder."""
80
 
@@ -86,7 +88,6 @@ def refine_label_with_llm(entity_text, wiki_context, custom_label_definitions):
86
  [f"- {k}: {v}" for k, v in refinable_labels.items()]
87
  )
88
 
89
- # Few-shot examples (Aynı kaldı)
90
  few_shot_examples = """ÖRNEK 1 (NORP İÇİN):
91
  VARLIK: Türk
92
  BAĞLAM: Türkler, Türkiye Cumhuriyeti'nde yaşayan ve Türkçe konuşan büyük bir etnik gruptur. (NORP tanımı ile eşleşir.)
@@ -115,7 +116,6 @@ GÖZLEM: 'General' bir rütbe, unvan veya pozisyon belirtiyor. Bağlamda 'yükse
115
  AKIL YÜRÜTME: Kişinin unvanını, rütbesini veya pozisyonunu tanımlayan etiket 'TITLE'dır. 'General' bu tanıma uymaktadır.
116
  CEVAP: TITLE
117
  """
118
- # --- Chain of Thought (CoT) Prompt Yapısı ---
119
  prompt = f"""Sen uzman bir veri sınıflandırma sistemisin.
120
  Görevin, aşağıdaki varlığı ve bağlamı analiz ederek, **YALNIZCA** ETİKET TANIMLARI'ndan birini (veya uymuyorsa MISC'i) seçmektir.
121
 
@@ -140,7 +140,6 @@ CEVAP: [YALNIZCA SEÇİLEN ETİKETİ BÜYÜK HARFLERLE YAZ. ÖRNEK: BOOK veya LA
140
  """
141
  messages = [{"role": "user", "content": prompt}]
142
 
143
- # LLM çağrısı
144
  try:
145
  outputs = gen_pipe(
146
  messages,
@@ -152,7 +151,6 @@ CEVAP: [YALNIZCA SEÇİLEN ETİKETİ BÜYÜK HARFLERLE YAZ. ÖRNEK: BOOK veya LA
152
  except Exception as e:
153
  return "MISC", f"LLM çalışma zamanı hatası: {e}"
154
 
155
- # LLM çıktısını analiz etme (REGEX İLE İYİLEŞTİRİLDİ)
156
  final_label = "MISC"
157
  cog_output = ""
158
  valid_labels = list(custom_label_definitions.keys())
@@ -253,7 +251,7 @@ def advanced_ner_pipeline(text, target_labels, progress=gr.Progress()):
253
  log_messages.append("✅ İşlem tamamlandı! Nihai sonuçlar tabloda.")
254
  yield log_messages, final_results
255
 
256
- # --- Özel Etiket Tanımları (23 Etikete Genişletildi - Eksiksiz) ---
257
  custom_label_definitions = {
258
  # Standart CoNLL-2003 etiketleri
259
  "PER": "Kişi adları, takma adlar, ünlüler.",
@@ -296,14 +294,12 @@ def process_ner_request(text, progress=gr.Progress()):
296
  if results_step is not None:
297
  final_results = results_step
298
 
299
- # --- Geçici Log Çıktısı Oluşturma ---
300
  log_output_html = "<div style='max-height: 200px; overflow-y: scroll; border: 1px solid #eee; padding: 10px; margin-bottom: 10px; background-color: #f9f9f9; border-radius: 8px; font-family: monospace; font-size: 12px;'>"
301
  for log in all_logs:
302
  color = 'blue' if '✅' in log else ('orange' if '⚠️' in log else ('red' if '❌' in log else ('gray' if '➡️' in log else 'black')))
303
  log_output_html += f"<p style='margin: 0; color: {color};'>{log.replace(' ', '&nbsp;&nbsp;&nbsp;')}</p>"
304
  log_output_html += "</div>"
305
 
306
- # --- Geçici/Nihai Sonuç Tablosu Oluşturma ---
307
  current_results_html = ""
308
 
309
  if final_results:
@@ -319,7 +315,6 @@ def process_ner_request(text, progress=gr.Progress()):
319
  "CYBER": "background-color: #dbeafe;"
320
  }
321
 
322
- # HTML Tablo Stilleri
323
  current_results_html = """
324
  <style>
325
  .ner-table { width:100%; border-collapse: collapse; font-family: Arial, sans-serif; border-radius: 8px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
 
4
  import gradio as gr
5
  import os
6
  import re
 
7
  # import bitsandbytes # Lokal çalıştırmada gereklidir
8
 
9
  # --- Global Log Listesini Tanımla ---
 
11
 
12
  # --- 1. İlk Tarama Modeli (Hızlı NER) ---
13
  _initial_logs.append("1. Standart NER Modeli yükleniyor...")
 
14
  device_id = 0 if torch.cuda.is_available() else -1
15
  ner_pipe = pipeline(
16
  "ner",
17
  model="xlm-roberta-large-finetuned-conll03-english",
18
  aggregation_strategy="simple",
19
+ device=device_id
20
  )
21
  _initial_logs.append("✅ Standart NER Modeli Hazır.")
22
 
 
28
 
29
  # Cihaz ayarlarını ve optimizasyonları yapma
30
  if torch.cuda.is_available():
 
31
  llm_model_kwargs["torch_dtype"] = torch.bfloat16
32
+ llm_model_kwargs["load_in_4bit"] = True
33
  llm_device_map = "auto"
34
  _initial_logs.append("CUDA/GPU desteği bulundu, model **bfloat16 & 4-bit kuantizasyon** ile yüklenecek.")
35
  else:
36
  _initial_logs.append("CUDA desteği bulunamadı, model CPU üzerinde float32 ile yüklenecek.")
37
  llm_device_map = "cpu"
38
 
39
+ # Hata Düzeltme: 'trust_remote_code' buradan KALDIRILDI.
40
+ # llm_model_kwargs["trust_remote_code"] = True # ❌ Bu satır HATAYA neden oluyordu!
41
 
42
  try:
43
  gen_pipe = pipeline(
44
  "text-generation",
45
  model=model_id,
46
  model_kwargs=llm_model_kwargs,
47
+ device_map=llm_device_map,
48
+ trust_remote_code=True # ✅ Buraya taşındı, artık tekil değer olarak iletiliyor.
49
  )
50
  IS_LLM_ENABLED = True
51
  _initial_logs.append("✅ LLM (Karar Verici) Başarıyla Yüklendi.")
 
58
 
59
  _initial_logs.append("✅ Modeller Hazır!")
60
 
61
+
62
+ # --- Geri kalan tüm kod (Wikipedia Fonksiyonu, LLM Rafine Etme, Pipeline, Etiketler, Gradio Arayüzü) önceki versiyonunuzdaki gibi aynı kalır. ---
63
+ # Not: Tam kodun çalışması için bu noktadan sonraki kısımları aynen eklemelisiniz.
64
+
65
+ # ... (Wikipedia Fonksiyonu)
66
  wikipedia.set_lang("tr")
67
  def get_wiki_summary(term):
68
  """Wikipedia'dan bir terim için özet bilgi çeker (otomatik öneri ile)."""
 
76
  Exception):
77
  return None
78
 
79
+ # --- LLM ile Etiket Rafine Etme Fonksiyonu ---
80
  def refine_label_with_llm(entity_text, wiki_context, custom_label_definitions):
81
  """LLM kullanarak MISC etiketini özel etiketlerden biriyle rafine eder."""
82
 
 
88
  [f"- {k}: {v}" for k, v in refinable_labels.items()]
89
  )
90
 
 
91
  few_shot_examples = """ÖRNEK 1 (NORP İÇİN):
92
  VARLIK: Türk
93
  BAĞLAM: Türkler, Türkiye Cumhuriyeti'nde yaşayan ve Türkçe konuşan büyük bir etnik gruptur. (NORP tanımı ile eşleşir.)
 
116
  AKIL YÜRÜTME: Kişinin unvanını, rütbesini veya pozisyonunu tanımlayan etiket 'TITLE'dır. 'General' bu tanıma uymaktadır.
117
  CEVAP: TITLE
118
  """
 
119
  prompt = f"""Sen uzman bir veri sınıflandırma sistemisin.
120
  Görevin, aşağıdaki varlığı ve bağlamı analiz ederek, **YALNIZCA** ETİKET TANIMLARI'ndan birini (veya uymuyorsa MISC'i) seçmektir.
121
 
 
140
  """
141
  messages = [{"role": "user", "content": prompt}]
142
 
 
143
  try:
144
  outputs = gen_pipe(
145
  messages,
 
151
  except Exception as e:
152
  return "MISC", f"LLM çalışma zamanı hatası: {e}"
153
 
 
154
  final_label = "MISC"
155
  cog_output = ""
156
  valid_labels = list(custom_label_definitions.keys())
 
251
  log_messages.append("✅ İşlem tamamlandı! Nihai sonuçlar tabloda.")
252
  yield log_messages, final_results
253
 
254
+ # --- Özel Etiket Tanımları ---
255
  custom_label_definitions = {
256
  # Standart CoNLL-2003 etiketleri
257
  "PER": "Kişi adları, takma adlar, ünlüler.",
 
294
  if results_step is not None:
295
  final_results = results_step
296
 
 
297
  log_output_html = "<div style='max-height: 200px; overflow-y: scroll; border: 1px solid #eee; padding: 10px; margin-bottom: 10px; background-color: #f9f9f9; border-radius: 8px; font-family: monospace; font-size: 12px;'>"
298
  for log in all_logs:
299
  color = 'blue' if '✅' in log else ('orange' if '⚠️' in log else ('red' if '❌' in log else ('gray' if '➡️' in log else 'black')))
300
  log_output_html += f"<p style='margin: 0; color: {color};'>{log.replace(' ', '&nbsp;&nbsp;&nbsp;')}</p>"
301
  log_output_html += "</div>"
302
 
 
303
  current_results_html = ""
304
 
305
  if final_results:
 
315
  "CYBER": "background-color: #dbeafe;"
316
  }
317
 
 
318
  current_results_html = """
319
  <style>
320
  .ner-table { width:100%; border-collapse: collapse; font-family: Arial, sans-serif; border-radius: 8px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }