深入理解 AI Agent 第一章

AI Agent 入门

如果你用 Cursor 写过代码,看它搜索代码库、编辑多个文件、运行测试直到通过;用 Deep Research 调研过一个课题,看它反复搜索、阅读,总结出一份完整报告;用 Manus 操控浏览器帮你完成在线任务;让豆包手机助手帮你在手机上订票、发消息;或者让 Pine AI 替你打电话给运营商协商降低账单——你已经在使用 AI Agent 了。

这些产品的形态各异,但有一个共同点:它们不再是“你问一句、它答一句”的被动对话,而是能够自主规划执行步骤、调用各种工具完成任务,并根据结果不断调整策略的智能系统。AI Agent 正在成为我们与计算机交互的一种全新方式。

本章将带你从实践出发理解 AI Agent 的核心组成。我们将直接动手体验现代 Agent 的能力,理解其背后的架构原理,掌握构建 Agent 系统的设计模式与最佳实践。

阅读提示:本章是全书的概念地图——它会快速引入 Agent 的核心公式、运行循环、工程框架和设计模式,为后续章节提供统一的术语和参照坐标。初次阅读时不必逐一记住所有概念,建议先建立整体印象;后续每一章都会展开讲解本章提到的某一个方面,届时可随时回来对照。

现代 Agent = LLM + 上下文 + 工具

现代 Agent 系统的本质可以用一个简洁的公式来表达:Agent = LLM(大语言模型,Large Language Model)+ 上下文 + 工具。这个公式简洁而实用,但其中每个词都需要做广义的理解:

  • LLM 是 Agent 的大脑:它不只是一组模型参数,而是 Agent 的整个决策内核——理解意图、思考规划、做出判断。就像人类大脑不只是神经元的集合,还包括通过经验塑造的思维方式,LLM 的能力也来自两部分:预训练所积累的世界知识与语言能力,以及后训练所固化的决策策略——后者的具体技术(如监督微调与强化学习)将在第七章展开。
  • 上下文是 Agent 的眼睛:它不只是输入给模型的那段文本,而是 Agent 在每个决策点能看到的全部信息——环境信息、用户记忆、领域知识、自身状态和任务进展。就像人类做决定时需要看清当前的状况、回忆相关经验、翻阅参考资料,Agent 的上下文窗口就是它当下能看到的一切。
  • 工具是 Agent 的手脚:它不只是几个可调用的 API 函数,而是 Agent 能做的所有事情的集合——从预定义的工具调用到按需加载的专业技能(Skills),从动态生成代码创造新能力到委托子 Agent 协作,从主动与用户沟通到响应外部事件。

换一种更直观的说法:Agent = 大脑 + 眼睛 + 手脚。大脑负责思考和决策,眼睛提供思考所需的全部信息,手脚将决策转化为对现实世界的改变。

这三个组件恰好对应 RL(详见第七章)中的三个核心概念。下面这张表格是可选阅读——如果你没有 RL 背景,完全可以跳过,不影响后续理解;它只是帮助有 RL 背景的读者把已有知识和本书的术语对应起来:

直觉理解 实现组件 学术概念(可选) 含义
大脑 LLM 策略(Policy) Agent 决定“下一步做什么”的决策逻辑——面对当前看到的信息,从所有可选行动中挑出最合适的一个
眼睛 上下文 观察空间(Observation Space) Agent 能看到的所有信息——能看到什么、读到什么、记住什么、能访问哪些系统
手脚 工具 动作空间(Action Space) Agent 能做的所有事情的集合——有哪些“手段”可用,从发消息到执行代码再到操控界面

理解这三者的作用及其相互关系,是构建有效 Agent 系统的基础。我们从最具体的手脚(工具)开始介绍,逐步深入到大脑(LLM)和眼睛(上下文)。先来看看不同类型的 Agent 如何在这三个维度上展开:

Agent 产品 眼睛(感知) 手脚(行动) 策略
Cursor 等 Coding Agent 需求文档、代码库、终端环境 开放式(内部思考、代码搜索、文件读写、执行命令等) 增量开发:理解需求→搜索相关代码→编辑代码→测试验证→调试修复
Deep Research 等搜索 Agent 网络资源、学术数据库、本地文件 开放式(内部思考、搜索查询、网页阅读、摘要生成) 迭代深化:根据已有信息调整搜索方向,逐步综合出完整报告
Manus 等电脑操控 Agent 电脑屏幕、浏览器页面、文件系统 开放式(内部思考、点击、输入、滚动、截图、执行代码等) 视觉感知+操作:观察屏幕→识别目标元素→执行操作→验证结果
豆包等手机助手 Agent 手机屏幕、已安装的 App 开放式(内部思考、点击、滑动、输入、打开 App 等) 意图理解+App 操控:理解用户需求→定位目标 App→执行操作→确认完成
Pine AI 等个人办事 Agent 用户账户信息、历史账单、服务商知识库 开放式(内部思考、打电话、发邮件、填表单、与用户确认) 多步骤任务执行:收集信息→制定协商策略→联系服务商→谈判→汇报结果

这些 Agent 系统有几个共同特征:它们都使用开放式的动作空间——不是从有限的几个按钮中选择,而是能生成任意自然语言和代码;它们都能内部思考——在采取行动前先思考和规划;它们都能持续交互——根据环境反馈不断调整策略。这些能力正是来自大脑、眼睛和手脚——即 LLM、上下文和工具——的协同作用。

工具:Agent 的手脚

工具是 Agent 与外部世界交互的桥梁,就像人类的手脚一样,让 Agent 能够从被动的观察者变成主动的执行者。没有工具,Agent 只能 “纸上谈兵”;有了工具,它才能真正改变世界。

为了系统化地讨论工具,可以根据 Agent 与外界互动的方向把工具分为五类。下面先快速过一遍每一类的代表场景,建立整体印象,后续章节会逐一展开。

感知工具让 Agent 能访问信息:搜索引擎提供实时网络数据,文件系统读取本地文档,API 和数据库则对接外部服务和企业核心数据。

执行工具让 Agent 改变世界:代码执行、文件操作、系统命令、外部 API 调用——决策由此变成实际行动。

协作工具让 Agent 与其他 Agent 分工合作:委托子 Agent 完成专项任务,在关键决策点请求人类确认,或在多 Agent 系统中协调行动。

事件触发工具与前三类在调用方式上有本质的区别——它们不是 Agent 主动调用的,而是作为外部输入来驱动 Agent 开始执行任务。比如收到一封新邮件、到了某个预定时间点、或另一个系统发出了 Webhook 回调,这些事件会激活 Agent,让它开始后续的思考和行动。虽然事件触发不是 Agent 主动调用的,但它是 Agent 与外部世界交互的通道之一,因此归入广义的工具体系。

用户沟通工具是 Agent 主动与用户建立连接、传递信息的渠道。与执行工具改变外部世界不同,用户沟通工具专注于信息的传递和交互——通过文字消息、语音通话、邮件等方式,将 Agent 的执行进展或主动关怀传达给用户。

