ضغط السياق: فن تلخيص جلسة برمجة من 3 ساعات لنموذجك اللغوي
· 5 دقائق قراءة

يملك مبرمجك الذكي الثنائي حداً قدره 200 ألف رمز. بعد 3 ساعات، أنت عند 150 ألف. ماذا تفعل؟
مشكلة حد الرموز
أنت تبرمج مع ذكاء اصطناعي. بعد ثلاث ساعات:
- 47 رسالة من المستخدم
- 47 رد من المساعد
- 94 استدعاء أداة
- 94 نتيجة أداة
المجموع: ~150 ألف رمز
نافذة سياق النموذج اللغوي: 200 ألف رمز
لديك 50 ألف رمز متبقية. بهذا المعدل، ستصل للحد خلال ساعة.
الخيارات:
- بدء جلسة جديدة — فقدان كل السياق
- قص الرسائل القديمة — فقدان تفاصيل قد تكون مهمة
- التلخيص بالنموذج اللغوي — مكلف وبطيء
- ضغط السياق — ضغط ذكي
ما هو ضغط السياق؟
يقلل ضغط السياق استخدام الرموز بذكاء مع الحفاظ على المعنى الدلالي:
قبل: 847 رسالة، ~142 ألف رمز
بعد: 23 رسالة، ~3 آلاف رمز
[ملخص السياق — مضغوط من 847 رسالة]
## الطلب الأصلي
طلب المستخدم توليد schema (مخطط يصف بنية التطبيق) من نوع orbital لتطبيق إدارة مهام...
## الإجراءات المتخذة
1. إنشاء schema الـ `taskly.orb` مع 3 orbitals (وحدات بناء التطبيق)
2. التحقق — إصلاح 4 أخطاء
3. الـ compile (تحويل الـ schema لكود قابل للتشغيل) إلى قالب TypeScript
4. طلب المستخدم إضافة حقل "الأولوية"
## الحالة الحالية
- الـ schema صالح ويُصرَّف بنجاح
- مجلد العمل: /home/user/projects/taskly
خط أنابيب الضغط
يتبع ضغط السياق في Almadar خط أنابيب من 8 خطوات:
الخطوة 1: تقدير الرموز
function estimateTokens(messages: Message[]): number {
// استدلال مبني على الأحرف (دقة 80%)
const totalChars = messages.reduce((sum, m) => {
const content = typeof m.content === 'string'
? m.content
: JSON.stringify(m.content);
return sum + content.length;
}, 0);
return totalChars / 4; // ~4 أحرف لكل رمز
}
الخطوة 2: تصنيف الرسائل
لا تتساوى جميع الرسائل:
| الفئة | أمثلة | أولوية الضغط |
|---|---|---|
| النظام | طلب النظام، تعليمات المهارة | لا تُلمس أبداً |
| المرساة | طلب المستخدم الأصلي | يُحفظ في الملخص |
| كثيفة الأدوات | قراءة ملفات، مخرجات التحقق | تُضغط أولاً |
| الاستدلال | تحليل المساعد | يُلخَّص |
| الحديثة | آخر N رسالة | لا تُلمس أبداً |
الخطوة 3: التقسيم
التقسيم إلى قديم وحديث:
const keepRecent = 20; // الاحتفاظ دائماً بآخر 20 رسالة
const recent = messages.slice(-keepRecent);
const old = messages.slice(0, -keepRecent);
الخطوة 4: ضغط نتائج الأدوات
استبدال المخرجات الكبيرة بعناصر نائبة:
// قبل: 850 سطر من الكود
{
role: 'tool',
content: '<850 lines of TypeScript...>'
}
// بعد: سطر واحد
{
role: 'tool',
content: '[read_file: src/schema.ts — 850 lines]'
}
الخطوة 5: التلخيص (اختياري)
لاستراتيجية summarize أو hybrid:
const summaryPrompt = `
Summarize this conversation for an AI assistant.
Focus on:
1. What the user originally requested
2. What actions have been taken
3. What the current state is
4. Any errors encountered and how they were fixed
Be concise but comprehensive.
`;
const summary = await llm.generate(summaryPrompt, oldMessages);
