智能体系统设计核心:从ReAct到可靠性、可观测性与成本控制

发布时间:2026/10/26 20:40:15
智能体系统设计核心:从ReAct到可靠性、可观测性与成本控制 我看完 CS329Z 第一讲“智能体系统导论”之后当天就把笔记改了三遍。第一遍几乎是视频原话摘要没有自己的增量第二遍开始想为什么这门课开篇不讲怎么写一个 Agent demo而是花很大篇幅讨论可靠性和责任边界第三遍才意识到智能体系统这门课真正要回答的问题不是“模型够不够聪明”而是“系统在真实环境里能不能稳定完成任务”。这一讲的信息密度比很多付费训练营一周的内容还高非常适合已经在用 LLM 做应用、正从“能跑 demo”向“准备上线”过渡的人来看。我尽量把课程核心拆开再结合自己实际搭建智能体系统时踩过的坑整理成这篇能直接当参考的笔记。1. 先搞清楚这门课解决什么问题1.1 智能体不是一个新概念工程化却是新课题智能体Agent这个词在人工智能领域已经存在了几十年早期更多是作为学术概念出现在课本里比如感知、决策、执行这一套经典循环。可 CS329Z 第一讲给我的第一个冲击就是它完全站在工程视角重新定义智能体智能体不是一个模型而是一个由模型驱动的系统。换句话说单纯调用 LLM 接口拿到一段文本那只是普通应用开发只有当 LLM 参与决策、输出行动指令、调用外部工具并观察结果、再决定下一步怎么做的时候你才真正开始搭建智能体系统。这种区别听起来简单实际影响非常大。我最早做智能体相关功能时认为只要把模型接上几个 API 就算完成了一个 Agent。结果产品上线测试智能体在简单的“查天气、安排日程”场景里表现尚可一旦遇到需要跨系统获取信息、确认信息、再执行写入的场景就开始频繁出错。第一讲里反复强调的“自主性”和“环境交互”恰恰就是我不稳定的原因我没有为智能体设计清晰的感知边界也没有定义行动失败时的处理策略。这里能明显看出课程的一个特点不绕弯子一开始就把智能体放在“真实系统”里讨论。它要求你思考感知、决策、行动、反思这四个环节分别由谁负责而不是笼统地说“让 AI 自动完成”。这也回应了近年智能体火起来之后最常见的误区——以为智能体是 LLM 的附加功能本质上还是一问一答实际上它是一整套工程系统需要构建输入反馈通道、工具接口、状态存储和失败恢复机制。1.2 第一讲真正想解决的核心痛点课程从头到尾都在强调一个词可靠性。这也是我听完之后最有共鸣的部分。智能体系统计划性再强只要在真实环境里运行就必然面对歧义输入、工具返回格式不稳定、外部服务超时、模型幻觉这些现实问题。第一讲指出构建可靠智能体系统的关键不是追求准确率 100%而是在错误发生时系统能识别、能恢复、能有边界地终止。另一个核心痛点是可观测性。传统软件代码出问题可以查日志可以直接打断点但智能体系统的行为由模型驱动每一步决策都有概率性。第一讲里提到一个观点我印象很深智能体的输出不是一个函数式 return而是一系列可能未被预设的行为轨迹。正因如此工程上必须记录完整的思考过程、行动调用链、工具返回摘要才能在上千次运行中定位问题所在。第三个痛点则是成本控制。很多团队做智能体原型时都很兴奋因为模型能自己规划任务、自己调用工具效果看起来不错但一旦放量测试token 成本立刻失控。课程第一讲特别提醒智能体不是“免费魔法”每多一次规划、多一次反思都在消耗计算资源。合理的目标是让智能体在最少的步骤内完成任务而不是鼓励它事无巨细都“想一遍再做一遍”。这三个痛点加起来构成我理解这门课的底层框架可靠性、可观测性、成本。几乎所有后续章节都是围绕这三点展开的。2. 第一讲核心概念梳理智能体系统的定义与边界2.1 智能体的组成要素感知、决策、行动、反思第一讲把智能体拆成四个核心要素我用做产品的口吻重新表述一遍。感知解决的是“智能体如何获得当前状态”它既可以是纯文本提示词中的信息也可以是读取文件、查询数据库、调用搜索 API 的结果决策解决的是“下一步该做什么”这是 LLM 发挥作用的地方它基于当前观测和既定目标给出动作计划行动则是把决策转化为外部可观测的副作用比如发送邮件、更新工单、执行一段代码反思是对行动结果进行评估判断是否达到目标如果没达到则修正下一步策略。这四个要素里最容易忽略的是反思。我早期搭智能体时设计成“模型输出工具名 - 程序执行工具 - 把结果返回模型 - 模型再输出”看起来已经有闭环但其实没有真正的反思机制当同一个工具连续返回错误时模型只会反复重试同一种方法而不是停下来重新拆解任务。第一讲指出反思不是一个可选项而是鲁棒系统的必要组成部分。恰当的做法是让智能体每隔几步就生成一段“当前进度、距离目标还有多远、下一步是否更换策略”的自我评估把它作为下一步决策的一部分。为了便于理解可以把智能体类比成一个需要开车的导航员感知是看清路况决策是规划路线行动是踩油门打方向盘反思是发现前方堵车后重新规划。没有反思的智能体就像一个不看实时路况、只按固定导航走到底的司机能跑通顺畅路段但一遇意外就卡死。2.2 智能体系统与传统工作流、普通 LLM 应用的本质差异很多文章把智能体系统和传统工作流混为一谈这其实是两类根本不同的系统。传统工作流是预先编排好的比如写一段 Python 脚本调用三个 API每个步骤固定、输入输出结构固定出现异常分支也要提前用代码写清楚智能体系统则把任务目标交给 LLM由它在运行时动态选择路径。前者适合流程稳定、规则明确的场景后者适合任务开放、需要适应变化的场景。但课程第一讲给出了一个很实用的判断标准不要为了“智能”而智能。如果一个任务用 20 行确定性代码就能完成那完全没有必要把它交给 LLM。智能体的真正优势在于处理非结构化信息、进行跨领域推理、协调多工具完成复杂目标。我接手过的几个智能体项目里凡是把“从数据库取数然后填进模板”这类固定流程硬塞给 Agent 的最后都变成高成本、低稳定性的方案反而是那些把规则写清楚、只在关键歧义处调用 LLM 的混合系统运行得最可靠。课程里还比较了普通 LLM 应用与智能体应用的另一个差异普通应用默认输入一句话、输出一句话上下文范围明确智能体应用必须维护一个跨多轮、多工具的状态空间。这意味着你的程序需要有自己的状态管理机制而不能仅仅依赖模型的对话窗口。第一讲的结论很直接智能体系统的复杂度不在于“接入 LLM”而在于围绕 LLM 构建的状态管理、工具管理、错误处理和责任链设计。2.3 一个最小可用智能体需要哪些组件听完第一讲我给自己画了一个最小可用智能体的组件清单虽然课程没有给出一份固定清单但这个结论是从课堂反复强调的责任、工具、记忆中推导出来的我按自己的实践经验整理如下。第一是核心控制器也就是具备规划能力的 LLM负责读懂目标、生成下一步行动。第二是工具注册表把外部能力封装成统一的函数描述并包含了工具入参的 schema、返回格式说明供 LLM 在决策时选择。第三是短期工作记忆一般是上下文窗口内的对话记录保存最近的观测和行动结果。第四是长期存储通常是向量数据库或结构化数据库用于保存跨会话需要复用的知识和历史。第五是安全与终止机制包括最大步数限制、敏感操作确认、成本上限等这五个组件缺那一个都会在真实使用中暴露问题。我举一个反面例子有次我图省事没有给智能体加最大步数限制结果它在一次网络搜索失败后反复重试 40 多次产生了大量无效 token最后账单出来我才发现成本远超预期。从那以后任何智能体系统我都要加三层终止条件步数上限、超时阈值、重复检测。这不只是工程纪律更是对运行成本的敬畏。3. 智能体系统的架构模式与设计取舍3.1 ReAct 模式让“想”和“做”交错发生CS329Z 第一讲在介绍基础架构时重点提到了 ReAct 模式这是目前我接触过的智能体实现里最常见也最有效的模式。ReAct 的核心思想是把推理轨迹Thought和行动轨迹Act交错放在同一个循环里智能体先根据当前观测形成一句推理再决定调用哪个工具得到工具返回结果后再形成新的推理如此循环直到任务完成。我在一个内部知识库问答系统里用过这种模式效果立竿见影。以前直接让 LLM 根据上下文回答经常出现模型编造数据的情况改成 ReAct 结构之后模型遇到不清楚的内容会自动选择“搜索知识库”这个动作拿到结果后再继续推理回答的可信度明显提高。这里的关键是系统给 LLM 提供了“不知道就去查”的路径而不是逼着它在信息不足时强行作答。ReAct 的实现并不复杂但有两个细节很影响效果。一是工具描述要极其明确告诉模型这个工具处理什么类型的问题、输入参数的约束、预期返回的数据结构二是推理长度要控制ReAct 并不要求模型像写散文一样展开推理很多场景只需要一两句简短思考就立刻行动。这个链条太长容易让模型陷入过度分析反而降低了任务完成率。课程里还提到 ReAct 是为了解决 LLM 在复杂推理中“有行动无推理”或“有推理无行动”的问题。我现在构建大多数单任务智能体都会默认从 ReAct 开始因为它简单、透明、每一步对用户都是可解释的这在工程调试时非常重要。3.2 Plan-and-Execute 与反思循环从单步到全局ReAct 虽然好用但遇到步骤特别多的长任务时它有一个天然问题每一步都依赖模型实时决策长时间运行后可能偏离初始目标。第一讲把另一种模式也拎出来做了对比也就是 Plan-and-Execute 模式。这种模式下智能体先进行一次全局规划把任务拆成若干子步骤然后逐个执行而不是每一步都重新规划全局。这个模式的优点是稳定性更强、成本更低因为它减少了模型重复思考的次数。我比较推荐在任务结构清晰、范围固定的场景里使用 Plan-and-Execute。举个例子做一场发布会的数据汇总任务可以拆解为“收集报名数据 - 统计来源渠道 - 生成图表 - 撰写总结报告”。全局规划一次就确定了路径后续主要是执行和局部调整这样智能体的行为会很可控。但 Plan-and-Execute 也有明显短板如果任务需要根据执行中获得的实时信息大幅调整计划用固定计划就容易僵硬。所以课程实际上给了我一个很实务的启示没有绝对最优的模式只有适不适合当前任务。短任务、强交互、信息不确定时优先 ReAct长任务、结构清晰、需要稳定执行时优先 Plan-and-Execute。我在实际项目里还做过两者的混合先全局规划再在每个子步骤内部采用 ReAct 的思考-行动循环效果比单一模式要好当然复杂度也上去了。反思循环在第一讲里被单独强调我理解它是保证整体质量的后置机制。执行完一个阶段后智能体需要自己检查结果是否满足要求再把检查结论写回系统。比如代码生成智能体在写完代码后提供一个“自动执行测试并看日志”的工具让智能体根据测试结果修正代码闭环就形成了。3.3 单智能体还是多智能体我踩过的分案坑第一讲在多智能体部分的态度很克制反而是这部分让我最有收获。现在很多项目一上来就要做多个角色协作、互相讨论的“多智能体系统”但课程提醒多智能体不是免费的组件数量叠加智能体之间的协作成本、上下文隔离问题、责任归属问题都会成倍增加。我自己曾尝试把一个简单的“内容选题-写作-配图”流程做成三个智能体分工协作结果在传递信息时频繁出现格式丢失、上下文不连续的问题。后来我把其中一个环节抽成普通函数只有真正的写作用了 LLM系统稳定性立刻提升。这个经历让我明白了一个原则能用一个智能体完成的任务就不要用两个多智能体的收益应该来自“任务天然需要不同专业知识”而不是“听起来更高级”。第一讲对多智能体的分类也很有参考性有协作式、有竞争式、有主从式。协作式适合模块间互相配合竞争式适合互相校验答案主从式适合一个主导者调度多个专员。选择哪种模式取决于你的任务是否真的需要不同角色持有不同上下文。如果所有角色都看到同一份完整上下文那多智能体带来的往往只是额外延迟没有本质增益。4. 用第一讲的思想做一次实操落地4.1 搭建一个最小闭环的 ReAct 智能体理论听再多不如亲手搭一个。听完第一讲之后我用一个周末把课上讲的 ReAct 模式落地成了一个最小系统目标是做一个“能查本地 SQLite 数据库、能调用外部天气接口、并自动汇总回复”的任务智能体。这里我不引入重量级框架只依赖一个 OpenAI 兼容的模型接口和一些基础 Python 代码这样效果和原理都能看得清清楚楚。第一步是准备环境我用一套精简的依赖列表避免过度堆砌框架openai、sqlite3、requests、python-dotenv。我选择 SQLite 作为数据源是因为它是一个文件就能跑起来非常适合做原型验证。系统的总体结构是三部分一个函数列表里面定义了工具函数一个执行循环反复运行“读取工具列表 - 调用模型生成动作 - 执行动作 - 返回结果”一个全局消息列表记录所有思考和工具结果。最小框架代码可以这样组织import json import sqlite3 from openai import OpenAI client OpenAI() TOOLS { query_sales: { function: lambda: 本月销售额: 128万, 主要来源: 华东区60%, description: 查询本月销售汇总数据, parameters: {} } } def run_agent(task): messages [ {role: system, content: 你是任务型助手。严格按步骤完成任务只调用给定的工具。}, {role: user, content: task} ] max_steps 5 for step in range(max_steps): response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, tools[ { type: function, function: { name: name, description: info[description], parameters: {type: object, properties: info[parameters]} } } for name, info in TOOLS.items() ] ) msg response.choices[0].message messages.append(msg) if msg.tool_calls: for call in msg.tool_calls: tool_name call.function.name args json.loads(call.function.arguments) print(fSTEP {step}: 调用工具 {tool_name}, 参数 {args}) result TOOLS[tool_name][function](**args) messages.append({ role: tool, tool_call_id: call.id, content: str(result) }) else: print(fSTEP {step}: 最终回答 - {msg.content}) return msg.content return 达到最大步数任务未完成这个框架对应的就是第一讲里 ReAct 模式的直观体现。模型在 tool_calls 为空时意味着它认为自己已经拿到了足够信息于是输出最终答案如果模型需要数据它就会输出一个参数化的工具调用。代码里几个关键点要注意max_steps 是终止条件我把它设为 5防止模型无限循环工具返回结果必须作为 roletool 的消息回填到消息列表否则模型看不到执行结果所有工具描述都写清用途因为模型是通过这些描述来做工具选择的。在实际跑的过程中我会先修改 TOOLS 字典加入一个天气查询函数再观察运行日志。正常情况下输出应该是模型先调用天气工具拿到返回结果后再生成总结异常情况下会出现连续调用同一个工具但参数完全没变化的情况这种时候 max_steps 就会兜底终止同时日志记录下失败轨迹供我分析。4.2 给智能体加一层容错与自省机制只有 ReAct 循环还远远不够第一讲强调的可靠性必须在代码层面落地。我给这个最小系统加了两个机制一个是工具失败重试策略一个是在线自省检查。工具失败重试策略很简单当工具抛出异常或返回错误标志时不直接把错误文本原样扔给模型而是先将错误标准化再附加一段提示“以上操作失败了请换一种方式解决问题”。这个改动非常有效。有一次我故意让模型查询一个不存在的表模型第一次调用 SQLite 工具失败后会因为错误提示而转向先用 list_tables 工具查表结构然后才发起正确的查询。如果没有标准化的失败提示模型很容易把数据库报错当普通文本继续处理或者编造一个不存在的查询结果。在线自省检查则更接近课程所讲的反思环节。我在每个循环末尾加上一步如果当前步数大于 2就让模型额外生成一段 json 格式的评估内容包括“是否已经完成任务”“当前进展”“建议下一步调整”。虽然这会增加一次模型调用但对复杂任务来说很值它能显著减少智能体偏航的概率。这里是自省检查的关键代码片段def self_reflect(messages): reflect_prompt ( 请评估当前进展并回答三个问题\n 1. 是否已经完成任务\n 2. 当前距离目标还缺什么信息\n 3. 下一步应该用什么工具\n 请用JSON格式输出。 ) messages.append({role: user, content: reflect_prompt}) resp client.chat.completions.create( modelgpt-4o-mini, response_format{type: json_object}, messagesmessages ) result json.loads(resp.choices[0].message.content) return result这段代码的价值在于把智能体从“无头苍蝇式执行”拉回“有目标地推进”。我通常会把自省结果打印到控制台方便观察模型是否意识到自己跑偏了。从输出日志能明显看到有自省的版本在遇到连续失败时会改变策略而不是坚守最初的错误计划。这个体验让我相信第一讲把反思作为核心概念并不夸张它是让智能体具备基本“元认知”的极简实现。4.3 本地运行效果与关键指标观测系统搭好后我在真实数据集上测了三类任务简单查询、多步验证、需要失败恢复的任务。简单查询基本一次成功模型调一次工具就能给出答案多步验证通常需要三轮左右的思考-行动循环全程无偏差失败恢复任务最考验可靠性模型第一次调用出错后会因为标准化错误提示调整策略最终在第三或第四步完成任务。我在运行过程中同时观测了延迟和 token 成本两个指标。一个明显的感受是加了自省机制后单次任务调用次数从 2 次增加到 3 次以上成本上升大约 40%但任务成功率也从 60% 提升到 85% 左右。值不值这个成本取决于你的应用场景。如果任务是高价值低频加入自省完全没有问题如果是超高并发低价值场景我会选择只在关键节点加入自省而不是每一步都自省。这里我建议大家也试试把工具返回摘要化。当工具有可能返回大量文本时我会在函数内部先做一层截断只保留关键字段比如把一百行数据库结果聚合成三条统计数据。这样做一方面节省 token另一方面也减少了模型被无关细节干扰的概率。课程虽然没有直接给出这个技巧但第一讲在讨论系统设计时反复强调成本和可靠性的平衡我认为这就是很好的落地策略。5. 常见问题与排查技巧实录5.1 智能体陷入循环token 烧光还在打转我在测试时遇到的最典型问题是智能体陷入循环不停重复同一个工具调用且参数几乎没有变化。这种现象通常是两个原因造成的一是工具返回的信息没有进入模型可见的上下文模型以为自己还没拿到结果二是模型没有收到“此路不通”的反馈导致它不断尝试同一路径。排查方式很简单打印完整调用链查看每一步 messages 列表里是否包含对应的 tool 消息。如果工具执行了但消息没有回填那问题一定在你组装消息的代码里。另一个排查点是检查 max_steps 是否生效如果设为 0 或忘记设置智能体就会无限循环。我后来在代码里强制要求 max_steps 最小值为 5并且加入了重复动作检测当同一个工具名和相同参数连续出现三次时中止执行并提示人工介入。这个问题的本质上是对第一讲中“终止条件”概念的实践一个可靠系统必须预设失败出口不能让智能体以试错方式无限消耗资源。把循环日志和工具参数打印出来往往能很快定位是逻辑问题还是模型理解问题。5.2 工具调用失败后模型“假装成功”另一个隐蔽问题很难发现工具明明抛出了异常但模型在下一轮回答中仍然把结果描述为成功看起来像一切都正常。出现这种情况是因为工具异常文本被直接放进了工具返回消息而模型没有从语义上判断这是失败信息或者错误信息不够显眼。解决办法是把异常包装成结构化错误块加上明确的标志字段。我一般会在工具函数里捕获所有异常返回形如 status: failederror_code: 500message: 查询超时的 JSON 文本而不是让 Python 抛出的原始异常直接暴露给模型。这样做之后模型识别失败的能力显著提高因为它能直接读取 status 字段而不是从一段混乱文本里猜测。为了进一步减少“假装成功”我会在某些高风险工具后增加校验步骤。比如智能体需要向数据库写入记录完成后我会额外执行一次读取验证确认写入了多少行再把这个数字返回给智能体。第一讲强调系统责任实际上这个校验动作就是把责任落到代码而不是模型自信上。5.3 上下文爆炸记忆管理不当的连锁反应智能体每执行一轮都会往消息列表里追加一次思考、一个工具结果还可能追加一次自省输出。如果任务步骤多上下文消耗速度会比想象中快得多最终要么触发 token 上限要么因为上下文过长而让模型忽略早期重要信息。课程第一讲在记忆部分提到的观点很务实短期记忆不等于完整堆砌所有历史消息。我现在的做法是在每一轮循环开始前压缩旧消息只保留最近两轮的完整细节更早期的信息先做摘要。比如将之前的工具结果、思考内容压缩成一句“此前已完成 A 和 B结果为 C”再作为 system 消息的一部分注入。这种摘要式记忆让我的智能体能处理更长任务但也会带来风险摘要过程中可能丢失关键细节。所以我同时设置了最关键的不可压缩信息比如任务目标、用户约束、失败记录。这些信息始终保留在上下文中不受摘要策略影响。上下文爆炸没有万能解法本质上是记忆层级的设计问题我建议所有做智能体的人尽早考虑而不是等出现 token 超限再补。5.4 评估智能体系统的三个关键指标第一讲虽然没有展开讲评估但从整节课强调的可靠性和成本来看我在实践中总结出三个必须关注的指标任务完成率、平均步数、失败类型分布。任务完成率衡量的是智能体在多长时间内完成多少目标任务它需要和随机输入混合测试才能暴露概率性问题。平均步数则反映智能体的效率步数越少通常意味着 token 成本越低、越稳定。失败类型分布是一般团队容易忽略的指标。我运行一百个测试样本后会把所有失败案例分成几类模型理解偏差、工具返回错误、上下文信息不足、外部服务异常。这样可以快速知道系统最薄弱的环节在哪里。比如有一次我发现 60% 的失败都落在“工具返回错误”时立刻知道该优化工具解析代码而不是盲目替换模型。这比单纯看一个成功率数字实用得多。评估过程应该自动化。我会把一组测试任务连同期望结果写成一个 JSON 文件每次修改系统后都跑一遍同样的任务集对比通过率变化。这样能避免改一个参数后整体效果倒退却没被察觉的尴尬。6. 用第一讲的知识给后续学习铺路这门课第一讲真正教会我的是思考智能体系统的角度要从“模型能力”转向“系统设计”。以前我遇到 Agent 不稳定第一反应是换更强的模型但听完课之后再遇到问题我会先检查工具描述是否清晰、失败反馈是否结构化、终止条件是否完备再去考虑模型因素。我对后续课程有几个关注方向一是如何做好智能体的记忆和长期状态管理这直接影响它能执行多复杂的任务二是如何对智能体进行自动化评估和回归测试这是团队协作时保证系统不在迭代中退化的关键三是更多生产环境下的部署经验比如并发控制、缓存策略、版本回滚。这些内容几乎都能在 CS329Z 后续章节里找到对应所以第一讲给我的感觉是提纲挈领把整个知识体系的地图先铺开。最后分享一点个人经验如果你也要搭智能体系统不要一上来就选多智能体框架老老实实从一个 ReAct 循环开始亲手把它跑通再加记忆、加自省、加多智能体。每一层加的复杂度都要用测试数据证明是值得的。我踩过的坑告诉我智能体的上限确实很高但决定它能否落地的永远是你愿意在其中投入多少系统化工程努力。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询