apak commited on
Commit
038f1ee
·
verified ·
1 Parent(s): 6c0a861

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +85 -45
app.py CHANGED
@@ -1,29 +1,32 @@
1
  import torch
2
  import os
3
  import re
4
- import requests # Wikipedia kütüphanesi yerine doğrudan requests kullanıyoruz
5
  import gradio as gr
6
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
7
  from labels_config import custom_labels
8
  import spaces
9
 
10
  # --- 1. MODELLERİN HAZIRLANMASI ---
 
11
  ner_pipe = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english", aggregation_strategy="simple", device=-1)
 
12
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
13
  tokenizer = AutoTokenizer.from_pretrained(model_id)
14
 
15
  try:
 
16
  llm_model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="cpu", trust_remote_code=True)
17
  IS_LLM_ENABLED = True
18
  except Exception as e:
19
- print(f"Model yükleme hatası: {e}")
20
  IS_LLM_ENABLED = False
21
 
22
  # --- 2. GÜVENLİ WIKIPEDIA FONKSİYONU (USER-AGENT İLE) ---
23
  def get_wiki_summary(term):
24
- """Wikipedia API'sini güvenli ve kimlikli bir şekilde sorgular."""
25
  try:
26
- # Wikipedia'nın bizi engellememesi için benzersiz bir User-Agent tanımlıyoruz
27
  headers = {
28
  'User-Agent': 'HuggingFaceRAGBot/1.0 (iletisim@eposta.com; RAG-NER Application)'
29
  }
@@ -68,42 +71,50 @@ def get_wiki_summary(term):
68
 
69
  return None
70
  except Exception as e:
71
- # Hata oluşursa loglara ne olduğunu basıyoruz
72
- print(f"Wikipedia Bağlantı Hatası: {str(e)}")
73
  return None
74
 
75
- # --- 3. ETİKET GÜNCELLEME FONKSİYONU ---
76
  @spaces.GPU
77
  def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_labels):
78
- if not IS_LLM_ENABLED: return "MISC", "LLM Aktif Değil"
 
 
79
 
80
  device = "cuda" if torch.cuda.is_available() else "cpu"
81
  llm_model.to(device)
82
 
 
83
  label_rules = ""
84
  for k, v in custom_labels.items():
85
- label_rules += f"### {k}\n- Tanım: {v['tanim']}\n- Anahtar Kelimeler: {', '.join(v['anahtar_kelimeler'])}\n- Örnekler: {', '.join(v['ornekler'])}\n\n"
86
-
 
87
  prompt = f"""
88
- Sen yüksek hassasiyetli bir semantik analiz uzmanısın. Görevin, '[[{entity_text}]]' varlığını aşağıdaki 4 adımlı Sistematik CoT protokolüne göre sınıflandırmaktır.
89
 
90
- ETİKET TANIMLARI:
91
  {label_rules}
92
 
93
- SİSTEMATİK CoT ADIMLARI:
94
- Adım 1: Wikipedia'dan gelen bilgilere ("{wiki_context}") dayanarak varlığın niteliklerini belirle( yazılım , film, kitap vb.).
95
- Adım 2: Belirlediğin nitelikleri yukarıdaki {label_rules} listesindeki bütün alanlarla karşılaştır.
96
- Adım 3: En yüksek anlamsal benzerliğe sahip etiketi RAG sonucu olarak seç. Kararını somut kanıtlara dayandır
97
- Adım 4: Eğer Wikipedia bilgisi yetersizse veya {label_rules} dışındaki bir etiket seçtiysen; varlığın ([[{entity_text}]]) yanındaki niteleyici kelimelerle ("filmi","ödül","romanı" vb) birlikte Adım 1, Adım 2 ve Adım 3 aşamalarını tekrarla. Eğer hiçbir etiket {label_rules} listesine uyum sağlanamazsa MISC değerini koru.
98
 
99
- GÜNCEL GÖREV:
100
  - HEDEF VARLIK: {entity_text}
101
- - ORİJİNAL CÜMLE: "{full_sentence}"
102
- - DAHİLİ BİLGİ : "{custom_labels}"
103
- - HARİCİ BİLGİ (Wikipedia): "{wiki_context}"
 
 
 
 
 
104
 
105
- ÇIKTI FORMATI:
106
- Analiz: [4 Adımlı CoT Analizi]
107
  Cevap:
108
  [SADECE_ETIKET_ADI]
109
  """
