0Pricing
AI Engineering Academy · درس

التتبع باستخدام LangSmith

أضيفوا التتبع عبر LangSmith إلى تطبيق LangChain لتسجيل كل خطوة من خطوات السلسلة، وكل استدعاء لـ LLM، وعدد الرموز، وزمن الاستجابة في مستكشف تتبع قابل للبحث.

التتبع باستخدام LangSmith درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ما هو LangSmith؟

LangSmith منصة لقابلية الرصد مصممة خصيصًا لتطبيقات LLM. تلتقط تلقائيًا تتبعات كل عملية تشغيل في LangChain — كل خطوة في السلسلة، وكل استدعاء لـ LLM، وكل تنفيذ لأداة، وكل عملية استرجاع، وكل مُحلّل للمخرجات — وتعرضها في مستكشف تتبعات هرمي قابل للبحث. ويمكنكم تصفية التتبعات حسب زمن الاستجابة أو التكلفة أو حالة الخطأ أو البيانات الوصفية المخصصة، وإعادة تشغيل أي تتبع لتصحيح الأخطاء.

# Install: pip install langsmith
import os

# Set environment variables to enable automatic tracing
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'lsv2_...your_key_here...'
os.environ['LANGCHAIN_PROJECT'] = 'my-rag-app'  # project name in LangSmith UI

# That's all - LangChain now sends traces to LangSmith automatically
# No code changes needed to your chain or agent

التتبع التلقائي من دون تغييرات في التعليمات البرمجية

الميزة الأبرز في LangSmith هي أنه بمجرد ضبط متغيرات البيئة الثلاثة، يتم تتبع كل عملية في LangChain تلقائيًا من دون تعليمات برمجية إضافية. إذ يجري التقاط كل سلسلة LCEL، وكل استدعاء ChatOpenAI، وكل استدعاء لأداة الاسترجاع، وكل تنفيذ لأداة، مع المدخلات والمخرجات والتوقيت وأعداد الرموز. ويمكنكم نشر تتبع LangSmith في بيئة الإنتاج بتغيير متغير بيئة واحد.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# This chain is automatically traced - no extra code needed
llm = ChatOpenAI(model='gpt-4o')
prompt = ChatPromptTemplate.from_template('Answer this question: {question}')
chain = prompt | llm | StrOutputParser()

# This call creates a trace in LangSmith showing:
# - The formatted prompt (with question substituted)
# - The LLM call with model, temperature, token counts
# - The parsed output
# - End-to-end latency and cost
result = chain.invoke({'question': 'What is RAG?'})
print(result)

تتبع مسارات RAG

تُعد تتبعات LangSmith ذات قيمة خاصة لتطبيقات RAG، لأنها تلتقط مسار الاسترجاع ثم التوليد بأكمله. ويمكنكم رؤية: المستندات التي جرى استرجاعها، ودرجات التشابه الخاصة بها، وكيفية تنسيق السياق في prompt، وما ولّده LLM. ويوضح ذلك فورًا ما إذا كانت الإجابة الخاطئة ناتجة عن استرجاع سيئ أم توليد ضعيف.

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_core.runnables import RunnablePassthrough

embeddings = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embeddings)
retriever = vectorstore.as_retriever(search_kwargs={'k': 5})

rag_chain = (
    {'context': retriever, 'question': RunnablePassthrough()}
    | ChatPromptTemplate.from_template('Context: {context}\n\nQuestion: {question}\n\nAnswer:')
    | ChatOpenAI(model='gpt-4o')
    | StrOutputParser()
)

# LangSmith traces EVERY step:
# 1. Retriever: query embedding + vector search + returned documents (with scores)
# 2. Prompt: formatted template with context injected
# 3. LLM: full prompt, response, tokens, latency, cost
# 4. Parser: final string output
answer = rag_chain.invoke('What is the capital of France?')

إضافة البيانات الوصفية إلى التتبعات