以上五类工具的完整分类体系和设计原则将在第四章展开讨论。工具设计的质量直接决定了 Agent 能走多远——接口定义不清晰,模型就会乱用工具;错误处理不到位,工具一旦失败就会变成 Agent 的死锁;权限控制太宽泛,Agent 一旦出错,后果就难以挽回。MCP(Model Context Protocol,模型上下文协议)标准的推广,正在让工具接入变得更像安装插件——生态在快速扩展,但设计原则不会过时。

工具调用(Tool Calling,也称 Function Calling)是现代 LLM Agent 的一项核心能力,它让模型能够通过结构化的方式调用外部工具。这种能力将 LLM 从一个纯粹的文本生成器转变为能够执行实际操作的智能系统。本书后续统一使用“工具调用”这一术语。

工具调用的流程分为四步:首先,在上下文里告诉模型有哪些工具可用(包括名称、用途和参数);然后,模型自主判断要不要调用工具、调用哪个、传什么参数;接着,工具执行完毕后,结果被追加到上下文中;最后,模型据此决定下一步行动。这个循环就是后文要介绍的 ReAct 的基础。

以一个查天气的场景为例,四步流程在 API 层面的简化表示如下:

第一步:声明工具                    第二步:模型决定调用
tools: [{                          assistant: {
  name: "get_weather",               tool_calls: [{
  parameters: {                        function: "get_weather",
    city: "string"                     arguments: {city: "北京"}
  }                                  }]
}]                                 }

第三步:结果追加到上下文              第四步:模型基于结果回复
tool: {                            assistant: {
  tool_call_id: "call_1",            content: "北京今天 28°C,晴。"
  content: '{"temp":28,"sky":"晴"}'  }
}

开发者只需要定义工具和执行工具调用,模型自主完成“要不要调用、调哪个、传什么参数”的决策。第二章将详细展开这个 API 结构。

在为 Agent 设计工具时,应尽量保持工具的通用性,给 LLM 更大的发挥空间。例如,与其设计一个专用的计算器工具,不如提供一个 Python 代码解释器,并为 Agent 创建一个安全的沙盒执行环境。与其设计一个记录工作日志的工具,不如提供文件读写工具,并为 Agent 创建一个虚拟的文件系统。通用的工具让 Agent 能够通过组合基础能力来创造性地解决问题。

LLM:Agent 的大脑

大语言模型(Large Language Model, LLM)是 Agent 的决策核心。收到用户的请求后,它需要先解析真实意图(用户说的往往不是他真正想要的),再将模糊或复杂的任务拆解成可执行的步骤。执行过程中它还要持续做出判断:下一步该做什么、要不要调用工具、调哪个工具、传什么参数。这种“理解-规划-执行”的能力来自预训练所积累的知识,是工作流和自主 Agent 都依赖的基础。

LLM Agent 的一个独特能力是内部思考——在采取实际行动之前,Agent 可以先进行规划与推演。这一过程不改变外部环境,却能显著提升后续行动的质量。LLM 之所以能够进行有效的内部推演,得益于预训练(Pre-training,即在海量互联网文本上进行初始训练,让模型学会语言规律和世界知识)阶段习得的能力——模型在推演时所遵循的是人类知识中已经沉淀下来的逻辑规则,包括数学定律、因果关系、问题分解策略等。因此 Agent 的推演不是盲目的随机探索,而是在结构化的知识体系上展开。

这种结构化推演的能力,让 LLM Agent 在面对全新任务时也能直接上手——下面通过零样本和少样本两个概念分别说明。这种能力的直接体现是零样本泛化(Zero-shot Generalization):即使面对从未见过的任务,LLM Agent 也能通过组合已有知识来处理,无需任何示例。比如你从未教过它写一首关于量子物理的诗,但它能根据已有的语言和物理知识生成一首像样的作品。

更进一步,LLM Agent 还能通过极少的示例实现少样本适应(Few-shot Adaptation)——只需在提示中给出两三个示范例子,模型就能掌握一种新的任务模式。比如给它看几条“用户评论 -> 情感标签”的例子,它就能学会对新评论做情感分类。简单来说,零样本是“没有例子也能做”,少样本是“看几个例子就能学会”。

模型即 Agent:当模型本身成为产品

“模型即 Agent”(Model as Agent)这一新范式代表了 AI Agent 发展的最新方向。先进模型通过后训练(特别是强化学习)将工具调用能力内化为原生能力:何时调用工具、调哪个、传什么参数,都由模型自己决定,无需人工编排。但这并不意味着框架层变得不重要了。恰恰相反,模型越强大,围绕模型构建的 Harness 就越关键。Harness 这个词原指马具,即套在马身上的缰绳与挽具,不是为了限制马的奔跑能力,而是把这种力量引导到正确的方向上。换到 Agent 语境里,模型是那匹强大但不可预测的马,Harness 则是把它的能力引导成可靠任务执行的工程外壳。你也可以把它想象成赛车手周围的整套保障系统:安全带、赛道护栏、进站维修团队。车手(模型)越快,这套系统越重要。在 Agent 中,Harness 包括上下文管理、工具接口、安全约束、验证与纠正等基础设施(详见本章末节)。

模型自主决策的空间越大,出错时的影响面也越大,因此需要更精细的约束、验证和纠正机制来确保可靠性。模型厂商的真正优势不是“让框架变薄”,而是能对模型与外围 Harness 进行协同优化,持续迭代。

Agent 的学习机制:后训练、上下文学习与外部化学习

前面讨论了模型如何通过强化学习将工具调用内化为原生能力。但 Agent 的学习不只发生在训练阶段——一些读者一想到 Agent 从经验中学习,就认为一定要训练模型。事实上,后训练并不是 Agent 从经验中学习的唯一方法。Agent 的学习机制可以总结为三个互补的范式(图 1-1):

图1-1 Agent 的三种学习范式

  • 后训练(Post-training):通过强化学习将经验固化到模型的参数中,提供最强的跨任务通用性,但更新成本高(详见第七章)。
  • 上下文学习(In-Context Learning):通过注意力机制(Attention Mechanism,即模型在处理输入时决定“关注哪些信息”的机制)在上下文中进行模式检索式的快速适配。比如在提示词中给模型看几条客服对话的处理示例(如“用户投诉→安抚+补偿方案”),它就能用类似的方式处理新的客服对话——这就是上下文学习。能快速适应但临时性强,会话结束就消失了。需要说明的是,虽然名字叫“学习”,但它的内部机制更接近模式匹配而非真正的学习。打个比方:如果给你看三道相同类型的数学题和答案,然后给你第四道,你大概率能照葫芦画瓢做出来——这就是上下文学习在做的事。但如果第四道题需要一种全新的解题思路,光看前三道题的答案是不够的。换句话说,上下文学习让模型能套用已见过的模式,但不能发现全新的规律——这一点与后训练有本质区别(第二章将从注意力机制的角度详细展开这个论断)。
  • 外部化学习(Externalized Learning):将知识和流程外部化为知识库与可执行的工具代码,兼具持久性和可解释性。

这三种范式在不同的时间尺度上互补:后训练提供基础能力,上下文学习实现快速适应,外部化学习确保可靠性和效率。第八章将系统地比较三种范式的协同关系。

