一、先把结论说透:自建 AI Agent,难点不在“接模型”,而在“管住系统”

很多人理解 AI Agent,容易停留在“让模型自己干活”这一步。可真正进入生产环境后,你会发现,模型只是大脑,真正决定系统能不能稳定运行的,是大脑外面那一整套“驾驭装置”。

一个能用的 Agent,需要知道任务目标;一个好用的 Agent,需要知道什么时候查资料、什么时候调用工具、什么时候停止;一个能进生产的 Agent,还要知道预算、权限、失败、日志、成本、输出结构和恢复策略。

这份资料最有价值的地方,是把前面大量分散的工程模式收束成一个可迁移的实战案例:用代码审查场景,把 16 个核心模式串成一条完整链路。它告诉我们:不要试图复刻某个成熟产品的所有细节,而要迁移它背后的工程思想。

换句话说,真正应该学的不是某个按钮、某个工具名、某个内部实现,而是“如何把 Agent 做成一个可控系统”。

二、为什么不是复刻产品,而是迁移模式

成熟的 AI 编码工具往往包含很多产品特定能力:终端界面、几十个内置工具、会话格式、订阅体系、权限交互、插件生态。这些细节很强,但并不一定适合你的业务。

你的 Agent 可能不是编码助手,它可能是安全扫描器、数据监控员、客服质检员、投研分析员、运维诊断员、合同审阅员。不同场景的外壳不同,但内核问题高度相似:输入从哪里来?上下文怎么装?工具怎么用?危险动作谁审批?失败后如何重试?结果如何被机器继续消费?

所以,自建 Agent 的正确路线不是“照着产品抄一遍”,而是把通用模式抽出来,再落到自己的场景里。

错误思路

正确思路

原因

复刻全部功能

迁移核心模式

功能会随产品变化,模式才能跨场景复用

只关注模型效果

关注工程控制面

模型会出错,工程层负责限制、恢复和记录

让模型直接执行

让模型提出请求,代码验证后执行

安全边界必须掌握在系统手里

输出一段自然语言

输出结构化报告

结构化结果才能进入后续自动化流程

三、项目定义:用代码审查 Agent 验证工程模式

资料选择了一个非常适合练手的场景:输入一份 Git diff,输出一份结构化代码审查报告。这个场景很典型,因为它天然覆盖了 Agent 构建的六个关键维度。

第一,它需要读取变更内容,所以一定会遇到上下文预算问题。第二,它需要搜索关联文件,所以一定会涉及工具编排。第三,它要判断 bug、安全风险和设计问题,所以需要稳定的提示词控制。第四,它只能审查,不能乱改,所以要有权限边界。第五,模型调用和工具调用都可能失败,所以要有重试和熔断。第六,审查结果要可追踪,所以要有日志、指标和报告结构。

这个 Agent 的输入、输出和约束可以概括为三句话:输入是一份 diff;输出是带文件、行号、严重级别、分类、修复建议的审查报告;执行过程只读、有预算、可追踪。

四、整体架构:一个 Agent 至少要有六层能力

一个常见误区是:Agent Loop 就是“模型回答一次,再根据结果调用工具”。这个理解太浅。真正的 Agent Loop 更像一个状态机:每一步都要经过预算、权限、工具、重试、日志的共同约束。

资料中的实现把代码审查 Agent 拆成六层:提示词架构、上下文管理、工具与搜索、安全与权限、韧性、可观测性。每一层都不是装饰,而是生产级系统必须有的能力。

层级

核心职责

对应问题

L1 提示词架构

定义规则、角色、输出格式、行为边界

模型到底应该怎么想、怎么答

L2 上下文管理

控制输入规模、截断策略、预算记账

有限窗口里装哪些信息

L3 工具与搜索

让模型提出工具请求,由系统验证执行

如何查更多信息而不失控

L4 安全与权限

失败关闭、白名单、调用上限、只读约束

模型会不会越权干危险事

L5 韧性

重试、熔断、降级、避免循环浪费

失败后怎么继续或停止

L6 可观测性

事件、指标、覆盖率、成本、报告

系统到底做了什么、效果如何

五、第一层:提示词架构 - 把提示词当成控制面,而不是文案

很多人写提示词,像写一段说明书:越长越好,越细越安心。但工程化的提示词不是一坨文本,而是分层控制面。

