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