Day 2|AI 智能体的底层结构

97 阅读5分钟

为什么大部分 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)

智能体的“工作记忆”,没有状态管理的智能体,永远不稳定。状态管理决定两件事:

  1. 智能体下一步干什么
  2. 智能体出错后能不能恢复

一个标准的 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”,而是“设计软件结构”。只要掌握了:输入解析 + 任务规划 + 工具执行 + 状态管理 + 记忆系统才能构建安全、稳定、真正能落地的智能体系统。