AI Engineering Academy · درس

Langfuse للرصد المستقل عن النموذج

ادمجوا Langfuse بوصفه بديلًا مفتوح المصدر يعمل مع أي مزود LLM، والتقطوا الامتدادات المخصصة للاسترجاع واستدعاءات الأدوات، وأعدّوا لوحات لتتبع التكاليف.

الدرس 3 من 413 خطوة

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

Langfuse: رصد LLM مفتوح المصدر

إن Langfuse منصة رصد مفتوحة المصدر لتطبيقات LLM، وتعمل مع أي مزوّد نماذج: OpenAI أو Anthropic أو Mistral أو النماذج المحلية عبر Ollama أو نموذجكم الخاص الذي ضبطتموه تدريبياً. وعلى خلاف LangSmith الذي يربطكم بـ LangChain، يتكامل Langfuse مع أي كود Python من خلال SDK بسيط. يمكنكم استضافة Langfuse ذاتيًا مجانًا، أو استخدام السحابة المُدارة على cloud.langfuse.com.

# pip install langfuse
from langfuse import Langfuse

langfuse = Langfuse(
    public_key='pk-lf-...',
    secret_key='sk-lf-...',
    host='https://cloud.langfuse.com'  # or your self-hosted URL
)

print('Langfuse connected:', langfuse.auth_check())

عمليات التتبّع والمقاطع وعمليات التوليد

يستخدم Langfuse نموذج بيانات هرميًا من ثلاثة مستويات. تمثّل عملية التتبّع طلبًا واحدًا من المستخدم من بدايته إلى نهايته. وضمن عملية التتبّع، تمثّل المقاطع خطوات المعالجة الفردية، مثل الاسترجاع والمعالجة المسبقة واستدعاءات الأدوات. أما عمليات التوليد فهي نوع خاص من المقاطع مخصص لاستدعاءات LLM؛ إذ تلتقط النموذج ورموز المطالبة ورموز الإكمال والتكلفة بطريقة منظمة تتيح إنشاء لوحات معلومات للتكلفة ومقاييس للجودة.

from langfuse import Langfuse

langfuse = Langfuse()

# Create a trace for one user request
trace = langfuse.trace(
    name='rag-query',
    user_id='user_123',
    session_id='session_abc',
    tags=['production', 'rag']
)

# Add a retrieval span
retrieval_span = trace.span(
    name='vector-retrieval',
    input={'query': 'What is RAG?'}
)
chunks = vector_db.search('What is RAG?')
retrieval_span.end(output={'chunks': [c['text'][:100] for c in chunks]})

# Add an LLM generation
generation = trace.generation(
    name='answer-generation',
    model='gpt-4o',
    model_parameters={'temperature': 0.0},
    input=[{'role': 'user', 'content': 'Context: ...\nQuestion: What is RAG?'}]
)
response = openai_client.chat.completions.create(model='gpt-4o', messages=[...])
generation.end(
    output=response.choices[0].message.content,
    usage={'input': response.usage.prompt_tokens, 'output': response.usage.completion_tokens}
)

نمط التكامل باستخدام المزيّنات

يوفّر Langfuse مزيّنات للدوال تُغلّف دوالكم تلقائيًا بمقاطع تتبّع. يلتقط المزيّن @observe() المدخلات والمخرجات، والتوقيت، وأي استثناءات. وهذه أنظف طريقة لإضافة أدوات الرصد إلى كود موجود من دون إعادة هيكلته.

from langfuse.decorators import observe, langfuse_context

# @observe wraps the function as a span automatically
@observe()
def retrieve_chunks(query: str) -> list[dict]:
    return vector_db.search(query, top_k=5)

@observe()
def generate_answer(query: str, context: str) -> str:
    response = openai_client.chat.completions.create(
        model='gpt-4o',
        messages=[
            {'role': 'system', 'content': 'Answer using the context.'},
            {'role': 'user', 'content': f'Context: {context}\nQuestion: {query}'}
        ]
    )
    # Attach LLM usage data to the current span
    langfuse_context.update_current_observation(
        usage={'input': response.usage.prompt_tokens, 'output': response.usage.completion_tokens},
        model='gpt-4o'
    )
    return response.choices[0].message.content

@observe(name='rag-pipeline')  # top-level trace
def rag_pipeline(query: str) -> str:
    chunks = retrieve_chunks(query)  # becomes a nested span
    context = '\n'.join([c['text'] for c in chunks])
    return generate_answer(query, context)  # becomes another nested span

التكامل مع أي مزوّد LLM

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

from langfuse.decorators import observe, langfuse_context
import anthropic
from openai import OpenAI

