File size: 2,839 Bytes
c756a8e
 
eedcecc
d6669f0
 
c756a8e
22f9c2e
eedcecc
c756a8e
d6669f0
 
c751d6c
 
 
 
 
 
 
 
d6669f0
 
 
 
cc64dce
 
 
 
c751d6c
cc64dce
c751d6c
 
22f9c2e
c756a8e
 
cc64dce
c751d6c
e5df85c
f5ab276
 
eedcecc
c7530d6
e5df85c
cc64dce
c7530d6
e5df85c
 
eedcecc
c7530d6
c756a8e
cc64dce
e5df85c
d2ee440
eedcecc
c7530d6
eedcecc
cc64dce
c7530d6
c751d6c
eedcecc
cc64dce
c751d6c
 
c7530d6
cc64dce
c7530d6
cc64dce
d2ee440
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import torch
import json
import re
import wikipedia
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
from labels_config import CUSTOM_LABELS
from prompts import SYSTEM_COT_PROMPT
import spaces

wikipedia.set_lang("tr")

# Modellerin çalışma anında yüklenmesi için yardımcı fonksiyon
def get_models():
    model_name = "Qwen/Qwen2.5-1.5B-Instruct"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto", device_map="auto")
    # NER modeli CPU'da başlayabilir, GPU işlemi sırasında taşınır
    ner = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english", aggregation_strategy="simple")
    return tokenizer, model, ner

def get_wiki_summary(query):
    try:
        search_results = wikipedia.search(query)
        if not search_results: return None
        return wikipedia.summary(search_results[0], sentences=2, auto_suggest=False)
    except: return None

# CUDA hatasını engellemek için ana NER işlemini de bu kapsama alabiliriz
def ner_pipe(text):
    _, _, ner = get_models()
    return ner(text)

@spaces.GPU
def refine_labels_batch(misc_items, full_sentence):
    if not misc_items: return []
    tokenizer, llm_model, _ = get_models()
    
    label_rules = ""
    for k, v in CUSTOM_LABELS.items():
        label_rules += f"### {k}\nTANIM: {v['tanim']}\nANAHTARLAR: {', '.join(v['anahtar_kelimeler'])}\n\n"
    
    targets_text = "".join([f"- VARLIK: {item['word']} | WIKI: {item['wiki']}\n" for item in misc_items])
    final_prompt = SYSTEM_COT_PROMPT.format(label_rules=label_rules, full_sentence=full_sentence, targets=targets_text)
    
    messages = [{"role": "user", "content": final_prompt}]
    text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    model_inputs = tokenizer([text], return_tensors="pt").to(llm_model.device)
    
    try:
        generated_ids = llm_model.generate(model_inputs.input_ids, max_new_tokens=1000, do_sample=False)
        output = tokenizer.batch_decode(generated_ids[:, model_inputs.input_ids.shape[1]:], skip_special_tokens=True)[0]
        
        json_match = re.search(r'\[\s*\{.*\}\s*\]', output, re.DOTALL)
        if json_match:
            raw_json = json_match.group(0).strip()
            if raw_json.count('{') > raw_json.count('}'): raw_json += "}]"
            results = json.loads(raw_json)
            # app.py'de KeyError oluşmaması için anahtarları garanti altına alıyoruz
            for r in results:
                r.setdefault('varlik', 'Bilinmeyen')
                r.setdefault('karar', 'MISC')
                r.setdefault('reasoning', 'Analiz yapılamadı.')
            return results
        return []
    except Exception as e:
        print(f"Hata: {e}")
        return []