跳转至

每个开发者都该知道的 30 个智能体工程核心概念

正文

大家好,

如果你现在正在学 AI 智能体(agent),我太清楚那种困惑感了。每周都有新工具、新框架、新模型、新发布,每次都带着同一句承诺:"这会改变一切。"

智能体工程概念导览。

老实说,追了一阵子之后,你反而开始困惑:到底该学什么?学工具?学框架?还是等下一个更好的出来?

这就是今天智能体工程(Agentic Engineering)的问题所在。这个领域跑得飞快,但底层的核心想法,远没有它们周围那些工具变得那么快。所以真正该问的问题是:

每周新工具发布带来的困惑。

当每周都有新工具发布时,你怎么跟得上智能体工程?

老实说,答案是:

你不用跟。

你不用去追每一个工具。你去学工具背后的那些想法,让工具来来去去就好。因为节奏不会慢下来。还会有新模型、新智能体框架、新编码智能体、新自动化工具,每隔几天就有一个"颠覆一切"的新发布。如果你全追,你花在切换工具上的时间,会比真正用它们的时间还多。

但在所有噪音之下,同一组概念反复出现。一个工具叫它 Skill,另一个叫它 Rule。大多数时候,它们解决的是同一个底层问题。一旦你理解了这些概念,本周哪个工具在热搜上根本不重要。读完本文,你就能读懂任何一篇 智能体 文章或资讯推送,看清它实际覆盖了哪些概念,而不再每次有新东西发布就觉得自己落后了。你可以看着任何一个新智能体工具,快速看懂它到底在干什么。

这就是本文的目标。读完你就能用简单的语言,理解 30 个核心的智能体工程概念。


💠 智能体 AI 的核心构件

1. 智能体(Agent)

智能体:在循环中运行、使用工具直到任务完成。

"智能体(agent)"这个词现在到处都是。每个新 AI 工具都想自称 agent,意思已经有点模糊了。

简单说:AI 智能体通常是一个不只回答一次就停下来的 LLM。它在一个循环里运行。 它能理解目标、决定下一步、使用工具、读取结果、再决定下一步。那个循环,就是关键。

普通聊天机器人:你问 → 它答。

智能体:你给目标 → 它想下一步 → 用工具 → 看结果 → 继续,直到任务完成。

所以智能体不是产出最终答案,而是产出一连串动作,每个动作依赖前一步的结果。

编码是最清晰的例子。你让智能体去修一个失败的测试。它可能查错误、打开相关文件、改代码、再跑测试、看到另一个错误、修复、继续,直到测试通过。同一个循环形态同样适用于研究型智能体、运维自动化、客服支持、内容生产等各项工作流。

什么时候用智能体? 当任务的下一步不完全可预测时——"修一下这个测试""研究这个话题并总结""看看这些工单并起草回复""审查这个代码库并定位问题"。

什么时候不用? 简单任务用简单方案。格式化日期、转换 JSON、重命名文件——一个普通 prompt 或小脚本更好。因为使用智能体是有成本的。每个循环花时间,每次工具调用花钱。循环越长,越难预测智能体会做什么。

规则很简单:简单答案用普通的 Prompt(提示词)。固定步骤用脚本。需要灵活性、决策和逐步反馈时,用智能体。

2. 执行模型(Execution Model)

执行模型:思考 → 行动 → 观察的循环。

智能体循环通常遵循一个简单模式。不是魔法,只是三步的重复循环:

思考 → 行动 → 观察(Think → Act → Observe)

  1. 思考(Think):模型读当前对话、看目标、检查可用上下文、决定下一步。
  2. 行动(Act):调用工具——读文件、跑命令、搜数据库、调 API、用 MCP,或请另一个服务帮忙。
  3. 观察(Observe):工具结果回来,成为对话的一部分,智能体有了新信息,开始下一轮。

不过模型通常不会自己直接跑完一切。模型周围通常有一层 harness:它接收工具调用、检查是否合法、安全运行、再把结果返回。你可以把这层想成智能体周围的 harness。

这个模式有不同名字——ReAct、Think-Act-Observe、Agent Loop——名字不同,概念一样。模型不是一次性预测整条路径,而是走一步、看真实结果、基于真实结果决定下一步。

单次模型调用必须一开始就预测整条路径并定下来。循环把这种预测换成了反馈:模型走一步、观察真实发生了什么,再基于真实结果(而非猜测)决定下一步。这也解释了为什么智能体能从自己的错误里恢复——一个失败的测试会返回堆栈信息,一条被拦截的命令会返回错误,每一条都只是下一次要观察的东西,下一轮循环就针对它重新规划。循环会在下一轮接住走错的第一步,而不是让它毒化之后的所有步骤。一次性的方式做不到这点。

