Skip to content

LangSmith:LLM 可观测性平台

本节介绍 LangSmith——LangChain 官方推出的 LLM 应用可观测性平台,深入分析其功能特性、优缺点,并与 Langfuse 进行对比。

重要提醒:LangSmith 不支持自托管

LangSmith 目前不能自托管(self-host),只能使用 LangChain 官方提供的云服务。

LangChain 官方明确表示 LangSmith 是完全托管(fully-managed)的 SaaS 服务,不提供本地部署版本,也不开放源码。官方文档明确指出 LangSmith 是 hosted platform,用户只能通过 API key 使用。

为什么不能本地部署?

原因说明
核心代码不开源LangSmith 的 UI、后端逻辑、追踪系统、评估组件等全部闭源
SaaS 商业模式设计为托管式服务,类似 Sentry、Datadog、Weights & Biases

需要自托管?请使用 Langfuse

如果你需要本地追踪 / 本地评估 / 不上传数据到云端,推荐使用 Langfuse

  • 完全开源(MIT 协议)
  • 支持自托管(Docker 一键启动)
  • 功能与 LangSmith 非常接近:trace、prompt 管理、evaluation、token usage
  • 与 LangChain/LangGraph 集成良好
  • 适合处理敏感数据的场景(医疗、金融等)

详细的 Langfuse 介绍和部署指南请参见 15.2 Langfuse


概述

LangSmith 是由 LangChain 团队开发的闭源 LLMOps 平台,专为开发、调试和部署 LLM 应用而设计。作为 LangChain 生态系统的官方可观测性工具,它提供了从开发到生产的全流程支持。

LangSmith 可观测性平台概览

mermaid
graph TB
    subgraph LangSmith Platform
        A[Tracing 追踪] --> E[Unified Dashboard]
        B[Evaluation 评估] --> E
        C[Prompt Hub 提示词管理] --> E
        D[Deployment 部署] --> E
    end

    F[LangChain App] --> A
    G[LangGraph Agent] --> A
    H[Custom LLM App] --> A

    E --> I[Insights & Analytics]

核心价值

能力描述
可观测性完整追踪 LLM 应用的每个步骤,快速定位问题
评估跟踪质量指标,确保 AI 系统的一致性和可靠性
提示词工程版本控制和协作工具,加速提示词迭代
部署将 Agent 部署为生产级 Agent Server

快速开始

环境配置

只需设置一个环境变量即可启用 LangSmith 追踪:

python
import os

# 设置 LangSmith 环境变量
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-langsmith-api-key"
os.environ["LANGCHAIN_PROJECT"] = "my-project"  # 可选,默认为 "default"

使用 LangChain 自动追踪

python
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 初始化 LLM
llm = ChatOpenAI(model="gpt-4o-mini")

# 所有调用自动追踪到 LangSmith
response = llm.invoke([HumanMessage(content="Hello, world!")])
print(response.content)

使用 LangGraph 追踪

python
from langgraph.graph import StateGraph, START, END
from typing import TypedDict

class State(TypedDict):
    messages: list

def chatbot(state: State):
    response = llm.invoke(state["messages"])
    return {"messages": state["messages"] + [response]}

# 构建图
graph = StateGraph(State)
graph.add_node("chatbot", chatbot)
graph.add_edge(START, "chatbot")
graph.add_edge("chatbot", END)

app = graph.compile()

# 运行时自动追踪整个图的执行过程
result = app.invoke({"messages": [HumanMessage(content="Hi!")]})

核心功能详解

1. 追踪 (Tracing)

LangSmith 的追踪功能提供了对 LLM 应用执行过程的完整可见性。

LangSmith Agent 追踪功能

mermaid
graph LR
    A[User Input] --> B[Chain Start]
    B --> C[LLM Call 1]
    C --> D[Tool Call]
    D --> E[LLM Call 2]
    E --> F[Output]

    style B fill:#e1f5fe
    style C fill:#fff3e0
    style D fill:#f3e5f5
    style E fill:#fff3e0
    style F fill:#e8f5e9

追踪能力包括:

  • 层级追踪:查看嵌套的调用链,从顶层 Chain 到底层 LLM 调用
  • 延迟分析:每个步骤的耗时,识别性能瓶颈
  • Token 统计:输入/输出 Token 数量和成本计算
  • 错误追踪:捕获异常和错误信息

追踪数据示例:

