طول السياق وملاءمته
وازِنوا بين السياق الشامل وحدود الرموز ومدى الصلة
طول السياق وملاءمته درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ميزانية نافذة السياق
يمتلك كل نموذج نافذة سياق قصوى — أي إجمالي عدد الرموز المميزة التي يمكنه معالجتها في استدعاء API واحد. ويشمل ذلك المدخلات (المطالبة وسجل المحادثة) والمخرجات (رد النموذج).
يُعد فهم هذه الميزانية أمرًا بالغ الأهمية: فتجاوزها يعني اقتطاع مطالبتك أو فقدان جزء من المخرجات. كما أن إهدارها على سياق غير ذي صلة يعني أن مساحة النموذج للاستدلال بشأن ما يهم تصبح أقل.
أحجام نافذة السياق
تختلف حدود السياق من نموذج إلى آخر. اعتبارًا من عام 2025:
- GPT-4o: 128,000 رمز مميز
- Claude Opus 4.5: 200,000 رمز مميز
- Gemini 1.5 Pro: 1,000,000 رمز مميز
- GPT-3.5 Turbo: 16,385 رمزًا مميزًا
تتيح النوافذ الأكبر تضمين مزيد من السياق — لكنها تكلّف أكثر في كل استدعاء. وتكفي في معظم المهام 8,000 إلى 16,000 رمز مميز. فالأكبر ليس دائمًا الأفضل إذا كان يعني تضمين محتوى غير ذي صلة.
import tiktoken
def estimate_tokens(text, model='gpt-4o'):
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(text))
# Quick token budget calculator
models = {
'GPT-3.5 Turbo': 16385,
'GPT-4o': 128000,
'Claude Opus 4.5': 200000,
}
prompt = 'Explain the concept of technical debt in 500 words for a non-technical CEO.'
prompt_tokens = estimate_tokens(prompt)
for model_name, limit in models.items():
reserved_for_output = 1024
available = limit - prompt_tokens - reserved_for_output
print(f'{model_name}: limit={limit:,} | prompt={prompt_tokens} | '
f'context budget={available:,} tokens')ما الذي يجب تضمينه: تقييم الصلة
قبل تضمين أي جزء من السياق، اسأل نفسك: هل تغيّر هذه المعلومة الإجابة؟
إطار ذهني بسيط — قيّم كل عنصر من عناصر السياق:
- صلة عالية (ضمّنها): تؤثر مباشرةً في المهمة، أو تشكّل المفردات، أو تحدّ من الخيارات
- صلة متوسطة (ربما): تضيف تفاصيل مفيدة، لكن المخرجات ستكون مقبولة من دونها
- صلة منخفضة (استبعدها): صحيحة، لكنها لا تؤثر في الإجابة بأي شكل
def score_context_element(element, task):
'''
Heuristic: does this context element directly constrain or shape the answer?
Returns: HIGH / MEDIUM / LOW
'''
high_signals = ['stack', 'constraint', 'deadline', 'must', 'cannot', 'budget',
'audience', 'goal', 'version', 'scale', 'limit']
low_signals = ['founded', 'headquartered', 'fun fact', 'history', 'awards',
'team building', 'company culture', 'office location']
el_lower = element.lower()
if any(s in el_lower for s in high_signals):
return 'HIGH'
if any(s in el_lower for s in low_signals):
return 'LOW'
return 'MEDIUM'
context_elements = [
'Our stack is Python FastAPI and PostgreSQL',
'We cannot use any paid third-party APIs',
'Our company was founded in Berlin in 2020',
'We need the solution to handle 1000 requests/second',
'We won a startup award last year',
]
for el in context_elements:
score = score_context_element(el, task='optimize our API')
print(f'[{score:6}] {el}')مشكلة «الضياع في المنتصف»
أظهرت الأبحاث أن نماذج اللغة الكبيرة تولي اهتمامًا أقل للمعلومات الموضوعة في منتصف المطالبات الطويلة جدًا. فقد يتم تجاهل السياق المهم جزئيًا إذا وُضع في منتصف مطالبة تحتوي على 50,000 رمز مميز.
أفضل ممارسة: ضع أهم سياق في بداية المطالبة أو نهايتها — إذ ينتبه النموذج إلى هذين الموضعين بدرجة أكبر.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Structure: critical constraint at the TOP, then the body, then the task
well_structured_prompt = (
# Critical constraint FIRST
'CRITICAL CONSTRAINT: Output must be under 50 words and contain no code.\n\n'
# Background in the middle
'Background: we are explaining our API rate limiting policy to non-technical support agents. '
'They handle billing inquiries and need to explain errors to customers. '
'Our rate limit is 100 requests per minute per API key.\n\n'
# Task at the end
'Task: Write the explanation.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=[{'role': 'user', 'content': well_structured_prompt}]
)
print(response.content[0].text)تقسيم المستندات الطويلة إلى أجزاء
عندما تحتاج إلى العمل على مستند أطول من ميزانية الرموز المميزة لديك، فلديك ثلاثة خيارات:
- لخّص أولًا: اطلب من النموذج ضغط المستند، ثم اعمل على الملخص
- قسّم المستند وعالجه: قسّم المستند إلى أجزاء، وعالج كل جزء، ثم ادمج النتائج
- استخرج وأدرج: استخرج الأقسام ذات الصلة فقط قبل تضمينها في المطالبة
لا تحاول أبدًا فرض مستند يتجاوز نافذة السياق — إذ سيُقتطع بصمت.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
def chunk_and_summarize(long_text, chunk_size=2000):
'''Split text into chunks, summarize each, combine summaries.'''
words = long_text.split()
chunks = []
for i in range(0, len(words), chunk_size):
chunk = ' '.join(words[i:i + chunk_size])
chunks.append(chunk)
summaries = []
for idx, chunk in enumerate(chunks):
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
messages=[{
'role': 'user',
'content': f'Summarize this section in 3 bullet points:\n\n{chunk}'
}]
)
summaries.append(f'Section {idx+1}:\n{response.content[0].text}')
return '\n\n'.join(summaries)
# Example usage
long_doc = 'word ' * 5000 # placeholder for a real document
print('Chunks needed:', len(long_doc.split()) // 2000 + 1)تصفية الصلة عمليًا
تعني تصفية الصلة استخراج الأجزاء ذات الصلة فقط من مستند كبير قبل تضمينه في مطالبة. ويكتسب ذلك أهمية خاصة في:
- التقارير الطويلة التي لا يرتبط بالمهمة فيها سوى قسم واحد
- ملفات التعليمات البرمجية التي تحتاج فيها إلى مراجعة دالة واحدة فقط
- سلاسل البريد الإلكتروني التي لا تهم فيها سوى آخر 3 رسائل
- مخططات قواعد البيانات التي لا يرتبط بالمهمة فيها سوى جدولين من أصل 50 جدولًا
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Step 1: Filter first, then ask
full_schema = (
'Table: users (id, name, email, created_at, role)\n'
'Table: products (id, name, price, stock, category_id)\n'
'Table: orders (id, user_id, total, status, created_at)\n'
'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
'Table: categories (id, name, parent_id)\n'
'Table: reviews (id, product_id, user_id, rating, body)\n'
'Table: sessions (id, user_id, token, expires_at)'
)
# Only include relevant tables for the specific question
relevant_context = (
'Relevant tables for this query:\n'
'Table: orders (id, user_id, total, status, created_at)\n'
'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
)
response = client.chat.completions.create(
model='gpt-4o',
messages=[{
'role': 'user',
'content': f'{relevant_context}\nWrite SQL to find the top 5 orders by total value this month.'
}]
)
print(response.choices[0].message.content)إدارة سجل المحادثة
في المحادثات متعددة الأدوار، يزداد السجل مع كل دور. وتساعد إدارته بذكاء في الحفاظ على سلامة ميزانية الرموز المميزة:
- النافذة المنزلقة: احتفظ بآخر N أدوار فقط
- إدراج الملخص: لخّص الأدوار الأقدم دوريًا في رسالة واحدة
- استخراج الحقائق الأساسية: تتبّع القرارات المهمة في قائمة نقطية، وأدرجها كسياق للنظام
- إعادة الضبط عند تغيير الموضوع: ابدأ جلسة جديدة عند الانتقال إلى موضوع غير ذي صلة
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def summarize_history(old_history):
'''Compress old conversation turns into a brief summary.'''
history_text = '\n'.join(
f'{m["role"].upper()}: {m["content"]}' for m in old_history
)
response = client.chat.completions.create(
model='gpt-4o',
max_tokens=200,
messages=[{
'role': 'user',
'content': (
'Summarize this conversation history in 3 bullet points. '
'Focus on decisions made and key information established.\n\n'
+ history_text
)
}]
)
return response.choices[0].message.content
# Example: compressing old history before continuing
old_turns = [
{'role': 'user', 'content': 'We are building a Kanban app.'},
{'role': 'assistant', 'content': 'Great, what is your stack?'},
{'role': 'user', 'content': 'React + FastAPI + PostgreSQL.'},
{'role': 'assistant', 'content': 'Good choice for a Kanban app.'}
]
summary = summarize_history(old_turns)
print('Summary of old history:', summary)تقنيات ضغط السياق
عندما تضطر إلى تضمين قدر كبير من السياق بينما تكون ميزانية الرموز المميزة محدودة، فاستخدم تقنيات الضغط:
- القوائم النقطية بدلًا من النثر: تكون القوائم النقطية أكثر كفاءة في استخدام الرموز المميزة بنسبة 30-50% من الجمل
- اختصر المصطلحات المعروفة: «PostgreSQL 15» ← «PG15» بعد أول استخدام
- احذف العبارات الحشو: «من الجدير بالذكر أن...» ← اذكر الحقيقة مباشرةً
- استخدم تنسيقات منظمة: تكون أزواج key:value أكثر كثافة من الجمل
import tiktoken
def count_tokens(text):
enc = tiktoken.encoding_for_model('gpt-4o')
return len(enc.encode(text))
# Same information, different token counts
prose_context = (
'Our company is a startup that was founded recently and we are building '
'a data analytics platform. It is worth noting that we use Python for our backend. '
'Additionally, we have chosen PostgreSQL as our primary database. '
'Furthermore, we deploy on AWS using ECS containers.'
)
bullet_context = (
'Company: data analytics startup\n'
'Stack: Python backend, PostgreSQL, AWS ECS'
)
print('Prose context tokens: ', count_tokens(prose_context))
print('Bullet context tokens:', count_tokens(bullet_context))
print('Tokens saved:', count_tokens(prose_context) - count_tokens(bullet_context))
print('Same information? Yes — same facts, 60% fewer tokens')الاختيار الديناميكي للسياق
في تطبيقات الذكاء الاصطناعي قيد الإنتاج، غالبًا ما يُختار السياق ديناميكيًا استنادًا إلى مدى صلته بالاستعلام الحالي. ويُسمى ذلك التوليد المعزَّز بالاسترجاع (RAG).
بدلًا من تضمين جميع المستندات، تسترجع فقط المستندات الأكثر تشابهًا من الناحية الدلالية مع سؤال المستخدم، ثم تدرجها في المطالبة. وهكذا يظل السياق مختصرًا ومرتبطًا بالموضوع بدرجة كبيرة.
# Simplified RAG pattern: retrieve relevant chunks, inject into prompt
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Simulated knowledge base (in production: vector database)
knowledge_base = [
{'id': 1, 'topic': 'billing', 'text': 'Refunds are processed within 5-7 business days.'},
{'id': 2, 'topic': 'shipping', 'text': 'Standard shipping takes 3-5 days.'},
{'id': 3, 'topic': 'returns', 'text': 'Returns accepted within 30 days with receipt.'},
{'id': 4, 'topic': 'warranty', 'text': 'All products come with a 1-year warranty.'},
]
def get_relevant_docs(user_query, kb, top_k=2):
'''Simplified relevance: keyword match. Production uses embeddings.'''
scored = [(doc, sum(w in user_query.lower() for w in doc['topic'].split())) for doc in kb]
scored.sort(key=lambda x: x[1], reverse=True)
return [doc['text'] for doc, _ in scored[:top_k]]
query = 'Can I return this and get my money back?'
relevant = get_relevant_docs(query, knowledge_base)
context = '\n'.join(relevant)
print('Injected context:', context)
response = client.chat.completions.create(
model='gpt-4o', max_tokens=80,
messages=[{'role': 'user', 'content': f'Context:\n{context}\n\nQuestion: {query}'}]
)
print('Answer:', response.choices[0].message.content.strip())التخطيط لميزانية السياق
في تطبيقات الإنتاج، خطّط لميزانية السياق بوضوح قبل بدء البناء:
- احجز 25% من نافذة السياق للمخرجات
- خصّص 10% لرسالة النظام والشخصية
- خصّص 30% لأحدث سجل للمحادثة
- اترك 35% للسياق الديناميكي (المستندات المسترجعة والبيانات المدرجة)
وثّق هذه التخصيصات كثوابت في التعليمات البرمجية، لتسهيل ضبطها مع تطور حالة استخدامك.
# Context budget planner
MODEL_LIMIT = 128000 # GPT-4o
BUDGET = {
'output_reserve': int(MODEL_LIMIT * 0.25), # 32,000 tokens
'system_message': int(MODEL_LIMIT * 0.05), # 6,400 tokens
'recent_history': int(MODEL_LIMIT * 0.30), # 38,400 tokens
'dynamic_context': int(MODEL_LIMIT * 0.35), # 44,800 tokens
'task_prompt': int(MODEL_LIMIT * 0.05), # 6,400 tokens
}
total_input = sum(v for k, v in BUDGET.items() if k != 'output_reserve')
print('Context budget plan:')
for key, tokens in BUDGET.items():
pct = round(tokens / MODEL_LIMIT * 100)
print(f' {key:<20}: {tokens:>7,} tokens ({pct}%)')
print(f' {"total input":<20}: {total_input:>7,} tokens')
print(f' {"+ output reserve":<20}: {BUDGET["output_reserve"]:>7,} tokens')
print(f' {"= model limit":<20}: {MODEL_LIMIT:>7,} tokens')متى تتفوق الصلة على الطول
يتفوق سياق شديد الصلة مكوّن من 500 رمز مميز على سياق ضعيف الصلة مكوّن من 5,000 رمز مميز. ينتج النموذج مخرجات أفضل عندما يكون ما عليه تجاوزه أقل.
علامات تدل على أن سياقك طويل وغير مركّز أكثر من اللازم:
- يتجاهل النموذج بعض قيودك
- تبدو المخرجات عامة رغم طول السياق
- يتناول النموذج الجزء الخطأ من سؤالك
- يكون زمن الاستجابة والتكلفة أعلى من المتوقع
عندما ترى هذه العلامات: اختصر السياق وأعد التشغيل.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Demonstrating: lean context produces sharper output
lean_context = (
'Task: write a 50-word product tagline.\n'
'Product: CLI tool that auto-generates Git commit messages from your diff.\n'
'Audience: senior developers who hate writing commit messages.\n'
'Tone: dry, witty, technical.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=100,
messages=[{'role': 'user', 'content': lean_context}]
)
print('Lean context output:')
print(response.content[0].text.strip())اختبار المعرفة
يطوّر أحد المطورين روبوت محادثة له سجل محادثة مكوّن من 20 دورًا. بعد 20 دورًا، بدأت نافذة السياق بالامتلاء. ما أفضل استراتيجية لمواصلة المحادثة من دون فقدان السياق المهم؟
طول السياق وصلته — مراجعة
تُعد إدارة السياق بفعالية مهارة أساسية في كتابة المطالبات، وتصبح بالغة الأهمية في تطبيقات الإنتاج. المبادئ الأساسية:
- قيّم كل عنصر من عناصر السياق: صلة عالية / متوسطة / منخفضة — وضمّن العناصر عالية الصلة فقط
- ضع القيود المهمة في البداية أو النهاية، وليس في المنتصف
- استخدم التنسيقات النقطية بدلًا من النثر لتوفير 30-50% من الرموز المميزة
- لخّص المستندات أو قسّمها إلى أجزاء إذا تجاوزت ميزانيتك
- في المحادثات متعددة الأدوار، اضغط السجل القديم بدلًا من البدء من جديد
- خطّط لميزانية السياق بوضوح باعتبارها ثوابت في التعليمات البرمجية
الأسئلة الشائعة
هل درس «طول السياق وملاءمته» مجاني؟
نعم — نص درس «طول السياق وملاءمته» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ماذا ستتعلم في «طول السياق وملاءمته»؟
وازِنوا بين السياق الشامل وحدود الرموز ومدى الصلة تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟
لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «طول السياق وملاءمته»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟
نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما المقصود بالسياق في صياغة مطالبات الذكاء الاصطناعي
- تقديم المعلومات الخلفية
- إعداد المشهد بفعالية
- طول السياق وملاءمته