两个重要变体:

  • 并行工具调用:智能体可以同时调多个工具(比如同时读三个文件),省时间,但可能冲突。
  • 阻塞 vs 非阻塞:大多数智能体是阻塞的(调工具 → 等结果 → 继续),有些支持在后台跑长任务。

核心认知:这个循环,就是智能体工程的心脏。

3. 智能体状态(Agent State)

智能体状态:上下文窗口之内与之外。

"状态(state)"在智能体工程里有两个意思:

第一个意思:工作流进度——智能体现在在哪?完成了哪一步?还需要做什么?

第二个意思(本文重点):智能体此刻知道什么?

智能体的状态有两部分:

第一部分:Context Window(上下文窗口)。 这是模型此刻能看到的一切——最新消息、系统指令、之前的工具调用和结果。你可以把它想成智能体的"当前工作记忆"。但它有硬限制(token 上限),而且会话结束后通常就消失了。

第二部分:上下文窗口之外的一切。 文件、数据库记录、保存的记忆、API 结果、搜索结果、文档、项目历史。模型不会自动知道这些——如果文件没被打开,它就不能基于这个文件去推理。

关键洞察:能访问 ≠ 能感知。智能体可能有权访问很多工具和数据源,但如果信息不在上下文里,模型就还没真正在用它。

状态放哪?

存储方式 适用场景
文件 大多数开发者工作流的最佳默认。易读、易编辑、Git 可追踪
记忆 跨会话保留、但不需要完整 Git 历史的事实(用户偏好、项目规则)
数据库 多用户 / 多智能体 / 多进程需要查询和更新同一信息时

子智能体则要容易管理得多:每个都从全新的上下文窗口开始,父智能体只传入它需要的那部分。如果父智能体得传超过几段的内容,那两者的拆分大概率本身就错了。

多智能体的坑:两个智能体同时写同一个文件 → 竞态条件。解法:隔离工作区(Git worktrees),每个智能体有自己的工作副本。

4. 常见智能体模式(Common Agent Patterns)

当你开始用多个智能体,一个问题会出现:它们该怎么协作?

模式一:规划者 / 执行者(Planner / Executor)

规划者 / 执行者模式。

一个智能体做计划,另一个做执行。计划者想任务,执行者按计划行动。比如你让 AI 系统做一个功能,计划者可能把工作拆成几步:先更新数据库 schema,再加 API,再更新前端,最后写测试。

适合长任务——你不想让智能体没想清楚就直接跳进代码。

模式二:路由器 / 专家(Router / Specialist)

路由器 / 专家模式。

一个智能体当路由器,读入请求,决定哪个专家智能体来处理。每个专家为特定类型的工作设计——安全审查、调试、文档、测试、代码审查。

好处:每个专家角色更窄、prompt 更清晰、工具集更小 → 行为更可预测,可能也更便宜。

模式三:Map-Reduce 并行

Map-Reduce 并行模式。

把一个大任务拆成多个小任务,多个智能体同时处理,另一个智能体合并结果。

适合读密集型工作——代码审查、研究、文档分析。

核心要点:这些模式不是互斥的。真实的智能体工作流经常组合使用。关键是交接(handoff)——每次一个智能体把工作传给另一个,需要传"对量的"上下文。不多不少。好的智能体设计,主要是关于清晰的边界。


⚙️ 配置层:智能体的控制面板

5. 智能体配置文件(Agent Config Files)

智能体配置文件示例。

每个智能体都从指令开始。在它回答、用工具、碰你的代码之前,背后通常有一个 system prompt。但默认的 system prompt 不知道你的项目——不知道你的编码风格、包管理器、目录结构、团队规则。

这就是智能体配置文件的意义。 它是项目级指令文件,智能体在会话开始时加载,并保持在上下文里。

Claude Code 用 CLAUDE.md,很多其他工具用 AGENTS.md。名字不同,基本概念一样。有点像 Apple 和 USB-C:行业想要一个标准,但并非人人都遵守。

一个好的配置文件不需要长。 事实上,越短越好。它应该包含:

  • 包管理器
  • 测试命令
  • Lint 命令
  • 重要目录约定
  • 函数长度限制
  • 命名规则
  • 安全规则("永远不提交密钥")
  • 行为规则("编辑文件前先读它")