text
Run: my-chatbot-run
├── Chain: ConversationalRetrievalChain (2.3s, $0.002)
│   ├── Retriever: VectorStoreRetriever (0.5s)
│   │   └── Query: "How to use LangGraph?"
│   ├── LLM: ChatOpenAI (1.5s, 450 tokens)
│   │   ├── Input: "Context: ... Question: ..."
│   │   └── Output: "LangGraph is..."
│   └── Output Parser (0.1s)
└── Final Output: "LangGraph is a library for..."

2. 评估 (Evaluation)

LangSmith 提供在线和离线评估能力,帮助确保 LLM 应用的质量。

python
from langsmith import Client
from langsmith.evaluation import evaluate

client = Client()

# 定义评估器
def correctness_evaluator(run, example):
    """评估答案是否正确"""
    prediction = run.outputs.get("output")
    reference = example.outputs.get("answer")

    # 使用 LLM 作为评判者
    score = llm.invoke(
        f"Compare prediction '{prediction}' with reference '{reference}'. "
        f"Score from 0-1 for correctness."
    )
    return {"key": "correctness", "score": float(score.content)}

# 运行评估
results = evaluate(
    lambda inputs: my_chain.invoke(inputs),
    data="my-dataset",
    evaluators=[correctness_evaluator],
)

评估类型:

评估类型描述适用场景
自动评估使用 LLM 作为评判者语义相似度、事实准确性
规则评估基于规则的评分格式检查、关键词匹配
人工评估人工标注队列复杂任务、质量把控

3. 提示词管理 (Prompt Hub)

LangSmith 的 Prompt Hub 提供提示词的版本控制和团队协作功能。

python
from langchain import hub

# 从 Hub 拉取提示词
prompt = hub.pull("rlm/rag-prompt")

# 使用提示词
chain = prompt | llm

# 推送新版本到 Hub
hub.push("my-org/my-prompt", prompt)

Prompt Hub 功能:

  • 版本控制:追踪提示词的每次修改
  • A/B 测试:比较不同版本的效果
  • 团队协作:共享和复用提示词
  • Playground:在线测试和调试

4. 监控与告警

LangSmith 业务监控面板

mermaid
graph TD
    A[Production Traffic] --> B[LangSmith]
    B --> C{Metrics Analysis}
    C --> D[Latency Dashboard]
    C --> E[Error Rate Monitor]
    C --> F[Cost Tracker]
    C --> G[Alert Rules]
    G -->|Threshold Exceeded| H[Notification]

监控能力:

  • 实时仪表板:追踪关键业务指标
  • 告警系统:问题发生时及时通知
  • 自动洞察:发现相似对话的聚类,识别用户需求和系统性问题

LangSmith 使用模式发现


定价方案

方案价格Traces适用对象
Developer免费5k/月个人开发者
Plus$39/席位/月10k/月成长中的团队
Enterprise定制无限制大型企业

注意事项:

  • 超出基础配额后按 $0.50/1k traces 计费
  • Enterprise 版支持自托管和 SSO
  • 有专门的 Startup 和教育优惠计划

LangSmith 优点

1. 与 LangChain/LangGraph 深度集成

python
# 只需一个环境变量,零代码改动
os.environ["LANGCHAIN_TRACING_V2"] = "true"

# 自动追踪所有 LangChain 组件
chain = prompt | llm | parser  # 自动追踪
agent = create_react_agent(...)  # 自动追踪
graph = StateGraph(...)  # 自动追踪

这是 LangSmith 最大的优势——对于 LangChain 生态用户来说,几乎是零配置即可使用。

2. 功能全面的一站式平台

mermaid
graph LR
    A[开发] --> B[调试]
    B --> C[评估]
    C --> D[部署]
    D --> E[监控]
    E --> A

    style A fill:#e3f2fd
    style B fill:#fff3e0
    style C fill:#e8f5e9
    style D fill:#fce4ec
    style E fill:#f3e5f5

覆盖 LLM 应用的完整生命周期:

  • 开发:Prompt Playground
  • 调试:详细追踪
  • 评估:自动化测试
  • 部署:Agent Server
  • 监控:生产仪表板

3. 企业级安全合规

  • HIPAA 合规:医疗数据安全
  • SOC 2 Type 2:安全控制审计
  • GDPR 合规:欧洲数据保护
  • 不使用用户数据训练模型

4. 零延迟设计

python
# SDK 使用异步回调发送追踪数据
# 不影响应用的响应延迟
response = llm.invoke(message)  # 追踪在后台异步进行

5. OpenTelemetry 支持