打个比方:后训练像是系统性学习教科书——学完后能力永久提升,但学习成本高;上下文学习像是临场查阅参考资料——有资料就能做好,合上就忘;外部化学习像是整理个人笔记本——信息持久保存且随时可查,但需要专门整理。

上下文:Agent 的眼睛

上下文是 Agent 在每个决策点能看到的全部信息。就像一个人在做决策时需要看到桌上摊开的所有资料——任务说明、参考手册、之前的沟通记录、最新的数据——Agent 的上下文窗口就是它的“视野”。从 API 的视角看(详见第二章),每次调用 LLM 时的上下文由以下五个部分构成:

  • 系统提示词(System Prompt):与用户每次输入的提示词不同,系统提示词由开发者编写,在整个对话过程中保持不变,相当于 Agent 的“岗位说明书”——定义它的身份、权限和行为准则。通过提示工程(Prompt Engineering)精心设计系统提示词,我们可以塑造 Agent 的工作方式。系统提示词中还会包含跨会话保存的用户记忆(用户偏好、历史行为、背景设定等个性化信息,详见第三章)和动态注入的环境状态。
  • 工具定义(Tool Definitions):声明 Agent 可用工具的名称、功能描述和参数格式。没有工具定义,Agent 就无法识别和调用任何工具——消融实验(实验 1-1)将验证这一点。工具定义与系统提示词一起构成对话中保持不变的静态前缀
  • 用户消息(User Messages):来自用户的输入。用户消息中还可能包含通过 RAG(检索增强生成,Retrieval-Augmented Generation,详见第三章)动态检索引入的外部知识——覆盖训练数据截止后的信息或私有领域知识。
  • 模型回复(Assistant Messages):模型之前生成的回复,最多包含三个部分——思考过程(reasoning,即内部思考链,保持思维连贯性和决策可解释性)、文本内容(content,即对用户的回复)和工具调用请求(tool_calls,即 Agent 采取行动的方式)。在一次具体的回复中,三者不一定同时出现:例如 Agent 决定调用工具时通常只有 reasoning + tool_calls,给出最终回答时通常只有 reasoning + content。
  • 工具执行结果(Tool Results):Agent 框架执行工具后返回的结果。这些结果是 Agent 下一步思考的直接依据,也让它能够从执行结果中学习、避免重复犯错。

前两项(系统提示词 + 工具定义)是静态前缀,后三项(用户消息 + 模型回复 + 工具执行结果)是随交互不断增长的动态消息历史。这五个部分共同构成了 LLM 每次推理时的上下文。

要验证每个组件是否都不可或缺,最直接的方法是消融实验(Ablation Study):就像医生诊断时逐一排除病因——先去掉 A 组件看系统是否还正常,再去掉 B 组件,以此类推,从而判断每个组件的贡献。实验 1-1 正是按这个思路对上述五个组件做了系统性测试,结果表明:去掉工具定义,Agent 完全丧失行动能力;缺少工具执行结果时,由于看不到上一步的反馈,Agent 会反复调用同一个工具,陷入无限循环;模型回复中的思考过程一旦被剥离,前后决策就开始互相矛盾;至于历史消息,没有它 Agent 等于失忆,于是从头开始整个任务流程,重复执行已完成的步骤。每个组件的作用都有实验证据支撑,而不只是理论推断。

实验 1-1 ★★:上下文的关键作用

通过系统性的消融实验(Ablation Study),我们探索了不同上下文组件对 Agent 行为的影响。实验从上述五个部分中选取了四个组件进行测试——系统提示词作为 Agent 的基本身份定义不参与消融,因为没有系统提示词,Agent 连基本的角色认知都没有,测试没有意义。如图 1-2 所示,五组对照实验包括:一组保留全部组件的完整基线,再加上四组各缺失一个组件的对照,以此观察每个组件对 Agent 性能的影响。

图1-2 实验 1-1——上下文消融实验设计

实验结果揭示了每个上下文组件不可替代的作用。工具定义(Tool Definitions,静态前缀的一部分)是 Agent 行动能力的基础,没有它,Agent 就无法识别和调用任何工具。工具执行结果(Tool Results)是闭环控制的关键,缺失它会导致 Agent“盲目”执行,陷入无限循环。思考过程(模型回复中的 reasoning 部分)保留了 Agent 做出之前决策的原因,使思维流程更加连贯,避免做出前后矛盾的决策。历史消息(之前轮次的用户消息、模型回复和工具执行结果)则防止了冗余操作,保持任务执行的连贯性,避免重复犯同样的错误。

这个实验的核心洞察是:上下文决定了 Agent 能看到什么,而 Agent 只能基于它看到的信息做决策。就像一个人蒙住眼睛就无法做出合理判断一样,缺失任何一个上下文组件,Agent 的决策能力都会严重退化——看不到工具定义就不知道有哪些工具可用,看不到之前的执行结果就不知道已经做过什么。

ReAct 循环

了解了 Agent 的三大组件后,一个自然的问题是:它们如何协同工作?ReAct 循环就是将 LLM、上下文和工具串联起来的核心机制——让我们看看一个 Agent 是如何一步步思考和行动的。

Agent 执行任务的核心模式叫做 ReAct(Reasoning + Acting)。虽然名字只体现了思考(Reasoning)和行动(Acting)两个词,但实际循环包含三个环节:模型先思考当前应该做什么,然后调用工具行动,再观察工具返回的结果并继续思考下一步。这个“想→做→看→想→做→看”的循环不断重复,直到任务完成。

让我们通过一个多币种收入汇总的具体例子来理解 Agent 的轨迹(trajectory)。轨迹是 Agent 在执行任务过程中不断积累的消息历史——用户消息、模型回复(包括思考过程和工具调用)、工具执行结果。每一次调用 LLM 时,它接收的完整上下文由静态前缀(系统提示词 + 工具定义)和轨迹(动态消息历史)两部分组成(图 1-3)。这揭示了一个关键事实:Agent 的上下文 = 静态前缀 + 轨迹。具体地说,静态前缀对应前文五个组件中的前两项(系统提示词 + 工具定义),轨迹对应后三项(用户消息 + 模型回复 + 工具执行结果,随交互不断增长)。基于这个完整上下文,LLM 生成下一步的响应,然后这个响应又追加到轨迹中,供下一次调用使用。

图1-3 Agent 轨迹——多币种汇总任务的 ReAct 循环

让我们通过伪代码来理解 Agent 轨迹的结构:

