Spaces:
Sleeping
Sleeping
# 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() | |