Update app.py
Browse files
app.py
CHANGED
@@ -540,26 +540,30 @@ st.markdown("""
|
|
540 |
|
541 |
|
542 |
import string
|
543 |
-
from hazm import word_tokenize
|
544 |
|
|
|
545 |
def extract_keywords(query):
|
546 |
-
|
547 |
-
|
548 |
-
stop_words = set(stopwords.list())
|
549 |
-
|
550 |
-
keywords = [word for word in words if word not in stop_words and word.isalpha()]
|
551 |
|
|
|
|
|
552 |
return keywords
|
553 |
|
|
|
554 |
def clean_text(text):
|
555 |
return text.strip()
|
556 |
|
|
|
557 |
if query:
|
558 |
threshold = 60
|
559 |
matched_sentences = []
|
560 |
|
|
|
561 |
keywords = extract_keywords(query)
|
562 |
-
|
|
|
563 |
for idx, sentence in enumerate(all_sentences):
|
564 |
similarity = fuzz.partial_ratio(query, sentence)
|
565 |
if similarity >= threshold:
|
@@ -568,33 +572,32 @@ if query:
|
|
568 |
if matched_sentences:
|
569 |
found_sentences = []
|
570 |
|
|
|
571 |
for sentence in matched_sentences:
|
572 |
if any(keyword in sentence for keyword in keywords):
|
573 |
found_sentences.append(sentence)
|
574 |
|
575 |
if found_sentences:
|
576 |
matched_text = "\n".join(found_sentences)
|
577 |
-
|
578 |
-
# ساخت پرامپت اصلی برای تولید پاسخ نهایی حرفهای
|
579 |
prompt = f"""
|
580 |
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان از داخل پاسخها ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و فقط از پاسخهای زیر استفاده کن. در صورت نیاز، محتوای چند پاسخ را با هم ترکیب کن.
|
581 |
-
|
582 |
سوال:
|
583 |
{query}
|
584 |
-
|
585 |
پاسخها:
|
586 |
{matched_text}
|
587 |
-
|
588 |
پاسخ نهایی حرفهای بازنویسیشده:
|
589 |
"""
|
590 |
-
|
591 |
-
response = llm([
|
592 |
SystemMessage(content="You are a helpful assistant."),
|
593 |
HumanMessage(content=prompt)
|
594 |
])
|
595 |
rewritten = response.content.strip()
|
596 |
|
597 |
-
# بررسی کیفیت پاسخ با یک پرامپت ارزیابی
|
598 |
review_prompt = f"""
|
599 |
لطفاً بررسی کن که آیا پاسخ زیر به سوال دادهشده مرتبط، دقیق و معتبر است یا خیر. اگر پاسخ قابل قبول و دقیق است بنویس 'تأیید شد'. اگر متوسط است بنویس 'کمی خوب'. اگر بیربط یا اشتباه است بنویس 'نیاز به اصلاح دارد'.
|
600 |
سوال:
|
@@ -603,13 +606,12 @@ if query:
|
|
603 |
{rewritten}
|
604 |
"""
|
605 |
|
606 |
-
review_response = llm([
|
607 |
SystemMessage(content="You are a helpful assistant."),
|
608 |
HumanMessage(content=review_prompt)
|
609 |
])
|
610 |
review_result = review_response.content.strip()
|
611 |
|
612 |
-
# تحلیل نتیجه بررسی و نمایش پاسخ مناسب
|
613 |
if "تأیید شد" in review_result:
|
614 |
rewritten = clean_text(rewritten)
|
615 |
st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
|
@@ -623,7 +625,7 @@ if query:
|
|
623 |
{rewritten}
|
624 |
پاسخ نهایی:
|
625 |
"""
|
626 |
-
new_response = llm([
|
627 |
SystemMessage(content="You are a helpful assistant."),
|
628 |
HumanMessage(content=final_prompt)
|
629 |
])
|
@@ -636,7 +638,7 @@ if query:
|
|
636 |
سوال:
|
637 |
{query}
|
638 |
"""
|
639 |
-
fallback_response = llm([
|
640 |
SystemMessage(content="You are a helpful assistant."),
|
641 |
HumanMessage(content=fallback_prompt)
|
642 |
])
|
@@ -644,13 +646,12 @@ if query:
|
|
644 |
st.markdown(f'<div class="chat-message">{final_fallback}</div>', unsafe_allow_html=True)
|
645 |
|
646 |
else:
|
647 |
-
# اگر هیچ جملهای که کلمات کلیدی داشته باشد پیدا نشد
|
648 |
prompt = f"""
|
649 |
لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
|
650 |
سوال:
|
651 |
{query}
|
652 |
"""
|
653 |
-
response = llm([
|
654 |
SystemMessage(content="You are a helpful assistant."),
|
655 |
HumanMessage(content=prompt)
|
656 |
])
|
|
|
540 |
|
541 |
|
542 |
import string
|
543 |
+
from hazm import word_tokenize
|
544 |
|
545 |
+
# تابع برای استخراج کلمات کلیدی با استفاده از hazm و بدون حذف stopwords
|
546 |
def extract_keywords(query):
|
547 |
+
tokenizer = WordTokenizer(join_abbreviations=True)
|
548 |
+
words = tokenizer.tokenize(query)
|
|
|
|
|
|
|
549 |
|
550 |
+
# حذف علائم نگارشی و فیلتر فقط روی کلمات
|
551 |
+
keywords = [word for word in words if word not in string.punctuation]
|
552 |
return keywords
|
553 |
|
554 |
+
# تابع برای پاکسازی متن
|
555 |
def clean_text(text):
|
556 |
return text.strip()
|
557 |
|
558 |
+
# فرض: query یک رشتهی متنی از کاربر است
|
559 |
if query:
|
560 |
threshold = 60
|
561 |
matched_sentences = []
|
562 |
|
563 |
+
# استخراج کلمات کلیدی
|
564 |
keywords = extract_keywords(query)
|
565 |
+
|
566 |
+
# جستجوی جملات مشابه با استفاده از fuzzy matching
|
567 |
for idx, sentence in enumerate(all_sentences):
|
568 |
similarity = fuzz.partial_ratio(query, sentence)
|
569 |
if similarity >= threshold:
|
|
|
572 |
if matched_sentences:
|
573 |
found_sentences = []
|
574 |
|
575 |
+
# بررسی وجود حداقل یکی از کلمات کلیدی در جملات
|
576 |
for sentence in matched_sentences:
|
577 |
if any(keyword in sentence for keyword in keywords):
|
578 |
found_sentences.append(sentence)
|
579 |
|
580 |
if found_sentences:
|
581 |
matched_text = "\n".join(found_sentences)
|
582 |
+
|
|
|
583 |
prompt = f"""
|
584 |
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان از داخل پاسخها ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و فقط از پاسخهای زیر استفاده کن. در صورت نیاز، محتوای چند پاسخ را با هم ترکیب کن.
|
585 |
+
|
586 |
سوال:
|
587 |
{query}
|
588 |
+
|
589 |
پاسخها:
|
590 |
{matched_text}
|
591 |
+
|
592 |
پاسخ نهایی حرفهای بازنویسیشده:
|
593 |
"""
|
594 |
+
|
595 |
+
response = llm([
|
596 |
SystemMessage(content="You are a helpful assistant."),
|
597 |
HumanMessage(content=prompt)
|
598 |
])
|
599 |
rewritten = response.content.strip()
|
600 |
|
|
|
601 |
review_prompt = f"""
|
602 |
لطفاً بررسی کن که آیا پاسخ زیر به سوال دادهشده مرتبط، دقیق و معتبر است یا خیر. اگر پاسخ قابل قبول و دقیق است بنویس 'تأیید شد'. اگر متوسط است بنویس 'کمی خوب'. اگر بیربط یا اشتباه است بنویس 'نیاز به اصلاح دارد'.
|
603 |
سوال:
|
|
|
606 |
{rewritten}
|
607 |
"""
|
608 |
|
609 |
+
review_response = llm([
|
610 |
SystemMessage(content="You are a helpful assistant."),
|
611 |
HumanMessage(content=review_prompt)
|
612 |
])
|
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)
|
|
|
625 |
{rewritten}
|
626 |
پاسخ نهایی:
|
627 |
"""
|
628 |
+
new_response = llm([
|
629 |
SystemMessage(content="You are a helpful assistant."),
|
630 |
HumanMessage(content=final_prompt)
|
631 |
])
|
|
|
638 |
سوال:
|
639 |
{query}
|
640 |
"""
|
641 |
+
fallback_response = llm([
|
642 |
SystemMessage(content="You are a helpful assistant."),
|
643 |
HumanMessage(content=fallback_prompt)
|
644 |
])
|
|
|
646 |
st.markdown(f'<div class="chat-message">{final_fallback}</div>', unsafe_allow_html=True)
|
647 |
|
648 |
else:
|
|
|
649 |
prompt = f"""
|
650 |
لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
|
651 |
سوال:
|
652 |
{query}
|
653 |
"""
|
654 |
+
response = llm([
|
655 |
SystemMessage(content="You are a helpful assistant."),
|
656 |
HumanMessage(content=prompt)
|
657 |
])
|