借鉴软件工程经验,Agent 应用可以从三个维度推进:
- 模块化:标准化职责、单一原则、提升复用性
- 结果驱动:可测试、可验证、可回归
- 持续演进:迭代优化、反馈闭环、版本管理
模块化
Prompt ≈ Code Model ≈ Compiler Agent ≈ Application
粗浅地看,我们可以将 Prompt 视为一种新的高级编程语言。它具有更高的抽象能力和表达力,但同时也带来了新的挑战:
- 不确定性:大模型的输出具有随机性和多样性,难以保证结果的一致性和可预测性
- 黑盒性:大模型的内部机制和决策过程不透明,难以理解和调试
- 依赖性:大模型的性能和行为受训练数据和模型架构的影响,难以控制和优化
- 安全性:大模型可能产生有害、偏见或不适当的内容,难以防范和监管
同样地,我们可以将 Agent 视为一种新的应用架构,它具有更高的智能能力和自主性。
Agent 的核心组件
System Instruction(系统指令)
定义全局规则、角色与安全边界,默认生效。
- 类似于:Environment Variables 或 Global Configuration
- 示例:SOUL.md、AGENT.md、CLAUDE.md
Command(命令)
用户主动触发的可执行命令。
- 类似于:API Endpoint 或 CLI Command
- 示例:帮我写一封邮件、/search AI safety papers
Skill(技能)
已掌握的可自主调用的能力。
- 类似于:Dynamic Dispatch 进行条件匹配
- 示例:pdf-convert、code-execution、web-search
上下文与数据层
Memory(记忆)
跨会话状态与偏好,确保连续性。
- 类似于:Database 或 Cache
- 示例:User Profile Memory、Task State Memory
MCP(模型上下文协议)
外部能力接入层,为 Skill 和 Memory 提供数据与接口。
- 类似于:3rd-party API
- 示例:Github MCP、Google Search MCP
Agent 的封装与编排
将上述各层组合成可交付的最小智能体单元,就可以像使用传统软件一样进行版本管理、权限控制、测试和迭代。
单个 Agent
将各层组合成可交付的最小智能体单元。
- 类似于:Software Package 或 Service
- 示例:Email Assistant Agent、Research Assistant Agent
Multi-Agent(多智能体)
多个 Agent 通过调度编排或自治协作完成复杂任务。
- 类似于:Microservices Architecture
- 示例:Customer Support System with Email Agent, Chat Agent, and Knowledge Base Agent
flowchart TD
subgraph CA[Agent]
SI[System Instruction]
MS[Command]
AS[Skill]
MCP[MCP]
M[Memory]
end
U('User') --> CA
SI --> MS
SI --> AS
MCP --> MS
MCP --> AS
M[Memory] --> MCP
CA --> Prompt
Prompt --> LLM结果驱动
为什么需要结果驱动
大模型具备先天的不确定性与黑盒属性,试错与迭代是必要流程。因此,每个模块都必须满足以下要求:
- 可测试:能够验证功能是否正常
- 可复现:结果具有一定的一致性
- 可校验:能够评估输出质量
- 可回归:支持版本回滚和问题追踪
设计与开发应先定义验收标准和验证路径,再实现能力编排。不可测试 = 不可上生产。
从"代码"到"结果"的转变
如果将 Prompt 看作一种编程语言,那通过 Agent 生成的产物就相当于软件工程中的"编译结果"(如 .class 文件)。大多数情况下,我们并不需要关注它,而应该关注结果 —— 即用户的目标是否达成、价值是否创造。过度关注代码细节,反而会陷入微管理,降低效率和创新。
"坚持不去看除了 CLAUDE.md 以外的代码。杜绝对 AI 的 micromanagement(微管理)。用 AI 是锻炼一个领导者的 servant leadership 的很好的办法。" —— 胡渊鸣 | 我给 10 个 Claude Code 打工
"守护架构,放权代码"
这是更高杠杆的工作方式:
- 聚焦结果与价值,而不是逐行控制代码细节
- 用边界与验收标准约束系统,而不是用微管理约束执行
- 把精力放在架构、优先级与反馈闭环这些高 leverage 决策上
持续演进
演进的必要性
Agent 应该是一个持续演进的系统,而不是一次性交付的产品。通过以下方式不断提升 Agent 的能力和适应性:
- 迭代优化:基于使用反馈持续改进
- 反馈闭环:建立用户反馈的收集与应用机制
- 版本管理:支持灰度发布、A/B 测试和快速回滚
设计原则
从一开始就要考虑系统的长期可维护性:
- 可维护性:清晰的模块划分和文档
- 可扩展性:预留扩展接口,支持新能力接入
- 可升级性:避免技术债务和过度耦合
个人实践
Github Copilot
Customize AI in Visual Studio Code,Copilot 已经支持绝大多数的 Agentic 技术,包括:
.github/copilot-instructions.md= System Instruction.github/prompts/*.prompt.md= Command.github/skills/*/SKILL.md= Skill- MCP & Custom Agent
在不更改开发环境的情况下,通过自定义的指令逐步构建智能体工作流,最后替代大部分的重复性工作。如:/test-golang, /code-review, /debug-kubernetes, /get-my-jira-tickets ...
Memory
Memory 主要用于存储用户的偏好、历史交互和上下文信息,以便在跨 Session 的交互中保持连续性。实现方式:
- 文件系统:将 Memory 存储在指定路径的文件中,将路径作为输入
- 文件系统+skill:提供读写 Memory 的技能,无需提供具体路径,e.g. OpenSpec
- MCP:将 Memory 存储在外部系统(数据库)中,通过 MCP 提供接口访问,e.g. OpenMemory
🤖 AI投喂建议:
- “Command 和 Skill 的区别”
- “Agent 的版本管理和回滚机制”
- “如何测试和评估 Agent 的输出质量”