anthropic_client = anthropic.Anthropic()
openai_client = OpenAI()

@observe()
def call_claude(prompt: str) -> str:
    response = anthropic_client.messages.create(
        model='claude-3-5-sonnet-20241022',
        max_tokens=1024,
        messages=[{'role': 'user', 'content': prompt}]
    )
    langfuse_context.update_current_observation(
        model='claude-3-5-sonnet-20241022',
        usage={'input': response.usage.input_tokens, 'output': response.usage.output_tokens}
    )
    return response.content[0].text

@observe()
def call_gpt4(prompt: str) -> str:
    response = openai_client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}]
    )
    langfuse_context.update_current_observation(model='gpt-4o',
        usage={'input': response.usage.prompt_tokens, 'output': response.usage.completion_tokens})
    return response.choices[0].message.content

لوحات معلومات تتبّع التكلفة

يحسب Langfuse التكلفة تلقائيًا من اسم النموذج وعدد الرموز المميّزة، باستخدام جدول أسعار مضمّن يغطي OpenAI وAnthropic وMistral وعشرات المزوّدين الآخرين. تعرض لوحة معلومات التكلفة: إجمالي الإنفاق حسب الفترة الزمنية، والتكلفة موزعة حسب النموذج، والتكلفة موزعة حسب الميزة أو المستخدم (باستخدام الوسوم والبيانات الوصفية)، واتجاهات الإنفاق اليومية والأسبوعية. تمنعكم هذه الرؤية من التعرّض لصدمة الفاتورة وتساعدكم على تحديد الطلبات الشاذة مرتفعة التكلفة.

# Cost data is automatically computed - no manual config
# Langfuse knows: gpt-4o input = $0.005/1K tokens, output = $0.015/1K tokens

# Add metadata to enable cost breakdown by feature
@observe(name='rag-query')
def handle_rag_query(query: str, feature: str, user_id: str) -> str:
    langfuse_context.update_current_trace(
        user_id=user_id,
        tags=[feature, 'rag'],
        metadata={'feature': feature, 'query_length': len(query)}
    )
    return rag_pipeline(query)

# In Langfuse dashboard you can now filter costs by:
# - feature: 'document_qa', 'chat', 'summarization'
# - user_id: to see which users are your most expensive
# - model: to compare gpt-4o vs gpt-4o-mini costs
# - date range: to see daily/weekly/monthly trends

إضافة تقييمات ملاحظات المستخدمين

يتيح لكم Langfuse إرفاق ملاحظات المستخدمين بعمليات التتبّع بعد حدوثها. فعندما ينقر المستخدم على إشارة الإعجاب أو عدم الإعجاب في ردّ ما، يمكنكم تسجيل ذلك كتقييم في عملية التتبّع المقابلة. يربط هذا إشارات رضا المستخدمين الفعلية بسياق التتبّع الكامل، مما يتيح لكم تحليل أسباب اختلاف الردود ذات التقييمات المرتفعة عن الردود ذات التقييمات المنخفضة.

from langfuse.decorators import observe, langfuse_context

@observe()
def generate_response(query: str) -> dict:
    answer = rag_pipeline(query)
    # Get the current trace ID to link feedback later
    trace_id = langfuse_context.get_current_trace_id()
    return {'answer': answer, 'trace_id': trace_id}

# Later, when user submits feedback:
def record_user_feedback(trace_id: str, score: int, comment: str):
    langfuse.score(
        trace_id=trace_id,
        name='user_satisfaction',  # score name
        value=score,               # 1 (thumbs up) or 0 (thumbs down)
        comment=comment,
        data_type='BOOLEAN'
    )

# Now in Langfuse: filter traces where user_satisfaction = 0
# to find the exact prompts and contexts that users rated negatively

التقييمات التلقائية باستخدام LLM كمحكّم

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

from langfuse import Langfuse

langfuse = Langfuse()

def auto_score_traces():
    # Get recent unscored traces
    traces = langfuse.fetch_traces(tags=['production'], limit=50)
    
    for trace in traces.data:
        question = trace.input.get('query', '')
        answer = trace.output.get('answer', '') if trace.output else ''
        
        if not question or not answer:
            continue
        
        # LLM-as-judge scoring
        score = evaluate_relevance(question, answer)  # returns 0.0-1.0
        
        langfuse.score(
            trace_id=trace.id,
            name='auto_relevance',
            value=score,
            data_type='NUMERIC',
            comment='Automated relevance score from LLM judge'
        )

# Run this as a scheduled job every hour

إدارة المطالبات في Langfuse

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

from langfuse import Langfuse

langfuse = Langfuse()

# Fetch the current production prompt by name
# The prompt lives in Langfuse UI, not in your code
prompt = langfuse.get_prompt('rag-system-prompt', version='production')

