0Pricing
AI Agents · บทเรียน

การวิเคราะห์ร่องรอยด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การวิเคราะห์ร่องรอยด้วย LangSmith และ Langfuse
  2. การวิเคราะห์โทเคนและต้นทุนแยกตามขั้นตอน
  3. การระบุขั้นตอนที่ช้าและมีค่าใช้จ่ายสูง
  4. การวิเคราะห์สาเหตุรากของความล้มเหลวของเอเจนต์
← กลับไปที่ AI Agents