轨迹 = [
  {role: “user” , content: “根据公司季度收入:Q1 2.5M 美元,Q2 2.1M 欧元,Q3 1.8M 英镑,Q4 380M 日元,计算公司年度总收入和季度平均收入” },

  # 第一次迭代 - LLM 看到上述轨迹,生成响应
  {role: “assistant” , 
   reasoning: “需要将所有货币转换为 USD...” ,
   content: “” ,  # 没有直接回复用户
   tool_calls: [
     {name: “convert_currency” , args: {amount: 2100000, from: “EUR” , to: “USD” }},
     {name: “convert_currency” , args: {amount: 1800000, from: “GBP” , to: “USD” }},
     {name: “convert_currency” , args: {amount: 380000000, from: “JPY” , to: “USD” }}
   ]},

  # Agent 框架执行工具,添加结果到轨迹
  {role: “tool” , content: “EUR->USD: 2282608.7” },
  {role: “tool” , content: “GBP->USD: 2278481.01” },
  {role: “tool” , content: “JPY->USD: 2541806.02” },

  # 第二次迭代 - LLM 看到完整轨迹,包括工具结果
  {role: “assistant” ,
   reasoning: “已获得转换结果,现在需要汇总计算...” ,
   content: “” ,
   tool_calls: [
     {name: “code_interpreter” , args: {code: “total = 2500000 + 2282608.7 + ...” }}
   ]},

  {role: “tool” , content: “Total: $9,602,895.73, Average: $2,400,723.93...” },

  # 第三次迭代 - LLM 看到完整轨迹,生成最终答案
  {role: “assistant” ,
   reasoning: “所有计算完成,总结结果...” ,
   content: “FINAL ANSWER: 总收入$9,602,895.73...” }
]

注意,轨迹中没有显示系统提示词和工具定义——它们作为静态前缀,在每次 LLM 调用时都会被自动拼接在轨迹前面。

在我们的实验中,这个循环展现得淋漓尽致。第一轮,Agent 分析任务后并行调用三个货币转换工具;第二轮,基于转换结果调用代码解释器进行复杂计算;第三轮,确认所有计算完成后生成最终答案。整个过程仅用了 3 次迭代、4 次工具调用就完成了复杂的多步骤任务。

这种设计的精妙之处在于上下文的累积性。每次 LLM 调用都能看到完整的轨迹,这让它能够理解当前处于任务的哪个阶段、之前尝试了什么、得到了什么结果。就像人类解决问题时会不断回顾和总结,Agent 通过轨迹保持着对整个任务的全局认知。同时,轨迹的结构化特性也让系统具有高度的可解释性和可调试性:用户消息、模型回复(思考过程 + 工具调用)和工具执行结果都被清晰地区分开来。

轨迹不仅是执行的记录,更是 Agent 能力的体现。通过分析大量的轨迹,我们可以发现 Agent 的行为模式、优化决策路径、改进工具设计。轨迹数据甚至可以总结到知识库中,或者通过强化学习来训练更好的 Agent 模型,实现从经验中学习的闭环优化。

理解了 Agent 的运行循环后,让我们通过两个实验来感受不同模型如何驱动这个循环。

实验 1-2 ★:Kimi K3 原生 Agent 能力

这个实验展示了 Kimi K3 的原生 Agent 能力,体现了“模型即 Agent”的新范式。Kimi K3 由 Moonshot AI 于 2026 年发布,是一个约 2.8 万亿参数的混合专家(MoE, Mixture of Experts)模型——可以把 MoE 想象成一个专家团队:面对不同类型的问题,系统会自动选择最合适的几位专家来作答,而不需要所有专家同时上阵,这样既保证了能力又提高了效率。它拥有 100 万 token 的上下文窗口、原生的视觉理解能力,以及始终开启的“思考模式”(thinking mode);模型通过强化学习训练,将工具调用能力内化为原生能力,能够自主决策并执行网络搜索等任务。

关键观察包括:模型通过 RL 训练自然地学会了使用工具,不需要额外的编排层;模型自己决定何时搜索、搜索什么,展现了真正的自主性;它能根据搜索结果动态调整策略,自主判断信息是否充足;工具使用能力不是“教”给模型的,而是通过与环境反复交互而学会的。

Kimi K3 在 Agent 任务中的一个突出优势是长链工具调用的稳定性——它能够连续执行 200~300 次工具调用而保持思考的一致性,远超多数模型在数十次调用后就开始退化的表现。K3 面向长周期编程与 Agent 工作负载优化,发布时提供 K3 Max(面向对话与 Agent 任务)与 K3 Swarm Max(面向大规模并行处理)两个规格。作为开源模型,它在软件工程和 Agent 基准测试中展现了可与顶尖闭源系统比肩的性能,证明了通过强化学习赋予模型原生 Agent 能力这条路线的有效性。

实验 1-3 ★:GPT-5.6 原生 Deep Research 能力

第二个实验使用 OpenAI GPT-5.6,展示先进模型如何将 Deep Research 能力内化为原生能力。GPT-5.6 提供了三种规格——Sol(旗舰前沿模型)、Terra(面向日常工作的均衡模型)和 Luna(快速经济的轻量模型),均将工具调用作为模型的原生能力,无需外部框架。其最具突破性的特性是自由格式工具调用(Freeform Tool Calling)——传统方式中,模型调用工具时必须把所有参数打包成严格的 JSON 格式(一种结构化的数据格式),这就像填表格一样有很多格式限制。自由格式工具调用允许模型直接向工具发送原始内容(比如一段 Python 代码、一条 SQL 查询),省去了格式转换的麻烦,更加灵活高效。GPT-5.6 还引入了 Verbosity 参数(控制输出的详略程度)和 Reasoning Effort 参数(调整思考的深度,Sol 新增了 max 档位以获得最充分的推理时间),使开发者能根据任务的复杂度精细控制模型行为。

GPT-5.6 具备强大的网络搜索和代码解释器原生能力——这正是 Deep Research 的核心:模型能够自主搜索网络获取实时信息,并编写代码进行深度分析,实现“搜索 -> 阅读 -> 分析 -> 再搜索”的迭代研究过程。例如,面对 “东盟 10 国首都之间,最近的一对首都距离多少” 这样的问题,GPT-5.6 会自动搜索各国首都的地理坐标,然后编写 Python 代码计算所有首都对之间的大圆距离,最终找出最近的一对。又如 “搜索最近一个月的比特币走势,做技术分析” 任务中,它能从多个金融数据源获取实时价格数据,运用专业的技术分析库计算移动平均线、RSI、MACD 等技术指标,生成可视化图表并给出交易建议。

更重要的是,GPT-5.6 将 OpenAI Deep Research 产品的设计理念内化到了模型层面,引入了意图澄清过程。当用户提出研究需求后,GPT-5.6 不会立即动手执行,而是首先通过一系列问题来澄清用户的真实意图。以“搜索最近一个月的比特币走势,做技术分析”为例,它会先问:“您偏好使用哪个数据源?需要分析哪些技术指标?”通过这种交互式的意图澄清,GPT-5.6 能够生成更精准、更符合用户需求的研究报告。

GPT-5.6 是“模型即 Agent”概念的一个成熟实例——Deep Research 能力内化到了模型层面,不再依赖外部编排框架。其中最值得关注的是意图澄清机制:模型不会一收到任务就立即执行,而是先通过提问来确认用户的真实需求,再制定研究策略。这让“用户说了什么”和“用户真正想要什么”之间的差距,在任务执行之前就得到了弥合。

图 1-4 展示了“模型即 Agent”范式下原生工具调用的完整架构,以及 Kimi K3 / GPT-5.6 在实际任务中的 ReAct 执行过程。

图1-4 “模型即 Agent” 架构——原生工具调用

Harness 工程:模型之外的竞争力

