M17idd commited on
Commit
9c9ce83
·
1 Parent(s): 686cf2a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +109 -80
app.py CHANGED
@@ -539,107 +539,136 @@ st.markdown("""
539
 
540
 
541
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
542
  if query:
543
- threshold = 60
544
  matched_sentences = []
545
 
 
 
 
 
546
  for idx, sentence in enumerate(all_sentences):
547
  similarity = fuzz.partial_ratio(query, sentence)
548
  if similarity >= threshold:
549
  matched_sentences.append(sentence)
550
 
551
  if matched_sentences:
552
- matched_text = "\n".join(matched_sentences)
553
- found = True
554
- st.markdown(matched_text)
555
-
556
- # ساخت پرامپت اصلی برای تولید پاسخ نهایی حرفه‌ای
557
- prompt = f"""
558
- تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخ‌ها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفه‌ای، دقیق و روان از داخل پاسخ‌ها ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و فقط از پاسخ‌های زیر استفاده کن. در صورت نیاز، محتوای چند پاسخ را با هم ترکیب کن.
559
-
560
- سوال:
561
- {query}
562
-
563
- پاسخ‌ها:
564
- {matched_text}
565
-
566
- پاسخ نهایی حرفه‌ای بازنویسی‌شده:
567
- """
568
-
569
- response = llm([
570
- SystemMessage(content="You are a helpful assistant."),
571
- HumanMessage(content=prompt)
572
- ])
573
- rewritten = response.content.strip()
574
-
575
- # بررسی کیفیت پاسخ با یک پرامپت ارزیابی
576
- review_prompt = f"""
577
- لطفاً بررسی کن که آیا پاسخ زیر به سوال داده‌شده مرتبط، دقیق و معتبر است یا خیر. اگر پاسخ قابل قبول و دقیق است بنویس 'تأیید شد'. اگر متوسط است بنویس 'کمی خوب'. اگر بی‌ربط یا اشتباه است بنویس 'نیاز به اصلاح دارد'.
578
-
579
- سوال:
580
- {query}
581
-
582
- پاسخ:
583
- {rewritten}
584
- """
585
-
586
- review_response = llm([
587
- SystemMessage(content="You are a helpful assistant."),
588
- HumanMessage(content=review_prompt)
589
- ])
590
- review_result = review_response.content.strip()
591
-
592
- # تحلیل نتیجه بررسی و نمایش پاسخ مناسب
593
- if "تأیید شد" in review_result:
594
- rewritten = clean_text(rewritten)
595
- st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
596
-
597
- elif "کمی خوب" in review_result:
598
- final_prompt = f"""
599
- لطفاً برای سوال زیر پاسخی حرفه‌ای، دقیق و روان تولید کن که مرتبط و معتبر باشد. از زبانی جز فارسی استفاده نکن. از محتوای زیر استفاده کن و یک پاسخ نهایی خوب بنویس:
600
-
601
  سوال:
602
  {query}
 
 
 
 
 
 
 
 
 
 
 
 
603
 
604
- پاسخ اولیه:
 
 
 
 
 
605
  {rewritten}
606
-
607
- پاسخ نهایی:
608
  """
609
- new_response = llm([
 
610
  SystemMessage(content="You are a helpful assistant."),
611
- HumanMessage(content=final_prompt)
612
  ])
613
- final_answer = clean_text(new_response.content.strip())
614
- st.markdown(f'<div class="chat-message">{final_answer}</div>', unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
615
 
616
  else:
617
- fallback_prompt = f"""
618
- لطفاً برای سوال زیر پاسخی حرفه‌ای، دقیق و روان تولید کن که مرتبط و معتبر باشد. اگر اطلاعات کافی وجود ندارد، صادقانه بگو. فقط به زبان فارسی پاسخ بده:
619
-
620
  سوال:
621
  {query}
622
  """
623
- fallback_response = llm([
624
  SystemMessage(content="You are a helpful assistant."),
625
- HumanMessage(content=fallback_prompt)
626
  ])
627
- final_fallback = clean_text(fallback_response.content.strip())
628
- st.markdown(f'<div class="chat-message">{final_fallback}</div>', unsafe_allow_html=True)
629
-
630
- else:
631
- # اگر جمله‌ای با شباهت بالا پیدا نشد
632
- prompt = f"""
633
- لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
634
-
635
- سوال:
636
- {query}
637
- """
638
- response = llm([
639
- SystemMessage(content="You are a helpful assistant."),
640
- HumanMessage(content=prompt)
641
- ])
642
- rewritten = clean_text(response.content.strip())
643
- st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
644
- think.empty()
645
 
 
539
 
540
 
541
 
542
+ import nltk
543
+ from nltk.corpus import stopwords
544
+ from nltk.tokenize import word_tokenize
545
+ import string
546
+
547
+ # اگر برای اولین بار از nltk استفاده می‌کنید، باید این‌ها را دانلود کنید
548
+ nltk.download('punkt')
549
+ nltk.download('stopwords')
550
+
551
+ # تابع برای استخراج کلمات کلیدی از سوال
552
+ def extract_keywords(query):
553
+ # حذف علامت‌های نگارشی از جمله
554
+ query = query.translate(str.maketrans('', '', string.punctuation))
555
+
556
+ # تبدیل سوال به لیستی از کلمات
557
+ words = word_tokenize(query)
558
+
559
+ # حذف کلمات بی‌محتوا (Stopwords)
560
+ stop_words = set(stopwords.words('persian')) # برای زبان فارسی، stopwords مربوطه باید تنظیم شود
561
+ keywords = [word for word in words if word not in stop_words]
562
+
563
+ return keywords
564
+
565
+ # حالا کد شما به شکل زیر تغییر می‌کند:
566
+
567
  if query:
568
+ threshold = 60
569
  matched_sentences = []
570
 
571
+ # استخراج کلمات کلیدی از سوال
572
+ keywords = extract_keywords(query)
573
+
574
+ # پیدا کردن جملات مشابه
575
  for idx, sentence in enumerate(all_sentences):
576
  similarity = fuzz.partial_ratio(query, sentence)
577
  if similarity >= threshold:
578
  matched_sentences.append(sentence)
579
 
580
  if matched_sentences:
581
+ found_sentences = []
582
+
583
+ # برای هر جمله در matched_sentences بررسی می‌کنیم که آیا کلمات کلیدی در آن وجود دارد یا نه
584
+ for sentence in matched_sentences:
585
+ if any(keyword in sentence for keyword in keywords):
586
+ found_sentences.append(sentence)
587
+
588
+ if found_sentences:
589
+ # ایجاد متن نهایی از جملات مرتبط
590
+ matched_text = "\n".join(found_sentences)
591
+
592
+ # ساخت پرامپت اصلی برای تولید پاسخ نهایی حرفه‌ای
593
+ prompt = f"""
594
+ تعدادی پاسخ برای سوال زی�� تولید شده است. لطفاً ابتدا این پاسخ‌ها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفه‌ای، دقیق و روان از داخل پاسخ‌ها ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و فقط از پاسخ‌های زیر استفاده کن. در صورت نیاز، محتوای چند پاسخ را با هم ترکیب کن.
595
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
596
  سوال:
597
  {query}
598
+
599
+ پاسخ‌ها:
600
+ {matched_text}
601
+
602
+ پاسخ نهایی حرفه‌ای بازنویسی‌شده:
603
+ """
604
+
605
+ response = llm([
606
+ SystemMessage(content="You are a helpful assistant."),
607
+ HumanMessage(content=prompt)
608
+ ])
609
+ rewritten = response.content.strip()
610
 
611
+ # بررسی کیفیت پاسخ با یک پرامپت ارزیابی
612
+ review_prompt = f"""
613
+ لطفاً بررسی کن که آیا پاسخ زیر به سوال داده‌شده مرتبط، دقیق و معتبر است یا خیر. اگر پاسخ قابل قبول و دقیق است بنویس 'تأیید شد'. اگر متوسط است بنویس 'کمی خوب'. اگر بی‌ربط یا اشتباه است بنویس 'نیاز به اصلاح دارد'.
614
+ سوال:
615
+ {query}
616
+ پاسخ:
617
  {rewritten}
 
 
618
  """
619
+
620
+ review_response = llm([
621
  SystemMessage(content="You are a helpful assistant."),
622
+ HumanMessage(content=review_prompt)
623
  ])
624
+ review_result = review_response.content.strip()
625
+
626
+ # تحلیل نتیجه بررسی و نمایش پاسخ مناسب
627
+ if "تأیید شد" in review_result:
628
+ rewritten = clean_text(rewritten)
629
+ st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
630
+
631
+ elif "کمی خوب" in review_result:
632
+ final_prompt = f"""
633
+ لطفاً برای سوال زیر پاسخی حرفه‌ای، دقیق و روان تولید کن که مرتبط و معتبر باشد. از زبانی جز فارسی استفاده نکن. از محتوای زیر استفاده کن و یک پاسخ نهایی خوب بنویس:
634
+ سوال:
635
+ {query}
636
+ پاسخ اولیه:
637
+ {rewritten}
638
+ پاسخ نهایی:
639
+ """
640
+ new_response = llm([
641
+ SystemMessage(content="You are a helpful assistant."),
642
+ HumanMessage(content=final_prompt)
643
+ ])
644
+ final_answer = clean_text(new_response.content.strip())
645
+ st.markdown(f'<div class="chat-message">{final_answer}</div>', unsafe_allow_html=True)
646
+
647
+ else:
648
+ fallback_prompt = f"""
649
+ لطفاً برای سوال زیر پاسخی حرفه‌ای، دقیق و روان تولید کن که مرتبط و معتبر باشد. اگر اطلاعات کافی وجود ندارد، صادقانه بگو. فقط به زبان فارسی پاسخ بده:
650
+ سوال:
651
+ {query}
652
+ """
653
+ fallback_response = llm([
654
+ SystemMessage(content="You are a helpful assistant."),
655
+ HumanMessage(content=fallback_prompt)
656
+ ])
657
+ final_fallback = clean_text(fallback_response.content.strip())
658
+ st.markdown(f'<div class="chat-message">{final_fallback}</div>', unsafe_allow_html=True)
659
 
660
  else:
661
+ # اگر هیچ جمله‌ای که کلمات کلیدی داشته باشد پیدا نشد
662
+ prompt = f"""
663
+ لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
664
  سوال:
665
  {query}
666
  """
667
+ response = llm([
668
  SystemMessage(content="You are a helpful assistant."),
669
+ HumanMessage(content=prompt)
670
  ])
671
+ rewritten = clean_text(response.content.strip())
672
+ st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
673
+ think.empty()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
674