تحتوي تتبعات LangSmith افتراضيًا على مدخلات ومخرجات كل خطوة. ويمكنكم إثراء التتبعات باستخدام وسوم البيانات الوصفية المخصصة: معرّف المستخدم، ومعرّف الجلسة، وقيم feature flag، ومتغير اختبار A/B، أو أي سياق آخر يساعدكم على تصفية التتبعات وتحليلها في واجهة المستخدم. استخدموا RunnableConfig لتمرير البيانات الوصفية التي ستظهر في كل تتبع ناتج عن ذلك الطلب.

from langchain_core.runnables import RunnableConfig

def handle_user_request(user_id: str, query: str, ab_variant: str):
    config = RunnableConfig(
        tags=['production', ab_variant],
        metadata={
            'user_id': user_id,
            'ab_variant': ab_variant,
            'feature': 'rag_qa'
        }
    )
    
    result = rag_chain.invoke(query, config=config)
    return result

# In LangSmith UI you can now:
# - Filter traces by user_id to debug a specific user's issue
# - Compare latency between ab_variant='A' and ab_variant='B'
# - See all traces tagged 'production' vs 'staging'

إنشاء المقاطع يدويًا

بالنسبة إلى التعليمات البرمجية التي لا تمر عبر LangChain (مثل استدعاءات API المخصصة، واستعلامات قواعد البيانات، وخطوات المعالجة المسبقة)، يمكنكم إنشاء مقاطع يدوية باستخدام عميل LangSmith مباشرةً. ويضمن ذلك التقاط خطواتكم غير التابعة لـ LangChain في التتبع نفسه الذي يضم خطوات LangChain، مما يمنحكم صورة كاملة لمسار تنفيذ كل طلب.

from langsmith import Client, traceable

client = Client()

# Decorate functions to auto-trace them
@traceable(name='preprocess_query')
def preprocess_query(raw_query: str) -> str:
    # This step is now traced even though it doesn't use LangChain
    cleaned = raw_query.strip().lower()
    cleaned = ' '.join(cleaned.split())  # normalize whitespace
    return cleaned

@traceable(name='fetch_user_history')
def fetch_user_history(user_id: str) -> list[str]:
    # Database call - also traced
    return db.query('SELECT message FROM chat_history WHERE user_id = ? ORDER BY timestamp DESC LIMIT 5', user_id)

# All three steps appear in the same trace
def handle_request(user_id: str, raw_query: str):
    query = preprocess_query(raw_query)         # traced
    history = fetch_user_history(user_id)       # traced
    result = rag_chain.invoke({'query': query, 'history': history})  # traced by LangChain
    return result

تقييم التتبعات في LangSmith

يتضمن LangSmith إطارًا للتقييم يتيح لكم تشغيل المُقيّمين على مجموعة بيانات التتبع. ويمكنكم اختيار مجموعة من الأمثلة المتتبعة، وتشغيل مُقيّمين آليين (بما في ذلك أدوات تقييم LLM بوصفه حَكَمًا للصحة ومدى الصلة)، ومقارنة النتائج عبر إصدارات مختلفة من المسار. ويحوّل ذلك تتبعات الإنتاج إلى حلقة تغذية راجعة لتحسين تطبيقكم.

from langsmith.evaluation import evaluate, LangChainStringEvaluator

# Create an evaluator that uses an LLM to judge correctness
correctness_evaluator = LangChainStringEvaluator(
    'qa',
    config={'llm': ChatOpenAI(model='gpt-4o')}
)

# Run evaluation against a dataset of traced examples
results = evaluate(
    rag_chain,
    data='my-rag-test-set',      # name of dataset in LangSmith
    evaluators=[correctness_evaluator],
    experiment_prefix='rag-v2-chunking-test'
)

print('Evaluation results:')
print(f'Correctness: {results.results["correctness"].mean():.2f}')
print(f'Average latency: {results.results["latency"].mean():.2f}s')

