تحليل التتبعات باستخدام LangSmith وLangfuse
قراءة التتبعات: تحديد الأدوات البطيئة، والقرارات الخاطئة، وأنماط الأخطاء.
تحليل التتبعات باستخدام LangSmith وLangfuse درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
لماذا تتتبّعون وكيلكم؟
تجري الوكلاء عدة استدعاءات لنموذج اللغة الكبير واستدعاءات للأدوات في كل تشغيل. ومن دون التتبّع، يصبح تصحيح الأخطاء مجرد تخمين. يسجّل التتبّع كل خطوة: المدخلات، والمخرجات، واستخدام الرموز، وزمن الاستجابة، والأخطاء، مما يمنحكم صورة كاملة عن كل تشغيل.
إعداد LangSmith
LangSmith هو نظام التتبّع من Anthropic والمخصّص لـ LangChain. فعّلوه من خلال ضبط متغيرَي بيئة. وسيُتتبَّع كل استدعاء لـ LangChain تلقائيًا ويظهر في واجهة مستخدم LangSmith.
import os
from dotenv import load_dotenv
load_dotenv()
# LangSmith tracing configuration
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = os.environ.get('LANGSMITH_API_KEY', 'ls__...')
os.environ['LANGCHAIN_PROJECT'] = 'my-agent-project'
# Now any LangChain code is automatically traced
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
llm = ChatOpenAI(model='gpt-4o-mini', api_key=os.environ.get('OPENAI_API_KEY', 'sk-...'))
# This call is traced automatically
response = llm.invoke([HumanMessage(content='What is 2+2?')])
print(response.content)
# Check trace at: https://smith.langchain.comإضافة البيانات الوصفية إلى التشغيل
أضيفوا الوسوم والبيانات الوصفية إلى آثار التتبّع لتتمكنوا من التصفية والبحث في واجهة مستخدم LangSmith. ويفيد ذلك في تتبّع إصدارات الوكيل المختلفة، أو معرّفات المستخدمين، أو تسميات التجارب.
import os
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langsmith import traceable
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'ls__your-key'
os.environ['LANGCHAIN_PROJECT'] = 'my-agent-project'
llm = ChatOpenAI(model='gpt-4o-mini', api_key='sk-...')
@traceable(name='my-agent-run', tags=['production', 'v2'], metadata={'user_id': '42'})
def run_agent(question: str) -> str:
response = llm.invoke(
[HumanMessage(content=question)],
config={
'run_name': f'agent-{question[:20]}',
'tags': ['production'],
'metadata': {'user_id': '42', 'version': 'v2.1'}
}
)
return response.content
result = run_agent('Explain LangChain tracing')
print(result)عرض آثار التتبّع في واجهة مستخدم LangSmith
في لوحة معلومات LangSmith، يمكنكم رؤية كل تشغيل مع شجرة التتبّع الكاملة الخاصة به. وتعرض كل عقدة: المدخلات، والمخرجات، وأعداد الرموز، وزمن الاستجابة، وأي أخطاء. ويمكنكم مقارنة التشغيلات والتصفية حسب الوسوم أو المشروع.
- صفّوا حسب حالة الخطأ للعثور على التشغيلات الفاشلة
- رتّبوا حسب زمن الاستجابة لتحديد الخطوات البطيئة
- قارنوا تشغيلين جنبًا إلى جنب لتصحيح حالات التراجع
# Programmatically query LangSmith for run data
from langsmith import Client
client = Client(api_key='ls__your-key')
# List recent runs for a project
runs = list(client.list_runs(
project_name='my-agent-project',
execution_order=1, # Top-level runs only
error=True, # Only failed runs
limit=10
))
for run in runs:
print(f'Run: {run.name}')
print(f' Status: {run.status}')
print(f' Latency: {run.end_time - run.start_time if run.end_time else "running"}')
print(f' Error: {run.error}')
print()Langfuse للتتبّع المخصّص
يُعد Langfuse بديلًا مفتوح المصدر لـ LangSmith. وهو يعمل مع أي إطار عمل لنماذج اللغة الكبيرة أو مع التعليمات البرمجية المخصّصة. استخدموا Langfuse SDK لإنشاء آثار التتبّع والامتدادات يدويًا.
from langfuse import Langfuse
lf = Langfuse(
public_key='pk-lf-...',
secret_key='sk-lf-...',
host='https://cloud.langfuse.com' # Or your self-hosted URL
)
# Create a trace
trace = lf.trace(
name='email-agent-run',
user_id='user-42',
metadata={'environment': 'production'}
)
# Create a span for entity extraction
span = trace.span(
name='entity-extraction',
input={'text': 'Meeting with Alice from Google tomorrow'}
)
# Simulate work
extracted = ['Alice', 'Google']
# End the span with output
span.end(output={'entities': extracted})
print('Trace created in Langfuse')
print(f'View at: https://cloud.langfuse.com/trace/{trace.id}')تتبّع استدعاءات نماذج اللغة الكبيرة في Langfuse
أنشئوا امتداد generation لكل استدعاء لنموذج اللغة الكبير. يلتقط ذلك النموذج المستخدم، والمطالبة، والإكمال، وأعداد الرموز، وهي أهم البيانات لتحليل التكلفة.
from langfuse import Langfuse
import openai
lf = Langfuse(public_key='pk-lf-...', secret_key='sk-lf-...')
client = openai.OpenAI(api_key='sk-...')
def traced_llm_call(trace, prompt: str, model: str = 'gpt-4o-mini') -> str:
generation = trace.generation(
name='llm-call',
model=model,
input=[{'role': 'user', 'content': prompt}]
)
response = client.chat.completions.create(
model=model,
messages=[{'role': 'user', 'content': prompt}]
)
content = response.choices[0].message.content
generation.end(
output=content,
usage={
'prompt_tokens': response.usage.prompt_tokens,
'completion_tokens': response.usage.completion_tokens,
'total_tokens': response.usage.total_tokens
}
)
return content
trace = lf.trace(name='test-trace')
result = traced_llm_call(trace, 'What is the capital of France?')
print('Result:', result)تصفية التشغيلات حسب الخطأ وزمن الاستجابة
استخدموا عميل LangSmith للعثور برمجيًا على التشغيلات التي تتضمن مشكلات. صفّوا حسب حالة الخطأ، أو حدّ زمن الاستجابة، أو وسوم محددة للتركيز على جهود تصحيح الأخطاء.
from langsmith import Client
from datetime import datetime, timedelta
client = Client(api_key='ls__your-key')
def find_slow_runs(project: str, latency_threshold_ms: int = 10000):
runs = list(client.list_runs(
project_name=project,
execution_order=1,
start_time=datetime.utcnow() - timedelta(hours=24)
))
slow_runs = []
for run in runs:
if run.end_time and run.start_time:
duration_ms = (run.end_time - run.start_time).total_seconds() * 1000
if duration_ms > latency_threshold_ms:
slow_runs.append({
'id': str(run.id),
'name': run.name,
'duration_ms': round(duration_ms),
'tags': run.tags
})
slow_runs.sort(key=lambda x: x['duration_ms'], reverse=True)
return slow_runs
print('Find slow runs function defined')
print('Usage: find_slow_runs("my-agent-project", latency_threshold_ms=5000)')مقارنة التشغيلات
يتيح لكم LangSmith مقارنة تشغيلين في واجهته لمعرفة ما الذي تغيّر. وبرمجيًا، يمكنكم مقارنة مخرجات التشغيلات، واستخدام الرموز، وزمن الاستجابة لاكتشاف حالات التراجع بعد إجراء تغييرات على النموذج أو المطالبة.
from langsmith import Client
client = Client(api_key='ls__your-key')
def compare_runs(run_id_1: str, run_id_2: str) -> dict:
run1 = client.read_run(run_id_1)
run2 = client.read_run(run_id_2)
def get_tokens(run):
if run.total_tokens:
return run.total_tokens
return 0
def get_latency_ms(run):
if run.end_time and run.start_time:
return (run.end_time - run.start_time).total_seconds() * 1000
return 0
return {
'run1': {'id': run_id_1, 'tokens': get_tokens(run1), 'latency_ms': get_latency_ms(run1), 'status': run1.status},
'run2': {'id': run_id_2, 'tokens': get_tokens(run2), 'latency_ms': get_latency_ms(run2), 'status': run2.status},
'token_delta': get_tokens(run2) - get_tokens(run1),
'latency_delta_ms': get_latency_ms(run2) - get_latency_ms(run1)
}
print('Run comparison function defined')إضافة التقييمات والملاحظات
بعد تقييم تشغيل وكيل، يدويًا أو تلقائيًا، أضيفوا تقييمًا أو ملاحظة إلى أثر التتبّع. ويؤدي ذلك إلى إنشاء مجموعة بيانات للضبط الدقيق أو لتقييم تغييرات المطالبات.
from langsmith import Client
client = Client(api_key='ls__your-key')
def score_run(run_id: str, score: float, reasoning: str = ''):
# score: 0.0 (bad) to 1.0 (perfect)
client.create_feedback(
run_id=run_id,
key='quality',
score=score,
comment=reasoning
)
def auto_evaluate_run(run_id: str, expected_output: str, actual_output: str) -> float:
# Simple heuristic: check if key terms from expected output are present
expected_terms = set(expected_output.lower().split())
actual_terms = set(actual_output.lower().split())
overlap = len(expected_terms & actual_terms) / max(len(expected_terms), 1)
score = min(1.0, overlap * 1.5) # Normalize
score_run(run_id, score, f'Term overlap: {overlap:.2f}')
return score
print('Scoring functions defined')
print('Example: score_run("run-id-abc", 0.85, "Good answer but missing one detail")')سياق التتبّع المنظّم
أرفقوا سياقًا ذا معنى بآثار التتبّع: معرّف الجلسة، ومعرّف المستخدم، وإصدار الوكيل، وأعلام الميزات. ويسهّل ذلك تقسيم آثار التتبّع ومقارنة الأداء بين الإعدادات المختلفة.
import os
from langsmith import traceable
from langchain_core.runnables import RunnableConfig
def build_trace_config(user_id: str, session_id: str, version: str) -> dict:
return {
'metadata': {
'user_id': user_id,
'session_id': session_id,
'agent_version': version,
'environment': os.environ.get('ENV', 'development')
},
'tags': [version, os.environ.get('ENV', 'development')],
'run_name': f'agent-{user_id[:8]}'
}
@traceable
def run_agent_with_context(question: str, user_id: str, session_id: str):
config = build_trace_config(user_id, session_id, 'v2.3')
# Pass config to any LangChain component
# llm.invoke([HumanMessage(content=question)], config=config)
print(f'Running agent for user {user_id}, session {session_id}')
return 'Answer here'
result = run_agent_with_context('Question', 'user-001', 'sess-xyz')
print(result)إعداد التنبيهات
راقبوا سلامة وكيلكم من خلال إعداد التنبيهات في LangSmith أو Langfuse. أطلقوا تنبيهًا عندما يتجاوز معدل الأخطاء حدًا معينًا، أو يرتفع زمن الاستجابة عند P99، أو تفشل خطوة محددة باستمرار.
from langsmith import Client
from datetime import datetime, timedelta
client = Client(api_key='ls__your-key')
def check_error_rate(project: str, window_minutes: int = 60, threshold: float = 0.05) -> dict:
runs = list(client.list_runs(
project_name=project,
execution_order=1,
start_time=datetime.utcnow() - timedelta(minutes=window_minutes)
))
if not runs:
return {'error_rate': 0.0, 'alert': False}
error_count = sum(1 for r in runs if r.status == 'error')
error_rate = error_count / len(runs)
if error_rate > threshold:
print(f'ALERT: Error rate {error_rate:.1%} exceeds threshold {threshold:.1%}')
# Send to Slack/PagerDuty here
return {
'total_runs': len(runs),
'error_count': error_count,
'error_rate': round(error_rate, 4),
'alert': error_rate > threshold
}
print('Error rate monitor defined')اختبار المعرفة: التتبّع
اختبروا فهمكم لتتبّع الوكلاء باستخدام LangSmith وLangfuse.
ملخص التتبّع
تُعد LangSmith وLangfuse أداتين متكاملتين: إذ يتكامل LangSmith بشكل وثيق مع LangChain ويتطلب إعدادًا بسيطًا، بينما يعمل Langfuse مع أي إطار عمل ويمنحكم تحكمًا أكبر. وتسجّل الأداتان المدخلات، والمخرجات، واستخدام الرموز، وزمن الاستجابة، والأخطاء لكل خطوة من خطوات الوكيل. استخدموا التصفية والتقييمات والتنبيهات للحفاظ على جودة الوكيل في بيئة الإنتاج.
الأسئلة الشائعة
هل درس «تحليل التتبعات باستخدام LangSmith وLangfuse» مجاني؟
نعم — نص درس «تحليل التتبعات باستخدام LangSmith وLangfuse» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «تحليل التتبعات باستخدام LangSmith وLangfuse»؟
قراءة التتبعات: تحديد الأدوات البطيئة، والقرارات الخاطئة، وأنماط الأخطاء. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تحليل التتبعات باستخدام LangSmith وLangfuse»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحليل التتبعات باستخدام LangSmith وLangfuse
- تحليل الرموز والتكلفة لكل خطوة
- تحديد الخطوات البطيئة والمكلفة
- تحليل السبب الجذري لإخفاقات الوكلاء