AI Agent 核心概念寓言
用寓言理解 Agent 五大核心概念:RAG、ReAct、Function Call、MCP、记忆系统。每则寓言后附概念解析和检验问题。
一、中药材采购员的故事(RAG)
老周在中药材市场做采购二十年了。南来北往的药铺掌柜都找他拿货——报个药方过来,问他”今年甘肃的黄芪怎么样""云南的三七成色如何”。老周脑子活,大部分时候张嘴就来:“甘肃黄芪今年好,条粗粉足。“掌柜们信他,款到发货。
三月连着退了三批货。第一批是黄芪,有效成分含量不达标,药铺说熬出来的汤颜色发白。第二批是当归,挥发油含量偏低。第三批更离谱,老周信誓旦旦说”川芎今年产量足价格稳”,结果四川那边遭了虫灾,价格翻了倍,药铺按他报的价根本拿不到货。
退货赔的钱不算什么。丢人。
老周关了三天门,在库房里搭了个架子。他把所有产地当季的检验报告——农残检测、有效成分分析、产量统计——按产地和药材名分类放好。从那以后,掌柜再问他,他不急着回话。先去架子上翻出对应的报告,把相关的几页抽出来摆在桌上,然后对着报告一个字一个字地给掌柜念。产地、含量、价格、库存,每一条都有出处。
有掌柜嫌他慢:“老周你以前不是秒回吗?“老周说:“以前秒回的三批全退了。你急还是我急?”
从此再没退过货。
概念解析
RAG(Retrieval-Augmented Generation,检索增强生成)——在模型生成回答之前,先从外部知识库中检索相关文档,把检索结果作为上下文拼入 prompt,再让模型基于这些文档生成回答。
| 故事元素 | 映射概念 |
|---|---|
| 掌柜提问 | 用户输入问题 |
| 老周凭印象回答 | LLM 纯生成(无检索),容易幻觉 |
| 退了三批货 | 模型幻觉(hallucination),输出不准确 |
| 库房的检验报告 | 外部知识库 / 文档 |
| 翻报告、抽几页 | 检索(Retrieval)——向量相似度搜索 |
| 对着报告回话 | 增强 + 生成(Augmented Generation) |
| 分类摆放 | Chunk 分块 + 索引 |
| 每一条都有出处 | 引用来源,减少幻觉 |
检验问题
- 理解检验:如果老周的库房里根本没有某味药材的检验报告,他该怎么办?这在 RAG 系统中对应什么问题,你会怎么处理?
- 迁移检验:你能举一个你实际工作中”凭印象做事经常出错,查了资料就对了”的场景吗?用 RAG 的逻辑重新设计一下这个流程。
二、汽修工小陈(ReAct)
一辆白色轿车开进汽修店,车主说发动机故障灯亮了,踩油门没劲。
小陈没急着拆东西。他想了想:可能是火花塞老化,也可能是油路堵了。先看火花塞吧——拆下来一看,积碳确实重,但电极间隙还在正常范围内。他想:积碳会导致点火偏弱,但不太可能导致这么明显的动力下降。应该还有别的问题。
他接上燃油压力表。怠速状态下读数只有正常值的60%。他想:油路供油不足,最可能堵在滤芯。他拆下汽油滤芯,倒出来半杯黑水。换上新的,试车。故障灯灭了,油门响应利索。
车主问:“你一开始怎么不直接换火花塞?很多人会这么干。“小陈说:“换了火花塞可能好一点,但治不了根。车开三天还得回来,第二次你不一定还来找我。“
概念解析
ReAct(Reasoning + Acting)——Agent 的核心工作模式,通过 Thought(思考)→ Action(行动)→ Observation(观察)的循环,让模型在每一步都基于真实反馈调整策略,直到任务完成。
| 故事元素 | 映射概念 |
|---|---|
| ”可能是火花塞,也可能是油路” | Thought(推理)——分析可能的原因 |
| 拆火花塞 / 接压力表 / 拆滤芯 | Action(行动)——调用工具执行操作 |
| 积碳重但间隙正常 / 压力只有60% / 半杯黑水 | Observation(观察)——获取工具返回的结果 |
| ”应该还有别的” → 换方向检查 | 根据观察调整推理,循环继续 |
| 换完滤芯试车,灯灭了 | 任务完成,输出最终结果 |
| ”直接换火花塞” | 不经过推理直接输出,治标不治本 |
| 三天后还得回来 | 没有观察反馈的闭环,结果不可靠 |
检验问题
- 理解检验:如果小陈换了滤芯之后试车,故障灯还是亮的,他会怎么做?在 ReAct 框架中,什么机制防止这个过程无限循环下去?
- 迁移检验:想象你在调试一个线上 bug,你的排查过程天然就是 ReAct 模式。请举一个你实际遇到过的排查案例,用 Thought → Action → Observation 的结构复盘一遍。
三、川菜馆的服务员(Function Call)
老张在一家川菜馆当服务员,干了八年。客人的话他能听懂——“来个不辣的鱼""这个毛血旺少放花椒""再加一份拍黄瓜”。但老张不会做菜。他能做的是把客人的话翻译成一张厨房工单:酸菜鱼,鲈鱼,免辣,三号桌。然后把工单递进厨房窗口。
厨房做完,老张端出去。
有一回店里忙,新来的小刘看厨房跟不上,自己冲进去占了两个灶台——一边炒回锅肉一边炖汤。回锅肉糊了,汤溢了,灶台上还溅了油。店长把小刘拽出来:“你只管记单子递单子,别碰锅。你碰了锅,厨房的活谁都干不好。”
老张在旁边收拾桌子,头都没抬。八年了,他连灶台的开关都没按过。
概念解析
Function Call(函数调用)——LLM 不直接执行任何操作,只输出结构化的工具调用指令(函数名 + 参数),由应用程序代码负责实际执行,执行结果再返回给 LLM 生成最终回答。
| 故事元素 | 映射概念 |
|---|---|
| 客人点菜 | 用户输入 |
| 老张把点菜翻译成工单 | LLM 输出结构化的工具调用指令(JSON) |
| 工单:酸菜鱼/鲈鱼/免辣/三号桌 | function_name + arguments(函数名 + 参数) |
| 递进厨房窗口 | 应用程序接收指令,分发给对应的执行器 |
| 厨房做菜 | 应用程序代码实际执行函数 |
| 端出去给客人 | 执行结果返回 LLM,生成最终回答 |
| 老张不会做菜 | LLM 不执行函数——安全设计 |
| 小刘自己炒菜糊了 | LLM 直接执行(不存在的模式),会导致混乱 |
检验问题
- 理解检验:老张一次能递几张工单进厨房?厨房能同时做几道菜?这在 Function Call 中对应什么能力,有什么好处?
- 迁移检验:在你用 Claude Code 的过程中,它调用了哪些”工具”(Bash、Read、Write 等)?Claude 自己执行了这些操作吗,还是谁在执行?
四、小区物业维修站(MCP)
阳光小区有二十栋楼,每栋楼交房的时候选的对讲系统品牌都不一样——三号楼是海康的,七号楼是大华的,十二号楼是个杂牌。物业维修站的老李一个人管全部。每栋楼的接线方式、调试软件、线路图都不一样,老李不得不在工具箱里备二十套说明书。
后来小区扩建,又来了三栋新楼。新楼用的又是三个新品牌。老李跟物业经理说:“我学不动了。你们再招人吧。”
新来的物业经理小赵干了件事:他要求所有新装和改造的对讲系统,统一留一个标准接口盒。不管盒子里面是海康还是大华还是杂牌,对外都是同样的接线方式、同样的检测端口。维修工只需要认这一个接口盒。旧楼改造时也加装这个接口盒。
三个月后全部改完。老李回来上班,带了两个徒弟。新来的徒弟只学了一天就会了——因为不管哪栋楼,打开接口盒看到的都是一样的东西。
又过了一年,小区门口要加装人脸识别闸机。供应商问物业需要怎么对接。小赵说:“你按接口盒的标准接就行。“供应商花半天就接好了。老李和徒弟甚至没参与。
概念解析
MCP(Model Context Protocol,模型上下文协议)——一个开放标准,让 AI 应用能通过统一协议连接外部工具和数据源,解决”每个应用 × 每个工具都要单独写集成代码”的 N×M 问题。
| 故事元素 | 映射概念 |
|---|---|
| 二十栋楼 × 二十种系统 | N×M 爆炸问题:每个 AI 应用要跟每个工具单独集成 |
| 老李备二十套说明书 | 维护成本爆炸 |
| 标准接口盒 | MCP 协议——统一标准 |
| 盒子里面品牌不同 | 不同 MCP Server 内部实现不同 |
| 对外同样的接线方式 | MCP 的标准接口(JSON-RPC) |
| 徒弟只学一天 | 新应用接入 MCP 只需实现 Client,无需了解每个工具的细节 |
| 新楼加装接口盒 | 新工具只需实现 MCP Server |
| 人脸闸机半天接好 | 运行时动态发现新能力,不需要改已有代码 |
| 老李没参与 | Host(AI 应用)不需要知道 Server 内部实现 |
检验问题
- 理解检验:如果小区门口的人脸闸机不想用标准接口盒,而是自己搞了一套接线方式,老李的传统能不能直接用?这在 MCP 中对应什么问题?
- 迁移检验:你实际用 Claude Code 时配置了哪些 MCP Server?如果每个 Skill 都要单独写一套连接代码而不是走 MCP 协议,你的配置文件会变成什么样?
五、上门护理员阿芳(Agent 记忆)
阿芳做了十年社区上门护理。每天跑六七位老人家,量血压、换药、聊天。她随身带一块硬纸板工作板,上面能写的空间大概一张A4纸。
上午在王奶奶家,她记下:血压150/95,有点高,追问了昨晚睡得好不好,王奶奶说没睡好,邻居装修吵了一夜。又记下:降压药按时吃了。又记下:王奶奶说最近膝盖疼,让阿芳帮忙看看膏药还够不够。阿芳查了药箱,还有三贴。
到了下午,工作板写满了。她把上午的详细记录擦掉,换成一句话:“王奶奶上午血压偏高150/95,未按时入睡,降压药已服,膝盖疼膏药剩三贴。”
一上午三段详细对话,压缩成一行。
月底社区医生问她:“王奶奶最近一个月血压怎么样?“阿芳翻开家里的大本子——她每天回家把压缩后的记录按老人名字抄进去。翻到王奶奶那页,三十天的血压值排成一列,偏高偏低一目了然。
新来的同事问她:“为什么不把每天所有细节都记在大本子里?“阿芳说:“一天六七个人,每个人聊半小时,光对话就能写几十页。大本子一个月就满了。只记关键结论,需要细节的时候回去翻当天的护理日志。“
概念解析
Agent 记忆系统——分为短期记忆(上下文窗口)和长期记忆(外部存储),通过压缩策略在有限的上下文中保留最重要的信息,需要时从长期记忆中检索。
| 故事元素 | 映射概念 |
|---|---|
| 工作板(一张A4纸) | 上下文窗口(Context Window),容量有限 |
| 写满了 | Token 上限接近 |
| 擦掉上午详细记录 | 滑动窗口策略——丢弃旧消息 |
| 压缩成一句话 | 摘要压缩——用 LLM 总结历史对话 |
| 只记关键结论 | 重要性过滤——只保留关键信息 |
| 家里的大本子 | 向量数据库 / 长期记忆(External Memory) |
| 按老人名字索引 | 元数据标签,支持结构化检索 |
| 翻到那页一目了然 | 向量相似度检索,召回相关历史 |
| 回去翻当天的护理日志 | 需要细节时从外部存储重新加载 |
检验问题
- 理解检验:阿芳压缩记录时,把王奶奶”邻居装修吵了一夜”这条信息删掉了。如果后来发现王奶奶血压持续偏高,而原因是长期噪音导致失眠,阿芳能追溯回去吗?这说明压缩策略有什么风险?你会怎么改进?
- 迁移检验:你在和 Claude 长对话时,有没有遇到过”它忘了前面说过的话”的情况?用记忆系统的三层结构分析一下,Claude 在哪一层出了问题?
附:概念速查表
| 寓言 | 概念 | 核心一句话 |
|---|---|---|
| 中药材采购员 | RAG | 先查资料再回答,不凭印象瞎说 |
| 汽修工小陈 | ReAct | 想一步做一步看一步,循环到修好 |
| 川菜馆服务员 | Function Call | 我不炒菜,我只下工单 |
| 物业维修站 | MCP | 统一接口盒,谁来了都能插 |
| 上门护理员 | Agent 记忆 | 纸板写不下就压缩,重要的存大本子 |