استراتيجيات البقاء ضمن حدود السياق
طبّقوا ذاكرة النافذة المنزلقة، وتلخيص الرسائل، وتقليص السياق انتقائيًا للتعامل مع المحادثات الطويلة من دون تجاوز حدود tokens.
استراتيجيات البقاء ضمن حدود السياق درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.
مشكلة المحادثات المتنامية
تزيد كل رسالة متبادلة في محادثة دردشة عدد الرموز المميّزة في استدعاء واجهة API التالي. ففي جلسة دعم عملاء طويلة أو جلسة برمجة تمتد ساعات، قد يتجاوز سجل المحادثة المتراكم بسهولة 20,000 إلى 50,000 رمز مميّز — وكلها يجب إرسالها إلى واجهة API في كل دور، مع دفع تكلفتها مرة أخرى رغم معالجة هذه الرموز سابقًا.
من دون استراتيجية لإدارة السياق، سيتجاوز تطبيقكم حد السياق ويتعطل، أو سينتهي بكم الأمر إلى اقتطاع الرسائل بصمت، فيفقد النموذج تتبع السياق المهم السابق. يحتاج كل تطبيق LLM قيد الإنتاج إلى استراتيجية واضحة لإدارة نمو السياق.
الاستراتيجية 1: النافذة المنزلقة (آخر N رسائل)
أبسط استراتيجية هي الاحتفاظ بآخر N رسالة فقط في السياق والتخلص من الرسائل الأقدم. ويُسمّى ذلك النافذة المنزلقة. يسهل تنفيذها، وتكاليفها متوقعة، وهي كافية للعديد من حالات الاستخدام التي يكون فيها السياق الحديث أهم من التبادلات الأقدم.
import openai
client = openai.OpenAI()
class SlidingWindowConversation:
def __init__(self, system_prompt, window_size=10):
self.system = system_prompt
self.window_size = window_size
self.history = []
def chat(self, user_message):
self.history.append({'role': 'user', 'content': user_message})
# Keep only the last N messages
windowed = self.history[-self.window_size:]
messages = [{'role': 'system', 'content': self.system}] + windowed
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages
)
reply = response.choices[0].message.content
self.history.append({'role': 'assistant', 'content': reply})
print(f'Context: {len(windowed)} messages ({len(self.history)} total)')
return reply
conv = SlidingWindowConversation('You are a helpful assistant.', window_size=6)
print(conv.chat('Hello! My name is Alice.'))
print(conv.chat('What is the capital of France?'))
print(conv.chat('What is my name?')) # Might forget if window is smallالاستراتيجية 2: الاقتطاع المراعي لعدد الرموز المميّزة
بدلًا من الاقتطاع بناءً على عدد الرسائل، يزيل الاقتطاع المراعي للرموز المميّزة الرسائل حتى يصبح العدد الإجمالي للرموز المميّزة أقل من حد معين. وهذا أدق لأن أطوال الرسائل تختلف كثيرًا؛ فقد يتضمن حد عدد الرسائل 10 رسائل قصيرة أو 3 رسائل طويلة جدًا، مع اختلاف كبير في تكلفة الرموز المميّزة.
import tiktoken
def trim_to_token_budget(
messages, system_prompt, model='gpt-4o-mini', max_input_tokens=8000
):
enc = tiktoken.encoding_for_model(model)
def count(msgs):
return sum(len(enc.encode(m.get('content',''))) + 4 for m in msgs) + 3
# System prompt token count
system_tokens = len(enc.encode(system_prompt)) + 4
budget = max_input_tokens - system_tokens
# Trim from the oldest messages until we fit
trimmed = list(messages)
while trimmed and count(trimmed) > budget:
trimmed.pop(0) # Remove oldest message
removed = len(messages) - len(trimmed)
if removed:
print(f'Trimmed {removed} old messages to stay within {max_input_tokens} tokens')
return trimmedالاستراتيجية 3: تلخيص المحادثة
يعمل التلخيص على ضغط أدوار المحادثة القديمة في ملخص موجز مع الحفاظ على الحقائق والقرارات والسياق الأساسي الذي ذكره المستخدم. وهذه الاستراتيجية أكثر تطورًا من النوافذ المنزلقة لأنها تحتفظ بجوهر التبادلات السابقة بدلًا من التخلص منها ببساطة.
يعمل هذا النمط كما يلي: عندما تتجاوز المحادثة حدًا معينًا، أرسلوا أقدم N دور إلى النموذج مع موجّه 'Summarize this conversation so far'، واستبدلوا تلك الأدوار برسالة نظام واحدة تحتوي على الملخص، ثم واصلوا المحادثة باستخدام السجل المضغوط الجديد.
import openai
client = openai.OpenAI()
def summarize_conversation(messages_to_summarize, model='gpt-4o-mini'):
summary_prompt = [
{'role': 'system', 'content': 'You summarize conversations. Be concise but preserve key facts, decisions, and any specific information the user shared (names, numbers, preferences).'},
{'role': 'user', 'content': 'Summarize this conversation:\n' + '\n'.join(
f"{m['role'].upper()}: {m['content']}" for m in messages_to_summarize
)}
]
resp = client.chat.completions.create(model=model, messages=summary_prompt, max_tokens=500)
return resp.choices[0].message.content
def compress_history(history, keep_recent=4):
if len(history) <= keep_recent:
return history
to_summarize = history[:-keep_recent]
summary = summarize_conversation(to_summarize)
summary_msg = {'role': 'system', 'content': f'Earlier conversation summary: {summary}'}
return [summary_msg] + history[-keep_recent:]
print('Summarization strategy compresses old turns into a single summary message')الاستراتيجية 4: ذاكرة الكيانات
تستخرج ذاكرة الكيانات تمثيلًا منظمًا للحقائق الأساسية المذكورة في المحادثة وتحافظ عليه — مثل تفضيلات المستخدم، والأسماء، وتفاصيل المشروع، والقرارات المتخذة — بدلًا من تخزين سجل الرسائل الخام. وقبل كل دور، تُدرج الحقائق المخزنة في موجّه النظام.
تستهلك هذه الاستراتيجية رموزًا مميّزة أقل من السجل الكامل، لأنكم تدرجون ما هو مهم دلاليًا فقط، لا كل كلمة في كل دور. وتعمل ذاكرة الكيانات جيدًا خصوصًا مع المساعدين الذين يعملون لفترات طويلة، حيث يعود المستخدمون إلى تفضيلات وحقائق أُنشئت في وقت أبكر بكثير من المحادثة.
import openai
import json
client = openai.OpenAI()
def extract_entities(messages, model='gpt-4o-mini'):
prompt = [
{'role': 'system', 'content': 'Extract key facts from this conversation as JSON: {"user_name": null, "preferences": [], "key_facts": []}'},
{'role': 'user', 'content': '\n'.join(f"{m['role']}: {m['content']}" for m in messages)}
]
resp = client.chat.completions.create(
model=model,
messages=prompt,
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content)
conversation = [
{'role': 'user', 'content': 'Hi, I am Alice and I prefer Python over JavaScript.'},
{'role': 'assistant', 'content': 'Great to meet you, Alice! Python is an excellent choice.'},
{'role': 'user', 'content': 'I am building a REST API for my e-commerce startup.'}
]
entities = extract_entities(conversation)
print(json.dumps(entities, indent=2))متى تُطبَّق كل استراتيجية
اختاروا استراتيجيتكم بناءً على خصائص تطبيقكم:
- النافذة المنزلقة: تطبيقات الدردشة البسيطة التي يكفي فيها السياق الحديث ولا يعود المستخدمون إلى التبادلات القديمة. الأقل تكلفة من حيث التنفيذ.
- الاقتطاع المراعي لعدد الرموز المميّزة: أي تطبيق إنتاج تختلف فيه أطوال الرسائل اختلافًا كبيرًا. وهو أفضل دائمًا من الاقتطاع حسب عدد الرسائل.
- التلخيص: المساعدون الذين يعملون لفترات طويلة، وجلسات دعم العملاء، وروبوتات إدارة المشاريع. يتوقع المستخدمون أن يتذكر المساعد الحقائق الأساسية من التبادلات التي جرت قبل ساعات.
- ذاكرة الكيانات: المساعدون الشخصيون، وروبوتات الدردشة التي تراعي تفضيلات المستخدم، وأنظمة التدريس التي تظل فيها معلومات المستخدم مهمة طوال الجلسة.
يمكن أيضًا الجمع بين هذه الاستراتيجيات: استخدموا ذاكرة الكيانات للحقائق الأساسية، مع نافذة منزلقة للمحادثة الحديثة.
RAG كبديل لحشو السياق
بالنسبة إلى التطبيقات كثيفة المعرفة، تتمثل أفضل استراتيجية لإدارة السياق في عدم وضع المستندات في السياق أصلًا؛ بل استخدموا RAG (التوليد المعزّز بالاسترجاع) لاسترجاع المقاطع المحددة ذات الصلة بالاستعلام الحالي فقط. يحافظ ذلك على تركيز السياق، ويقلل التكلفة، وغالبًا ما ينتج إجابات أفضل من إدخال مستند كامل.
تتمثل الفكرة الأساسية في أن نوافذ السياق الطويلة تحل مشكلة هل يمكن احتواؤه؟، لكنها لا تحل مشكلة هل سيستخدمه النموذج جيدًا؟. ويعالج الاسترجاع الدقيق المشكلتين معًا، عبر تزويد النموذج بالمعلومات التي يحتاج إليها فعليًا للسؤال الحالي فقط.
معالجة أخطاء الحد الأقصى للسياق بسلاسة
رغم بذل أفضل الجهود، قد تواجهون أخطاء تتعلق بحد السياق في بيئة الإنتاج، ولا سيما بسبب المحتوى الذي ينشئه المستخدمون ويكون أطول من المتوقع. تعاملوا دائمًا مع الخطأ context_length_exceeded بشكل صريح، بدلًا من تركه يتصاعد كاستثناء غير معالج ويظهر للمستخدم.
import openai
import tiktoken
client = openai.OpenAI()
def chat_with_context_guard(messages, model='gpt-4o-mini', max_tokens=100000):
enc = tiktoken.encoding_for_model(model)
total = sum(len(enc.encode(m.get('content',''))) + 4 for m in messages) + 3
while total > max_tokens and len(messages) > 2:
# Remove the second message (keep system prompt)
removed = messages.pop(1)
total -= len(enc.encode(removed.get('content',''))) + 4
print(f'Trimmed a message. New total: {total} tokens')
try:
return client.chat.completions.create(model=model, messages=messages)
except openai.BadRequestError as e:
if 'context_length' in str(e):
return {'error': 'Message history too long. Please start a new conversation.'}
raiseاستمرار السياق عبر الجلسات
في التطبيق الحقيقي، يغلق المستخدمون التطبيق ويفتحونه من جديد، كما يُعاد تشغيل الخادم. لذلك يجب أن تراعي إدارة السياق استمراره عبر الجلسات، لا داخل الجلسة الواحدة فقط. وهذا يعني تخزين سجل المحادثة في قاعدة بيانات وتحميله عند بدء كل جلسة.
من الأنماط المعقولة: تخزين السجل الخام الكامل في PostgreSQL لأغراض التدقيق والضبط الدقيق، لكن عند تحميل السياق لاستدعاء جديد لواجهة API، طبّقوا استراتيجية التلخيص أو الاقتطاع لتلائم ميزانية الرموز المميّزة. وبهذه الطريقة لا تفقدون أي بيانات، ولا تدفعون تكلفة السجل الكامل في كل طلب.
مراقبة نمو السياق في بيئة الإنتاج
سجّلوا عدد الرموز المميّزة لكل استدعاء لواجهة API، وتتبعوه بمرور الوقت حسب معرّف المحادثة. ينبغي أن تُظهر المحادثة السليمة نموًا تدريجيًا يتبعه استقرار، مع بدء التلخيص بالعمل. أما المحادثة التي تنمو بلا حدود حتى تصل إلى حد السياق، فتشير إلى أن منطق الاقتطاع لديكم لا يعمل بشكل صحيح.
راقبوا أيضًا متوسط طول السياق عبر جميع المحادثات. فإذا اتجه إلى الارتفاع بمرور الوقت، فقد يشير ذلك إلى نمو موجّه النظام الافتراضي لديكم بسبب إضافة ميزات، أو إلى أن المستخدمين يلصقون مدخلات أطول، أو إلى أن RAG يعيد مقاطع أكبر تدريجيًا. ولكل سبب من هذه الأسباب حل مختلف.
دمج الاستراتيجيات: نمط إنتاجي
يجمع نظام إدارة السياق المتين في بيئة الإنتاج بين استراتيجيات متعددة ضمن طبقات:
- قبل تجميع السياق: تحقّقوا من ميزانية الرموز المميّزة وسجّلوها
- طبّقوا استخراج الكيانات: أدرجوا كتلة ذاكرة منظمة تحتوي على الحقائق الأساسية
- أضيفوا السجل الحديث: أدرجوا آخر 6 إلى 10 رسائل حرفيًا
- لخّصوا السجل الأقدم: إذا وُجد سجل أقدم، أدرجوا ملخصًا مستمرًا
- فحص الحماية: إذا ظل الإجمالي يتجاوز الميزانية، فاقتطعوا أقدم الرسائل الحرفية
يحافظ هذا النهج متعدد الطبقات على أهم المعلومات، أي ذاكرة الكيانات والسياق الحديث، مع تدهور منضبط للسجل الأقدم، بتحويله إلى ملخصات ثم إلى اقتطاع كخيار أخير فقط.
تحقق سريع
اختبروا مدى فهمكم لمفاهيم هندسة الذكاء الاصطناعي التي تناولها هذا الدرس.
مراجعة الدرس
تعلّمتم في هذا الدرس أن: النوافذ المنزلقة والاقتطاع المراعي لعدد الرموز المميّزة استراتيجيتان بسيطتان تتخلصان من السياق القديم للبقاء ضمن الحدود، وأن التلخيص يضغط الأدوار القديمة في تمثيل موجز يحافظ على الحقائق الأساسية، وأن ذاكرة الكيانات تستخرج حقائق منظمة لتوفير ذاكرة طويلة الأمد فعّالة من حيث عدد الرموز المميّزة عبر المحادثة. سنستكشف بعد ذلك كيفية جعل نماذج LLM تعيد JSON موثوقًا باستخدام وضع JSON والمخرجات المنظمة.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «استراتيجيات البقاء ضمن حدود السياق» مجاني؟
نعم — نص درس «استراتيجيات البقاء ضمن حدود السياق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.
ماذا ستتعلم في «استراتيجيات البقاء ضمن حدود السياق»؟
طبّقوا ذاكرة النافذة المنزلقة، وتلخيص الرسائل، وتقليص السياق انتقائيًا للتعامل مع المحادثات الطويلة من دون تجاوز حدود tokens. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟
لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «استراتيجيات البقاء ضمن حدود السياق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟
نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما هو Token؟
- نوافذ السياق: الحجم والتداعيات
- حساب تكاليف API والتنبؤ بها
- استراتيجيات البقاء ضمن حدود السياق