إنشاء مجموعات بيانات الاختبار من التتبعات

من أقوى ميزات LangSmith إمكانية إنشاء مجموعات بيانات اختبار مباشرةً من تتبعات الإنتاج. فعندما تلاحظون تتبعًا مثيرًا للاهتمام (فشلًا أو حالة حدية أو مثالًا ممتازًا)، يمكنكم إضافته إلى مجموعة بيانات بنقرة واحدة. ومع مرور الوقت، تنشئون مجموعة اختبارات شاملة للانحدار من استعلامات مستخدمين حقيقية بدلًا من أمثلة اصطناعية.

from langsmith import Client

client = Client()

# Create a dataset from existing traces
dataset = client.create_dataset('rag-regression-tests')

# Add examples from production traces (by trace ID)
for trace_id in failed_trace_ids:
    run = client.read_run(trace_id)
    client.create_example(
        inputs=run.inputs,
        outputs={'answer': run.outputs.get('output', '')},
        dataset_id=dataset.id,
        metadata={'source': 'production_failure', 'date': run.start_time.isoformat()}
    )

print(f'Added {len(failed_trace_ids)} examples to regression test dataset')

تصفية التتبعات والبحث فيها

سيكون لديكم في بيئة الإنتاج آلاف التتبعات. وتدعم واجهة LangSmith وAPI الخاص بها التصفية والبحث المتقدمين: اعثروا على التتبعات التي يتجاوز فيها زمن الاستجابة حدًا معينًا، أو التي تحتوي على نوع خطأ محدد، أو الصادرة عن مستخدم معين، أو التي تتضمن كلمة مفتاحية محددة في المخرج، أو التي يتجاوز فيها عدد رموز الإكمال حدًا معينًا. وهذا يجعل التحقيق في فئات محددة من حالات الفشل أو مراقبة سلوك مستخدمين محددين أمرًا عمليًا.

from langsmith import Client

client = Client()

# Find slow traces (useful for performance investigation)
slow_runs = client.list_runs(
    project_name='my-rag-app',
    filter='gt(latency, 5)',  # latency > 5 seconds
    limit=20
)

# Find error traces
error_runs = client.list_runs(
    project_name='my-rag-app',
    filter='eq(error, true)',
    limit=50
)

# Find traces from a specific user
user_runs = client.list_runs(
    project_name='my-rag-app',
    filter='has(metadata, user_id="user_abc123")',
    limit=100
)

for run in slow_runs:
    print(f'Slow run: {run.id}, latency: {run.end_time - run.start_time}')

مقارنة التجارب في LangSmith

يدعم LangSmith مقارنة التجارب: شغّلوا مجموعة بيانات الاختبار نفسها عبر إصدارين من مساركم (مثلًا، حجم مقطع 500 مقابل حجم مقطع 1000)، ثم قارنوا بينهما جنبًا إلى جنب من حيث مقاييس زمن الاستجابة والتكلفة والجودة. ويسهّل ذلك التحقق من أن تغييرًا في المسار يمثل تحسينًا وليس تراجعًا قبل نشره في بيئة الإنتاج.

from langsmith.evaluation import evaluate

test_dataset = 'my-rag-eval-set'

# Run experiment A: chunk size 500
results_a = evaluate(
    rag_pipeline_v1,
    data=test_dataset,
    evaluators=[correctness_evaluator, relevance_evaluator],
    experiment_prefix='chunk-500'
)

# Run experiment B: chunk size 1000
results_b = evaluate(
    rag_pipeline_v2,
    data=test_dataset,
    evaluators=[correctness_evaluator, relevance_evaluator],
    experiment_prefix='chunk-1000'
)

# Compare in LangSmith UI: Experiments tab shows A vs B side by side
# Or compare programmatically:
print(f'Correctness - v1: {results_a.results["correctness"].mean():.2f}, v2: {results_b.results["correctness"].mean():.2f}')

