1. 从源码中提炼的12个AI Agent设计模式
在构建AI Agent系统的实践中,我发现一个有趣的现象:模型架构和工具链会不断迭代更新,但某些基础设计模式却能经受住时间考验。Bilgin lbryam(Kubernetes Patterns和Prompt Patterns的作者)通过对Claude Code的深度分析,提炼出了12个可复用的Agentic Harness设计模式,这些模式已经在实际生产环境中得到验证。
提示:这些模式的价值在于它们解决了AI系统开发中的本质问题,而非特定技术栈的实现细节。即使未来出现新的模型或框架,这些架构层面的智慧依然适用。
我将这些模式分为四大类,每类都对应着AI系统开发中的关键挑战:
- 记忆与上下文:解决信息如何存储、组织和访问的问题(5个模式)
- 工作流与编排:优化复杂任务的执行流程(3个模式)
- 工具与权限:管理外部工具的使用和安全边界(3个模式)
- 自动化:确保关键流程的可靠执行(1个模式)
下面我将结合自己的实践经验,逐一拆解这些模式的技术细节和实际应用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 记忆与上下文:五大模式解析
2.1 持久化指令文件模式
在早期开发AI助手时,我经常遇到这样的问题:每次新会话都需要重新解释项目规范、构建命令和代码风格要求。这不仅浪费token,更重要的是,Agent无法积累跨会话的知识。
解决方案:创建一个.agent_instructions文件存放在项目根目录,内容包含:
markdown复制# 项目规范
- 代码风格:ESLint + Prettier(配置见.eslintrc)
- 测试命令:npm run test:cov
- 构建流程:先运行静态检查,再执行单元测试
- 禁止操作:不得修改.gitignore中的规则
# 命名约定
- 组件:PascalCase
- 方法:camelCase
- 常量:UPPER_CASE
技术实现:
python复制def load_instructions(project_path):
instruction_file = os.path.join(project_path, '.agent_instructions')
if os.path.exists(instruction_file):
with open(instruction_file, 'r') as f:
return f.read()
return None
注意事项:这个文件需要随项目演进定期更新。我曾遇到过一个案例:构建命令从
make改为bazel后未更新指令文件,导致Agent持续使用已废弃的流程。
2.2 作用域上下文组装模式
在monorepo项目中,全局指令文件很快会变得臃肿。例如一个包含前端、后端和移动端的仓库,各子项目可能有完全不同的规范。
分层配置示例:
code复制repo-root/
.agent_instructions # 全局规则
packages/
web/
.agent_instructions # 前端特定规则
mobile/
.agent_instructions # 移动端特定规则
动态加载算法:
- 从当前目录向上搜索直到仓库根目录
- 按作用域从广到窄合并指令(全局 → 局部)
- 处理
@import语句实现模块化
实操心得:作用域冲突是常见问题。建议在指令文件中明确定义优先级,比如使用
!override标记强制使用当前作用域的规则。
2.3 分层记忆模式
全量记忆会导致两个问题:上下文窗口爆炸和关键信息淹没。我的解决方案是建立三级记忆结构:
| 层级 | 存储位置 | 保留时间 | 示例 |
|---|---|---|---|
| 工作记忆 | 上下文窗口 | 当前会话 | 正在编辑的函数实现 |
| 短期记忆 | 本地缓存 | 7天 | 最近查看的API文档 |
| 长期记忆 | 向量数据库 | 永久 | 项目架构决策记录 |
检索策略:
python复制def retrieve_memory(query):
# 首先检查工作记忆
if match := search_context(query):
return match
# 然后查询短期记忆
if match := cache.search(query, recency_weight=0.7):
return match
# 最后检索长期记忆
return vector_db.search(query, top_k=3)
2.4 记忆整合模式
记忆系统运行一段时间后会出现"污染"现象。我的清理策略包括:
- 去重:对相似度>90%的内容只保留最新版本
- 时效性:自动标记6个月未访问的记录为"冷记忆"
- 冲突解决:当检测到矛盾陈述时,保留有更多佐证来源的版本
清理触发器:
- 每次记忆写入后的空闲时段
- 记忆总量达到预设阈值时(如超过10MB)
- 每日定时维护窗口
踩坑记录:过于激进的清理曾导致重要设计决策丢失。现在我会为关键记忆添加
[PIN]标记避免被自动清理。
2.5 渐进式上下文压缩模式
对话轮次增加时,我采用动态压缩策略:
| 轮次范围 | 压缩策略 | 保留比例 |
|---|---|---|
| 1-5轮 | 原始保留 | 100% |
| 6-20轮 | 提取关键句 | 30% |
| 21-50轮 | 生成段落摘要 | 10% |
| 50+轮 | 仅保留决策点 | 5% |
压缩算法示例:
python复制def compress_conversation(history):
if len(history) <= WINDOW_SIZE:
return history
segments = split_into_topics(history)
compressed = []
for seg in segments:
if is_current_topic(seg):
compressed.extend(seg[-3:]) # 保留最近3条
else:
compressed.append(generate_summary(seg))
return compressed
3. 工作流与编排:三大核心模式
3.1 探索-规划-行动循环模式
在修改复杂代码库时,直接让Agent动手往往导致灾难。我的标准流程:
阶段一:探索(只读)
python复制def explore_mode():
tools = [code_reader, doc_searcher, dependency_analyzer]
constraints = {
'max_files': 100,
'blocked_actions': ['write', 'execute']
}
阶段二:规划(交互确认)
- 生成影响分析报告
- 列出风险文件
- 提供回滚方案
- 需人工确认"执行计划"
阶段三:行动(受控写入)
python复制def execute_plan(plan):
with Sandbox() as env:
for step in plan.steps:
if step.risk_level > threshold:
require_human_approval(step)
env.execute(step)
generate_audit_trail()
3.2 上下文隔离子智能体模式
长会话中的上下文污染问题非常棘手。我的解决方案是创建专门的子Agent:
| 子Agent类型 | 上下文策略 | 工具权限 |
|---|---|---|
| 研究员 | 保留原始代码+文档 | 只读工具 |
| 架构师 | 保留高层设计图 | 白板工具 |
| 工程师 | 保留当前文件+测试 | 受限写入 |
| 审核员 | 保留变更集+规范 | 差异对比工具 |
路由逻辑:
python复制def route_to_subagent(task):
if task.type == "RESEARCH":
return ResearchAgent(task.context)
elif task.type == "REFACTOR":
return EngineerAgent(task.context)
# ...
3.3 分支-合并并行模式
对于大规模重构,我使用Git工作树实现并行处理:
bash复制# 创建并行工作环境
git worktree add ../feature-a
git worktree add ../feature-b
# 各子Agent在不同工作树操作
def parallel_execute(tasks):
with ThreadPool() as pool:
results = pool.map(run_in_worktree, tasks)
# 合并结果
for r in results:
if not auto_merge(r):
manual_conflict_resolution(r)
经验法则:适合并行的任务应满足:1) 输入文件不重叠 2) 无共享状态依赖 3) 有明确合并策略
4. 工具与权限管理
4.1 渐进式工具扩展模式
我的工具加载策略分为三级:
| 信任级别 | 工具类型 | 加载时机 |
|---|---|---|
| 基础层 | 文件浏览、搜索 | 会话启动时 |
| 工作层 | 代���分析、测试 | 任务需要时 |
| 特权层 | 部署、数据库 | 人工授权后 |
动态加载实现:
python复制class ToolLoader:
def __getattr__(self, name):
if name not in self._loaded:
self.load_tool(name)
return self._loaded[name]
4.2 命令风险分类模式
我建立的五级风险矩阵:
| 风险等级 | 命令特征 | 处理方式 |
|---|---|---|
| 0级 | 只读查询 | 自动执行 |
| 1级 | 局部写入 | 记录后执行 |
| 2级 | 系统影响 | 需二次确认 |
| 3级 | 不可逆操作 | 人工审批 |
| 4级 | 高危命令 | 直接拦截 |
风险分析器:
python复制def assess_risk(command):
pattern = match_known_patterns(command)
if pattern.risk > 2:
return RiskAssessment(
level=pattern.risk,
rationale=pattern.description
)
# ...
4.3 单用途工具设计模式
对比通用Shell与专用工具:
| 场景 | 通用命令 | 专用工具 |
|---|---|---|
| 读文件 | cat file |
read_file(path) |
| 全局替换 | sed -i 's/old/new/g' |
replace_in_file(path, old, new) |
| 执行测试 | npm test |
run_tests(scope='unit') |
工具接口设计:
typescript复制interface CodeTools {
readFile(path: string): Promise<CodeSnippet>;
writeFile(path: string, content: string): Promise<RevisionID>;
searchCode(query: string, scope?: SearchScope): Promise<Match[]>;
}
5. 确定性生命周期钩子模式
必须自动化的关键节点:
mermaid复制graph TD
A[会话开始] --> B[加载项目配置]
B --> C[检查依赖状态]
C --> D[执行预处理]
D --> E[主任务循环]
E --> F[变更前校验]
F --> G[执行变更]
G --> H[运行事后检查]
H --> I[生成审计日志]
钩子注册示例:
python复制@hook('pre_execute')
def validate_schema(task):
if not task.schema.validate():
raise BlockedOperation("Schema validation failed")
@hook('post_commit')
def update_documentation(change):
if change.affects_api:
regenerate_swagger_docs()
这些模式在实际项目中的组合应用,能显著提升AI系统的稳定性和可维护性。比如在一个智能代码审查系统中,我同时应用了:
- 分层记忆存储历史审查记录
- 隔离的子Agent分别处理风格检查和安全扫描
- 自动化的预提交钩子确保检查完整性
- 渐进式工具加载降低初始复杂度
最终实现的系统在保持高质量输出的同时,将误报率降低了63%,这是单纯改进模型难以达到的效果。
