LangSmith 详解:LLM 应用开发与运维平台

返回

LangSmith 详解:LLM 应用开发与运维平台

LangSmith 是 LangChain 团队推出的 LLM 应用全生命周期管理平台。它提供追踪、调试、评估、监控、协作等功能,帮助团队高效开发和运维 LLM 应用。

一、什么是 LangSmith?

LangSmith 是一个专为 LLM 应用设计的开发与运维平台。它解决了 LLM 开发中的核心痛点:

┌─────────────────────────────────────────────────────────────────┐
│                  LLM 开发痛点 vs LangSmith 解决方案               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ❌ 痛点                              ✅ LangSmith 方案           │
│  ━━━━━━━━━━━━                       ━━━━━━━━━━━━━━              │
│  "Agent 为什么输出这个?"            → 完整追踪,一步步调试       │
│  "这个 Prompt 效果怎么样?"          → A/B 测试,数据对比          │
│  "更新后有没有破坏功能?"            → 自动化评估,回归测试       │
│  "这个月 API 花了多少钱?"           → 成本追踪,按项目统计       │
│  "怎么把最佳实践分享给团队?"        → Prompt 库,数据集共享       │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1.1 核心功能模块

┌─────────────────────────────────────────────────────────────────┐
│                     LangSmith 功能架构                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐       │
│  │    Tracing    │  │  Evaluation   │  │  Monitoring   │       │
│  │    追踪调试    │  │    评估测试    │  │    监控分析    │       │
│  ├───────────────┤  ├───────────────┤  ├───────────────┤       │
│  │ • 请求追踪    │  │ • 数据集管理  │  │ • 性能指标    │       │
│  │ • 调用链查看  │  │ • 评估器      │  │ • 成本统计    │       │
│  │ • 错误定位    │  │ • A/B 测试     │  │ • 告警通知    │       │
│  │ • 时间旅行    │  │ • 回归测试    │  │ • 使用分析    │       │
│  └───────────────┘  └───────────────┘  └───────────────┘       │
│                                                                 │
│  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐       │
│  │    Prompts    │  │   Datasets    │  │  Collaboration │       │
│  │   提示词管理   │  │   数据集管理   │  │    团队协作    │       │
│  ├───────────────┤  ├───────────────┤  ├───────────────┤       │
│  │ • 版本控制    │  │ • 测试用例    │  │ • 项目共享    │       │
│  │ • 模板库      │  │ • 评估数据    │  │ • 权限管理    │       │
│  │ • 在线编辑    │  │ • 数据标注    │  │ • 评论反馈    │       │
│  └───────────────┘  └───────────────┘  └───────────────┘       │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

二、快速开始

2.1 创建账户

  1. 访问 smith.langchain.com
  2. 使用 GitHub/Google 账号登录
  3. 创建你的第一个项目

2.2 获取 API Key

# 在 LangSmith 网站获取 API Key
# 设置环境变量
export LANGSMITH_API_KEY="lsv2_pt_..."
export LANGSMITH_TRACING=true
export LANGSMITH_PROJECT="my-project"

2.3 开启追踪(5 行代码)

import os

# 设置环境变量
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "lsv2_pt_..."
os.environ["LANGSMITH_PROJECT"] = "my-first-project"

# 你的 LangChain 代码
from langchain.agents import create_agent

agent = create_agent(model="claude-sonnet-4-6", tools=[])
result = agent.invoke({"messages": [{"role": "user", "content": "你好"}]})

# 完成!现在访问 LangSmith 网站查看追踪

三、追踪与调试

3.1 自动追踪

开启追踪后,所有 LangChain/LangGraph 调用自动记录:

from langchain.agents import create_agent
from langchain.tools import tool

@tool
def search(query: str):
    """搜索信息"""
    return "搜索结果"

agent = create_agent(
    model="claude-sonnet-4-6",
    tools=[search],
)

# 这次调用会被完整记录
result = agent.invoke({
    "messages": [{"role": "user", "content": "今天北京天气如何?"}]
})

追踪内容

在 LangSmith 界面可以看到:

  • 📝 完整对话历史 — 所有消息
  • 🔧 工具调用 — 调用了哪些工具,输入输出是什么
  • 🧠 模型调用 — Prompt、响应、Token 使用
  • ⏱️ 耗时分析 — 每个步骤的执行时间
  • 🔗 调用链 — 完整的执行流程

3.2 手动追踪

对于非 LangChain 代码,可以手动追踪:

from langsmith import traceable, Client

client = Client()

@traceable(run_type="chain")
def my_custom_function(input_data):
    # 你的逻辑
    result = process(input_data)
    return result

@traceable(run_type="llm")
def call_llm(prompt):
    # 调用 LLM
    response = llm.generate(prompt)
    return response

# 手动记录
with client.trace("my-project", "my-run") as run:
    result = my_custom_function("input")
    run.end(outputs={"result": result})

3.3 添加元数据

from langsmith import traceable

@traceable(
    metadata={"user_id": "123", "session_id": "abc"},
    tags=["production", "critical"],
)
def process_request(user_input):
    return agent.invoke({"messages": [{"role": "user", "content": user_input}]})

