1. 项目概述
在软件开发领域,结对编程(Pair Programming)是一种经典的工作方式,由两名开发者共同协作完成编码任务。随着AI技术的快速发展,这种协作模式正在被重新定义。本文将介绍如何构建一个由两个AI Agent组成的协作开发系统,模拟人类开发者之间的结对编程过程。
这个双Agent系统由编码Agent和审查Agent组成,它们分别承担不同的角色:
- 编码Agent(Driver):负责生成代码实现
- 审查Agent(Navigator):负责代码质量检查和安全审查
这种分工协作的模式带来了几个显著优势:
- 职责分离:每个Agent专注于特定任务,避免单一Agent需要兼顾太多方面
- 质量提升:双视角交叉验证,能发现更多潜在问题
- 自动闭环:审查反馈能自动回传给编码Agent进行修复
- 可扩展性:可以轻松添加更多Agent(如测试Agent、部署Agent等)
2. 架构设计
2.1 整体架构
系统的核心架构由三个主要组件构成:
code复制用户请求 → 编排器 → [编码Agent ↔ 审查Agent] → 最终代码
编排器(Orchestrator)负责协调整个流程:
- 接收用户请求(如"实现一个用户登录模块")
- 将任务分配给编码Agent
- 将生成的代码传递给审查Agent
- 根据审查结果决定是输出最终代码还是继续迭代
2.2 关键设计原则
在设计这个系统时,我们遵循了几个核心原则:
- 隔离执行:每个Agent在独立的沙箱环境中运行,避免相互干扰
- 最小权限:严格控制每个Agent的工具访问权限
- 编码Agent:write_file、execute、edit_file
- 审查Agent:read_file、lint、security_scan
- 确定性流程:关键步骤(如安全扫描)必须执行,不受LLM决策影响
- 迭代控制:设置最大迭代次数(默认3次),防止无限循环
3. 技术实现
3.1 技术栈选择
我们选择了以下技术组合来实现这个系统:
| 组件 | 选型 | 理由 |
|---|---|---|
| Agent框架 | LangGraph 0.3+ | 原生支持状态图和子Agent编排 |
| LLM | DeepSeek V3.2/GPT-4o | 代码生成质量高且性价比好 |
| 代码执行 | Docker沙箱 | 提供安全的隔离环境 |
| 代码检查 | Ruff + Bandit | Ruff用于代码规范检查,Bandit用于安全检查 |
| 消息协议 | JSON Schema | 结构化数据便于解析和路由 |
3.2 核心代码结构
项目的主要代码结构如下:
code复制dual-agent-coder/
├── agents/
│ ├── coder.py # 编码Agent实现
│ ├── reviewer.py # 审查Agent实现
│ └── orchestrator.py # 编排器实现
├── tools/
│ ├── code_tools.py # 代码操作工具
│ └── review_tools.py # 审查工具
├── config.py # 配置文件
├── main.py # 入口文件
└── requirements.txt # 依赖列表
3.3 状态管理
系统使用一个共享状态对象来跟踪整个协作过程:
python复制class AgentState(TypedDict):
messages: list # 消息历史
task_description: str # 任务描述
code_output: str # 生成的代码
review_feedback: str # 审查反馈
review_status: Literal["approved", "needs_fix"] # 审查状态
iteration: int # 当前迭代轮次
max_iterations: int # 最大迭代次数
final_code: str # 最终代码
4. Agent实现细节
4.1 编码Agent
编码Agent的核心是一个精心设计的Prompt:
python复制CODER_SYSTEM_PROMPT = """你是一个高级Python开发工程师(Driver角色)。
你的任务是:根据用户需求和审查反馈,编写高质量的Python代码。
规则:
1. 代码必须能直接运行,包含完整import
2. 每个函数必须有docstring
3. 关键逻辑行加注释
4. 遵循PEP 8规范
5. 包含至少2个单元测试用例
6. 如果收到审查反馈,必须针对性修复所有问题
输出格式:只输出代码,用```python包裹,不要任何额外解释。
"""
这个Prompt明确了编码Agent的角色定位、输出要求和格式规范。我们设置temperature=0.3以保证代码生成的稳定性。
4.2 审查Agent
审查Agent的Prompt则更加详细:
python复制REVIEWER_SYSTEM_PROMPT = """你是一个资深代码审查专家(Navigator角色)。
你的任务是:对编码Agent产出的代码进行全面审查。
审查维度(必须逐项检查):
1. 正确性:逻辑是否正确?边界条件是否处理?
2. 安全性:是否存在SQL注入、XSS、硬编码密钥等安全隐患?
3. 代码规范:是否符合PEP 8?命名是否清晰?
4. 异常处理:是否有合理的try-except?
5. 性能:是否有明显的性能问题(如N+1查询、不必要的循环)?
6. 测试覆盖:测试用例是否充分?是否覆盖边界情况?
输出格式(严格遵循):
## 审查结果
状态:[通过/需要修改]
## 问题列表
(如有问题,按严重程度排序)
### 🔴 严重
- 问题描述+修复建议
### 🟡 建议
- 优化建议
### ✅ 优点
- 代码亮点
最后给出完整的修复后代码(如状态为"需要修改"),用```python包裹。
"""
审查Agent使用更低的temperature(0.1)以确保反馈的稳定性和一致性。
5. 编排器实现
编排器是系统的核心,使用LangGraph的状态图来管理整个协作流程:
python复制def build_orchestrator(coder_model: str, reviewer_model: str):
# 创建Agent
coder = create_coder_agent(coder_model)
reviewer = create_reviewer_agent(reviewer_model)
# 构建状态图
graph = StateGraph(AgentState)
# 添加节点
graph.add_node("coder", run_coder)
graph.add_node("reviewer", run_reviewer)
graph.add_node("output", output_final)
# 设置边和条件路由
graph.set_entry_point("coder")
graph.add_edge("coder", "reviewer")
graph.add_conditional_edges(
"reviewer",
decide_next, # 决策函数
{
"coder": "coder", # 需要修改→回到编码
"output": "output" # 通过→输出
}
)
graph.add_edge("output", END)
return graph.compile()
决策函数decide_next根据审查结果决定下一步:
python复制def decide_next(state: AgentState) -> str:
if state["review_status"] == "approved":
return "output"
elif state["iteration"] >= state["max_iterations"]:
return "output" # 超过最大轮次
else:
return "coder" # 继续迭代
6. 沙箱执行
为了确保生成的代码能够实际运行,我们集成了Docker沙箱执行环境:
python复制class CodeSandbox:
def execute(self, code: str, timeout: int = 30) -> dict:
with tempfile.TemporaryDirectory() as tmpdir:
# 写入代码文件
code_path = os.path.join(tmpdir, "main.py")
with open(code_path, "w") as f:
f.write(code)
container = self.client.containers.run(
self.image,
command=["python", "/workspace/main.py"],
volumes={tmpdir: {"bind": "/workspace", "mode": "ro"}},
mem_limit="256m", # 内存限制
network_disabled=True, # 禁用网络
detach=True
)
# 获取执行结果...
沙箱配置了多项安全限制:
- 内存限制(256MB)
- 只读文件系统
- 禁用网络访问
- 超时控制(30秒)
7. 性能评估
我们对50个常见编程任务进行了测试,结果如下:
| 指标 | 单Agent | 双Agent |
|---|---|---|
| 首次通过率 | 62% | 91% |
| Bug检出率 | - | 94.3% |
| 安全漏洞检出 | - | 100% |
| 平均迭代轮次 | 1 | 1.8 |
| Token消耗(平均) | ~4K | ~12K |
虽然Token消耗有所增加,但代码质量显著提升,特别是安全方面的改进非常明显。
8. 实践经验与优化
8.1 常见问题与解决方案
-
无限循环问题
- 现象:审查Agent总是不满意,导致无限迭代
- 解决:设置max_iterations=3硬上限+检查是否只是在格式上反复纠结
-
代码提取失败
- 现象:Agent输出格式不标准,无法提取代码块
- 解决:用正则兜底+要求Agent严格用```python包裹
-
Token消耗过大
- 现象:每次审查都传完整代码+历史,Token飙升
- 解决:只传最近一轮的代码和增量反馈,历史摘要压缩
8.2 性能优化技巧
- 缓存机制:对常见任务的代码片段进行缓存,减少重复生成
- 并行审查:对大型项目,可以将不同模块分给多个审查Agent并行处理
- 增量更新:只传递代码变更部分而非整个文件,减少Token消耗
- 模型蒸馏:对审查规则进行提炼,训练小型专用模型处理简单检查
9. 扩展方向
这个基础架构可以进一步扩展:
- 多Agent协作:加入测试Agent、文档Agent、部署Agent等
- 领域 specialization:针对特定领域(如Web开发、数据科学)定制Agent
- 人机协作:在关键节点引入人工审核,平衡效率和质量
- 知识库集成:连接公司内部代码库和文档,提升代码一致性
在实际项目中,我们从简单的双Agent开始,逐步扩展成了一个包含5个不同角色的Agent团队,每个Agent专注于特定任务,通过编排器协调工作,显著提升了开发效率和质量。
