Chapter 09

LangSmith 可观测性

追踪配置、@traceable 装饰器、Dataset 评估工作流与提示词版本管理

LangSmith 是什么

LangSmith 是 LangChain 官方的 LLM 应用可观测性与评估平台。 你的 LangChain 应用的每一次 LLM 调用、工具调用、链执行都会自动被记录到 LangSmith, 让你能够追踪性能瓶颈、调试错误、评估输出质量。

简单来说,LangSmith 对于 LLM 应用的作用,就如同 Datadog 对于分布式系统的作用。

Trace(追踪)
一次完整的 LangChain 执行过程的记录,包含所有子步骤(称为 Run)的输入、输出、延迟、Token 用量和错误信息。
Run(运行)
一个 Trace 中的单个步骤,可以是 LLM 调用、工具执行、链调用等。Trace 中的 Run 形成树状结构。
Dataset(数据集)
用于评估的输入-输出对集合。可以从生产 Trace 中采样,也可以手动创建。
Evaluator(评估器)
对模型输出打分的函数或 LLM。常用评估维度:答案正确性、相关性、幻觉率、有害内容等。

配置 LangSmith 追踪

# 1. 安装
# pip install langsmith

# 2. 设置环境变量(在 .env 文件中)
LANGCHAIN_TRACING_V2=true
LANGCHAIN_API_KEY=lsv2_pt_xxxxxxxxxxxxx  # 从 smith.langchain.com 获取
LANGCHAIN_PROJECT=my-rag-app  # 项目名称,便于分组管理
LANGCHAIN_ENDPOINT=https://api.smith.langchain.com

# 3. 在代码中加载(仅此而已!追踪自动开启)
from dotenv import load_dotenv
load_dotenv()

# 所有 LangChain 操作自动被追踪,无需其他代码改动
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

llm = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template("用中文简洁回答:{question}")
chain = prompt | llm

# 这次调用的完整追踪(输入/输出/延迟/Token)会自动出现在 LangSmith 控制台
result = chain.invoke({"question": "什么是 RAG?"})

自定义追踪:添加元数据与标签

from langsmith import traceable

# @traceable 装饰器追踪自定义函数
@traceable(name="process_user_query", tags=["production", "rag"])
def process_query(query: str, user_id: str) -> str:
    # 在追踪中附加元数据
    from langsmith import get_current_run_tree
    run_tree = get_current_run_tree()
    if run_tree:
        run_tree.metadata["user_id"] = user_id  # 可在 LangSmith 中按 user_id 过滤
    
    result = chain.invoke({"question": query})
    return result.content

# 在 LangSmith 控制台可以按 user_id、tag 过滤和搜索追踪记录

Dataset 评估工作流

from langsmith import Client
from langsmith.evaluation import evaluate, LangChainStringEvaluator

client = Client()

# 1. 创建评估数据集
dataset_name = "RAG-QA-测试集"
dataset = client.create_dataset(dataset_name, description="RAG 应用质量评估集")

# 2. 添加测试用例(输入 + 期望输出)
examples = [
    ("什么是 RAG?", "RAG 是检索增强生成,结合检索系统与生成模型来提升 LLM 的知识准确性"),
    ("向量数据库的作用是什么?", "向量数据库存储高维向量,支持近似最近邻搜索,用于语义检索"),
    ("Embedding 模型的工作原理?", "将文本转换为高维数值向量,语义相似的文本距离接近"),
]

client.create_examples(
    inputs=[{"question": q} for q, _ in examples],
    outputs=[{"answer": a} for _, a in examples],
    dataset_id=dataset.id
)

# 3. 定义被评估的应用
def app_under_test(inputs: dict) -> dict:
    result = chain.invoke({"question": inputs["question"]})
    return {"output": result.content}

# 4. 使用 LLM-as-judge 评估器
evaluators = [
    LangChainStringEvaluator("qa"),           # 答案正确性(基于参考答案)
    LangChainStringEvaluator("relevance"),    # 回答相关性
    LangChainStringEvaluator("conciseness"),  # 简洁性
]

# 5. 运行评估(结果自动上传到 LangSmith)
results = evaluate(
    app_under_test,
    data=dataset_name,
    evaluators=evaluators,
    experiment_prefix="gpt-4o-mini-v1"
)
print(f"平均分: {results.results['score'].mean():.2f}")
利用 LangSmith 进行提示词版本管理

LangSmith Hub(hub.langchain.com)允许你将提示词版本化存储,在代码中通过 Hub 链接加载,并追踪不同版本提示词对输出质量的影响。这是生产级 Prompt 工程的关键实践。

本章小结