python
# 支持 OTel 标准,不限于 Python/TypeScript
from opentelemetry import trace
from langsmith.otel import wrap_opentelemetry

# 集成现有的 OTel 基础设施
tracer = trace.get_tracer(__name__)
wrapped_tracer = wrap_opentelemetry(tracer)

LangSmith 缺点

1. 闭源与厂商锁定

mermaid
graph TD
    A[LangSmith 闭源] --> B[无法查看源码]
    A --> C[依赖 LangChain 公司]
    A --> D[迁移成本高]

    B --> E[安全审计困难]
    C --> F[定价可能变化]
    D --> G[切换框架时数据不可迁移]

影响:

  • 无法自定义核心功能
  • 切换到其他框架时,LangSmith 的洞察无法复用
  • 企业可能对闭源解决方案有顾虑

2. 自托管需要企业版授权

部署方式LangSmithLangfuse
云托管所有方案所有方案
自托管需企业授权免费开源

对于需要数据不离开自己环境的团队,LangSmith 的成本显著更高。

3. 框架耦合性

虽然 LangSmith 支持任意 LLM 应用,但:

  • 与 LangChain/LangGraph 的集成最为流畅
  • 使用其他框架(如 LlamaIndex、Haystack)需要额外配置
  • 如果未来迁移框架,LangSmith 的价值会大打折扣

4. 定价对中小团队可能偏高

text
场景:中型团队,月均 100k traces

LangSmith Plus:
- 3 席位 × $39 = $117/月
- 额外 90k traces × $0.50/1k = $45/月
- 总计: ~$162/月

Langfuse 自托管:
- 服务器成本: ~$50-100/月
- 无 trace 限制

5. 实时防护能力有限

LangSmith 主要是事后可观测性工具,而非实时防护系统:

  • 缺少实时 Guardrails
  • 无法在请求时拦截问题内容
  • 主要用于分析和调试,而非主动防护

LangSmith vs Langfuse 对比

详细的 Langfuse 介绍请参见 15.2 Langfuse

核心差异总览

mermaid
graph TB
    subgraph LangSmith
        LS1[闭源]
        LS2[LangChain 原生]
        LS3[付费自托管]
        LS4[深度集成]
    end

    subgraph Langfuse
        LF1[开源 MIT]
        LF2[框架无关]
        LF3[免费自托管]
        LF4[灵活集成]
    end

详细对比表

维度LangSmithLangfuse
开源状态闭源MIT 开源
自托管成本需企业授权免费
LangChain 集成原生支持良好支持
框架无关性一般优秀
社区活跃度官方维护社区活跃
数据控制云端为主完全控制
企业功能全面基础
Prompt Hub内置需外部方案
Agent 部署内置需外部方案

如何选择?

mermaid
flowchart TD
    A[开始选择] --> B{使用 LangChain/LangGraph?}
    B -->|是| C{需要自托管?}
    B -->|否| D{框架多样性重要?}

    C -->|是| E{预算充足?}
    C -->|否| F[LangSmith Plus]

    E -->|是| G[LangSmith Enterprise]
    E -->|否| H[Langfuse 自托管]

    D -->|是| H
    D -->|否| I{看重一站式体验?}

    I -->|是| F
    I -->|否| H

选择 LangSmith 的场景:

  • 全力投入 LangChain/LangGraph 生态
  • 追求开箱即用的体验
  • 需要 Prompt Hub 和 Agent 部署功能
  • 预算充足,看重官方支持

选择 Langfuse 的场景:

  • 使用多种 LLM 框架
  • 需要自托管且预算有限
  • 看重开源和数据控制
  • 希望保持框架灵活性

实战示例:LangGraph Agent 追踪

以下是一个完整的 LangGraph Agent 示例,展示 LangSmith 如何追踪复杂的 Agent 执行过程:

python
"""
LangGraph Agent with LangSmith Tracing
展示如何使用 LangSmith 追踪 Agent 的执行过程
"""

import os
from typing import TypedDict, Annotated
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.tools import tool
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import ToolNode
import operator

# ========== 1. 配置 LangSmith ==========

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-langsmith-api-key"
os.environ["LANGCHAIN_PROJECT"] = "langgraph-agent-demo"

# ========== 2. 定义工具 ==========

@tool
def search_weather(city: str) -> str:
    """查询指定城市的天气信息"""
    # 模拟天气 API
    weather_data = {
        "北京": "晴天,25°C,空气质量良好",
        "上海": "多云,28°C,湿度较高",
        "深圳": "小雨,30°C,建议带伞",
    }
    return weather_data.get(city, f"未找到{city}的天气信息")

