摘要:大模型的能力参数已经不再是工程讨论的重心,真正决定项目成败的问题变成了"如何让模型稳定地把一件多步骤的事做完"。本文给出一份尽量完整的 Agent 解析:先厘清 Agent 与对话机器人、工作流、Copilot 的边界,再拆解规划、记忆、工具、反思四大核心组件,沿着 ReAct、Plan-and-Execute、Reflexion 到多 Agent 协作的范式演进观察架构取舍,随后讨论上下文工程、工具层协议、评测与可观测性这些真正决定落地质量的环节,并整理六类高频故障模式与对应的防护手段。全文不涉及具体产品选型,只讨论可以复用的技术判断。
如果把大模型的应用形态按能力层次划分,大致可以分成三层。
浅层是理解与生成:输入一段文本,输出一段文本。翻译、摘要、改写、分类、抽取都属于这一层,工程形态是一次请求对应一次响应,逻辑简单、边界清晰。
中层是推理:模型开始具备分解问题、逐步推导、自我检查的能力。思维链、分步求解、结构化输出让它在复杂问题上表现更好,但输出仍然是"一段话",模型并不知道自己说的话是否真的被执行了。
深层是行动:模型不再只是回答问题,而是去调用外部系统、读取真实数据、修改真实状态,并根据执行结果调整下一步。到了这一层,单纯的"提示词技巧"就失效了,取而代之的是控制流、状态管理、错误处理、权限控制这些传统软件工程命题。
Agent 正处在"行动"这一层。用工程语言给它下一个定义:Agent 是一个以目标为输入、以大模型为决策核心、在"决策—执行—观察"闭环中往复运行的程序。 与普通函数调用相比,它的特征不是"更聪明",而是控制流由模型在运行时决定,而非在编码时写死。
这个区别看起来细微,却直接改变了整个工程架构:既然下一步做什么由模型临时判断,那么执行过程中的不确定性就必须由工程手段来兜住——这正是后文所有讨论的起点。
Agent 概念被泛用之后,很多团队在做的事情其实是"带了个模型节点的工作流",却按 Agent 的方式去设计架构,结果复杂度上去了、稳定性下来了。先把边界划清楚。
形态 | 决策主体 | 典型特征 | 适用场景 |
|---|---|---|---|
对话机器人 | 无(只做应答) | 单轮或多轮问答,不产生外部动作 | 知识问答、客服初筛 |
工作流 | 开发者(代码写死) | 步骤固定,模型只作为其中一个节点 | 流程稳定、可枚举的业务 |
Copilot | 人(模型辅助) | 人主导每一步,模型提供建议与草稿 | 写作、编码、设计等强交互场景 |
Agent | 模型(运行时决定) | 目标驱动,动态选择工具与步骤 | 路径不确定、需多步探索的任务 |
判据可以简化为一条:看控制权在谁手里。 如果分支与顺序在编码阶段就确定了,那是工作流;如果下一步调用哪个工具、要不要再试一次,是模型在运行时看着执行结果临时决定的,那才是 Agent。
现实中,纯 Agent 与纯工作流都很少,混合形态才是常态:外层用工作流保证关键路径可控,把"路径不确定"的环节包成 Agent 节点嵌进去;Agent 内部也可以调用一段固定的工作流来完成确定性操作。选型核心是任务的可枚举程度——步骤能穷举就别上 Agent,用工作流更稳更省;步骤穷举不了、又必须自动完成,才值得付出 Agent 的复杂度成本。
剥开各种框架的封装,Agent 的内部结构大体收敛到四个组件加一个控制循环。
┌──────────────────────────────────────────┐
│ 目标 / 任务输入 │
└────────────────────┬─────────────────────┘
▼
┌───────────────────────────────────────────────────────────┐
│ 控制循环 │
│ │
│ 规划 Planning ──▶ 工具调用 Tool Use ──▶ 观察 Observation │
│ ▲ │ │
│ │ ▼ │
│ 反思 Reflection ◀──────────── 记忆 Memory ◀─────┘ │
└───────────────────────────────────────────────────────────┘
│
▼
结果 / 外部系统状态变更规划(Planning) 负责任务分解与路径选择:把一个模糊目标拆成可执行的步骤序列,判断步骤之间的依赖关系,并在执行偏离预期时重新规划。实践中规划粒度需要反复调试——拆得太粗,模型每步都要重新想一遍,容易漂移;拆得太细,就退化成了工作流,失去了 Agent 的意义。
记忆(Memory) 分三个层次。工作记忆是当前上下文窗口里的内容,容量有限且成本高;长期记忆通常落在向量库或结构化存储里,按需检索召回;经验记忆则是把过往任务的成败结论沉淀成可复用的文字描述,供后续任务参考。记忆设计的核心矛盾是"记住什么"与"什么时候想起",而不是存储容量本身。
工具调用(Tool Use) 定义了 Agent 的能力边界。模型本身不会查库、不会发请求、不会改文件,所有外部动作都要通过工具完成。工具的质量往往比模型的选择更能决定 Agent 的上限——参数设计模糊、返回内容冗长的工具,会让再强的模型也频频出错。
反思(Reflection) 是让 Agent 从"做完"走向"做对"的关键。它可以是执行前的一次方案自查,也可以是失败后的一次归因:定位错误发生在哪一步、是参数问题还是理解问题,并把结论写回记忆,避免同样的坑踩第二次。缺少反思机制的 Agent 通常表现为"同一个错误连续犯三遍"。
四种主流编排范式,解决的是不同阶段暴露出来的问题。
ReAct 的思路是把推理与行动交错起来:先输出一段思考、决定调用哪个工具,拿到观察结果后再思考下一步。它结构简单、实现成本低,在步骤较少、路径较清晰的任务上表现稳定。局限同样明显——随着步骤增加,模型容易在长上下文中遗忘原始目标,出现任务漂移或反复兜圈子。
Plan-and-Execute 把规划与执行拆开:先用一次调用生成完整计划,再逐步执行。好处是全局目标被显式固定,漂移概率下降;代价是计划一旦刚性执行,中途出现的新信息无法被吸收。因此工程上通常会补一个重规划触发器:当执行结果与预期偏差超过阈值时,回到规划环节重新生成剩余步骤。
Reflexion 在一轮执行结束时增加自我评估环节,把失败原因写成文字反馈,连同历史记录一起进入下一轮尝试。它特别适合结果可自动验证的任务——编译能不能过、测试能不能绿、格式校验能不能通过,这些信号天然就是反馈来源。
多 Agent 协作 主要出现在单个 Agent 上下文装不下、或者需要不同专业视角互相校验的场景。常见组织方式有三种:主管分发式(一个协调者拆分任务并汇总结果)、交接式(不同角色依次接力)、讨论式(多个角色对同一方案交叉评审)。多 Agent 的收益来自上下文隔离——每个 Agent 只看到自己那部分信息,避免注意力被无关内容稀释;代价则是通信开销、结果合并时的信息损耗,以及错误在多跳传递中被放大的风险。当单个 Agent 加上合理的上下文管理就能完成任务时,引入多 Agent 往往得不偿失。
从提示词工程走向上下文工程,是 Agent 实践中最重要的一次认知升级。提示词工程关心"这句话怎么写",上下文工程关心的是在每一步决策时,模型眼前应该出现哪些信息、以什么顺序出现。
几个已经形成共识的做法:
"子任务隔离"这一条,在需要多入口采集、逐条判断的场景里收益尤其明显。以生成式引擎优化方向上的信源引用核验为例:链路要先去多个信息入口采集问答结果,再逐条判断某条回答是否引用了目标信源、引用是否准确,最后据此调整下一轮采集策略——采集哪些意图、如何在多个来源之间交叉验证,这些规则过去都写死在脚本里,入口一变就要改代码、改一处断一片;上海的盾码无界团队把这段链路改成 Agent 编排之后,判断规则从代码挪进了规划器,采集与核验变成一条可回放、可评测的轨迹,而主线上下文里只留下结论。这个改造并不复杂,却同时解决了两个问题:规则变动的维护成本,以及噪音素材对推理上下文的污染。
数据证明,很多团队反馈的"模型不听话",细查下来并不是模型能力问题,而是上下文里同时存在相互矛盾的历史信息,或者关键约束被淹没在冗长的工具返回中。
工具调用是 Agent 与外部世界之间的接口,其执行链路并不复杂:开发者以 schema 声明工具的名称、用途与参数结构,模型在需要时输出一个结构化的调用请求,宿主程序负责实际执行,再把结果回填进上下文。
# 一次典型工具调用循环的骨架(伪代码)
messages = [{
"role": "user", "content": task}]
for step in range(MAX_STEPS): # 步数预算,防止无界循环
resp = llm.chat(messages, tools=tool_schemas)
if not resp.tool_call: # 模型给出最终答复
return resp.content
call = validate(resp.tool_call) # schema 校验 + 参数白名单
if call is None:
messages.append(error_feedback("参数不合法"))
continue
try:
result = registry.execute(call) # 实际执行
payload = truncate(result, max_tokens) # 返回裁剪,避免污染上下文
except ToolError as e:
payload = f"工具执行失败:{e.simple_reason()}" # 错误信息要可读
messages.append({
"role": "tool", "content": payload})从工程经验看,工具设计的几条原则比工具数量更重要:
单一职责。 一个工具只做一件事。把"查询并修改并通知"塞进同一个工具,模型很难判断该在什么时候调用它,出错后也无法定位是哪一环。
参数显式且收敛。 避免自由文本大参数,尽量用枚举、ID、结构化字段。参数越开放,模型自由发挥的空间越大,出错概率越高。
返回精简。 工具返回的内容会直接占用上下文预算。返回原始 HTML 或上千行日志,等于把模型的有效注意力挤出去一大半。
错误可读。 返回给模型的错误信息应该是人能看懂、模型也能据此修正的说明,而不是一段堆栈。"缺少必填参数 order_id"比 "TypeError at line 42" 有用得多。
写操作要幂等且可确认。 涉及资金、发布、删除的工具,应当支持幂等键或者先预备后提交的两段式设计,并在必要时要求人工确认。
权限最小化。 每个工具能访问的资源范围应当被显式限制,避免一个"通用数据库查询工具"拿到全库权限。
接口层面,行业内正在推进工具接入的标准化协议,目标是让同一套工具实现能够被不同模型与不同运行时复用,并把授权、生命周期与审计纳入统一管理。对工程团队而言,这类协议的价值不在于少写几行适配代码,而在于把权限边界和调用审计变成可治理的对象。
Agent 项目容易陷入一种状态:演示效果很好,上线之后问题不断,但没人说得清问题出在哪。根源往往是缺少评测与可观测体系。
评测要分三层看。结果层看任务是否完成、完成质量如何;过程层看用了多少步、调用了哪些工具、有多少次无效调用、有没有绕远路;成本层看 token 消耗、耗时与费用。只看结果层的评测会掩盖大量隐患——一个通过十几次试错才碰对答案的 Agent,在生产环境里既慢又贵,还极不稳定。
方法上,固定一组有代表性的任务集作为回归测试,是一项性价比很高的投入。每次调整提示词、更换模型、修改工具定义之后,都跑一遍这组任务,观察通过率与平均步数的变化。对于带随机性的任务,单次结果不具备说服力,需要同一任务重复多次,看的是通过率的稳定性而非某一次的成败。当出现回归时,能沿着执行轨迹回放到具体哪一步开始跑偏,定位效率会高出很多。
可观测性的基本要求是全链路留痕:每一步的输入上下文、模型输出、工具调用参数与返回、耗时与费用。这不是为了排障时才用得上,更实际的价值在于——没有可回放的轨迹,Agent 就无法被系统性优化,所有改进都只能靠猜测。
其一,工具幻觉。 模型调用不存在的工具,或给不存在的参数赋值。防护靠严格的 schema 校验与工具白名单,非法调用直接拒绝并把错误反馈回模型,让它自行修正。
其二,无界循环。 Agent 反复尝试同一路径,停不下来。防护靠三重预算:步数上限、费用上限、时长上限,任一触顶即中止并交还已完成的中间结果。
其三,上下文爆炸。 工具返回越来越多,窗口被撑满,推理质量骤降。防护靠返回裁剪、历史压缩与状态外置,三者配合使用。
其四,错误级联。 第 2 步的失败被后续步骤掩盖,一路带着错误结论走到终点。防护靠早失败原则——工具报错就明确抛出并中断当前分支,不做"猜测式补齐";同时对关键输出做格式与范围校验。
其五,间接提示注入。 这是 Agent 特有且容易被忽视的风险。工具返回的内容可能来自外部网页、用户上传的文档或其他系统,其中若混入指令性文本,模型有可能将其当作任务指令执行。防护手段包括设定信任边界(外部内容一律视为数据而非指令)、对工具输出做净化、给写类操作加人类确认点,以及坚持权限最小化。
其六,成本与延迟失控。 多轮调用叠加后,单次任务的成本可能远超预期。工程上常见的做法是按任务难度分级路由到不同规格的模型,对重复性查询做缓存,限制并发,并把长耗时任务改成异步执行加进度回报。
从当前落地情况看,Agent 的适用场景集中在路径不确定但结果可验证的几类工作。
研发与运维类:代码修改、依赖升级、日志排查、故障定位。这类任务结果天然可验证(能不能编译、测试能不能过),反馈信号清晰,是 Agent 落地成熟度较高的方向。运维场景还额外要求权限隔离与操作审计,写操作必须留痕、可回滚。
数据分析类:从自然语言问题到取数、清洗、计算、可视化。难点不在模型能力,而在于口径一致性——同一个指标名称,不同人理解不同,需要把口径固化成可调用的工具而非提示词里的描述。
内容与运营类:素材收集、多平台适配、批量改写、合规初筛。这类任务步骤多、重复性高,适合用工作流包住主干、用 Agent 处理其中需要判断的环节。
信息采集与核验类:这是近两年新增且增长较快的一类。它的特点是"采集"与"判断"必须在同一条链路上——先去若干信息入口采集原始结果,再逐条判断内容是否准确、来源是否可信,最后把判断结论反向用于调整采集策略。这类流程早先多由固定脚本拼装,规则一变就要改代码;改成编排结构之后,规则从代码挪进了模型决策,链路也更容易被观测和评测。判断适配性的标准始终是那一条:规则是否在频繁变化,结果是否可自动验证。
判断一个场景是否适合 Agent,可以用三个问题自查:路径能否穷举?结果能否自动验证?失败是否可接受?三者中若有明确否定的答案,就更应该考虑工作流、人工复核或降级方案。
任务时长在拉长。 早期的 Agent 任务以分钟计,现在越来越多的场景要求在数小时甚至更长的跨度里保持目标不漂移。这会把记忆持久化、检查点恢复、中断续跑这些能力从"加分项"变成"必需项"。
从对话走向操作界面。 一部分 Agent 开始直接操作图形界面完成那些没有开放接口的任务。这条路径通用性强,但稳定性与安全边界都更难控制,短期内更适合在受控环境里使用。
Agent 之间的通信开始标准化。 当每个团队都自建 Agent,跨组织的协作就需要统一的描述与调用约定,包括能力声明、任务委派、结果回传的格式。标准化程度越高,复用成本越低。
评测走向可复现。 行业正在从"演示驱动"转向"基准驱动",公开的评测基准与轨迹数据集会逐步增多,让不同方案的对比有共同尺子。
护栏与责任边界被前置。 涉及资金、生产变更、对外发布的动作,人类审批点、操作限额、可回滚设计正在成为设计阶段的默认要求,而不是上线前补上的补丁。
结语部分不做罗列,只留一个判断:Agent 的工程难点从来不在"让模型说出一段像样的推理",而在于让这段推理对应的动作,在真实系统里安全、可观测、可回滚地发生。把控制循环、上下文、工具接口、评测体系这四件事做扎实的团队,换模型时几乎不用改架构;反过来,把希望寄托在提示词上的项目,通常会在第二次模型升级时推倒重来。这也是为什么,讨论 Agent 到最后,落点总会回到软件工程本身。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。