使用 LangChain 创建一个简单的 Agent

本文参考 LangChain 官方示例,实现大模型调用、一个天气工具调用、LangSmith 的简单使用,算是我的学习笔记

AI Agent(智能体)是能够自主理解任务、规划步骤、调用工具,并在不需要人类逐步指令的情况下完成复杂任务的 AI 系统。

总结:AI Agent = "能自己想、能自己查、能自己做"的智能程序(不是简单聊天,而是能执行任务)。

LangChain 和 AI SDK

LangChain

LangChain 是一个 用于构建基于大模型(LLM)的应用的开发框架,帮助你把模型、数据源、工具、工作流串起来,更容易做出真实可用的 AI 应用。

简单理解为:LangChain = 一套 LLM 应用的"胶水 + 工具库 + 工作流框架"。

LangChain 和 langgraph: LangChain 代理建立在 LangGraph 之上

官方说:想要快速构建代理和自主应用程序,我们推荐使用 LangChain。当你有更高级的需求,需要结合确定性流程和代理式流程、大量定制以及严格控制延迟时,使用我们的低级代理编排框架和运行时 LangGraph。

然后还有一个 LangSmith 主要用来支持 LLM(大语言模型)应用 的开发、调试、测试和监控

AI SDK

AI SDK 是由 Vercel 推出的一个用于构建 AI 驱动应用的 JavaScript/TypeScript 工具包。

它的核心目标是:让前端/全栈工程师用最简单的方式构建"流式 AI 应用"(Chat、生成、工具调用等)。

简单理解为:AI SDK = 前端友好的模型调用工具 + 流式聊天 UI 状态管理 + Edge 友好 API 封装。

如果你只是简单做对话应用 AI SDK 是一个不错的选择

它提供了 nextjs 与 AI SDK 集成的示例构建 AI 应用的组件库ai-gateway 每月 5 美元的大模型 api 额度

总结

LangChain = AI 后端逻辑框架(RAG / Agent / 工作流)

Vercel AI SDK = 前端/全栈的流式对话 UI 工具(Chat UI)

AI SDK 它不和 LangChain 竞争,而是功能互补。

创建一个简单的 Agent 项目

手动创建项目

参考 LangChain 应用结构 来创建

我这里使用了 nestjs 作为后端项目 猛击访问仓库

langgraph-cli 创建项目

执行 npx @langchain/langgraph-cli new 创建项目,使用这种方式创建的项目文件较多,且使用 LangGraph 这里仅做介绍,了解可以通过 cli 创建项目即可!

Agent 类型 主要用途 是否支持工具调用 是否有推理链 (Reasoning) 是否有记忆 是否支持 RAG 典型使用场景
New LangGraph Project(基础模板) 最基础的 LangGraph 项目,方便自定义 ❌ 默认不带 ✔(基础记忆) 自定义 Agent、自己扩展工具和流程
ReAct Agent 需要工具调用 + 多步推理的智能 Agent ✔(Thought → Action → Observation) 可选 智能助手、自动化任务、多步骤处理、工具链
Memory Agent 有上下文记忆的简单聊天机器人 ✔(更完整) 普通聊天应用、助理型对话系统
Retrieval Agent(RAG) 知识库问答、文档搜索 可选 ✔(向量检索) FAQ、产品知识库、文档问答
Data-enrichment Agent 数据清洗、AI 批处理、数据增强 数据标签化、内容补全、批处理任务

选择 New LangGraph Project 后生成的文件如下

里边文件都有注释,可以创建来看看

大模型 api

这里使用 openrouter 它提供了免费可调用大模型

点击进入创建 api key 页面(需已登录)

API 调用限制如下:

  1. 每分钟请求上限:20 次
  2. 每日请求总量:未充值(余额 < 10 美元) :50 次 / 天 ,充值 ≥ 10 美元 :1000 次 / 天

或者是

  1. ai-gateway 每月 5 美元的大模型 api 额度,有限速
  2. 心流开放平台 提供的 api 调用,并发 1 、api key 有效期短

获取到 key 后在 .env 文件中增加

env 复制代码
OPENAI_API_KEY=xxx你的 api key

第一个 Agent

需要安装 pnpm i langchain @langchain/openai @langchain/langgraph @langchain/core 依赖

其中上边创建的 nodes.ts 、state.ts 暂时没有用到,直接忽略

src/ai/agent/utils/tools.ts 定义了一个天气工具并导出(这只是示例,真实项目需要接入对应的天气 api 来获取地图的天气情况)

ts 复制代码
import { tool } from 'langchain';
import * as z from 'zod';

// 定义一个天气工具
// 输入一个地区,总是返回该地区阳光明媚
export const getWeather = tool(
  (input) => `It's always sunny in ${input.city}!`,
  {
    name: 'get_weather',
    description: 'Get the weather for a given city',
    schema: z.object({
      city: z.string().describe('The city to get the weather for'),
    }),
  },
);

src/ai/agent/index.ts 创建了一个基本的 agent 代理、定义了系统提示词、传入了一个 天气工具

ts 复制代码
import { ChatOpenAI } from '@langchain/openai';
import { createAgent, createMiddleware, ToolMessage } from 'langchain';
import { getWeather } from './utils/tools';

// 自定义中间件:处理工具调用错误
const handleToolErrors = createMiddleware({
  name: 'HandleToolErrors',
  // wrapToolCall 在工具被调用时包裹处理逻辑
  wrapToolCall: (request, handler) => {
    try {
      // 正常调用工具
      return handler(request);
    } catch (error) {
      // 如果工具调用出错,返回自定义错误消息给模型
      return new ToolMessage({
        content: `工具错误:请检查您的输入并重试。 (${error})`,
        tool_call_id: request.toolCall.id!,
      });
    }
  },
});

