AI Agent工程实现:七要素与七个决策点拆解框架
1. 为什么“七要素”和“七个决策点”是理解 Agent 的两把钥匙
很多人第一次接触 AI Agent 这个概念时,脑子里浮现的画面是科幻电影里那种能自己思考、自己行动的智能体。但真到了动手做工程实现的时候,你会发现事情完全不是那么回事。你面对的是一个 LLM、一堆 API、一个循环控制逻辑,以及无数个需要你拍板的细节。Agent 这个词被用得太泛了,泛到几乎失去了工程指导意义。
我做了几个 Agent 项目之后,逐渐意识到一个事实:Agent 的工程实现本质上是在回答两类问题——它由哪些部件构成,以及在运行过程中需要做哪些关键决策。前者是静态的结构拆解,后者是动态的流程控制。把这两件事想清楚了,Agent 就不再是一个模糊的概念,而是一个可以逐步搭建、逐步调试的系统。
这篇文章要聊的“七要素”和“七个决策点”,就是我在实际项目中反复验证过的一套拆解框架。七要素回答的是“一个 Agent 最少需要哪些东西才能跑起来”,七个决策点回答的是“在它跑起来之后,每一步需要做什么判断”。这两者结合起来,基本上覆盖了从零搭建一个 Agent 的核心工程问题。
适合谁看?如果你已经了解 LLM 的基本用法,知道什么是 prompt、什么是 API 调用,但还没真正动手搭过一个完整的 Agent,那这篇文章就是写给你的。如果你已经搭过简单的 Agent,但总觉得哪里不对劲、行为不可控、调试起来很痛苦,那这篇文章也能帮你找到一些结构性的原因。
提示:本文讨论的 Agent 指的是基于 LLM 的软件系统,不涉及机器人、具身智能等硬件方向。所有内容都围绕软件工程层面的实现展开。
2. 七要素拆解:一个 Agent 从概念到可运行的最小集合
2.1 模型层:不只是选一个 LLM 那么简单
模型层是 Agent 的“大脑”,但选模型这件事远比大多数人想象的复杂。很多人上来就问“哪个模型最强”,这个问题本身就问错了。你需要问的是:我的任务需要模型具备哪些能力,这些能力对应的成本是多少,延迟能接受多少。
我拿一个实际场景举例。假设你要做一个自动处理客服工单的 Agent,它需要理解用户描述、查询知识库、生成回复、判断是否需要转人工。这个任务对模型的要求是:中文理解要过关、指令遵循要稳定、输出格式要可控。至于创意写作能力、代码生成能力,完全不需要。这种情况下,选一个中等规模的模型就够了,没必要上最大的那个。
但如果你做的是一个代码审查 Agent,需要理解复杂的代码逻辑、发现潜在的边界条件问题,那模型能力就是核心瓶颈,这时候在模型上省钱就是给自己找麻烦。
模型层还有一个容易被忽略的点:输出格式的稳定性。Agent 的后续流程往往依赖模型输出的结构化数据(比如 JSON),如果模型经常输出格式不对的内容,你的整个流程就会频繁中断。实测下来,不同模型在格式遵循上的表现差异非常大,有些模型即使你给了明确的格式要求,它还是会“自由发挥”。这个问题在选型阶段就一定要验证,不要等到开发到一半才发现。
另外,模型层还需要考虑的一个工程问题是:是否需要多模型协作。有些 Agent 架构会用一个便宜的小模型做意图分类和路由,用一个大模型做核心推理。这种设计在成本敏感的场景下很常见,但也会带来额外的复杂度——你需要管理多个模型的调用、处理它们之间的衔接问题。
2.2 工具层:Agent 与外部世界交互的唯一通道
工具层是 Agent 的“手脚”。没有工具,Agent 就只是一个聊天机器人,只能基于训练数据回答问题。有了工具,它才能查数据库、调 API、读写文件、发送请求。
工具的设计有几个核心原则。第一,工具的描述要足够清晰。模型是根据工具的名称和描述来决定是否调用、怎么调用的。如果你的工具描述含糊不清,模型就会用错工具或者传错参数。我见过一个案例,开发者定义了一个叫search的工具,描述写的是“搜索信息”,结果模型在任何需要查找信息的时候都调这个工具,包括本该调数据库查询的场景。后来把描述改成“在互联网上搜索公开信息,适用于查找新闻、百科等通用知识,不适用于查询内部数据库”,问题就解决了。
第二,工具的参数设计要尽量简单。每多一个参数,模型传错的概率就增加一分。如果一个工具需要五个以上的参数,你就该考虑是不是可以拆成多个更简单的工具,或者把一些参数设成有默认值的可选参数。
第三,工具的错误处理要完善。模型调用工具时传错参数是常态,工具本身要能返回清晰的错误信息,让模型知道哪里错了、怎么改。如果工具直接抛一个异常然后整个流程崩溃,那用户体验就会非常差。
# 一个工具定义的示例(伪代码) tool_definition = { "name": "query_order", "description": "根据订单号查询订单状态和详情。仅在用户提供了明确的订单号时使用。", "parameters": { "order_id": { "type": "string", "description": "订单号,格式为纯数字,通常为12位", "required": True } } }工具层还有一个工程上的关键决策:工具的粒度。粒度太粗,模型不好控制;粒度太细,模型需要调用的次数太多,延迟和成本都会上升。我的经验是,一个工具最好对应一个完整的业务操作,而不是一个技术步骤。比如“查询订单并返回格式化结果”是一个合理的工具粒度,而“连接数据库”和“执行 SQL”拆成两个工具就太细了。
2.3 记忆层:让 Agent 不再“金鱼脑”
记忆层是很多初学者最容易忽略的部分。没有记忆的 Agent,每次对话都是全新的开始,用户上一句说的话它下一句就忘了。这种体验在简单问答场景下还能忍,但在多轮任务场景下就是灾难。
记忆层通常分为短期记忆和长期记忆。短期记忆就是当前对话的上下文,通常直接放在 prompt 里传给模型。长期记忆则是跨对话持久化的信息,需要存储和检索机制。
短期记忆的管理核心是上下文窗口的分配。模型的上下文窗口是有限的,你不能把所有历史对话都塞进去。常见的策略有几种:只保留最近 N 轮对话、对历史对话做摘要压缩、根据相关性筛选历史信息。每种策略都有取舍,保留最近 N 轮简单但可能丢失重要信息,摘要压缩能保留更多信息但会引入额外的模型调用,相关性筛选需要额外的检索逻辑。
长期记忆的实现方式就更多了。简单的可以用文件存储,复杂的可以用向量数据库做语义检索。我个人的经验是,不要一上来就上向量数据库。很多场景下,用结构化的键值存储加上简单的关键词匹配就能满足需求。向量检索确实强大,但它引入了 embedding 模型、向量索引、相似度阈值等一系列需要调优的参数,在需求还不明确的时候过早引入这些复杂度,往往得不偿失。
2.4 规划层:Agent 的“战略思维”
规划层决定 Agent 是“走一步看一步”还是“先想好再动手”。这两种模式没有绝对的好坏,取决于任务的性质。
对于简单的单步任务,比如“查一下明天的天气”,不需要规划,直接调用工具就行。但对于复杂的多步任务,比如“帮我安排一次出差,包括订机票、订酒店、生成行程表”,就需要规划能力。Agent 需要把大任务拆解成子任务,确定执行顺序,处理子任务之间的依赖关系。
规划的实现方式主要有两类。一类是显式规划,让模型先输出一个完整的计划,然后按计划逐步执行。另一类是隐式规划,模型在每一步根据当前状态决定下一步做什么,不预先制定完整计划。显式规划的好处是全局视角清晰,不容易遗漏步骤;坏处是计划可能在实际执行中发现不可行,需要重新规划。隐式规划更灵活,但容易陷入局部最优,做着做着就偏离了原始目标。
实际项目中,我倾向于用一种混合方式:先让模型生成一个粗粒度的计划框架,然后在执行过程中允许动态调整。这样既有全局方向,又保留了灵活性。
2.5 执行层:把决策变成行动
执行层是 Agent 的“肌肉”,负责实际调用工具、处理返回结果、更新状态。这一层看起来简单,但实际工程中有很多细节需要注意。
首先是超时和重试。工具调用可能因为网络问题、服务端问题而失败,执行层需要有合理的超时设置和重试策略。但重试不能无脑重试,对于幂等操作可以安全重试,对于非幂等操作(比如创建订单)就要小心,重试可能导致重复创建。
其次是并发控制。有些 Agent 需要同时调用多个工具,比如同时查询多个数据源。这时候需要考虑并发数限制、结果聚合、部分失败的处理等问题。
最后是状态管理。Agent 在执行过程中会产生大量中间状态——已经完成了哪些步骤、当前在哪个步骤、每个步骤的结果是什么。这些状态需要被妥善管理,以便在出错时能够恢复,或者在需要时能够回溯。
2.6 编排层:让所有部件协同工作
编排层是 Agent 的“神经系统”,负责协调模型层、工具层、记忆层、规划层和执行层的工作。它决定了整个 Agent 的控制流——什么时候调用模型、什么时候调用工具、什么时候读写记忆、什么时候触发规划。
编排层的实现方式从简单到复杂有很多选择。最简单的就是一个 while 循环,不断调用模型、执行工具、更新状态,直到模型输出终止信号。复杂一点的可以用状态机、DAG(有向无环图)或者专门的工作流引擎。
选择哪种编排方式,取决于你的 Agent 需要多复杂的控制逻辑。如果只是简单的“模型决定调什么工具就调什么工具”,一个循环就够了。如果需要条件分支、并行执行、错误恢复等复杂逻辑,就需要更结构化的编排方式。
2.7 安全层:Agent 的“刹车系统”
安全层是最后但绝不是最不重要的一个要素。Agent 有了自主决策和调用工具的能力,也就有了“闯祸”的能力。安全层要做的就是给 Agent 装上刹车。
安全层要解决的问题包括:权限控制(Agent 能调用哪些工具、能访问哪些数据)、输入输出过滤(防止 prompt 注入、防止敏感信息泄露)、行为边界(Agent 不能执行哪些操作)、审计日志(记录 Agent 的每一步操作以便追溯)。
我见过一个真实的案例:一个开发者做了一个可以操作数据库的 Agent,但没有做权限控制,结果模型在用户的一句诱导下执行了删除操作。这个教训说明,安全层不是可选项,而是必选项。
注意:安全层的设计要遵循“最小权限原则”——Agent 只应该拥有完成当前任务所需的最小权限。不要为了方便而给 Agent 过大的权限。
3. 七个决策点:Agent 运行时的关键判断逻辑
3.1 决策点一:当前输入是否需要调用工具
这是 Agent 运行时的第一个判断:用户说了这句话,我是直接回答,还是需要调用工具?
这个判断看起来简单,实际上很容易出错。模型有时候会过度调用工具——明明自己知道答案,非要去查一下;有时候又会该调工具而不调——明明需要实时数据,却凭训练数据瞎编。
影响这个判断的关键因素有几个。一是工具描述的清晰度,如果工具描述明确说了“适用于什么场景”,模型判断的准确率会高很多。二是 prompt 中的引导,你可以在系统 prompt 中明确告诉模型“当需要实时数据时,必须调用工具,不要凭记忆回答”。三是模型本身的能力,不同模型在这方面的表现差异很大。
我的经验是,在这个决策点上,宁可让模型多调工具,也不要让它少调。多调工具最多是浪费一点时间和成本,少调工具可能导致给出错误信息,后者对用户体验的伤害更大。
3.2 决策点二:选择哪个工具来执行
确定了需要调用工具之后,下一个问题是:调哪个工具?
当工具数量少的时候(比如三五个),模型基本不会选错。但当工具数量增加到几十个的时候,选择就变得困难了。模型可能会选一个功能相似但不完全匹配的工具,或者选一个名字看起来相关但实际不合适的工具。
解决这个问题的常见策略有几种。一是工具分组,把功能相关的工具放在一组,先让模型选组,再在组内选具体工具。二是工具检索,根据当前输入用检索算法找出最相关的几个工具,只把这几个工具的描述给模型。三是层级化工具设计,把一些工具作为另一些工具的子操作。
实测下来,工具数量超过 20 个之后,选择准确率会明显下降。这时候就需要引入额外的工具筛选机制。
3.3 决策点三:工具参数如何填充
选好了工具,接下来要确定传什么参数。这个决策点的难点在于:用户输入往往是模糊的,而工具参数需要精确的值。
比如用户说“帮我查一下最近的订单”,这里的“最近”是多久?一天?一周?一个月?如果工具需要的是一个具体的时间范围,模型就需要做一个合理的推断。再比如用户说“帮我订一张去北京的票”,这里缺少出发地、出发时间等信息,模型需要决定是追问用户还是用默认值。
这个决策点的处理策略取决于你的产品设计。有些场景下,追问用户是更好的选择;有些场景下,用合理的默认值然后让用户确认更流畅。关键是要在 prompt 中明确告诉模型你的偏好。
3.4 决策点四:工具返回结果如何解读
工具调用返回的结果,模型需要理解它意味着什么,然后决定下一步怎么做。
这里最常见的问题是:工具返回了错误,模型却当成成功来处理。比如 API 返回了一个包含错误码的 JSON,模型可能只看到了里面的某些字段,忽略了错误码,然后基于错误的数据继续推理。
解决这个问题的方法是在工具层做一层封装,把工具返回的结果标准化,明确标识成功还是失败,失败时给出清晰的错误原因。同时在 prompt 中告诉模型“如果工具返回结果中包含 error 字段,说明调用失败,你需要根据错误信息决定是重试、换一个工具、还是告知用户”。
3.5 决策点五:是否需要调整计划
在执行过程中,Agent 可能会发现原来的计划不可行,或者出现了新的信息需要重新规划。这时候就需要判断:是继续按原计划执行,还是调整计划?
这个决策点的难点在于判断“什么时候该坚持,什么时候该放弃”。如果一遇到困难就调整计划,Agent 可能会陷入反复规划的循环;如果死守原计划,又可能在错误的路上越走越远。
我的经验是设定一个明确的重规划触发条件。比如:连续两次工具调用失败、发现关键信息缺失、用户明确改变了需求。满足这些条件时才触发重规划,否则继续执行。
3.6 决策点六:何时终止循环
Agent 的核心是一个循环:思考、行动、观察、再思考。这个循环什么时候结束?
终止条件通常有几种:任务完成(模型判断目标已达成)、达到最大步数(防止无限循环)、遇到不可恢复的错误、用户主动中断。
其中最重要的是最大步数限制。没有这个限制,Agent 可能会陷入死循环,不断调用同一个工具、不断产生相同的输出。我一般会设置一个合理的最大步数(比如 10 到 15 步),超过之后就强制终止并返回当前结果。
3.7 决策点七:最终输出如何组织
循环结束后,Agent 需要把执行过程中的结果组织成最终输出返回给用户。
这个决策点看起来简单,实际上很容易被忽视。Agent 在执行过程中可能调用了多个工具、产生了大量中间结果,但用户不需要看到所有这些细节。最终输出应该是简洁的、面向用户需求的、去除了技术细节的。
同时,最终输出还需要考虑可追溯性。如果用户想知道 Agent 是怎么得出结论的,你应该能够提供执行过程的摘要。这在调试和信任建立阶段特别重要。
4. 从七要素到七个决策点:工程实现的完整链路
4.1 要素与决策点的映射关系
七要素和七个决策点不是孤立的,它们之间存在明确的映射关系。理解这种映射关系,能帮你在实现时知道每个决策点应该在哪一层处理。
| 决策点 | 主要涉及的要素层 | 关键实现位置 |
|---|---|---|
| 是否调用工具 | 模型层、工具层 | 系统 prompt + 工具描述 |
| 选择哪个工具 | 工具层、编排层 | 工具注册与检索机制 |
| 参数如何填充 | 模型层、工具层 | 工具参数 schema + prompt |
| 结果如何解读 | 执行层、模型层 | 工具返回封装 + prompt |
| 是否调整计划 | 规划层、编排层 | 重规划触发条件 |
| 何时终止循环 | 编排层、执行层 | 循环控制逻辑 |
| 输出如何组织 | 模型层、安全层 | 输出格式化 + 过滤 |
这张表在实际开发中非常有用。当你发现 Agent 在某个决策点上表现不好时,可以快速定位到应该去调整哪个要素层。
4.2 一个最小可运行 Agent 的实现骨架
理论说了这么多,来看一个实际的实现骨架。下面这段伪代码展示了一个最小可运行 Agent 的核心逻辑,涵盖了七要素和七个决策点的基本框架。
class Agent: def __init__(self, model, tools, memory, max_steps=10): self.model = model self.tools = tools self.memory = memory self.max_steps = max_steps def run(self, user_input): # 初始化状态 self.memory.add_user_message(user_input) step = 0 while step < self.max_steps: step += 1 # 决策点1&2&3:模型决定是否调工具、调哪个、传什么参数 response = self.model.generate( messages=self.memory.get_context(), tools=self.tools.get_definitions() ) # 决策点6:检查是否终止 if response.is_final_answer(): break # 执行工具调用 if response.has_tool_calls(): for tool_call in response.tool_calls: # 决策点4:执行并解读结果 result = self.execute_tool(tool_call) self.memory.add_tool_result(result) # 决策点5:检查是否需要重规划 if self.should_replan(): self.memory.add_system_message("请重新评估当前计划") # 决策点7:组织最终输出 return self.format_output(response)这个骨架虽然简单,但已经包含了 Agent 的核心逻辑。实际项目中,你需要在每个决策点上做更多的处理,比如错误重试、并发控制、安全过滤等。
4.3 常见架构模式与选型建议
在实际工程中,Agent 的架构模式主要有几种,每种适用于不同的场景。
ReAct 模式是最经典的 Agent 架构,核心思想是“推理+行动”交替进行。模型先推理当前应该做什么,然后执行行动,观察结果,再推理下一步。这种模式实现简单,适用于大多数场景,但效率不高,因为每一步都需要调用模型。
Plan-and-Execute 模式是先制定完整计划再执行。这种模式减少了模型调用次数,提高了效率,但灵活性较差,计划一旦制定就很难调整。
Multi-Agent 模式是多个 Agent 协作完成任务。每个 Agent 负责不同的角色或子任务,通过消息传递协调。这种模式适用于复杂任务,但实现和调试的复杂度都高很多。
我的选型建议是:从 ReAct 模式开始,遇到性能瓶颈再考虑 Plan-and-Execute,只有在任务确实需要多角色协作时才上 Multi-Agent。不要一开始就追求复杂的架构,简单能跑通比复杂但跑不起来强得多。
5. 工程实践中那些文档不会告诉你的坑
5.1 模型输出的不确定性如何影响决策点
LLM 的输出本质上是概率性的,同样的输入可能产生不同的输出。这个特性在 Agent 场景下会被放大,因为 Agent 是一个多步决策的过程,每一步的微小差异都可能在后续步骤中被放大。
我遇到过一个典型案例:一个查询类 Agent,在测试时表现很好,但上线后偶尔会出现“答非所问”的情况。排查后发现,问题出在决策点二(选择工具)上。模型在大多数情况下会正确选择查询工具,但偶尔会选择另一个功能相似的工具,导致返回了不相关的数据。
解决这个问题的办法不是去“修复模型”,而是在工程层面增加确定性。具体做法包括:在 prompt 中给出更明确的工具选择规则、在工具层增加参数校验、在输出层增加结果合理性检查。这些工程手段比试图让模型“每次都选对”要可靠得多。
5.2 工具调用失败的连锁反应与隔离策略
工具调用失败是常态,不是异常。网络抖动、API 限流、服务端错误,这些都会导致工具调用失败。如果 Agent 没有处理好这些失败,就会出现连锁反应——一个工具失败导致整个流程崩溃。
我的做法是在工具层做隔离。每个工具调用都包一层错误处理,失败时返回一个结构化的错误结果,而不是抛出异常。这样模型能感知到失败,并根据错误信息决定下一步怎么做。
def safe_tool_call(tool, params): try: result = tool.execute(params) return {"status": "success", "data": result} except TimeoutError: return {"status": "error", "reason": "timeout", "suggestion": "retry"} except ValidationError as e: return {"status": "error", "reason": str(e), "suggestion": "check_params"} except Exception as e: return {"status": "error", "reason": "unknown", "suggestion": "skip"}这种结构化的错误返回让模型能够做出更合理的决策,而不是面对一个异常不知所措。
5.3 上下文膨胀与性能衰减的应对
Agent 运行过程中,上下文会不断增长——每一轮对话、每一次工具调用结果都会加到上下文里。当上下文增长到一定程度,会出现两个问题:一是超出模型的上下文窗口限制,二是模型在长上下文中的表现会下降(所谓的“lost in the middle”问题)。
应对策略有几个。一是定期压缩上下文,把早期的对话和工具结果做摘要,只保留关键信息。二是滑动窗口,只保留最近 N 轮的内容。三是外部化存储,把不常用的信息存到外部,需要时再检索回来。
我通常会在上下文达到模型窗口的 60% 到 70% 时触发压缩。压缩时保留最近几轮的完整内容,对更早的内容做摘要。摘要的质量很关键,要保留关键的事实信息和决策依据,去掉冗余的对话内容。
5.4 安全边界的设计与验证
安全层的设计需要在 Agent 开发的早期就介入,而不是等到最后再补。我见过太多项目,功能开发完了才想起来做安全控制,结果发现架构上不支持细粒度的权限控制,只能推倒重来。
安全设计的第一步是明确 Agent 的能力边界。列出 Agent 能做的所有操作,然后逐一评估每个操作的风险等级。高风险操作(如删除数据、发送消息、执行支付)需要额外的确认机制,低风险操作(如查询信息)可以放开。
第二步是实现权限控制。每个工具都应该有权限标签,Agent 在调用工具前要检查当前上下文是否有权限。权限可以基于用户角色、会话状态、操作类型等维度来分配。
第三步是输入输出过滤。输入侧要防止 prompt 注入,输出侧要防止敏感信息泄露。这两件事都不容易做到完美,但基本的防护措施必须有。
注意:安全层的验证不能只靠测试用例,还需要做对抗性测试。尝试用各种方式诱导 Agent 越权操作,看看它会不会上当。这种测试往往能发现一些你意想不到的漏洞。
6. 从能跑到好用:Agent 调优的实战思路
6.1 建立可观测性:日志、追踪与回放
Agent 调优的第一步不是改代码,而是建立可观测性。你需要能够看到 Agent 每一步在做什么、为什么这么做、结果是什么。没有这个基础,调优就是盲人摸象。
我在项目中会记录以下几类信息:每次模型调用的完整输入输出(包括 prompt、模型返回、token 消耗)、每次工具调用的参数和结果、每个决策点的判断依据、整个会话的状态变化。这些信息不仅用于调试,也用于后续的分析和优化。
回放功能也很重要。当发现一个 bad case 时,你需要能够重现它。把当时的输入、上下文、模型版本都记录下来,才能在本地复现问题、验证修复方案。
6.2 针对七个决策点的定向优化
有了可观测性之后,就可以针对性地优化了。优化的思路是:先定位是哪个决策点出了问题,再针对性地调整。
如果问题出在决策点一(是否调工具),就去优化系统 prompt 中的工具使用引导。如果问题出在决策点二(选哪个工具),就去优化工具描述或引入工具检索。如果问题出在决策点四(结果解读),就去优化工具返回的格式或增加结果校验。
这种定向优化的效率远高于盲目调整。我见过一些开发者,遇到问题就改 prompt,改来改去也不知道哪个改动起了作用。正确的做法是:先定位决策点,再定位要素层,然后做最小化的修改,验证效果。
6.3 评估体系的搭建与迭代节奏
Agent 的评估比传统软件复杂得多,因为它的输出不是确定性的。你不能简单地用“通过/不通过”来评估,需要建立多维度的评估体系。
我通常会从几个维度来评估:任务完成率(Agent 是否完成了用户的目标)、步骤效率(用了多少步完成)、工具调用准确率(工具选择和参数填充是否正确)、输出质量(最终输出是否满足用户需求)、安全性(是否有越权或泄露风险)。
评估集的建设也很关键。需要覆盖典型场景、边界场景、对抗场景。每次修改后都在评估集上跑一遍,确保没有引入回归。
迭代节奏上,我的建议是小步快跑。每次只改一个地方,改完立即验证。不要一次性做大量修改,那样出了问题很难定位是哪个改动导致的。
7. 我对 Agent 工程实现的一点个人体会
做了几个 Agent 项目之后,我最大的体会是:Agent 的工程实现,难点不在 AI,而在工程。模型能力固然重要,但决定一个 Agent 好不好用的,往往是那些工程细节——工具设计得好不好、错误处理得完不完善、上下文管理得合不合理、安全边界划得清不清楚。
七要素和七个决策点这套框架,本质上是在帮你把“做一个 Agent”这个模糊的任务,拆解成一系列具体的、可操作的工程问题。每当你觉得 Agent 行为不对劲的时候,可以对照这套框架,看看是哪个要素没做好,或者哪个决策点的逻辑有问题。
另外一个体会是:不要追求一步到位。先做一个能跑通的最小版本,哪怕它很粗糙。跑通之后,你才能看到真正的问题在哪里,才能有针对性地优化。我见过太多人,在还没跑通的时候就纠结架构选型、纠结用哪个框架,结果时间都花在了纠结上,东西一直没做出来。
最后分享一个实用的小技巧:在开发阶段,把 Agent 的每一步决策都打印出来。不只是最终输出,还包括每次模型调用的输入输出、每次工具调用的参数和结果、每个决策点的判断依据。这些信息在调试时的价值,远超你的想象。等到上线时再把这些日志关掉或降级,但在开发阶段,它们是你最好的朋友。