diginoron commited on
Commit
cd32b4c
·
verified ·
1 Parent(s): 6ecb59a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +14 -24
app.py CHANGED
@@ -7,9 +7,9 @@ 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, AutoModelForCausalLM
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")
@@ -17,13 +17,13 @@ HF_TOKEN = os.environ.get("HF_TOKEN")
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
 
@@ -31,13 +31,13 @@ with open("tiyam_qa_data.json", "r", encoding="utf-8") as f:
31
  pc = Pinecone(api_key=PINECONE_API_KEY)
32
  index = pc.Index(PINECONE_INDEX_NAME)
33
 
34
- # 🔹 بارگذاری مدل بازنویسی GEMMA
35
- tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b-it", token=HF_TOKEN)
36
- model = AutoModelForCausalLM.from_pretrained("google/gemma-2b-it", 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)
@@ -48,25 +48,16 @@ def retrieve_answer(query, threshold=0.65, top_k=3):
48
  else:
49
  return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."
50
 
51
- # 🧠 بازنویسی پاسخ با تعیین هوشمند تعداد توکن‌ها
52
  def rewrite_answer(question, retrieved_answer):
53
  prompt = f"""سؤال: {question}
54
  پاسخ اولیه: {retrieved_answer}
55
  پاسخ نهایی را به زبان طبیعی، حرفه‌ای و دوستانه بازنویسی کن:"""
56
 
57
- # 🔍 تعیین طول هوشمندانه توکن خروجی
58
- base_len = len(retrieved_answer)
59
- if base_len < 60:
60
- max_tokens = 64
61
- elif base_len < 150:
62
- max_tokens = 96
63
- else:
64
- max_tokens = 128
65
-
66
  inputs = tokenizer(prompt, return_tensors="pt").to(device)
67
  outputs = model.generate(
68
  **inputs,
69
- max_new_tokens=max_tokens,
70
  temperature=0.7,
71
  do_sample=True,
72
  top_p=0.9
@@ -74,16 +65,15 @@ def rewrite_answer(question, retrieved_answer):
74
  final_answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
75
  return final_answer.replace(prompt, "").strip()
76
 
77
- # 🧪 تابع نهایی چت
78
  def chat_interface(question):
79
- print("📥 سوال دریافت شد:", question)
80
  raw_answer = retrieve_answer(question)
81
- print("📤 پاسخ خام از Pinecone:", raw_answer)
82
  final_answer = rewrite_answer(question, raw_answer)
83
- print("✅ پاسخ نهایی بازنویسی‌شده:", final_answer)
84
  return final_answer
85
 
86
- # 🌐 رابط کاربری Gradio
87
  demo = gr.Interface(
88
  fn=chat_interface,
89
  inputs="text",
 
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")
 
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
 
 
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)
 
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
 
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",