// 创建 AI 模型实例
const model = new ChatOpenAI({
  // 使用的模型
  model: 'z-ai/glm-4.5-air:free',
  // 从环境变量读取 API Key
  apiKey: process.env.OPENAI_API_KEY,
  configuration: {
    // 自定义 OpenAI 代理接口
    baseURL: 'https://openrouter.ai/api/v1',
    defaultHeaders: {
      // 可选,用于在 openrouter.ai 上进行排名的网站 URL。
      'HTTP-Referer': 'https://blog.vaebe.cn/',
      // 可选,用于在 openrouter.ai 上排名的网站标题。
      'X-Title': 'n3a',
    },
  },
});

// 系统提示:告诉 AI 它的角色和可用工具
const systemPrompt = `
# 你是一个通用代理

# 你拥有的工具
getWeather: 获取天气情况
`;

// 创建 Agent
export const agent = createAgent({
  model,
  tools: [getWeather],
  middleware: [handleToolErrors],
  systemPrompt,
});

到这里就可以尝试调用 agent 了 src/ai/ai.service.ts

ts 复制代码
import { Injectable } from '@nestjs/common';
import { agent } from './agent';

@Injectable()
export class AiService {
  async chat(id: string) {
    const messages = [{ role: 'user', content: '东京天气怎么样?' }];

    console.log(id);

    return await agent.stream({ messages }, { streamMode: 'updates' });
  }
}

LangSmith 集成

LangSmith 是由 LangChain 团队推出的一个平台,主要用来支持 生产级 LLM(大语言模型)应用 的开发、调试、测试和监控。参考官方文档注册获取 key

注册 -> 侧边菜单找到 Settings 点击进入 -> 创建 api key

LangSmith 环境变量

将以下环境变量写入 .env 文件

ts 复制代码
LANGSMITH_TRACING=true
LANGSMITH_ENDPOINT=https://api.smith.langchain.com
LANGSMITH_API_KEY=你的 api key
LANGSMITH_PROJECT=n3a-修改成你的项目名字
环境变量 含义
LANGSMITH_TRACING 设置为 true 后,会把运行信息发送到 LangSmith。
LANGSMITH_ENDPOINT LangSmith API 服务器地址。如果你使用官方云服务,可以不设置(默认指向官方服务);如果是自托管 LangSmith,需要设置为自托管的 URL。
LANGSMITH_API_KEY 访问 API 的密钥。用于验证身份,确保你的程序可以向 LangSmith 发送追踪数据。
LANGSMITH_PROJECT 指定项目名称。你的项目名字

配置完成后调用 Agent 可以在 LangSmith Tracing Projects 看到你的 Agent 运行情况

查看详情

LangSmith Studio 集成

使用 LangSmith Studio 的前提条件是

  1. LangSmith 的 API 密钥(我们有了)
  2. langgraph.json 配置文件

下边配置下 langgraph.json 一般是放在项目的根目录中

ts 复制代码
{
  "dependencies": ["."],
  "graphs": {
    "my_agent": "./src/ai/agent/index.ts:agent"
  },
  "env": ".env",
  "image_distro": "wolfi"
}
字段 说明
node_version 指定项目运行所需的 Node.js 版本,
graphs 定义项目中 Graph(图)的位置,键是 graph 名称,值是模块路径加导出对象名。这里 "agent": "./src/agent/graph.ts:graph" 表示在 ./src/agent/graph.ts 文件中导出的 graph 对象。
env 指定环境变量文件路径,这里是 .env,项目启动时会加载这个文件中的环境变量。
dependencies 列出该 graph 的依赖,这里是 ".",表示依赖当前项目的包(通常用于 monorepo 或本地包)。
image_distro 指定用于构建 Docker 镜像的基础系统,这里是 wolfi(Alpine 类似的轻量 Linux 镜像)。

然后执行 npx @langchain/langgraph-cli dev 连接到 LangSmith Studio

总结

本文介绍了 LangChain 和 AI SDK,虽然现在只用到了 LangChain 但是后边是需要用到 AI SDK 来构建前端页面的

实现了一个简单的 Agent 可以回答某地区的天气情况

然后实现了 LangSmith 的集成,可以观察 Agent 的运行状态,调试 Agent

谢谢你的阅读

相关推荐
少卿3 小时前
React Compiler 完全指南:自动化性能优化的未来
前端·javascript
广州华水科技3 小时前
水库变形监测推荐:2025年单北斗GNSS变形监测系统TOP5,助力基础设施安全
前端
广州华水科技3 小时前
北斗GNSS变形监测一体机在基础设施安全中的应用与优势
前端
七淮3 小时前
umi4暗黑模式设置
前端
8***B3 小时前
前端路由权限控制,动态路由生成
前端
军军3603 小时前
从图片到点阵:用JavaScript重现复古数码点阵艺术图
前端·javascript
znhy@1233 小时前
Vue基础知识(一)
前端·javascript·vue.js
terminal0073 小时前
浅谈useRef的使用和渲染机制
前端·react.js·面试
我的小月月3 小时前
🔥 手把手教你实现前端邮件预览功能
前端·vue.js
陈佬昔没带相机3 小时前
MiniMax M2 + Trae 编码评测:能否与 Claude 4.5 扳手腕?
前端·人工智能·ai编程