""", unsafe_allow_html=True)
else:
st.markdown("")
# استایلها برای چرخش و پیام در حال فکر کردن
st.markdown("""
""", unsafe_allow_html=True)
import os
import json
from sentence_transformers import SentenceTransformer, util
# بارگذاری مدل
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# مسیر فایل کش برای ذخیره امبدینگهای کتاب
embeddings_cache_path = "book_embeddings_cache.json"
def load_embeddings_from_cache():
"""بارگذاری امبدینگها از کش (فایل JSON)"""
if os.path.exists(embeddings_cache_path):
with open(embeddings_cache_path, "r") as file:
return json.load(file)
return {}
def save_embeddings_to_cache(embeddings):
"""ذخیره امبدینگها به کش (فایل JSON)"""
with open(embeddings_cache_path, "w") as file:
json.dump(embeddings, file)
# بارگذاری امبدینگهای قبلی از کش (اگر موجود باشد)
book_embeddings = load_embeddings_from_cache()
if query:
found = False
threshold =0.7
# بررسی اینکه آیا امبدینگهای سوال قبلاً محاسبه شده یا خیر
query_embedding = model.encode(query, convert_to_tensor=True)
# اگر امبدینگهای کتاب در کش نباشند، آنها را محاسبه و ذخیره میکنیم
if not book_embeddings:
print("Emeddings for the book are not cached. Embedding the book now...")
# فرض کنید 'all_sentences' لیستی از جملات کتاب است
all_sentences_embeddings = model.encode(all_sentences, convert_to_tensor=True)
# ذخیره امبدینگهای کتاب در کش
book_embeddings = {idx: embedding.tolist() for idx, embedding in enumerate(all_sentences_embeddings)}
save_embeddings_to_cache(book_embeddings)
# محاسبه مشابهتها با استفاده از امبدینگهای کتاب
sentence_embeddings = [embedding for embedding in book_embeddings.values()]
similarities = util.pytorch_cos_sim(query_embedding, sentence_embeddings)[0]
for idx, similarity in enumerate(similarities):
if similarity >= threshold:
sentence = all_sentences[idx]
prompt = f"""
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 1024 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و محتوای چند پاسخ را در صورت نیاز با هم ترکیب کن.
سوال:
{query}
پاسخها:
{sentence}
پاسخ نهایی حرفهای بازنویسیشده:
"""
response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt)])
rewritten = response.content.strip()
# بررسی مرتبط بودن پاسخ با سؤال
review_prompt = f"""
لطفاً بررسی کن که آیا پاسخ زیر، به سوال زیر پاسخ داده است یا خیر یعنی کلمات کلیدی اصلی در سوال در پاسخ هست یا نه. اگر پاسخ به سوال مرتبط، درست و معتبر و حتما معتبر و قابل قبول است، فقط بنویس: 'تأیید شد'. اگر پاسخ اشتباه است یا هیچ ربطی به سوال ندارد و یا معتبر نیست ، فقط بنویس: 'نیاز به اصلاح دارد'.
سوال:
{query}
پاسخ:
{rewritten}
"""
review_response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=review_prompt)])
review_result = review_response.content.strip()
if "تأیید شد" in review_result:
rewritten = clean_text(rewritten)
st.markdown(f'
{rewritten}
', unsafe_allow_html=True)
else:
prompt_to_extract = f"""
لطفاً برای سوال زیر پاسخی معتبر و مرتبط تولید کن که در متن کتاب موجود باشد و به سوال پاسخ دهد. اگر در متن کتاب چیزی برای پاسخ به سوال یافت نمیشود، از دانش خود برای ایجاد پاسخ استفاده کن.
سوال:
{query}
جملات مشابه از متن کتاب:
{sentence}
"""
new_response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt_to_extract)])
final_answer = new_response.content.strip()
final_answer = clean_text(final_answer)
st.markdown(f'
{final_answer}
', unsafe_allow_html=True)
think.empty()
found = True
break
if not found:
prompt = f"لطفاً بر اساس سوال زیر یک متن مرتبط و معنادار تولید کن و جملات ساختگی استفاده نکن و از جملات موجود در اسناد و جملات معتبر استفاده کن و از زبانی جز فارسی استفاده نکن:\n\nسوال: {query}"
response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=prompt)])
rewritten = response.content.strip()
rewritten = clean_text(rewritten)
st.markdown(f'