diginoron commited on
Commit
012badc
·
verified ·
1 Parent(s): 4b5b4f3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -53
app.py CHANGED
@@ -1,85 +1,61 @@
1
- # app.py
2
-
3
  import os
4
  import json
5
  import torch
6
  import gradio as gr
7
- from huggingface_hub import login
8
- from pinecone import Pinecone
9
  from sentence_transformers import SentenceTransformer
10
- from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
 
11
 
12
- # 📦 گرفتن سکرت‌ها
13
- PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
14
- PINECONE_INDEX_NAME = os.environ.get("INDEX_NAME", "tiyam-chat")
15
  HF_TOKEN = os.environ.get("HF_TOKEN")
 
 
16
 
17
- if not HF_TOKEN:
18
- raise ValueError(" سکرت HF_TOKEN یافت نشد. لطفاً آن را در Settings > Secrets ثبت کنید.")
19
-
20
- # 🔐 ورود به Hugging Face
21
- login(token=HF_TOKEN)
22
-
23
- # 🔹 بارگذاری مدل embedding
24
- embedding_model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
25
-
26
- # 🔹 بارگذاری داده اولیه (اختیاری)
27
- with open("tiyam_qa_data.json", "r", encoding="utf-8") as f:
28
- data = json.load(f)
29
 
30
- # 🔹 اتصال به Pinecone
31
  pc = Pinecone(api_key=PINECONE_API_KEY)
32
  index = pc.Index(PINECONE_INDEX_NAME)
33
 
34
- # 🔹 بارگذاری مدل سبک mt5-small برای بازنویسی
35
- tokenizer = AutoTokenizer.from_pretrained("google/mt5-small", token=HF_TOKEN)
36
- model = AutoModelForSeq2SeqLM.from_pretrained("google/mt5-small", token=HF_TOKEN)
37
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
38
- model = model.to(device)
39
 
40
- # 🔍 گرفتن پاسخ اولیه از Pinecone
41
  def retrieve_answer(query, threshold=0.65, top_k=3):
42
  query_embedding = embedding_model.encode([query])[0]
43
  result = index.query(vector=query_embedding.tolist(), top_k=top_k, include_metadata=True)
44
 
45
  if result['matches'] and result['matches'][0]['score'] > threshold:
 
46
  metadata = result['matches'][0]['metadata']
47
- return metadata.get('answer', 'پاسخ یافت نشد')
48
  else:
49
  return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."
50
 
51
- # 🧠 بازنویسی پاسخ با MT5 کوچک
52
- def rewrite_answer(question, retrieved_answer):
53
- prompt = f"""سؤال: {question}
54
- پاسخ اولیه: {retrieved_answer}
55
- پاسخ نهایی را به زبان طبیعی، حرفه‌ای و دوستانه بازنویسی کن:"""
 
 
56
 
57
- inputs = tokenizer(prompt, return_tensors="pt").to(device)
58
- outputs = model.generate(
59
- **inputs,
60
- max_new_tokens=96,
61
- temperature=0.7,
62
- do_sample=True,
63
- top_p=0.9
64
- )
65
- final_answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
66
- return final_answer.replace(prompt, "").strip()
67
 
68
- # رابط نهایی
69
- def chat_interface(question):
70
- print("📥 سوال:", question)
71
- raw_answer = retrieve_answer(question)
72
- print("📤 پاسخ اولیه:", raw_answer)
73
- final_answer = rewrite_answer(question, raw_answer)
74
- print("✅ پاسخ نهایی:", final_answer)
75
- return final_answer
76
 
 
77
  demo = gr.Interface(
78
  fn=chat_interface,
79
  inputs="text",
80
  outputs="text",
81
- title="💬 چت‌بات هوشمند تیام",
82
- description="سؤالات خود درباره خدمات بازاریابی دیجیتال تیام را بپرسید."
83
  )
84
 
85
  demo.launch()
 
 
 
1
  import os
2
  import json
3
  import torch
4
  import gradio as gr
 
 
5
  from sentence_transformers import SentenceTransformer
6
+ from pinecone import Pinecone
7
+ from transformers import T5Tokenizer, T5ForConditionalGeneration
8
 
9
+ # بارگذاری توکن‌ها از محیط امن
 
 
10
  HF_TOKEN = os.environ.get("HF_TOKEN")
11
+ PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
12
+ PINECONE_INDEX_NAME = os.environ.get("PINECONE_INDEX_NAME")
13
 
14
+ # بارگذاری مدل embedding
15
+ embedding_model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", use_auth_token=HF_TOKEN)
 
 
 
 
 
 
 
 
 
 
16
 
17
+ # اتصال به Pinecone
18
  pc = Pinecone(api_key=PINECONE_API_KEY)
19
  index = pc.Index(PINECONE_INDEX_NAME)
20
 
21
+ # بارگذاری مدل زبانی MT5
22
+ tokenizer = T5Tokenizer.from_pretrained("google/mt5-small", token=HF_TOKEN)
23
+ language_model = T5ForConditionalGeneration.from_pretrained("google/mt5-small", token=HF_TOKEN)
 
 
24
 
25
+ # تابع جستجو در Pinecone
26
  def retrieve_answer(query, threshold=0.65, top_k=3):
27
  query_embedding = embedding_model.encode([query])[0]
28
  result = index.query(vector=query_embedding.tolist(), top_k=top_k, include_metadata=True)
29
 
30
  if result['matches'] and result['matches'][0]['score'] > threshold:
31
+ print(f"📊 Similarity: {result['matches'][0]['score']:.3f}")
32
  metadata = result['matches'][0]['metadata']
33
+ return metadata.get('answer', 'پاسخی یافت نشد.')
34
  else:
35
  return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."
36
 
37
+ # تابع تولید پاسخ طبیعی با MT5
38
+ def generate_natural_answer(question, raw_answer):
39
+ prompt = f"پرسش: {question}\nپاسخ دقیق: {raw_answer}\nپاسخ طبیعی:"
40
+ inputs = tokenizer(prompt, return_tensors="pt", padding=True).to(language_model.device)
41
+
42
+ with torch.no_grad():
43
+ outputs = language_model.generate(**inputs, max_new_tokens=128, do_sample=False)
44
 
45
+ return tokenizer.decode(outputs[0], skip_special_tokens=True)
 
 
 
 
 
 
 
 
 
46
 
47
+ # اتصال همه‌چیز در رابط Gradio
48
+ def chat_interface(user_question):
49
+ raw_answer = retrieve_answer(user_question)
50
+ return generate_natural_answer(user_question, raw_answer)
 
 
 
 
51
 
52
+ # رابط Gradio
53
  demo = gr.Interface(
54
  fn=chat_interface,
55
  inputs="text",
56
  outputs="text",
57
+ title="چت‌بات تیام",
58
+ description="سؤالات خود را از آژانس دیجیتال مارکتینگ تیام بپرسید."
59
  )
60
 
61
  demo.launch()