最近学习了一些 AI Agent 的相关知识,顺手整理成一篇学习笔记。

我的阶段性理解是:Agent 的关键是它被放进了一个可以持续感知环境、调用工具、观察反馈、继续行动的循环系统里。

[!NOTE] 这是“AI Agent 学习笔记”系列的第 1 篇,主要整理 Agent Loop 的基本概念。第 2 篇会继续看一次真实的 Codex Desktop 会话 JSONL 记录。

什么是 AI Agent

我的理解是:

AI Agent 是一个能围绕目标持续做事的系统。它读取上下文,决定下一步,调用工具,观察结果,再根据新结果继续调整,直到完成任务或需要人类介入。

主要有几个部分:

  • 目标:Agent 通常不是只回答一个孤立问题,而是围绕某个任务持续推进。
  • 上下文:Agent 需要知道当前环境、规则、历史对话、项目文件、工具说明等信息。
  • 工具:Agent 可以调用搜索、终端、文件读写、浏览器、数据库等外部能力。
  • 反馈:工具调用后会返回结果,Agent 会根据结果修正下一步。
  • 循环:Agent 的行为不是一次性输出,而是多轮迭代。

所以,普通聊天更像:

用户输入 -> 模型回答

而 Agent 更像:

目标 -> 读取上下文 -> 决策 -> 调用工具 -> 观察结果 -> 继续决策

ReAct:推理和行动交织

Agent 的一个经典理论基础是 ReAct,对应论文是:ReAct: Synergizing Reasoning and Acting in Language Models

ReAct 可以理解为把两个动作交织起来:

  • Reasoning:模型先判断现在知道什么、下一步应该做什么。
  • Acting:模型把判断转化成真实行动,例如调用工具、搜索资料、读取文件、运行命令。

它的最小形态常被概括成 T-A-O 循环:

  • Thought:我现在知道什么?下一步应该查什么或做什么?
  • Action:调用搜索、读取、点击、运行命令、编辑文件等工具。
  • Observation:工具或环境返回了什么?它是否支持我的判断?

Agent Loop:完整的运行循环

ReAct 描述的是推理和行动的基本单元。再往上看,就是完整的 Agent Loop,我觉得它增加了上下文组装、工具调度和停止条件等系统层面的东西。

一个 Agent Loop 通常包含 6 个环节:

  1. 目标输入:用户说要完成什么。
  2. 上下文组装:系统把任务、规则、历史、工具说明、相关文件、检索结果放进模型上下文。
  3. 模型决策:模型判断下一步应该做什么。
  4. 工具调用:模型通过工具读取文件、搜索资料、运行命令、修改内容。
  5. 观察结果:工具返回结果,模型读取这个结果。
  6. 继续或停止:模型决定继续下一轮,还是交付结果。
flowchart TD
    A["任务输入"] --> B["组装上下文"]
    B --> C["模型决定下一步"]
    C --> D["调用工具或直接回答"]
    D --> E["观察结果"]
    E --> F{"是否完成?"}
    F -- "否" --> B
    F -- "是" --> G["输出结果与验证信息"]

Codex 中的 Agent Loop

为了加深理解,我又去看了 Codex 是如何实现 Agent Loop 的,因为平时用得比较多。下面这部分参考了 OpenAI 官方文章:深入解析 Codex 智能体循环

当 Codex 向 Responses API 发送请求时,它发送的不是一段纯文本,而是一个结构化的 JSON Payload。这个 Payload 主要包含三类信息:

  • instructions:系统指令,用来设定模型的基础规则、行为边界和协作方式。
  • tools:工具列表,告诉模型当前可以调用哪些外部能力。
  • input:输入内容列表,包含用户消息、历史上下文、工具结果、图片、文件信息等。

可以把它理解成:

Payload
├── instructions:模型应该如何行动
├── tools:模型可以调用什么能力
└── input:模型这次决策能看到什么上下文

其中 tools 可能包括:

shell:允许模型在本地执行终端命令
update_plan:允许模型更新任务计划
web_search:允许模型检索公开网页信息
apply_patch:允许模型修改本地文件

如果说 instructions 决定了“应该怎么做”,input 决定了“当前知道什么”,那么 tools 就决定了“能对外部世界产生什么影响”。

这三部分在 prompt 里的组织结构如下:

展示 AI 智能体循环中单一步骤的快照图。用户请求输入模型,模型生成一个思考、一个带工具名称的行动和一个工具输入。该图突出了工具被调用之前的这个中间推理步骤。

图中的 Role 表示:在 Responses API 的输入里,每条信息都有自己的角色。模型并不是平等地看待所有文本,而是会按照角色优先级处理,我理解这种优先级应该是通过后训练实现的。

常见优先级从高到低大致是:

  1. system:系统规则。
  2. developer:开发者指令。
  3. user:用户输入。
  4. assistant:模型之前的回复。

对于 Codex 来说,在用户的真实输入进入模型之前,系统通常已经自动塞入了几层背景信息:

  1. 沙盒和权限限制:告诉模型当前能不能改文件、能不能联网、什么时候需要用户授权。
  2. 开发者自定义指令:例如回复风格、工程习惯、验证要求等。
  3. 项目规范与技能:例如当前项目的 AGENTS.md、可用 Skills、代码风格、测试要求。
  4. 本地环境上下文:例如当前工作目录 cwd、终端类型、日期、时区等。

然后,用户的消息才被追加到输入列表后面,开启这一轮 Agent Loop。

也就是说,当我们在 Codex 里输入一句“帮我改这个功能”时,模型实际看到的并不只有这句话,而是一个已经被系统装配好的任务环境。

然后我去翻了翻自己某次 Codex 会话记录。

具体的上下文堆叠应该是这样的:

Codex 会话中的上下文堆叠

我的理解总结

学习到这里,我对 AI Agent 的理解可以总结成三句话:

  1. Agent = LLM + 上下文 + 工具 + 循环。
  2. ReAct 解决的是模型如何把推理和行动交织起来。
  3. Agent Loop 解决的是一个任务如何在环境反馈中持续推进。