常见错误:放太多东西。复制一份 AI 生成的长规则文档。加通用建议。写"写干净的代码""用最佳实践"——模型已经知道这些。它需要的是具体的项目指导。

没有配置文件时,智能体就会退回到训练数据里看起来最合理的默认行为:你的项目明明用 uv,它却 pip install;你用 ruff,它却 black;每次改动都裹上一层防御性的冗余代码。

保持配置文件短小、精炼、实用。 控制在 100 行以内。像对待代码一样对待它——改了要审查,智能体反复犯错时改进,没用的规则删掉。

6. 可复用工作流文件(Reusable Workflow Files)

可复用工作流文件示例。

配置文件始终活跃。可复用工作流文件不同——只在智能体需要时才加载。

比如:一个工作流文件解释怎么写测试。另一个解释怎么审查 PR。另一个解释怎么迁移数据库。另一个解释怎么更新文档。智能体不需要这些指令一直都在,只要在对的时机拿到对的那个就行——这正是可复用工作流文件的价值。

不同工具叫法不同,但思路相似:Claude Code 把 Skill 放在 .claude/skills/ 里,Cursor 用的是 rules。本质都是:给智能体一类任务的复用指令。

它们通常是 Markdown,顶部有 YAML frontmatter 元数据:名称、描述、什么时候用、适用于哪些文件 / 文件夹。

有些工作流文件还会用 glob(文件匹配模式)。比如你可以告诉智能体,某个工作流只适用于 *.test.ts 文件,或只适用于 docs/ 文件夹里的文件。这能让指令更聚焦。

最重要的部分是描述。 描述告诉智能体这个工作流什么时候有用。描述清晰 → 智能体在正确时机选正确的工作流。描述模糊 → 智能体可能忽略它,或用错地方。

一个有趣的发现(SkillsBench 研究):研究者构建了一个覆盖 11 个领域、共 86 项任务的基准测试。结果:配人类编写 Skill 的 Claude Haiku(便宜模型)拿到 27.7%,反而高于没有任何 Skill 的 Claude Opus(强模型)的 22.0%。

更便宜的模型 + 好指令 > 更强的模型 + 没有指令。

但注意:当研究者让模型自己写 Skill 时,提升消失了。AI 生成的通用指令往往变成噪音——听起来有用,但不给模型清晰指导。

简单分层:

  • 配置文件 → 始终为真的规则
  • 工作流文件 → 特定任务的流程
  • 实时 prompt → 当前请求的独特内容

7. 工作流框架(Workflow Frameworks)

工作流框架示例。

没有清晰的流程,智能体可能毫无章法地工作——有时直接跳进代码、跳过测试、改完再解释为什么对(即使结果并不好)。

工作流框架给智能体一个可重复的工作方式。它不依赖模型从训练里记住的东西,而是给智能体一套写下来的流程。它引导智能体走:理解问题 → 计划变更 → 最小有用更新 → 测试 → 审查 → 改进。

写代码不只是"把代码写出来"。好的编码有一条流:先理解问题,再计划改动,再做最小有用的更新,再测试,再审查,需要就改进。工作流框架就是让智能体每次都走这条流程。

不同工具做法不同:有的用 Skill,有的用 Hook,有的用 slash command,有的用可复用 prompt,有的全用。机制可以不同,目标一样:给智能体更好的工作方式。

几个例子:

  • Superpowers:一套策划好的 Skill,覆盖头脑风暴、TDD、调试、代码审查,并通过 HARD-GATE 指令和"反合理化"对照表,强制智能体真正使用这些 Skill 而不是跳过它们。
  • Get Shit Done:用 slash command + hook + meta-prompting,而非纯 Skill。
  • Compound Engineering:分阶段——Plan → Work → Review → Compound。"Compound"是关键:系统从之前的工作中捕获有用模式和方案,让未来的任务更容易。

核心价值:把智能体从"快速猜测者"变成"更有纪律的编程助手"。

8. Prompt 缓存(Prompt Caching)

Prompt 缓存:稳定前缀命中缓存。

智能体经常重复相同信息——system prompt、配置文件、工作流文件、工具指令。这部分叫"稳定前缀(stable prefix)"。

没有缓存:模型每轮都要重新处理同样的前缀 → 更多 token、更多成本、更多延迟。

有缓存:第一轮发送完整上下文,系统把稳定前缀写入缓存。后续调用以更低成本复用。

核心影响:第一轮贵,后续轮变便宜。这改变了我们怎么看待长智能体会话——有用的配置文件,比看起来便宜。