# Use it in your pipeline
messages = [
    {'role': 'system', 'content': prompt.compile(context_limit=4000)},
    {'role': 'user', 'content': query}
]

response = openai_client.chat.completions.create(model='gpt-4o', messages=messages)

# The trace is automatically linked to the prompt version
# In Langfuse you can filter: show me traces using prompt v3 vs v4
# and compare their quality scores

الاستضافة الذاتية لـ Langfuse

يمكن استضافة Langfuse ذاتيًا باستخدام أمر Docker Compose واحد، مع استخدام PostgreSQL للتخزين. تعني الاستضافة الذاتية أن بيانات التتبّع لا تغادر بنيتكم التحتية، وهو أمر ضروري للتطبيقات التي تتعامل مع معلومات التعريف الشخصية أو البيانات الطبية أو المحتوى المملوك. يوفّر الإصدار المستضاف ذاتيًا الميزات نفسها التي توفرها السحابة المُدارة، لكنه يتطلب منكم إدارة البنية التحتية، بما في ذلك النسخ الاحتياطية والتوسّع والترقيات.

# Self-host Langfuse with Docker Compose
# docker-compose.yml (simplified)
# version: '3'
# services:
#   langfuse:
#     image: langfuse/langfuse:2
#     ports:
#       - '3000:3000'
#     environment:
#       - DATABASE_URL=postgresql://langfuse:password@postgres/langfuse
#       - NEXTAUTH_SECRET=your-random-secret
#       - SALT=your-random-salt
#   postgres:
#     image: postgres:15
#     environment:
#       - POSTGRES_DB=langfuse
#       - POSTGRES_PASSWORD=password

# After docker-compose up, point your SDK to:
langfuse = Langfuse(
    public_key='pk-lf-your-key',
    secret_key='sk-lf-your-key',
    host='http://localhost:3000'  # your self-hosted instance
)

Langfuse مقابل LangSmith: متى تختارون كلًّا منهما

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

تكامل OpenTelemetry مع LLM

بالنسبة إلى الفرق التي تستخدم OpenTelemetry للتتبّع الموزّع، يدعم Langfuse استيعاب OTLP (بروتوكول OpenTelemetry). يمكنكم إرسال بيانات تتبّع LLM من مُصدّرات OTel الحالية مباشرةً إلى Langfuse دون تغيير أدوات الرصد لديكم. يتيح ذلك إنشاء حزمة رصد موحّدة تعيش فيها عمليات تتبّع LLM، ومقاطع استعلامات قاعدة البيانات، وعمليات تتبّع طلبات HTTP جميعًا في النظام نفسه، مع استخدام معرّفات ارتباط متسقة.

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import BatchSpanProcessor

# Configure OTel to send to Langfuse OTLP endpoint
exporter = OTLPSpanExporter(
    endpoint='https://cloud.langfuse.com/api/public/otel/v1/traces',
    headers={
        'Authorization': 'Basic ' + base64.b64encode(b'pk-lf-xxx:sk-lf-xxx').decode()
    }
)

provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)

# Now create spans as usual - they appear in Langfuse automatically
tracer = trace.get_tracer('my-llm-app')
with tracer.start_as_current_span('rag-query') as span:
    span.set_attribute('llm.model', 'gpt-4o')
    span.set_attribute('llm.prompt_tokens', 500)
    result = rag_pipeline(query)

فحص سريع

اختبروا مدى فهمكم لرصد Langfuse غير المرتبط بنموذج معيّن من خلال هذا الدرس.

مراجعة الدرس

تعلّمتم في هذا الدرس أن Langfuse يوفّر رصدًا مفتوح المصدر لـ LLM وغير مرتبط بنموذج معيّن، باستخدام نموذج بيانات هرمي يتكوّن من عمليات التتبّع والمقاطع وعمليات التوليد، وأن المزيّن @observe() يضيف أدوات الرصد إلى الكود الموجود بأقل قدر من التغييرات، وأن تتبّع التكلفة وتقييمات ملاحظات المستخدمين والتقييم التلقائي باستخدام LLM كمحكّم تجعل Langfuse منصة متكاملة لمراقبة الجودة. بعد ذلك، سنضبط التنبيهات المتعلقة بزمن الاستجابة والتكلفة وتدهور الجودة.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

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

هل درس «Langfuse للرصد المستقل عن النموذج» مجاني؟

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

ماذا ستتعلم في «Langfuse للرصد المستقل عن النموذج»؟

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

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

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

كم من الوقت يستغرق درس «Langfuse للرصد المستقل عن النموذج»؟

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

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

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

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

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