资讯动态

AI编程协作闭环:Harness与SDD实现代码可签收、可合并

发布时间:2026/8/26 23:03:04 来源:尧图企业网站定制
1. 项目概述从“能跑”到“能合”的AI协作进化在AI编程的浪潮里我们经历了从单点代码补全到多智能体协作的飞速发展。早期的工具解决了“写出来”的问题但当一个改动由多个AI智能体共同完成时新的挑战出现了如何确保这些分散的、自动生成的代码片段能够像人类工程师提交的代码一样被清晰、有序、安全地整合进主代码库这正是“AI编程可闭环协作”系列卷三要啃下的硬骨头。本卷聚焦于Harness与SDD这两个核心概念目标直指一个工程化的理想状态让AI驱动的每一次代码改动都变得可签收、可合并。简单来说这不再是讨论哪个AI写代码更聪明而是探讨当一群“AI程序员”同时开工时我们如何为它们建立一套堪比成熟软件团队的交付流水线与质量门禁。Harness在这里扮演着“工程调度与质量守门员”的角色而SDD则是确保每次改动意图清晰、上下文完整的“标准化任务说明书”。没有这套机制AI协作就会退化为一场混乱的“代码雨”看似热闹落地时却充满合并冲突、功能回退和不可预知的风险。无论你是正在尝试将Codex、GPT Engineer或多智能体框架引入工作流的Tech Lead还是苦于管理AI生成代码质量的开发者理解并实践Harness与SDD都将是你把AI编程从“玩具”升级为“生产级工具”的关键一步。这不仅仅是工具的使用更是一种面向AI原生时代的软件工程范式转变。2. 核心理念拆解Harness与SDD为何是闭环的关键在深入实操之前我们必须先厘清Harness和SDD这两个概念的本质及其在协作闭环中的不可替代性。它们共同构成了AI编程从“个体贡献”到“团队交付”的桥梁。2.1 Harness不止于“运行”更在于“驾驭”与“治理”在AI编程的语境下Harness这个词容易让人联想到测试工具。但它的内涵远不止于此。你可以把它理解为一套自动化的工作流编排、执行与治理框架。它的核心使命是“驾驭”AI智能体Agent的产出确保其符合工程标准。一个典型的Harness系统需要具备以下能力任务调度与编排接收一个高层级目标如“实现用户登录功能”并将其分解、分配给最合适的AI智能体去执行。这涉及到对智能体能力Codex擅长代码生成Claude擅长逻辑梳理的元认知和动态路由。上下文管理与注入为每个执行中的智能体提供准确、完整的上下文。这包括项目代码库的当前状态、相关API文档、之前的对话历史、以及本次改动的具体要求SDD。没有上下文的AI就像蒙眼写代码的程序员。质量门禁与验证在智能体提交代码后自动触发一系列验证步骤。这不仅仅是单元测试还包括代码风格检查、静态分析、安全漏洞扫描、依赖影响分析等。Harness需要能自动判断一次改动是“通过”进入下一阶段还是“打回”要求AI重做。状态追踪与可视化提供一个仪表盘让人类工程师能清晰地看到每个由AI驱动的开发任务处于什么状态待处理、执行中、审查中、已合并以及每个环节的产出和日志。这是建立信任的基础。注意不要把Harness简单等同于CI/CD流水线。传统的CI/CD是在人类提交代码后运行。而AI编程的Harness其流水线起点是“任务创建”并且全程可能涉及多次与AI的交互、迭代和自动验证其流程更复杂反馈环更紧密。2.2 SDDAI能读懂的“精准工单”SDD在此处并非指“软件设计文档”而更接近于Structured Development Directive或Specification-Driven Development。它是给AI智能体看的、结构化的开发指令说明书。为什么需要SDD因为对AI说“加个登录功能”太模糊了。SDD将模糊的需求转化为AI可精确执行的原子任务。一份合格的SDD应包含变更目标清晰说明要修改什么达到什么效果。上下文范围明确指出需要读取哪些文件、参考哪些现有代码或文档。输入/输出规范如有接口变动需明确定义。验收条件列出具体的、可自动验证的检查项如“新增的API端点应通过以下测试用例…”。非功能性要求性能、安全性、兼容性等方面的约束。SDD是人类与AI以及AI与AI之间协作的“合同”。它确保了所有参与者对“完成”的定义是一致的。2.3 闭环协作Harness SDD 的工作流二者结合便形成了可闭环的协作流需求输入人类工程师或产品经理创建一个SDD描述一个具体的、原子级的开发任务。任务调度Harness系统接收该SDD根据任务类型选择并启动一个或多个AI智能体。上下文装配Harness为智能体装配好项目代码、相关文档及完整的SDD。AI执行与产出智能体根据上下文生成代码、文档或测试。自动验证Harness自动运行SDD中定义的验收条件如单元测试、lint检查并生成报告。结果处理若验证通过Harness将改动打包标记为“可签收”并创建一个清晰的合并请求附上所有执行日志和验证报告。若验证失败Harness将错误信息反馈给智能体要求其迭代修改或根据策略升级给另一个智能体/人类处理。人类签收与合并人类工程师审查这个“预制好”的合并请求。由于有完整的SDD、清晰的变更集和通过的自动化检查审查效率极大提高可以快速“签收”并合并。这个闭环使得AI的每一次贡献都变得可预测、可验证、可追溯真正实现了“可签收、可合并”。3. 实战架构构建你自己的AI协作Harness理解了理念我们来看如何落地。构建一个轻量级但功能完整的Harness系统不一定需要从零开始可以基于现有工具链进行集成。下面是一个参考架构。3.1 核心组件选型与设计一个最小可行的AI协作Harness通常包含以下组件任务队列与调度器选型RabbitMQ, Redis (Bull), 或直接使用GitHub Projects、Linear等项目的看板功能作为任务来源。职责接收SDD任务管理任务状态待处理、执行中、已完成、失败并依据策略调度给智能体。实操要点为每个任务分配唯一ID并持久化存储任务详情和SDD内容。调度策略可以很简单如轮询也可以很复杂基于智能体的负载和能力匹配。智能体运行时选型这取决于你使用的AI模型。可以是OpenAI API的封装、本地部署的Llama代码模型、或是Claude的API。关键是要有一个统一的“智能体接口”。职责提供一个隔离的环境来运行AI智能体接收任务上下文调用模型API并返回结构化的产出代码、解释等。实操要点必须做好上下文长度管理。将整个代码库塞给模型是不现实的。需要设计一个“相关文件检索”模块根据SDD中的关键词使用代码语义搜索如基于ChromaDB、Weaviate或简单正则匹配找出最相关的文件片段提供给AI。代码仓库操作器选型直接使用Git命令行工具的封装或GitHub/GitLab的REST API客户端。职责为每个任务创建独立的分支将AI生成的代码提交到该分支并在验证通过后创建合并请求。实操要点提交信息必须规范化。建议模板[AI-Bot] feat: 实现用户登录SDD#123。验证结果${测试通过率}。这便于后期追溯。质量门禁流水线选型与现有CI/CD工具集成是最佳实践。例如在GitHub Actions中定义一个专用工作流或在GitLab CI中定义一个专用stage。职责监听AI任务分支的推送自动运行SDD中定义的验收套件。这应包括代码格式化检查Prettier, Black静态代码分析ESLint, Pylint, SonarQube单元测试与集成测试Jest, pytest安全扫描Snyk, Trivy实操要点流水线的结果必须能反向更新Harness中任务的状态。可以通过API回调或将结果写入共享存储来实现。状态管理与仪表盘选型一个简单的Web前端如Vue/React 后端API。后端可以使用任何你熟悉的框架Node.js, Python Flask/Django。职责展示所有任务的状态、历史记录、AI产出、验证报告。这是人类工程师的“指挥中心”。实操要点仪表盘不需要太复杂但几个关键视图必不可少任务队列视图、任务详情视图展示SDD、AI生成代码diff、验证日志、智能体健康状态视图。3.2 SDD的定义与存储格式SDD需要是机器可读的。推荐使用YAML或JSON格式因为它们结构清晰易于解析和扩展。# SDD 示例为REST API添加一个GET /users端点 id: SDD-20240527-001 title: “添加获取用户列表的API端点” created_at: 2024-05-27T10:00:00Z created_by: “human-engineer” # 变更目标 objective: | 在现有的用户管理模块中新增一个GET /api/v1/users端点。 该端点应支持分页查询并返回用户ID、姓名和邮箱字段。 # 上下文范围 context: codebase_path: “/src/services/user” relevant_files: - “/src/services/user/controller.js” - “/src/services/user/model.js” - “/src/routes/index.js” references: - “项目API设计规范文档.md” - “现有POST /api/v1/users 端点实现” # 输入/输出规范 specification: endpoint: “GET /api/v1/users” query_parameters: - name: “page” type: “integer” default: 1 description: “页码” - name: “limit” type: “integer” default: 20 description: “每页条数” response: status: 200 body_schema: type: “object” properties: data: “arrayUser” total: “integer” page: “integer” limit: “integer” # 验收条件 acceptance_criteria: - type: “unit_test” command: “npm test -- tests/unit/user-controller.test.js” expected: “所有测试通过” - type: “integration_test” command: “npm run test:integration -- tests/integration/users-api.test.js” expected: “新增的端点测试通过” - type: “lint” command: “npx eslint src/services/user/controller.js” expected: “无错误或警告” - type: “security_scan” command: “npx snyk test” expected: “未发现高危漏洞” # 分配给哪个智能体可选可由调度器决定 assigned_agent: “code-specialist” priority: “normal”这种结构化的SDD既方便人类阅读和创建也方便Harness系统自动解析并提取关键信息如需要测试的文件、命令注入到后续流程中。4. 核心环节实现详解有了架构设计我们深入几个最关键环节的实现细节。4.1 智能体调度与上下文装配这是Harness的“大脑”。调度器不仅要分配任务更要准备好AI所需的“弹药”。实现步骤任务解析调度器从队列中取出一个SDD解析其objective、context和specification。智能体选择根据assigned_agent字段或基于规则的匹配如任务包含“refactor”则分配给“refactor-bot”选择合适的智能体运行时。可以维护一个智能体注册表记录其能力和当前负载。上下文检索与构建根据context.relevant_files列表从代码仓库中读取这些文件的内容。如果文件列表过长或未指定则需要启动一个“检索增强生成”流程将SDD的objective作为查询使用代码嵌入模型如OpenAI的text-embedding-ada-002和向量数据库从整个代码库中检索出最相关的代码片段。将检索到的代码片段、SDD全文、以及项目的一些通用指令如代码风格要求组合成一个结构化的提示词Prompt。调用智能体将构建好的提示词发送给选定的AI模型API并设定合理的参数如temperature0.2以获得更确定性的输出。解析产出AI的回复可能是混合了代码、解释的文本。需要编写一个解析器从中提取出纯粹的代码块识别标记并确定这些代码应该应用到哪个文件。SDD中的context范围是解析的重要依据。实操心得上下文长度是最大的挑战。对于大型项目必须做“剪枝”。一个有效策略是采用分层上下文首先提供相关文件的函数/类签名摘要如果AI在生成过程中请求查看某个具体函数的实现再通过后续交互提供。这模拟了人类程序员“先看接口再深入细节”的过程。4.2 自动化验证流水线的集成验证是“可签收”的基石。流水线必须快速、可靠并且结果能反馈回Harness。实现步骤监听与触发当代码操作器将AI生成的代码提交到特性分支后自动触发CI/CD流水线。这可以通过Git的Webhook实现。动态流水线配置流水线不应是固定的。它应该读取该分支对应SDD中的acceptance_criteria动态决定要运行哪些检查。例如一个SDD可能只要求单元测试而另一个可能要求额外的性能测试。执行与收集结果流水线依次执行各项检查命令并收集标准输出、错误码和持续时间。每个检查项的结果成功、失败、错误都需要被结构化地记录下来。结果上报流水线执行完毕后调用Harness系统提供的API将整体状态通过/失败和详细的检查报告回传到该SDD任务下。状态流转Harness根据回传的结果更新任务状态。如果全部通过则将任务状态置为“验证通过待人工审查”并自动创建合并请求。如果有任何一项失败则将状态置为“验证失败”并将错误日志关联到任务可以配置自动重试或通知人类。# 一个简化的CI脚本示例展示了如何根据SDD动态运行测试 #!/bin/bash # 假设SDD文件被保存在工作目录的 .sdd/sdd.yaml # 解析SDD中的验收条件 ACCEPTANCE_CRITERIA$(yq eval ‘.acceptance_criteria’ .sdd/sdd.yaml) # 检查并运行单元测试 if echo “$ACCEPTANCE_CRITERIA” | grep -q “unit_test”; then UNIT_TEST_CMD$(yq eval ‘.acceptance_criteria[] | select(.type “unit_test”) | .command’ .sdd/sdd.yaml) echo “Running unit test: $UNIT_TEST_CMD” eval $UNIT_TEST_CMD if [ $? -ne 0 ]; then echo “Unit test failed” exit 1 fi fi # 类似地检查并运行Lint等...4.3 合并请求的自动化创建与格式化这是“可合并”的最后一步。一个格式良好的合并请求能极大降低人工审查成本。自动化创建流程生成变更描述Harness应自动生成合并请求的标题和描述。标题可以沿用SDD的title。描述则应包含SDD链接指向该任务详情的内部链接。变更摘要由AI生成的一段简短说明解释它做了什么。验证结果摘要以表格形式列出所有验收条件的执行结果。生成的代码Diff系统可以自动附上关键文件的diff预览。设置审查者可以根据SDD的created_by任务创建者或代码库的CODEOWNERS文件规则自动指派合并请求的审查者。标签与分类自动打上ai-generated、sdd等标签方便过滤和管理。创建请求通过Git平台API如GitHub REST API v3正式创建合并请求。注意事项自动创建的合并请求其源分支的生命周期需要管理。建议在合并请求被合并或关闭后由Harness系统自动删除对应的特性分支保持仓库的整洁。5. 避坑指南与效能优化在实际搭建和运行这套系统的过程中你会遇到许多预料之外的问题。以下是一些常见的“坑”及其应对策略。5.1 智能体生成的代码质量不稳定这是最常见的问题。AI可能会写出有语法错误、逻辑漏洞或不符合项目风格的代码。问题生成的代码无法通过基础的编译或Lint检查。排查与解决强化上下文检查提供给AI的上下文是否足够精确。是否包含了相关的类型定义、接口契约尝试提供更具体的例子。降低“创造力”将AI模型的temperature参数调低如设为0.1使其输出更倾向于确定性、常见的模式。实施多轮迭代不要期望一次生成就完美。设计Harness流程让“生成 - 基础编译/Lint检查 - 反馈错误给AI - 重新生成”成为一个自动化的子循环。只有通过最基础检查的代码才进入更耗时的测试环节。使用更专业的代码模型针对代码生成任务专门训练的模型如Codex、StarCoder通常比通用大模型表现更稳定。5.2 合并冲突频发当多个AI智能体同时基于旧的主分支代码进行修改时它们提交的改动极易发生冲突。问题AI任务分支在创建合并请求时发现与主分支存在大量冲突需要人工解决。排查与解决任务粒度细化将大的需求拆分成更小、更独立的SDD。减少每个任务修改的文件范围和影响面从根本上降低冲突概率。引入乐观锁或队列对于修改同一模块或文件的SDD让Harness将它们串行化处理而不是并行。可以设置基于文件路径的锁。实时基准同步在AI智能体开始执行任务前Harness确保其获取的代码上下文是基于最新主分支的。甚至可以在任务执行中途如果发现主分支有更新尝试自动重基rebase任务分支让AI基于最新代码重新调整它的改动这需要较高级的交互设计。冲突检测与自动解决在创建合并请求前Harness可以先运行一个预检查模拟合并。如果检测到简单冲突如空白字符可以尝试自动解决。对于复杂冲突则直接将任务状态置为“需人工干预”并附上冲突详情。5.3 SDD编写成本与精度平衡编写一份足够精确的SDD本身就需要时间和精力如果成本太高就失去了自动化的意义。问题人类工程师觉得写SDD太麻烦不如自己写代码快。排查与解决提供SDD模板与生成器为常见任务类型如“新增API端点”、“修复Bug”、“重构函数”创建模板。甚至可以开发一个简单的工具通过表单填空的方式生成SDD的YAML。从Issue或注释生成SDD利用AI的能力让人先像平时一样在Issue里描述需求然后由另一个AI智能体将模糊的描述初步加工成结构化的SDD草案人类只需做确认和微调。积累与复用建立SDD知识库。相似的任务可以直接复用旧的SDD进行修改。系统可以推荐相似的已完成SDD供参考。明确ROI向团队说明编写SDD的成本是一次性的但一个高质量的SDD可以被无数次地、一致地执行且其带来的自动化验证和合并收益在长期和多次执行中会摊薄这份成本。5.4 验证流水线的“假阳性”与“假阴性”自动化测试可能因为环境问题而失败假阳性也可能没测出真正的问题假阴性。问题AI生成的代码有隐患但通过了所有自动化测试或者代码其实没问题却因测试环境不稳定而失败。排查与解决增强测试的确定性确保测试环境隔离、干净。使用容器技术如Docker来运行验证流水线保证每次运行的环境一致。实施分层验证采用金字塔测试策略。先运行最快、最稳定的单元测试再运行集成测试最后是端到端测试。任何一层失败都立即终止避免浪费资源。引入模糊测试与属性测试对于核心逻辑除了SDD中指定的用例可以自动补充一些模糊测试随机生成输入来探索边缘情况。人工审查兜底自动化验证是辅助不是取代。必须保留最终的人工代码审查环节。但审查者的重点应从“语法和风格”转向“业务逻辑和架构合理性”因为前者已由自动化工具保障。6. 进阶场景与未来展望当基础的可签收、可合并流程跑通后你可以探索更高级的协作模式进一步提升AI编程的效能。6.1 多智能体协作的复杂编排单个智能体能力有限。复杂的SDD可能需要多个智能体协作完成。场景一个“实现购物车结算”的SDD可能涉及前端UI、后端API、数据库变更和支付接口集成。方案Harness可以将这个SDD分解为多个子SDD分别派发给“前端专家”、“后端专家”和“数据库专家”智能体。这里的关键是智能体间的通信与协调。设计模式可以采用“管理者-工作者”模式。一个“架构师”智能体负责分解任务和定义接口其他智能体负责实现。上下文共享Harness需要维护一个共享的“工作区”让智能体A产出的API定义能被智能体B在实现前端时获取到。顺序与依赖有些任务有先后依赖如先设计数据库表再写后端API。Harness的调度器需要能处理这种依赖关系图。6.2 基于反馈的智能体调优Harness系统积累了大量的数据SDD、生成的代码、验证结果、人工审查意见。这些是训练和优化智能体的宝贵资产。应用提示词工程优化分析成功任务和失败任务的提示词差异自动优化提供给智能体的系统指令和上下文组织方式。智能体性能评估统计不同智能体或不同模型配置在不同类型任务上的通过率、代码质量评分实现更精准的任务分配。SDD质量评估反向评估SDD本身的质量。如果一个SDD总是导致生成低质量代码或验证失败可以提示创建者修改SDD的写法。6.3 与现有研发工具链的深度集成Harness不应是一个孤岛而应融入现有的工程文化。与项目管理工具集成将SDD与Jira Issue、Linear Ticket关联实现从业务需求到AI代码交付的端到端追溯。与监控告警集成当AI生成的代码合并后如果在生产环境出现异常或性能退化监控系统可以反向标记出对应的SDD和AI任务为根因分析提供线索。与知识库集成将成功的SDD和对应的代码变更自动归档到团队内部的知识库或Wiki形成可检索的最佳实践案例。从我个人的实践来看构建这样一套系统的最大价值不在于替代了多少行人工代码而在于它强制推行了一种极度规范化和自动化的开发文化。SDD迫使需求描述必须清晰、可验证Harness迫使每个改动都必须经过标准化的质量关卡。即使未来AI智能体能力更强这套基于契约和自动化验证的协作框架依然是管理复杂度、保障软件质量的基石。它让AI编程从“黑盒魔法”变成了“白盒工程”。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价