การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse
การอ่านร่องรอย: ระบุเครื่องมือที่ทำงานช้า การตัดสินใจที่ผิดพลาด และรูปแบบข้อผิดพลาด
การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงควรติดตามร่องรอยของเอเจนต์
เอเจนต์เรียกใช้ LLM และเครื่องมือหลายครั้งในการทำงานแต่ละครั้ง หากไม่มีการติดตามร่องรอย การแก้ไขข้อบกพร่องก็เป็นเพียงการคาดเดา การติดตามร่องรอย จะบันทึกทุก Step ได้แก่ input, output, การใช้โทเค็น เวลาแฝง และ error ต่าง ๆ ทำให้คุณเห็นภาพการทำงานแต่ละครั้งได้อย่างครบถ้วน
การตั้งค่า 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 ได้ ซึ่งมีประโยชน์สำหรับติดตามเวอร์ชันต่าง ๆ ของเอเจนต์ ID ผู้ใช้ หรือป้ายกำกับการทดลอง
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 คุณจะเห็นการทำงานทุกครั้งพร้อมแผนผังร่องรอยฉบับเต็ม แต่ละโหนดจะแสดง input, output, จำนวนโทเค็น เวลาแฝง และ error ที่เกิดขึ้น คุณสามารถเปรียบเทียบการทำงานและกรองตามแท็กหรือโครงการได้
- กรองตามสถานะ error เพื่อค้นหาการทำงานที่ล้มเหลว
- เรียงตามเวลาแฝงเพื่อระบุ Step ที่ทำงานช้า
- เปรียบเทียบการทำงานสองครั้งแบบเคียงข้างกันเพื่อแก้ไขการถดถอย
# 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 โดยทำงานร่วมกับเฟรมเวิร์ก LLM ใดก็ได้หรือโค้ดที่กำหนดเอง ใช้ SDK ของ Langfuse เพื่อสร้างร่องรอยและช่วงการทำงานด้วยตนเอง
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}')การติดตามการเรียกใช้ LLM ใน Langfuse
สร้างช่วง generation สำหรับการเรียกใช้ LLM แต่ละครั้ง วิธีนี้จะบันทึกโมเดลที่ใช้ พรอมต์ ผลลัพธ์ และจำนวนโทเค็น ซึ่งเป็นข้อมูลที่สำคัญที่สุดสำหรับการวิเคราะห์ต้นทุน
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)การกรองการทำงานตาม Error และเวลาแฝง
ใช้ไคลเอนต์ LangSmith เพื่อค้นหาการทำงานที่มีปัญหาด้วยโปรแกรม กรองตามสถานะ error เกณฑ์เวลาแฝง หรือแท็กเฉพาะ เพื่อมุ่งเน้นความพยายามในการแก้ไขข้อบกพร่อง
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 ช่วยให้คุณเปรียบเทียบการทำงานสองครั้งในส่วนติดต่อผู้ใช้เพื่อดูว่ามีอะไรเปลี่ยนแปลงไปบ้าง ในเชิงโปรแกรม คุณสามารถเปรียบเทียบ output ของการทำงาน การใช้โทเค็น และเวลาแฝง เพื่อตรวจจับการถดถอยหลังจากเปลี่ยนโมเดลหรือพรอมต์
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")')บริบทของร่องรอยแบบมีโครงสร้าง
แนบบริบทที่มีความหมายลงในร่องรอย ได้แก่ ID เซสชัน ID ผู้ใช้ เวอร์ชันเอเจนต์ และแฟล็กฟีเจอร์ วิธีนี้ทำให้แบ่งส่วนร่องรอยและเปรียบเทียบประสิทธิภาพระหว่างการกำหนดค่าต่าง ๆ ได้ง่าย
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 ให้แจ้งเตือนเมื่ออัตรา error เกินเกณฑ์ เมื่อเวลาแฝง P99 พุ่งสูงขึ้น หรือเมื่อ Step ใด Step หนึ่งล้มเหลวอย่างต่อเนื่อง
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 ทำงานร่วมกับเฟรมเวิร์กใดก็ได้และให้คุณควบคุมได้มากกว่า ทั้งสองเครื่องมือบันทึก input, output, การใช้โทเค็น เวลาแฝง และ error ของทุก Step ในเอเจนต์ ใช้การกรอง การให้คะแนน และการแจ้งเตือนเพื่อรักษาคุณภาพของเอเจนต์ในระบบจริง
คำถามที่พบบ่อย
บทเรียน “การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse”
การอ่านร่องรอย: ระบุเครื่องมือที่ทำงานช้า การตัดสินใจที่ผิดพลาด และรูปแบบข้อผิดพลาด คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse
- การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน
- การระบุขั้นตอนที่ช้าและมีค่าใช้จ่ายสูง
- การวิเคราะห์สาเหตุรากของความล้มเหลวของเอเจนต์