Skip to content

LangChain 教程 28|LangSmith Studio:Agent 开发的显微镜

📖 本篇导读:这是 LangChain 系列教程的第 28 篇。本篇将深入讲解 LangSmith Studio 的核心功能,包括执行追踪、状态可视化、性能分析和错误定位。读完预计需要 10 分钟。

简单来说

想象你在开发一个复杂的 Agent,用户说:"帮我发一封邮件给张三"。Agent 应该:

  1. 理解用户意图
  2. 调用 send_email 工具
  3. 返回结果

但实际运行时,Agent 没有发邮件,只是说"好的,我帮你发了"。

出了什么问题?

  • LLM 没有调用工具?
  • 工具调用了但参数错误?
  • 工具返回了错误但 Agent 忽略了?

没有可视化工具,你只能加一堆 console.log,然后在满屏日志中大海捞针。

盲目调试 vs Studio 可视化对比

LangSmith Studio 就是为此而生的"显微镜"——它让你看见 Agent 内部发生的一切:

┌─────────────────────────────────────────────────────────┐
│  LangSmith Studio                                       │
├─────────────────────────────────────────────────────────┤
│  Step 1: User Input                                     │
│  └── "帮我发邮件给张三"                                  │
│                                                         │
│  Step 2: LLM Call                                       │
│  ├── Prompt: [系统提示 + 用户消息]                       │
│  ├── Response: tool_call: send_email                    │
│  └── Tokens: 150 | Latency: 800ms                       │
│                                                         │
│  Step 3: Tool Execution                                 │
│  ├── Tool: send_email                                   │
│  ├── Args: { to: "zhangsan@example.com", ... }          │
│  └── Result: "Email sent successfully"                  │
│                                                         │
│  Step 4: Final Response                                 │
│  └── "已成功发送邮件给张三"                              │
└─────────────────────────────────────────────────────────┘

本节目标

  1. 理解 LangSmith Studio 解决什么问题
  2. 学会搭建本地 Agent 服务器
  3. 掌握 Studio 的核心调试功能
  4. 了解热重载和状态回放

业务场景

假设你在开发一个邮件助手 Agent

typescript
import { createAgent, tool } from "langchain";
import * as z from "zod";

const sendEmail = tool(
  async ({ to, subject, body }) => {
    // 发送邮件逻辑
    return `Email sent to ${to}`;
  },
  {
    name: "send_email",
    description: "发送邮件",
    schema: z.object({
      to: z.string().describe("收件人邮箱"),
      subject: z.string().describe("邮件主题"),
      body: z.string().describe("邮件正文")
    })
  }
);

const emailAgent = createAgent({
  model: "gpt-4.1",
  tools: [sendEmail],
  systemPrompt: "你是一个邮件助手。始终使用 send_email 工具发送邮件。"
});

开发过程中你会遇到这些问题:

  1. Agent 不调用工具 —— 直接回复"好的"但没执行
  2. 工具参数错误 —— 邮箱格式不对、主题为空
  3. 多步骤调试难 —— 复杂流程不知道哪一步出错
  4. 性能问题 —— 不知道哪一步耗时最长

LangSmith Studio 能帮你一眼看清所有这些问题。

环境准备

1. 注册 LangSmith 账号

访问 smith.langchain.com 注册免费账号。

2. 获取 API Key

在 LangSmith 设置页面创建 API Key。

3. 安装 LangGraph CLI

bash
# Python >= 3.11 required
pip install --upgrade "langgraph-cli[inmem]"

搭建本地 Agent 服务器

项目结构

my-email-agent/
├── src/
│   └── agent.ts        # Agent 代码
├── .env                # 环境变量
└── langgraph.json      # LangGraph 配置

Step 1:编写 Agent 代码

typescript
// src/agent.ts
import { createAgent, tool } from "langchain";
import * as z from "zod";

const sendEmail = tool(
  async ({ to, subject, body }) => {
    console.log(`Sending email to ${to}...`);
    // 实际的邮件发送逻辑
    return `Email sent to ${to} with subject "${subject}"`;
  },
  {
    name: "send_email",
    description: "发送邮件给指定收件人",
    schema: z.object({
      to: z.string().email().describe("收件人邮箱地址"),
      subject: z.string().min(1).describe("邮件主题"),
      body: z.string().describe("邮件正文内容")
    })
  }
);

export const agent = createAgent({
  model: "gpt-4.1",
  tools: [sendEmail],
  systemPrompt: `你是一个专业的邮件助手。

职责:
- 帮用户撰写和发送邮件
- 始终使用 send_email 工具发送邮件
- 发送前确认收件人、主题和正文

注意:
- 如果用户没有提供收件人邮箱,请询问
- 邮件正文要专业、礼貌`
});