到这里你已经理解了 Agent 的核心工作原理——LLM 通过 ReAct 循环,在上下文的辅助下使用工具完成任务。前面的实验证明了这套基本机制是有效的,但同时也暴露了明显的脆弱点:模型可能产生幻觉(编造不存在的工具或参数)、选错工具、或在遇到错误时无法自我恢复。一个能跑的 Demo 和一个可靠的产品之间还有巨大的鸿沟,而这些脆弱点正是 Harness 工程要解决的问题。本章前半部分回答了 Agent 是什么,下半部分回答 Agent 如何在生产环境中可靠运行。

前面几节建立了 Agent = LLM + 上下文 + 工具 的核心公式。这个公式描述了 Agent 的内部组成,即大脑、眼睛、手脚分别由什么承担。从 Harness 工程的视角看,还需要一个工程实现层面的视角:把 LLM 当作一个核心组件(Model),围绕它构建的所有支撑代码统称为 Harness。两个视角并非替代关系,而是不同抽象层次上对同一系统的描述。之所以换用更通用的 “Model” 一词,是因为 Harness 工程的原则适用于任何具备推理和工具调用能力的模型,不限于某种特定模型类型。Harness 的核心就是原公式中的“上下文 + 工具”,再加上三层保障机制:约束(限定 Agent 能做什么、不能做什么)、验证(检查 Agent 做得对不对)和纠正(做错了怎么补救)。

用方程展开生产形态下的完整组成:

Agent = LLM + [上下文 + 工具 + 约束 + 验证 + 纠正] = Model + Harness

最小可工作的 Agent 只需要 LLM、上下文与工具就能跑起来;而要让它在生产环境中长期可靠运转,还需要补全约束、验证、纠正这三层工程外壳——约束防止越界、验证发现错误、纠正恢复异常。这三层机制不是新增的“独立模块”,而是围绕“上下文 + 工具”构建的保障层。换句话说,最小公式是 Demo 视角,扩展公式是生产视角;后者完全包含前者,并在外围加了一圈安全网。

举个例子帮助理解:上下文中嵌入退款政策是“上下文”的范畴,而校验退款金额不超过订单金额则属于“约束”;工具执行 API 调用是“工具”的范畴,而 API 超时后自动重试则属于“纠正”。模型提供基础的理解和推理能力,而 Harness 将这些能力引导、约束和放大为可靠的任务执行。设计和优化这套模型之外的基础设施的工程实践,就是 Harness 工程(Harness Engineering)。

用一个具体的例子来理解 Harness 的价值。假设你让一个 Agent 帮用户退掉 3 天前的订单。没有 Harness 时:模型看不到退款政策(缺上下文),不知道该调哪个 API(缺工具),直接编造一个退款结果回复用户(缺验证),用户发现退款根本没发生(缺纠正)。有了 Harness 后:系统提示词写明了 7 天退款政策(上下文),Agent 调用 query_orderprocess_refund 工具完成操作(工具),框架校验退款金额不超过订单金额(约束),校验数据库状态确认退款成功(验证),如果 API 调用超时则自动重试(纠正)。同一个模型,有无 Harness,结果天壤之别。

回到本章前面给出的马具隐喻:没有 Harness 的模型就像脱缰的野马,能力惊人,但无法可靠地完成任务。

更精确地说,模型之外的全部基础设施都属于 Harness。Harness 的核心是上下文与工具,围绕它们构建了三类工程化保障机制:

功能 一句话职责 与上下文/工具的关系
Context(上下文) 为模型提供感知信息 核心能力
Tools(工具) 为模型提供行动手段 核心能力
Constrain(约束) 设定行为边界——能做什么、不能做什么 围绕上下文和工具构建的安全边界
Verify(验证) 自动判断操作结果的对错 围绕工具执行结果构建的检查机制
Correct(纠正) 发现问题时自动修正或回退 围绕工具调用失败构建的恢复机制

上下文与工具让 Agent “能做事”——理解任务并采取行动;约束、验证与纠正让 Agent “不做错事”——它们不是独立于上下文和工具之外的东西,而是确保上下文和工具在生产环境中可靠运转的工程实践。在 Agent 产品的成熟度曲线上,两者的重要性是不对称的。

早期的 Agent 框架主要关注上下文与工具:给模型工具、给模型上下文,让它“能做事”。而生产级 Agent 系统的重心已经转向约束、验证与纠正:确保工具调用是安全的、上下文是经过管理的、错误是可恢复的。

以 Claude Code 为例,它的 Harness 中绝大部分代码都是约束、验证与纠正,而非上下文与工具——工具本身(文件读写、命令执行、搜索)只是一小部分,而围绕这些工具构建的保障机制才是真正的核心。这些机制包括:

  • 流程状态管理:追踪 Agent 当前执行到哪一步
  • 多层上下文压缩:当信息太多时自动精简
  • 权限分类:控制哪些操作需要用户确认
  • 熔断器(Circuit Breaker):当错误连续发生时自动“断电”停止重试——就像家里电路短路时保险丝会自动跳闸,防止整个系统崩溃
  • 错误恢复机制:捕获异常、回滚到上一稳定状态、重试或交还给人类

行业正在从“能做事”向“可靠地做事”转变,Harness 工程因此成为 Agent 系统的核心竞争力。

从提示工程到 Harness 工程:工程范式的演进

回顾 AI 应用工程的发展,可以看到一条清晰的演进弧线:

软件工程(Software Engineering)是基础——传统的系统设计、架构、测试和部署实践。提示工程(Prompt Engineering)是第一波创新——通过优化输入给模型的自然语言指令来提升输出质量。上下文工程(Context Engineering)是第二波——人们认识到单纯优化提示词还不够,需要系统性地管理模型能看到的所有信息(系统指令、工具定义、对话历史、外部知识)。Harness 工程是当前的前沿——它将视野从“模型能看到什么”进一步扩展到“模型在什么样的系统中运行”,涵盖了约束机制、验证手段、反馈循环和错误恢复等模型之外的全部基础设施。

这四个阶段不是替代关系,而是层层包含的:提示工程是上下文工程的子集,上下文工程是 Harness 工程的子集。每一层都在前一层的基础上扩展了工程师的关注范围和影响力。当各家模型的能力越来越接近、不再是决定性的差异因素时,竞争优势就转移到了模型之外的工程实践。这一判断在最近的工程实践中得到验证——LangChain 在 Terminal Bench 2.0(一个评估 Agent 在终端环境中完成复杂任务能力的基准测试)上的实践就是一个有力的例证:他们的 Coding Agent 从 52.8% 提升到 66.5%(从排行榜 30 名开外跃升至前 5),改变的不是模型,而是 Harness:让 Agent 自动检查自己的执行结果、检测是否陷入了重复循环、优化思考策略等工程手段。OpenAI 的工程团队也公开分享了类似的经验——3 名工程师用 5 个月完成了约百万行代码和近 1500 个 PR,达到传统开发速度的约 10 倍。这一效率的背后不是模型有多强,而是 Harness 做对了。

Harness 五个功能的核心原则

上面的表格列出了 Harness 的五个功能。下表进一步展开每个功能的核心设计原则和在本书中的对应章节,帮助读者建立从概念到实践的映射:

