فهم واجهة الدردشة
تعرّف إلى آلية عمل واجهات دردشة LLM: الأدوار والتبادلات وسياق الجلسة
فهم واجهة الدردشة درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
الأدوار الثلاثة
تُبنى كل محادثة مع LLM على ثلاثة أدوار: system وuser وassistant.
يحدّد دور system القواعد والشخصية قبل بدء المحادثة. أما دور user فهو أنتم عند إرسال الرسائل. ودور assistant هو النموذج عند الرد.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
message = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
system='You are a helpful cooking assistant.',
messages=[
{'role': 'user', 'content': 'What is mise en place?'}
]
)
print(message.content[0].text)رسالة النظام
تُعد رسالة النظام دليل تعليمات النموذج. وتعمل قبل أول دور للمستخدم وتظل نشطة طوال الجلسة.
استخدموها لتحديد الشخصية أو النبرة أو قيود المجال أو تنسيق المخرجات. ويتعامل النموذج معها باعتبارها السياق الموجّه له طوال المحادثة.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
response = client.chat.completions.create(
model='gpt-4o',
messages=[
{
'role': 'system',
'content': 'You are a senior Python engineer. '
'Always include type hints and docstrings in your examples.'
},
{
'role': 'user',
'content': 'Show me a function that parses JSON safely.'
}
]
)
print(response.choices[0].message.content)الأدوار وتدفّق المحادثة
المحادثة عبارة عن سلسلة من الأدوار. ويتناوب كل دور على النحو التالي: يتحدث المستخدم، ثم يرد المساعد، ثم يتحدث المستخدم مرة أخرى.
يرى النموذج سجل الأدوار كاملًا مع كل طلب. وهذا ما يجعل المحادثة تبدو كحوار متواصل — لكن كل استدعاء لواجهة API يكون عديم الحالة من الناحية التقنية، ويتلقى السياق كاملًا في كل مرة.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Each call sends the FULL conversation history
history = [
{'role': 'system', 'content': 'You are a geography tutor.'},
{'role': 'user', 'content': 'What is the capital of France?'},
{'role': 'assistant', 'content': 'The capital of France is Paris.'},
{'role': 'user', 'content': 'And its population?'} # follow-up turn
]
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
print(response.choices[0].message.content)سياق الجلسة
يمثل سياق الجلسة الذاكرة المتراكمة لمحادثتكم. وتتراكم كل رسالة من المستخدم والمساعد في مصفوفة السجل.
لا يمتلك النموذج مخزن ذاكرة منفصلًا، بل يستدل اعتمادًا على ما يراه في نافذة السياق الحالية فقط. وإذا بدأتم جلسة جديدة، فلن يتذكر النموذج الجلسات السابقة ما لم تعيدوا إدخال تلك المعلومات.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Simulating 3-turn session context
conversation = [
{'role': 'user', 'content': 'My name is Alex.'},
{'role': 'assistant', 'content': 'Nice to meet you, Alex!'},
{'role': 'user', 'content': 'What is 5 times 7?'},
{'role': 'assistant', 'content': '5 times 7 is 35.'},
{'role': 'user', 'content': 'Can you repeat my name?'} # uses session context
]
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=conversation
)
print(response.content[0].text) # expects: Your name is Alex.بنية سجل الرسائل
سجل الرسائل هو ببساطة قائمة من القواميس، يحتوي كل قاموس منها على مفتاحي role وcontent.
تديرون هذه القائمة بأنفسكم في التعليمات البرمجية. فبعد كل رد من المساعد، تُضيفون استجابته، ثم تُضيفون رسالة المستخدم التالية، وترسلون القائمة كاملة مرة أخرى في الاستدعاء التالي.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def chat(history, user_message):
history.append({'role': 'user', 'content': user_message})
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
reply = response.choices[0].message.content
history.append({'role': 'assistant', 'content': reply})
return reply, history
history = [{'role': 'system', 'content': 'You are a math tutor.'}]
reply, history = chat(history, 'What is a prime number?')
print(reply)
print('History length:', len(history))شرح حدود الرموز
لكل نموذج نافذة سياق تُقاس بالرموز. ويعادل الرمز الواحد تقريبًا 4 أحرف أو 0.75 كلمة في اللغة الإنجليزية.
يُحتسب كلٌّ من إدخالك (النظام + السجل الكامل) ومخرجات النموذج ضمن هذا الحد. يدعم GPT-4o ما يصل إلى 128 ألف رمز، بينما يدعم Claude Opus 4.5 ما يصل إلى 200 ألف رمز. عند بلوغ الحد، يجب حذف الرسائل الأقدم أو تلخيصها.
import tiktoken
# Count tokens before sending to avoid exceeding the limit
encoding = tiktoken.encoding_for_model('gpt-4o')
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': 'Explain quantum entanglement in simple terms.'}
]
total_tokens = 0
for msg in messages:
total_tokens += len(encoding.encode(msg['content']))
total_tokens += 4 # overhead per message
print(f'Estimated input tokens: {total_tokens}')
print(f'GPT-4o limit: 128,000 tokens')
print(f'Budget remaining: {128000 - total_tokens:,} tokens')ماذا يحدث عند بلوغ حد الرموز
عندما يتجاوز سجل المحادثة نافذة السياق، تتوفر لديك ثلاثة خيارات:
- الاقتطاع — حذف الرسائل الأقدم
- التلخيص — مطالبة النموذج بضغط الأدوار السابقة في ملخص موجز
- النافذة المنزلقة — الإبقاء على آخر N رسالة فقط
قد يؤدي اختيار الاستراتيجية الخاطئة إلى فقدان النموذج سياقًا مهمًا وتقديم ردود غير مترابطة.
def trim_history(history, max_messages=10, keep_system=True):
'''Keep the system message and the last N non-system messages.'''
system_msgs = [m for m in history if m['role'] == 'system']
non_system = [m for m in history if m['role'] != 'system']
if len(non_system) > max_messages:
non_system = non_system[-max_messages:]
print(f'Trimmed to last {max_messages} messages.')
return system_msgs + non_system if keep_system else non_system
history = [{'role': 'system', 'content': 'You are a tutor.'}]
for i in range(15):
history.append({'role': 'user', 'content': f'Question {i}'})
history.append({'role': 'assistant', 'content': f'Answer {i}'})
trimmed = trim_history(history, max_messages=6)
print('Trimmed history length:', len(trimmed))تطبيق عملي على السياق متعدد الأدوار
لنرَ كيف يعمل السياق عمليًا. في محادثة متعددة الأدوار، يستخدم النموذج كل رسالة سابقة للإجابة عن الأسئلة اللاحقة بشكل صحيح.
ولهذا يمكنك قول «اشرح ذلك ببساطة أكبر» من دون تكرار المقصود بكلمة «ذلك»؛ فالنموذج يرى السجل الكامل ويعرف إلى ما تشير.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a science teacher.'}]
# Turn 1
history.append({'role': 'user', 'content': 'What is photosynthesis?'})
r1 = client.chat.completions.create(model='gpt-4o', messages=history)
reply1 = r1.choices[0].message.content
history.append({'role': 'assistant', 'content': reply1})
# Turn 2 — refers to prior answer without repeating it
history.append({'role': 'user', 'content': 'Can you explain that using only 3 bullet points?'})
r2 = client.chat.completions.create(model='gpt-4o', messages=history)
print(r2.choices[0].message.content)واجهة مستخدم ذات حالة مع API عديم الحالة
إليك فكرة أساسية: إن API عديم الحالة تمامًا. لا يتذكر الخادم شيئًا بين الاستدعاءات.
تُنشئ منتجات الدردشة مثل ChatGPT وهم الذاكرة عبر تخزين سجل المحادثة في قاعدة بياناتها الخاصة وإعادة حقنه في كل استدعاء لـ API. ويمكنك بناء الآلية نفسها بنفسك.
# Illustration: two isolated API calls vs one with history
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# ❌ WITHOUT history — model has no memory
r1 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'My dog is named Biscuit.'}]
)
r2 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': "What's my dog's name?"}]
)
print('Without history:', r2.choices[0].message.content) # will not know
# ✅ WITH history injected
r3 = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'user', 'content': 'My dog is named Biscuit.'},
{'role': 'assistant', 'content': 'Got it, your dog is named Biscuit!'},
{'role': 'user', 'content': "What's my dog's name?"}
]
)
print('With history:', r3.choices[0].message.content)نصائح عملية لاستخدام واجهة الدردشة
لتحقيق أقصى استفادة من واجهة الدردشة:
- ضع التعليمات المستمرة في رسالة النظام بدلًا من تكرارها في كل دور للمستخدم
- اجعل الأدوار السابقة موجزة — فسجل المحادثة المطوّل يستهلك الرموز بسرعة
- ابدأ جلسة جديدة عند الانتقال بين الموضوعات لتجنب تلويث السياق
- عند استئناف مشروع طويل، أدرج فقط المجموعة الفرعية ذات الصلة من السياق السابق
# Good practice: compact system message + focused history
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
system = (
'You are a concise Python code reviewer. '
'Reply with: 1) one-line verdict, 2) top 3 issues, 3) fixed snippet.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
system=system,
messages=[
{'role': 'user', 'content': 'def add(a,b): return a+b\nprint(add(1,2))'}
]
)
print(response.content[0].text)مراجعة: واجهة الدردشة
لنراجع الأفكار الأساسية المتعلقة بكيفية عمل واجهة الدردشة:
- ثلاثة أدوار: يضع النظام القواعد، ويرسل المستخدم المطالبات، ويرد المساعد
- يُرسل السجل الكامل في كل استدعاء لـ API — فالخادم عديم الحالة
- تضع حدود الرموز سقفًا لإجمالي السياق؛ فاختصره أو لخّصه عند الاقتراب منها
- ليس سياق الجلسة سوى قائمة تديرها في شيفرتك الخاصة
- ابدأ جلسات جديدة عند الانتقال بين الموضوعات للحفاظ على نظافة السياق
# Summary: minimal chat loop skeleton
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
def ask(question):
history.append({'role': 'user', 'content': question})
res = client.chat.completions.create(model='gpt-4o', messages=history)
answer = res.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
return answer
print(ask('Hello! What can you help me with?'))اختبار المعرفة
اختبر فهمك لآلية عمل واجهة الدردشة.
يبدأ مستخدم جلسة جديدة تمامًا ويسأل الذكاء الاصطناعي: «ما الذي ناقشناه أمس؟» لا يملك الذكاء الاصطناعي أي ذاكرة عن جلسة الأمس. لماذا؟
ما تعلّمته
أصبحت تفهم الآن أساس كل تفاعل مع دردشة ذكاء اصطناعي:
- بنية أدوار النظام/المستخدم/المساعد التي تشكّل كل محادثة
- كيفية إرسال سجل الرسائل الكامل في كل استدعاء لمحاكاة الذاكرة
- سبب كون API عديم الحالة وكيف تبني منتجات الدردشة الذاكرة فوقه
- كيفية تقييد حدود الرموز للسياق وكيفية إدارتها
سيساعدك هذا النموذج الذهني على صياغة مطالبات أفضل وبناء تطبيقات أكثر ذكاءً مدعومة بالذكاء الاصطناعي.
الأسئلة الشائعة
هل درس «فهم واجهة الدردشة» مجاني؟
نعم — نص درس «فهم واجهة الدردشة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ماذا ستتعلم في «فهم واجهة الدردشة»؟
تعرّف إلى آلية عمل واجهات دردشة LLM: الأدوار والتبادلات وسياق الجلسة تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟
لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «فهم واجهة الدردشة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟
نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم واجهة الدردشة
- أنواع الطلبات التي يستطيع الذكاء الاصطناعي التعامل معها
- كيف يولّد الذكاء الاصطناعي الاستجابات
- ما الذي لا يستطيع الذكاء الاصطناعي فعله