Step 2:配置环境变量

bash
# .env
LANGSMITH_API_KEY=lsv2_your_api_key_here
OPENAI_API_KEY=sk-your_openai_key_here

# 可选:禁用追踪(数据不会发送到 LangSmith 云端)
# LANGSMITH_TRACING=false

⚠️ 重要:确保 .env 文件不被提交到 Git!

Step 3:创建 LangGraph 配置

json
// langgraph.json
{
  "dependencies": ["."],
  "graphs": {
    "email_agent": "./src/agent.ts:agent"
  },
  "env": ".env"
}

Step 4:安装依赖

bash
npm install langchain @langchain/openai zod

Step 5:启动开发服务器

bash
langgraph dev

启动后,你会看到:

  • API 端点http://127.0.0.1:2024
  • Studio UI:自动打开浏览器

搭建本地 Agent 服务器流程

Studio 核心功能

功能 1:实时执行追踪

每一步执行都清晰可见:

┌─ Thread: 新对话 ─────────────────────────────────────┐
│                                                      │
│  [User] 帮我给 john@example.com 发一封会议邀请       │
│                                                      │
│  [LLM Call]                                          │
│  ├─ Model: gpt-4.1                                   │
│  ├─ Tokens: Input 180 / Output 45                    │
│  ├─ Latency: 1.2s                                    │
│  └─ Response: tool_call → send_email                 │
│                                                      │
│  [Tool: send_email]                                  │
│  ├─ Args:                                            │
│  │   to: "john@example.com"                          │
│  │   subject: "会议邀请"                              │
│  │   body: "您好,诚邀您参加..."                      │
│  ├─ Duration: 50ms                                   │
│  └─ Result: "Email sent to john@example.com..."      │
│                                                      │
│  [Assistant] 已成功发送会议邀请给 john@example.com   │
│                                                      │
└──────────────────────────────────────────────────────┘

功能 2:Prompt 检查

点击任意 LLM 调用,可以看到完整的 Prompt:

System: 你是一个专业的邮件助手...

User: 帮我给 john@example.com 发一封会议邀请

Tools: [
  {
    name: "send_email",
    description: "发送邮件给指定收件人",
    parameters: { to, subject, body }
  }
]

这对于调试"为什么 Agent 没有调用工具"非常有用 —— 可能是 Prompt 里根本没包含工具描述!

功能 3:热重载

修改代码后,Studio 自动刷新,无需重启服务器:

typescript
// 修改前
systemPrompt: "你是一个邮件助手"

// 修改后 - 保存文件,Studio 自动更新
systemPrompt: "你是一个专业的邮件助手,必须使用 send_email 工具"

这让迭代速度极快 —— 改 Prompt、看效果、再改、再看,几秒钟一个循环。

功能 4:状态回放(Time Travel)

最强大的功能 —— 从任意步骤重新开始执行:

对话执行了 5 步,第 3 步工具调用失败

传统调试:从头开始,重新输入,等待前两步执行
Studio:点击第 2 步的"从这里重新开始",直接跳到第 3 步

这对于调试长流程特别有用,节省大量等待时间。

功能 5:性能指标

每一步都有详细的性能数据:

指标说明用途
Tokens输入/输出 Token 数成本估算
Latency响应时间性能瓶颈定位
Model使用的模型确认配置正确

LangSmith Studio 五大核心功能

调试实战

场景 1:Agent 不调用工具

现象:用户说"发邮件",Agent 直接回复"好的,已发送"

Studio 诊断

  1. 查看 LLM Call 的 Response
  2. 发现没有 tool_calls,只有纯文本回复
  3. 检查 Prompt,发现系统提示没有明确要求使用工具

修复

typescript
// 修改前
systemPrompt: "你是一个邮件助手"

// 修改后
systemPrompt: "你是一个邮件助手。发送邮件时必须使用 send_email 工具,不要只是说已发送。"

场景 2:工具参数错误

现象:邮件发送失败

Studio 诊断

  1. 查看 Tool Execution 的 Args
  2. 发现 to: "张三" 而不是邮箱地址
  3. 工具的 Schema 验证失败

修复

typescript
// 在系统提示中明确要求
systemPrompt: `...
发送邮件前,确保收件人是有效的邮箱地址(xxx@xxx.com 格式)。
如果用户只提供了名字,请询问邮箱地址。`

场景 3:多步骤流程调试

