File size: 3,784 Bytes
d260382
 
cb249ff
d260382
cb249ff
186714c
 
281c0ae
d260382
 
a741062
186714c
d260382
 
a741062
cb249ff
186714c
 
 
 
 
 
d260382
 
 
 
 
 
 
 
 
186714c
 
 
 
d260382
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
82
83
84
85
86
87
88
89
90
# app.py
from sentence_transformers import SentenceTransformer
from pinecone import Pinecone
import json
import gradio as gr
from huggingface_hub import InferenceApi
import os

# بارگذاری مدل 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
pc = Pinecone(api_key="pcsk_6p6AmJ_Qua4tQN69badNHEGZTj3tt5Bd7LiyiDGcXDj92LxSaBzK2ypYxTRx2rafTEJhjL")  # جایگزین کن با کلید خودت
index = pc.Index("tiyam-chat")  # ایندکس از قبل ساخته شده

# بارگذاری API چت جی پی تی از هاگینگ فیس از سکرت اسپیس
space_id = "openai"  # نام سکرت اسپیس شما در هاگینگ فیس
hf_api = InferenceApi(repo_id=space_id, token=os.getenv("HF_API_TOKEN"))  # فرض بر اینکه توکن در متغیر محیطی HF_API_TOKEN هست

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 = hf_api(
            {
                "inputs": prompt,
                "parameters": {
                    "max_new_tokens": 100,
                    "temperature": 0.2,
                    "do_sample": False,
                    "top_p": 0.9,
                }
            }
        )
        # پاسخ به صورت متن
        if isinstance(response, dict) and "error" in response:
            return "خطا در ارتباط با مدل چت‌بات."
        # بعضی مدل‌ها پاسخ رو به صورت لیست یا دیکشنری برمی‌گردونن، پس کنترل کن
        if isinstance(response, list):
            text = response[0].get("generated_text", "")
        elif isinstance(response, dict):
            text = response.get("generated_text", "")
        else:
            text = str(response)
        
        # در صورت وجود prompt در متن خروجی، حذف کن
        if text.startswith(prompt):
            text = text[len(prompt):].strip()
        
        return text.strip() or "متأسفم، پاسخی تولید نشد."
    except Exception as e:
        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()