Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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,
|
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 |
-
# 🔹 بارگذاری مدل بازنویسی
|
35 |
-
tokenizer = AutoTokenizer.from_pretrained("google/
|
36 |
-
model =
|
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,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=
|
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("📥
|
80 |
raw_answer = retrieve_answer(question)
|
81 |
-
print("📤 پاسخ
|
82 |
final_answer = rewrite_answer(question, raw_answer)
|
83 |
-
print("✅ پاسخ
|
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",
|