资料里的关键思想是:把稳定的规则和动态的信息分开。稳定的部分可以理解为“宪法层”:审查原则、严重级别定义、输出字段、行为约束。动态的部分可以理解为“运行时层”:当前 PR 标题、变更文件、语言特定规则、当前任务背景。

这种拆法有三个好处。第一,稳定规则更容易维护,不会因为每次任务变化而被污染。第二,未来接入缓存时,稳定部分更容易复用。第三,模型更容易区分“长期规则”和“当前任务信息”,减少指令混乱。

5.1 静态宪法层:让模型知道什么永远不变

宪法层解决的是“原则”问题。比如:优先发现正确性问题,其次关注安全风险,再关注性能和可维护性;输出必须包含文件、行号、严重级别、分类和建议;不要因为风格偏好制造噪音;不确定时降低严重级别。

这些内容一旦确定,就不应该在每次任务里随意变化。它们是 Agent 的长期行为边界。

5.2 动态运行时层:让模型知道当前要处理什么

运行时层解决的是“现场”问题。比如:本次 diff 涉及哪些文件,主要语言是什么,PR 标题是什么,当前是否是安全相关变更,是否需要关注接口兼容性。

动态信息应该靠后放,避免污染稳定前缀。这样做不仅清晰,也更符合缓存友好的设计思路。

5.3 结构化输出:不要让模型自由发挥

代码审查报告如果只是自然语言,后续就很难自动处理。结构化输出的价值在于:每条发现都能被机器读取、筛选、排序、计数、归档。

这也是“提示词即控制面”的关键:提示词不只是告诉模型“你是谁”,还要告诉它“输出必须是什么形状”。

六、第二层:上下文管理 - Token 预算就是 Agent 的内存管理

Agent 的上下文窗口不是无限仓库,而是一块昂贵、有限、容易被污染的工作内存。把所有内容都塞进去,看似信息完整,实际上会导致成本升高、延迟变长、注意力分散,甚至让重要信息被挤掉。

资料里的实现采用双层预算:总预算控制整次审查规模,单文件预算防止某个大文件吞掉全部空间。更重要的是,内容被截断时,不是静默丢弃,而是明确告诉模型:这里只展示了一部分,完整内容有多少。

6.1 为什么要显式告知截断

静默截断是上下文管理里最危险的坏习惯。模型不知道自己没看全,就可能基于局部内容做出过度自信的判断。

显式告知截断,本质是在保护模型的认知边界:你看到的是局部内容,不能假装自己看到了全部。

6.2 保守估算比精确估算更适合工程落地

Token 精确计算依赖具体分词器和模型版本。对于 Agent 系统来说,保守估算通常更实用:宁可少塞一点,也不要临界溢出。

工程系统追求的不是每次都把窗口塞满,而是稳定、可预测、可恢复。

七、第三层:工具与搜索 - 模型提出需求,系统负责执行

工具能力是 Agent 和普通聊天机器人的重要分界线。但工具越强,风险越大。资料中的设计非常关键:模型不能直接执行工具,它只能输出工具请求;真正执行之前,系统会检查工具类型、输入内容、权限范围和调用次数。

这就像公司里的审批流:员工可以提交需求,但不能绕过流程直接动生产系统。

7.1 bash 是强大的通用接口,但必须关进笼子

对模型来说,命令行是一种天然熟悉的工具接口。查文件、搜关键字、统计行数、看目录结构,都可以通过只读命令完成。

但命令行同时也很危险。真正安全的做法不是完全禁用,而是只允许读操作,阻止写操作、联网、删除、脚本执行、输出重定向和危险元字符。

7.2 Skill 是专项分析能力包

除了通用搜索,还可以为 Agent 准备专项分析能力,比如安全审计、性能审查、接口兼容性检查、语言习惯检查。

Skill 的价值在于复用专家经验:每次遇到类似问题,不必让模型从零思考,而是调用一套经过整理的专项判断框架。

八、第四层:安全与权限 - 渐进式自主,不是无限放权

很多人希望 Agent 越自主越好,但生产环境里,自主必须和安全绑定。越能干的 Agent,越需要清晰边界。

资料里的代码审查 Agent 是只读场景,所以安全策略非常明确:LLM 后端只处理文本;工具只允许白名单命令;危险命令显式禁止;输出重定向拦截;每个文件工具调用次数有限;工具执行有超时;输出结果有限长。

8.1 失败关闭:不确定就拒绝

安全系统最怕“猜测式放行”。失败关闭的原则是:如果无法判断是否安全,就默认拒绝。

