File size: 3,011 Bytes
10ed581
d260382
cb249ff
78fe5ad
10ed581
 
78fe5ad
10ed581
78fe5ad
281c0ae
d260382
 
a741062
78fe5ad
d260382
 
a741062
10ed581
 
 
 
 
cb249ff
10ed581
 
 
 
 
 
 
 
d260382
 
 
 
 
 
 
 
 
186714c
 
 
 
d260382
78fe5ad
186714c
 
 
 
78fe5ad
186714c
78fe5ad
 
 
 
 
 
 
 
186714c
78fe5ad
10ed581
186714c
d260382
 
186714c
 
 
d260382
186714c
 
 
 
 
 
 
d260382
186714c
 
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
import os
import json
import gradio as gr
import openai
from sentence_transformers import SentenceTransformer
import pinecone

# بارگذاری کلید OpenAI از متغیر محیطی
openai.api_key = os.getenv("openai")

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

# بارگذاری داده (اختیاری)
with open("tiyam_qa_data.json", "r", encoding="utf-8") as f:
    data = json.load(f)

# دریافت مقادیر متغیرهای محیطی مربوط به Pinecone
PINECONE_API_KEY = os.getenv("PINECONE_API_KEY")
PINECONE_ENVIRONMENT = os.getenv("PINECONE_ENVIRONMENT", "us-west1-gcp")
PINECONE_INDEX_NAME = os.getenv("PINECONE_INDEX_NAME", "tiyam-chat")

# اتصال به Pinecone
pinecone.init(api_key=PINECONE_API_KEY, environment=PINECONE_ENVIRONMENT)

# اگر ایندکس وجود نداشت بساز
if PINECONE_INDEX_NAME not in pinecone.list_indexes():
    pinecone.create_index(PINECONE_INDEX_NAME, dimension=384)  # بعد embedding مدل را وارد کنید

# گرفتن ایندکس
index = pinecone.Index(PINECONE_INDEX_NAME)

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

def generate_human_response(context_text):
    if not context_text:
        return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."

    prompt = (
        f"این متن پاسخ سوال مشتری است: \"{context_text}\".\n"
        "لطفاً یک پاسخ کوتاه، رسمی و کاملاً مختصر و مفید به زبان فارسی تولید کن که فقط بر اساس همین متن باشد و هیچ اطلاعات اضافی نده."
    )

    try:
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": "شما یک پاسخگوی رسمی شرکت هستید."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.2,
            max_tokens=100,
        )
        return response['choices'][0]['message']['content'].strip()
    except Exception:
        return "خطا در پردازش درخواست."

def chat_interface(question):
    answer = retrieve_answer(question)
    final_answer = generate_human_response(answer)
    return final_answer

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

if __name__ == "__main__":
    demo.launch()