@@ -124,17 +135,20 @@ def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_label
124
 
125
  if match:
126
  extracted = match.group(1).upper().strip()
127
- if extracted in valid_keys: final_label = extracted
 
128
 
129
  return final_label, clean_output
130
  except Exception as e:
131
  return "MISC", f"Hata: {str(e)}"
132
 
133
- # --- 4. ANA İŞLEM HATTI ---
134
  def process_ner(text):
135
- current_logs = ["<b>Sistem Başlatıldı:</b> Metin analiz ediliyor..."]
 
136
  final_results = []
137
  yield "<br>".join(current_logs), []
 
138
  initial_results = ner_pipe(text)
139
 
140
  for entity in initial_results:
@@ -142,37 +156,63 @@ def process_ner(text):
142
  label = entity['entity_group']
143
 
144
  if label in ["PER", "ORG", "LOC"]:
145
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
146
- current_logs.append(f"✅ <b>{word}</b>: {label} (Doğrudan Tespit)")
147
  elif label == "MISC":
148
- current_logs.append(f"🔍 <b>Analiz Başladı:</b> '{word}'")
149
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
150
 
151
- # İnternet isteği @spaces.GPU dışındaki bu ana fonksiyonda güvenle çalışır
152
  wiki_text = get_wiki_summary(word)
153
  if wiki_text:
154
  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>")
155
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
156
 
157
- # Sadece LLM işlemi için GPU container'ına gidiyoruz
158
  new_label, cot_text = refine_label_with_llm(word, text, wiki_text, custom_labels)
159
  current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #28a745; padding-left:10px;'>🧠 <b>CoT Analizi:</b> {cot_text}</div>")
160
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
161
  else:
162
- current_logs.append(f"⚠️ '{word}' için Wikipedia kaydı bulunamadı veya sunucu bloklandı.")
163
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
164
 
165
  final_results.append(res)
166
- table_display = [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
167
  yield "<br>".join(current_logs), table_display
168
 
169
- current_logs.append("✨ <b>Analiz Tamamlandı.</b>")
170
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
171
 
172
- # --- 5. GRADIO ARAYÜZÜ ---
173
- with gr.Blocks(title="RAG-NER") as demo:
174
- # Eksik kalan Gradio arayüz kodlarınızı (inputs, outputs vb.) buraya ekleyin
175
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
 
177
- if __name__ == "__main__":
178
- demo.queue().launch()
 
 
1
  import torch
2
  import os
3
  import re
4
+ import requests
5
  import gradio as gr
6
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
7
  from labels_config import custom_labels
8
  import spaces
9
 
10
  # --- 1. MODELLERİN HAZIRLANMASI ---
11
+ # NER modeli CPU üzerinde çalışacak şekilde ayarlandı
12
  ner_pipe = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english", aggregation_strategy="simple", device=-1)
13
+
14
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
15
  tokenizer = AutoTokenizer.from_pretrained(model_id)
16
 
17
  try:
18
+ # Model başlangıçta CPU'da yüklenir, @spaces.GPU çağrıldığında otomatik GPU'ya taşınır
19
  llm_model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="cpu", trust_remote_code=True)
20
  IS_LLM_ENABLED = True
21
  except Exception as e:
22
+ print(f"Model yukleme hatasi: {e}")
23
  IS_LLM_ENABLED = False
24
 
25
  # --- 2. GÜVENLİ WIKIPEDIA FONKSİYONU (USER-AGENT İLE) ---
26
  def get_wiki_summary(term):
27
+ """Wikipedia API'sini kimlik bilgisi (User-Agent) ile guvenli sekilde sorgular."""
28
  try:
