File size: 2,482 Bytes
0f5d2ed
9ad95ef
0f5d2ed
9ad95ef
0f5d2ed
012badc
 
281c0ae
012badc
0f5d2ed
012badc
 
74c93be
012badc
 
7291a91
012badc
0f5d2ed
 
 
012badc
 
 
be823ee
012badc
08f847c
0f5d2ed
f957bce
35e4839
f957bce
012badc
9ad95ef
012badc
f957bce
9ad95ef
7291a91
012badc
 
 
 
 
 
 
0f5d2ed
012badc
0f5d2ed
012badc
 
 
 
f957bce
012badc
0f5d2ed
 
 
 
012badc
 
0f5d2ed
7291a91
84a7b0a
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
import os
import json
import torch
import gradio as gr
from sentence_transformers import SentenceTransformer
from pinecone import Pinecone
from transformers import T5Tokenizer, T5ForConditionalGeneration

# بارگذاری توکن‌ها از محیط امن
HF_TOKEN = os.environ.get("HF_TOKEN")
PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
PINECONE_INDEX_NAME = os.environ.get("PINECONE_INDEX_NAME")

# بارگذاری مدل embedding
embedding_model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", use_auth_token=HF_TOKEN)

# اتصال به Pinecone
pc = Pinecone(api_key=PINECONE_API_KEY)
index = pc.Index(PINECONE_INDEX_NAME)

# بارگذاری مدل زبانی MT5
tokenizer = T5Tokenizer.from_pretrained("google/mt5-small", token=HF_TOKEN)
language_model = T5ForConditionalGeneration.from_pretrained("google/mt5-small", token=HF_TOKEN)

# تابع جستجو در Pinecone
def retrieve_answer(query, threshold=0.65, top_k=3):
    query_embedding = embedding_model.encode([query])[0]
    result = index.query(vector=query_embedding.tolist(), top_k=top_k, include_metadata=True)

    if result['matches'] and result['matches'][0]['score'] > threshold:
        print(f"📊 Similarity: {result['matches'][0]['score']:.3f}")
        metadata = result['matches'][0]['metadata']
        return metadata.get('answer', 'پاسخی یافت نشد.')
    else:
        return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."

# تابع تولید پاسخ طبیعی با MT5
def generate_natural_answer(question, raw_answer):
    prompt = f"پرسش: {question}\nپاسخ دقیق: {raw_answer}\nپاسخ طبیعی:"
    inputs = tokenizer(prompt, return_tensors="pt", padding=True).to(language_model.device)

    with torch.no_grad():
        outputs = language_model.generate(**inputs, max_new_tokens=128, do_sample=False)

    return tokenizer.decode(outputs[0], skip_special_tokens=True)

# اتصال همه‌چیز در رابط Gradio
def chat_interface(user_question):
    raw_answer = retrieve_answer(user_question)
    return generate_natural_answer(user_question, raw_answer)

# رابط Gradio
demo = gr.Interface(
    fn=chat_interface,
    inputs="text",
    outputs="text",
    title="چت‌بات تیام",
    description="سؤالات خود را از آژانس دیجیتال مارکتینگ تیام بپرسید."
)

demo.launch()