Context Window
نافذة السياق هي الحد الأقصى لعدد الرموز التي يستطيع النموذج التعامل معها في طلب واحد، وتشمل المطالبة وسجل المحادثة والمستندات والرد.
نافذة السياق هي الحد الأقصى لعدد الرموز التي يمكن للنموذج أخذها في الحسبان ضمن طلب واحد. وبالنسبة إلى نموذج اللغة الكبير (LLM)، تشترك جميع المواد التي يقرأها ويكتبها في تلك السعة: مطالبة النظام وتعريفات الأدوات وسجل المحادثة والمستندات المسترجعة وسؤال المستخدم والرد الذي يولده. لا يصل النص الواقع خارج النافذة إلى النموذج مطلقًا، ولهذا يفقد روبوت المحادثة القدرة على تتبع بداية محادثة طويلة جدًا عندما تُحذف الأدوار السابقة. وقد توسعت النوافذ من 2,048 رمزًا في GPT-3 إلى 128K رمزًا في GPT-4 Turbo أواخر عام 2023، ثم إلى مليون في Gemini 1.5 Pro من Google عام 2024، فيما تعلن Llama 4 Scout من Meta عن سعة تبلغ 10 ملايين.
ما الذي يملأ نافذة السياق؟#
تقسّم عملية الترميز النص إلى أجزاء أصغر من الكلمات، يبلغ متوسط كل منها نحو أربعة أحرف باللغة الإنجليزية، لذا تعادل نافذة من 128K رمزًا نحو 300 صفحة. ويستهلك نموذج الرؤية واللغة (VLM) رموزًا للصور أيضًا، عادةً مئات رموز الرقع لكل صورة، لذا يملأ الفيديو الطويل النافذة أسرع بكثير من نص تفريغه. وتُحتسب الرموز المُولّدة ضمن الحد نفسه، ويحدد المزوّدون سقفًا منفصلًا لطول المخرجات داخله. لذا تجمع التطبيقات التي تشغّل محادثات طويلة أو وكلاء ذكاء اصطناعي المطالبة في كل جولة وتقرر ما ينبغي الاحتفاظ به:
لماذا تكون النوافذ محدودة؟#
تتزايد تكلفتان مع طول النص. تقارن آلية الانتباه الذاتي كل رمز بكل رمز آخر، لذا يزداد حساب الانتباه تربيعيًا مع عدد الرموز. وأثناء توليد النص، تحتفظ ذاكرة KV المؤقتة بالمفاتيح والقيم لكل رمز سابق: يخزن Llama 3.1 8B، بطبقاته الـ32 ورؤوسه الثمانية لمفاتيح وقيم بطول 128 بُعدًا لكل منها، 128 KiB لكل رمز بدقة 16 بت، أي 16 GiB عند بلوغ نافذته الكاملة البالغة 131,072 رمزًا، وهو ما يتجاوز مساحة 16 GB التي تشغلها أوزانه.
يتحدد حجم النافذة أيضًا بالتدريب. فالنموذج المدرّب على تسلسلات من 8K رمز لم يرَ مواضع تتجاوز هذا الحد، لذا يتطلب تمديدها إعادة تحجيم تضمينات المواضع الدوارة (RoPE) باستخدام أساليب مثل YaRN، وضبطًا دقيقًا قصيرًا على نصوص أطول. ويعتمد تشغيل النوافذ الطويلة على تقنيات توفير الذاكرة: تحسب آلية الانتباه السريع الانتباه الدقيق دون تخزين مصفوفة الدرجات كاملةً، وتقلص آلية الانتباه باستعلامات مجمعة (GQA) ذاكرة KV المؤقتة، وتحد آلية الانتباه بالنافذة المنزلقة من الرموز التي يراها كل رمز لتقتصر على جيرانه الأحدث، بينما تقسّم آلية الانتباه الحلقي تسلسلًا واحدًا بين وحدات GPU عديدة.
السعة المُعلنة والسياق الفعلي#
لا يستخدم النموذج الذي يقبل مليون رمز جميعها بالكفاءة نفسها. ووجدت دراسة ضائع في الوسط لعام 2023 أن النماذج تجيب على نحو أفضل عندما يقع المقطع ذو الصلة في بداية المطالبة أو نهايتها، وعلى نحو أسوأ عندما يقع في وسطها. تقيس اختبارات إبرة في كومة قش (NIAH) استرجاع حقيقة واحدة مُدرجة عند كل عمق وطول، ووجد اختبار RULER المعياري الأصعب أن نصف النماذج الـ17 التي تعلن عن سعة لا تقل عن 32K رمزًا فقط قد حقق أداءً مرضيًا عند 32K. ويُسمى التراجع التدريجي مع ازدياد المدخلات تدهور السياق، ويواجهه كل من التوليد المعزز بالاسترجاع (RAG) وهندسة السياق عبر وضع المواد ذات الصلة فقط في النافذة.
نافذة السياق والمصطلحات ذات الصلة#
- المجال الاستقبالي: منطقة صورة الإدخال التي تؤثر في إحدى مخرجات الشبكة العصبية الالتفافية (CNN). تحددها أحجام النوى وعمق الشبكة، بينما تمثل نافذة السياق ميزانية للرموز.
- حجم الدفعة: عدد التسلسلات المستقلة التي تُعالج معًا. وتحدد نافذة السياق الحد الأقصى لطول كل تسلسل.
- الذاكرة: تستمر ذاكرة الوكيل، مثل الذاكرة الحلقية المخزنة في قاعدة بيانات متجهية، خارج النافذة، وتُنسخ إليها مجددًا عند الحاجة.
نوافذ السياق في الكشف ذي المفردات المفتوحة#
لنماذج النص داخل نماذج الرؤية نوافذ أيضًا. يرمّز كل من Ultralytics YOLOE وYOLO-World مطالبة كل فئة باستخدام مُرمّز نصي من عائلة CLIP، نافذة سياقه 77 رمزًا، ويقتطع مُرمّز النص في Ultralytics المطالبات الأطول افتراضيًا. ويبيّن مُرمّز CLIP نفسه ما يُحذف:
import clip
from clip.simple_tokenizer import SimpleTokenizer
prompt = (
"a warehouse worker wearing a yellow high-visibility vest, a white hard hat, blue gloves and clear safety "
"glasses, standing beside a red forklift that carries wooden pallets stacked with brown cardboard boxes, "
"under bright ceiling lights in a narrow aisle between tall metal shelves, next to a fire extinguisher "
"mounted on the wall, a green emergency exit sign, an open loading dock door and a black dog"
)
# CLIP's BPE tokenizer wraps the text in start and end tokens
tokenizer = SimpleTokenizer()
print(f"Prompt length: {len(tokenizer.encode(prompt)) + 2} tokens")
# The text encoder reads a fixed 77-token window, so truncation drops the tail
tokens = clip.tokenize(prompt, truncate=True)[0]
kept = tokenizer.decode(tokens[1:-1].tolist())
print(f"Window: {len(tokens)} tokens ending in '{' '.join(kept.split()[-4:])}'")
print(f"'black dog' kept: {'black dog' in kept}")يتكون طول المطالبة من 80 رمزًا، لذا تحتفظ النافذة بأول 75 رمزًا نصيًا، إضافةً إلى علامتي البداية والنهاية، وتنتهي عند عبارة "loading dock door and"، وتحذف "a black dog" قبل أن يراها المُرمّز.










