21c - LangSmith 设置指南
本文是《AI Agent 实战手册》第 21 章第 3 节。 上一节:21b-可观测性平台对比 | 下一节:21d-Langfuse设置指南
⏱ 阅读时间:60 分钟 | 难度:⭐⭐⭐ 中级 | 前置知识:Python/TypeScript 基础、LLM 应用开发经验
概述
LangSmith 是 LangChain 团队打造的框架无关的 LLM 可观测性与评估平台,提供端到端的追踪、Prompt 管理、数据集评估和团队协作能力。本节将从零开始,逐步引导你完成 LangSmith 的账号注册、SDK 集成、Trace 配置、仪表板搭建、Prompt 版本管理、数据集评估工作流,以及与 LangGraph 多 Agent 系统的集成。
1. LangSmith 概览与定价
1.1 平台定位
LangSmith 是一个用于开发、调试和部署 AI Agent 与 LLM 应用的平台。它帮助开发者追踪请求、评估输出、测试 Prompt 并管理部署——所有功能集中在一个平台上。
工具推荐
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| LangSmith Developer | 个人开发与调试 | 免费(含 5,000 条 base traces/月) | 个人项目、原型验证 |
| LangSmith Plus | 团队协作与生产监控 | $39/席位/月(含 10,000 条 base traces/月) | 中小团队、生产环境 |
| LangSmith Enterprise | 企业级部署 | 定制报价(支持自托管/混合部署) | 大型企业、合规要求高 |
| LangSmith Startup Plan | 早期创业公司 | 折扣价格(需申请) | 种子轮/A 轮创业公司 |
计费说明:超出免费额度后,按 $0.005/trace 计费。席位按月计费,trace 用量按月后付。Enterprise 计划按年开票。
2. 账号注册与 API Key 配置
操作步骤
步骤 1:注册 LangSmith 账号
访问 smith.langchain.com ,支持以下注册方式:
- GitHub 账号登录
- Discord 账号登录
- 邮箱 + 密码注册(需验证邮箱)
步骤 2:创建 API Key
登录后,进入 Settings → API Keys,点击 Create API Key:
1. 点击右上角头像 → Settings
2. 左侧菜单选择 "API Keys"
3. 点击 "Create API Key"
4. 为 Key 命名(如 "dev-local"、"production")
5. 复制生成的 Key(格式:lsv2_pt_xxxx...)
6. 妥善保存——Key 只显示一次⚠️ 安全提示:API Key 应存储在环境变量或密钥管理服务中,切勿硬编码到代码或提交到 Git 仓库。
步骤 3:配置环境变量
Linux/macOS:
# 在 ~/.bashrc 或 ~/.zshrc 中添加
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY="lsv2_pt_your_api_key_here"
export LANGSMITH_PROJECT="my-first-project"
# 可选:指定工作区(多工作区场景)
export LANGSMITH_WORKSPACE_ID="your-workspace-id"Windows PowerShell:
$env:LANGSMITH_TRACING = "true"
$env:LANGSMITH_API_KEY = "lsv2_pt_your_api_key_here"
$env:LANGSMITH_PROJECT = "my-first-project".env 文件(推荐用于项目):
LANGSMITH_TRACING=true
LANGSMITH_API_KEY=lsv2_pt_your_api_key_here
LANGSMITH_PROJECT=my-first-project
LANGSMITH_ENDPOINT=https://api.smith.langchain.com提示词模板
你是一个 DevOps 工程师,请帮我生成一个安全的 LangSmith 环境变量配置方案:
项目类型:[Web 应用 / CLI 工具 / 微服务]
部署环境:[本地开发 / Docker / Kubernetes / Serverless]
密钥管理方式:[.env 文件 / AWS Secrets Manager / Vault / 环境变量]
要求:
1. 区分开发和生产环境的配置
2. 确保 API Key 不会泄露到版本控制
3. 包含 .gitignore 配置3. Python SDK 安装与集成
操作步骤
步骤 1:安装 SDK
# 使用 pip
pip install langsmith
# 使用 poetry
poetry add langsmith
# 如果同时使用 LangChain
pip install langsmith langchain langchain-openai步骤 2:验证安装
import langsmith
print(langsmith.__version__) # 应输出 0.3.x 或更高版本
# 验证连接
client = langsmith.Client()
print(client.info) # 应返回服务器信息步骤 3:使用 @traceable 装饰器追踪函数
@traceable 是 LangSmith Python SDK 的核心追踪机制,可以装饰任意函数:
import langsmith as ls
from langsmith.wrappers import wrap_openai
import openai
# 包装 OpenAI 客户端,自动追踪所有 LLM 调用
client = wrap_openai(openai.Client())
@ls.traceable(run_type="tool", name="检索上下文")
def retrieve_context(question: str) -> str:
"""模拟文档检索"""
# 实际项目中这里会调用向量数据库
return "LangSmith 是 LangChain 团队开发的可观测性平台..."
@ls.traceable(run_type="chain", name="RAG 问答管线")
def rag_pipeline(question: str) -> str:
context = retrieve_context(question)
messages = [
{"role": "system", "content": f"基于以下上下文回答问题:\n{context}"},
{"role": "user", "content": question}
]
response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=messages
)
return response.choices[0].message.content
# 执行——trace 自动上报到 LangSmith
result = rag_pipeline("什么是 LangSmith?")
print(result)步骤 4:使用 trace 上下文管理器(更灵活的方式)
import langsmith as ls
from langsmith.wrappers import wrap_openai
import openai
client = wrap_openai(openai.Client())
def chat_pipeline(question: str) -> str:
context = "LangSmith 提供端到端的 LLM 可观测性..."
messages = [
{"role": "system", "content": f"上下文:{context}"},
{"role": "user", "content": question}
]
response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=messages
)
return response.choices[0].message.content
# 使用上下文管理器手动控制 trace
app_inputs = {"input": "LangSmith 有什么功能?"}
with ls.trace("Chat Pipeline", "chain", project_name="my-project", inputs=app_inputs) as rt:
output = chat_pipeline("LangSmith 有什么功能?")
rt.end(outputs={"output": output})步骤 5:为 trace 添加元数据和标签
@ls.traceable(
run_type="chain",
name="客服问答",
tags=["production", "customer-service"],
metadata={"version": "2.1", "team": "support"}
)
def customer_service_agent(query: str, user_id: str) -> str:
# 元数据和标签会显示在 LangSmith UI 中,方便过滤和分析
...4. TypeScript/JavaScript SDK 安装与集成
操作步骤
步骤 1:安装 SDK
# npm
npm install langsmith
# pnpm
pnpm add langsmith
# yarn
yarn add langsmith
# 如果同时使用 LangChain.js
npm install langsmith @langchain/core @langchain/openai步骤 2:使用 traceable 包装函数
import { traceable } from "langsmith/traceable";
import { wrapOpenAI } from "langsmith/wrappers";
import OpenAI from "openai";
// 包装 OpenAI 客户端
const client = wrapOpenAI(new OpenAI());
const retrieveContext = traceable(
async (question: string): Promise<string> => {
// 模拟检索
return "LangSmith 是一个 LLM 可观测性平台...";
},
{ name: "检索上下文", run_type: "tool" }
);
const ragPipeline = traceable(
async (question: string): Promise<string> => {
const context = await retrieveContext(question);
const response = await client.chat.completions.create({
model: "gpt-4.1-mini",
messages: [
{ role: "system", content: `基于上下文回答:\n${context}` },
{ role: "user", content: question },
],
});
return response.choices[0].message.content ?? "";
},
{ name: "RAG 问答管线", run_type: "chain" }
);
// 执行
const result = await ragPipeline("什么是 LangSmith?");
console.log(result);步骤 3:在 Vercel AI SDK 中集成
import { AISDKExporter } from "langsmith/vercel";
import { streamText } from "ai";
import { openai } from "@ai-sdk/openai";
const result = await streamText({
model: openai("gpt-4.1-mini"),
prompt: "用一句话解释 AgentOps",
experimental_telemetry: AISDKExporter.getSettings({
runName: "Vercel AI 调用",
metadata: { framework: "vercel-ai-sdk" },
}),
});5. Trace 配置详解
5.1 LangChain 应用的自动追踪
对于使用 LangChain/LangGraph 构建的应用,只需设置环境变量即可实现零代码追踪:
import os
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "lsv2_pt_xxx"
os.environ["LANGSMITH_PROJECT"] = "my-langchain-app"
# 所有 LangChain 调用自动追踪——无需额外代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4.1-mini")
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的助手。"),
("user", "{input}")
])
chain = prompt | llm
# 这个调用会自动生成完整的 trace
response = chain.invoke({"input": "什么是 AgentOps?"})5.2 非 LangChain 应用的手动追踪
对于不使用 LangChain 的应用,LangSmith 提供了多种追踪方式:
| 追踪方式 | 适用场景 | 侵入性 | 灵活性 |
|---|---|---|---|
wrap_openai | OpenAI SDK 调用 | 极低(一行代码) | 中 |
@traceable 装饰器 | 任意 Python 函数 | 低 | 高 |
traceable 包装器 | 任意 JS/TS 函数 | 低 | 高 |
trace 上下文管理器 | 代码块级追踪 | 中 | 最高 |
RunTree API | 完全手动控制 | 高 | 最高 |
| OpenTelemetry | 已有 OTel 基础设施 | 中 | 高 |
5.3 OpenTelemetry 集成
LangSmith 支持端到端的 OpenTelemetry 集成,适合已有 OTel 基础设施的团队:
# 安装 OTel 依赖
# pip install opentelemetry-sdk opentelemetry-exporter-otlp
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
# 配置 LangSmith 作为 OTel 后端
exporter = OTLPSpanExporter(
endpoint="https://api.smith.langchain.com/otel/v1/traces",
headers={"x-api-key": "lsv2_pt_xxx"}
)
provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)5.4 Trace 采样与过滤
在高流量生产环境中,可以配置采样策略以控制成本:
import langsmith as ls
import random
# 方法 1:通过环境变量控制采样率
# 在代码中动态决定是否追踪
@ls.traceable(enabled=random.random() < 0.1) # 10% 采样率
def high_volume_endpoint(query: str) -> str:
...
# 方法 2:按条件追踪
@ls.traceable
def conditional_trace(query: str, debug: bool = False) -> str:
if not debug:
# 生产环境可通过 LANGSMITH_TRACING 环境变量全局控制
pass
...6. 仪表板设置与项目管理
操作步骤
步骤 1:创建项目(Project)
项目是 LangSmith 中组织 trace 的基本单位:
1. 登录 LangSmith → 左侧菜单选择 "Projects"
2. 点击 "+ New Project"
3. 输入项目名称(如 "customer-service-bot")
4. 选择描述和标签
5. 点击 "Create"也可以通过代码创建:
from langsmith import Client
client = Client()
# 创建新项目
client.create_project("customer-service-bot", description="客服机器人生产环境")最佳实践:按环境和功能组织项目,如
chatbot-dev、chatbot-staging、chatbot-prod。
步骤 2:配置预置仪表板
LangSmith 为每个项目自动创建预置仪表板,包含以下核心指标:
| 指标 | 说明 | 关注点 |
|---|---|---|
| Trace Count | 追踪总数 | 流量趋势 |
| Error Rate | 错误率 | 系统稳定性 |
| Latency (P50/P95/P99) | 延迟百分位 | 用户体验 |
| Token Usage | Token 消耗量 | 成本控制 |
| LLM Call Count | LLM 调用次数 | 使用模式 |
| Feedback Score | 用户反馈分数 | 输出质量 |
步骤 3:创建自定义仪表板
1. 进入项目 → 点击右上角 "Dashboard"
2. 点击 "Create Dashboard" 或 "Add Chart"
3. 选择图表类型(折线图、柱状图、数值卡片等)
4. 配置指标和过滤条件
5. 设置时间范围和刷新频率自定义仪表板常用配置:
- 成本监控面板:按模型、按用户、按功能的 Token 消耗趋势
- 质量监控面板:评估分数趋势、幻觉率、用户满意度
- 性能监控面板:P95 延迟、错误率、吞吐量
步骤 4:配置 Trace 过滤与搜索
LangSmith 支持强大的 trace 过滤功能:
常用过滤条件:
- 按标签过滤:tag = "production"
- 按元数据过滤:metadata.user_id = "user_123"
- 按延迟过滤:latency > 5s
- 按状态过滤:status = "error"
- 按时间范围:last 24 hours / last 7 days
- 按反馈分数:feedback.score < 0.57. Prompt 管理与版本控制
7.1 Prompt Hub 概述
LangSmith 的 Prompt Hub 允许你将 Prompt 与代码分离管理,支持版本控制、团队协作和 A/B 测试。
操作步骤
步骤 1:在 UI 中创建和管理 Prompt
1. 左侧菜单选择 "Prompts"
2. 点击 "+ New Prompt"
3. 输入 Prompt 名称(如 "customer-service-v1")
4. 编写 Prompt 模板内容
5. 设置模型参数(temperature、max_tokens 等)
6. 点击 "Save" 保存步骤 2:通过 SDK 推送和拉取 Prompt
from langsmith import Client
from langchain_core.prompts import ChatPromptTemplate
client = Client()
# 创建 Prompt 模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的{role}。请用{language}回答用户问题。"),
("user", "{question}")
])
# 推送到 LangSmith Prompt Hub
client.push_prompt("customer-service-prompt", object=prompt)
# 从 Hub 拉取特定版本
prompt_v1 = client.pull_prompt("customer-service-prompt")
# 拉取特定 commit
prompt_specific = client.pull_prompt("customer-service-prompt:abc123")步骤 3:在 Playground 中测试 Prompt
1. 进入 Prompts → 选择一个 Prompt
2. 点击 "Open in Playground"
3. 填入变量值(如 role="客服专家"、language="中文")
4. 选择模型(GPT-4、Claude 3.5 等)
5. 点击 "Run" 测试效果
6. 对比不同版本的输出质量
7. 满意后点击 "Commit" 保存新版本提示词模板
请帮我设计一个 LangSmith Prompt 版本管理策略:
应用场景:[客服机器人 / 代码助手 / 数据分析]
团队规模:[1-3 人 / 5-10 人 / 10+ 人]
发布频率:[每天 / 每周 / 每月]
要求:
1. 定义 Prompt 命名规范(如 {team}-{function}-{version})
2. 设计审批流程(谁可以推送到生产?)
3. 制定回滚策略(发现问题如何快速回退?)
4. 设置 A/B 测试方案(如何对比新旧版本效果?)8. 数据集创建与评估工作流
8.1 数据集概念
LangSmith 中的数据集是输入-输出对的集合,用于系统化评估 LLM 应用的质量。数据集自动版本化——每次添加、更新或删除示例时,都会创建新版本。
操作步骤
步骤 1:创建数据集
from langsmith import Client
client = Client()
# 创建数据集
dataset = client.create_dataset(
"customer-service-eval",
description="客服机器人评估数据集"
)
# 添加示例
examples = [
{
"inputs": {"question": "如何退款?"},
"outputs": {"answer": "您可以在订单页面点击'申请退款'按钮..."}
},
{
"inputs": {"question": "配送需要多久?"},
"outputs": {"answer": "标准配送 3-5 个工作日,加急配送 1-2 个工作日..."}
},
{
"inputs": {"question": "可以修改收货地址吗?"},
"outputs": {"answer": "订单发货前可以修改,请进入订单详情页..."}
}
]
for example in examples:
client.create_example(
inputs=example["inputs"],
outputs=example["outputs"],
dataset_id=dataset.id
)步骤 2:从 Trace 创建数据集
1. 在 Traces 页面选择高质量的 trace
2. 点击 "Add to Dataset"
3. 选择目标数据集或创建新数据集
4. 确认输入和期望输出
5. 保存最佳实践:定期从生产 trace 中筛选典型案例加入评估数据集,保持数据集与真实使用场景同步。
步骤 3:运行评估
from langsmith import Client, evaluate
client = Client()
# 定义要评估的目标函数
def my_agent(inputs: dict) -> dict:
question = inputs["question"]
# 调用你的 Agent 逻辑
answer = rag_pipeline(question)
return {"answer": answer}
# 定义评估器
def correctness_evaluator(run, example):
"""评估回答的正确性"""
predicted = run.outputs.get("answer", "")
expected = example.outputs.get("answer", "")
# 简单的关键词匹配(实际项目中可用 LLM-as-Judge)
score = 1.0 if any(kw in predicted for kw in expected.split(",")) else 0.0
return {"key": "correctness", "score": score}
# 运行评估
results = evaluate(
my_agent,
data="customer-service-eval",
evaluators=[correctness_evaluator],
experiment_prefix="v2.1-gpt4-mini"
)步骤 4:使用 LLM-as-Judge 自动评估
from langsmith import evaluate
from langchain_openai import ChatOpenAI
# LangSmith 内置的 LLM 评估器
def llm_judge(run, example):
"""使用 LLM 作为评判者"""
judge = ChatOpenAI(model="gpt-4.1-mini", temperature=0)
prompt = f"""请评估以下回答的质量(0-1 分):
问题:{example.inputs['question']}
期望回答:{example.outputs['answer']}
实际回答:{run.outputs['answer']}
评分标准:
- 1.0:完全正确且有帮助
- 0.7:基本正确但有遗漏
- 0.3:部分正确但有误导
- 0.0:完全错误
请只返回一个数字分数。"""
response = judge.invoke(prompt)
score = float(response.content.strip())
return {"key": "llm_judge_score", "score": score}
results = evaluate(
my_agent,
data="customer-service-eval",
evaluators=[llm_judge],
experiment_prefix="v2.1-llm-judge"
)9. 团队协作功能
9.1 组织与工作区层级
LangSmith 采用 Organization → Workspace → Project 的三级层级结构:
| 层级 | 说明 | 典型用法 |
|---|---|---|
| Organization | 公司级别,管理用户、SSO、计费 | 一个公司一个 Organization |
| Workspace | 团队/业务单元级别,隔离资源 | 按团队或环境划分(如 backend-team、production) |
| Project | 应用级别,组织 trace 和数据集 | 按应用或功能划分(如 chatbot、search-agent) |
操作步骤
步骤 1:创建工作区
1. 进入 Organization Settings
2. 点击 "Workspaces" → "Create Workspace"
3. 输入名称(如 "AI-Team-Dev")
4. 配置工作区设置步骤 2:管理团队成员与角色
LangSmith 支持基于角色的访问控制(RBAC):
| 角色 | 权限 | 适用人员 |
|---|---|---|
| Admin | 完全管理权限 | 技术负责人 |
| User | 读写 trace、数据集、Prompt | 开发者 |
| Viewer | 只读访问 | 产品经理、QA |
1. 进入 Workspace Settings → Members
2. 点击 "Invite Member"
3. 输入邮箱,选择角色
4. 发送邀请步骤 3:使用 Annotation Queue 进行人工标注
Annotation Queue 是团队协作评估的核心功能:
1. 进入 "Annotation Queues" → "Create Queue"
2. 配置过滤条件(如:只包含低分 trace)
3. 分配标注人员
4. 标注人员逐条审查 trace,给出反馈分数和评论
5. 标注结果自动汇总到评估指标中10. 与 LangGraph 多 Agent 系统集成
10.1 LangGraph 追踪概述
LangGraph 是 LangChain 团队开发的 Agent 编排框架,与 LangSmith 深度集成。LangGraph 应用的每个节点(Node)、边(Edge)和状态转换都会自动记录为 trace 中的子 span,提供完整的多 Agent 可视化。
操作步骤
步骤 1:配置 LangGraph 追踪
import os
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "lsv2_pt_xxx"
os.environ["LANGSMITH_PROJECT"] = "multi-agent-system"
from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI
from typing import TypedDict, Annotated
import operator
# 定义状态
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
next_agent: str
# 定义 Agent 节点
llm = ChatOpenAI(model="gpt-4.1-mini")
def researcher(state: AgentState) -> AgentState:
"""研究员 Agent:负责信息收集"""
response = llm.invoke(f"作为研究员,请分析:{state['messages'][-1]}")
return {"messages": [response.content], "next_agent": "writer"}
def writer(state: AgentState) -> AgentState:
"""写作者 Agent:负责内容生成"""
response = llm.invoke(f"作为写作者,基于以下研究撰写内容:{state['messages'][-1]}")
return {"messages": [response.content], "next_agent": "reviewer"}
def reviewer(state: AgentState) -> AgentState:
"""审查者 Agent:负责质量审查"""
response = llm.invoke(f"作为审查者,请审查以下内容:{state['messages'][-1]}")
return {"messages": [response.content], "next_agent": "end"}
# 构建图
def route(state: AgentState) -> str:
return state.get("next_agent", "end")
graph = StateGraph(AgentState)
graph.add_node("researcher", researcher)
graph.add_node("writer", writer)
graph.add_node("reviewer", reviewer)
graph.add_edge(START, "researcher")
graph.add_conditional_edges("researcher", route, {"writer": "writer"})
graph.add_conditional_edges("writer", route, {"reviewer": "reviewer"})
graph.add_conditional_edges("reviewer", route, {"end": END})
app = graph.compile()
# 执行——所有节点的执行过程自动追踪到 LangSmith
result = app.invoke({
"messages": ["请写一篇关于 AgentOps 的技术博客"],
"next_agent": "researcher"
})步骤 2:在 LangSmith UI 中查看多 Agent Trace
执行后,在 LangSmith UI 中可以看到:
📊 Trace: multi-agent-system
├── 🔄 StateGraph (总耗时: 12.3s, 总 Token: 4,521)
│ ├── 🔍 researcher (耗时: 3.2s, Token: 1,203)
│ │ └── 🤖 ChatOpenAI (gpt-4.1-mini)
│ ├── ✍️ writer (耗时: 5.1s, Token: 2,105)
│ │ └── 🤖 ChatOpenAI (gpt-4.1-mini)
│ └── 📋 reviewer (耗时: 4.0s, Token: 1,213)
│ └── 🤖 ChatOpenAI (gpt-4.1-mini)步骤 3:分布式追踪(跨服务传播)
当 Agent 部署为独立服务时,可以传播 trace 上下文:
# 服务 A:调用方
import langsmith as ls
@ls.traceable
def orchestrator(query: str):
# 获取当前 trace 的 headers
headers = ls.get_current_run_tree().to_headers()
# 将 headers 传递给下游服务
response = requests.post(
"http://agent-service/invoke",
json={"query": query},
headers=headers
)
return response.json()实战案例:从零搭建客服机器人的 LangSmith 监控体系
场景描述
一个电商客服机器人,使用 RAG 架构,需要完整的可观测性体系。
案例的具体操作流程
import os
import langsmith as ls
from langsmith import Client, evaluate
from langsmith.wrappers import wrap_openai
import openai
# ===== 第 1 步:环境配置 =====
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "lsv2_pt_xxx"
os.environ["LANGSMITH_PROJECT"] = "ecommerce-chatbot-prod"
client = Client()
oai_client = wrap_openai(openai.Client())
# ===== 第 2 步:创建项目和数据集 =====
# 创建评估数据集
dataset = client.create_dataset(
"ecommerce-qa-golden",
description="电商客服黄金测试集"
)
golden_examples = [
{"inputs": {"q": "怎么退货?"}, "outputs": {"a": "7天无理由退货,请在订单页申请"}},
{"inputs": {"q": "发票怎么开?"}, "outputs": {"a": "订单完成后在订单详情页申请电子发票"}},
{"inputs": {"q": "会员有什么优惠?"}, "outputs": {"a": "会员享受9折优惠和免运费服务"}},
]
for ex in golden_examples:
client.create_example(inputs=ex["inputs"], outputs=ex["outputs"], dataset_id=dataset.id)
# ===== 第 3 步:带追踪的 Agent 实现 =====
@ls.traceable(run_type="tool", name="知识库检索")
def search_knowledge_base(query: str) -> str:
# 实际项目中调用向量数据库
knowledge = {
"退货": "7天无理由退货政策...",
"发票": "支持电子发票和纸质发票...",
"会员": "会员等级:银卡、金卡、钻石卡..."
}
for key, value in knowledge.items():
if key in query:
return value
return "未找到相关信息"
@ls.traceable(
run_type="chain",
name="客服问答",
tags=["production", "ecommerce"],
metadata={"version": "1.0"}
)
def customer_service(question: str) -> dict:
context = search_knowledge_base(question)
response = oai_client.chat.completions.create(
model="gpt-4.1-mini",
messages=[
{"role": "system", "content": f"你是电商客服。基于知识库回答:\n{context}"},
{"role": "user", "content": question}
]
)
answer = response.choices[0].message.content
return {"a": answer}
# ===== 第 4 步:运行评估 =====
results = evaluate(
lambda inputs: customer_service(inputs["q"]),
data="ecommerce-qa-golden",
evaluators=[
lambda run, example: {
"key": "contains_key_info",
"score": 1.0 if any(
kw in run.outputs.get("a", "")
for kw in ["退货", "发票", "会员", "订单"]
) else 0.0
}
],
experiment_prefix="v1.0-baseline"
)
print(f"评估完成,请在 LangSmith UI 查看详细结果")案例分析
- 分层追踪:通过
@traceable装饰器,知识库检索和 LLM 调用分别记录为独立的 span,便于定位性能瓶颈 - 标签和元数据:
tags和metadata帮助在生产环境中快速过滤和分析特定类型的请求 - 黄金测试集:从真实用户问题中提炼的评估数据集,确保评估结果反映实际使用场景
- 持续评估:每次模型或 Prompt 更新后,重新运行评估并对比历史结果,防止质量回退
避坑指南
❌ 常见错误
-
API Key 硬编码到代码中
- 问题:API Key 泄露到 Git 仓库,可能被恶意使用导致费用激增
- 正确做法:使用环境变量或密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault)存储 Key,并在
.gitignore中排除.env文件
-
生产环境开启 100% 追踪
- 问题:高流量应用每月可能产生数百万条 trace,导致费用失控($0.005/trace × 1,000,000 = $5,000/月)
- 正确做法:生产环境配置采样率(如 10%-20%),对关键路径保持 100% 追踪,对常规请求降低采样率
-
忽略 Trace 中的敏感数据
- 问题:用户的个人信息(姓名、邮箱、地址)可能随 Prompt 一起被记录到 LangSmith,违反 GDPR 等隐私法规
- 正确做法:在发送 trace 前对敏感字段进行脱敏处理,或使用 LangSmith 的数据过滤功能排除特定字段
-
所有 trace 发送到同一个 Project
- 问题:开发、测试、生产的 trace 混在一起,难以分析和监控
- 正确做法:按环境创建独立 Project(如
app-dev、app-staging、app-prod),通过LANGSMITH_PROJECT环境变量区分
-
只追踪 LLM 调用,忽略工具调用和检索步骤
- 问题:当 Agent 输出质量下降时,无法判断是 LLM 推理问题还是检索质量问题
- 正确做法:使用
@traceable装饰所有关键函数(检索、工具调用、后处理),构建完整的调用链
-
评估数据集长期不更新
- 问题:数据集与实际用户问题脱节,评估分数高但用户满意度低
- 正确做法:定期从生产 trace 中筛选新的典型案例加入数据集,每月至少更新一次
✅ 最佳实践
- 建立 Prompt 变更的评估流水线:每次修改 Prompt 后,自动运行评估数据集对比前后效果,防止质量回退
- 使用 Annotation Queue 进行人工审查:安排团队成员定期审查低分 trace,发现系统性问题
- 设置成本告警:在仪表板中配置 Token 消耗告警,当日消耗超过阈值时及时通知
- 利用标签进行 A/B 测试:为不同版本的 Prompt 或模型添加标签,在仪表板中对比各版本的性能指标
- 将评估集成到 CI/CD:在代码合并前自动运行评估,确保每次变更不会降低输出质量
相关资源与延伸阅读
| 资源 | 类型 | 说明 |
|---|---|---|
| LangSmith 官方文档 | 文档 | 最权威的 LangSmith 使用指南 |
| LangSmith Python SDK (PyPI) | SDK | Python SDK 安装和 API 参考 |
| LangSmith JS/TS SDK (npm) | SDK | JavaScript/TypeScript SDK |
| langchain-ai/langsmith-sdk (GitHub) | 源码 | SDK 源码和示例 |
| langchain-ai/intro-to-langsmith (GitHub) | 教程 | 官方入门教程仓库 |
| LangSmith Tracing Quickstart | 教程 | 官方追踪快速入门 |
| LangSmith Pricing FAQ | 文档 | 定价常见问题解答 |
| LangChain Blog - OpenTelemetry Support | 博客 | OTel 集成详解 |
| LangChain Blog - Workspaces | 博客 | 工作区功能介绍 |
| LangSmith Cookbook (GitHub) | 示例 | 实战食谱和代码示例集 |
参考来源
- LangSmith Official Documentation (2025,持续更新)
- LangSmith Plans and Pricing (2025,持续更新)
- LangSmith Tracing Quickstart (2025)
- Custom Instrumentation - @traceable (2025)
- Introducing End-to-End OpenTelemetry Support in LangSmith (2025-03)
- Workspaces in LangSmith for Improved Collaboration (2024-06)
- LangSmith Homepage Redesign and Resource Tags (2024-11)
- LangSmith Review – Cost, Use Cases & Alternatives (2025)
- Trace LangGraph Applications (2025)
- LangSmith Prompt Management (2025)
📖 返回 总览与导航 | 上一节:21b-可观测性平台对比 | 下一节:21d-Langfuse设置指南