乐于分享
好东西不私藏

手搓一个 Agent02:从文档问答到生产级智能体

手搓一个 Agent02:从文档问答到生产级智能体

✦ 干货分享 ✦

02 / Agent 的三个零件:模型、工具、记忆

"

这是「Java + Spring AI 开发 Agent 应用」保姆级连载的第 2 章。 上一篇(第 1 章)我们通了"大脑"——明白了模型是什么、它怎么理解你的话、Spring AI 又帮我们省了哪些搬运工作。 这篇纯概念,不写代码,我们只干一件事:搞清楚一个 Agent 到底由什么组成,以及"为什么非要这些零件不可"

"

如果你读上一篇时心里隐约有一点慌——"这不就是个聊天机器人吗?跟 Agent 有什么关系?"——恭喜你,你问到了点子上。这一章就是来解开这个结的。


010. 开场:一条会失忆的金鱼

先听我说个小场景。

你让 AI 助手帮你整理一份周报:"把本周的项目进展汇总一下,顺便把我上次提到的那个风险点也写上。"

助手回答:"本周进展……风险点?不好意思,我不记得你之前说过什么风险点。"

你:"就是我周三说的那个,服务器快到期那个!"

助手:"抱歉,我没有关于周三对话的记忆。"

你是不是已经想摔键盘了?

这像什么?像一条金鱼。金鱼只有七秒记忆,你刚跟它说完话,它转头就忘。一个没有记忆的 Agent,就是这条金鱼——你跟它聊了半小时,它隔天再看,脸是陌生的,啥都不记得。

如果你曾经在某个 AI 产品里遇到"说了跟没说一样"的糟心体验,十有八九就是它没有设计好"记忆"——而很多团队根本没意识到这还是一个可以设计的东西。

这一章,我们把一个 Agent 拆开,看看它到底由哪几个零件拼成,每个零件解决什么问题,为什么缺一个都不算"Agent",只能算"高级聊天框"。


021. 模型:那颗会"犯迷糊"的大脑

任何一个 Agent 的核心,都是一颗大模型(LLM)做的大脑。它负责两件事:理解你的意图,决策下一步该干什么。

听起来很全能,对吧?但它其实是"能力很强、毛病也不少"的一个家伙。别被它唬住,先看看它三个明确的短板,记住了,后面全用得上:

短板一:会"幻觉"。 它特别会一本正经地胡说八道。你问它"DocMind 项目有多少行代码",它可能煞有介事地告诉你"大概 8000 行"——但它根本没见过你的代码,它只是在编一个听起来合理的数字。它不是在骗你,它是在"猜",而且猜的时候自己都不知道是猜的。这就是著名的"幻觉"。

短板二:不会算账。 你问它 17×23 等于多少,它可能出错。为什么?因为它是"说下一个最可能的词"的机器,不是一个计算器。它擅长的是"语言规律",不是"数学精确"。让它做复杂运算,等于让一个文科生心算三位数乘法——不是不行,是不稳。

短板三:知识有"保质期"。 它的知识停在训练完成的那一天。模型训练要花巨量算力和时间,不可能天天更新。所以它不知道今天的天气、最新的新闻、你公司内部的文档。它的知识是"过去的、通用的",不是"现在的、你专属的"。

现在我们得到了一个关键认知:大脑很强,但它瞎、它笨、它落伍。 那怎么办?总不能因为它有毛病就不用吧。

好,接下来就到重点了:Agent 之所以是 Agent,不是因为它有个大脑,而是因为它有办法补上大脑的这三个窟窿


032. 工具:给大脑装上"手和眼"

补窟窿的办法,就是给大脑配备工具(Tools)。工具就是大脑的"手和眼",让它能伸出手去摸、睁开眼睛去看。三个短板,正好对应三类工具:

大脑的短板
对应的工具
通俗理解
不会算账
计算器
别心算,去按计算器
知识有保质期
网页搜索
别靠记的,去搜实时信息
那我不知道的(外部数据)
文件 / PDF / RAG
别瞎编,去查我们自己的资料库

你看出来了吧——工具不是可有可无的装饰品,它是大脑缺口的"外挂器官"。

  • 不会算账?那模型就不算,它调一个"计算器工具",让真正的代码去算,拿到精确结果再告诉你。
  • 知识过期?那模型就不凭记忆,它调一个"搜索工具",上网查最新的回来。
  • 你的业务数据(合同、报告、PDF)模型根本没学过?那它调一个"文档工具",去你的文件里把相关内容捞出来。

到这里,"模型 + 工具"合在一起,就已经比一个光秃秃的大模型强太多了。但还没完——你还缺刚才那条金鱼的病根。


