Agent 架构解析与工作原理:为什么它不只是一个会聊天的大模型

帅旋
订阅
充电
|

这两年,大家都在聊 Agent。

如果不了解它的实现原理,很多人很容易把 Agent 理解成“更聪明一点的大模型”。这种理解作为直觉不算错,而从技术实现上看,更准确的说法是:Agent 不是模型本身,而是一套围绕模型组织起来、能持续推进任务的运行机制。

当然,模型本身依旧很重要,它负责理解问题、做出判断,并决定下一步可能该怎么走。
但任务如何持续推进、工具调用如何发生、结果如何被记录、下一轮又如何接着继续,这些并不是模型自己凭空完成的,而是由模型之外的状态、工具和运行时共同组织起来的。

这篇文章主要想讲清三件事:

  • Agent 和大模型到底是什么关系
  • 工具调用在真实系统里到底是谁发起、谁执行、谁接结果
  • System PromptAGENTS.mdSkillTool 这些东西究竟分别是什么

1、Agent 是 LLM 吗?

很多人第一次接触 Agent,最容易犯的错误,就是把它直接等同于模型。

如果你把 Agent 当成一个会自己做事的模型,后面很多东西就会越看越乱。

比如:为什么模型能说“去查一下文件”,但真正读文件的是外部系统?为什么工具跑完之后,结果还要回到系统里,再进入下一轮判断?为什么同一个模型,接上不同的规则、工具和状态管理,表现会差这么多?

要回答这些问题,最核心的一点是:模型只是推理核心,不是整个 Agent。

更准确地说,Agent 是一套围绕模型组织起来的运行机制。用户给出任务后,系统会先根据当前目标和已有状态组织本轮上下文,再把这些信息交给模型判断下一步。如果模型认为需要调用工具,就发出 tool call 请求。真正执行工具的是外部运行时或平台能力,执行结果再写回状态或会话记录,随后系统重组下一轮上下文,继续推进任务。