功能 核心原则 实际例子 详见
上下文 信息充分性:让 Agent 在每个决策点都基于足够的信息判断 系统提示词、知识库、Agent 状态栏、Sidecar 旁路查询 第二、三章
工具 接口清晰:工具命名直观、参数有例子、边界有说明 MCP 工具、代码解释器、搜索工具 第四章
约束 故障安全默认值:所有能力默认关闭,必须显式开放(类似手机 App 权限管理) Claude Code 中每个工具默认需要用户授权才能执行 第四章
验证 输入隔离:安全检查只看结构化数据(如工具返回的 JSON 字段),而不是模型自由生成的文本(因为攻击者可能通过提示注入操纵模型输出) Linter 检查、类型系统、工具调用结果校验 第五、六章
纠正 在确认无法恢复之前,不暴露中间态(例如工具调用失败时先静默重试,不将半成品结果展示给用户) 静默重试、接续生成、连续失败时回退到人工判断(熔断机制) 第二、五章

五个功能构成一个闭环:上下文与工具支撑决策,约束预防错误,验证发现偏差,纠正闭合循环。缺少任何一个环节,系统都会出现可靠性缺口。在深入具体的编排模式和护栏设计之前,我们先明确构建 Agent 的核心原则和模型选择策略——它们是后续所有设计决策的基础。

构建有效 Agent 的核心原则

根据 Anthropic 的经验,成功的 Agent 系统遵循三个核心原则。

保持简单。从最简单的方案开始,只在确实必要时才增加复杂度。直接的 API 调用优于复杂的框架,清晰的代码优于聪明的抽象。因为每多一层抽象都会成为以后调试时新的盲区。

保持透明。明确显示 Agent 的规划步骤、执行日志和决策轨迹——这不只是为了调试方便,也是让用户建立信任的前提。因为黑箱里的错误一旦发生,外部观察者既无法定位也无法纠正。

设计好工具接口(ACI,Agent-Computer Interface)。ACI 强调的是从 Agent 视角设计接口(让 Agent 容易理解和使用),而非传统 API 从程序员视角设计接口。工具的命名和参数要直观,容易误用的地方要主动防呆,从设计上让错误无法发生——比如 USB 接口只能从一个方向插入,就避免了用户插反的错误。这种“用设计消除错误”的思路在制造业里有一个专门的术语,叫防呆(Poka-yoke),源自丰田生产体系。设计不好的工具会让再强的模型也频繁出错——因为模型与工具之间唯一的沟通通道就是接口本身,模糊的接口会被模型放大成系统性的错误。

以下三节展开 Harness 工程中三个独立但重要的主题:模型选型、编排模式、护栏与安全性。它们都不属于 Harness 五要素本身,但是工程实践中绕不开的决策。

如何选择模型

在讨论编排模式之前,先回答一个实操问题:应该选什么样的模型来驱动 Agent?

模型是 Agent 的智能基座,选对模型往往比优化提示词更有效。由于模型迭代极快,本节不推荐具体的模型版本,而是提供一些选择的方向。

认识 “御三家”。 目前 Agent 开发中最常用的三大闭源模型厂商是 OpenAI(GPT/o 系列)、Anthropic(Claude 系列)和 Google(Gemini 系列)。它们各有侧重:Claude 在复杂推理、编程和工具调用方面表现突出,是目前 Agent 开发的热门选择;Gemini 拥有超长上下文窗口和强大的多模态能力,适合长文本与图片、视频等多媒体场景;GPT/o 系列各方面能力均衡,用户数量最多。选模型时不要只看排行榜,要在你自己的任务上做评估(见第六章)。

国内模型。 如果你的应用部署在国内或有较严格的成本预算,国内模型是务实的选择。字节跳动的豆包系列国内延迟极低,适合实时交互;月之暗面的 Kimi 是国内 Agent 能力较强的模型;Qwen 和 DeepSeek 等开源模型则在成本和可定制性方面有优势。需要注意的是,不同模型在工具调用方面的能力差异很大,选型前务必在具体场景中测试。国内模型通常通过火山引擎(豆包)、硅基流动(开源模型)等平台的 API 访问,海外模型则可以通过 OpenRouter 统一访问。

开源与闭源。 闭源模型通常在能力上领先,但成本较高且受限于厂商的 API 策略。开源模型成本低、可私有化部署、支持微调定制,适合对成本敏感或有数据合规要求的场景。

绝大多数 Agent 需要支持思考(Reasoning)的模型。 Agent 需要进行多步思考、工具选择等复杂决策,不带思考能力的模型在这些任务上表现往往很差。只有极少数场景例外——比如只执行单步简单任务、或 Computer Use 中仅需点击固定位置的简单 GUI 操作——此时不带思考的模型也能胜任。但只要涉及多步思考或动态决策,就一定要选择支持思考的模型。

关注输出速度和多模态能力。 除了成本,还有两个容易被忽视的维度。一是输出 token 的速度:Agent 往往需要多轮推理,每轮都要等待模型输出完成才能执行下一步,所以输出速度直接决定了端到端的响应延迟——如果一个 Agent 任务需要 20 轮推理,每轮慢 2 秒就意味着总共多等 40 秒。二是多模态支持:如果你的 Agent 需要理解图片、音频或视频,多模态能力就是硬性要求,不同模型在这方面的差异很大。

编排模式:工作流与自主

编排模式是 Harness 中“上下文与工具”层面的组织方式——它决定了上下文如何在 LLM 调用之间流动、工具如何被调度、以及 Agent 的执行路径是预先设定还是动态生成。Agent 系统的编排方式经历了从简单到复杂的演进过程,每种模式都有其适用的场景和需要权衡的取舍。根据 Anthropic 与数十个团队合作构建 LLM Agent 的经验,最成功的实现往往不是使用复杂的框架,而是采用简单、可组合的模式。

在构建 LLM 应用时,应遵循“从简单到复杂”的原则:首先考虑单个 LLM 调用——如果通过优化提示词和上下文示例就能解决问题,就不要引入 Agent 系统;当需要多步骤处理时,对于可以清晰分解为固定子任务的场景,考虑使用工作流;只有当需要动态决策和灵活的执行路径时,才使用自主 Agent。需要记住的是:Agent 系统通常会用延迟和成本换取更好的任务性能,应该谨慎权衡这种交换是否值得。

工作流模式:确定性的编排

工作流(Workflow)是通过预定义的代码路径来编排 LLM 和工具的系统。它的执行路径是确定性的,由开发者预先设计好——每一步做什么、下一步去哪里,都是代码写死的,LLM 只在每个节点内部负责理解和生成。

以一个订机票 Agent 为例,工作流可以设计为四个固定节点:

  1. 核实用户身份——调用身份验证 API,确认用户是谁
  2. 搜索可用航班——根据用户需求查询航班数据库
  3. 完成付款——调用支付接口扣款
  4. 确认预订——调用预订 API 锁定座位,向用户发送确认信息

每个节点内部可以使用 LLM(例如用自然语言理解用户的出行需求),但节点之间的流转顺序是代码固定的——系统不会在付款完成之前去预订座位,也不会在身份核实之前开始搜索航班。

