0Pricing
AI Engineering Academy · บทเรียน

การติดตามด้วย LangSmith

เพิ่มการติดตามด้วย LangSmith ให้แอปพลิเคชัน LangChain เพื่อบันทึกทุกขั้นตอนของสายงาน การเรียกใช้ LLM จำนวนโทเค็น และเวลาแฝงในเครื่องมือสำรวจร่องรอยที่ค้นหาได้

การติดตามด้วย LangSmith เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

LangSmith คืออะไร

LangSmith คือแพลตฟอร์มการสังเกตการณ์ที่สร้างขึ้นโดยเฉพาะสำหรับแอปพลิเคชัน LLM ระบบจะบันทึกร่องรอยของการทำงานของ LangChain ทุกครั้งโดยอัตโนมัติ ไม่ว่าจะเป็นขั้นตอนของห่วงโซ่ การเรียกใช้ LLM การทำงานของเครื่องมือ การดึงข้อมูล และตัวแยกวิเคราะห์ผลลัพธ์ แล้วแสดงทั้งหมดในเครื่องมือสำรวจร่องรอยแบบลำดับชั้นที่ค้นหาได้ คุณสามารถกรองร่องรอยตามเวลาแฝง ค่าใช้จ่าย สถานะข้อผิดพลาด หรือข้อมูลเมตาที่กำหนดเอง และเรียกใช้ร่องรอยใด ๆ ซ้ำเพื่อแก้ไขข้อบกพร่อง

# Install: pip install langsmith
import os

# Set environment variables to enable automatic tracing
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'lsv2_...your_key_here...'
os.environ['LANGCHAIN_PROJECT'] = 'my-rag-app'  # project name in LangSmith UI

# That's all - LangChain now sends traces to LangSmith automatically
# No code changes needed to your chain or agent

การติดตามร่องรอยอัตโนมัติโดยไม่ต้องแก้ไขโค้ด

คุณสมบัติที่โดดเด่นที่สุดของ LangSmith คือ เมื่อคุณตั้งค่าตัวแปรสภาพแวดล้อมสามรายการแล้ว การทำงานของ LangChain ทุกอย่างจะถูกติดตามร่องรอยโดยอัตโนมัติ โดยไม่ต้องเขียนโค้ดเพิ่มเติม ห่วงโซ่ LCEL ทุกห่วงโซ่ การเรียกใช้ ChatOpenAI ทุกครั้ง การเรียกใช้ตัวดึงข้อมูลทุกครั้ง และการทำงานของเครื่องมือทุกครั้งจะถูกเก็บพร้อมข้อมูลนำเข้า ผลลัพธ์ เวลา และจำนวนโทเค็น คุณสามารถนำการติดตามร่องรอยของ LangSmith ไปใช้งานจริงได้ด้วยการเปลี่ยนค่าตัวแปรสภาพแวดล้อมเพียงรายการเดียว

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# This chain is automatically traced - no extra code needed
llm = ChatOpenAI(model='gpt-4o')
prompt = ChatPromptTemplate.from_template('Answer this question: {question}')
chain = prompt | llm | StrOutputParser()

# This call creates a trace in LangSmith showing:
# - The formatted prompt (with question substituted)
# - The LLM call with model, temperature, token counts
# - The parsed output
# - End-to-end latency and cost
result = chain.invoke({'question': 'What is RAG?'})
print(result)

การติดตามร่องรอยกระบวนการ RAG

สำหรับแอปพลิเคชัน RAG ร่องรอยของ LangSmith มีประโยชน์เป็นพิเศษ เพราะเก็บกระบวนการดึงข้อมูลแล้วสร้างผลลัพธ์ทั้งหมดไว้ คุณสามารถดูได้ว่า ดึงเอกสารใดมา คะแนนความคล้ายคลึงเป็นเท่าใด จัดรูปแบบบริบทในพรอมต์อย่างไร และ LLM สร้างผลลัพธ์อะไร วิธีนี้ทำให้เห็นได้ทันทีว่าคำตอบผิดเกิดจากการดึงข้อมูลที่ไม่ดีหรือการสร้างผลลัพธ์ที่ไม่มีคุณภาพ

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_core.runnables import RunnablePassthrough

embeddings = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embeddings)
retriever = vectorstore.as_retriever(search_kwargs={'k': 5})

rag_chain = (
    {'context': retriever, 'question': RunnablePassthrough()}
    | ChatPromptTemplate.from_template('Context: {context}\n\nQuestion: {question}\n\nAnswer:')
    | ChatOpenAI(model='gpt-4o')
    | StrOutputParser()
)