flowchart TB
    U["用户任务"]

    A["Agent Controller
状态管理 / 决策控制 / 下一步编排"] C["State / Context
当前目标 / 历史 / 中间结果"] M["LLM
理解、推理、判断下一步"] F["最终回答"] subgraph E["执行环境"] TC["Tool Call Request"] R["Runtime / Orchestrator
执行调用、管理回传"] T["Tools
Read / Edit / Search / Shell"] O["Tool Result / Observation"] end U --> A A <--> C A -->|带着上下文调用| M M -->|需要工具时发出请求| TC TC --> R --> T T --> R --> O O -->|写回状态 / 上下文| C M -->|形成阶段性结论| A A -->|输出结果| F

Function calling 可以看作 Tool Use / Tools 体系中的一种具体形式,底层工作机制是一样的:模型发出工具调用意图,外部系统执行,再把结果回传给模型继续下一轮。OpenAI 关于 function calling 的文档就是这套流程。Anthropic 的 tool use 机制也类似,只是它进一步区分了 client tools 和 server tools。

所以可以把它理解成:模型更像“大脑”,而 Agent 是“大脑 + 外部记忆 + 控制循环 + 执行回路”组成的整套系统。

2、Agent 核心机制:状态和控制循环 + 工具

如果顺着上一节继续往下看,一个很自然的问题就是:为什么模型接上工具之后,不一定就能叫 Agent?

因为工具只是其中一环,它负责把动作落到外部世界。

真正让 Agent 跑起来的,通常不只是工具,而是三样东西一起配合:状态、控制循环、工具

状态负责记住任务做到哪了,控制循环负责决定下一步怎么走,工具负责真正动手。

尤其在多步任务、长流程、可恢复执行这些场景里,这三者往往缺一不可。

flowchart TB
    A["工具只是其中一环
它负责把动作落到外部世界"] --> B["Agent 真正能跑起来
靠的是三部分协同"] B --> C["状态
记住做到哪了"] B --> D["控制循环
决定下一步怎么走"] B --> E["工具
真正执行外部动作"] C:::state D:::loop E:::tool B:::core A:::desc

2.1、状态

从软件系统视角看,大模型更像一个不自带持久任务状态的推理单元。它每一轮都是读取当前被提供的上下文,然后生成下一步结果。真正的任务状态、流程进度和历史记录,通常不保存在模型内部,而是由 Agent 运行时或外部状态系统维护。

到下一轮再调用模型时,系统不一定会把所有历史原样重塞一遍,而是更常见地从状态里挑出和当前决策最相关的那部分,重新组装成上下文交给模型。

flowchart TB
    U([用户目标 / 当前任务]) --> A

    subgraph AR[Agent 运行时]
        direction TB
        A[状态记录
工作台记录] B[上下文组装
挑出当前最相关的一页] C[任务进度 / 已确认结论 / 中间结果] A --> B C --> A end B --> M[大模型
无状态推理单元] M --> D{下一步要做什么?} D -->|直接回答| R[输出当前结论] D -->|调用工具| T[工具 / 检索 / 文件读取] T --> X[工具返回结果] X --> A R --> A A -. 不把全部历史原样重塞 .-> B N[没有状态会怎样?
查完就忘、判断重复、流程难以持续推进] N:::warn M -. 仅靠上下文窗口难以稳定推进长任务 .-> N

所以,状态更像 Agent 的“工作台记录”,而上下文则是每次真正投喂给大模型模型的东西。

纯聊天式做法,本质上是把短期状态粗糙地堆在消息历史里;而有状态的 Agent,会把任务相关状态结构化地保存在外部,再按当前步骤需要选择性地组织上下文。

2.2、控制循环

控制循环听起来有点抽象,其实可以把它理解成 Agent 的工作推进器:
系统先读取当前目标和已有状态,让模型判断下一步该做什么;
如果需要外部信息或动作,就发起工具调用;
拿到结果之后,再结合最新状态判断是继续检索、切换动作,还是直接产出结果;
然后进入下一轮,直到任务完成。

在这个流程中,关键不在于“会不会调工具”,而在于它每一轮都会根据当前状态重新决定下一步
从工程实现上看,这也是 Agent 和普通聊天式交互的一个关键差异:前者围绕目标持续推进,后者更多是一问一答。

flowchart TB
    A[(状态)] --> B[控制循环]
    B --> C[模型决策]
    C --> D{下一步}
    D -->|调用工具| E[工具]
    E --> A
    D -->|直接产出| F[结果]
    F --> A

所以,Agent 真正的骨架,不只是“模型 + 工具”,而是状态负责记住任务做到哪了,控制循环负责决定下一步怎么走,工具负责把动作落到外部世界

模型当然依旧是很重要的,没有模型,就根本不会有Agent,但它更像循环里的决策核心,而不是 Agent 的全部。

2.3、工具

工具本身并不神秘,它们只是 Agent 接触外部世界的接口。

真正决定这些能力能不能在多步任务里被持续、正确地使用的,不只是工具本身,而是状态管理和控制循环。

像 LangGraph 这类框架,重点就在于如何让状态在执行中持续演化、如何让流程可恢复、可中断、可继续;而 AutoGen 这类框架,也明确支持多轮工具调用迭代。

所以从运行原理上看,工具更像最后那只手:状态负责记住做到哪了,控制循环负责决定下一步怎么走,工具负责把动作真正落到外部世界

flowchart TB
    G([用户目标 / 任务]) --> S
    G --> L

    subgraph CORE[Agent 核心机制]
        direction TB
        S[(状态
记住做到哪了)] L[控制循环
决定下一步怎么走] M[模型决策
判断 / 规划 / 选择动作] D{是否需要外部动作?} S --> L L --> M M --> D end D -->|需要| T[工具层
读文件 / 搜内容 / 改代码 / 跑命令] D -->|不需要| O[直接产出结果] T --> R[工具返回 / 新观察] R --> U[写回状态] O --> U U --> S S -. 驱动下一轮判断 .-> L N[一句话概括
没有状态,记不住事
没有循环,推不动任务
没有工具,伸不出手] N:::note CORE --- N

3、规则、技能、工具都是什么?

上面两节我们已经看到,Agent 不是模型本身。它能跑起来,靠的是状态、控制循环和工具。

但继续往下看,很快又会遇到另一组容易混在一起的概念:System PromptAGENTS.mdSkillTool

它们看起来都像“给模型的说明”,但职责其实并不一样。

有的负责定义高优先级规则,有的负责沉淀仓库经验和协作约束,有的负责封装可复用流程,有的负责真正调用外部能力。

真正把这些东西组织起来、让它们在一次次执行中接上状态、接上工具、接上结果回流的,是 Agent 的运行时和编排层。

所以,也不能简单的把他们混谈为提示词,因为各自的职责还是不一样的。接下来我们就把它们放回各自该在的位置来说说。

在下图中,System PromptAGENTS.mdSkillTool 不是同一种东西。

flowchart TD
    U["用户任务"]

    subgraph I["规则层"]
        SP["System Prompt
定义全局角色、目标、安全边界"] AG["AGENTS.md
定义项目约束、目录规则、仓库约定"] end subgraph K["能力包层"] SK["Skill
定义某类任务的标准流程"] SR["Skill 附带资源
SKILL.md / scripts / references / assets"] end subgraph D["决策层"] X["State / Context Assembly
上下文组装 / 状态更新"] A2["Agent Controller
组织上下文、控制流程"] M2["LLM
基于上下文推理并决定是否调用工具"] end subgraph C["执行层"] TC2["Tool Call Request"] TL["Tools
Read / Edit / Search / Shell"] RT["Runtime / Orchestrator
执行调用并回传结果"] RS["Tool Result / Observation"] end OUT["最终回答 / 最终修改"] U --> X SP --> X AG --> X SK --> X SR -.作为 Skill 资源.-> SK X --> A2 A2 --> M2 M2 -->|可直接形成结果| OUT M2 -->|需要工具时发起| TC2 TC2 --> RT RT --> TL TL --> RT --> RS RS --> X M2 --> A2

System Prompt 更准确地说,是系统级或开发者级的高优先级指令,用来规定模型从一开始就该遵守什么行为、语气和边界。

AGENTS.md 更像项目现场的本地规则。在 Codex 里,它会按目录层级被发现和加载,离当前工作目录越近的规则优先级越高。目录约定、哪些文件不要乱改、测试命令怎么跑、仓库里的特殊做法,通常适合放在这里。

Skill 不是单独一段提示词,而更像一套可复用的经验包。它通常以 SKILL.md 为入口,必要时还可以带脚本、参考资料和模板,用来固化某类任务的常见做法。

Tool 则是真正负责动手的能力接口。它负责读外部数据、调用服务、执行代码,或者把动作落到外部世界。

所以可以把它们理解成这样:高层规则负责约束行为,本地规则负责贴近项目现场,技能负责沉淀方法,模型负责判断,工具负责执行,而运行时负责把这一切串成一条真正能跑起来的链路。

这也是为什么同一个模型,换一套规则、换一组技能、换一种运行时组织方式,最后表现可能完全不是一回事。

4、那么多Agent框架究竟如何掌握?

如果把 OpenAI、Anthropic 这类模型平台,以及 LangGraph、AutoGen 这类 agent 框架放在一起看,会发现它们虽然分层不同,但底层逻辑其实有很多相似之处。

OpenAI 和 Anthropic 更偏模型平台、工具协议和平台级 agent 能力这一层。它们重点定义的是:模型如何表达工具调用意图,工具如何接入,结果如何回流,以及平台如何提供内建工具、上下文管理和 agent 能力。

LangGraph 更偏流程编排和运行时这一层。它关心的是状态怎么保存、节点怎么流转、执行怎么中断和恢复、长流程怎么保持可控。

AutoGen 更偏事件驱动的多 agent 框架这一层。它强调的是 agent 之间如何通过消息协作,如何形成连续推进的系统,以及多轮工具调用和多 agent 交互如何被组织起来。

OpenAI Agents SDK 则进一步把不同来源的能力显式区分成 hosted tools、function tools、agents as tools 和 MCP servers。

看起来大家讲法很多,但如果只抓住最核心的一条线,其实都绕不开同一件事:
模型负责局部决策,运行时负责组织状态与流程,工具负责连接外部世界,结果再回到系统里推进下一步。

flowchart TB
    A[上下文 / 状态]
    B[模型判断]
    C[工具调用]
    D[运行时执行]
    E[Observation 回写]

    A --> B
    B -->|需要工具| C
    C --> D
    D --> E
    E --> A
    B -->|无需工具| F[直接输出结果]
  • 先根据当前目标和状态组织本轮上下文
  • 再让模型判断下一步
  • 需要时发出工具请求
  • 由应用运行时或平台侧执行工具
  • 执行结果写回状态,并重组下一轮上下文
  • 再继续下一轮

这套机制不管换哪家平台或框架,基本都成立。差别主要在于:哪家把这套机制封装得更深,哪家给你的控制权更多,哪家更适合长流程和状态恢复,哪家更适合代码、命令和开发型任务。

5、说在最后

如果要一句话概括 Agent,可以这么理解:Agent 不是一个更会聊天的大模型,而是一套让模型能持续推进任务的运行机制。

模型负责判断,工具负责执行,运行时负责把流程串起来,状态负责记住任务做到哪了;规则负责约束行为并提供上下文,技能负责沉淀可复用做法。

当你从这个视角去看,很多概念就会一下子变清楚:

  • 为什么 function calling 不等于模型自动执行
  • 为什么 Skill 不等于 Tool
  • 为什么有些框架更强调状态和流程,有些更强调工具协议和接入方式
  • 为什么 coding agent 特别依赖项目规则、能力包和可复用工作流

References