الوحدة 9 — التتبّع والتقييم وتصحيح الأخطاء
مسار LangChain يمتدّ بسرعة: قالب، مسترجِع، ذاكرة، وكيل، ثلاث أدوات. حين ينهار الجواب في الإنتاج، «print» لا يكفي. نحتاج رؤية عميقة لكلّ استدعاء، وطريقة قياس ما يتحسّن وما ينحدر مع كلّ تعديل.
التتبّع: ما الذي يحدث فعلًا داخل السلسلة
كلّ سلسلة LCEL تُنتج شجرة نداءات: القالب، النموذج، الأداة، إلخ. LangSmith (الخدمة الرسميّة من فريق LangChain) تجمع هذه الشجرة بلا شيفرة إضافيّة، بتفعيل ثلاثة متغيّرات بيئة:
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=lsv2_...
export LANGCHAIN_PROJECT=notes-frais
في لوحة LangSmith، كلّ استدعاء يعرض:
- التعليمة النهائيّة المُرسَلة (بعد حقن المتغيّرات).
- الرسائل الوسيطة، بما فيها استدعاءات الأدوات ونتائجها.
- عدد الرموز المُدخَلة والمُخرَجة، وكلفة كلّ استدعاء بالدولار.
- المدّة الكلّيّة والمدّة لكلّ خطوة.
للتحكّم بدون خدمة خارجيّة، LangChain يدعم OpenTelemetry أصلًا، ويُرسل الآثار إلى Jaeger أو Grafana Tempo أو أيّ جامع OTLP. الاختيار تشغيليّ لا وظيفيّ.
الكلفة: مسألة مالية ملموسة
جرّب هذا الحساب على وكيل يستدعي ثلاث أدوات في تشغيل واحد:
- نداء نموذج بـ2000 رمز مُدخَل و300 مُخرَج بسعر 0.15 دولار للمليون مُدخَل و0.60 للمليون مُخرَج = 0.00048 دولار.
- ثلاثة نداءات في المسار = 0.0015 دولار للاستفسار.
- 10 آلاف استفسار يوميًّا = 15 دولارًا يوميًّا، أي 450 دولارًا شهريًّا.
الكلفة ليست ثابتة، بل تتضاعف مع طول الذاكرة، وعدد استدعاءات الأدوات، وتغيير النموذج. التتبّع هو أداة الإشراف الماليّ الوحيدة: بدونه، إعلان الفاتورة الشهريّة يأتي مفاجأة.
من التتبّع إلى التقييم
التتبّع يخبرنا ما حدث؛ التقييم يخبرنا ما إن كان جيّدًا. الفرق حاسم: عرض 10 آثار جميلة لا يعني أنّ 90٪ الأخرى صحيحة. نحتاج جدولًا مرجعيًّا.
جدول تقييم بسيط: قائمة من (سؤال، جواب مرجعيّ) مأخوذة من محادثات فعليّة أو مصمَّمة يدويًّا لتغطية الحالات الحدّيّة.
from langsmith import Client
client = Client()
exemples = [
("ما سقف عشاء العمل؟", "السقف 50 يورو للشخص."),
("هل تُستَرَدّ فاتورة تاكسي بدون ختم؟", "لا، الفاتورة تحتاج مرجعًا واضحًا."),
("كم يبقى من سقف مارس؟", "..."), # تحتاج قاعدة بيانات، تختبر أداة
]
client.create_dataset("notes-frais-eval-v1", ...)
for q, r in exemples: client.create_example(inputs={"question": q}, outputs={"reference": r}, dataset_id=...)
عشرون إلى مئة مثال يكفيان للانطلاق. النقطة: تُنقَّح كلّ ثلاثة أشهر كلّما اكتُشفت حالات جديدة في الإنتاج.
المُقيّمات: أنواع القياس
ثلاث فئات من المُقيّمات، لكلّ منها مكانه:
- مطابقة دقيقة: صالح لأسئلة بحقيقة واحدة (رقم سقف، تاريخ، صنف). سريع، لا يحتاج نموذجًا.
- معايير معلَنة عبر نموذج قاضٍ (LLM-as-judge): نُطلق نموذجًا يقارن جواب المساعد بالجواب المرجعيّ، ويُسنّف على معيار: هل الجواب موثوق؟ هل يستشهد بالمصدر؟ هل يعترف بعد م المعرفة؟
- تقييم بشريّ: للحالات الحسّاسة قبل الإصدار. مكلف لكنّه المرجع.
from langsmith.evaluation import evaluate, LangChainStringEvaluator
evaluate(
lambda x: rag.invoke(x["question"]),
data="notes-frais-eval-v1",
evaluators=[LangChainStringEvaluator("qa", config={"llm": modele_juge})],
)
التقييم بلا جدول: المشكلة
كثير من الفرق تُطلق تعديلات دون قياس. النتيجة النموذجيّة: تحسين خفيّ لـ«الحالة التي كانت تُزعج» يكسر ثلاثًا أخرى دون أن يلاحظها أحد. بدون جدول، كلّ تعديل مقامرة. الحدّ الأدنى: عشرون سؤالًا-جوابًا مأخوذة من الإنتاج، تُشغَّل قبل كلّ إصدار، ونصادق يدويًّا. ثلاثين دقيقة أسبوعيًّا توفّر أسابيع من الانحدار الصامت.
اكتشاف الانحدار بين النسخ
مع كلّ تعديل (تعليمة جديدة، عتبة استرجاع أخرى، تبديل نموذج) نُشغّل الجدول كاملًا ونقارن مع الإصدار السابق:
- عدد الإجابات الصحيحة (مطابقة دقيقة أو قاضٍ).
- كلفة متوسّطة للاستفسار.
- زمن استجابة p50 وp95.
إن انحدر أيّ منها، نُوقف الإصدار. LangSmith يعرض المقارنة تلقائيًّا. أساس القياس: لا نصادق إصدارًا لأنّ الحالات الثلاث الأولى تعمل.
التصحيح العمليّ
عند ورود شكوى «الجواب مغلوط»، خطوات ثلاث:
- العثور على الأثر في LangSmith عبر معرّف الجلسة (ولذلك نُسجّل هذا المعرّف في السجلات).
- قراءة المسار كاملًا: هل استرجع المسترجِع المقاطع الصحيحة؟ هل قرأها النموذج جيّدًا؟ هل استدعى الأداة المناسبة؟
- إضافة الحالة إلى جدول التقييم حتّى لا تعود، ثمّ إصلاحها.
هذه الخطوة الثالثة هي التي تحوّل «إصلاح» إلى «تحسين قابل للاستدامة». بدون جدول تراكميّ، نُصلح نفس المشاكل باستمرار.
الفخّ: الاحتفاء بمقياس واحد
تفرح لوحة LangSmith بقيمة قاضٍ «85٪ إجابات صحيحة». وحدها لا تكفي. راقب أيضًا:
- معدّل الاستشهاد: هل يذكر الجواب المصدر؟
- معدّل الاعتراف بالجهل: هل يقول «لا أعلم» حين لا يعلم؟
- الكلفة p95: هل يوجد استفساران غاليان جدًّا يُعادلان يومًا كاملًا؟
الجودة متعدّدة الأبعاد. مقياس واحد يخلق تحسينًا زائفًا.
نموذج قاضٍ يستعمل نفس المزوّد أو نفس عائلة النموذج قد يُوافِق تحيّزات النظام المُقَيَّم. استعمل عائلة نموذج مختلفة للقاضي كلّما أمكن (Claude يقيس مساعدًا يعمل بـGPT، والعكس).
الخلاصة
- التتبّع يعطي شفافيّة كاملة على شجرة النداءات، والكلفة، والزمن.
- التقييم بدون جدول مرجعيّ مقامرة؛ عشرون مثالًا مصمَّمًا يدويًّا يكفيان للانطلاق.
- ثلاث فئات مُقيّمات: مطابقة دقيقة، نموذج قاضٍ، بشريّ؛ يُستَعمَل كلٌّ منها في محلّه.
- الانحدارات تُكتَشف بمقارنة نسختين، لا بإجابة على ثلاث حالات جديدة؛ الجدول يُغذَّى من كلّ شكوى فعليّة.