tiyam-chatbot / app.py
diginoron's picture
Update app.py
10ed581 verified
raw
history blame
3.01 kB
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()