如果你最近在关注 Agent 开发,一定会发现一个现象:项目名里带 Agent 的工具越来越多。今天要聊的 Blitz Agent 也是其中一个,从官网标题看,它的定位非常明确:Your specialized agent,也就是“你的专用智能体”。这个定位值得玩味,因为它背后代表着一个重要转变——Agent 开发正在从“一个大模型对话框”走向“场景化、可编排、可验证的专用 Agent 体系”。
我的判断是:专用 Agent 真正降低的不是模型能力门槛,而是把大模型能力接入业务系统的工程门槛。如果你能理解这一点,就不会再被大量 Agent 框架名词绕晕,也能在项目里做出更务实的技术选型。很多人以为 Agent 开发就是“调一个模型 + 写一段 Prompt”,实际上当你把 Agent 放到真实业务中时,还要处理工具调用、上下文管理、循环终止、权限控制、日志追踪等一系列问题。
这篇文章不准备给 Blitz Agent 做背书,因为在公开材料不足的情况下,任何“实测体验”都是不严谨的。我更想借这个项目方向,把 Agent 开发中真正重要的概念、工程链路、最小实现和常见坑讲清楚。读完这篇文章,你可以获得三样东西:一是对专用 Agent 的清晰认知;二是一个可本地运行的最小 Agent Loop 示例;三是一套用于评估和接入 Agent 工具的工程清单。
1. 从 Blitz Agent 说起:为什么“专用 Agent”正在成为主流
先回到 Blitz Agent 这个项目的标题。Blitz 在英文里有“闪电战、突袭”的意思,配合 Your specialized agent 这个标语,可以读出两层信息:第一,它强调速度或效率,希望开发者能快速构建 Agent;第二,它强调专用,而不是通用。
这里“专用”二字,是当前 Agent 开发和传统 Chatbot 最大的分水岭。
通用 Chatbot 的产品形态是:用户输入任意问题,模型尽力回答。它没有固定的任务边界,也不需要调用外部系统,所有输出都是模型根据训练数据生成的文本。这种模式虽然灵活,但在企业业务里很难直接落地,因为业务系统需要的是“稳定完成一类任务”,而不是“什么都能聊但不可控”。
专用 Agent 则反了过来。它只负责一个明确的业务领域,比如客服工单分类、数据库查询助手、代码审查机器人、天气查询助手。它会限定可使用的工具集合,会定义系统 Prompt 来约束行为边界,会在循环中不断调用工具去获取最新数据,再根据结果决定下一步动作。
给一个直白的对比:
| 对比维度 | 通用 Chatbot | 专用 Agent |
|---|---|---|
| 任务边界 | 不固定,用户随意提问 | 固定在一个业务领域 |
| 工具调用 | 通常没有 | 必须有,用于获取数据或执行动作 |
| 行为控制 | 依赖模型自觉 | 通过系统 Prompt + 工具白名单约束 |
| 稳定性 | 不可控,容易飘 | 相对可控,可以评测和回归 |
| 工程复杂度 | 低 | 中高,涉及循环、记忆、安全 |
| 落地场景 | 闲聊、文档问答 | 业务自动化、垂直助手、内部工具 |
Blitz Agent 把“专用”放在官网标题里,说明它瞄准的正是这个增量市场:帮助开发者或团队快速创建一个有明确职责边界的 Agent,而不是再造一个通用助手。这个方向之所以成立,是因为大多数开发团队不缺大模型接口,缺的是把大模型接进业务系统的那套工程骨架。
2. 理解专用 Agent 必须搞懂的核心概念
你在搜索 Agent 相关资料时,一定会遇到几个高频词:Agent、Agent Loop、Skill、MCP、Harness。这些词很容易混。我用三分钟把它们讲清楚。
2.1 Agent 是什么
Agent 的本质可以拆成三个要素:模型、工具、循环。模型负责理解和生成,工具负责连接外部世界,循环负责决定“什么时候该调用工具、调用结果怎么处理、什么时候该结束”。没有循环的模型调用,只是普通的 API 请求,不构成 Agent。
我在实际项目中看到最多的误区是:把 Agent 等同于“加了一层 Prompt 的模型调用”。这种做法在简单问答里够用,但一旦任务需要查数据库、调用第三方 API、核对流程状态,单次模型调用就撑不住了。你需要一个循环,让模型可以多次观察结果并调整行动。
2.2 Agent Loop:Agent 的核心骨架
Agent Loop 的典型流程是:
- 接收用户输入。
- 把输入和当前上下文一起发给模型。
- 模型决定是直接回复,还是发起一次工具调用。
- 如果是工具调用,执行工具函数,把结果追加回上下文。
- 回到第 2 步继续循环。
- 如果模型直接回复,或者达到最大迭代次数,循环结束。
这个循环是所有 Agent 框架的地基。LangGraph、AutoGen、各种自研框架,本质上都是在解决“如何更好掌控这个循环”的问题,比如加状态机、加人工审批节点、加并行节点等。
2.3 Skill 和 MCP 有什么区别
Skill 和 MCP 是很容易混淆的两个概念,因为它们在很多场景下都表现为“给 Agent 提供能力”。
Skill 可以理解成一个可复用的能力包,通常包含:一段能力描述、调用这个能力需要的步骤或脚本、以及可能会用到的参考数据。它强调的是“Agent 如何完成某件事”,更接近一种封装的技能模板。你可以把 Skill 理解成给 Agent 装了一个“技能插件”,Agent 根据任务描述判断要使用哪个 Skill。
MCP 的全称是 Model Context Protocol,是一套标准化的协议,核心目标是统一模型与外部工具之间的通信方式。它规定工具怎么暴露、请求怎么发送、结果怎么返回,有点类似工具界的 USB 接口标准。MCP 解决的是“工具接入方式不统一”的问题,而不是“这个工具是什么”的问题。
一句话区分:Skill 关注的是“能力内容”,MCP 关注的是“连接方式”。一个 Skill 可以发布成 MCP 服务,一个 MCP 服务也可以承载多个 Skill。做技术选型时不要把它们当成竞争关系,它们分层不同。
2.4 Harness 和 Agent 的区别
Harness 这个词在 Agent 框架里出现频率很高。简单说,Harness 是指“模型调用外部世界的一整套运行时环境”,它负责管理模型的输入输出格式、工具注册、循环执行、错误处理、上下文窗口管理等。Agent 是业务层的概念,它描述“这个智能体会完成什么任务”;Harness 是技术层的概念,它描述“这个智能体环境如何把任务跑起来”。
可以说,Harness 是 Agent 的执行引擎。同一个 Agent 可以跑在不同的 Harness 上,同一个 Harness 也可以承载不同的 Agent。理解这个区别后,你再去看框架文档时会更容易定位问题:如果 Agent 行为不对,先检查 Prompt 和工具定义;如果执行环境报错,再检查 Harness 配置。
3. 开发一个专用 Agent 前,先想清楚这五层技术底座
当你决定做一个专用 Agent 时,不要直接写代码,先确认技术底座。下面五层是几乎每个生产级 Agent 都躲不开的。
3.1 模型层
模型层负责“理解与生成”。选择模型时,最重要的一点是确认它是否支持工具调用或函数调用(Function Calling / Tool Calling)。如果没有这个能力,你做 Agent 循环时很难让模型输出结构化指令。现在主流模型基本都支持,但不同模型的工具调用格式、稳定性和成本差异很大,实际项目里要拿真实样例做评测后再定。
3.2 工具层
工具层负责“模型与外部世界的连接”。一个工具本质上就是一个可以被模型调用的函数。它接收模型生成的 JSON 参数,执行真实逻辑,再把结果返回给循环。
工具设计的好坏,直接决定 Agent 的成功率。工具描述写得越清晰,模型就越不容易用错。工具数量不是越多越好,每加一个工具,都会增加模型选错工具的概率。
3.3 编排层
编排层负责“循环和状态控制”。你需要决定:
- 最大迭代次数是多少,防止死循环。
- 是否允许 Agent 连续调用多个工具。
- 工具调用失败后是重试还是终止。
- 是否支持人工审批节点。
这些控制逻辑通常用状态机来实现。一个工具能做什么、不能做什么,模型可以通过描述感知;但什么时候停止循环、调用链最多多长,必须在编排层用代码强制约束。
3.4 记忆层
记忆层负责“上下文管理”。模型有上下文窗口上限,不可能一次性装入所有历史记录。实际项目中你需要区分:
- 短期记忆:当前对话内的上下文,直接放在消息列表里。
- 长期记忆:跨会话的持久化信息,比如用户偏好、历史工单,需要存入向量数据库或关系数据库。
如果你做的是一个会被长期使用的专用 Agent,建议从一开始就设计记忆存储方案,否则后续对话连续性和多轮一致性会非常难维护。
3.5 控制层
控制层负责“安全、权限和合规”。这是很多 Agent 项目上线前最容易忽略的一层。你需要考虑:
- 哪些工具是必须明确授权才能调用的?
- 工具的执行结果是否需要二次确认才能继续进行?
- Agent 的日志是否包含敏感信息?
- 用户输入会不会通过提示注入诱导 Agent 执行危险操作?
控制层通常通过白名单、审批流、敏感数据脱敏、最小权限原则来实现。关于安全问题,我在第八部分会详细展开。
4. 环境准备与最小实现目标
这篇示例代码不依赖任何第三方 Agent 框架,只使用 Python 标准库,目的是把 Agent Loop 的执行过程完整展示出来。你只要有一个能运行 Python 3.9+ 的环境即可。
为什么不用现成框架?因为 Agent 框架的封装层数多,初学者一旦遇到报错,很难判断问题出在模型层、工具层还是编排层。先手写一个最小循环,看清楚每一步执行流程,再切换到框架时你会有更强的掌控力。
我建议你按下面的目录结构创建示例项目:
blitz_agent_demo/ ├── agent_loop.py # Agent 主循环 ├── agent_config.yaml # Agent 配置示例 └── tool_schema.json # 工具描述示例如果后面接入真实大模型,只需要替换agent_loop.py里的模型调用函数,工具层和循环结构不用大改。这样可以快速验证你的 Agent 设计是否合理。
5. 完整示例:手写一个可运行的最小 Agent Loop
下面我们实现一个“天气查询专用 Agent”。它只有一个工具get_weather,模型根据用户输入决定是否调用工具。为了让代码可以离线运行,我使用一个模拟模型函数替代真实大模型,但保留了真实 Agent 循环的完整结构。
5.1 定义工具
# 文件路径:blitz_agent_demo/agent_loop.py import json from typing import Callable, Dict class Tool: """一个极简工具封装,真实项目里可换成更复杂的注册机制""" def __init__(self, name: str, description: str, handler: Callable): self.name = name self.description = description self.handler = handler def run(self, **kwargs): return self.handler(**kwargs) def get_weather(city: str) -> str: """模拟天气查询,真实项目里这里应该接入气象服务 API""" # 这里故意只放了三个城市,用来演示工具返回边界 weather_data = { "北京": "晴,26摄氏度", "上海": "小雨,22摄氏度", "广州": "多云,29摄氏度", } return weather_data.get(city, "暂无该城市的天气数据") # 工具注册表:Agent 只能调用这个字典里的工具 TOOLS: Dict[str, Tool] = { "get_weather": Tool( name="get_weather", description="查询指定城市当前的天气情况", handler=get_weather, ) }这段代码里,Tool类做了一层很薄的封装。真实框架里工具注册会复杂得多,比如参数校验、限流、重试、审计,但核心结构不变:工具必须有唯一名字、清晰描述、可执行的 handler。TOOLS字典就是工具白名单,模型只能从这里面选工具调用。
5.2 模拟大模型返回
# 文件路径:blitz_agent_demo/agent_loop.py def call_llm(messages): """ 模拟大模型的工具调用决策。 真实项目中,这里应该把 messages 发给真实大模型服务, 并解析模型返回的 tool_calls。本函数只用于演示循环结构。 """ last = messages[-1] # 如果最后一条是工具执行结果,就生成最终回复 if last["role"] == "tool": return { "content": f"根据查询结果:{last['content']}", "tool_calls": None, } # 如果用户在问天气,模拟模型决定调用 get_weather if "天气" in last["content"]: city = "北京" if "上海" in last["content"]: city = "上海" elif "广州" in last["content"]: city = "广州" return { "content": None, "tool_calls": [ { "id": "call_001", "type": "function", "function": { "name": "get_weather", "arguments": json.dumps({"city": city}), }, } ], } return { "content": "我只支持天气查询,请提供城市名称。", "tool_calls": None, }这个函数是理解 Agent 循环的关键窗口。它返回两种结构:第一种是tool_calls,表示模型想调用工具;第二种是纯文本content,表示模型准备直接回答用户。真实模型的返回格式会更复杂,但核心逻辑就是这两种分支。
5.3 Agent 主循环
# 文件路径:blitz_agent_demo/agent_loop.py def run_agent(user_input: str, max_iterations: int = 5) -> str | None: """ 最小版 Agent 主循环: 1. 发送消息给模型 2. 如果模型要求调用工具,执行工具并回填结果 3. 如果模型直接回复,返回最终结果 4. 达到最大迭代次数强制终止 """ messages = [ {"role": "system", "content": "你是一个天气查询助手,只能使用 get_weather 工具。"}, {"role": "user", "content": user_input}, ] for step in range(max_iterations): print(f"[Step {step + 1}] 发送 {len(messages)} 条消息给模型") response = call_llm(messages) if response.get("tool_calls"): tool_call = response["tool_calls"][0] func_name = tool_call["function"]["name"] args = json.loads(tool_call["function"]["arguments"]) tool = TOOLS.get(func_name) if tool is None: # 工具不存在时,把错误信息返回给模型,让它自行修正 messages.append( {"role": "tool", "tool_call_id": tool_call["id"], "content": "错误:工具不存在"} ) continue result = tool.run(**args) print(f"[Step {step + 1}] 调用工具 {func_name},参数 {args},结果:{result}") messages.append( { "role": "tool", "tool_call_id": tool_call["id"], "content": str(result), } ) else: print(f"[Step {step + 1}] 模型最终回复:{response['content']}") return response["content"] print("[Agent] 达到最大迭代次数,强制结束。") return None if __name__ == "__main__": run_agent("北京天气怎么样?")这个主循环只有三十多行,但它已经具备了一个生产级 Agent Loop 最重要的一部分结构:多轮工具调用、工具结果回填、最大迭代限制。你可以在此基础上扩展,比如并发工具调用、人工审批、异常重试,但骨架是不变的。
5.4 模拟真实 API 层使用的工具描述
真实项目中,你给大模型看的不是 Python 函数,而是工具描述 JSON。这个 JSON 会随系统 Prompt 一起发给模型,模型根据它生成调用参数。下面的格式是当前主流大模型服务都兼容的方式:
// 文件路径:blitz_agent_demo/tool_schema.json { "type": "function", "function": { "name": "get_weather", "description": "查询指定城市的实时天气。仅支持北京、上海、广州。", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称,例如:北京" } }, "required": ["city"] } } }这里真正容易被忽略的是 description 的写法。不要只写“查询天气”,而要写清楚边界,比如“仅支持北京、上海、广州”。你写的信息越具体,模型就越不容易传入非法城市参数。工具描述就是模型理解工具的唯一窗口,它值得花时间打磨。
5.5 Agent 配置文件示例
如果你需要把 Agent 流程化交付给团队,建议把系统 Prompt、模型参数、工具白名单、循环上限放到配置文件中管理,而不是写死在代码里。
# 文件路径:blitz_agent_demo/agent_config.yaml agent: name: weather-assistant description: 天气查询专用 Agent system_prompt: | 你是一个天气查询助手。 你只能使用 get_weather 工具。 如果用户没有提供城市,先询问城市名称,再调用工具。 model: provider: openai-compatible model_name: your-model-name temperature: 0 tools: - get_weather safety: max_iterations: 5 enabled_tools_only: true require_approval: false从架构角度看,配置和代码分离能带来两个好处:第一,运营或测试人员调整 Prompt 不需要改代码;第二,不同环境可以使用不同的工具白名单,从而降低权限风险。
6. 运行结果与效果验证
运行前面写好的示例代码:
cd blitz_agent_demo python agent_loop.py预期输出如下:
[Step 1] 发送 2 条消息给模型 [Step 1] 调用工具 get_weather,参数 {'city': '北京'},结果:晴,26摄氏度 [Step 2] 发送 4 条消息给模型 [Step 2] 模型最终回复:根据查询结果:晴,26摄氏度这里有两个验证点:
第一,循环是否正常推进。日志中必须能看到“调用工具”和“模型最终回复”两个阶段,如果一次run_agent调用只输出了一条回复,说明 Agent 没有真正进入工具调用循环,可能只是普通问答。
第二,消息列表是否按预期增长。第一次发送 2 条消息,第二次发送 4 条消息,说明工具调用结果已经正确回填到了上下文。如果你在真实项目中看到第二次发送的消息数量没有变化,大概率是工具结果没有追加进消息列表,这是 Agent 循环最常见的问题。
如果运行报错,不建议直接翻报错堆栈,先按顺序检查:
- Python 版本是否满足要求。
- 文件是否是完整的,代码块是否复制完整。
- 函数缩进是否正确,Python 对缩进非常敏感。
7. 如何评估并接入 Blitz Agent 这类专用 Agent 工具
回到 Blitz Agent 本身。如果你看到一个专用 Agent 工具,想知道它适不适合你的项目,我建议你按下面的维度做评估,而不是看宣传文案。
7.1 功能边界
先搞清楚这个 Agent 到底擅长什么。它解决的是“聊天问答”还是“执行某个业务动作”?它的工具集合是什么?支持接入你自己的工具吗?如果一个 Agent 项目对自己的能力边界描述不清楚,说明它可能还在很早期的阶段,用在生产环境要谨慎。
7.2 数据与安全
这是最容易被忽视的部分。专用 Agent 会接收你的业务数据,并把这些数据发送给模型服务。你需要确认:
- 数据是否支持私有化部署。
- 日志中是否会记录真实业务内容。
- 工具调用是否需要审批。
- 是否支持本地运行或内网部署。
如果你的业务涉及敏感数据,优先选择支持私有化部署和明确数据边界的方案。
7.3 扩展与集成成本
一个专用 Agent 不可能一直只有内置能力,很快你就会有“让它查一下内部系统”的需求。所以你需要确认它是否支持自定义工具、是否兼容主流工具协议(如 MCP)、是否提供插件机制。从这个角度看,专注“专用 Agent”但开放程度高的工具,往往比封闭的通用产品更有长期价值。
7.4 接入路径
在信息不完整的情况下,不要直接在配置中心里写死某个工具的参数。稳妥的接入路径是:
- 先用最小示例验证 Agent 的概念,确认它能在最小场景中闭环。
- 在测试环境接入自己的业务数据,验证准确率和稳定性。
- 选择低风险业务场景做灰度。
- 确认可观测性和日志完整后,再逐步扩大范围。
- 保留回滚方案,一旦发现问题可以立即切回旧流程。
这条路径适用于几乎所有第三方 Agent 工具或框架,不仅限于 Blitz Agent。
8. 常见问题与排查思路
在 Agent 开发中,你几乎一定会遇到下面几类问题。我把它们整理成表格,方便你在排错时直接对照。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Agent 执行很慢,或者提示“execution provider did not respond in time” | 模型服务超时,或 Agent 执行环境负载过高 | 查看模型服务响应时间、网络延迟和日志 | 设置合理的超时时间,对模型调用增加重试和降级策略 |
| Agent 直接报 terminated due to error | 工具抛异常,或模型返回了无法解析的结构 | 查看完整错误堆栈,确认是工具层还是模型层报错 | 为工具调用加 try/except,解析失败时把错误信息返回给模型重新计划 |
| 模型反复调用同一个工具却无法完成 | 工具描述不清,或模型没有收到足够反馈 | 打印每次工具调用的参数和返回结果 | 调整工具描述,增加返回结果的指导性提示 |
| 模型不调用工具,直接凭记忆回答 | 工具描述没有进入模型上下文,或模型不支持工具调用 | 检查 API 请求中是否真的传入了 tools 参数 | 确认模型支持函数调用,并检查工具注册逻辑 |
| 模型传入非法参数 | 工具描述中的参数约束不够明确 | 检查工具 JSON Schema 的参数枚举或格式说明 | 在工具 handler 中增加参数校验,不接受非法值 |
| 上下文越来越长,最终超出窗口 | Agent Loop 没有裁剪历史消息 | 检查 messages 长度增长情况 | 增加消息裁剪策略、摘要压缩,或把结果存到外部记忆 |
| Agent 执行了不该执行的操作 | Prompt 注入或工具白名单过宽 | 检查用户输入是否可能诱导模型生成危险指令 | 启用工具白名单、敏感操作审批、输出审计 |
| 多轮对话中 Agent 遗忘前文 | 没有正确维护用户会话上下文 | 查看 messages 结构是否丢了历史记录 | 把会话 ID 与消息列表绑定,跨轮保存上下文 |
这里想单独强调第一项。Agent 执行超时是一个非常典型的生产问题。原因往往不是一个,而是模型响应时间、工具执行时间、网络延迟三者的叠加。你在设计系统时,一定要给模型调用和工具调用分别设置超时时间,否则一个慢工具可能拖垮整个 Agent 请求。
另外,如果你真的在日志里看到类似“the agent execution provider did not respond in time”的提示,不要慌张,它通常只是说明某个执行环节超过阈值,你需要做的是把执行链路拆开,分别统计模型耗时、工具耗时和消息队列耗时,定位瓶颈在哪一段。
9. 最佳实践与工程建议
回到“专用 Agent”这个主题。你已经知道,Agent 开发不只是写 Prompt,它是一套工程体系。下面是来自真实项目经验的最佳实践,值得你在设计阶段就考虑进去。
9.1 用最小权限原则管理工具
给 Agent 的工具越少,出问题的面就越小。工具白名单设计时,遵循“最小必要”原则,只开放完成当前任务必需的工具。每次新增一个工具,要评估它是否可以被现有工具替代、是否会扩大模型误操作的影响面。
9.2 所有工具调用都要有审计日志
生产环境里的 Agent 不是玩具。你要知道它在什么时候调用了什么工具、传了什么参数、返回了什么结果。建议以结构化日志记录每一次工具调用,并关联一个全局的请求 ID。这样即使 Agent 执行出错,你也能用日志完整回放它的决策过程。
9.3 Prompt 要定义边界,而不是只定义任务
很多 Agent 开发者在写系统 Prompt 时只写“你应该做 XX”,但忘了写“你禁止做 XX”。在一个专用 Agent 里,负向约束和正向任务一样重要。比如天气 Agent 的 Prompt 里,最好明确“如果用户问与天气无关的问题,礼貌拒绝并引导回正题”。这样能显著降低模型跑偏的概率。
9.4 建立评测集,而不是靠感觉优化
Agent 优化最怕拍脑袋。你改了一版 Prompt,不能只靠“我试了一下感觉变好了”来判断。建议针对你的业务场景准备一个固定评测集,包含典型问题、边界问题、拒绝回答的负样本,每次改动都跑一遍评测集,记录工具调用成功率和最终回复质量。
9.5 先做最小闭环,再上框架
这个建议可能和很多框架宣传的声音相反,但我仍然坚持:新手学习 Agent 开发,不要一开始就把 LangGraph、AutoGen 这类重型框架全部引入。先用本文这种几十行代码把 Agent Loop 跑通,理解每一个环节,然后在一个足够小的业务闭环里验证效果。当你确认自己的场景需要复杂编排时,再引入框架也不迟。
9.6 上线前必须做安全审查
这部分想多说几句。Agent 比普通程序多了一重风险:它可以在运行时根据模型决策动态调用工具,意味着同一个输入可能触发完全不同的行为链。上线前的安全审查必须包括:
- 工具执行是否会造成不可逆影响,比如删除数据、发送消息、扣费。
- 敏感操作是否需要人工审批节点。
- 模型输出中的指令是否可能被用来构造恶意参数。
- 是否对用户输入做了长度限制,防止上下文被恶意填充。
请在测试环境充分验证后再发布,生产环境变更严格走审批和回滚流程。这不是模板话,而是 Agent 项目上线前必须想清楚的底线问题。
10. 总结与后续学习方向
这篇文章从 Blitz Agent 的“专用 Agent”定位切入,讲清了 Agent 开发中容易混淆的核心概念、五层技术底座、最小 Agent Loop 的完整实现,以及接入和评估一个 Agent 工具时应该关注的维度。整体下来你会发现,Agent 开发的核心难点不是模型,而是围绕模型搭建的工程骨架:工具注册、循环控制、上下文管理、安全边界、可观测性。
建议下一步这样做:先把你手头的某个高频小场景,比如工时查询、周报生成、工单分类,做成一个只包含两三个工具的专用 Agent。跑通最小循环后,再用评测集持续优化 Prompt 和工具描述,然后逐步加入记忆、审批和安全能力。这个路径比一上来就追求“多 Agent 协作、自动规划”要稳健得多。
如果这篇文章能帮你少踩一个 Agent 开发的坑,那就值得收藏备用。你在实际项目里遇到最诡异的 Agent 问题是什么?可以沿着文中的排查思路先还原一次执行链路,再看问题到底出在哪一层。