diginoron commited on
Commit
d2af11c
·
verified ·
1 Parent(s): c7083c4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -8
app.py CHANGED
@@ -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,16 +48,25 @@ def retrieve_answer(query, threshold=0.65, top_k=3):
48
  else:
49
  return "متأسفم، پاسخ دقیقی برای این سوال نداریم. لطفاً با ما تماس بگیرید."
50
 
51
- # 🔹 بازنویسی پاسخ خام با GEMMA
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,12 +74,16 @@ def rewrite_answer(question, retrieved_answer):
65
  final_answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
66
  return final_answer.replace(prompt, "").strip()
67
 
68
- # 🔹 رابط Gradio
69
  def chat_interface(question):
 
70
  raw_answer = retrieve_answer(question)
 
71
  final_answer = rewrite_answer(question, raw_answer)
 
72
  return final_answer
73
 
 
74
  demo = gr.Interface(
75
  fn=chat_interface,
76
  inputs="text",
 
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
+ # 🔹 بارگذاری مدل بازنویسی 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
  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
  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",