Update app.py
Browse files
app.py
CHANGED
|
@@ -541,54 +541,45 @@ st.markdown("""
|
|
| 541 |
|
| 542 |
import string
|
| 543 |
from hazm import word_tokenize
|
|
|
|
| 544 |
|
| 545 |
def extract_keywords(query):
|
| 546 |
tokenizer = WordTokenizer()
|
| 547 |
words = tokenizer.tokenize(query)
|
| 548 |
-
|
| 549 |
-
keywords = [word for word in words if word not in string.punctuation]
|
| 550 |
-
return keywords
|
| 551 |
|
| 552 |
-
# تابع برای پاکسازی متن
|
| 553 |
def clean_text(text):
|
| 554 |
return text.strip()
|
| 555 |
|
| 556 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 557 |
if query:
|
| 558 |
threshold = 75
|
| 559 |
-
matched_sentences = []
|
| 560 |
-
|
| 561 |
-
# استخراج کلمات کلیدی
|
| 562 |
keywords = extract_keywords(query)
|
| 563 |
|
| 564 |
-
#
|
| 565 |
-
|
| 566 |
-
|
| 567 |
-
|
| 568 |
-
matched_sentences.append(sentence)
|
| 569 |
|
| 570 |
if matched_sentences:
|
| 571 |
-
found_sentences = []
|
| 572 |
-
|
| 573 |
-
# بررسی وجود حداقل یکی از کلمات کلیدی در جملات
|
| 574 |
-
for sentence in matched_sentences:
|
| 575 |
-
if any(keyword in sentence for keyword in keywords):
|
| 576 |
-
found_sentences.append(sentence)
|
| 577 |
|
| 578 |
if found_sentences:
|
| 579 |
matched_text = "\n".join(found_sentences)
|
| 580 |
st.markdown(matched_text)
|
| 581 |
|
| 582 |
-
|
| 583 |
prompt = f"""
|
| 584 |
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان از داخل پاسخها ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و فقط از پاسخهای زیر استفاده کن. در صورت نیاز، محتوای چند پاسخ را با هم ترکیب کن.
|
| 585 |
-
|
| 586 |
سوال:
|
| 587 |
{query}
|
| 588 |
-
|
| 589 |
پاسخها:
|
| 590 |
{matched_text}
|
| 591 |
-
|
| 592 |
پاسخ نهایی حرفهای بازنویسیشده:
|
| 593 |
"""
|
| 594 |
|
|
@@ -596,7 +587,7 @@ if query:
|
|
| 596 |
SystemMessage(content="You are a helpful assistant."),
|
| 597 |
HumanMessage(content=prompt)
|
| 598 |
])
|
| 599 |
-
rewritten = response.content.strip()
|
| 600 |
|
| 601 |
review_prompt = f"""
|
| 602 |
لطفاً بررسی کن که آیا پاسخ زیر به سوال دادهشده مرتبط، دقیق و معتبر است یا خیر. اگر پاسخ قابل قبول و دقیق است بنویس 'تأیید شد'. اگر متوسط است بنویس 'کمی خوب'. اگر بیربط یا اشتباه است بنویس 'نیاز به اصلاح دارد'.
|
|
@@ -613,7 +604,6 @@ if query:
|
|
| 613 |
review_result = review_response.content.strip()
|
| 614 |
|
| 615 |
if "تأیید شد" in review_result:
|
| 616 |
-
rewritten = clean_text(rewritten)
|
| 617 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
| 618 |
|
| 619 |
elif "کمی خوب" in review_result:
|
|
@@ -646,15 +636,15 @@ if query:
|
|
| 646 |
st.markdown(f'<div class="chat-message">{final_fallback}</div>', unsafe_allow_html=True)
|
| 647 |
|
| 648 |
else:
|
| 649 |
-
|
| 650 |
لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
|
| 651 |
سوال:
|
| 652 |
{query}
|
| 653 |
"""
|
| 654 |
response = llm([
|
| 655 |
SystemMessage(content="You are a helpful assistant."),
|
| 656 |
-
HumanMessage(content=
|
| 657 |
])
|
| 658 |
rewritten = clean_text(response.content.strip())
|
| 659 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
| 660 |
-
think.empty()
|
|
|
|
| 541 |
|
| 542 |
import string
|
| 543 |
from hazm import word_tokenize
|
| 544 |
+
from concurrent.futures import ThreadPoolExecutor
|
| 545 |
|
| 546 |
def extract_keywords(query):
|
| 547 |
tokenizer = WordTokenizer()
|
| 548 |
words = tokenizer.tokenize(query)
|
| 549 |
+
return [word for word in words if word not in string.punctuation]
|
|
|
|
|
|
|
| 550 |
|
|
|
|
| 551 |
def clean_text(text):
|
| 552 |
return text.strip()
|
| 553 |
|
| 554 |
+
def compute_similarity(sentence, query, threshold):
|
| 555 |
+
similarity = fuzz.partial_ratio(query, sentence)
|
| 556 |
+
if similarity >= threshold:
|
| 557 |
+
return sentence
|
| 558 |
+
return None
|
| 559 |
+
|
| 560 |
+
# فرض: query و all_sentences قبلاً تعریف شدهاند
|
| 561 |
if query:
|
| 562 |
threshold = 75
|
|
|
|
|
|
|
|
|
|
| 563 |
keywords = extract_keywords(query)
|
| 564 |
|
| 565 |
+
# استفاده از پردازش موازی برای افزایش سرعت fuzzy matching
|
| 566 |
+
with ThreadPoolExecutor(max_workers=8) as executor:
|
| 567 |
+
futures = [executor.submit(compute_similarity, sentence, query, threshold) for sentence in all_sentences]
|
| 568 |
+
matched_sentences = [future.result() for future in futures if future.result()]
|
|
|
|
| 569 |
|
| 570 |
if matched_sentences:
|
| 571 |
+
found_sentences = [sentence for sentence in matched_sentences if any(keyword in sentence for keyword in keywords)]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 572 |
|
| 573 |
if found_sentences:
|
| 574 |
matched_text = "\n".join(found_sentences)
|
| 575 |
st.markdown(matched_text)
|
| 576 |
|
|
|
|
| 577 |
prompt = f"""
|
| 578 |
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان از داخل پاسخها ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و فقط از پاسخهای زیر استفاده کن. در صورت نیاز، محتوای چند پاسخ را با هم ترکیب کن.
|
|
|
|
| 579 |
سوال:
|
| 580 |
{query}
|
|
|
|
| 581 |
پاسخها:
|
| 582 |
{matched_text}
|
|
|
|
| 583 |
پاسخ نهایی حرفهای بازنویسیشده:
|
| 584 |
"""
|
| 585 |
|
|
|
|
| 587 |
SystemMessage(content="You are a helpful assistant."),
|
| 588 |
HumanMessage(content=prompt)
|
| 589 |
])
|
| 590 |
+
rewritten = clean_text(response.content.strip())
|
| 591 |
|
| 592 |
review_prompt = f"""
|
| 593 |
لطفاً بررسی کن که آیا پاسخ زیر به سوال دادهشده مرتبط، دقیق و معتبر است یا خیر. اگر پاسخ قابل قبول و دقیق است بنویس 'تأیید شد'. اگر متوسط است بنویس 'کمی خوب'. اگر بیربط یا اشتباه است بنویس 'نیاز به اصلاح دارد'.
|
|
|
|
| 604 |
review_result = review_response.content.strip()
|
| 605 |
|
| 606 |
if "تأیید شد" in review_result:
|
|
|
|
| 607 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
| 608 |
|
| 609 |
elif "کمی خوب" in review_result:
|
|
|
|
| 636 |
st.markdown(f'<div class="chat-message">{final_fallback}</div>', unsafe_allow_html=True)
|
| 637 |
|
| 638 |
else:
|
| 639 |
+
fallback_prompt = f"""
|
| 640 |
لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
|
| 641 |
سوال:
|
| 642 |
{query}
|
| 643 |
"""
|
| 644 |
response = llm([
|
| 645 |
SystemMessage(content="You are a helpful assistant."),
|
| 646 |
+
HumanMessage(content=fallback_prompt)
|
| 647 |
])
|
| 648 |
rewritten = clean_text(response.content.strip())
|
| 649 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
| 650 |
+
think.empty()
|