diginoron commited on
Commit
5e3291f
·
verified ·
1 Parent(s): 0a53290

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +40 -27
app.py CHANGED
@@ -1,59 +1,72 @@
1
-
2
  import os
3
  import gradio as gr
4
  from sentence_transformers import SentenceTransformer
5
- from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
6
  from pinecone import Pinecone
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
- # مدل تولید متن فارسی MT5
16
- tokenizer = AutoTokenizer.from_pretrained("m3hrdadfi/mt5-small-finetuned-persian-qa")
17
- model = AutoModelForSeq2SeqLM.from_pretrained("m3hrdadfi/mt5-small-finetuned-persian-qa")
18
-
19
- def generate_answer_mt5(question, context):
20
- input_text = f"پرسش: {question} \n متن: {context}"
21
- inputs = tokenizer.encode(input_text, return_tensors="pt", truncation=True)
22
- outputs = model.generate(inputs, max_length=128, num_beams=4, early_stopping=True)
23
- return tokenizer.decode(outputs[0], skip_special_tokens=True)
24
 
25
  # اتصال به Pinecone
26
  pc = Pinecone(api_key=PINECONE_API_KEY)
27
  index = pc.Index(INDEX_NAME)
28
 
29
- # تابع چت
 
 
 
 
 
30
  def rag_chatbot(message, history):
31
- greetings = ["سلام", "سلام وقت بخیر", "درود", "خسته نباشید"]
32
- if message.strip() in greetings:
33
  return "سلام! چطور می‌تونم کمکتون کنم؟ 😊"
34
 
 
35
  query_vector = embedder.encode(message).tolist()
36
  result = index.query(vector=query_vector, top_k=3, include_metadata=True)
37
 
38
- if not result['matches']:
39
- return "متأسفم، پاسخی در پایگاه داده پیدا نکردم."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
- context = "\n".join([match['metadata'].get("پاسخ", "") for match in result['matches']])
 
 
42
 
43
- if not context.strip():
44
- return "متأسفم، اطلاعات کافی در این زمینه ندارم. لطفاً با ما تماس بگیرید."
45
 
46
- answer = generate_answer_mt5(message, context)
47
- if len(answer) < 3:
48
- return "متأسفم، پاسخ مشخصی برای این سوال ندارم."
49
- return answer
50
 
51
  # رابط کاربری Gradio
52
  chat_ui = gr.ChatInterface(
53
  fn=rag_chatbot,
54
- title="🤖 چت‌بات هوشمند تیام (نسخه RAG با MT5)",
55
- description="پاسخ‌گویی بر پایه داده‌های واقعی شرکت + تولید متن با مدل فارسی",
56
- theme="soft"
57
  )
58
 
59
  chat_ui.launch()
 
 
1
  import os
2
  import gradio as gr
3
  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
 
72
  chat_ui.launch()