3.4 调试技巧

查看调用链

┌─────────────────────────────────────────────────────────────────┐
│                    LangSmith 追踪界面                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  Run: agent_invoke (2.3s)                                       │
│  ├─ ChatAnthropic (1.8s)                                        │
│  │  ├─ Prompt: 你是一个...                                      │
│  │  └─ Response: 我来帮你查...                                  │
│  ├─ Tool: search (0.3s)                                         │
│  │  ├─ Input: 北京天气                                          │
│  │  └─ Output: 晴朗,25°C                                       │
│  └─ ChatAnthropic (0.2s)                                        │
│     └─ Response: 北京今天晴朗...                                │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

过滤和搜索

# 在 LangSmith 界面可以按以下条件过滤:
# • 时间范围
# • 项目名称
# • 标签
# • 元数据(如 user_id)
# • 耗时(找出慢的调用)
# • 错误(只看不成功的)

四、评估与测试

4.1 创建数据集

from langsmith import Client

client = Client()

# 创建数据集
dataset = client.create_dataset(
    dataset_name="customer-support-qa",
    description="客服问答测试集",
)

# 添加示例
examples = [
    {
        "inputs": {"question": "如何退款?"},
        "outputs": {"answer": "请在订单页面申请退款..."},
    },
    {
        "inputs": {"question": "发货时间多久?"},
        "outputs": {"answer": "通常 1-3 个工作日发货..."},
    },
]

for example in examples:
    client.create_example(
        inputs=example["inputs"],
        outputs=example["outputs"],
        dataset_id=dataset.id,
    )

4.2 创建评估器

内置评估器

from langsmith.evaluation import evaluate, LangChainStringEvaluator

# 准确性评估
accuracy_evaluator = LangChainStringEvaluator("criteria", config={
    "criteria": {
        "accuracy": "回答是否准确反映了已知信息"
    }
})

# 相关性评估
relevance_evaluator = LangChainStringEvaluator("criteria", config={
    "criteria": {
        "relevance": "回答是否与问题相关"
    }
})

# 运行评估
results = evaluate(
    lambda inputs: agent.invoke(inputs)["messages"][-1].content,
    data=dataset,
    evaluators=[accuracy_evaluator, relevance_evaluator],
)

自定义评估器

from langsmith.evaluation import EvaluationResult

def custom_evaluator(run, example):
    # 自定义评估逻辑
    output = run.outputs["output"]
    
    # 检查是否包含关键词
    if "退款" in str(output) and "订单" in str(output):
        score = 1.0
    else:
        score = 0.5
    
    return EvaluationResult(
        key="custom_accuracy",
        score=score,
        comment="基于关键词匹配",
    )

# 使用自定义评估器
results = evaluate(
    agent_function,
    data=dataset,
    evaluators=[custom_evaluator],
)

4.3 运行评估

from langsmith.evaluation import evaluate

def run_agent(inputs):
    result = agent.invoke({"messages": [{"role": "user", "content": inputs["question"]}]})
    return {"answer": result["messages"][-1].content}

# 运行评估
results = evaluate(
    run_agent,
    data=dataset,
    evaluators=[
        LangChainStringEvaluator("accuracy"),
        LangChainStringEvaluator("relevance"),
        custom_evaluator,
    ],
    experiment_prefix="v2-model-test",
)

# 查看结果
print(f"实验 URL:{results.url}")

4.4 A/B 测试

# 评估不同模型
results_claude = evaluate(claude_agent, data=dataset, evaluators=evaluators)
results_gpt = evaluate(gpt_agent, data=dataset, evaluators=evaluators)

# 在 LangSmith 界面可以对比两个实验的结果

4.5 回归测试

# 将评估集成到 CI/CD
def test_agent_regression():
    results = evaluate(agent, data=dataset, evaluators=evaluators)
    
    # 检查准确率是否达标
    avg_accuracy = results["accuracy"]["avg"]
    assert avg_accuracy >= 0.85, f"准确率 {avg_accuracy} 低于阈值 0.85"

五、监控与分析

5.1 成本追踪

┌─────────────────────────────────────────────────────────────────┐
│                    LangSmith 成本分析                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  本月总成本:$1,234.56                                          │
│                                                                 │
│  按项目:                                                        │
│  ├─ customer-support: $567.89 (46%)                            │
│  ├─ research-assistant: $345.67 (28%)                          │
│  └─ chatbot: $321.00 (26%)                                     │
│                                                                 │
│  按模型:                                                        │
│  ├─ claude-sonnet-4-6: $789.12 (64%)                           │
│  ├─ gpt-4o: $345.67 (28%)                                      │
│  └─ gpt-4o-mini: $99.77 (8%)                                   │
│                                                                 │
│  趋势: ↑ 12% vs 上月                                            │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

5.2 性能监控

# 设置告警
from langsmith import Client

client = Client()

# 创建告警规则
client.create_alert(
    name="高延迟告警",
    condition="avg_latency_ms > 5000",
    project="customer-support",
    notification_channels=["email", "slack"],
)

5.3 使用分析

