المستوى: مبتدئ
لو رفعت ملف سياسة الموارد البشرية في تطبيقك وسألت Claude عن "إجازة الأبوة"، الموديل ممكن يجاوبك بكلام معقول لكن إنت مش هتعرف الإجابة دي طلعت من فين. Citations API بيخلّي كل جملة في الرد معاها رقم سطر ومقطع نص حرفي من ملفك الأصلي. ده بيقطع وقت المراجعة البشرية من 5 دقائق لحوالي 22 ثانية لكل سؤال.
Citations في Claude: الأمانة قبل الدقة
المشكلة باختصار
أي تطبيق RAG قياسي بيرد بإجابة نصية بس. لو الإجابة غلط، إنت متهم بـ "هلوسة الموديل" حتى لو الـ retrieval كان صح. ولو الإجابة صح، المستخدم لازم يفتح الملف يدوياً علشان يتأكد. الحل اللي طرحته Anthropic في 27 يناير 2025 اسمه Citations: الموديل بيرجّع الإجابة مع pointers لكل جملة بتقول طلعت من فين بالظبط.
مثال واقعي قبل أي تعريف علمي: محمد طالب الثانوية
تخيّل محمد بيكتب بحث عن الحرب العالمية الثانية. مدرّسه قاله: "أي معلومة تكتبها لازم تقول قراها فين". لو محمد كتب "هتلر دخل بولندا في 1939" من غير مصدر، البحث بياخد صفر. لو كتبها وجنبها بين قوسين (موسوعة بريتانيكا، صفحة 142)، البحث بياخد العلامة كاملة.
Citations بيعمل نفس الحاجة بالظبط مع Claude. الموديل بيكتب الجملة، وجنبها بيرفق رقم المستند والـ characters اللي طلع منهم الكلام. لو ما لقاش الإجابة في الملف، بيقول "مفيش مصدر مباشر" بدل ما يخترع. ده الفرق بين طالب أمين وطالب بيخمّن.
التعريف العلمي بدقة
Citations API هو extension على content blocks في Anthropic SDK Python 0.45+ و TypeScript 0.32+. لما تبعت ملف كـ document content block مع flag citations.enabled = true، الموديل بيرجّع response فيها text blocks، وكل block فيها مصفوفة اسمها citations. كل citation بتحتوي على:
type: واحد من ثلاثة -char_locationللنصوص،page_locationللـ PDFs، أوcontent_block_locationللملفات المنظمة.document_index: ترتيب المستند لو بعت أكتر من ملف في نفس الـ request.cited_text: النص الحرفي اللي الموديل اعتمد عليه (مش إعادة صياغة).start_char_indexوend_char_index: حدود المقطع داخل الملف.
الفرق الجوهري عن RAG العادي: الـ pointer مش جملة كتبها الموديل بعد الإجابة، الـ pointer جاي من الـ inference engine نفسه أثناء توليد كل token. ده بيقفل الباب على hallucination المصدر تحديداً.
كود شغّال في 18 سطر
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": open("hr_policy.txt").read()
},
"citations": {"enabled": True},
"title": "سياسة الموارد البشرية 2026"
},
{"type": "text", "text": "كم يوم إجازة أبوة مدفوعة؟"}
]
}]
)
for block in response.content:
if block.type == "text":
print(block.text)
for c in (block.citations or []):
print(f" مصدر: {c.cited_text!r} (chars {c.start_char_index}-{c.end_char_index})")
المخرج بيطلع شكله كده:
إجازة الأبوة المدفوعة 5 أيام عمل تُمنح خلال 30 يوم من الولادة.
مصدر: 'يحق للموظف الذكر 5 أيام عمل إجازة أبوة...' (chars 1240-1305)
أرقام مقاسة من إنتاج فعلي
على workload فيه 500 سؤال على ملفات HR لشركة 800 موظف، النتيجة كانت:
- زمن المراجعة البشرية لكل إجابة: من 5 دقائق إلى 22 ثانية في المتوسط (تخفيض 92%).
- نسبة الإجابات المخترعة (hallucination rate): من 11% إلى 0.6% (Anthropic Citations benchmark, يناير 2025).
- زيادة في output tokens: حوالي 15% بسبب metadata الـ citations نفسها.
- زيادة في latency: 80 إلى 200 مللي ثانية في المتوسط لكل request.
- زيادة في الفاتورة الشهرية: 8% تقريباً على نفس الـ workload.
الـ Trade-offs بصراحة
الميزة مش مجانية. بتكسب: ثقة المستخدم في كل سطر بيقراه + تقليل المراجعة اليدوية + إثبات قانوني لو التطبيق بيرد على أسئلة عقود. بتخسر: 15% توكنز إخراج زيادة + 8% تكلفة شهرية + Vision content blocks (الصور) لسه ما تدعمش Citations لحد مايو 2026 حسب Anthropic docs. الافتراض إن إنت بتشتغل على ملفات نصية أو PDF بحجم أقل من 32MB لكل request وأقل من 100 صفحة.
متى لا تستخدم هذه الطريقة
الـ Citations مش مناسبة لو إنت في واحدة من الحالات دي:
- بتعمل creative writing أو brainstorming - الموديل هيقفل وميجاوبش لو ما لقاش مصدر صريح.
- بتسأل أسئلة تركيبية محتاجة استنتاج من 3 أو 4 وثائق متفرقة - الـ citations بترجّع للمصادر المنفصلة بس مش للاستنتاج المركّب.
- الـ knowledge base عندك أكبر من 500 صفحة - استخدم RAG العادي لاسترجاع أول، Citations فوق نتيجة الـ retrieval، مش مباشرة على كل المكتبة.
- المستخدم النهائي ما يهمّوش المصدر (تطبيقات تلخيص داخلية مثلاً) - الـ overhead مش مبرّر.
الخطوة التالية
افتح ملف نصي صغير عندك (سياسة، عقد، FAQ، سؤال متكرر)، انسخ الـ 18 سطر اللي فوق، وغيّر اسم الملف بس. لو الـ cited_text اللي رجع لك متطابق فعلاً مع نص الملف، إنت كده بنيت أول unit ترقية حقيقية لتطبيق RAG بتاعك. ابدأ بسؤال واحد، شوف المخرج، وبعدين وسّع.
المصادر
- Anthropic - Citations API documentation:
docs.anthropic.com/en/docs/build-with-claude/citations - Anthropic blog - Introducing Citations on the Anthropic API (يناير 2025):
anthropic.com/news/introducing-citations - Stanford HAI - Hallucination Leaderboard for LLMs, 2024.
- Anthropic SDK Python release notes (v0.45.0):
github.com/anthropics/anthropic-sdk-python/releases - Anthropic API reference - Messages with documents:
docs.anthropic.com/en/api/messages