M17idd commited on
Commit
bee00ae
·
1 Parent(s): f82b780

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +22 -21
app.py CHANGED
@@ -540,26 +540,30 @@ st.markdown("""
540
 
541
 
542
  import string
543
- from hazm import word_tokenize, stopwords
544
 
 
545
  def extract_keywords(query):
546
- words = word_tokenize(query)
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
  ])