Ejen AI · Pelajaran

Analisis Jejak dengan LangSmith dan Langfuse

Membaca jejak: mengenal pasti alat yang perlahan, keputusan yang salah dan corak ralat.

Pelajaran 1 daripada 413 langkah

Analisis Jejak dengan LangSmith dan Langfuse ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ejen AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Mengapakah Anda Perlu Menjejak Agen Anda

Agen membuat berbilang panggilan LLM dan panggilan alat bagi setiap pelaksanaan. Tanpa penjejakan, penyahpepijatan hanya bergantung pada tekaan. Penjejakan merekodkan setiap langkah: data masukan, data keluaran, penggunaan token, kependaman dan ralat — lalu memberikan gambaran lengkap tentang setiap pelaksanaan.

Persediaan LangSmith

LangSmith ialah platform penjejakan Anthropic untuk LangChain. Dayakannya dengan menetapkan dua pemboleh ubah persekitaran. Setiap panggilan LangChain dijejak secara automatik dan kelihatan dalam antara muka 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

Menambahkan Metamaktlumat Pelaksanaan

Tambahkan teg dan metamaktlumat pada jejak supaya anda boleh menapis dan mencari dalam antara muka LangSmith. Ini berguna untuk menjejak versi agen yang berbeza, ID pengguna atau label eksperimen.

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)

Melihat Jejak dalam Antara Muka LangSmith

Dalam papan pemuka LangSmith, anda boleh melihat setiap pelaksanaan bersama pepohon jejak penuhnya. Setiap nod memaparkan: data masukan, data keluaran, bilangan token, kependaman dan sebarang ralat. Anda boleh membandingkan pelaksanaan serta menapis mengikut teg atau projek.

  • Tapis mengikut status ralat untuk mencari pelaksanaan yang gagal
  • Isih mengikut kependaman untuk mengenal pasti langkah yang perlahan
  • Bandingkan dua pelaksanaan sebelah menyebelah untuk menyahpepijat kemerosotan
# 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 untuk Penjejakan Tersuai

Langfuse ialah alternatif sumber terbuka kepada LangSmith. Ia berfungsi dengan mana-mana rangka kerja LLM atau kod tersuai. Gunakan SDK Langfuse untuk mencipta jejak dan span secara manual.

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}')

Menjejak Panggilan LLM dalam Langfuse

Cipta span generation bagi setiap panggilan LLM. Span ini menangkap model yang digunakan, arahan, penyelesaian dan bilangan token — iaitu data paling penting untuk analisis kos.

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)

Menapis Pelaksanaan Mengikut Ralat dan Kependaman

Gunakan klien LangSmith untuk mencari pelaksanaan bermasalah secara terprogram. Tapis mengikut status ralat, ambang kependaman atau teg tertentu supaya usaha penyahpepijatan anda lebih tertumpu.

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)')

Membandingkan Pelaksanaan

LangSmith membolehkan anda membandingkan dua pelaksanaan dalam antara mukanya untuk melihat perkara yang berubah. Secara terprogram, anda boleh membandingkan data keluaran pelaksanaan, penggunaan token dan kependaman untuk mengesan kemerosotan selepas perubahan model atau arahan.

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')

Menambahkan Skor dan Maklum Balas

Selepas menilai pelaksanaan agen secara manual atau automatik, tambahkan skor atau maklum balas pada jejak. Ini menghasilkan set data untuk penalaan halus atau penilaian perubahan arahan.

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")')

Konteks Jejak Berstruktur

Tambahkan konteks yang bermakna pada jejak: ID sesi, ID pengguna, versi agen dan bendera ciri. Dengan ini, anda boleh mengasingkan jejak dengan mudah serta membandingkan prestasi merentas tetapan yang berbeza.

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)

Menyediakan Amaran

Pantau kesihatan agen anda dengan menyediakan amaran dalam LangSmith atau Langfuse. Berikan amaran apabila kadar ralat melebihi ambang, apabila kependaman P99 melonjak atau apabila langkah tertentu gagal secara berterusan.

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')

Semakan Pengetahuan: Penjejakan

Uji pemahaman anda tentang penjejakan agen dengan LangSmith dan Langfuse.

Ringkasan Penjejakan

LangSmith dan Langfuse ialah alat yang saling melengkapi: LangSmith bersepadu rapat dengan LangChain dan memerlukan persediaan minimum, manakala Langfuse berfungsi dengan mana-mana rangka kerja dan memberikan anda lebih banyak kawalan. Kedua-duanya merekodkan data masukan, data keluaran, penggunaan token, kependaman dan ralat bagi setiap langkah agen. Gunakan penapisan, pemarkahan dan amaran untuk mengekalkan kualiti agen dalam persekitaran pengeluaran.

Percuma untuk bermula

Pelajari Ejen AI dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
60
Pelajaran
239

Soalan Lazim

Adakah pelajaran “Analisis Jejak dengan LangSmith dan Langfuse” percuma?

Ya — teks penuh “Analisis Jejak dengan LangSmith dan Langfuse” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Ejen AI, tingkat taraf kepada CoddyKit PRO. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Analisis Jejak dengan LangSmith dan Langfuse”?

Membaca jejak: mengenal pasti alat yang perlahan, keputusan yang salah dan corak ralat. Anda berlatih Ejen AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Ejen AI?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Ejen AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Analisis Jejak dengan LangSmith dan Langfuse” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ejen AI ini?

Ya. Setiap pelajaran Ejen AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Analisis Jejak dengan LangSmith dan Langfuse
  2. Pemprofilan Token dan Kos bagi Setiap Langkah
  3. Mengenal Pasti Langkah yang Perlahan dan Mahal
  4. Analisis Punca Asas bagi Kegagalan Ejen
← Kembali ke Ejen AI