使用 LangSmith 跟踪 LLM 应用

我们用 LangChain 开发 AI 应用时,程序往往会拆成好多步执行,还要反复调用大模型(LLM)。

项目一旦写得复杂之后,开发者就会遇到一个问题:程序里面每一步到底干了什么?大模型每一次返回了啥?哪里慢了、哪里报错了?完全看不到。

想要清晰排查、监控、复盘 AI 程序的内部执行细节,最好用工具:LangSmith

1. LangSmith 是什么?

它是一个专门给 AI 应用做监控、日志、调试、评估的在线平台。

特点:

  • 不绑定框架,不管你用 LangChain、LangGraph,还是别的工具,都能搭配使用;

  • 主打帮你开发、上线正式可用的 AI 项目

  • 全程记录你的程序每一步:调用记录、输入输出、耗时、报错、链路流程。

2. 官网地址

LangSmith 官网:https://smith.langchain.com/第一次使用需要注册账号。

3. 怎么开启监控?

想要让 LangSmith 抓取并记录你的 AI 程序运行日志,只需要两步基础操作:

  1. 登录官网后,找到 Settings(设置)
  2. 在设置页面里找到 API Keys 选项,复制你的专属密钥。

后面代码里填上这个密钥/或者直接设置到环境变量中,我们的所有 LLM 调用、链式执行流程,就会自动被 LangSmith 全程记录、可视化展示。


创建完成后,保存好自己的 API Key。

接下来配置两个环境变量:

1  LANGSMITH_TRACING="true"
2  LANGSMITH_API_KEY="你的 LangSmith API Key"

配置完成后,让我们任意执行代码:

# 导入需要用到的库
# 大模型对话能力
from langchain_openai import ChatOpenAI
# 用于定义结构化输出的数据格式
from pydantic import BaseModel, Field
# 用于定义自定义工具
from langchain_core.tools import tool
# 用于构建用户消息
from langchain_core.messages import HumanMessage

# -------------------------- 1. 初始化大模型 --------------------------
# 定义我们要使用的大模型,这里用 gpt-4o-mini
model = ChatOpenAI(model="gpt-4o-mini")

# -------------------------- 2. 定义结构化输出格式 --------------------------
# 定义一个数据结构,让 AI 必须按照这个格式返回结果
class SearchResult(BaseModel):
    """结构化搜索结果。"""  # 给 AI 看的说明

    # 搜索关键词
    query: str = Field(description="搜索查询")
    # 搜索结果摘要
    findings: str = Field(description="调查结果摘要")

# -------------------------- 3. 定义一个自定义工具(模拟联网搜索) --------------------------
# 用 @tool 装饰器把一个函数变成 AI 可以调用的工具
@tool
def web_search(query: str) -> str:
    """在网上搜索信息。
    Args:
        query: 搜索查询
    """
    # 这里是模拟搜索,真实场景可以调用搜索引擎 API
    return "西安今天多云转小雨,气温18-23度,东南风2级,空气质量良好"

# -------------------------- 4. 让模型绑定工具(AI 可以调用搜索) --------------------------
model_with_search = model.bind_tools([web_search])

# -------------------------- 5. 构造用户提问 --------------------------
# 用户问题:让 AI 查西安天气
messages = [
    HumanMessage("搜索当前最新的西安的天气")
]

# -------------------------- 6. 第一次调用 AI --------------------------
# 模型会判断:需要调用工具 → 返回工具调用指令,不直接给答案
response = model_with_search.invoke(messages)

# 把模型返回的结果(工具调用指令)加入消息列表
messages.append(response)

# -------------------------- 7. 执行工具调用(真正运行搜索) --------------------------
# 遍历模型想调用的工具
for tool_call in response.tool_calls:
    # 运行 web_search 工具
    tool_msg = web_search.invoke(tool_call)
    # 把工具返回的结果(天气信息)加入消息列表
    messages.append(tool_msg)

# -------------------------- 8. 第二次调用 AI,让它返回结构化结果 --------------------------
# 让模型必须按照我们定义的 SearchResult 格式输出
structured_search_model = model.with_structured_output(SearchResult)

# 把所有消息(问题 + 工具结果)传给模型
result = structured_search_model.invoke(messages)

# 打印最终结构化结果
print(result)

查看 LangSmith 平台,这将在 LangSmith 的默认跟踪项目中生成调用的跟踪。点击最新一次的调用追踪:

跟踪会以瀑布流形式展示调用的完整步骤,以及每个步骤的详细信息和耗时。让我们能够检查内部到底发生了什么!!

解释:

RunnableSequence:可运行序列,就是我们之前讲过的链,即我们将 model_with_search.invoke() 的结果(构造成 ToolMessage),当作入参传递给 structured_search_model.invoke()

说明:本次调用是 RunnableSequence。但不是每次都展示 RunnableSequence,根据实际情况而定。

ChatOpenAI:实际处理的第一步内容,调用聊天模型,生成结果。

RunnableLambda:实际处理的第二步内容,表示将 Python 可调用对象转换为 Runnable,其实就是将 AI 生成的结果转换成为结构化对象。

可以看到我们在使用 LangSmith 时没有多余代码介入,只需要简单配置环境变量,就可以全程监控我们的大模型应用执行流程。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