M17idd commited on
Commit
c275f5e
·
1 Parent(s): 504234b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +18 -28
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
- # فرض: query یک رشته‌ی متنی از کاربر است
 
 
 
 
 
 
557
  if query:
558
  threshold = 75
559
- matched_sentences = []
560
-
561
- # استخراج کلمات کلیدی
562
  keywords = extract_keywords(query)
563
 
564
- # جستجوی جملات مشابه با استفاده از fuzzy matching
565
- for idx, sentence in enumerate(all_sentences):
566
- similarity = fuzz.partial_ratio(query, sentence)
567
- if similarity >= threshold:
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
- prompt = f"""
650
  لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
651
  سوال:
652
  {query}
653
  """
654
  response = llm([
655
  SystemMessage(content="You are a helpful assistant."),
656
- HumanMessage(content=prompt)
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()