# LangSmith traces EVERY step:
# 1. Retriever: query embedding + vector search + returned documents (with scores)
# 2. Prompt: formatted template with context injected
# 3. LLM: full prompt, response, tokens, latency, cost
# 4. Parser: final string output
answer = rag_chain.invoke('What is the capital of France?')

การเพิ่มข้อมูลเมตาให้ร่องรอย

โดยค่าเริ่มต้น ร่องรอยของ LangSmith จะมีข้อมูลนำเข้าและผลลัพธ์ของแต่ละขั้นตอน คุณสามารถเพิ่มข้อมูลให้ร่องรอยด้วย แท็กข้อมูลเมตาที่กำหนดเอง เช่น รหัสผู้ใช้ รหัสเซสชัน ค่าของแฟล็กคุณสมบัติ รูปแบบการทดสอบ A/B หรือบริบทอื่นใดที่ช่วยให้คุณกรองและวิเคราะห์ร่องรอยในส่วนติดต่อผู้ใช้ได้ ใช้ RunnableConfig เพื่อส่งข้อมูลเมตาที่จะปรากฏในร่องรอยทุกอันจากคำขอนั้น

from langchain_core.runnables import RunnableConfig

def handle_user_request(user_id: str, query: str, ab_variant: str):
    config = RunnableConfig(
        tags=['production', ab_variant],
        metadata={
            'user_id': user_id,
            'ab_variant': ab_variant,
            'feature': 'rag_qa'
        }
    )
    
    result = rag_chain.invoke(query, config=config)
    return result

# In LangSmith UI you can now:
# - Filter traces by user_id to debug a specific user's issue
# - Compare latency between ab_variant='A' and ab_variant='B'
# - See all traces tagged 'production' vs 'staging'

การสร้างช่วงร่องรอยด้วยตนเอง

สำหรับโค้ดที่ไม่ได้ทำงานผ่าน LangChain เช่น การเรียก API แบบกำหนดเอง การค้นหาฐานข้อมูล และขั้นตอนก่อนการประมวลผล คุณสามารถสร้าง ช่วงร่องรอยด้วยตนเอง โดยใช้ไคลเอ็นต์ LangSmith โดยตรง วิธีนี้ช่วยให้เก็บขั้นตอนที่ไม่ใช่ LangChain ไว้ในร่องรอยเดียวกับขั้นตอนของ LangChain ทำให้เห็นเส้นทางการทำงานทั้งหมดของคำขอแต่ละรายการ

from langsmith import Client, traceable

client = Client()

# Decorate functions to auto-trace them
@traceable(name='preprocess_query')
def preprocess_query(raw_query: str) -> str:
    # This step is now traced even though it doesn't use LangChain
    cleaned = raw_query.strip().lower()
    cleaned = ' '.join(cleaned.split())  # normalize whitespace
    return cleaned

@traceable(name='fetch_user_history')
def fetch_user_history(user_id: str) -> list[str]:
    # Database call - also traced
    return db.query('SELECT message FROM chat_history WHERE user_id = ? ORDER BY timestamp DESC LIMIT 5', user_id)

# All three steps appear in the same trace
def handle_request(user_id: str, raw_query: str):
    query = preprocess_query(raw_query)         # traced
    history = fetch_user_history(user_id)       # traced
    result = rag_chain.invoke({'query': query, 'history': history})  # traced by LangChain
    return result

การประเมินร่องรอยใน LangSmith

LangSmith มี กรอบงานการประเมินที่ช่วยให้คุณเรียกใช้ตัวประเมินกับชุดข้อมูลร่องรอยได้ คุณสามารถเลือกตัวอย่างร่องรอยชุดหนึ่ง เรียกใช้ตัวประเมินอัตโนมัติ (รวมถึงตัวให้คะแนนโดย LLM ในฐานะผู้ตัดสินเพื่อประเมินความถูกต้องและความเกี่ยวข้อง) และเปรียบเทียบผลลัพธ์ระหว่างกระบวนการรุ่นต่าง ๆ วิธีนี้เปลี่ยนร่องรอยจากระบบจริงให้เป็นวงจรป้อนกลับสำหรับปรับปรุงแอปพลิเคชัน

from langsmith.evaluation import evaluate, LangChainStringEvaluator

# Create an evaluator that uses an LLM to judge correctness
correctness_evaluator = LangChainStringEvaluator(
    'qa',
    config={'llm': ChatOpenAI(model='gpt-4o')}
)

# Run evaluation against a dataset of traced examples
results = evaluate(
    rag_chain,
    data='my-rag-test-set',      # name of dataset in LangSmith
    evaluators=[correctness_evaluator],
    experiment_prefix='rag-v2-chunking-test'
)

