الحفاظ على السياق عبر الأجزاء
التداخل والسياق المتحرك وحقن البيانات الوصفية لتحقيق الاستمرارية
الحفاظ على السياق عبر الأجزاء درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
مشكلة السياق بين المقاطع
عند تقسيم مستند إلى مقاطع، قد تكون هناك حاجة إلى معلومات من المقطع N لتفسير المقطع N+1 تفسيراً صحيحاً. على سبيل المثال: يُستخدم في المقطع 7 مصطلح عُرّف في المقطع 3. ومن دون جسر للسياق، لا يعرف النموذج الذي يعالج المقطع 7 ذلك التعريف.
تعالج هذه المشكلة أربع استراتيجيات: التداخل، وإدراج الملخص المتراكم، ووسوم البيانات الوصفية، ومراجع أرقام الصفحات.
الاستراتيجية الأولى: تداخل الرموز
يكرر التداخل آخر N من رموز المقطع N في بداية المقطع N+1. ويضمن ذلك ظهور الجملة أو الحجة الممتدة عبر حد فاصل كاملةً في مقطع واحد على الأقل.
التداخل المعتاد: 100–200 رمز (نحو 75–150 كلمة). يؤدي التداخل الكبير جداً إلى زيادة التكرار والتكلفة، بينما يترك التداخل القليل جداً فجوات عند الحدود.
import tiktoken
enc = tiktoken.get_encoding('cl100k_base')
def chunk_with_overlap(text, max_tokens=1000, overlap=200):
tokens = enc.encode(text)
chunks = []
step = max_tokens - overlap
i = 0
while i < len(tokens):
chunk = tokens[i:i + max_tokens]
chunks.append(enc.decode(chunk))
i += step
return chunks
chunks = chunk_with_overlap(document, max_tokens=1000, overlap=200)
print(f'{len(chunks)} chunks with 200-token overlap')التداخل للاسترجاع مقابل التلخيص
يعمل التداخل بشكل مختلف باختلاف المهمة:
- الاسترجاع: يفيد التداخل — إذ يطابق الاستعلام المنطقة المتداخلة في أي من المقطعين المتجاورين، مما يحسن الاستدعاء. استخدموا تداخلاً يتراوح بين 10 و20% من حجم المقطع.
- التلخيص: قد يسبب التداخل تكراراً — إذ تُلخّص الجملة نفسها مرتين. استخدموا تداخلاً أصغر (5–10%) أو أزيلوا التداخل قبل التلخيص.
def strip_overlap(chunks, overlap_tokens=200):
'''Remove the leading overlap from each chunk (except the first).'''
cleaned = [chunks[0]]
for chunk in chunks[1:]:
tokens = enc.encode(chunk)
trimmed = enc.decode(tokens[overlap_tokens:])
cleaned.append(trimmed)
return cleanedاستراتيجية 2: حقن الملخص التراكمي
يُعد الملخص التراكمي خلاصةً مستمرةً لجميع المقاطع التي عولجت حتى الآن. قبل معالجة المقطع N، احقن الملخص التراكمي في المطالبة بوصفه سياقًا. يتيح ذلك للنموذج معرفة المحتوى السابق من دون تجاوز نافذة السياق.
import openai
client = openai.OpenAI(api_key='sk-...')
def process_with_rolling_summary(chunks):
rolling_summary = ''
results = []
for i, chunk in enumerate(chunks):
context = ''
if rolling_summary:
context = f'Summary of previous sections:\n{rolling_summary}\n\n'
prompt = context + f'Current section:\n{chunk}'
resp = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': 'Answer questions or summarize, using prior context.'},
{'role': 'user', 'content': prompt}
]
)
result = resp.choices[0].message.content
results.append(result)
# Update rolling summary
rolling_summary = update_rolling_summary(rolling_summary, chunk)
return resultsتحديث الملخص التراكمي
ينبغي أن ينمو الملخص التراكمي تدريجيًا. بعد معالجة كل مقطع، اطلب من LLM تحديث الملخص بدمج المعلومات الجديدة من ذلك المقطع. اجعل الملخص التراكمي موجزًا — من 200 إلى 400 رمز مميز — لإتاحة مساحة للمقطع الحالي.
def update_rolling_summary(current_summary, new_chunk, max_words=150):
if not current_summary:
prompt = f'Summarize the following in under {max_words} words:\n\n{new_chunk}'
else:
prompt = (
f'Current running summary (under {max_words} words):\n{current_summary}\n\n'
f'New section to incorporate:\n{new_chunk}\n\n'
f'Update the summary to include the new section. Stay under {max_words} words.'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.contentاستراتيجية 3: وسوم البيانات الوصفية
تُرفق وسوم البيانات الوصفية معلومات منظمة بكل مقطع، حتى يعرف LLM ما يعالجه ويتمكن من الحفاظ على الاستمرارية المنطقية.
تشمل الوسوم الشائعة: document_title وchapter وsection وpage وchunk_index وtotal_chunks. احقن هذه الوسوم كرأس في المطالبة، لا داخل نص المقطع، للفصل بين المحتوى والبيانات الوصفية.
def build_prompt_with_metadata(chunk, metadata):
header = (
f'Document: {metadata["title"]}\n'
f'Chapter: {metadata["chapter"]}\n'
f'Section: {metadata["section"]}\n'
f'Page: {metadata["page"]}\n'
f'Chunk: {metadata["chunk_index"] + 1} of {metadata["total_chunks"]}\n'
'---\n'
)
return header + chunk
prompt = build_prompt_with_metadata(
chunk=chunks[5],
metadata={
'title': 'Annual Report 2024',
'chapter': '3. Financial Results',
'section': '3.2 Revenue Breakdown',
'page': 42,
'chunk_index': 5,
'total_chunks': 120
}
)استراتيجية 4: مراجع أرقام الصفحات
عندما يشير أحد المقاطع إلى شيء من صفحة سابقة، يستطيع النموذج الاستشهاد به إذا كانت أرقام الصفحات مضمّنة. احقن فواصل الصفحات كمؤشرات في النص قبل تقسيمه إلى مقاطع، حتى تبقى هذه المؤشرات ضمن المقاطع:
def inject_page_markers(pages):
'''pages: list of strings, one per page.'''
marked = []
for i, page_text in enumerate(pages):
marked.append(f'[PAGE {i+1}]\n{page_text}')
return '\n\n'.join(marked)
# When the model sees [PAGE 12] in context, it can say
# 'As defined on page 12...' in its output, enabling traceability.
document_with_markers = inject_page_markers(pdf_pages)
chunks = chunk_with_overlap(document_with_markers)دمج الاستراتيجيات
في بيئة الإنتاج، ادمج الاستراتيجيات الأربع للحصول على أعلى دقة ممكنة في الحفاظ على السياق:
- أضف مؤشرات الصفحات قبل تقسيم النص إلى مقاطع
- قسّم النص إلى مقاطع مع تداخل بمقدار 200 رمز مميز
- أرفق رأس البيانات الوصفية بمطالبة كل مقطع
- احقن الملخص التراكمي قبل كل مقطع
يضمن النهج المدمج أن يعرف النموذج دائمًا: موضعه في المستند، وما سبقه، وكيف يرتبط المقطع الحالي بالمستند ككل.
def process_document(pages, doc_metadata):
# Step 1: inject page markers
full_text = inject_page_markers(pages)
# Step 2: chunk with overlap
chunks = chunk_with_overlap(full_text, max_tokens=900, overlap=150)
total = len(chunks)
rolling_summary = ''
results = []
for i, chunk in enumerate(chunks):
meta = {**doc_metadata, 'chunk_index': i, 'total_chunks': total}
prompt = build_prompt_with_metadata(chunk, meta)
if rolling_summary:
prompt = 'Prior context:\n' + rolling_summary + '\n\n' + prompt
result = call_llm(prompt)
results.append(result)
rolling_summary = update_rolling_summary(rolling_summary, chunk)
return resultsتقييم الاحتفاظ بالسياق
للتحقق من نجاح استراتيجية السياق، أنشئ أسئلة اختبار تتطلب معلومات من عدة مقاطع:
- عرّف مصطلحًا ورد في المقطع 2، ويُطرح السؤال عنه في المقطع 8
- احسب مجموعًا يمتد عبر عدة صفحات
- حدّد تناقضًا بين الفصل 1 والفصل 5
شغّل المسار وتحقق مما إذا كانت الإجابات تشير بشكل صحيح إلى المحتوى السابق. وإذا فشلت، فزِد مقدار التداخل أو حجم الملخص التراكمي.
test_questions = [
{
'question': 'What is the definition of "net recurring revenue" used in this report?',
'defined_in_chunk': 2,
'asked_in_chunk': 9,
'expected_keywords': ['net recurring revenue', 'subscription', 'exclude']
}
]
def evaluate_context_retention(pipeline_results, test_questions):
for test in test_questions:
answer = pipeline_results[test['asked_in_chunk']]
for kw in test['expected_keywords']:
if kw.lower() not in answer.lower():
print(f'FAIL: missing "{kw}" in answer to chunk {test["asked_in_chunk"]}')ملخص المفاضلات
لكل استراتيجية تكاليف وفوائد:
- التداخل: بسيط، ويزيد عدد الرموز المميزة بنسبة التداخل، وقد يسبب تكرارًا في التلخيص
- الملخص التراكمي: فعّال، لكنه يضيف استدعاءً لـ LLM لكل مقطع، وقد ينحرف الملخص أو يفقد بعض التفاصيل
- وسوم البيانات الوصفية: مجانية الإضافة، وتساعد النموذج على تحديد موضعه، لكنها لا تحل محل المحتوى
- مؤشرات الصفحات: تتيح إمكانية التتبع، وتضيف أحرفًا إلى النص، لكن الزيادة في الرموز المميزة ضئيلة
ابدأ بالتداخل والبيانات الوصفية. ولا تضف الملخص التراكمي إلا عند ملاحظة حالات فشل في السياق عبر المقاطع أثناء الاختبار.
دليل تحديد الحجم العملي
أحجام عملية لمستند من 100 صفحة (بمتوسط 500 رمز مميز لكل صفحة = 50,000 رمز مميز إجمالًا):
- حجم المقطع: 800 رمز مميز، والتداخل 150 رمزًا مميزًا → نحو 73 مقطعًا
- الملخص التراكمي: 200 رمز مميز كحد أقصى (يُحدَّث بعد كل مقطع)
- رأس البيانات الوصفية: نحو 30 رمزًا مميزًا لكل مقطع
- حجم الإدخال الفعلي لكل استدعاء إلى API: 800 + 200 + 30 = 1030 رمزًا مميزًا
- تكلفة مرحلة Map (gpt-4o-mini بسعر $0.15/1M): 73 × 1030 × $0.15/1M ≈ $0.011
تضيف استراتيجيات السياق تكلفة ضئيلة، مع تحسين الاتساق بدرجة كبيرة.
اختبار المعرفة
ما الغرض من الملخص التراكمي في معالجة المستندات مقطعًا تلو الآخر؟
مراجعة: السياق عبر المقاطع
أربع استراتيجيات للحفاظ على السياق عبر المقاطع:
- التداخل: تكرار آخر N من الرموز المميزة في المقطع N عند بداية المقطع N+1
- الملخص التراكمي: حقن خلاصة موجزة مستمرة قبل كل مقطع
- وسوم البيانات الوصفية: رأس يتضمن معلومات المستند والفصل والقسم والصفحة
- مؤشرات الصفحات: تضمين أرقام الصفحات في النص قبل تقسيمه إلى مقاطع
ادمج الاستراتيجيات الأربع في مسارات الإنتاج. واختبر الاحتفاظ بالسياق عبر المقاطع باستخدام أسئلة تتطلب عدة مقاطع. بهذا نختتم المقرر 16 حول استراتيجيات التعامل مع المستندات الطويلة.
الأسئلة الشائعة
هل درس «الحفاظ على السياق عبر الأجزاء» مجاني؟
نعم — نص درس «الحفاظ على السياق عبر الأجزاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- استراتيجيات تقسيم النصوص الطويلة
- نمط تلخيص Map-Reduce
- التلخيص الهرمي
- الحفاظ على السياق عبر الأجزاء