File size: 3,806 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
 
f2be9e5
281c0ae
e417c99
281c0ae
f2be9e5
 
281c0ae
f2be9e5
 
 
 
 
 
 
 
 
 
 
 
 
f957bce
f2be9e5
 
 
 
 
 
 
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
72
73
74
75
76
77
78
79
80
81
82
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 final_answer(user_question):
    # ابتدا پاسخ را از Pinecone جستجو می‌کنیم
    answer = retrieve_answer(user_question)
    
    if answer:
        # اگر پاسخی از Pinecone پیدا شد، آن را به GPT2 بدهیم برای تولید پاسخ طبیعی
        return generate_response_with_gpt2(answer, user_question)
    else:
        # اگر پاسخی از Pinecone یافت نشد، برای سوالات عمومی از GPT2 استفاده می‌کنیم
        general_responses = {
            "سلام": "سلام! خوش آمدید 😊",
            "خوبی؟": "مرسی! حال شما چطور است؟",
            "مرسی": "خواهش می‌کنم، در خدمت شما هستیم."
        }
        
        for key, value in general_responses.items():
            if key in user_question:
                return value
        
        # اگر سوال عمومی نبود، از GPT2 برای تولید پاسخ طبیعی استفاده می‌کنیم
        return generate_response_with_gpt2("", user_question)

def generate_response_with_gpt2(answer, user_question):
    # اگر پاسخ خاصی از Pinecone نیست، فقط به مدل GPT2 درخواست می‌دهیم تا جواب بدهد
    prompt = f"پاسخ به سوال: {user_question} بر اساس اطلاعات: {answer}"
    input_ids = gpt2_tokenizer.encode(prompt, return_tensors="pt", truncation=True)
    output_ids = gpt2_model.generate(input_ids, max_length=150, num_return_sequences=1, no_repeat_ngram_size=2, top_p=0.95, temperature=0.7)
    generated_text = gpt2_tokenizer.decode(output_ids[0], skip_special_tokens=True)
    return generated_text
# ===============================
# 🎛️ رابط Gradio
# ===============================
demo = gr.Interface(
    fn=final_answer,
    inputs=gr.Textbox(lines=2, label="سؤال شما"),
    outputs=gr.Textbox(label="پاسخ تیام"),
    title="💬 چت‌بات هوشمند تیام",
    description="سؤالات خود را از آژانس دیجیتال مارکتینگ تیام بپرسید. سیستم از ترکیب جستجوی دقیق و تولید پاسخ طبیعی استفاده می‌کند."
)

demo.launch()