在 LangSmith 仪表板可以查看:

  • 📊 请求量趋势 — 每天/每周的请求数
  • 👥 用户分析 — 活跃用户、使用频率
  • 🌍 地域分布 — 用户来源
  • 📱 设备类型 — Web、Mobile、API

六、Prompt 管理

6.1 创建 Prompt

from langsmith import Client

client = Client()

# 创建 Prompt
prompt = client.create_prompt(
    name="customer-support-response",
    prompt_template="""你是一个客服助手。

## 风格
- 友好、专业
- 简洁明了
- 提供具体步骤

## 用户问题
{question}

## 已知信息
{context}

请基于已知信息回答用户问题。""",
    tags=["customer-support", "production"],
)

6.2 版本控制

# 更新 Prompt(创建新版本)
client.update_prompt(
    prompt_id=prompt.id,
    prompt_template="""...新版本内容...""",
    commit_message="添加退款流程说明",
)

# 查看历史版本
versions = client.list_prompt_versions(prompt_id=prompt.id)

# 回滚到旧版本
client.rollback_prompt(prompt_id=prompt.id, version=2)

6.3 在代码中使用

from langsmith import Client
from langchain.prompts import PromptTemplate

client = Client()

# 获取最新版本的 Prompt
prompt_data = client.get_prompt("customer-support-response")

# 转换为 LangChain Prompt
prompt = PromptTemplate.from_template(prompt_data.prompt_template)

# 使用
formatted = prompt.invoke({"question": "如何退款?", "context": "..."})

七、团队协作

7.1 项目共享

┌─────────────────────────────────────────────────────────────────┐
│                    LangSmith 权限管理                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  组织:MyCompany                                                │
│  │                                                              │
│  ├─ 项目:customer-support                                      │
│  │  ├─ Owner: 张三                                             │
│  │  ├─ Editor: 李四、王五                                      │
│  │  └─ Viewer: 整个团队                                        │
│  │                                                              │
│  ├─ 项目:research-assistant                                    │
│  │  ├─ Owner: 李四                                             │
│  │  └─ Editor: 张三                                            │
│  │                                                              │
│  └─ 项目:chatbot                                               │
│     ├─ Owner: 王五                                             │
│     └─ Viewer: 整个团队                                        │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

7.2 评论与反馈

在 LangSmith 界面:

  • 在任何追踪下添加评论
  • @提及团队成员
  • 标记问题为已解决
  • 分享最佳实践

八、高级功能

8.1 数据集转换

from langsmith import Client

client = Client()

# 从现有运行创建数据集
dataset = client.create_dataset_from_runs(
    dataset_name="production-qa",
    filters={"project_name": "customer-support"},
    limit=100,
)

8.2 在线评估

from langsmith.evaluation import run_on_dataset

# 持续评估生产环境
run_on_dataset(
    dataset="production-samples",
    llm_or_chain_factory=create_agent,
    evaluators=[accuracy_evaluator],
    concurrency_level=10,
)

8.3 自定义仪表板

# 使用 LangSmith API 获取数据
from langsmith import Client

client = Client()

# 获取指标
metrics = client.get_dataset_metrics(
    dataset_id=dataset.id,
    metrics=["accuracy", "latency"],
)

# 集成到自己的仪表板

九、最佳实践

9.1 追踪最佳实践

应该做:

# 为每个用户会话设置 thread_id
config = {"configurable": {"thread_id": user_session_id}}
agent.invoke(inputs, config=config)

# 添加有意义的元数据
@traceable(metadata={"user_id": user_id, "feature": "search"})
def search_feature(query):
    ...

# 使用标签分类
@traceable(tags=["production", "critical"])
def critical_function():
    ...

避免:

# 不要在追踪中记录敏感信息
@traceable(metadata={"password": "123"})  # ❌

# 不要过度追踪(成本考虑)
# 只在关键路径开启追踪

9.2 评估最佳实践

  • 数据集多样性 — 覆盖各种场景和边缘情况
  • 定期更新 — 随着产品迭代更新测试集
  • 多个评估指标 — 不要只看准确率
  • 人工审核 — 定期抽样人工检查

9.3 成本优化

  • 设置预算告警 — 避免意外超支
  • 分析 Token 使用 — 优化 Prompt 长度
  • 选择合适模型 — 不是所有场景都需要最强模型
  • 缓存结果 — 减少重复调用

十、定价与计划

计划价格适合场景
Developer免费个人开发、学习
Plus$39/月小团队、初创公司
Enterprise定制大型企业、定制需求

十一、常见问题

Q1: LangSmith 是必须的吗?

不是必须的,但强烈推荐。对于生产环境,LangSmith 可以节省大量调试和监控时间。

Q2: 数据隐私如何保障?

  • 数据加密存储
  • 可选自托管
  • GDPR 合规
  • 可配置数据保留策略

Q3: 支持非 LangChain 项目吗?

支持!可以使用 LangSmith SDK 追踪任何 Python/JavaScript 代码。


十二、学习资源


💡 提示: LangSmith 提供免费套餐,建议在学习 LangChain 时就开启追踪,养成良好的调试习惯。