print('Evaluation results:')
print(f'Correctness: {results.results["correctness"].mean():.2f}')
print(f'Average latency: {results.results["latency"].mean():.2f}s')

การสร้างชุดข้อมูลทดสอบจากร่องรอย

หนึ่งในคุณสมบัติที่ทรงพลังที่สุดของ LangSmith คือความสามารถในการ สร้างชุดข้อมูลทดสอบโดยตรงจากร่องรอยของระบบจริง เมื่อคุณพบร่องรอยที่น่าสนใจ (ความล้มเหลว กรณีขอบเขต หรือตัวอย่างที่ดี) คุณสามารถเพิ่มร่องรอยนั้นลงในชุดข้อมูลได้ด้วยการคลิกเพียงครั้งเดียว เมื่อเวลาผ่านไป คุณจะสร้างชุดการทดสอบการถดถอยที่ครอบคลุมจากคำค้นหาจริงของผู้ใช้ แทนที่จะใช้ตัวอย่างสังเคราะห์

from langsmith import Client

client = Client()

# Create a dataset from existing traces
dataset = client.create_dataset('rag-regression-tests')

# Add examples from production traces (by trace ID)
for trace_id in failed_trace_ids:
    run = client.read_run(trace_id)
    client.create_example(
        inputs=run.inputs,
        outputs={'answer': run.outputs.get('output', '')},
        dataset_id=dataset.id,
        metadata={'source': 'production_failure', 'date': run.start_time.isoformat()}
    )

print(f'Added {len(failed_trace_ids)} examples to regression test dataset')

การกรองและค้นหาร่องรอย

ในระบบจริง คุณอาจมีร่องรอยหลายพันรายการ ส่วนติดต่อผู้ใช้และ API ของ LangSmith รองรับ การกรองและการค้นหาที่หลากหลาย: ค้นหาร่องรอยที่มีเวลาแฝงสูงกว่าเกณฑ์ มีประเภทข้อผิดพลาดเฉพาะ มาจากผู้ใช้เฉพาะราย มีคำสำคัญเฉพาะในผลลัพธ์ หรือมีจำนวนโทเค็นของผลลัพธ์สูงกว่าขีดจำกัด วิธีนี้ทำให้การตรวจสอบหมวดหมู่ความล้มเหลวเฉพาะหรือการติดตามพฤติกรรมของผู้ใช้เฉพาะรายทำได้จริง

from langsmith import Client

client = Client()

# Find slow traces (useful for performance investigation)
slow_runs = client.list_runs(
    project_name='my-rag-app',
    filter='gt(latency, 5)',  # latency > 5 seconds
    limit=20
)

# Find error traces
error_runs = client.list_runs(
    project_name='my-rag-app',
    filter='eq(error, true)',
    limit=50
)

# Find traces from a specific user
user_runs = client.list_runs(
    project_name='my-rag-app',
    filter='has(metadata, user_id="user_abc123")',
    limit=100
)

for run in slow_runs:
    print(f'Slow run: {run.id}, latency: {run.end_time - run.start_time}')

การเปรียบเทียบการทดลองใน LangSmith

LangSmith รองรับ การเปรียบเทียบการทดลอง: เรียกใช้ชุดข้อมูลทดสอบเดียวกันผ่านกระบวนการสองรุ่น (เช่น ขนาดส่วน 500 เทียบกับขนาดส่วน 1,000) แล้วเปรียบเทียบแบบเคียงข้างกันในด้านเวลาแฝง ค่าใช้จ่าย และเมตริกคุณภาพ วิธีนี้ช่วยให้ตรวจสอบได้ง่ายว่าการเปลี่ยนแปลงกระบวนการเป็นการปรับปรุง ไม่ใช่การถดถอย ก่อนนำไปใช้งานจริง

from langsmith.evaluation import evaluate

test_dataset = 'my-rag-eval-set'

# Run experiment A: chunk size 500
results_a = evaluate(
    rag_pipeline_v1,
    data=test_dataset,
    evaluators=[correctness_evaluator, relevance_evaluator],
    experiment_prefix='chunk-500'
)

# Run experiment B: chunk size 1000
results_b = evaluate(
    rag_pipeline_v2,
    data=test_dataset,
    evaluators=[correctness_evaluator, relevance_evaluator],
    experiment_prefix='chunk-1000'
)

# Compare in LangSmith UI: Experiments tab shows A vs B side by side
# Or compare programmatically:
print(f'Correctness - v1: {results_a.results["correctness"].mean():.2f}, v2: {results_b.results["correctness"].mean():.2f}')