043. 记忆:别做那条金鱼

第三块拼图,是记忆(Memory)

记忆分两层,你平时都在不知不觉地使用:

短期记忆 = 对话历史。 就是你跟 AI 一来一回的那些话。你周三提到"服务器快到期",这个信息得留到周五还能被想起来,全靠短期记忆把对话记录下来、喂回给模型。没有它,模型每次都是"失忆状态",上一条说的下一条就忘。

长期记忆 = 用户偏好、常用文档。 这是更高级的一层。比如用户永远用中文、用户是老客户所以要客气点、用户上次存过一份"服务器清单"——这些低频但重要的信息,应该被提炼出来,放进一个"长期记忆库",每次对话都能翻出来用。

记住这个血泪结论:短期记忆让你"聊得下去",长期记忆让你"认得这个人"。 二级记忆一加,Agent 才算真正"活"了,不再是金鱼。

"

小提示:关于"记忆到底放哪、放什么、怎么不漏不脏",第 7、8 章我们会用一个专门的东西(RAG)把它做实。现在你只需要建立观念:记忆是可以设计、可以架构的,不是玄学。

"


054. ReAct:大脑的"想→做→看"循环

零件齐了(模型、工具、记忆),它们是怎么协同干活、有秩序地运转的呢?

这里要介绍一个绕不开的经典套路,叫 ReAct

别被这个高大上的名字唬住,它就是个循环,一共三步:

1        ┌──────────────────────────────┐

2        ▼                              │

3    ┌─────────┐    ┌─────────┐   ┌──────────┐

4    │ Reason  │ →  │  Act    │ → │  Observe │

5    │ (想)   │    │ (做)   │   │ (看结果)│

6    └─────────┘    └─────────┘   └──────────┘

7        算一步:       调工具:       拿到结果

8        该咋办         动手执行        再回来看

翻译成人话,就是一个死循环:

  1. Reason(想)
    :面对问题,动脑子——"我需要知道最新股价,可我现在不知道。"
  2. Act(做)
    :决定行动——"那我得去查一下。"
  3. Observe(看)
    :真的去查,把结果拿回来——"哦,查到了,股价是 128 块。"
  4. 回到第 1 步
    :拿到结果后再想——"那现在可以算这笔交易赚不赚了。"

够不够?就像你做饭:先想菜谱(Reason),进厨房拿菜(Act),看看菜新不新鲜够不够用(Observe),再想下一步怎么切。每一步都是"想→做→看",看完了再想,直到菜端上桌。

这一步关键话,请你记死:

"

Spring AI 已经把这个循环给你封装好了,你后面写代码的时候,基本不需要手写这个循环——框架帮你转了。

"

但,懂原理和会调参是两码事。 你后面跑出 Bug 了(比如模型反复去调同一个工具、陷在死循环里、或者拿到结果后不知道收手),你要是不懂 ReAct 这个"想→做→看"的结构,你根本不知道去哪儿找问题。先弄懂这台机器的传动原理,出毛病了你才知道去拧哪颗螺丝。


065. Function Calling 的本质:模型不"做",只"说"

说到工具,就绕不开一个词:Function Calling(函数调用)。这可能是整个 Agent 领域最容易被误解的概念,我们今天必须把它掰开揉碎。

请先记住一句话:

"

模型并不"执行"工具,模型只是"告诉你该调哪个工具、传什么参数"。真正的执行,永远发生在你的 Java 代码里。

"

什么意思?很多人第一次接触会以为:模型神通广大,能直接操纵文件系统、直接上网、直接改数据库。大错特错。

真实流程是这样的:

1

2

3

4

5"读懂了你的意图"

6

7

8{"tool":"查询天气","参数":{"城市":"北京"}}

9

10

11  Java 

12

13"晴天 28°C"

14

15"北京今天晴天 28°C"

你发现了没?模型从头到尾没碰过任何"真实世界"。它只做两件事:读懂请求 → 给出调用指令。真正伸手去抓真实数据的,是你的 Java 代码。

我送你一个最好记的类比:

"

模型是"点菜的顾客",工具是"后厨"。 顾客(模型)只负责看着菜单,说"来一份糖醋排骨,加辣"。它不炒菜,也碰不到锅铲。真正颠勺开火的,是后厨——你的 Java 代码。菜(结果)端上来后,服务员再端给顾客看,顾客点点头:"对,就是这么个意思。"然后由它组织语言,向你复述这道菜多好吃。

"

把这个边界刻进脑子里,太重要了。要是你带着"模型能直接操纵文件系统"这种误解去学,后面读 Spring AI 的代码你会完全懵掉——你会奇怪"怎么这个模型是怎么调用 Java 方法的?",其实根本不是模型在调,是框架在模型和你的代码之间做翻译。


