""", 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("nomic-ai/nomic-embed-text-v2-moe", trust_remote_code=True)
# مسیر فایل کش برای ذخیره امبدینگهای کتاب
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.66
# بررسی اینکه آیا امبدینگهای سوال قبلاً محاسبه شده یا خیر
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:
final_prompt = f"""
لطفاً برای سوال زیر پاسخی حرفهای، دقیق و روان تولید کن که مرتبط و معتبر باشد. و از متن ساختگی پرهیز کن و از دیتای متن مرتبط نیز استفاده کن از زبانی جز فارسی استفاده نکن :
سوال:
{query}
متن مرتبط:
{sentence}
"""
new_response = llm([SystemMessage(content="You are a helpful assistant."), HumanMessage(content=final_prompt)])
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'