第21回 智能体初探——LLM 作为大脑的架构
灯下案头摊卷宗,纸上江湖起万重。
若教书生能办案,须有耳目与脚程。
上回说“搜索式解码”:推理不再是一条路走到黑,而是能回头、能试探。
可看官转念一想:
要是题目不是数学题,而是“给我把这份合同查一查风险”“把十个 PDF 汇总成要点并给引用”“帮我预约并写邮件确认”——
单靠脑子里转,没手没脚,如何办成?
于是第三篇登场:记忆增强。
它的核心不是“把模型训练得更会背”,而是给它加上三样器官:
- 耳目:能检索、能查证、能看外部资料
- 手脚:能调用工具、能执行、能回传错误
- 账本:能把过程与证据记下来,下一次接着办
江湖里把这一套叫:LLM Agent(大模型智能体)。
一、什么叫“智能体”:一句话,能把话变成事
若只会聊天,叫“会说话”。
若能把一句话分解、查证、执行、回报,叫“会办事”。
把“会办事”拆开看,其实还是第11回那套三件套,只是换了装:
- 环境:浏览器、检索库、文件系统、数据库、API
- 动作:查询、读取、写入、调用函数、跑脚本
- 奖励:任务是否完成、是否符合约束、是否可核查
这便是把强化学习的“动作空间”从游戏按键,换成了“工具箱”。
因此近两年(2024–2026)各种 Agent 系统越来越像“工作流”,而不是一段长 Prompt。
二、智能体的最小骨架:感知、记忆、规划、行动
你若要画一张“智能体解剖图”,通常四块就够:
- 感知(Perception):读用户输入、读检索结果、读工具返回
- 记忆(Memory):把关键事实与中间结论存起来,必要时召回
- 规划(Planning):把大事拆成小步,决定先做什么
- 行动(Action):挑工具、填参数、执行、处理错误
这四块听起来抽象,但你很熟:
就是你做作业的流程——读题、翻资料、列步骤、动笔算。
导读里说 RAG 会从“查资料”升级成“办案式工作流”,其本质就是把检索嵌入这四块里循环起来。1
三、两种常见架构:一人独办与分工协作
1)单智能体:一个脑袋,配一堆工具
像你一个人做研究报告:
- 你自己决定查什么
- 查到了自己判断对不对
- 写到一半发现不对,自己改
优点:结构简单,成本低。
缺点:容易“自说自话”,尤其当任务很长、证据很多时。
2)多智能体:分工,辩论,协调
像一个小组:
- 有人负责检索
- 有人负责写作
- 有人负责质检与找茬
优点:容易覆盖盲点,过程更像“互相校验”。
缺点:沟通与协调成本会涨,容易陷入“大家都在说但没人动手”。
第三篇先从单智能体讲起:
因为你只要把单智能体的骨架搭稳,多智能体只是“多请几位角色上台”,核心问题还是:如何让过程可核查。
四、智能体最怕三种病:幻觉、漂移、失忆
听书听到这里,看官大概已经见过三种翻车:
- 幻觉:没查证就编,或把检索结果理解错
- 漂移:走着走着忘了目标,开始写别的
- 失忆:刚查到的关键证据没记住,下一步又去重复查
第三篇的十回要解决的就是这三种病:
- 第23–27回:如何检索、如何重排、如何压缩与模块化
- 第24回:如何评估“找得对不对、说得实不实”
- 第28回:如何让系统能跑在真实世界:并行、缓存、隐私
- 第29回:当上下文变长,RAG 与长上下文如何取舍
- 第30回:引入“图”这种更适合多跳推理的记忆形式
五、极简可跑代码:一个“能办事”的最小循环
下面这段代码不接任何大模型,只做一件事:
把“智能体循环”写成能跑的程序骨架。
我们给它两个工具:
search:在一个小文档库里按关键词找句子calc:做简单算术
再给它一个“规划器”(其实就是非常朴素的规则):
如果用户句子里出现 查 就去检索;出现 算 就去计算。
import re
DOCS = [
"RAG 的关键是:检索到的证据要能引用,回答要能对得上证据。",
"智能体把任务拆成小步:感知、记忆、规划、行动,然后循环。",
"工具调用需要约束参数格式,否则一旦乱填就会失败或造成风险。",
]
def tool_search(query):
hits = []
q = query.strip()
for i, d in enumerate(DOCS):
if q and q in d:
hits.append((i, d))
return hits
def tool_calc(expr):
if not re.fullmatch(r"[0-9+\-*/ ().]+", expr.strip()):
raise ValueError("bad expr")
return eval(expr, {"__builtins__": {}}, {})
def plan(user_text):
m = re.search(r"查(.*?)$", user_text)
if m:
q = m.group(1).strip()
return ("search", {"query": q})
m = re.search(r"算(.*?)$", user_text)
if m:
expr = m.group(1).strip()
return ("calc", {"expr": expr})
return ("final", {"text": "我先需要你告诉我:要查什么,或要算什么。"})
def act(action, args):
if action == "search":
return tool_search(args["query"])
if action == "calc":
return tool_calc(args["expr"])
return args["text"]
def agent_loop(user_text, max_steps=3):
memory = []
for _ in range(max_steps):
action, args = plan(user_text)
out = act(action, args)
memory.append((action, args, out))
if action == "final":
break
user_text = "下一步"
return memory
if __name__ == "__main__":
for action, args, out in agent_loop("帮我查RAG"):
print(action, args, "->", out)
for action, args, out in agent_loop("帮我算 (3+5)*2"):
print(action, args, "->", out)
你看,这就已经具备“能办事”的雏形了:
- 有工具(search/calc)
- 有计划(plan)
- 有行动(act)
- 有过程记账(memory)
真正的大模型智能体,只是把 plan 从规则换成 LLM,
把 DOCS 从三句话换成一座资料库,
把 memory 从列表换成可检索的长期记忆。
六、小结:第三篇要把“慢思考”变成“可核查的办案”
从第二篇到第三篇,是一次“从心法到器械”的升级:
- 第二篇:让它推理更稳(奖励、搜索、慢思考)
- 第三篇:让它办事更稳(检索、工具、记忆、评估)
下一回(第22回)我们就先拿“工具调用”开刀:
为什么同样是调用 API,有人能稳,有人一半时间在报错?
关键在“约束”二字:约束格式、约束参数、约束错误回传。
欲知后事如何,且听下回分解。
幻觉核查
- “Agentic RAG”趋势与定义:导读引用的综述可核验其对“把规划、反思、工具使用嵌入检索流程”的归纳。1
- 本回给出的四块解剖(感知/记忆/规划/行动)为工程界通行抽象,具体系统实现差异很大;本回不宣称某一固定标准。
逻辑审计
- 与第20回衔接:第20回把推理视作搜索,本回把“搜索”扩展到工具与外部世界。
- 与导读一致:导读强调“办案式工作流”,本回给出四块解剖与最小循环作为落地框架。
- 为后续铺路:第23–29回逐步解决“耳目(检索)+账本(评估/缓存)+边界(隐私/可靠性)”;第30回引入图结构,为多跳推理做准备。
引用与溯源
Footnotes
-
Agentic Retrieval-Augmented Generation: A Survey on Agentic RAG arXiv:2501.09136 (2025-01) https://arxiv.org/abs/2501.09136 ↩ ↩2