076. 这一章的产物:一张 DocMind 演进路线图

这一章我们没写一行代码,那这一章的价值在哪?

价值在于:你现在脑子里应该有一张"DocMind 会怎么一步步长成"的蓝图了。 我们把后面每一章放在这条演进路线上标个点:

1  DocMind 架构演进路线图

2  ──────────────────────────────

3

4  v0  只有大脑(模型)                        ← 第1-2章 你在这

5       │

6  v1  长出手和眼(工具:搜索/文件)            ← 第5章 长"眼"

7       │

8  v2  再长出手(工具:计算器/精确运算)        ← 第6章 长"手"

9       │

10  v3  长出记忆库(RAG:投喂你的文档)          ← 第7-8章 长"记忆"

11       │

12  v4  学会自主编排(知道先做什么后做什么)      ← 第9章 学会"拿主意"

13       │

14  v5  会记忆(长期偏好/常用资料)              ← 第10章 认得"老熟人"

15       │

16  v6  会交作业(把成果整理、交付)             ← 第11章 学会"汇报"

看到没有?每个零件不是突然冒出来的,是在特定的章节,专门为它"长出"来的。 一个零件一章,一个零件讲透一个问题。你现在做的,是先把这张地图在脑子里装好,后面我们一章一章往上面填肉。


087. 本章踩坑(必看)

这章是概念章,踩坑也踩的是"思维的坑"。这些坑不踩,后面必定爆雷。

坑一:"Agent"这个词被滥用了

现象: 市面上随便接个 API、加个 RAG、能聊两句话,就敢叫自己"Agent"。开会时人人喊 Agent,一打开代码就是个大模型加一个搜索。

根因: 术语被营销玩坏了,大家把"Agent"当成高级点的"聊天机器人"在用。但实际上四者完全是四层不同档次的物种。

解法: 先分清楚,别被带节奏:

概念
一句话区分
核心特征
Chatbot
(聊天机器人)
只会"说"
模型 + 对话,答问为主
RAG
(检索增强)
会"查资料再答"
多了一块"文档检索",但仍是问答
Agent
(智能体)
会"想、做、看、再决定"
有 ReAct 循环、有工具、有时记忆
多 Agent
(多智能体)
一堆 Agent 相互协作
有分工、有调度、有通信

最扎心的一句提醒:"接了个 API + RAG 就敢叫 Agent",就像装了四个轮子就敢叫汽车——你缺个发动机(自主决策)。 判断标准很简单:它有没有"自主决定调哪个工具、然后根据结果自主决定下一步"的能力。没有,就是 Chatbot 或 RAG,别硬叫 Agent。

坑二:Function Calling ≠ 代码执行

现象: 以为模型能直接读文件、改数据库、上操作系统,觉得"模型什么都能干"。

根因: 没搞懂第 5 节那个边界——模型只"说"不"做",执行在代码里。

解法: 记住"顾客点菜 vs 后厨炒菜"的类比。模型发出调用指令,你的 Java 代码去执行真实的动作。这也意味着:安全责任在你身上——你写的工具函数如果去删库,模型"下令"删库是它的"建议",但真正执行删库的是你的代码,锅是你的,权限也是你在控制。所以永远要对你暴露给模型的工具做校验,别把"删全库"这种危险函数直接传给模型当工具。

坑三:一上来就搞多 Agent 协作

现象: 新手看完几个炫酷的多 Agent 演示,就想给自己的项目也上"三个 Agent 分工协作"。

根因: 被高大上的架构晃花了眼,忽略了"单 Agent 都没跑顺"这个前提。多 Agent 会带来编排、通信、死锁、结果冲突一箩筐新问题。

解法:先单 Agent 做扎实。 先把"一个大脑 + 工具 + 记忆"这一个循环搞顺,性能调好,Bug 调干净。多 Agent 是把这个单循环做成多个之后才会自然遇到的问题,那是第 9 章以后的故事。过早多 Agent = 灾难,等你连单 Agent 都调不明白时,多 Agent 只会让你在混乱里火上浇油。


09下章预告

现在你手里已经握着 Agent 的三件套了:模型(大脑)、工具(手和眼)、记忆(金鱼的记忆)。可是——这三个零件到底怎么"咬合"在一起,才算一个真正好用的产品?

这不只是"功能叠加",而是设计问题:你的 DocMind 核心场景是什么?工具该怎么设计才不多不少?记忆存什么、不存什么?数据组织成什么样,模型用起来才顺手?

第 3 章,我们就来设计 DocMind:把工具、记忆、数据这三块,像齿轮一样严丝合缝地咬合起来。