Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -3,34 +3,87 @@ from sentence_transformers import SentenceTransformer
|
|
3 |
from pinecone import Pinecone
|
4 |
import json
|
5 |
import gradio as gr
|
|
|
|
|
6 |
|
7 |
# بارگذاری مدل embedding
|
8 |
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
|
9 |
|
10 |
-
# بارگذاری داده محلی
|
11 |
with open("tiyam_qa_data.json", "r", encoding="utf-8") as f:
|
12 |
data = json.load(f)
|
13 |
|
14 |
# اتصال به Pinecone
|
15 |
-
pc = Pinecone(api_key="pcsk_6p6AmJ_Qua4tQN69badNHEGZTj3tt5Bd7LiyiDGcXDj92LxSaBzK2ypYxTRx2rafTEJhjL") #
|
16 |
-
index = pc.Index("tiyam-chat") # ایندکس از قبل
|
|
|
|
|
|
|
|
|
17 |
|
18 |
-
# تابع پاسخگو
|
19 |
def retrieve_answer(query, threshold=0.65, top_k=1):
|
20 |
query_embedding = model.encode([query])[0]
|
21 |
result = index.query(vector=query_embedding.tolist(), top_k=top_k, include_metadata=True)
|
22 |
|
23 |
if result['matches'] and result['matches'][0]['score'] > threshold:
|
24 |
-
print(f"📊 Similarity: {result['matches'][0]['score']:.3f}")
|
25 |
metadata = result['matches'][0]['metadata']
|
26 |
return metadata.get('answer', 'پاسخ یافت نشد')
|
27 |
else:
|
|
|
|
|
|
|
|
|
28 |
return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
-
# رابط Gradio
|
31 |
def chat_interface(question):
|
32 |
-
|
|
|
|
|
33 |
|
34 |
-
demo = gr.Interface(
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
|
36 |
-
|
|
|
|
3 |
from pinecone import Pinecone
|
4 |
import json
|
5 |
import gradio as gr
|
6 |
+
from huggingface_hub import InferenceApi
|
7 |
+
import os
|
8 |
|
9 |
# بارگذاری مدل embedding
|
10 |
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
|
11 |
|
12 |
+
# بارگذاری داده محلی در صورت نیاز (اگر لازم نیست، این قسمت را حذف کنید)
|
13 |
with open("tiyam_qa_data.json", "r", encoding="utf-8") as f:
|
14 |
data = json.load(f)
|
15 |
|
16 |
# اتصال به Pinecone
|
17 |
+
pc = Pinecone(api_key="pcsk_6p6AmJ_Qua4tQN69badNHEGZTj3tt5Bd7LiyiDGcXDj92LxSaBzK2ypYxTRx2rafTEJhjL") # جایگزین کن با کلید خودت
|
18 |
+
index = pc.Index("tiyam-chat") # ایندکس از قبل ساخته شده
|
19 |
+
|
20 |
+
# بارگذاری API چت جی پی تی از هاگینگ فیس از سکرت اسپیس
|
21 |
+
space_id = "openai" # نام سکرت اسپیس شما در هاگینگ فیس
|
22 |
+
hf_api = InferenceApi(repo_id=space_id, token=os.getenv("HF_API_TOKEN")) # فرض بر اینکه توکن در متغیر محیطی HF_API_TOKEN هست
|
23 |
|
|
|
24 |
def retrieve_answer(query, threshold=0.65, top_k=1):
|
25 |
query_embedding = model.encode([query])[0]
|
26 |
result = index.query(vector=query_embedding.tolist(), top_k=top_k, include_metadata=True)
|
27 |
|
28 |
if result['matches'] and result['matches'][0]['score'] > threshold:
|
|
|
29 |
metadata = result['matches'][0]['metadata']
|
30 |
return metadata.get('answer', 'پاسخ یافت نشد')
|
31 |
else:
|
32 |
+
return None
|
33 |
+
|
34 |
+
def generate_human_response(context_text):
|
35 |
+
if not context_text:
|
36 |
return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."
|
37 |
+
|
38 |
+
prompt = (
|
39 |
+
f"این متن پاسخ سوال مشتری است: \"{context_text}\".\n"
|
40 |
+
"لطفاً یک پاسخ کوتاه، رسمی و کاملاً مختصر و مفید به زبان فارسی تولید کن که فقط بر اساس همین متن باشد و هیچ اطلاعات اضافی نده."
|
41 |
+
)
|
42 |
+
|
43 |
+
# درخواست به هاگینگ فیس برای تولید پاسخ با مدل چت جی پی تی
|
44 |
+
try:
|
45 |
+
response = hf_api(
|
46 |
+
{
|
47 |
+
"inputs": prompt,
|
48 |
+
"parameters": {
|
49 |
+
"max_new_tokens": 100,
|
50 |
+
"temperature": 0.2,
|
51 |
+
"do_sample": False,
|
52 |
+
"top_p": 0.9,
|
53 |
+
}
|
54 |
+
}
|
55 |
+
)
|
56 |
+
# پاسخ به صورت متن
|
57 |
+
if isinstance(response, dict) and "error" in response:
|
58 |
+
return "خطا در ارتباط با مدل چتبات."
|
59 |
+
# بعضی مدلها پاسخ رو به صورت لیست یا دیکشنری برمیگردونن، پس کنترل کن
|
60 |
+
if isinstance(response, list):
|
61 |
+
text = response[0].get("generated_text", "")
|
62 |
+
elif isinstance(response, dict):
|
63 |
+
text = response.get("generated_text", "")
|
64 |
+
else:
|
65 |
+
text = str(response)
|
66 |
+
|
67 |
+
# در صورت وجود prompt در متن خروجی، حذف کن
|
68 |
+
if text.startswith(prompt):
|
69 |
+
text = text[len(prompt):].strip()
|
70 |
+
|
71 |
+
return text.strip() or "متأسفم، پاسخی تولید نشد."
|
72 |
+
except Exception as e:
|
73 |
+
return "خطا در پردازش درخواست."
|
74 |
|
|
|
75 |
def chat_interface(question):
|
76 |
+
answer = retrieve_answer(question)
|
77 |
+
final_answer = generate_human_response(answer)
|
78 |
+
return final_answer
|
79 |
|
80 |
+
demo = gr.Interface(
|
81 |
+
fn=chat_interface,
|
82 |
+
inputs="text",
|
83 |
+
outputs="text",
|
84 |
+
title="چتبات تیام",
|
85 |
+
description="سؤالات خود را از آژانس دیجیتال مارکتینگ تیام بپرسید."
|
86 |
+
)
|
87 |
|
88 |
+
if __name__ == "__main__":
|
89 |
+
demo.launch()
|