从零打造你的第一个 AI Agent:LLM 不够用?给它装上"外挂"

前言

2026 年过半,大模型(LLM)已经火得一塌糊涂,Agent 更是遍地开花。但很多同学可能跟我一样,刚接触的时候觉得 LLM 很神奇,用着用着却发现------它好像也没那么万能

你跟它聊天,它答得头头是道;但让它帮你干点"实事",它就开始各种"抱歉,我无法......"

别急,这篇文章就是带你一步步理解:怎么把一个大模型,升级成一个真正能干活的 Agent(智能体)


一、裸 LLM 的"硬伤"在哪?

先别急着写代码,咱们先把问题搞清楚。大模型接口虽然强大,但直接裸调用有几个绕不过去的坎:

1. 它不记事儿(无状态)

你上周跟 GPT 聊了一下午的需求,今天再问它"上次那个方案改好了吗?"------它一脸茫然。

LLM 本质是无状态 的,每次请求都是"初次见面"。想让它记住上下文?你得自己搞个 Memory 模块 ------后端存数据库也行、Redis 也行、前端 localStorage 也行,总之 LLM + 后端 才能解决记忆问题。

2. 它只会说,不会做

你问它"帮我看看这个网页上有什么内容",它能给你分析得头头是道------思路 。但它没法真正打开浏览器去访问网页。你想让它动手?得给它装上 Tool Use 能力。

3. 它不懂你公司的内部知识

"帮我查一下公司内部 wiki 上的请假流程"------LLM 压根没见过你的内部文档。这时候就需要 RAG(检索增强生成),把私有知识库的内容检索出来,喂给 LLM 作为参考。

4. 它的知识有"截止日期"

世界杯最新战况?昨天刚出的技术新闻?这些都不在它的预训练数据里。这时候可以靠 MCP(Model Context Protocol) 或第三方工具来补齐实时信息的能力。

5. 复杂任务怎么编排?

"帮我做一份 Q2 数据分析 PPT,顺带分析一下最近的股市行情,自动买入符合条件的股票"------这种组合拳,单个 LLM 调用根本搞不定。需要 Skills(技能编排) 把多个能力串起来。


二、Agent 到底是什么?

搞清楚问题之后,答案就很简单了:

Agent = LLM + Memory + Tool + RAG + MCP + Skills

一句话总结:给大模型装上"记忆"让它记住你、装上"工具"让它能干事情、接上"知识库"让它懂你的业务、配上"技能编排"让它处理复杂任务------这就是一个 Agent。

像 Claude Code、Codex、小龙虾、Manus 这些当红产品,本质上都是这个公式的不同实现。


三、Agent 的工作流程

当用户抛出一个复杂任务给 Agent 时,背后是这样一条链路:

markdown 复制代码
用户 Prompt → LLM 规划/推理 → 要不要加载 Memory?
                            → 要不要调用 Tool?(可能分步调用多个工具)
                            → 要不要走 RAG?(检索结果注入 Prompt)
                            → 生成最终响应 → 返回给用户

LLM 本身就是会思考、会规划的。我们要做的,就是给它拓展能力边界------给它手和脚,让它不仅能"想",还能"做"。


四、开发框架选型:为什么是 LangChain?

市面上 LLM 开发框架不少,但 LangChain 是其中最成熟的之一。我们的技术栈是这样的:

层级 技术选型 作用
后端框架 NestJS (Node.js) 提供稳定的服务端能力
单智能体 LangChain 统一 LLM 调用、Tool 管理、消息编排
多智能体 LangGraph 多个 Agent 之间的协作与编排
工具协议 MCP / RAG / Skills 拓展 Agent 的能力边界

这个组合的优势在于:结合后端工程化能力,让 AI 技术真正落地,实现商业价值(我们内部叫 FDE ------ Frontend/Backend Driven Engineering for AI)。


五、上手实战:用 LangChain 打造一个文件读取 Agent

光说不练假把式,我们直接看代码。下面是一个最小可用的 Agent 示例------让它能读取本地文件并解析内容。

5.1 初始化 LLM

javascript 复制代码
import { ChatOpenAI } from '@langchain/openai';
import 'dotenv/config';

const model = new ChatOpenAI({
    modelName: 'deepseek-v4-flash',       // 可以换成任意兼容 OpenAI 接口的模型
    apiKey: process.env.DEEPSEEK_API_KEY,
    temperature: 0,
    configuration: {
        baseURL: 'https://api.deepseek.com/v1',
    }
});

const response = await model.invoke('2027下半年上海major应该设立什么奖励?');
console.log(response.content);

LangChain 的 ChatOpenAI 给我们做了一层统一抽象------不管底层接的是 DeepSeek、GPT-4 还是其他模型,调用方式都一样。按需加载,不会把不用的模型依赖全打进去。

5.2 定义 Tool:让 LLM 能"动手"

Tool 是 Agent 的核心能力拓展方式。一个 Tool 包含两个部分:

  • 处理函数(异步):真正干活的逻辑
  • 描述对象:告诉 LLM 这个工具是干嘛的、什么场景用、需要什么参数
javascript 复制代码
import { tool } from '@langchain/core/tools';
import { z } from 'zod';
import fs from 'node:fs/promises';

const readFileTool = tool(
    async ({ filePath }) => {
        const content = await fs.readFile(filePath, 'utf-8');
        console.log(`[工具调用] read_file(${filePath}) 成功读取${content.length}字节`);
        return content;
    },
    {
        name: 'read_file',
        description: `用此工具读取文件内容。
        当用户要求读取文件、查看代码、分析文件内容时调用此工具,
        输入文件路径(可以是相对路径或绝对路径)`,
        schema: z.object({
            filePath: z.string().describe('文件路径'),
        }),
    }
);