这个原则会牺牲一点便利性,但能换来可控性。对 Agent 来说,可控性比“显得很聪明”更重要。

8.2 渐进式自主:从只看,到只读工具,再到生态调用

好的权限设计不是只有“允许”和“禁止”两个档位,而是逐步放权。第一阶段只让模型看 diff;第二阶段允许它请求只读工具;第三阶段才允许通过 MCP 变成其他 Agent 可以调用的能力。

这种分级设计能让系统随着信任度增加而扩展,而不是一开始就把所有权限打开。

九、第五层:韧性 - 没有上限的重试不是可靠,而是浪费

生产系统一定会失败。模型接口会限流,网络会波动,工具会超时,输出会格式错误。真正的韧性不是“永远不失败”,而是“失败后知道怎么处理”。

资料里的韧性设计包含三件事:有限重试、熔断器、局部能力降维。有限重试避免无限循环;熔断器避免连续失败继续烧钱;局部能力降维让系统在信息不完整时仍能给出有边界的结果。

9.1 有限重试:给失败一个窗口,也给成本一个上限

一次失败可能只是偶发问题,所以可以重试。但重试必须有上限,而且最好逐步拉开间隔。

没有上限的重试会把系统拖入死循环,尤其在 Agent 场景里,模型调用成本和工具调用成本都会被快速放大。

9.2 熔断器:连续失败就停下来

当连续多个文件都审查失败时,继续硬跑通常没有意义。熔断器的作用就是在系统进入异常模式时及时止损。

这不是放弃任务,而是保护系统:先停下来,记录失败原因,再让人或外层调度器决定下一步。

9.3 局部能力降维:做不到满分,也要做可解释的 60 分

当文件太大无法完整审查时,可以只审查截断部分,但必须写明限制。工具不可用时,可以退回纯 diff 审查。

这叫能力降维:不是假装一切正常,而是在能力范围内交付可解释结果。

十、第六层:可观测性 - 先观察再修复

很多 Agent 项目失败,不是因为模型差,而是因为系统出了问题没人知道。它到底审查了几个文件?跳过了哪些?工具调用失败几次?每个发现大概花了多少成本?哪里最慢?

如果这些问题答不上来,就谈不上优化。

10.1 事件日志:记录关键节点,而不是记录所有废话

可观测性不是把所有内容都打印出来。尤其在代码审查场景,日志里不应泄露代码细节、文件敏感路径或密钥信息。

更合理的方式是记录结构化事件:审查开始、文件审查完成、工具调用结果、审查结束、发现数量、预算使用、耗时和成本。

10.2 ReviewReport:让结果本身也成为指标

最终报告不只是给人看的文本,也应该包含机器可读的指标:审查文件数、跳过文件数、总 Token 使用、耗时、发现数量、严重级别分布。

这些指标会让你知道 Agent 是否真的有价值,而不是凭感觉判断。

十一、实战验证:让 Agent 审查自己的代码

一个系统是否可靠,不能只看设计图,必须拿真实任务验证。资料中最有代表性的做法,是让代码审查 Agent 去审查自己的实现。

这种自举测试非常有价值。因为 Agent 不仅要理解业务逻辑,还要识别自身工具层、安全层、解析层、预算层里的问题。

11.1 它能发现哪些类型的问题

在示例中,Agent 能发现多类问题:diff 解析边界情况、原子计数器溢出风险、JSON 解析脆弱性、大文件重复遍历带来的性能浪费。

更重要的是,它还能发现工具系统里的安全问题:如果命令通过 shell 解释器执行,即使开头命令在白名单里,也可能被元字符绕过。

11.2 自举测试的真正意义

自举不是炫技,而是验证闭环。Agent 发现问题,人类修复问题,Agent 再次验证修复。这就是一个可持续改进系统的雏形。

任何安全层都不是一次设计就万无一失,持续审查和复验才是长期防线。

十二、闭环升级:让其他 Agent 调用你的 Agent

一个 Agent 如果只能独立运行,价值是有限的。如果它能以标准协议暴露成工具,就能进入更大的 Agent 生态。

资料里的代码审查 Agent 可以切换成 MCP Server 模式,把“审查 diff”暴露成外部工具。这样,另一个编码 Agent 可以在修复前先调用它审查,拿到结构化 findings,再逐项处理。

这一步非常关键。它意味着你构建的不是一次性脚本,而是可被组合、可被调用、可被纳入工作流的能力模块。