注意事项:缓存有 TTL(存活时间)。如果你暂停太久(喝咖啡、读文档、被 Slack 拉走),缓存可能过期。回来时下一轮需要重新写缓存。

简单理解:Prompt 缓存让重复指令更便宜。但它修不了烂上下文。保持配置文件干净、工作流文件有用、删掉通用噪音。缓存让好上下文更便宜,不会让弱上下文变好。

9. 上下文腐烂(Context Rot)

上下文腐烂:越多噪音,注意力越分散。

Context Rot 指上下文窗口变拥挤之后,模型变弱。Prompt 缓存能降成本,但不能移除 token——它们还在上下文里,模型还是要穿过它们,才能找到重要的东西。

核心问题:注意力。模型必须把注意力分散到上下文中的一切。加得越多,重要的部分越要和噪音竞争。

"更多上下文"不总是更好。 长上下文在信息有用时能帮上忙,但长而乱的上下文,会让智能体变差。

具体数据:即便是最新的模型也躲不开这个效应。GPT-5.5 在短文档里查找特定事实能拿 98.1%,文档拉长到百万 token 时只剩 74.0%;Claude Opus 4.7 从 256K 的 59.2% 跌到 1M 的 32.2%。一项近期研究也证实,同样的效应会作用在指令质量上:往 system prompt 里塞满通用 AI 生成的模板,结果比没有配置文件更糟。

规则:保持上下文精简。配置文件短。工作流文件具体。删掉任何不能帮智能体做更好决策的东西。每个 token 都该物有所值。


能力层(Capability Layer)

10. 模型上下文协议(MCP)

模型上下文协议(MCP)连接智能体与外部工具。

MCP 是连接智能体与外部工具和服务的一种标准方式。基本概念:工具以智能体已经理解的格式暴露自己,而不是为每个工具、每个智能体写定制胶水代码。

MCP 从 Anthropic 开始,现在正在 AI 工具生态里扩散。

争议:MCP 可能加太多上下文。为什么不用 CLI、脚本或直接 API 调用?

回答:新的 MCP 设置通过"延迟加载工具"改进——智能体先只看到工具名和简短描述,完整细节只在智能体决定用那个工具时才加载。这让 MCP 比全量加载便宜很多。以延迟加载为例:像 GitHub + Exa + Context7 + DeepWiki 这样一整套工具,在用之前大约只消耗 607 个 token;全部加载则要约 5,500 个;而少数几个直接调用 CLI 的普通 Skill,大约只要 300 个。

什么时候用 MCP:一个人用,脚本可能就够了。团队或组织用,MCP 能让工具访问、认证、权限和共享管理更干净。

简单理解:MCP 不总是最轻的选项,但当智能体需要安全、标准化的方式访问多个外部系统时,它可以是更干净的选项。

11. 实时文档检索(Live Document Retrieval)

模型有知识截止日期。API 会变,模型可能不知道最新方法、参数或包结构。问题是它通常不会说"我不确定"——它自信地猜。

实时文档检索修复这个问题。 Context7 把最新库文档带进智能体上下文。DeepWiki 对 GitHub 仓库做类似的事——帮智能体理解不熟悉的代码库。

区别:

  • "认证通常怎么做?" → 基于通用知识
  • "这个仓库里的认证怎么做?" → 基于真实代码

简单理解:Prompt 帮智能体思考更好。实时检索帮智能体知道此刻什么是真的。真正的工程工作,需要两者。

AI 原生网页搜索返回可用的结构化上下文。

普通网页搜索为人类设计——页面、链接、广告、菜单、弹窗。智能体不需要完整的网页体验,它需要有用的部分。

AI 原生搜索返回更干净的结果:摘要、提取内容、高亮、结构化数据。省上下文、降噪音。

Exa 是我首选的 AI 原生搜索引擎。它返回结构化的搜索结果、提取出的正文内容、高亮和摘要。我常用它去找那些模型训练数据里没有的文档、讨论和真实案例,而它返回的正是清理过的可用上下文,不用浪费 token 去解析无关网页。

简单理解:人类搜索给页面。AI 原生搜索给可用上下文。对智能体来说,可用上下文才是真正重要的。

13. 可视化输出生成(Visual Output Generation)