这里有几个关键点:

  1. schema(zod 约束):LLM 要调用这个工具,必须按 schema 约定的格式传参。zod 负责在类型层面做校验,保证参数不会乱套。
  2. description:写清楚这个工具的功能、覆盖场景、参数需求------LLM 是靠这段描述来判断"什么时候该用这个工具"的,写得越清晰,调用越准确。
  3. 反馈机制:工具执行时打印日志很重要------复杂任务可能很耗时,用户太久没看到反馈可能就直接关掉了。

5.3 绑定工具 & 发起对话

javascript 复制代码
const tools = [readFileTool];

// 将工具注册到模型上
const modelWithTools = model.bindTools(tools);

const messages = [
    new SystemMessage(`
        你是一个专业的文件读取助手,可以使用工具读取文件并解释代码。

        工作流程:
        1. 用户要求读取文件时,立即调用 read_file 工具
        2. 等待工具返回文件内容
        3. 基于文件内容,进行分析和解释

        可调用工具:
        - read_file: 读取文件内容(使用此工具来获取文件内容)
    `),
    new HumanMessage('请读取 tool.mjs 文件内容并解释代码'),
];

let response = await modelWithTools.invoke(messages);
messages.push(response);

System Prompt 里我们给了 LLM 一个明确的"人设"和"工作流程"------这很重要,LLM 需要知道自己的边界和可用的武器。

5.4 Tool 调用的底层机制

当 LLM 决定调用工具时,它不会直接生成文本回复 ,而是停下来,返回一个 tool_calls 列表,包含:

json 复制代码
{
  "id": "call_xxx",       // 工具调用 ID,关联后续返回值
  "name": "read_file",    // 工具名
  "arguments": {          // 参数,符合你定义的 schema
    "filePath": "tool.mjs"
  }
}

然后你的代码去真正执行 这个工具,把结果包装成 ToolMessage 塞回消息列表。LLM 拿到结果后,再结合上下文生成最终回复。

这个过程的关键在于:工具是异步的,LLM 通过 id 关联"哪个工具调用对应哪个结果"------形成了一个完整的任务上下文闭环。


六、性能优化:并行工具调用

复杂任务中,LLM 可能会一口气调用多个工具。比如"读取 A 文件、B 文件、C 文件,然后对比分析"------这时三个文件读取互不依赖,完全可以并行执行

这时候 Promise.all 就派上用场了:

javascript 复制代码
// 并行执行多个工具调用,互不阻塞
const toolResults = await Promise.all(
    toolCalls.map(call => executeTool(call))
);

复习一下 Promise 的核心概念(这对理解异步 Agent 至关重要):

概念 说明
pending 等待中......
fulfilled 成功(pending → fulfilled,不可逆)
rejected 失败(pending → rejected,不可逆)
Promise.all 并行执行多个 Promise,全部完成后返回结果数组
await ES8 语法,把异步代码写成同步风格,最优雅的写法

这就是我们高性能 Agent 的基石------能并行的绝不串行。


七、进阶方向

以上只是 Agent 开发的冰山一角。掌握了基础之后,可以往这些方向深入:

  • Memory 模块:让 Agent 记住历史对话、用户偏好、任务状态
  • RAG 接入:接入企业内部知识库,让 Agent 成为"懂业务的专家"
  • MCP 协议:对接第三方工具生态,让 Agent 的能力无限拓展
  • LangGraph 多智能体:多个 Agent 分工协作,一个负责规划、一个负责执行、一个负责校验
  • Skills 编排:把常用能力封装成可复用的技能模块

八、总结

回顾一下我们的核心认知:

  1. 裸 LLM 的问题:无状态、不会动手、不懂私有知识、信息滞后、复杂任务搞不定
  2. Agent 的解法:给 LLM 配上 Memory + Tool + RAG + MCP + Skills
  3. Agent 的工作流:规划 → 记忆 → 工具调用 → 知识检索 → 响应
  4. 落地框架:NestJS + LangChain + LangGraph,后端工程化让 AI 真正产生商业价值
  5. 性能关键Promise.all 并行执行工具调用,能并行不串行

Agent 其实并不神秘。LLM 本身就能思考、能规划------我们要做的,就是给它装上"手"(Tool)、"记忆"(Memory)、"知识"(RAG),让它从一个"只会聊天的话痨",进化成一个"能干活的智能体"。

这样一个知道内部知识、能思考规划、能动手帮你做事情的拓展后的大模型------就是 Agent。

希望这篇文章能帮你迈出 Agent 开发的第一步。代码跑起来,才是真正的开始 🚀

相关推荐
倾颜2 小时前
AI Mind 的多会话短期记忆容器:如何隔离多个聊天上下文
langchain·agent·next.js
阿拉斯攀登2 小时前
Prompt 工程与答案生成优化
prompt·agent·memory·知识库·向量数据库·rag
Briwisdom2 小时前
Agent 帮我写 CUDA(续):当 Self-Attention 遇上 Causal Mask 和 Cross-Attention
agent·算子开发·flash attention
CaffeinePro2 小时前
Langchain环境搭建与LCEL核心语法
人工智能·agent
人工智能培训2 小时前
大模型驱动下传统大数据架构的变革方向
大数据·人工智能·重构·架构·agent·agi
掉鱼的猫3 小时前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·llm·agent
小月土星4 小时前
Agent 开发思考笔记:LLM + Memory + Tool + RAG + MCP + Skills
langchain·llm·agent
小开_ALSKai4 小时前
Obsidian 最强的 AI 功能,就是它没有 AI 功能
人工智能·agent
带刺的坐椅4 小时前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·ai·llm·agent·solon·restapi·openapi