diginoron commited on
Commit
74c93be
·
verified ·
1 Parent(s): 5e3291f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -24
app.py CHANGED
@@ -4,68 +4,70 @@ from sentence_transformers import SentenceTransformer
4
  from transformers import AutoTokenizer, AutoModelForQuestionAnswering
5
  from pinecone import Pinecone
6
 
7
- # بارگذاری مقادیر محرمانه از محیط
8
  PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
9
  INDEX_NAME = os.environ.get("INDEX_NAME")
10
 
11
  # مدل embedding
12
  embedder = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
13
 
14
- # مدل پاسخ به سوال فارسی
15
- tokenizer = AutoTokenizer.from_pretrained("SeyedAli/Persian-QA-Bert-V1")
16
- model = AutoModelForQuestionAnswering.from_pretrained("SeyedAli/Persian-QA-Bert-V1")
 
17
 
18
  # اتصال به Pinecone
19
  pc = Pinecone(api_key=PINECONE_API_KEY)
20
  index = pc.Index(INDEX_NAME)
21
 
22
- # پاسخ به سلام و احوال‌پرسی
23
  greetings = ["سلام", "سلام وقت بخیر", "درود", "خسته نباشید"]
24
  def is_greeting(text):
25
- return any(text.strip().startswith(greet) for greet in greetings)
26
 
27
  # تابع اصلی چت‌بات
28
  def rag_chatbot(message, history):
29
  if is_greeting(message):
30
  return "سلام! چطور می‌تونم کمکتون کنم؟ 😊"
31
 
32
- # مرحله 1: بازیابی داده‌های مرتبط از Pinecone
33
  query_vector = embedder.encode(message).tolist()
34
  result = index.query(vector=query_vector, top_k=3, include_metadata=True)
35
 
36
  if not result["matches"]:
37
- return "متأسفم، پاسخ مشخصی برای این سؤال در پایگاه داده ندارم."
38
 
39
- # مرحله 2: استخراج متون بازیابی‌شده
40
- contexts = [match["metadata"].get("پاسخ", "") for match in result["matches"]]
41
  best_answer = ""
42
  best_score = -float("inf")
43
 
44
- for context in contexts:
 
45
  inputs = tokenizer.encode_plus(message, context, return_tensors="pt", truncation=True)
46
  outputs = model(**inputs)
47
- answer_start = int(outputs.start_logits.argmax())
48
- answer_end = int(outputs.end_logits.argmax())
49
- score = float(outputs.start_logits[0][answer_start] + outputs.end_logits[0][answer_end])
50
 
51
- answer = tokenizer.convert_tokens_to_string(
52
- tokenizer.convert_ids_to_tokens(inputs["input_ids"][0][answer_start:answer_end + 1])
53
- )
 
54
 
55
- if score > best_score and answer.strip() != "":
 
 
 
 
56
  best_score = score
57
  best_answer = answer
58
 
59
- if best_answer.strip() == "":
60
- return "متأسفم، اطلاعات کافی برای پاسخ دقیق ندارم. لطفاً تماس بگیرید."
61
-
62
- return best_answer.strip()
63
 
64
- # رابط کاربری Gradio
65
  chat_ui = gr.ChatInterface(
66
  fn=rag_chatbot,
67
  title="🤖 چت‌بات هوشمند تیام (نسخه RAG)",
68
- description="پاسخ‌گویی ترکیبی بر پایه داده‌های واقعی شرکت + تولید متن با مدل فارسی BERT",
69
  theme="soft",
70
  )
71
 
 
4
  from transformers import AutoTokenizer, AutoModelForQuestionAnswering
5
  from pinecone import Pinecone
6
 
7
+ # بارگذاری مقادیر محرمانه
8
  PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
9
  INDEX_NAME = os.environ.get("INDEX_NAME")
10
 
11
  # مدل embedding
12
  embedder = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
13
 
14
+ # مدل BERT فارسی برای QA
15
+ model_id = "SeyedAli/Persian-QA-Bert-V1"
16
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
17
+ model = AutoModelForQuestionAnswering.from_pretrained(model_id)
18
 
19
  # اتصال به Pinecone
20
  pc = Pinecone(api_key=PINECONE_API_KEY)
21
  index = pc.Index(INDEX_NAME)
22
 
23
+ # احوالپرسی هوشمند
24
  greetings = ["سلام", "سلام وقت بخیر", "درود", "خسته نباشید"]
25
  def is_greeting(text):
26
+ return any(text.strip().startswith(g) for g in greetings)
27
 
28
  # تابع اصلی چت‌بات
29
  def rag_chatbot(message, history):
30
  if is_greeting(message):
31
  return "سلام! چطور می‌تونم کمکتون کنم؟ 😊"
32
 
33
+ # ۱. جستجو در Pinecone
34
  query_vector = embedder.encode(message).tolist()
35
  result = index.query(vector=query_vector, top_k=3, include_metadata=True)
36
 
37
  if not result["matches"]:
38
+ return "متأسفم، اطلاعاتی برای این سوال در پایگاه داده پیدا نکردم."
39
 
 
 
40
  best_answer = ""
41
  best_score = -float("inf")
42
 
43
+ for match in result["matches"]:
44
+ context = match["metadata"].get("پاسخ", "")
45
  inputs = tokenizer.encode_plus(message, context, return_tensors="pt", truncation=True)
46
  outputs = model(**inputs)
 
 
 
47
 
48
+ start_logits = outputs.start_logits[0]
49
+ end_logits = outputs.end_logits[0]
50
+ start_idx = int(start_logits.argmax())
51
+ end_idx = int(end_logits.argmax())
52
 
53
+ score = float(start_logits[start_idx] + end_logits[end_idx])
54
+ answer_tokens = inputs["input_ids"][0][start_idx:end_idx + 1]
55
+ answer = tokenizer.decode(answer_tokens, skip_special_tokens=True).strip()
56
+
57
+ if score > best_score and answer not in ["[CLS]", ""]:
58
  best_score = score
59
  best_answer = answer
60
 
61
+ if best_answer:
62
+ return best_answer
63
+ else:
64
+ return "متأسفم، نتونستم پاسخ دقیقی پیدا کنم."
65
 
66
+ # رابط Gradio
67
  chat_ui = gr.ChatInterface(
68
  fn=rag_chatbot,
69
  title="🤖 چت‌بات هوشمند تیام (نسخه RAG)",
70
+ description="پاسخ‌گویی ترکیبی بر پایه داده‌های واقعی شرکت + مدل BERT فارسی",
71
  theme="soft",
72
  )
73