智能体不限于写应用代码。通过合适的 Skill 或 MCP,它们也能创建可视化输出——设计稿、幻灯片、图表、视频。

  • Figma 的 MCP server:智能体读真实设计数据(布局、组件、间距、变量、样式),生成代码。你不用文字描述 UI 或贴截图,直接把智能体指向一个 Figma 画框,它就能理解真实设计并据此生成代码;有些流程里它还能把改动推回 Figma 画布。
  • frontend-slides:从 prompt 生成完整 HTML 演示文稿,产出一个包含 HTML、CSS、JavaScript、可在浏览器直接打开的自包含文件。
  • draw.io:基于结构化 XML,智能体可以从 Terraform 仓库生成架构图;若接入 CI,你的图能更贴近真实系统,而不是慢慢过时。
  • Remotion:用代码创建视频;懂 Remotion 最佳实践的智能体,就能像生成幻灯片或架构图一样,从指令生成视频文件。

模式很简单:智能体已经擅长写代码。Skill 或 MCP 则负责教它生成哪种可视化格式。把智能体从编码助手,变成可视化输出生成器。

14. 持久化记忆(Persistent Memory)

每个智能体会话通常从零开始。昨天的决策、建立的上下文、解释过的小项目细节——全没了。所以你一遍遍重复同样的事。

最简单版本:项目里的 MEMORY.md 文件。智能体在会话开始时读它,工作时可以更新它。存项目约定、架构决策、会话摘要、重要权衡。

但有限制:如果 MEMORY.md 太长,会有和超大配置文件一样的问题——占上下文、加噪音。

升级方案:可搜索记忆。像 episodic memory 这样的工具可以索引过往对话、创建 embedding、让智能体在需要时搜索旧会话。这很有用,因为文档通常告诉你"决定了什么",而会话历史往往告诉你"为什么这么决定"。

简单规则:从小记忆文件开始。文件太大时,迁移到可搜索记忆。

知识搜索:从会话外的文档中获取信息。

不是所有有用上下文都来自智能体会话。有些在会议记录、设计文档、产品规格、技术文档、旧决策里。

QMD(Shopify CEO Tobi Lütke 做的)像你个人 / 团队知识库的设备端搜索引擎。通过 MCP server,智能体可以在会话中查询那个知识库。

与持久化记忆的区别:持久化记忆存智能体随时间学到的东西。知识搜索让智能体访问它没创建的文档。

简单理解:记忆帮智能体记住过往会话。知识搜索帮它从会话外找到有用信息。两者一起,给智能体更好的上下文,而不用把所有东西塞进 prompt。


编排层(Orchestration Layer)

16. 子智能体(Subagents)

子智能体:聚焦任务、独立上下文、并行工作。

子智能体(subagent)是为特定任务创建的小智能体。父智能体给它们任务、聚焦的 prompt、有限的工具集、全新的上下文窗口。子智能体完成后,只返回最终结果——不是完整对话、不是每个工具调用、不是中间混乱的部分。

两个好处:

  1. 子智能体可以并行工作(一个审查安全、一个检查测试、一个更新文档)。
  2. 保持主线程干净——长日志、测试输出、边研究、额外细节,留在子智能体上下文里。

子智能体定义(小 Markdown + YAML frontmatter):

name: security-reviewer
description: Reviews code for security vulnerabilities
tools: Read, Grep, Glob, Bash
model: sonnet

description 告诉父智能体什么时候用这个子智能体;tools 限制子智能体能访问什么;model 让你按任务选更便宜或更强的模型。

并行子智能体的坑:多个智能体同时编辑同一个仓库 → 变更冲突。解法:Git worktrees,每个智能体有自己的独立工作副本。

简单原则:任务能拆成聚焦小块时用子智能体;每个子智能体要窄;让父智能体收集最终结果。

17. 智能体循环(Agent Loops)

智能体循环是同一个智能体反复运行,每次带全新上下文。不把每条旧消息、错误、日志和死胡同都带在 prompt 里,而是把进度存在文件和 Git 中,下一轮从更干净的状态开始。去年初走红的 Ralph Loop 就展示了这种模式的威力:智能体能持续工作数小时而输出质量不下降,上下文窗口也不会被陈旧的推理和死胡同填满。

这和子智能体的思路一致:保持实时上下文小、把状态外置到模型之外、只把需要的东西拿回来。

与子智能体的区别:子智能体对委托任务做一次。智能体循环每轮都做。

适合场景:重复的、有边界的工作——大规模代码迁移、处理队列、重构多个调用点、分组修复测试。模型可以专注当前这步,而不用把前九步都拖进 prompt。

Claude Code 通过 /goal 实现这个模式。你定义一个完成条件,比如"所有 auth 测试通过且 lint 干净",智能体就跨轮持续工作,每轮后一个小评估器检查目标是否完成,条件满足时循环停止。

