diginoron commited on
Commit
f957bce
·
verified ·
1 Parent(s): 7756f95

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -56
app.py CHANGED
@@ -1,65 +1,35 @@
1
- import os
2
- import gradio as gr
3
- import torch
4
- from pinecone import Pinecone
5
  from sentence_transformers import SentenceTransformer
6
- from transformers import AutoTokenizer, AutoModelForQuestionAnswering
7
-
8
- # بارگذاری کلیدها
9
- PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
10
- INDEX_NAME = os.environ.get("INDEX_NAME")
11
-
12
- # مدل embedding
13
- embedder = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
14
-
15
- # مدل QA فارسی
16
- tokenizer = AutoTokenizer.from_pretrained("diginoron/qa-bert-fa-model")
17
- model = AutoModelForQuestionAnswering.from_pretrained("diginoron/qa-bert-fa-model")
18
-
19
- # اتصال به پایگاه داده Pinecone
20
- pc = Pinecone(api_key=PINECONE_API_KEY)
21
- index = pc.Index(INDEX_NAME)
22
-
23
- # تابع RAG
24
- def rag_chatbot(message, history):
25
- greetings = ["سلام", "سلام وقت بخیر", "درود", "خسته نباشید"]
26
- if message.strip() in greetings:
27
- return "سلام! چطور می‌تونم کمکتون کنم؟ 😊"
28
-
29
- # مرحله ۱: بازیابی نزدیک‌ترین اسناد
30
- query_vector = embedder.encode(message).tolist()
31
- result = index.query(vector=query_vector, top_k=3, include_metadata=True)
32
-
33
- if not result['matches']:
34
- return "متأسفم، اطلاعاتی در پایگاه داده پیدا نکردم."
35
-
36
- context = "\n".join([match['metadata'].get("پاسخ", "") for match in result['matches'] if match['metadata'].get("پاسخ")])
37
-
38
- if not context.strip():
39
- return "متأسفم، اطلاعات کافی در این زمینه ندارم."
40
 
41
- # مرحله ۲: استفاده از مدل پاسخ‌گویی BERT
42
- inputs = tokenizer(message, context, return_tensors="pt", truncation=True, max_length=512)
43
- with torch.no_grad():
44
- outputs = model(**inputs)
45
 
46
- start_idx = torch.argmax(outputs.start_logits)
47
- end_idx = torch.argmax(outputs.end_logits)
 
48
 
49
- answer_tokens = inputs["input_ids"][0][start_idx:end_idx + 1]
50
- answer = tokenizer.decode(answer_tokens, skip_special_tokens=True)
 
51
 
52
- if not answer.strip() or answer.strip() in ["[CLS]", "[SEP]"]:
53
- return "متأسفم، نتونستم پاسخ دقیقی پیدا کنم."
 
 
54
 
55
- return answer.strip()
 
 
 
 
56
 
57
  # رابط Gradio
58
- chat_ui = gr.ChatInterface(
59
- fn=rag_chatbot,
60
- title="🤖 چت‌بات هوشمند تیام (نسخه RAG)",
61
- description="پاسخ‌گویی ترکیبی بر پایه داده‌های واقعی شرکت + تولید پاسخ با مدل BERT فارسی",
62
- theme="soft",
63
- )
64
 
65
- chat_ui.launch()
 
1
+ # app.py
 
 
 
2
  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.4, 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
+ metadata = result['matches'][0]['metadata']
25
+ return metadata.get('answer', 'پاسخ یافت نشد')
26
+ else:
27
+ return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."
28
 
29
  # رابط Gradio
30
+ def chat_interface(question):
31
+ return retrieve_answer(question)
32
+
33
+ demo = gr.Interface(fn=chat_interface, inputs="text", outputs="text", title="چت‌بات تیام", description="سؤالات خود را از آژانس دیجیتال مارکتینگ تیام بپرسید.")
 
 
34
 
35
+ demo.launch()