@tool
def calculate(expression: str) -> str:
    """计算数学表达式"""
    try:
        result = eval(expression)
        return f"{expression} = {result}"
    except Exception as e:
        return f"计算错误: {str(e)}"

@tool
def search_knowledge(query: str) -> str:
    """搜索知识库"""
    # 模拟知识库
    knowledge = {
        "LangGraph": "LangGraph 是一个用于构建有状态多 Actor 应用的库",
        "LangSmith": "LangSmith 是 LangChain 的可观测性平台",
    }
    for key, value in knowledge.items():
        if key.lower() in query.lower():
            return value
    return "未找到相关信息"

tools = [search_weather, calculate, search_knowledge]

# ========== 3. 初始化 LLM ==========

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
llm_with_tools = llm.bind_tools(tools)

# ========== 4. 定义 State ==========

class AgentState(TypedDict):
    messages: Annotated[list, operator.add]

# ========== 5. 定义节点函数 ==========

def call_model(state: AgentState) -> dict:
    """调用 LLM"""
    messages = state["messages"]
    response = llm_with_tools.invoke(messages)
    return {"messages": [response]}

def should_continue(state: AgentState) -> str:
    """判断是否需要继续调用工具"""
    last_message = state["messages"][-1]
    if hasattr(last_message, "tool_calls") and last_message.tool_calls:
        return "tools"
    return END

# ========== 6. 构建 Graph ==========

graph = StateGraph(AgentState)

# 添加节点
graph.add_node("agent", call_model)
graph.add_node("tools", ToolNode(tools))

# 添加边
graph.add_edge(START, "agent")
graph.add_conditional_edges(
    "agent",
    should_continue,
    {"tools": "tools", END: END}
)
graph.add_edge("tools", "agent")

# 编译
agent = graph.compile()

# ========== 7. 运行 Agent ==========

if __name__ == "__main__":
    # 测试 1: 天气查询
    print("=" * 50)
    print("测试 1: 天气查询")
    print("=" * 50)

    result = agent.invoke({
        "messages": [
            SystemMessage(content="你是一个有用的助手,可以查询天气、计算数学表达式、搜索知识。"),
            HumanMessage(content="北京今天天气怎么样?")
        ]
    })
    print(f"回答: {result['messages'][-1].content}\n")

    # 测试 2: 多工具调用
    print("=" * 50)
    print("测试 2: 多工具调用")
    print("=" * 50)

    result = agent.invoke({
        "messages": [
            SystemMessage(content="你是一个有用的助手,可以查询天气、计算数学表达式、搜索知识。"),
            HumanMessage(content="请帮我做三件事:1) 查询上海的天气 2) 计算 123 * 456 3) 介绍一下 LangGraph")
        ]
    })
    print(f"回答: {result['messages'][-1].content}\n")

    print("=" * 50)
    print("追踪数据已发送到 LangSmith")
    print("访问 https://smith.langchain.com 查看详细追踪")
    print("=" * 50)

LangSmith 追踪视图

运行上述代码后,在 LangSmith 控制台可以看到:

text
Run: langgraph-agent-demo
├── Graph: AgentState (2.5s, $0.003)
│   ├── Node: agent (0.8s)
│   │   └── LLM: ChatOpenAI
│   │       ├── Input: "你是一个有用的助手..."
│   │       └── Output: [tool_calls: search_weather]
│   ├── Node: tools (0.1s)
│   │   └── Tool: search_weather
│   │       ├── Input: {"city": "北京"}
│   │       └── Output: "晴天,25°C,空气质量良好"
│   └── Node: agent (0.6s)
│       └── LLM: ChatOpenAI
│           └── Output: "北京今天天气晴朗..."
└── Final Output: "北京今天天气晴朗,温度25°C..."

总结

LangSmith 定位

LangSmith 是 LangChain 生态的官方可观测性平台,为使用 LangChain/LangGraph 的团队提供:

  • 零配置的深度追踪
  • 一站式的开发-调试-评估-部署体验
  • 企业级的安全合规保障

适用场景

推荐使用考虑替代方案
全栈 LangChain 项目多框架混合项目
快速原型开发严格的成本控制
需要 Prompt Hub需要完全数据控制
有预算的企业团队开源优先的团队

下一步

15.2 Langfuse 中,我们将详细介绍开源替代方案 Langfuse,帮助你做出更适合自己项目的选择。


参考资源

基于 MIT 许可证发布。内容版权归作者所有。