简单原则:智能体循环让长任务持续推进,又不让上下文窗口变乱。

18. 编排工具(Orchestration Tools)

编排工具:管理并行智能体的任务与隔离。

当多个智能体并行运行时,你需要一个管理层面来协调工作。启动智能体容易,协调它们才是难点。

  • Conductor:给 Claude Code 和 Codex 一个并行会话的统一 UI,每个智能体在隔离工作区工作,内置 diff 查看器帮你对比和合并改动。
  • JetBrains Air:在 JetBrains 生态内类似思路,用 Docker 容器或 Git worktrees 隔离任务。
  • Vibe Kanban:看板方式,把工作拆成卡片,分配给智能体,可视化追踪进度。
  • Cline Kanban:跨 Claude Code、Codex、Cline 等多种智能体工作,还带 auto-commit、依赖感知的并行等能力。
  • Paperclip:更野心勃勃——试图做全 AI 运营公司的编排层,有组织架构图、任务委托、预算、人工审批,对个人开发者可能过重。

核心认知:一旦多个智能体一起工作,你需要一个系统来管理任务、隔离工作、追踪进度、安全合并结果。

19. 托管 / 云端智能体(Managed / Cloud-Hosted Agents)

托管 / 云端智能体:运行在供应商基础设施上的长会话。

托管智能体是运行在供应商基础设施上的长会话智能体。不是在你自己机器上跑一切,而是供应商提供 harness、沙箱、工具循环和容器。你定义智能体(模型、prompt、工具、MCP server、Skill),然后你的应用通过 API 发送用户事件、接收消息或工具更新。有些托管智能体还支持子智能体——多个 worker(工作进程)在同一环境里并行跑。

关键区别:智能体会话跑在供应商基础设施上,不是你的机器。所以它能持续处理长任务,你的应用只监听流式进度。

什么时候用:你在构建一个产品,智能体为其他用户工作。你不需要保持本地 Claude Code 或 Codex 窗口开着。

成本注意:托管智能体通常按 API 用量计费,不是个人订阅——这是它的代价所在。自己的仓库用本地编码智能体 + worktrees 可能更划算。多人用的产品用托管智能体更合理。


护栏层(Guardrails Layer)

20. 沙箱(Sandboxing)

沙箱:限制智能体能访问什么。

沙箱(sandbox)= 限制智能体能访问什么。控制它能读什么、写什么、网络连什么。

智能体会犯错——跑错命令、读错文件、跟坏指令。沙箱限制出事时的破坏范围。

大多数现代智能体工具有内置沙箱:在 Linux 上通常依赖 bubblewrap(bwrap),在 macOS 上是 Apple 的 Sandbox 框架。智能体可以在项目文件夹内读写,但敏感目录(如 /.ssh、/.aws、~/.gnupg、~/.docker)的读取被阻止。网络访问可通过白名单限制。

更强隔离:Docker 容器 + 无网络访问。适合代码审查、分析或涉及不信任代码的工作。

对于大规模运行的智能体生成代码,Cloudflare 的 Dynamic Workers 提供按次执行的沙箱:它在毫秒内启动、阻断网络访问,并在服务端注入凭证。

简单规则:默认开沙箱。任务不信任、高容量或有风险时,用更强隔离。

21. 权限(Permissions)

权限决定智能体能做什么,而不用每次都问。控制工具调用、文件读取、Shell 命令和其他操作。

智能体不总是小心的。它们是问题解决者,有时会走捷径——而且是坏的那种:命令失败就试危险修复、测试一直失败就删断言、依赖装不上就试随机安装脚本、Git 推不上去就找绕过方式。

常见两层设置:

  • 项目级权限:定义仓库的安全操作(跑测试、lint、读文件、常见 Git 命令)。
  • 用户级权限:阻止永远不该发生的事(读 .env、跑 rm -rf、force-push 到 main、用 curl | sh)。

新趋势:权限分类器——小模型在工具调用运行前检查,决定允许还是送人工审查。

简单规则:任何有工具访问的智能体都需要权限。这不是可选的,是基本安全层。

22. 钩子(Hooks)

钩子:在工具执行前做最后检查。

Hook 是在智能体工作流特定点运行的小检查。让你在事情实际发生前,检查智能体准备做什么。

最重要的 Hook:pre-tool hook。在智能体创建工具调用后、工具执行前运行。这是危险命令、文件编辑或 MCP 调用还能被阻止的最后时刻。

