File size: 2,929 Bytes
f957bce
281c0ae
30e6416
281c0ae
 
 
 
 
 
 
e1de535
281c0ae
 
74c93be
281c0ae
 
 
 
7291a91
281c0ae
30e6416
281c0ae
30e6416
 
be823ee
281c0ae
 
 
e4cb7b4
281c0ae
f957bce
35e4839
f957bce
281c0ae
f957bce
281c0ae
7291a91
281c0ae
30e6416
281c0ae
30e6416
281c0ae
30e6416
5cef8f3
281c0ae
 
 
 
 
 
 
e417c99
281c0ae
e417c99
 
281c0ae
e417c99
f957bce
281c0ae
 
 
 
 
 
 
 
30e6416
281c0ae
7291a91
f957bce
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
68
69
70
71
import gradio as gr
from sentence_transformers import SentenceTransformer
from transformers import GPT2LMHeadModel, GPT2Tokenizer
from pinecone import Pinecone

# ===============================
# 🌐 اتصال به Pinecone
# ===============================
PINECONE_API_KEY = "pcsk_6p6AmJ_Qua4tQN69badNHEGZTj3tt5Bd7LiyiDGcXDj92LxSaBzK2ypYxTRx2rafTEJhjL"
PINECONE_INDEX_NAME = "tiyam-chat"

pc = Pinecone(api_key=PINECONE_API_KEY)
index = pc.Index(PINECONE_INDEX_NAME)

# ===============================
# 🔤 بارگذاری مدل embedding
# ===============================
embedding_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

# ===============================
# 🧠 بارگذاری مدل GPT-2 برای تولید پاسخ
# ===============================
tokenizer = GPT2Tokenizer.from_pretrained("openai-community/gpt2")
gpt2_model = GPT2LMHeadModel.from_pretrained("openai-community/gpt2")

# ===============================
# 🔍 بازیابی پاسخ از Pinecone
# ===============================
def retrieve_answer(query, threshold=0.65, top_k=1):
    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:
        return result['matches'][0]['metadata'].get('answer', 'پاسخ یافت نشد')
    else:
        return None

# ===============================
# ✨ تولید پاسخ با GPT-2
# ===============================
def generate_response_with_gpt2(answer, question):
    prompt = f"پاسخ به سوال: {question} بر اساس اطلاعات: {answer}"
    input_ids = tokenizer.encode(prompt, return_tensors="pt", truncation=True, max_length=512)
    output_ids = gpt2_model.generate(input_ids, max_new_tokens=150, num_return_sequences=1, no_repeat_ngram_size=2, top_p=0.95, temperature=0.7)
    return tokenizer.decode(output_ids[0], skip_special_tokens=True)

# ===============================
# 💬 منطق نهایی پاسخ‌دهی
# ===============================
def final_answer(user_question):
    answer = retrieve_answer(user_question)
    
    if answer:
        # فقط پاسخ را ارسال کنید، نه سوال
        return answer
    else:
        return "پاسخ دقیقی برای این سوال نداریم."

# ===============================
# 🎛️ رابط Gradio
# ===============================
demo = gr.Interface(
    fn=final_answer,
    inputs=gr.Textbox(lines=2, label="سؤال شما"),
    outputs=gr.Textbox(label="پاسخ تیام"),
    title="💬 چت‌بات هوشمند تیام",
    description="سؤالات خود را از آژانس دیجیتال مارکتینگ تیام بپرسید. سیستم از ترکیب جستجوی دقیق و تولید پاسخ طبیعی استفاده می‌کند."
)

demo.launch()