工作流模式有两个核心优势。第一是严格的流程控制:开发者可以确保关键步骤不被跳过或乱序执行,例如“付款前不能预订”这类业务规则通过代码强制执行,不依赖 LLM 的判断。第二是安全性:由于执行路径是确定的,提示注入或模型犯错最多只能影响当前节点内部的处理,无法让 Agent 跳到不该执行的分支——攻击面被限制在单个节点内。

工作流的主要局限是缺乏变通性。当出现预设流程未覆盖的情况时(例如用户在付款环节临时想改签、或航班突然取消需要推荐替代方案),固定的节点路径无法灵活应对,只能走预设的异常处理分支或将控制权交还给人类。

自主 Agent:动态自主决策

当工作流的固定路径无法满足需求时,我们就需要自主 Agent(Autonomous Agent)。自主 Agent 与工作流的核心区别在于:执行路径不是预先定义的,而是 Agent 根据环境反馈实时决定的。

仍以订机票为例:自主 Agent 不需要预定义四个固定节点。用户说“帮我订下周三去上海的机票”,Agent 会自行决定先搜索航班、发现需要登录、于是先核实身份、再回来搜索、发现最便宜的航班需要转机、主动询问用户是否接受、用户说不要转机、Agent 调整搜索条件……

这意味着自主 Agent 需要具备自主规划的能力——自主决定执行步骤,还需要能识别失败、调整策略,而不只是在出错时停下来。但自主性不等于无限制——必须设计明确的停止条件(任务完成、达到最大迭代次数或遭遇不可恢复的错误),否则 Agent 容易陷入死循环或过度执行。

从实现角度看,自主 Agent 本质上就是在一个循环中使用工具的 LLM,通过持续获取环境反馈来推进任务——这正是前面介绍的 ReAct 循环。常见的退出条件包括:调用最终输出工具、模型返回没有任何工具调用的响应,或者遇到错误、达到最大轮次数。

图1-5 自主 Agent 的执行循环

自主 Agent 特别适用于开放式的问题——这类问题难以或不可能预测所需的步骤数量。典型的应用场景包括:Coding Agent 解决 SWE-bench(Software Engineering Benchmark,一个评估 Agent 自动修复真实 GitHub Issue 能力的基准测试)任务,“计算机使用”(Computer Use)Agent 像人类一样操作计算机界面,以及需要迭代搜索和分析的研究任务。

不过,自主性也带来了更高的成本和潜在的复合错误风险。因此在部署自主 Agent 时,必须在沙盒环境中进行充分的测试,设置适当的护栏和监控机制,并在关键决策点考虑加入人机协作的检查点。

两种模式的选择与混合

实践中,工作流和自主 Agent 并非非此即彼——很多系统会混合使用两种模式:关键的、有严格合规要求的流程用工作流来确保可靠性,需要灵活决策的部分切换到自主模式。例如,n8n 是一个成熟的工作流自动化开源框架,开发者通过可视化界面拖拽功能组件来构建 Agent,可以在同一个系统中同时使用工作流节点和自主 Agent 节点。

图1-6 n8n 工作流编辑器界面

主流 Agent 框架简要对比

下表梳理了当前主流的 Agent 框架/平台,帮助读者根据场景快速定位:

框架/平台 核心定位 编排模式 开发方式 适用场景
OpenAI Agents SDK 轻量级 Agent 开发库 自主(工具循环) 代码优先 快速原型、单 Agent 应用
Claude Agent SDK 生产级 Agent 开发框架 自主(工具循环 + 子 Agent) 代码优先 复杂自主任务、Coding Agent
LangChain / LangGraph 通用 LLM 应用框架 工作流 + 自主 代码优先 复杂链式思考、多步骤工作流
n8n 可视化工作流自动化 工作流 + 自主 低代码(可视化拖拽) 业务自动化、非技术团队
Dify LLM 应用开发平台 工作流 + 对话式 低代码(可视化 + API) 企业级 RAG、知识库应用
CrewAI 角色化多 Agent 编排 Multi-Agent 协作 代码优先 团队式任务分解与执行
OpenClaw 开源全能个人 Agent 自主 + 事件驱动 配置 + 代码(自托管) 个人助理、Deep Research、Computer Use、多平台消息集成

随着“模型即 Agent”趋势的深化,框架的核心价值已经不再局限于“编排 LLM 调用”——模型越来越能自主决策,但围绕模型构建的上下文管理、工具生态、安全约束和错误恢复等 Harness 工程反而变得更加重要。选择框架时,关键考量不在于框架本身的复杂度,而在于它能否以最小的抽象层让你专注于业务逻辑。

前面讨论的编排模式解决了 Harness 中上下文与工具的组织问题——如何把 LLM 调用、工具和数据流串联起来。但光能做事还不够,还需要确保做得对、做得安全。接下来讨论围绕上下文和工具构建的约束、验证与纠正机制在实践中最核心的落地手段:护栏。

护栏与安全性

本节对护栏做高层次的概览,帮助读者建立整体认知;具体的实现细节和实践方法将在第二章(提示注入防护)、第四章(工具权限控制)和第五章(代码执行安全)中分别展开,初次阅读时无需深究每个细节。

护栏是 Harness 中“约束、验证与纠正”层面的核心实现手段——它们构成了保障 Agent 行为安全可控的分层防线。精心设计的护栏(Guardrails)有助于管理数据隐私风险(例如防止系统提示泄露)或声誉风险(例如确保模型行为与品牌形象一致)。你可以先针对已识别的风险设置护栏,然后在发现新漏洞时逐步添加新的护栏。

可以将护栏理解为分层防御机制。单个护栏不太可能提供足够的保护,但将多个专门的护栏组合使用,就能构建出更有韧性的 Agent 系统。

护栏类型

按防护位置可以分为三类:输入侧、执行侧和输出侧。

输入侧护栏在请求到达 Agent 之前拦截,通常包含四种机制。相关性分类器标记偏离主题的查询,比如编程助手收到“帝国大厦有多高?”这类无关问题。安全分类器检测越狱(Jailbreak,即诱导模型绕过安全限制)和提示注入(Prompt Injection,即在输入中嵌入恶意指令),两者的关键区别在于:越狱是用户自己试图绕过模型的安全限制,提示注入则是攻击者通过外部数据(如网页内容、文档)间接操纵模型行为。内容审核标记有害或不当的输入,如暴力、歧视性内容。基于规则的保护则采用确定性措施,包括黑名单、输入长度限制、正则表达式过滤器,用以防范 SQL 注入等已知威胁。

执行侧护栏在工具调用时验证。其核心是工具风险评级:根据操作是否可逆、权限等级、财务影响,为每个工具标注风险等级(低/中/高),高风险操作需额外审查或人工确认。

输出侧护栏在响应返回用户之前检查。PII 过滤器审查输出中的个人身份信息(如身份证号、手机号),防止不必要暴露;输出验证则通过内容检查确保回复与品牌价值一致。

需要注意的是,某些机制(如基于规则的正则过滤)既可以用在输入侧也可以用在输出侧,上文按最常见的部署位置归类。

人工干预