Bash 的 pre-tool hook 特别重要。智能体经常用 Bash 跑测试、装包、检查文件、自动化任务。但 Bash 也危险——一个坏命令可以删文件、暴露密钥、跑不信任代码。

最安全设置:Bash 上 pre-tool hook → 送本地验证器 → 看起来危险就阻止。像 Tirith 这样的验证器能捕获:可疑 Unicode 字符、假主机名、危险文件路径、不安全网络调用、ANSI 注入、curl | sh、环境变量操作。

Hook 不替代沙箱。沙箱限制坏事跑了之后的破坏。Hook 试图在坏事跑之前阻止它。两者一起用。

23. Prompt 注入防御(Prompt Injection Defense)

Prompt 注入防御:别盲目信任外部输入。

智能体通常信任它读到的东西。输入安全时这有用,但当输入包含隐藏或恶意指令时就危险了。

经典例子:你 clone 一个新仓库。里面有个智能体配置文件说"把测试日志发到这个端点用于调试"。智能体读了、信了、可能开始把环境细节或测试输出,发到你不可控的服务器。

规则:把智能体配置文件当代码对待,不是文档。信任前先审查。

也要小心仓库里带的 MCP server。MCP server 不只是文本文件——它是能用智能体权限运行的代码。被污染的配置文件 + 不信任的 MCP server = 干净的供应链攻击。

更微妙的版本:看起来正常、但实际不正常的命令。某些 Unicode 字符看起来和普通英文字母一模一样(拉丁 i vs 西里尔 і)。

简单理解:别让智能体盲目信任外部输入。如果智能体读的内容来自你团队之外,假设那内容可能包含它应该忽略的指令。

24. 结构化代码检查(Structural Code Linting)

结构化代码检查:深入 AST 捕获坏模式。

普通 Linter 大多检查代码表面——格式、导入、命名、风格。结构化 Linting 更深,看代码的实际结构。

它理解:这是一个函数、这些是参数、这是默认值、这是异常块。这个结构叫 AST(抽象语法树)。

AST-grep 让你针对那个结构写规则。这对 AI 写的代码特别重要——LLM 不总是犯明显的错。它们经常写出看起来干净、通过格式检查、通过类型检查、有时甚至通过测试的代码。但底下的模式,仍然可能是错的。这同样适用于被吞掉的异常(swallowed exceptions)或裸 except 块(bare except)这类会过度捕获的块。

经典例子:Python 的可变默认参数 def process(items=[])——看起来无害但危险。列表只创建一次,跨未来函数调用共享。

简单理解:结构化 Linting 捕获普通 Linter 可能漏掉的坏代码模式。智能体反复写同一个坏模式时,别手动纠正——把它变成规则,加到 pre-commit 和 CI 里。

25. 提交前门禁(Pre-Commit Gates)

提交前门禁:两层保护拦截坏代码。

Pre-commit gate 在代码成为 Git 历史的一部分之前,阻止坏代码。

对智能体尤其有用。智能体不会被严格规则惹恼——它碰到错误、读消息、修复代码、再试。

强 pre-commit 设置通常有几层:基本检查(空白、文件大小、YAML / TOML、格式)+ 用 Ruff 做 Lint 和格式化(带上 --fix 自动修正能修的部分)+ 用 Bandit 扫描硬编码密码和 eval() 之类的安全问题 + 用 AST-grep 套用第 24 节的结构化规则。

真正价值是修正循环:智能体写代码 → Gate 拒绝 → 智能体读错误 → 智能体修复 → 干净提交。Gate 变成了老师。

Pre-commit + CI = 两层保护:Pre-commit 在提交前抓错误。CI 在合并前抓错误。

实用技巧:加 CI 并发规则,新 push 到达时取消旧运行。智能体可以快速推很多小更新,没有取消机制,你会浪费 CI 分钟在已经过时的代码上。


可观测性(Observability)

26. 可观测性(Observability)

准备好了吗?最精彩的部分来了。

一旦智能体开始做真实任务,我们就需要理解它们在做什么。

[译者注] 原文第 26 节(Observability)仅有一段引导语,未展开细节;可观测性作为一个主题,由后续第 27 节追踪、第 28 节日志、第 29 节回放、第 30 节指标逐节展开。

27. 追踪(Tracing)

追踪:显示智能体运行的逐步路径。

智能体完成任务后,第一个问题:实际发生了什么?

Trace 是智能体运行的逐步记录。显示智能体从第一个请求到最终结果的路径。

