M17idd commited on
Commit
88fe736
·
1 Parent(s): c86e949

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -74
app.py CHANGED
@@ -274,7 +274,6 @@ with st.sidebar:
274
  ("پشتیبانی فنی", "https://cdn-icons-png.flaticon.com/512/597/597177.png", None),
275
  ]
276
 
277
- # لود فونت Vazir از CDN
278
  st.markdown("""
279
  <link href="https://cdn.jsdelivr.net/gh/rastikerdar/[email protected]/dist/font-face.css" rel="stylesheet" type="text/css" />
280
  """, unsafe_allow_html=True)
@@ -540,98 +539,96 @@ st.markdown("""
540
 
541
 
542
 
543
- import os
544
- import json
545
  from sentence_transformers import SentenceTransformer, util
546
 
547
- # بارگذاری مدل
548
- model = SentenceTransformer("nomic-ai/nomic-embed-text-v2-moe", trust_remote_code=True)
549
- embeddings_cache_path = "book_embeddings_cache.json"
550
-
551
- def load_embeddings_from_cache():
552
- """بارگذاری امبدینگ‌ها از کش (فایل JSON)"""
553
- if os.path.exists(embeddings_cache_path):
554
- with open(embeddings_cache_path, "r") as file:
555
- return json.load(file)
556
- return {}
557
-
558
- def save_embeddings_to_cache(embeddings):
559
- """ذخیره امبدینگ‌ها به کش (فایل JSON)"""
560
- with open(embeddings_cache_path, "w") as file:
561
- json.dump(embeddings, file)
562
-
563
- # بارگذاری امبدینگ‌های قبلی از کش (اگر موجود باشد)
564
- book_embeddings = load_embeddings_from_cache()
565
 
566
  if query:
567
  found = False
568
- threshold =0.7
569
 
570
- # بررسی اینکه آیا امبدینگ‌های سوال قبلاً محاسبه شده یا خیر
571
  query_embedding = model.encode(query, convert_to_tensor=True)
572
 
573
- # اگر امبدینگ‌های کتاب در کش نباشند، آن‌ها را محاسبه و ذخیره می‌کنیم
574
- if not book_embeddings:
575
- print("Emeddings for the book are not cached. Embedding the book now...")
576
- # فرض کنید 'all_sentences' لیستی از جملات کتاب است
577
- all_sentences_embeddings = model.encode(all_sentences, convert_to_tensor=True)
578
- # ذخیره امبدینگ‌های کتاب در کش
579
- book_embeddings = {idx: embedding.tolist() for idx, embedding in enumerate(all_sentences_embeddings)}
580
- save_embeddings_to_cache(book_embeddings)
581
-
582
- # محاسبه مشابهت‌ها با استفاده از امبدینگ‌های کتاب
583
- sentence_embeddings = [embedding for embedding in book_embeddings.values()]
584
- similarities = util.pytorch_cos_sim(query_embedding, sentence_embeddings)[0]
585
-
586
- for idx, similarity in enumerate(similarities):
587
- if similarity >= threshold:
588
- sentence = all_sentences[idx]
589
- prompt = f"""
590
- تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخ‌ها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفه‌ای، دقیق و روان ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 1024 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و محتوای چند پاسخ را در صورت نیاز با هم ترکیب کن.
591
- سوال:
592
- {query}
593
- پاسخ‌ها:
594
- {sentence}
595
- پاسخ نهایی حرفه‌ای بازنویسی‌شده:
596
- """
597
- response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt)])
598
- rewritten = response.content.strip()
599
-
600
- # بررسی مرتبط بودن پاسخ با سؤال
601
- review_prompt = f"""
602
- لطفاً بررسی کن که آیا پاسخ زیر، به سوال زیر پاسخ داده است یا خیر یعنی کلمات کلیدی اصلی در سوال در پاسخ هست یا نه. اگر پاسخ به سوال مرتبط، درست و معتبر و حتما معتبر و قابل قبول است، فقط بنویس: 'تأیید شد'. اگر پاسخ اشتباه است یا هیچ ربطی به سوال ندارد و یا معتبر نیست ، فقط بنویس: 'نیاز به اصلاح دارد'.
 
 
 
 
 
 
 
 
 
 
 
603
  سوال:
604
  {query}
605
  پاسخ:
 
 
606
  {rewritten}
607
  """
608
- review_response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=review_prompt)])
609
- review_result = review_response.content.strip()
610
-
611
- if "تأیید شد" in review_result:
612
- rewritten = clean_text(rewritten)
613
- st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
614
-
615
- else:
616
- prompt_to_extract = f"""
617
- لطفاً برای سوال زیر پاسخی معتبر و مرتبط تولید کن که در متن کتاب موجود باشد و به سوال پاسخ دهد. اگر در متن کتاب چیزی برای پاسخ به سوال یافت نمی‌شود، از دانش خود برای ایجاد پاسخ استفاده کن.
618
- سوال:
619
- {query}
620
- جملات مشابه از متن کتاب:
621
- {sentence}
622
- """
623
- new_response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt_to_extract)])
624
- final_answer = new_response.content.strip()
625
- final_answer = clean_text(final_answer)
626
- st.markdown(f'<div class="chat-message">{final_answer}</div>', unsafe_allow_html=True)
 
627
 
628
  think.empty()
629
  found = True
630
  break
631
 
632
  if not found:
633
- prompt = f"لطفاً بر اساس سوال زیر یک متن مرتبط و معنادار تولید کن و جملات ساختگی استفاده نکن و از جملات موجود در اسناد و جملات معتبر استفاده کن و از زبانی جز فارسی استفاده نکن:\n\nسوال: {query}"
634
- response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt)])
 
 
 
635
  rewritten = response.content.strip()
636
  rewritten = clean_text(rewritten)
637
  st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
 
274
  ("پشتیبانی فنی", "https://cdn-icons-png.flaticon.com/512/597/597177.png", None),
275
  ]
276
 
 
277
  st.markdown("""
278
  <link href="https://cdn.jsdelivr.net/gh/rastikerdar/[email protected]/dist/font-face.css" rel="stylesheet" type="text/css" />
279
  """, unsafe_allow_html=True)
 
539
 
540
 
541
 
 
 
542
  from sentence_transformers import SentenceTransformer, util
543
 
544
+ model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
545
 
546
  if query:
547
  found = False
548
+ threshold = 0.70
549
 
550
+ sentence_embeddings = model.encode(all_sentences, convert_to_tensor=True)
551
  query_embedding = model.encode(query, convert_to_tensor=True)
552
 
553
+ similarities = util.cos_sim(query_embedding, sentence_embeddings)[0]
554
+
555
+ top_indices = [i for i, sim in enumerate(similarities) if sim >= threshold]
556
+
557
+ for idx in top_indices:
558
+ sentence = all_sentences[idx]
559
+ prompt = f"""
560
+ تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخ‌ها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفه��ای، دقیق و روان ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و محتوای چند پاسخ را در صورت نیاز با هم ترکیب کن.
561
+ سوال:
562
+ {query}
563
+ پاسخ‌ها:
564
+ {sentence}
565
+ پاسخ نهایی حرفه‌ای بازنویسی‌شده:
566
+ """
567
+ response = llm([
568
+ SystemMessage(content="You are a helpful assistant."),
569
+ HumanMessage(content=prompt)
570
+ ])
571
+ rewritten = response.content.strip()
572
+
573
+ # بررسی مرتبط بودن پاسخ با سؤال
574
+ review_prompt = f"""
575
+ لطفاً بررسی کن که آیا پاسخ زیر، حدودا به سوال زیر پاسخ داده است یا خیر یعنی کلمات کلیدی اصلی در سوال در پاسخ هست یا ن . اگر پاسخ به سوال مرتبط، درست و قابل قبول است، فقط بنویس: 'تأیید شد'. اگر کمی مربوط بود بنویس: 'کمی خوب'.
576
+ اگر پاسخ اشتباه است یا هیچ ربطی به سوال ندارد، فقط بنویس: 'نیاز به اصلاح دارد'.
577
+ سوال:
578
+ {query}
579
+ پاسخ:
580
+ {rewritten}
581
+ """
582
+ review_response = llm([
583
+ SystemMessage(content="You are a helpful assistant."),
584
+ HumanMessage(content=review_prompt)
585
+ ])
586
+ review_result = review_response.content.strip()
587
+
588
+ if "تأیید شد" in review_result:
589
+ rewritten = clean_text(rewritten)
590
+ st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)
591
+ elif "کمی خوب" in review_result:
592
+ final_prompt = f"""
593
+ لطفاً برای سوال زیر پاسخی حرفه‌ای، دقیق و روان تولید کن که مرتبط و معتبر باشد. از زبانی جز فارسی استفاده نکن و بیا هم از سوال هم دیتای زیر و هم از پاسخ استفاده کن و پاسخ مناسبی بنویس :
594
  سوال:
595
  {query}
596
  پاسخ:
597
+ {review_result}
598
+ دیتا:
599
  {rewritten}
600
  """
601
+ new_1response = llm([
602
+ SystemMessage(content="You are a helpful assistant."),
603
+ HumanMessage(content=final_prompt)
604
+ ])
605
+ final_answer1 = new_1response.content.strip()
606
+ final_answer1 = clean_text(final_answer1)
607
+ st.markdown(f'<div class="chat-message">{final_answer1}</div>', unsafe_allow_html=True)
608
+ else:
609
+ final_prompt = f"""
610
+ لطفاً برای سوال زیر پاسخی حرفه‌ای، دقیق و روان تولید کن که مرتبط و معتبر باشد. از زبانی جز فارسی استفاده نکن :
611
+ سوال:
612
+ {query}
613
+ """
614
+ new_response = llm([
615
+ SystemMessage(content="You are a helpful assistant."),
616
+ HumanMessage(content=final_prompt)
617
+ ])
618
+ final_answer = new_response.content.strip()
619
+ final_answer = clean_text(final_answer)
620
+ st.markdown(f'<div class="chat-message">{final_answer}</div>', unsafe_allow_html=True)
621
 
622
  think.empty()
623
  found = True
624
  break
625
 
626
  if not found:
627
+ prompt = f"لطفاً بر اساس سوال زیر یک متن مرتبط و معنادار تولید کن و از خودت ننویس و جملات معتبر باشن و از زبانی جز فارسی استفاده نکن:\n\nسوال: {query}"
628
+ response = llm([
629
+ SystemMessage(content="You are a helpful assistant."),
630
+ HumanMessage(content=prompt)
631
+ ])
632
  rewritten = response.content.strip()
633
  rewritten = clean_text(rewritten)
634
  st.markdown(f'<div class="chat-message">{rewritten}</div>', unsafe_allow_html=True)