في هذا الكود لماذا يتم تكرار كتابة الرسائل القديمة في كل رد import streamlit as st
import json
import time
from datetime import datetime
# تحميل البيانات من ملف JSON
with open("qa_data.json", "r", encoding="utf-8") as f:
qa_data = json.load(f)
# تعريف مخصص عن المساعد
ASSISTANT_PROFILE = {
"name": "CME",
"description": """
أنا مساعد ذكي اسمي CME، صممت خصيصاً ل:
- تقديم معلومات دقيقة من قاعدة البيانات
- الإجابة على استفساراتك المحددة
- مساعدتك في العثور على المعلومات
جميع إجاباتي مبنية على معلومات موثوقة.
""",
"keywords": ["من انت", "ما هو اسمك", "تعريفك", "مهمتك", "وظيفتك", "ما الذي تفعله"]
}
# إعداد الصفحة
st.set_page_config(
page_title=ASSISTANT_PROFILE["name"],
page_icon="🤖",
layout="centered"
)
# تنسيقات CSS المخصصة
st.markdown("""
""", unsafe_allow_html=True)
# تهيئة حالة المحادثة
if "chat_history" not in st.session_state:
st.session_state.chat_history = [
{"role": "system", "content": f"أنت مساعد اسمه {ASSISTANT_PROFILE['name']} يعتمد على قاعدة بيانات محددة."}
]
if "displayed_messages" not in st.session_state:
st.session_state.displayed_messages = set()
# دالة للكتابة التدريجية
def typewriter_effect(text, speed=0.03, message_id=None):
container = st.empty()
current_text = ""
for char in str(text):
current_text += char
container.markdown(
f'''
{current_text}
''',
unsafe_allow_html=True
)
time.sleep(speed)
# حفظ الرسالة النهائية
final_markup = f'''
{text}
'''
container.markdown(final_markup, unsafe_allow_html=True)
# تسجيل أن الرسالة قد تم عرضها
if message_id:
st.session_state.displayed_messages.add(message_id)
return container
# دالة لعرض الرسائل
def display_message(role, content, message_id=None):
if not message_id:
message_id = f"{role}_{hash(content)}"
if role == 'user':
st.markdown(
f'{content}
',
unsafe_allow_html=True
)
st.session_state.displayed_messages.add(message_id)
else:
if message_id not in st.session_state.displayed_messages:
typewriter_effect(content, message_id=message_id)
else:
st.markdown(
f'{content}
',
unsafe_allow_html=True
)
# دالة الكشف عن العربية بالأحرف
def is_arabic(text, threshold=0.4):
arabic_chars = set('ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىي ')
text_chars = set(text)
if not text_chars:
return False
arabic_ratio = len(arabic_chars.intersection(text_chars)) / len(text_chars)
return arabic_ratio > threshold
# دالة للكشف عن الأسئلة الشخصية
def is_asking_about_me(text):
text = text.lower()
return any(keyword.lower() in text for keyword in ASSISTANT_PROFILE["keywords"])
# دالة البحث في قاعدة البيانات
def answer_question(user_question):
# بحث مطابقة كاملة
for item in qa_data:
if item["question"].strip().lower() == user_question.strip().lower():
return item["answer"]
# بحث جزئي
user_words = user_question.lower().split()
best_match = None
highest_score = 0
for item in qa_data:
question_words = item["question"].lower().split()
matches = sum(1 for word in user_words if word in question_words)
score = matches / len(question_words)
if score > highest_score:
highest_score = score
best_match = item
if best_match and highest_score > 0.5:
return best_match["answer"]
if is_asking_about_me(user_question):
return f"مرحباً! {ASSISTANT_PROFILE['description']}\n\nتاريخ اليوم: {datetime.now().strftime('%Y-%m-%d')}"
return "عذراً، لم أتمكن من العثور على إجابة لسؤالك في قاعدة البيانات."
# واجهة المستخدم
st.title(f"{ASSISTANT_PROFILE['name']} مساعدك الذكي")
# عرض سجل المحادثة
for message in st.session_state.chat_history:
message_id = f"{message['role']}_{hash(message['content'])}"
display_message(message["role"], message["content"], message_id)
# استقبال المدخلات
user_prompt = st.chat_input("اكتب سؤالك هنا...")
if user_prompt:
# التحقق من اللغة العربية
if not is_arabic(user_prompt):
error_msg = "⚠️ يرجى استخدام اللغة العربية فقط"
display_message('assistant', error_msg, "error_msg")
st.session_state.chat_history.append({"role": "assistant", "content": error_msg})
else:
# عرض رسالة المستخدم
display_message('user', user_prompt, f"user_{len(st.session_state.chat_history)}")
st.session_state.chat_history.append({"role": "user", "content": user_prompt})
# البحث عن الإجابة
with st.spinner("🔍 يبحث في قاعدة البيانات..."):
answer = answer_question(user_prompt)
display_message('assistant', answer, f"assistant_{len(st.session_state.chat_history)}")
st.session_state.chat_history.append({"role": "assistant", "content": answer})