enhance system prompt to use the name

parent 35352c6d
......@@ -12,39 +12,56 @@ from services.chat_database_service import ChatDatabaseService
logger = logging.getLogger(__name__)
SYSTEM_PROMPTS: Dict[StudentNationality, str] = {
StudentNationality.EGYPTIAN: """
إنت مُدرّس لطفل في ابتدائي.
رد باللهجة المصريّة الطبيعيّة.
خلي الكلام بسيط وواضح، كفاية يوصّل الفكرة من غير تطويل.
الجمل تكون قصيرة نسبيًّا، بس مش ناقصة.
استخدم التشكيل الصحيح في النطق المصري بس على الكلمات اللي ممكن الـTTS ينطقها غلط.
اشرح المعلومة خطوة خطوة من غير تكرار.
ممكن تستخدم مثال صغير أو صورة في الخيال لو ده هيساعد الطفل يفهم، مش لازم في كل مرة.
خليك بتحكي كأنها لقطة من الحياة، مش شرح كتاب.
الرموز الكيميائية زي H2O أو CO2 تكتب زي ما هي.
لو فيه رقم لوحده أو في الكلام العادي، اكتبه بالحروف العربي زي "اتنين" أو "تلاتة".
الهدف: رد قصير ومباشر يعلّم، من غير زيادة كلام ولا سطحية.
إنت مُدرّس لطفل في ابتدائي اسمه {student_name}.
رد باللهجة المصريّة الطبيعيّة كأنك بتكلم {student_name} قصادك.
خلي الكلام بسيط، واضح، وقريب من ودنه.
الجمل قصيرة ومترابطة، مش مقطّعة.
اشرح كأنك بتحكي له حكاية أو بتورّيه حاجة من الحياة حوالينا، مش بتقرأ من كتاب.
ممكن تذكر اسم {student_name} مرّة واحدة في أول الرد فقط.
بعد كده ممنوع تكرار الاسم في نفس الرد، حتى في الأسئلة الختامية.
ممنوع تستعمل أي ألقاب زي "يا بطل" أو "يا شاطر"، الاسم الأول بس.
ولو الرد قصير جدًا (جملة أو اتنين)، ممكن تستغنى عن ذكر الاسم خالص.
لو فيه مصطلح صعب، فسّره بكلمة أسهل.
لو فيه رمز كيميائي زي H2O أو CO2، اكتبه زي ما هو.
الأرقام العادية اكتبها بالحروف العربي زي "اتنين" أو "تلاتة".
استخدم التشكيل بس على الكلمات اللي ممكن الـTTS ينطقها غلط أو يحصل فيها لبس، مش على كل كلمة.
لو {student_name} مكتوب بالإنجليزي، اكتبه دايمًا بالعربي في ردودك.
الهدف: رد قصير يعلّم ويوصل المعلومة، ويبان إن في مُعلّم بيشرح للطفل مش كتاب بيتقري.
""",
StudentNationality.SAUDI: """
إنت معلّم لطفل في ابتدائي.
رد باللهجة السعوديّة البسيطة.
خل الكلام واضح وقصير يكفي يوصّل الفكرة.
الجمل تكون قصيرة نسبيًّا، لكن لا تكون ناقصة.
استخدم التشكيل بس على الكلمات اللي ممكن الـTTS يقرأها غلط.
اشرح المعلومة خطوة خطوة من غير تكرار.
ممكن تضيف مثال صغير أو صورة تخيّل تساعد الطفل يفهم، بس مو لازم دائم.
خلي الشرح سواليف كأنها موقف من الحياة، مو كلام رسمي.
الرموز الكيميائية مثل H2O أو CO2 تكتب زي ما هي.
لو فيه رقم لوحده أو في النص العادي، اكتبه بالحروف العربي زي "اثنين" أو "ثلاثة".
الهدف: رد بسيط وذكي يوضّح الفكرة من غير زيادة ولا سطحية.
إنت معلّم لطفل في ابتدائي اسمه {student_name}.
رد باللهجة السعوديّة الطبيعيّة، كأنك تشرح له قدّامك.
خل الشرح واضح وسهل، لكن لا يكون ناشف.
اشرح كأنك تسولف معه وتشبّه بأشياء من حياته اليومية.
اذكر اسم {student_name} مرّة وحدة فقط في بداية الرد.
بعد كذا لا تكرره في النص ولا في الأسئلة الختامية.
ممنوع تستخدم أي ألقاب مثل "يا بطل" أو "يا شاطر"، الاسم الأول يكفي.
ولو الرد قصير جدًا (جملة أو جملتين)، تقدر ما تذكر الاسم أبدًا.
لو فيه مصطلح صعب، فسّره بكلمة أبسط.
الرموز الكيميائية مثل H2O أو CO2 تكتب مثل ما هي.
الأرقام في الكلام العادي تكتبها بالحروف العربي زي "اثنين" أو "ثلاثة".
استخدم التشكيل بس على الكلمات اللي ممكن الـTTS يخبّص فيها أو يقرأها خطأ، واترك الباقي بدون تشكيل عشان يطلع طبيعي.
لو {student_name} مكتوب بالإنجليزي، اكتبه دايمًا بالعربي في ردودك.
الهدف: رد مبسّط، قريب، ويبيّن إن المعلّم يشرح للطفل، مو يقرأ من كتاب.
"""
}
class AgentService:
"""Service class for handling AI agent conversations using database memory"""
......@@ -106,6 +123,10 @@ class AgentService:
if not student_info:
raise HTTPException(status_code=404, detail=f"Student with ID {student_id} not found")
# Extract student first name only
full_name = student_info.get('student_name', 'الطالب')
student_name = full_name.split()[0] if full_name else "الطالب"
# Print student information
print("----------------- Student Info Retrieved -----------------")
print(f"Student ID: {student_id}")
......@@ -135,11 +156,12 @@ class AgentService:
# Get conversation history from database
conversation_history = self.get_conversation_history(student_id)
# Create subject-specific system prompt
# Create subject-specific system prompt with first name only
base_system_prompt = SYSTEM_PROMPTS.get(nationality, SYSTEM_PROMPTS[StudentNationality.EGYPTIAN])
subject_specific_prompt = f"{base_system_prompt}\n\nإنت بتدرّس مادة {subject} للطفل ده."
formatted_base_prompt = base_system_prompt.format(student_name=student_name)
subject_specific_prompt = f"{formatted_base_prompt}\n\nإنت بتدرّس مادة {subject} للطفل {student_name}."
logger.info(f"Using nationality: {nationality} and subject: {subject} for student: {student_id}")
logger.info(f"Using nationality: {nationality}, subject: {subject}, and student name: {student_name} for student: {student_id}")
# Prepare messages
messages = []
......@@ -160,7 +182,6 @@ class AgentService:
try:
query_embedding = self.openai_service.generate_embedding(user_message)
# Search with filtering based on student info and subject
neighbors = self.pgvector.search_filtered_nearest(
query_embedding=query_embedding,
grade=student_info['grade'],
......@@ -170,9 +191,8 @@ class AgentService:
)
if neighbors:
# Print retrieval results
print("\n----------------- Retrieval Results -----------------")
context_message = f"معلومات من المنهج لمادة {subject} للصف {student_info['grade']}:\n"
context_message = f"معلومات من المنهج لمادة {subject} للصف {student_info['grade']} للطالب {student_name}:\n"
for i, n in enumerate(neighbors, 1):
unit_info = f" - الوحدة: {n['unit']}" if n['unit'] else ""
concept_info = f" - المفهوم: {n['concept']}" if n['concept'] else ""
......@@ -209,7 +229,6 @@ class AgentService:
temperature=temperature
)
ai_response = response.choices[0].message.content.strip()
if not ai_response:
raise ValueError("Empty response from AI model")
......@@ -223,6 +242,7 @@ class AgentService:
logger.error(f"Error generating AI response: {e}")
raise HTTPException(status_code=500, detail=f"AI response generation failed: {str(e)}")
def search_similar(self, query_embedding: List[float], student_id: str,
subject: str = "chemistry", top_k: int = 3):
"""Search similar content with student-specific filtering"""
......@@ -248,10 +268,13 @@ class AgentService:
if not student_info:
return False
# Extract student name
student_name = student_info.get('student_name', 'الطالب')
# Clear existing history to reset context
self.db_service.clear_history(student_id)
# Set new system message with subject
# Set new system message with subject and student name
nationality_lower = student_info['nationality'].lower().strip()
nationality_mapping = {
'egyptian': StudentNationality.EGYPTIAN,
......@@ -260,11 +283,13 @@ class AgentService:
nationality = nationality_mapping.get(nationality_lower, StudentNationality.EGYPTIAN)
base_system_prompt = SYSTEM_PROMPTS.get(nationality, SYSTEM_PROMPTS[StudentNationality.EGYPTIAN])
subject_specific_prompt = f"{base_system_prompt}\n\nإنت بتدرّس مادة {subject} للطفل ده."
# Format the prompt with student name
formatted_base_prompt = base_system_prompt.format(student_name=student_name)
subject_specific_prompt = f"{formatted_base_prompt}\n\nإنت بتدرّس مادة {subject} للطفل {student_name}."
self.add_message_to_history(student_id, subject_specific_prompt, "system")
logger.info(f"Updated subject context to {subject} for student {student_id} ({student_info['student_name']})")
logger.info(f"Updated subject context to {subject} for student {student_id} ({student_name})")
return True
except Exception as e:
......
......@@ -33,7 +33,7 @@ class ChatDatabaseService:
with self.conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute(
"""
SELECT student_id, grade, language, nationality
SELECT student_id, student_name, grade, language, nationality
FROM students
WHERE student_id = %s
""",
......@@ -43,6 +43,7 @@ class ChatDatabaseService:
if result:
return {
'student_id': result['student_id'],
'student_name': result['student_name'], # Added this line
'grade': result['grade'],
'is_arabic': result['language'], # Convert language boolean to is_arabic
'nationality': result['nationality']
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment