tiyam-chatbot / app.py
diginoron's picture
Update app.py
186714c verified
raw
history blame
3.78 kB
# 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()