29
+ # Wikipedia'nın Hugging Face sunucularını engellememesi için kritik başlık
30
  headers = {
31
  'User-Agent': 'HuggingFaceRAGBot/1.0 (iletisim@eposta.com; RAG-NER Application)'
32
  }
 
71
 
72
  return None
73
  except Exception as e:
74
+ print(f"Wikipedia Baglanti Hatasi: {str(e)}")
 
75
  return None
76
 
77
+ # --- 3. ETİKET GÜNCELLEME FONKSİYONU (GPU DEKORATÖRÜ) ---
78
  @spaces.GPU
79
  def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_labels):
80
+ """Sadece LLM üretimi için GPU katmanını tetikler (İnternet erişimi barındırmaz)."""
81
+ if not IS_LLM_ENABLED:
82
+ return "MISC", "LLM Aktif Degil"
83
 
84
  device = "cuda" if torch.cuda.is_available() else "cpu"
85
  llm_model.to(device)
86
 
87
+ # 3.1 Etiket Tanımları oluşturma
88
  label_rules = ""
89
  for k, v in custom_labels.items():
90
+ label_rules += f"### {k}\n- Tanim: {v['tanim']}\n- Anahtar Kelimeler: {', '.join(v['anahtar_kelimeler'])}\n- Ornekler: {', '.join(v['ornekler'])}\n\n"
91
+
92
+ # 3.2 Sistematik Chain of Thought ve Kuralların Tanımlanması
93
  prompt = f"""
94
+ Sen yuksek hassasiyetli bir semantik analiz uzmanisin. Gorevin, '[[{entity_text}]]' varligini asagidaki 4 adimli Sistematik CoT protokolune gore siniflandirmaktir.
95
 
96
+ ETIKET TANIMLARI:
97
  {label_rules}
98
 
99
+ SISTEMATIK CoT ADIMLARI:
100
+ Adim 1: Wikipedia'dan gelen bilgilere ("{wiki_context}") dayanarak varligin niteliklerini belirle( yazilim , film, kitap vb.).
101
+ Adim 2: Belirledigin nitelikleri yukaridaki {label_rules} listesindeki butun alanlarla karsilastir.
102
+ Adim 3: En yuksek anlamsal benzerlige sahip etiketi RAG sonucu olarak sec. Kararini somut kanitlara dayandir
103
+ Adim 4: Eger Wikipedia bilgisi yetersizse veya {label_rules} disindaki bir etiket sectiysen; varligin ([[{entity_text}]]) yanindaki niteleyici kelimelerle ("filmi","odul","romanı" vb) birlikte Adim 1, Adim 2 ve Adim 3 asamalarini tekrarla. Eger hicbir etiket {label_rules} listesine uyum saglanamazsa MISC degerini koru.
104
 
105
+ GUNCEL GOREV:
106
  - HEDEF VARLIK: {entity_text}
107
+ - ORIJINAL CUMLE: "{full_sentence}"
108
+ - DAHILI BILGI : "{custom_labels}"
109
+ - HARICI BILGI (Wikipedia): "{wiki_context}"
110
+
111
+ CIKTI KURALLARI:
112
+ - Cevabinda asla yildiz (*) veya markdown kullanma.
113
+ - Analiz adimlarini yukaridaki 4 adimli protokole gore yaz. Wikipediadan gelen cevabi yazma, sadece kendi degerlendirmeni yaz.
114
+ - Yanitini hicbir aciklama eklemeden dogrudan [ {{ ... }} ] formatinda baslat ve bitir.
115
 
116
+ CIKTI FORMATI:
117
+ Analiz: [4 Adimli CoT Analizi]
118
  Cevap:
119
  [SADECE_ETIKET_ADI]
120
  """
 
135
 
136
  if match:
137
  extracted = match.group(1).upper().strip()
138
+ if extracted in valid_keys:
139
+ final_label = extracted
140
 
141
  return final_label, clean_output
142
  except Exception as e:
143
  return "MISC", f"Hata: {str(e)}"
