""", unsafe_allow_html=True)
else:
st.markdown("")
# استایلها برای چرخش و پیام در حال فکر کردن
st.markdown("""
""", unsafe_allow_html=True)
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import string
# تابع برای استخراج کلمات کلیدی از سوال
def extract_keywords(query):
# حذف علامتهای نگارشی از جمله
query = query.translate(str.maketrans('', '', string.punctuation))
# اگر برای اولین بار از nltk استفاده میکنید، باید اینها را دانلود کنید
nltk.download('punkt')
nltk.download('stopwords')
words = word_tokenize(query)
# حذف کلمات بیمحتوا (Stopwords)
stop_words = set(stopwords.words('persian')) # برای زبان فارسی، stopwords مربوطه باید تنظیم شود
keywords = [word for word in words if word not in stop_words]
return keywords
# حالا کد شما به شکل زیر تغییر میکند:
if query:
threshold = 60
matched_sentences = []
# استخراج کلمات کلیدی از سوال
keywords = extract_keywords(query)
# پیدا کردن جملات مشابه
for idx, sentence in enumerate(all_sentences):
similarity = fuzz.partial_ratio(query, sentence)
if similarity >= threshold:
matched_sentences.append(sentence)
if matched_sentences:
found_sentences = []
# برای هر جمله در matched_sentences بررسی میکنیم که آیا کلمات کلیدی در آن وجود دارد یا نه
for sentence in matched_sentences:
if any(keyword in sentence for keyword in keywords):
found_sentences.append(sentence)
if found_sentences:
# ایجاد متن نهایی از جملات مرتبط
matched_text = "\n".join(found_sentences)
# ساخت پرامپت اصلی برای تولید پاسخ نهایی حرفهای
prompt = f"""
تعدادی پاسخ برای سوال زیر تولید شده است. لطفاً ابتدا این پاسخها را بررسی کن، سپس با در نظر گرفتن محتوای سوال و لحن آن، یک پاسخ نهایی حرفهای، دقیق و روان از داخل پاسخها ارائه کن که هم به سوال پاسخ دهد و هم از نظر نگارشی و ساختاری در سطح بالایی باشد. پاسخ نهایی باید حداکثر 2048 کاراکتر و حداقل 512 باشد، خلاصه و واضح نوشته شود و فقط به زبان فارسی باشد. از تکرار اضافی پرهیز کن و فقط از پاسخهای زیر استفاده کن. در صورت نیاز، محتوای چند پاسخ را با هم ترکیب کن.
سوال:
{query}
پاسخها:
{matched_text}
پاسخ نهایی حرفهای بازنویسیشده:
"""
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)
elif "کمی خوب" in review_result:
final_prompt = f"""
لطفاً برای سوال زیر پاسخی حرفهای، دقیق و روان تولید کن که مرتبط و معتبر باشد. از زبانی جز فارسی استفاده نکن. از محتوای زیر استفاده کن و یک پاسخ نهایی خوب بنویس:
سوال:
{query}
پاسخ اولیه:
{rewritten}
پاسخ نهایی:
"""
new_response = llm([
SystemMessage(content="You are a helpful assistant."),
HumanMessage(content=final_prompt)
])
final_answer = clean_text(new_response.content.strip())
st.markdown(f'
{final_answer}
', unsafe_allow_html=True)
else:
fallback_prompt = f"""
لطفاً برای سوال زیر پاسخی حرفهای، دقیق و روان تولید کن که مرتبط و معتبر باشد. اگر اطلاعات کافی وجود ندارد، صادقانه بگو. فقط به زبان فارسی پاسخ بده:
سوال:
{query}
"""
fallback_response = llm([
SystemMessage(content="You are a helpful assistant."),
HumanMessage(content=fallback_prompt)
])
final_fallback = clean_text(fallback_response.content.strip())
st.markdown(f'
{final_fallback}
', unsafe_allow_html=True)
else:
# اگر هیچ جملهای که کلمات کلیدی داشته باشد پیدا نشد
prompt = f"""
لطفاً برای سوال زیر یک متن مرتبط و معتبر تولید کن. اگر اطلاعات کافی وجود ندارد، صادقانه اعلام کن. فقط به زبان فارسی پاسخ بده:
سوال:
{query}
"""
response = llm([
SystemMessage(content="You are a helpful assistant."),
HumanMessage(content=prompt)
])
rewritten = clean_text(response.content.strip())
st.markdown(f'