Analisis Jejak dengan LangSmith dan Langfuse
Membaca jejak: mengenal pasti alat yang perlahan, keputusan yang salah dan corak ralat.
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.comMenambahkan 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.
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
- Analisis Jejak dengan LangSmith dan Langfuse
- Pemprofilan Token dan Kos bagi Setiap Langkah
- Mengenal Pasti Langkah yang Perlahan dan Mahal
- Analisis Punca Asas bagi Kegagalan Ejen