为什么大部分 Agent 做不稳、跑不远?这是「30 天 智能体 工程实战」系列的第 2 篇文章。 今天我们聊一个所有做智能体的人都绕不开的问题:智能体到底由什么组成?为什么很多 Agent 一跑就挂? 过去一年我看过大量智能体项目,绝大部分失败原因不是“模型不够强”,而是:结构错误,让模型处于 随机游走 状态。
那么问题来了?一个真正可用、安全、可控的智能体,应该由哪些组件组成,它们之间怎么协作,如何设计一个稳定的 Agent 架构?
一、绝大多数 智能体 “不稳定”?
很多人以为智能体崩溃是因为:
- 模型忘上下文?
- 推理能力不够?
- Prompt 写得不够好?
这些确实是问题,但都不是本质。真正的根因: 智能体 没有稳定的结构。 绝大多数开发者写 Agent 的流程是:
prompt = "你是一个智能助手,请帮我做 xxx"
call(model, prompt)
表面上很“先进”,本质上是在赌: “让模型自己编故事” → 当然不稳定。 智能体要想稳定,需要结构化、模块化、可控。换句话说:没有架构,就没有工程级 Agent。
二、 智能体 的底层结构?
下面是一个真正可用的智能体必须具备的 五大核心模块:
┌──────────────┐
│ 1. 输入解析器 Parser │
├──────────────┤
│ 2. 任务规划器 Planner │
├──────────────┤
│ 3. 工具执行器 Tool Executor │
├──────────────┤
│ 4. 状态管理器 State Manager │
├──────────────┤
│ 5. 记忆系统 Memory │
└──────────────┘
↓
最终输出
接下来讲解每一层为什么关键、如何设计、如何踩坑。
三、输入解析( Input ****Parser )
智能体的“理解力”不是模型给的,而是输入给的,你永远不能相信用户输入。智能体要稳定,必须:
- 把自然语言变成结构化数据
- 把模糊任务变成明确任务
- 把用户的一句话变成“目标 + 参数”
示例结构化输出(推荐 JSON):
{
"task": "生成周报",
"context": ["销售部", "数据源:CRM"],
"deadline": "今天 18:00",
"constraints": ["只包含本周数据", "不使用虚构信息"]
}
输入解析的意义在于:把“自然语言的不确定性”变成“结构化的确定性”。 这是智能体可控性的第一步。
四、任务规划(Planner)
这是 智能体 的“灵魂”, 大多数 Agent 崩在这里。模型强不强只决定“每一步准确度”,而智能体能不能完成任务,取决于:它是否能正确规划任务步骤。 规划不是一句“给我分解任务”就完了。
一个合格的 Planner 能做到:
- 把目标拆成步骤
- 给每一步明确输入/输出
- 确认依赖关系
- 检查缺失信息
- 决定需要哪些工具
- 可回滚(失败时调整计划)
- 可重试(增加 容错性 )
一个好的 Planner 输出:这样的智能体不会轻易跑偏。
{
"steps": [
{
"id": 1,
"desc": "从 CRM 获取本周销售数据",
"tool": "fetch_sales_data"
},
{
"id": 2,
"desc": "对数据进行清洗、汇总",
"tool": "data_cleaner"
},
{
"id": 3,
"desc": "根据模版生成周报内容",
"tool": "report_generator"
}
]
}
五、工具执行器(Tool Executor)
智能体真正“做事”的部分,没有工具的智能体,不是智能体,是“智能顾问”。
工具执行器负责:
- 校验参数
- 调 API / 执行脚本
- 捕获错误
- 重试策略
- 超时管理
- 工具结果结构化
最佳实践:强类型定义(Pydantic / Schema)
{
"tool": "crawl",
"params": {
"url": "https://example.com",
"method": "GET"
}
}
重点:模型绝不能随意调用工具, 工具执行器必须有权限控制与参数校验。
六、状态管理(State Manager)
智能体的“工作记忆”,没有状态管理的智能体,永远不稳定。状态管理决定两件事:
- 智能体下一步干什么
- 智能体出错后能不能恢复
一个标准的 Agent 状态应包括:
{
"current_step": 2,
"steps_total": 3,
"history": [...],
"intermediate_results": {...},
"error": null
}
推荐的做法是:
- 每个步骤执行后都更新状态
- 状态可持久化(Redis / SQLite / KV Store)
- 出错自动回到上一状态点
七、记忆系统(Memory)
智能体的“长期知识”,记忆系统并不是“把所有内容扔进向量库”。正确的做法是分层记忆:
① 即时记忆(短期)
本次任务的上下文。
② 会话记忆(中期)
用户偏好、固定参数等。
③ 长期记忆 (长期)
知识库、文档、模版。
记忆系统的目标:让 智能体 不重复犯同样的错误。 比如:如果某工具 API 永远返回特殊字段,你可以把它存进长期记忆,避免它一直猜。
八、五大模块如何组合?
最终架构如下:
┌──────────────┐
│ 用户输入 │
└──────────────┘
↓
┌───────────────────────────┐
│ 1. 输入解析器 (Parser) │
└───────────────────────────┘
↓
┌───────────────────────────┐
│ 2. 任务规划器 (Planner) │
└───────────────────────────┘
↓
┌───────────────────────────┐
│ 3. 状态管理器 (State Manager) │
└───────────────────────────┘
↓
┌───────────────────────────┐
│ 4. 工具执行器 (Tool Executor) │
└───────────────────────────┘
↓
┌───────────────────────────┐
│ 5. 记忆系统 (Memory) │
└───────────────────────────┘
这个结构能让任何复杂任务保持:
- 可控
- 可调试
- 可恢复
- 可扩展
- 可协同
也是真正工程级智能体的核心。
总的来说,智能体不是模型,而是一套结构化的软件系统, 做智能体不是“写 Prompt”,而是“设计软件结构”。只要掌握了:输入解析 + 任务规划 + 工具执行 + 状态管理 + 记忆系统才能构建安全、稳定、真正能落地的智能体系统。