144
 
145
+ # --- 4. ANA ISLEM HATTI ---
146
  def process_ner(text):
147
+ """Metni parcalar, CPU uzerinde RAG sorgusu yapar ve gerekirse GPU'yu cagirir."""
148
+ current_logs = ["<b>Sistem Baslatildi:</b> Metin analiz ediliyor..."]
149
  final_results = []
150
  yield "<br>".join(current_logs), []
151
+
152
  initial_results = ner_pipe(text)
153
 
154
  for entity in initial_results:
 
156
  label = entity['entity_group']
157
 
158
  if label in ["PER", "ORG", "LOC"]:
159
+ res = {"Varlik": word, "Ilk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
160
+ current_logs.append(f"✅ <b>{word}</b>: {label} (Dogrudan Tespit)")
161
  elif label == "MISC":
162
+ current_logs.append(f"🔍 <b>Analiz Basladi:</b> '{word}'")
163
+ yield "<br>".join(current_logs), [[r["Varlik"], r["Ilk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
164
 
165
+ # İnternet isteği @spaces.GPU katmanının dışında (burada) sorunsuz çalışır
166
  wiki_text = get_wiki_summary(word)
167
  if wiki_text:
168
  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>")
169
+ yield "<br>".join(current_logs), [[r["Varlik"], r["Ilk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
170
 
171
+ # Ağ isteği bittikten sonra sadece LLM çıkarımı için sıraya girilir ve GPU tetiklenir
172
  new_label, cot_text = refine_label_with_llm(word, text, wiki_text, custom_labels)
173
  current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #28a745; padding-left:10px;'>🧠 <b>CoT Analizi:</b> {cot_text}</div>")
174
+ res = {"Varlik": word, "Ilk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
175
  else:
176
+ current_logs.append(f"⚠️ '{word}' icin Wikipedia kaydi bulunamadi veya sunucu bloklandi.")
177
+ res = {"Varlik": word, "Ilk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
178
 
179
  final_results.append(res)
180
+ table_display = [[r["Varlik"], r["Ilk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
181
  yield "<br>".join(current_logs), table_display
182
 
183
+ current_logs.append("✨ <b>Analiz Tamamlandi.</b>")
184
+ yield "<br>".join(current_logs), [[r["Varlik"], r["Ilk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
185
 
186
+ # --- 5. GRADIO ARAYUZU ---
187
+ with gr.Blocks(title="RAG-NER Sistemi") as demo:
188
+ gr.Markdown("# 🚀 Wikipedia Destekli RAG-NER Uygulaması")
189
+ gr.Markdown("Metin içerisindeki karmaşık (MISC) varlıkları Wikipedia ve LLM kullanarak akıllıca sınıflandırın.")
190
+
191
+ with gr.Row():
192
+ with gr.Column(scale=1):
193
+ input_text = gr.Textbox(
194
+ label="Analiz Edilecek Metin",
195
+ placeholder="Örnek: Windows 11 Microsoft tarafından geliştirildi. 1984 romanı çok satıyor...",
196
+ lines=5
197
+ )
198
+ submit_btn = gr.Button("Analiz Et", variant="primary")
199
+
200
+ with gr.Column(scale=1):
201
+ gr.Markdown("### 📊 İşlem Sonuçları")
202
+ output_table = gr.Dataframe(
203
+ headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"],
204
+ datatype=["str", "str", "markdown", "str"],
205
+ label="Tespit Edilen Varlıklar Tablosu"
206
+ )
207
+
208
+ with gr.Row():
209
+ with gr.Column():
210
+ gr.Markdown("### 📜 Canlı Sistem Akış Logları")
211
+ output_logs = gr.HTML(
212
+ value="Sistem hazır. Metin girip 'Analiz Et' butonuna basınız.",
213
+ label="Log Ekranı"
214
+ )
215
 
216
+ # Buton tetikleyicisi (yield akışını desteklemek için her iki çıktıyı günceller)
217
+ submit_btn.click(
218
+ fn=process_ner,