Agentic AI学习笔记(3):从“能对话”到“能干活”的完整链路
写这个系列的第三篇时,我特意回看了前两篇的笔记边界。第一篇聊的是Agentic AI的基本概念,第二篇重点拆了智能体的规划能力,而这篇我想把视角拉到更实际的层面——一个Agentic AI系统到底是怎么从“能对话”变成“能干活”的。这个转化过程,恰恰是很多人在从Demo走向真实场景时最头疼的地方。
如果你也在做智能体相关的东西,一定有过这种感觉:模型能力很强,单个环节跑通也不难,但要把工具调用、上下文管理、任务拆解、结果校验串成一个能稳定产出结果的闭环,问题一下子就冒出来了。这篇笔记就是围绕这条完整链路展开的,讲讲我在实践里验证过的一些设计思路、踩过的坑,以及现在沉淀下来觉得真正好用的做法。无论你是刚接触智能体开发,还是已经在做多智能体系统,应该都能从这里找到一些可以抄作业的东西。
1. 再说说Agentic AI与传统AI的分水岭
1.1 从“模型”到“主体”的思维转换
传统AI应用的核心形态是“请求-响应”:用户输入一句话,模型返回一段文字、一个分类结果或者一次检索匹配。这种模式下,模型本身是纯粹的被动组件,它的上下文边界非常清晰,一次请求结束,状态就清零了。
Agentic AI最大的变化在于,它把模型从“被动应答者”变成了“主动行动者”。这不仅是技术栈的升级,更是一套完全不同的思维模型。传统AI关注的是“如何让模型答得更准”,Agentic AI关注的是“如何让模型在一个目标约束下,自己决定下一步该做什么”。
我打个比方。传统AI像一个很专业的接线员,你问什么它答什么,回答质量取决于它内部的知识库和检索能力。Agentic AI则像一个项目经理,你告诉它“把这个项目的市场调研报告写出来”,它不会直接给你一份模板了事,而是会先拆解任务——调研哪些维度、从哪里获取数据、用什么工具做分析、以什么结构输出,然后一步步执行,遇到问题还会调整策略。
这个转变带来的直接后果是,我们需要为模型设计的不再只是“提示词”,而是一整套运行环境:它能看到什么、能调用什么、记忆如何保存、失败如何重试、结果如何校验。这些内容共同构成了智能体的“生存空间”。
1.2 Agentic AI的典型能力边界与应用画像
聊能力边界之前,先说清楚Agentic AI现在能稳定做到什么程度。基于我在多个项目里的实际观察,它最成熟的能力集中在三个方向:
第一是多步骤任务执行。给定一个明确目标,智能体可以自动分解、按序执行、动态调整。比如让它“把某个网盘里的所有图片压缩后上传到另一个位置”,这种任务它几乎可以无缝完成。
第二是工具组合调用。智能体可以自主判断什么时候调用什么工具,并把多次调用的结果拼装成最终输出。比如数据分析场景里,它可能先调SQL工具查询数据,再调Python脚本做清洗,最后调绘图工具出图表。
第三是基于反馈的自我修正。当执行结果不符合预期时,智能体可以读取错误信息、调整策略、重新尝试。比如代码生成场景中,根据编译报错自动修复代码,已经是相当成熟的应用。
至于不太靠谱的领域,我的经验是:凡是需要长期保持全局一致性、涉及复杂多方博弈、或者需要严格领域常识的任务,智能体仍然容易翻车。比如让它独立管理一个跨月项目,或者在法律和医疗这类高合规场景里做自由决策,现阶段更适合“人审+机器跑”的半自动模式。
了解能力边界很重要,因为它决定了你该怎么设计系统——是把智能体放在主决策位,还是让它做辅助执行位。我的建议是:初期项目一律从辅助执行位开始,等你对它的行为模式有充分了解后,再逐步放大自主权。
1.3 为什么2024年后Agentic AI突然“能打”了
我在前两篇笔记里其实提到过这个问题,但这次想从工程角度再补充一个视角。Agentic AI的爆发,表面上是模型推理能力的提升,深层其实是三个工程要素的共同成熟。
一是工具调用(Function Calling)的规范化。现在主流模型都支持以结构化格式声明工具、让模型输出调用指令,这使得模型与外部系统的对接从“解析文本”变成了“解析JSON”,可靠性提升了不止一个量级。
二是上下文窗口的扩大。上下文从早期的4K、8K扩展到现在的128K甚至更大,意味着智能体可以把更多的历史记录、工具返回结果、中间推理过程同时纳入视野,这让长链路任务在工程上变得可行。
三是外部记忆与状态管理方案的成熟。向量数据库、KV存储、时序记录这些基础设施的普及,让智能体可以低成本地把“曾经发生过什么”沉淀下来,不再依赖上下文窗口硬扛一切。
这三条恰好对应了我在实际设计智能体时最关注的三个维度:接口能力、短期工作台、长期记忆。下面几个部分我会分别展开讲。
2. 智能体设计模式:从单轮到自主闭环
2.1 最核心的ReAct模式:推理与行动交替
目前几乎所有的Agentic AI系统,底层都在跑一个叫ReAct的循环模式。ReAct是Reasoning与Acting的合成词,核心思想是让模型在“思考”与“行动”之间交替推进:模型先根据当前状态推理下一步该做什么,然后执行一个具体的动作(比如调用工具或检索记忆),观察结果后再继续推理,直到任务完成。
你可以把它理解为“想想-做做-再看看”。这种模式的关键价值在于,它把模型的高层推理能力和外部工具的执行能力解耦了。模型不需要自己完成计算、搜索、写文件这些事情,它只需要负责“决策”——决定下一步调用什么工具、怎么解读结果、什么时候停止。
我在第一个智能体项目里,最开始用的是“一次性大提示词”方案:把所有工具描述和目标写进提示词,让模型一次性输出最终结果。效果惨不忍睹,因为模型根本没有机会在中间步骤获得反馈,一旦推理方向偏了,结果就全偏了。改成ReAct模式后,每个步骤都能拿到真实执行结果作为下一步的上下文输入,准确率提升非常明显。
如果你现在准备设计自己的智能体,别绕路,直接采用ReAct框架。它的实现并不复杂:一个循环——模型输出推理文本和工具调用指令;执行工具;把结果附加回对话历史;重复。
2.2 规划-执行-反思:让智能体“越做越稳”
纯ReAct模式有一个短板:它偏向“走一步看一步”,在任务复杂、步骤多的情况下,容易迷失方向。比如让它做一个包含数据采集、清洗、分析、可视化、报告生成五阶段的任务,如果没有全局规划,它可能在某个细节上反复打转,消耗大量时间。
解决这个问题,我实践下来的有效方案是增加一个“规划-执行-反思”的上层结构。
规划阶段,智能体先不急着动手,而是把目标拆解成子任务清单,明确每个子任务的输入、动作和验收标准。这一步看着简单,实际很考验模型对任务的全局理解能力。我的做法是给模型提供一个结构化的任务拆解模板,让它以JSON格式输出子任务列表,包括依赖关系。
执行阶段则回到ReAct循环,逐一完成子任务。反思阶段最容易被忽略,但它的价值极高——智能体在完成一轮执行后,回头检查结果与原始目标的差距,找出哪里偏了、哪里可以改进,然后决定是继续调整还是进入下一轮。
这个模式在实践中给我的感觉是:它把智能体的行为从“随机过程”变成了“受控过程”。你不再祈祷模型每一步都走对,而是通过规划确定方向,通过反思修正偏差,整体稳定性大幅提升。
2.3 工具调用与结构化输出的接口设计
工具调用是Agentic AI的“手”,接口设计直接决定了这只手够不够灵活。我在项目里总结出的核心原则是:工具描述要写清楚“什么场景用、什么时候不用”,而不仅仅是“这个工具能做什么”。
比如一个获取天气数据的工具,简单描述是“获取指定城市的天气信息”。但在一个旅游行程规划智能体里,更好的描述是“当用户询问目的地天气、穿衣建议、出行时间时,调用此工具获取实时天气;如果用户仅提及城市名而没有行程或时间需求,不要调用”。这种“触发条件+非触发条件”的描述方式,能显著降低模型的误调用率。
结构化输出方面,我强烈建议所有工具调用指令使用JSON格式,并且在系统提示词里约定好参数的类型、必填项和取值范围。比如:
{ "tool": "web_search", "params": { "query": "2024年新能源汽车销量数据", "region": "CN", "max_results": 5 } }对返回结果也要做同样的约束。我见过太多智能体项目,工具调用成功,但返回结果是一大段非结构化文本,模型解析困难,后续步骤全乱套。正确的做法是让每个工具返回严格的结构化数据,即使是自由文本搜索结果,也包装成统一的对象结构。
2.4 一个可以直接用的决策循环示例
把上面的模式落到代码层面,一个完整的Agentic决策核心其实并不复杂。我用伪代码梳理了一个最简可运行的结构,你可以直接参考:
def agent_loop(task, max_steps=20): context = [system_prompt, user_task(task)] for step in range(max_steps): response = llm.chat(context, tools=TOOL_SCHEMAS) if response.action == "finish": return response.answer result = execute_tool(response.tool_call) context.append(tool_message(result)) return "max_steps exceeded"这个循环的精髓在于“把中间结果回灌到上下文”。模型每一次决策都是基于前一次的真实输出,而不是凭空想象。我在实际项目里会在这个基础上加一些工程化细节,比如步骤上限、超时控制、日志记录、去重机制等,但核心结构就是这样。
有一点务必注意:任何一步都不能让模型在没有工具结果的情况下继续下一步。某些模型会在推理文本里“假装”工具已经执行了,直接给出结果,这种情况如果不校验,会导致整个链路的中间数据都是虚构的。我的解决办法是在系统提示词里明确“如果没有收到工具执行结果,不得继续进行下一步”,并在代码层面检测——如果模型输出的是最终答案但没有任何中间工具调用记录,视为非法状态,强制回退。
3. 上下文工程与记忆管理:智能体的“工作台”
3.1 系统提示词与上下文窗口的规划
如果说模型是智能体的“大脑”,上下文窗口就是它的“工作台”。工作台空间是有限的,怎么分配直接决定了智能体的表现上限。
我在项目里的通用分配策略是这样的:系统提示词占用5%-10%;用户的原始任务描述占用5%左右;工具定义与使用规范占用10%-20%;当前步骤的执行状态与中间结果占用30%-50%;历史记忆的摘要占用20%-30%。剩余空间保留给模型生成和未来几轮的上下文增长。
这套分配逻辑的核心是:不要让历史低级细节挤占当前决策空间。比如一个数据抓取任务,第三轮的页面解析失败详情,到第二十轮已经完全没有价值了,它唯一的意义是告诉模型“之前失败过一次”,但具体失败原因已经不重要。这种情况下,应该把细节压缩成一句话摘要,而不是让原文一直躺在上下文中。
系统提示词本身也要控制篇幅。我见过有人为了追求效果,把系统提示词写到了几万字,结果大量关键指令被淹没。更好的做法是分层:核心行为规则放在最前面(模型注意力最高的位置),工具描述和示例放在中间,低频规则和背景知识放在最后或者在需要时才注入。
3.2 记忆分级:工作记忆、短期记忆、长期记忆
记忆管理是Agentic AI工程和传统提示词工程最大的分水岭之一。我在实践中把智能体的记忆分为三级:
工作记忆对应当前任务循环内的上下文,包括系统提示词、当前目标、最近N轮推理与工具结果。它的特点是快、易失、空间有限,对应模型上下文窗口。
短期记忆解决的是“同一会话内跨任务”的信息保持。比如智能体在一次会话中先帮你查了航班信息,之后你说“帮我安排一下那趟航班前后的行程”,它需要能从短期记忆里调出航班号和时间。实现方式通常是把关键信息在每轮结束时同步到一个会话级存储(如KV数据库或内存对象),并在后续系统提示词中注入摘要。
长期记忆解决的是“跨会话”的信息沉淀。比如一个写作助理智能体,需要记住你习惯的文档格式、常用的写作风格、之前项目的历史决策。实现上一般用向量数据库存储历史对话的关键片段,按需检索注入。
三个级别的核心区别在于生命周期和访问成本。工作记忆按token计费、最快;长期记忆按检索计费、最慢但几乎无限。设计记忆策略的终极目标就是把合适的信息放在合适的层级,既不爆上下文,又不丢关键信息。
3.3 上下文污染:最隐蔽的故障源
上下文污染是我在所有Agentic项目里遇到的最阴险的问题。它的表现是:模型决策本身没错,但输入信息里混入了错误或过时的数据,导致最终结果全错。
一个特别典型的场景:智能体在执行多轮任务时,把早期某次工具调用的返回结果带了很久,而实际上这个数据已经过期了。比如先查了一次股票价格,后面又做了很多其他操作,最后要用价格信息时,模型从上下文里捞出来的还是最开始那个旧值。
我的应对方法是给关键信息加“时间戳”和“新鲜度标识”。每次工具返回的数据,包装成包含查询时间和有效期的对象;系统提示词里明确要求“使用数据前先检查时间戳,如果疑似过期,需要重新查询”。另外,在执行完某些操作后,主动清理上下文中已失效的信息,用一句话摘要替代原文。
另一个常见的污染源是工具的报错信息。某次工具执行失败返回了一段冗长的异常堆栈,这段内容留在上下文里,模型在后续推理时可能会把堆栈里的局部变量名当成有效数据。我的做法是工具执行层统一对错误信息做“脱敏摘要”,只保留错误类型和简短的下一步建议,原始堆栈只在日志里保留,不进上下文。
3.4 一个可落地的上下文压缩策略
当上下文接近窗口上限时,压缩是不可避免的。我在项目里常用的一套压缩策略分为三步,你可以直接照搬:
第一步,提取持久事实。从历史对话中找出那些不能丢失的信息,比如用户的偏好、已完成的子任务列表、关键决策依据。这类信息必须保留,但可以重写为更紧凑的表达。
第二步,压缩过程细节。把中间推理和工具调用细节压缩成“做了什么-结果如何”的一句话摘要。比如“调用搜索API查询了X关键词,获得5条结果,其中第2条相关度较高”压缩为“已搜索X,得到关键结果”。
第三步,丢弃冗余内容。比如重复的纠错过程、无关的日志片段、已经被后续内容覆盖的旧版本数据。这类信息直接删除即可。
压缩操作本身也有成本,所以我不会每轮都做,而是设置一个上下文占用阈值——比如达到70%时触发一次压缩,压缩后目标降到40%。这样既避免了频繁压缩的算力浪费,也防止了上下文溢出导致的任务中断。
4. 多智能体协作:从单体到团队的演进
4.1 为什么要拆分多个智能体
单体智能体在任务复杂度上升到一定程度后,会出现两个明显的瓶颈:一是上下文和工具定义塞在一个系统提示词里,互相干扰严重;二是模型在长链路中容易累积误差,一个环节出错,后续全跟着偏。
多智能体架构不是炫技,它解决的问题非常实际。把一个大而全的智能体拆成多个各司其职的小智能体,每个智能体只保留与自身职责相关的提示词、工具和记忆,上下文占用大幅降低,决策准确率显著提升。
我做过的一个比较典型的案例是内容生产系统。单体方案让一个智能体完成选题、资料收集、写作、配图、发布全流程,结果经常出现选题环节还在讲段子,写作环节就跑偏到另一个方向的情况。拆成五个智能体后,每个智能体只专注自己那一段,上游输出直接作为下游输入,整体质量立刻上了一个台阶。
4.2 协作模式:编排、竞争、流水线
多智能体的协作模式,我实践下来主要有三种,各有适用场景。
编排模式(Orchestrator)是最常用的一种。一个主控智能体负责理解任务、拆分子任务、分发给各个专家智能体、汇总结果。这种模式适合任务类型多变、需要灵活分配的场景。优点是弹性好,主控可以根据任务特点动态调整分工;缺点是主控智能体的决策质量会直接影响整体上限,而且分发和汇总都有额外的上下文开销。
流水线模式(Pipeline)适合流程固定、步骤明确的场景。每个智能体是流水线上的一个工位,输入从上一位流入,加工完传给下一位。这种模式最大的优点是每个智能体的职责边界极其清晰,调试定位问题非常方便。缺点是流程一旦中途需要改变,整体调整成本较高。
竞争模式(Competitive)是我最近尝试比较多的一种。让多个智能体用不同思路解决同一个问题,再由评审机制选出最优结果。适用于正确答案标准明确、但解题路径多样的任务,比如代码优化、文案创作、方案策划。它对应的代价是计算成本成倍上升,因为每个竞争者都需要完整跑一遍。
4.3 多智能体系统的通信协议与数据格式
多智能体之间怎么通信,是项目初期最容易忽视、后期最痛苦的决策点。我吃过亏,所以现在都把通信协议放在设计的第一步。
我的推荐方案是采用“消息总线+标准化信封”的架构。每个智能体不直接调用其他智能体的内部接口,而是把消息发到总线上,由路由规则决定谁接受处理。消息统一采用类似这样的结构:
{ "msg_id": "uuid", "sender": "planner_agent", "receiver": "research_agent", "msg_type": "subtask", "payload": { "task_id": "task_001", "description": "收集2024年新能源汽车市场数据", "constraints": { "deadline": "2024-06-30", "format": "json" } }, "timestamp": 1710000000 }这个结构的价值在于,每个消息自带“任务ID”和“时间戳”,可以实现全链路追踪。我在实际项目中会为每个子任务生成一个全局唯一的ID,所有与之相关的消息、工具调用、中间结果都带这个ID,最终复盘时可以直接拉出完整的事件链,定位问题非常高效。
还有一个容易被忽略的细节:下游智能体收到上游结果后,必须做一次“格式校验”,不能盲目信任。我在系统设计里会给每个消息接口定义一份JSON Schema,接收端先校验再处理,格式不对就退回给上游重新生成。这个机制看似增加了一步操作,实际上避免了大量下游因数据格式问题产生的连锁错误。
4.4 多智能体系统里的“角色漂移”问题
多智能体系统运行一段时间后,我注意到一个很有意思的现象,我称之为“角色漂移”。每个智能体的系统提示词里都定义了明确的职责边界,但在实际协作过程中,由于上下文中混入了其他角色的输出,智能体会逐渐“学坏”——开始做职责之外的事情,或者模仿其他智能体的行为风格。
比如一个数据清洗智能体,如果它的上下文中经常出现上游分析智能体的长篇输出,它可能会在回复时连带做了分析总结的工作,导致产生重复劳动和职责混淆。
我的应对方案是在两个层面同时做约束。一是系统提示词里用较强硬的语言划定“禁区”,“你只能做数据清洗,不要做任何分析或总结;如果你发现需要分析,请将任务发送给analysis_agent”。二是在工程层面做“上下文隔离”,上下游通信时只传递标准化数据对象,不传递对方的完整对话历史,最大程度减少角色信息的互相渗透。
这个问题的隐蔽性很强,如果不去刻意检查,系统可能在跑了几百轮之后变得越来越乱,但每一轮单看都“没毛病”。我现在的做法是在多智能体系统的日志里加上一个“角色行为监控”,定期统计每个智能体的输出内容与自身职责的相关度,一旦发现偏离就触发告警和提示词修正。
5. 常见问题与排查技巧实录
5.1 工具误调用与参数幻觉
工具误调用是Agentic AI项目里最高频的问题。最典型的表现是模型在不需要工具的步骤调用了工具,或者工具参数张冠李戴。我遇到过一个案例,智能体在回答一个简单的常识问题时,莫名其妙调用了数据库查询工具,而且查询参数还是从用户输入里猜的。
排查这类问题的第一件事是看日志里模型的“推理文本”。现在的模型在输出工具调用前,通常会先写一段“思考过程”,里面会说明它为什么决定调用工具。如果这段推理逻辑不通,说明是提示词层面的触发条件设置有问题,需要改工具描述;如果推理通顺但调用的参数错了,那大概率是模型对参数语义理解有偏差,需要在工具Schema的字段描述里加更明确的语义解释。
另外一个经典的参数幻觉场景是日期和数字。模型经常会把“下周一”理解错,或者把单位从万元看成元。我的做法是:所有工具参数里涉及日期、数字、货币的字段,一律在Schema描述里加上明确格式要求和取值范围,同时在系统提示词里强调“参数必须来自用户输入或工具返回结果,不得自行推测”。
5.2 重试风暴与死循环
智能体在高自主权模式下,可能会出现“重试风暴”——同一个操作反复失败、反复重试,不仅浪费算力,还可能因为频繁调用外部API触发限流,甚至导致整个系统卡住。
我遇到最极端的一次,一个爬虫智能体因为目标网站反爬机制升级,连续重试了四十多次同一请求,把IP封了,还把当天的API调用额度全部耗完。
解决重试风暴,我的经验是两个机制缺一不可:一是硬性的步骤上限,无论什么任务,智能体最多执行N步(我通常设为20步),超了就强制终止并返回当前进度报告;二是阶梯式退避,同一步骤连续失败的次数越多,下一次重试的等待时间越长,同时把“延后重试”和“更换策略”的决策权交给模型——在系统提示词里明确“如果同一操作连续失败超过3次,必须更换方法,禁止继续重试”。
5.3 输出质量不稳定:如何评估“好”还是“坏”
Agentic AI系统和传统AI系统在质量评估上的最大区别是:传统系统可以用准确率、召回率这些明确指标,而智能体的输出是多步骤综合结果,中间任何一步的质量偏差都会累积到最终输出上。
我在实践中采用的方案是“分段评估+锚点校验”。分段评估指在任务拆解的每个子任务完成后,都设置一个质量门禁,只有通过门禁才进入下一步。锚点校验指在关键节点设置可量化的验证条件,比如数据任务里检查行数、类型、空值率,文档任务里检查必含章节、关键词覆盖度。
更生活化一点说,就像做菜不是最后尝一口,而是每道工序都有人把关——切好的菜检查刀工,炒的过程看火候,装盘再检查色泽和味道。这样即使某个环节出了问题,也能在第一时间定位,而不是等到最后全乱套了才去排查。
5.4 排查实录:一个典型的上下文脏数据案例
分享一个我之前调试的真实案例,很有代表性。某个数据处理智能体在跑一个“从10个网站抓取产品信息并汇总对比”的任务。前三轮都很顺利,但从第四轮开始,输出的汇总表格里开始混入一些奇怪的数据——比如某个产品的价格突然变成了一串数字乱码。
排查过程是这样的:先看消息日志,发现智能体在第三轮调用了一个网页解析工具,返回结果里包含了一段JavaScript代码。第四轮时,模型在生成最终表格时,不知怎么把这段JS代码里的变量名当成了产品名称填充了进去。
根因是什么呢?工具返回的网页解析结果没有做结构化提取,把整个HTML文本包括脚本代码都返回了。模型在上下文中分不清哪些是“数据内容”哪些是“页面噪声”。修复方案是先清洗工具返回结果,只保留目标字段的JSON结构,并在系统提示词中补充“忽略所有非数据类文本内容”。
这个案例给我的教训是:工具返回什么,智能体就会信什么。数据质量的第一道防线永远在工具执行层,不在模型推理层。模型只是消费者,工具才是生产者。
6. 多模态与记忆分层:进阶方向提前看
6.1 多模态信息在智能体中的流转
如果你已经开始接触一些真实场景的项目,一定注意到了多模态信息的重要性。很多任务并不仅仅是纯文本处理,还涉及图片、音频、表格、甚至视频片段。多模态Agentic AI就是要让智能体不仅能“读文字”,还能“看懂图、听懂音、处理表格”。
我在某个内容理解项目里,让智能体同时处理一个包含图文混排的网页——它需要先使用图像理解工具对配图做内容识别,再把识别结果与正文文本合并,才能做完整的语义分析。如果只做文本处理,这个任务根本没法完成。
多模态信息在智能体中的流转有一个关键环节:跨模态对齐。文字描述说“图中有三个人”,图像识别模块需要能理解“三个人”对应的是视觉检测里的三个人形框。我在实践中发现,直接让模型在纯文本上下文中处理图像描述是不够的,更稳妥的做法是让图像模块输出高度结构化的描述,比如“人物:3;位置:画面中央;动作:站立交谈;周围物体:桌子、笔记本电脑”,然后让推理模块基于结构化描述做判断。
从工程角度看,多模态信息还有两个额外成本需要考虑:一是存储成本,图片、音频比文本大几个数量级,如果都塞进上下文或记忆库,费用会急剧上升;二是推理时延,多模态编码比纯文本慢很多。所以我的建议是,能用文本表达的多模态信息先用文本摘要替代,只在真正需要像素级判断时才保留原始数据。
6.2 记忆分层的实现方案选型
之前的章节已经讲过记忆分级的策略,但在具体实现上,选型也很关键。我整理了一下目前实践中比较稳定的组合方案:
工作记忆不用建存储,直接依赖模型上下文窗口就行。短期记忆推荐用Redis或者内存KV,键用会话ID,值用结构化的关键信息摘要,TTL设置成会话时长即可。长期记忆一般用向量数据库,比如开源的轻量方案或者云上的向量检索服务,在系统提示词需要历史信息时,按相似度召回TopK条片段再注入上下文。
这里有一个我在项目里逐步优化的细节:长期记忆的召回时机。早期方案是每轮都做向量检索然后注入全部命中结果,上下文很快就被历史片段塞满了。后来改成“需求触发——只有当前步骤的任务类型匹配到历史相关度超过阈值时,才召回历史片段”。这个改动让长期记忆真正成了“按需取用”,而不是“总觉得有用就全塞给你”。
如果你刚开始接触这个方向,我的建议是不要一上来就用很重的记忆组件。先用最简单的方式——把历史对话的关键信息手动抽成JSON存下来,下一轮直接拼到系统提示词里。跑通之后,再逐步替换成向量检索等更高级的方案。
6.3 从单智能体到多智能体系统的演进路径
很多读者问过我:单智能体还没做好,要不要直接上多智能体?我的答案一直是:不要跳级。多智能体系统的复杂度不是单智能体乘以N,而是N个智能体之间的交互网络带来的指数级不确定性。
我建议的演进路径是四步走。第一步是跑通单体智能体的ReAct闭环,确保工具调用和上下文管理的基本功扎实。第二步是给单体智能体加上记忆分层,让它可以跨会话延续任务。第三步是尝试“主控+专家”的轻量编排模式,只拆两三个智能体,明确消息协议。第四步才是完整的流水线或竞争模式。
这四步我每一步都走过,最惨烈的教训发生在直接从第一步跳到第四步的阶段——一次上线,五个智能体互相发消息,通信协议没定好,结果死循环和竞态问题层出不穷,最后花了大把时间做协议规范化,才把系统救回来。
所以,如果你准备做多智能体系统,请先把通信协议和消息格式想清楚,再写任何业务逻辑。这方面的投入绝对是性价比最高的。
7. 我自己在实操中最深的三点体会
这篇笔记已经写得够长了,但有几条不属于任何技术章节的实操体会,我还是想单独记录下来。
第一点是关于预期管理的。Agentic AI给人的第一印象是“它能自己干活了”,但真正上手后你会发现,它更像是一个“能力很强但需要明确边界和规则的新同事”。你要给它清晰的岗位说明书(系统提示词)、好用的工具(接口设计)、合理的工作流程(规划-执行-反思循环),它才能真正发挥价值。指望丢一句话它就能自动搞定一切,目前还不现实。
第二点是关于调试方式的。调试Agentic AI系统跟调试传统程序完全不同。传统程序是确定性的——输入相同输出一定相同;智能体则充满了随机性,同样的输入每次跑结果都可能不一样。所以你的调试方法要从“找BUG”变成“找倾向”——不纠结某一次为什么错,而是统计它在100次运行里为什么有20次错。日志和可观测性在这里不是辅助工具,而是生命线。
第三点也是我觉得最重要的:从一个足够小的真实场景开始。不要一开始就设计一个什么都做的通用智能体,从“帮我整理这个文件夹”这种明确、有限、可验收的任务开始。等你把这个小场景打磨到“稳定、可信、好调试”的状态,你会对Agentic AI的工程细节产生非常扎实的体感,这时候再扩展任务边界、增加智能体数量,就会发现很多设计决策是顺理成章的。
这套笔记的下一篇,我打算写写模型选择与成本控制的话题——不同规模的模型对智能体行为和运行成本的影响,以及在高频调用场景下如何做预算策略。那个话题同样是从项目实战里长出来的干货,到时候再和大家细聊。