现象:复杂任务执行到一半失败

Studio 诊断

  1. 展开完整的执行轨迹
  2. 找到失败的那一步
  3. 查看该步的输入、输出和错误信息
  4. 使用"从这里重新开始"测试修复

Studio 调试诊断框架

最佳实践

1. 开发时始终开启 Studio

bash
# 开发环境始终这样启动
langgraph dev

console.log 调试高效 10 倍。

2. Safari 用户使用 Tunnel

Safari 会阻止 localhost 连接,使用 --tunnel 参数:

bash
langgraph dev --tunnel

3. 敏感数据保护

如果不想让数据发送到云端:

bash
# .env
LANGSMITH_TRACING=false

这样 Studio 仍然可用,但数据只在本地。

4. 利用状态回放加速调试

复杂流程调试顺序:
1. 完整执行一次,找到失败点
2. 修改代码
3. 从失败点的前一步重新开始
4. 验证修复
5. 重复直到成功

传统调试 vs Studio 调试对比

完整示例:邮件助手开发流程

typescript
// src/agent.ts
import { createAgent, tool } from "langchain";
import * as z from "zod";

const sendEmail = tool(
  async ({ to, subject, body }) => {
    // 验证邮箱格式
    if (!to.includes("@")) {
      throw new Error(`Invalid email address: ${to}`);
    }
    
    // 模拟发送
    console.log(`📧 Sending email...`);
    console.log(`   To: ${to}`);
    console.log(`   Subject: ${subject}`);
    console.log(`   Body: ${body.substring(0, 50)}...`);
    
    return `Email sent successfully to ${to}`;
  },
  {
    name: "send_email",
    description: "发送邮件。必须提供有效的邮箱地址。",
    schema: z.object({
      to: z.string().email().describe("收件人邮箱地址(必须是 xxx@xxx.com 格式)"),
      subject: z.string().min(1).describe("邮件主题(不能为空)"),
      body: z.string().min(10).describe("邮件正文(至少 10 个字符)")
    })
  }
);

const draftEmail = tool(
  async ({ purpose, tone }) => {
    const templates = {
      meeting: "您好,\n\n诚邀您参加...",
      followup: "您好,\n\n感谢您上次的沟通...",
      introduction: "您好,\n\n我是..."
    };
    return templates[purpose] || "您好,\n\n...";
  },
  {
    name: "draft_email",
    description: "生成邮件草稿",
    schema: z.object({
      purpose: z.enum(["meeting", "followup", "introduction"]).describe("邮件目的"),
      tone: z.enum(["formal", "casual"]).describe("语气风格")
    })
  }
);

export const agent = createAgent({
  model: "gpt-4.1",
  tools: [sendEmail, draftEmail],
  systemPrompt: `你是一个专业的邮件助手。

## 工作流程
1. 理解用户的邮件需求
2. 如果需要,使用 draft_email 生成草稿
3. 确认收件人邮箱地址(必须是 xxx@xxx.com 格式)
4. 使用 send_email 发送邮件

## 重要规则
- 发送邮件必须使用 send_email 工具
- 如果用户没有提供邮箱地址,必须询问
- 发送前确认主题和正文

## 错误处理
- 如果邮箱格式不对,提示用户重新提供
- 如果发送失败,告知用户具体错误`
});

开发流程:

  1. 启动 Studiolanggraph dev
  2. 测试基本功能:在 Studio 中输入"帮我发邮件给 test@example.com"
  3. 检查执行轨迹:确认工具被正确调用
  4. 测试边界情况:输入"发邮件给张三",看 Agent 是否询问邮箱
  5. 性能优化:查看每一步的延迟,优化慢的部分
  6. 迭代改进:修改 Prompt,立即看到效果

本章小结

LangSmith Studio 的核心价值:

  1. 可视化调试

    • 看见每一步的输入输出
    • 检查完整的 Prompt
    • 追踪工具调用和返回值
  2. 开发效率

    • 热重载,改代码立即生效
    • 状态回放,从任意步骤重新开始
    • 比 console.log 高效 10 倍
  3. 性能分析

    • Token 使用量
    • 响应延迟
    • 瓶颈定位
  4. 最佳实践

    • 开发时始终开启 Studio
    • 利用状态回放加速调试
    • 敏感数据可以禁用云端追踪

Studio 是 Agent 开发的必备工具,就像 Chrome DevTools 之于前端开发一样重要!

下一篇我们介绍 Agent Chat UI —— 快速搭建 Agent 聊天界面。

读文档、看源码、写代码,理解 AI Agent 本质 🤖