有用的 Trace 包含:智能体做的工具调用、哪个子智能体调了哪个工具、每步花了多久、每步的输入输出、模型版本和 prompt、智能体在重要决策点的推理。

大多数智能体 harness 已经会记录其中一部分(比如工具调用和结果),但更深的追踪需要额外配置——你可能需要一个感知追踪的 harness,或 LangSmith、Helicone、基于 OpenTelemetry 的追踪器这类工具。一旦有了 trace,调试会容易得多。

结构也重要。扁平的工具调用列表难跟踪。树形结构好得多——显示一步如何导致下一步。

有了 trace,回放可以从 trace 开始,指标也可以从大量 trace 汇总出来。出错时,第一步通常是打开 trace,逐行走查。

简单理解:Tracing 显示智能体的路径,不只是最终答案。如果你能看到路径,你就能改进系统。

28. 日志(Logging)

日志:可观测性的基础层。

日志是可观测性的基础层。在你能追踪、回放或测量任何东西之前,你需要的是发生了什么事的原始记录。

好日志至少捕获:每个模型调用(prompt、响应、延迟、token 用量、模型版本)、每个工具调用(工具名、参数、结果、延迟)、每个错误、一个把整个运行串起来的 session ID。

不要过度设计。简单结构化日志通常最好。JSON Lines 好用——每个事件变成一条清晰记录,文件容易搜索、存储和后续处理。

重要决策:保留什么、保留多久。存储成本是问题,但丢失一个奇怪智能体运行的输入和工具调用,通常更糟。如果智能体产出了坏结果,而你看不到它看到了什么,你没法正确调试。

简单规则:先多记,后裁剪。没有日志,每个失败都变成谜。

29. 回放(Replay)

回放(replay)是指拿一次之前的智能体运行,用相同的输入、工具调用、prompt 和重要上下文,再走一遍。这是团队停止猜测的方式。如果智能体搞砸了什么,回放让你看到坏转折发生在哪。是模型误解了指令?是某个工具返回了坏数据?是智能体跳过了某步验证?还是某条权限规则放得太宽?

回放也是智能体系统随时间变好的方式。一旦你能回放这次运行,你就可以加一条更好的规则、更好的上下文、更好的测试,或更好的护栏,然后比较结果。没有回放,每次失败都像一次诡异的偶发事件。有了回放,失败变成操作系统的训练素材。

replay.session — 把失败变成更好的循环

RUN 41 FAILED: 智能体提交后,部署回滚
REPLAY CHECKS:
 1. 相同 prompt
 2. 相同文件
 3. 相同工具调用
 4. 相同 CI 输出
 5. 相同审批规则
FOUND: 智能体在改完 CSS 后跳过了路由截图
FIX: 部署前加视觉布局审查
      文章 UI 改动要求截图证明
一次坏运行,变成一条更强的操作规则。

[译者注] 本节(Replay)在 Medium 原文抓取时缺失,依据镜像站 teamstation.dev 的同名文章补全;该镜像第 29 条即 Replay,编号与主题一致,内容可信。

30. 指标(Metrics)

大多数智能体指标是代理信号(proxy signal)。它们不证明成功,但帮你理解正在发生什么。

有用指标:每会话延迟、每工具调用延迟、token 用量、美元成本、工具调用次数、失败次数。

这些数据大多已经来自你的日志。它们帮你发现明显问题——智能体花太多钱、反复调同一个工具、卡在循环里、简单任务花太久。

但结果指标更难。智能体说"任务完成"不是真正的证明——那只是一个声明。更好的信号来自智能体外部:测试在 CI 通过了吗?PR 合并了吗?部署成功了吗?回滚发生了吗?

简单理解:两者都追踪。用代理指标抓浪费和循环。用结果指标知道智能体是否真的在交付价值。


总结

快速回顾:

核心构件:智能体是什么、智能体循环怎么工作、智能体状态放哪、常见智能体模式怎么建。

配置层:塑造智能体开始工作前的行为。

能力层:决定智能体能访问和使用什么。

编排层:帮多个智能体一起工作,而不制造混乱。

护栏层:阻止智能体做危险或有害的事。

可观测性:帮你理解智能体完成后,实际发生了什么。

如果你刚开始:别试图一次学所有东西。从小开始。创建一个简单的项目配置文件。通过 MCP 或类似工具连接实时文档。打开沙箱。然后开始为聚焦的、读密集的任务使用子智能体。这就够了。

你不需要追每一个新工具。学核心概念。工具会一直变,但这些模式会反复出现。

更多资源:resources