Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
# 🔹 بارگذاری مدل
|
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 |
-
#
|
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 |
-
#
|
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=
|
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 |
-
#
|
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",
|