未来的 Agent 系统很可能不是一个超级助手解决一切,而是一组专职 Agent 通过标准协议协作:审查、测试、修复、发布、监控、回滚,各司其职。

十三、模式组合:真正困难的是处理模式之间的张力

单独理解某个模式并不难,难的是组合使用。比如“为一切设定预算”和“编辑前先读取”之间就有张力:完整读取更安全,但完整读取可能超过预算。

又比如“缓存感知设计”和“动态上下文注入”也有张力:动态内容太靠前,会破坏稳定前缀;动态内容太靠后,又可能影响模型理解。

所以,自建 Agent 的关键不是把模式清单全部塞进去,而是知道每个模式解决什么问题、会引入什么副作用,以及和其他模式如何配合。

十四、普通团队如何落地:六步走,不要一步登天

很多团队一上来就想做“全自动工程师”,结果很快被权限、上下文、成本、工具、安全问题打垮。更稳妥的路线,是从一个小而清晰的 Agent 开始。

14.1 第一步:先做只读 Agent

只读 Agent 的风险最低,最适合起步。比如代码审查、日志分析、文档问答、告警归因,都可以先从只读开始。

14.2 第二步:加入上下文预算

一旦输入变多,就必须加预算。没有预算的 Agent,很快会变成成本黑洞。

14.3 第三步:加入工具,但只允许安全工具

工具能显著提升能力,但一开始最好只开放查询、搜索、统计类能力。写操作、联网、删除、执行脚本都应谨慎。

14.4 第四步:加入安全闸门

白名单、黑名单、超时、输出截断、调用次数上限,这些看起来基础,却是生产环境里最重要的护栏。

14.5 第五步:加入韧性和观测

当任务开始规模化运行,失败会成为常态。重试、熔断、降级和日志指标必须跟上。

14.6 第六步:通过协议接入生态

当能力稳定后,再把它暴露成 MCP 工具,让其他 Agent 或工作流调用。这样你的 Agent 才能从单点工具变成生态节点。

十五、完整架构回顾:AI Agent 是一套工程系统

把整套思路收束起来,可以得到一个很清晰的判断:AI Agent 的核心不是“更会说”,而是“更可控”。

它需要提示词定义行为,需要上下文管理资源,需要工具连接外部世界,需要安全层限制越权,需要韧性层处理失败,需要可观测层让团队知道它做了什么。

如果少了提示词层,模型容易乱答;少了上下文层,成本和信息污染会失控;少了工具层,Agent 只能空谈;少了安全层,风险不可接受;少了韧性层,系统经不起异常;少了可观测层,团队无法持续优化。

十六、给技术团队的落地清单

检查项

应该做到什么

为什么重要

提示词分层

稳定规则与动态信息分开

减少混乱,为缓存和维护打基础

输入预算

总预算、单文件预算、工具输出预算

防止上下文爆炸和成本失控

截断说明

截断必须显式告知模型

避免模型基于局部信息过度自信

工具请求协议

模型提请求,系统验证执行

把执行权留在工程层

只读优先

先从查询、搜索、统计类工具开始

降低起步风险

权限多层防护

白名单、黑名单、超时、调用上限

任何单层失效仍有备用防线

重试有限

接口失败可重试,但必须有上限

避免成本黑洞和死循环

熔断机制

连续失败后暂停任务

保护系统稳定性

结构化结果

输出可被机器读取的报告

方便后续修复、复验和统计

可观测指标

记录覆盖率、耗时、成本、失败原因

优化必须建立在数据上

十七、总结:未来不是“会聊天的模型”,而是“可治理的 Agent 工程”

这份资料真正重要的启发是:AI Agent 的竞争力,不只是模型能力,而是模型外面的工程控制面。

当模型越来越强,团队之间的差距会逐渐转向:谁更会管理上下文,谁更会设计工具边界,谁更会做权限治理,谁更会处理失败,谁更会观测成本与质量,谁更会把多个 Agent 组合成稳定工作流。

自建 Agent 的第一性原则不是“让模型尽可能自由”,而是“让模型在正确边界内高效行动”。

一句话总结:真正的 AI Agent 工程,不是把模型接进系统,而是给模型装上方向盘、刹车、仪表盘、安全带和导航系统。


参考资料:https://pan.baidu.com/s/1Fm6rZSZkY3q2NcrmTfTMeQ?pwd=6fkr

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