人工干预(Human in the loop,又称人在回路)是一个关键的保护措施,它让 Agent 能够在不损害用户体验的情况下提升实际性能。这在部署早期尤为重要,有助于识别失败模式、发现边缘情况并建立健壮的评估周期。

实施人工干预机制,可以让 Agent 在无法完成任务时优雅地转移控制权。在客户服务中,这意味着将问题升级到人工客服;对于 Coding Agent,这意味着将控制权交还给开发者。

通常有两种主要情况会触发人工干预:

超过失败阈值 为 Agent 的重试次数或操作次数设置上限。如果 Agent 超过了这些限制(例如多次尝试后仍未能理解客户意图),就应该升级到人工干预。

高风险操作 涉及敏感、不可逆或高风险的操作时,应触发人工监督,至少在团队对 Agent 可靠性建立起足够信心之前是如此。典型的例子包括取消用户订单、授权大额退款或付款等。

回到 Harness 五要素的主线——下面我们看看本书各章节如何在这个框架下展开。

本书作为 Harness 工程的实践指南

从 Harness 工程的视角重新审视本书的结构,可以发现每一章都在系统性地构建 Harness 的某个组件。同时,安全不是某一章的独立话题,而是贯穿全书的横切关注点(Cross-cutting Concern,即一个影响系统多个部分的问题,类似于软件工程中日志记录需要渗透到每个模块中一样)。下表将 Harness 功能、安全层面和对应章节统一呈现:

Harness 重点 对应章节 核心内容 安全关注点
上下文设计 第二章(上下文工程) 提示工程、Agent 状态栏、上下文压缩、Agent Skills 提示注入与信息泄露
上下文扩展(知识持久化) 第三章(知识库) 用户记忆、RAG、结构化索引、智能体化 RAG 敏感信息暴露、隐私保护
工具设计与安全约束 第四章(工具设计) 工具分类、权限控制、MCP 标准、异步架构 误操作、未授权访问、不可逆操作
工具的验证与纠正 第五章(代码生成) Coding Agent 的 Harness、测试驱动、代码化规则 身份冒用、责任归属
系统级验证 第六章(评估) 评估环境、数据集、自动化评估、可观测性
模型层面的纠正 第七章(后训练) SFT(监督微调)、强化学习——将 Harness 中积累的反馈信号写入模型参数,可看作 Harness 工程的延伸 目标偏离、对齐与鲁棒性
系统层面的纠正 第八章(自我进化) 外部化学习、工具创造、经验积累
多模态上下文与工具 第九章(多模态与实时交互) 语音 Agent、Computer Use、机器人操作 多模态输入的安全过滤、实时交互中的权限控制
多 Agent 间的约束与纠正 第十章(多 Agent 协作) 协作架构、失败模式、Agent 社会 Agent 间信任越界、共享资源冲突

Anthropic 在构建长时运行 Agent 时的实践展示了 Harness 设计如何解决模型本身无法解决的问题。他们将复杂任务分解为“初始化 Agent”(设置环境、分解任务列表)和“执行 Agent”(在每个会话中增量推进并留下清晰的交接制品),通过结构化的 Harness 解决了 Agent 在长任务中“上下文耗尽”和“过早声明完成”的问题。后续章节将逐一深入 Harness 的各个组件——第二章从最核心的上下文工程开始,第五章将专门展开 Harness 工程在 Coding Agent 中的完整实践。

本章小结

本章从实践出发,建立了理解和构建 AI Agent 的基础框架。

Agent = 大脑 + 眼睛 + 手脚:LLM 是大脑(决策核心),上下文是眼睛(决定它能看到什么),工具是手脚(决定它能做什么)。三者缺一不可。

眼睛(上下文)是决定性的因素:上下文由静态前缀(系统提示词 + 工具定义)和动态轨迹(消息历史)构成。消融实验表明,去掉任何一个组件都会导致系统显著退化。ReAct 循环的本质是通过不断追加轨迹来让模型持续推进任务。

Harness 是竞争力所在:模型能力正在商品化,真正的差异在于 Harness——围绕上下文和工具构建的约束、验证与纠正机制,确保 Agent “可靠地做事”。在生产级的 Agent 系统中,Harness 的绝大部分代码都在做这些保障机制,而不仅仅是上下文和工具本身。

从工作流到自主 Agent:先优化提示词,再考虑工作流,最后才引入自主 Agent——这是降低意外风险最实用的顺序。每种编排模式都有其适用场景,不存在通用最优解。

安全是架构问题:护栏、人工干预、对齐(alignment,即让模型的行为与人类意图保持一致)——安全问题从第一行代码就要考虑,而不是上线前打补丁。安全问题贯穿模型、上下文、工具、协作和社会五个层面。

下一章将深入探讨 Harness 中最核心的组件——上下文工程。关于 Agent 概念在强化学习中的学术渊源,以及传统 RL 与现代 LLM Agent 的深入对比,我们将在第七章系统展开。

以下思考题旨在帮助读者对本章核心概念进行更深入的探讨。

思考题

  1. ★★ 如果你只能给一个 Agent 系统增加一项能力——更强的模型、更丰富的上下文、还是更多的工具——你会选哪个?在什么条件下你的选择会改变?
  2. ★★★ ReAct 循环中,Agent 的每一次 LLM 调用都会看到完整的历史轨迹。随着轨迹增长,这种设计的成本是二次方增长的。有没有办法在不丢失关键信息的前提下打破这个二次方?
  3. ★★ “模型即 Agent” 范式意味着模型在工具调用决策上越来越自主。但本章论证了 Harness 工程的重要性反而在增加。这两个趋势如何共存?Agent 框架未来的核心价值体现在哪些方面?
  4. ★★ 消融实验中 “工具结果反馈” 的缺失导致 Agent 陷入无限循环。在生产环境中,除了工具结果缺失,还有哪些情况可能导致 Agent 无限循环?你会设计怎样的检测和终止机制?
  5. ★ 本章用感知、行动、策略三个维度分析了五个 Agent 产品。请选择一个你日常使用的 AI 产品,用这三个维度进行分析,并思考它的架构设计是否合理。如果由你来设计这个 AI 产品,有哪些改进空间?
  6. ★★ 如果你要设计一个专门处理航班订票的客服系统,你会选择工作流模式还是自主 Agent 模式?有没有可能在同一个系统中混合使用两种模式?
  7. ★★★ 护栏部分提到了工具风险评级。如果一个工具在大多数情况下是低风险的,但在特定参数组合下变为高风险(如 delete_file 删除普通文件 vs 删除系统文件),你会如何设计动态风险评估?
  8. ★★ 本章的 Agent 产品表格中,所有 Agent 的动作空间都是 “开放式” 的。一个受限的动作空间(比如只能从预定义选项中选择)在什么场景下反而优于开放式?
  9. ★★ 人工干预机制要求 Agent 能 “优雅地移交控制”。但在实践中,用户可能不在线、响应很慢、或者给出模糊的指令。此时 Agent 应该怎么办?
  10. ★★★ 引言指出 “好的设计原则应该穿越模型的迭代周期”。试举一个你认为可能会随模型进步而过时的当前 Agent 设计原则,并说明理由。