LangSmith ในระบบจริง

LangSmith ให้บริการในรูปแบบ บริการซอฟต์แวร์ที่โฮสต์ที่ smith.langchain.com และมีตัวเลือกให้โฮสต์ด้วยตนเอง ในระบบจริง สามารถทำให้การติดตามร่องรอยทำงานแบบอะซิงโครนัส (ไม่บล็อกการทำงาน) เพื่อหลีกเลี่ยงการเพิ่มเวลาแฝงให้เส้นทางการทำงานสำคัญ นอกจากนี้ยังสามารถสุ่มเก็บร่องรอยได้ (เช่น ติดตามร่องรอยเพียง 10% ของคำขอในระบบจริงที่มีปริมาณการใช้งานสูง) เพื่อควบคุมค่าใช้จ่ายโดยยังคงมองเห็นระบบได้ แดชบอร์ดจะแสดงกราฟแบบเรียลไทม์ของปริมาณคำขอ เวลาแฝง ค่าใช้จ่าย และอัตราข้อผิดพลาด

import os

# Production configuration
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_ENDPOINT'] = 'https://api.smith.langchain.com'
os.environ['LANGCHAIN_PROJECT'] = 'production'

# Enable async tracing (non-blocking - does not add latency to requests)
os.environ['LANGCHAIN_CALLBACKS_BACKGROUND'] = 'true'

# Optional: sample 10% of traces to reduce cost in high-traffic scenarios
import random

def should_trace() -> bool:
    return random.random() < 0.10  # 10% sampling rate

def handle_request(query):
    config = RunnableConfig()
    if not should_trace():
        config = RunnableConfig(callbacks=[])  # disable tracing for this request
    return rag_chain.invoke(query, config=config)

LangSmith เทียบกับการบันทึกแบบกำหนดเอง

คุณสามารถสร้างระบบบันทึกการติดตามของคุณเองได้ และสำหรับบางกรณีการใช้งาน นั่นอาจเป็นทางเลือกที่เหมาะสม ข้อได้เปรียบของ LangSmith เมื่อเทียบกับการบันทึกแบบกำหนดเอง ได้แก่ การผสานรวมกับ LangChain โดยไม่ต้องเขียนโค้ด อินเทอร์เฟซเฉพาะสำหรับสำรวจการติดตามของ LLM (ไม่ใช่แดชบอร์ด Kibana/Grafana ทั่วไป) การรองรับการประเมินและการเปรียบเทียบการทดลองในตัว และการติดตามจำนวนโทเค็นกับค่าใช้จ่ายโดยอัตโนมัติ ข้อแลกเปลี่ยนคือการพึ่งพาผู้ให้บริการและค่าใช้จ่ายเมื่อใช้งานในขนาดใหญ่

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการติดตามด้วย LangSmith จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า LangSmith ช่วยให้ติดตามแอปพลิเคชัน LangChain ตั้งแต่ต้นจนจบโดยอัตโนมัติได้ด้วยการตั้งค่าตัวแปรสภาพแวดล้อมสามตัว โดยไม่ต้องแก้ไขโค้ด ตัวตกแต่ง @traceable ช่วยขยายการติดตามไปยังขั้นตอนที่ไม่ใช่ LangChain เช่น การเรียกฐานข้อมูลและการประมวลผลล่วงหน้า และ การเปรียบเทียบการทดลอง ช่วยให้คุณตรวจสอบการปรับปรุงไปป์ไลน์กับชุดข้อมูลทดสอบก่อนนำไปใช้งาน บทถัดไป เราจะสำรวจ Langfuse ในฐานะทางเลือกด้านการสังเกตการณ์ที่ไม่ผูกกับโมเดล

คำถามที่พบบ่อย

บทเรียน “การติดตามด้วย LangSmith” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การติดตามด้วย LangSmith” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การติดตามด้วย LangSmith”

เพิ่มการติดตามด้วย LangSmith ให้แอปพลิเคชัน LangChain เพื่อบันทึกทุกขั้นตอนของสายงาน การเรียกใช้ LLM จำนวนโทเค็น และเวลาแฝงในเครื่องมือสำรวจร่องรอยที่ค้นหาได้ คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การติดตามด้วย LangSmith” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม

ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุใดแอป LLM จึงแก้ไขข้อผิดพลาดได้ยาก
  2. การติดตามด้วย LangSmith
  3. Langfuse สำหรับการสังเกตการณ์ที่ไม่ขึ้นกับโมเดล
  4. การแจ้งเตือนเวลาแฝง ต้นทุน และคุณภาพที่ลดลง
← กลับไปที่ AI Engineering Academy