LangSmith في بيئة الإنتاج

يتوفر LangSmith بوصفه خدمة SaaS مستضافة على smith.langchain.com، كما يتوفر خيار للاستضافة الذاتية. وفي بيئة الإنتاج، يمكن جعل التتبع غير متزامن (غير حاجب) لتجنب إضافة زمن استجابة إلى المسار الحرج. ويمكنكم أيضًا أخذ عينات من التتبعات (مثلًا، تتبع 10% فقط من الطلبات في بيئة إنتاج ذات حركة مرور عالية) للتحكم في التكلفة مع الحفاظ على الرؤية. وتعرض لوحة المعلومات مخططات آنية لحجم الطلبات وزمن الاستجابة والتكلفة ومعدل الأخطاء.

import os

# Production configuration
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_ENDPOINT'] = 'https://api.smith.langchain.com'
os.environ['LANGCHAIN_PROJECT'] = 'production'

# Enable async tracing (non-blocking - does not add latency to requests)
os.environ['LANGCHAIN_CALLBACKS_BACKGROUND'] = 'true'

# Optional: sample 10% of traces to reduce cost in high-traffic scenarios
import random

def should_trace() -> bool:
    return random.random() < 0.10  # 10% sampling rate

def handle_request(query):
    config = RunnableConfig()
    if not should_trace():
        config = RunnableConfig(callbacks=[])  # disable tracing for this request
    return rag_chain.invoke(query, config=config)

LangSmith مقابل التسجيل المخصص

يمكنكم بناء نظامكم الخاص لتسجيل التتبّع، وقد يكون ذلك الخيار المناسب لبعض حالات الاستخدام. تتمثل مزايا LangSmith مقارنةً بالتسجيل المخصص في: التكامل مع LangChain دون كتابة أي كود، وواجهة مستخدم مصممة خصيصًا لاستكشاف عمليات تتبّع LLM (بدلًا من لوحات معلومات Kibana/Grafana العامة)، والدعم الأصلي للتقييم ومقارنة التجارب، والتتبّع التلقائي لعدد الرموز المميّزة والتكلفة. أما المقابل فهو الاعتماد على المورّد والتكلفة عند التوسع.

فحص سريع

اختبروا مدى فهمكم لتتبّع LangSmith من خلال هذا الدرس.

مراجعة الدرس

تعلّمتم في هذا الدرس أن LangSmith يتيح التتبّع التلقائي الشامل لتطبيقات LangChain من خلال ضبط ثلاثة متغيرات بيئية دون إجراء أي تغييرات على الكود، وأن المزيّن @traceable يوسّع التتبّع ليشمل الخطوات التي لا تستخدم LangChain، مثل استدعاءات قاعدة البيانات والمعالجة المسبقة، وأن مقارنة التجارب تتيح لكم التحقق من تحسينات خط الأنابيب باستخدام مجموعة بيانات اختبار قبل النشر. بعد ذلك، سنستكشف Langfuse كبديل للرصد لا يعتمد على نموذج معيّن.

الأسئلة الشائعة

هل درس «التتبع باستخدام LangSmith» مجاني؟

نعم — نص درس «التتبع باستخدام LangSmith» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ماذا ستتعلم في «التتبع باستخدام LangSmith»؟

أضيفوا التتبع عبر LangSmith إلى تطبيق LangChain لتسجيل كل خطوة من خطوات السلسلة، وكل استدعاء لـ LLM، وعدد الرموز، وزمن الاستجابة في مستكشف تتبع قابل للبحث. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟

لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «التتبع باستخدام LangSmith»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟

نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا يصعب تصحيح تطبيقات LLM
  2. التتبع باستخدام LangSmith
  3. Langfuse للرصد المستقل عن النموذج
  4. التنبيه بشأن تدهور زمن الاستجابة والتكلفة والجودة
← العودة إلى AI Engineering Academy