AICoding实战:从Prd到代码生成

提示

本文从以下几个模块实现最终的Coding能力:

  • 构建AICoding标准workflow,实现端到端生码
  • 扩充模型上下文,增强对仓库知识的理解能力
  • 沉淀流程数据,评测能力效果,优化AI生码质量

1. 框架

[图示已省略]

2. 扩充业务知识,增强模型能力

a. 业务知识体系化

面对庞杂的业务代码内容以及复杂的业务背景知识,需要从安全业务wiki、安全代码wiki、通识wiki、需求wiki多维度结构化补充背景知识,支撑跨仓库、跨业务链路、跨技术栈等复杂场景的生码能力。

  • **安全业务wiki:**涵盖各业务领域知识、风控通识和稳定性知识,确保生成的代码符合安全研发规范(如三板斧、熔断),且充分理解了安全业务语义。
  • **安全仓库wiki:**包括仓库级wiki、文件级wiki和调用链路wiki,提供全面的安全侧代码库知识,协助需求拆解和生码过程,快速定位需要修改/依赖的仓库代码内容。
  • **通识wiki:**基于研发中间件知识和全站研发通用知识,确保需求拆解和生码符合蚂蚁研发规范。
  • **需求wiki:**基于prd、系分和关联代码内容,构造需求和领域模型的关联背景知识,从实际需求扩充领域模型实际业务语义内容。

b. 上下文知识扩充,增强业务理解能力

ⅰ. RAG检索业务知识

对于大模型不理解特有业务场景的问题,使用业界通用方案,RAG在线检索相关的业务语义文档做代码生成的增强上下文。但是使用RAG知识库召回数据过程,会存在以下问题:

【召回准确率低】

提示

当前RAG知识检索能力,普遍存在的召回率低问题,采用以下方式去优化:

  • **提取业务实体:**增加需求实体提取阶段,避免整个需求文档直接搜索召回,提升准确率。
  • **增加搜索标签:**针对二方包跨仓库调用场景,在需求描述时,指定需要的bundle,提升知识库召回率。
  • **分应用召回:**核心h1h2应用使用geamker(支持业务三元组知识图谱和向量数据库),确保召回准确率;其他应用使用grt(仅有向量数据库搜索能力),保证可用性。

【支持库存储&检索耗时成本高】

提示

为了增强用户体验,同时考虑到大规模数据存储的成本,从以下几个角度进行多维优化:

  • **优化查询流程:**在知识库召回wiki过程中,剔除最后模型总结步骤,在只做文本搜索召回和倒排流程,节省98%耗时(3min->3s)。
  • **精炼知识内容:**只保留代码总结中涉及业务语义的部分,降低知识库的初始化解析和存储成本。

ⅱ. 知识图谱能力扩充

在实践过程中,发现现有知识库都是以markdown格式做初始召回文本,但这也会存在一个通用问题:在语义检索时只会命中md文档的某一个chunck块,导致召回结果完整性缺失。

针对此问题,使用知识图谱能力,基于“文件路径+仓库”节点索引标签,定向检索知识库召回文档,扩充wiki内容。

同时,考虑到知识图谱的存储召回耗时成本,简化图谱结构,仅保留必要的文档、仓库、bundle、需求、rpc、drm节点,剔除扩散比大的方法、属性等节点。最终在不降低语义质量前提下,将知识图谱规模从10亿+节点,简化到100万+节点。

c. 模型能力强化

除了RAG+知识图谱方式扩充背景知识外,模型自身的需求拆解和业务理解能力也需要不断增强。

  • **持续预训练:**基于Qwen-base model,在离线使用语料库,通过持续预训练方式,让需求拆解基模提前学习业务知识。
  • **强化学习:**通过强化学习手段,让需求拆解模型拆解出的子任务有三板斧和鲁棒性考虑,从而实现风险左移。

整体流程如下:

[图示已省略]

  • **训练语料:**基于pr的codediffs,先反向生成需求list,再反向合成原始需求。其中会用LLM进行多次扩充。以及原始prd提供反向生成上下文。
  • **训练方式:**基于sllmworks框架,使用GRPO方式,设计多个维度奖励(输出格式、拆解任务个数、变更三板斧、鲁棒性、任务依赖准确性)增强模型拆解能力。同时利用agent提取高可用历史AAR经验,总结成关键词词库,及时更新prompt。
  • **训练评测:**按照手动评测 + 自动评测,阶段性评测(需求拆解评测)+ 端到端评测(生码评测)相结合的方式对后训练后的需求拆解模型进行评测。
  • **应用:**需求拆解后的子任务列表用于最终生码,同时还在探究在其他方向的落地(如:系分生成)。

在当前的强化学习训练过程中,我们主要面临数据质量的挑战,并已制定相应的改进思路与落地计划。

【训练集数据质量】

  • **现状与做法:**现阶段采用“PR → 子任务列表 → 需求”的逆向工程链路构造训练样本,能够在数量上保证数据的充足。

同时对数据进行初步清洗:过滤掉代码改动行数在20以下或1000以上的PR,避免过于简单或过于复杂的样本带来的噪音与偏差;

在数据生成链路中引入两轮agent进行校验与补全(第一轮用于子任务完善、第二轮用于需求完善),在一定程度上提升了样本的可用性和一致性。

  • **问题与不足:**自动化生成的数据仍可能存在语义偏差、场景不匹配、标签不够细致等问题;数据分布与真实生产场景不完全一致,容易导致训练过程中的偏拟合或泛化能力不足。

改进计划:

  • **人工精标与优选:**建立小规模的“黄金集”,由领域专家人工审核与精标,作为训练与评测的对照基准;对自动生成数据进行抽样复核,沉淀高质量样本。
  • **分类与分层:**根据实际应用场景对数据进行分类(如修复类、优化类、重构类、文档类等),并按难度分层(简单/中等/复杂),确保训练时的分布与使用时一致。
  • **去重与一致性:**对近似或重复样本进行去重;提升一致性与可控性。 [已移除:营销/导流内容]

3. 标准化workflow,端到端生码

3.1 自动生成系分

# 各模块说明## 模块名## **业务实体**| 实体 | 属性及类型<br/>(默认varchar类型) | 索引键 | 字段值说明 || --- | --- | --- | --- |

### **领域功能**
| 领域 | 领域服务 | 领域功能 | 功能描述 | 规则约束 || --- | --- | --- | --- | --- |

### **应用服务**
| 服务域 | 服务接口 | 服务方法 | 方法流程描述 | 校验约束 || --- | --- | --- | --- | --- |

# 业务流程与状态机说明### 状态机说明#### 实体名| 实体 | 当前状态 | 事件/操作 | 下一状态 | 校验约束 || --- | --- | --- | --- | --- |

### 业务流程说明

# 与其他bundle或系统的交互
| 交互方 | 交互方式 | 触发时机 | 主要接口/消息 | pom信息 | 业务目的/说明 | 出入参说明 || --- | --- | --- | --- | --- | --- | --- |
# 高可用相关能力
| 能力 | 是否需要 | 待补充内容 || --- | --- | --- |

3.2 需求拆解子任务

【方案】

  • **目标:**将需求模块内容拆解为主要执行任务流程清单,包含详细描述和实现方案,并根据任务之间的依赖关系进行排序。
  • 拆分标准:
  • 确保子任务单一职责明确。
  • 根据业务影响评估优先级。
  • 维持与提供的业务背景知识、领域模型等的语义一致性。

[图示已省略]

3.3 仓储生码规范生成

【方案】

利用模型和codefuse具有的仓库索引能力,增加通用指令,以现有仓储具体场景为例,初始化生码规范(.project_rule),实现不同仓库的架构兼容规范。并在后续生码过程中将该规范内容作为生码上下文约束内容。例如以下是针对实际生产itask仓库自动生成的项目规范:

[图示已省略]

3.4 分层生码

Q:为什么不按照纵向分模块拆分生码,而是横向分层生码

A:

  1. 在系分和需求拆解阶段,已经按照模块拆分,且根据模块间依赖问题,排序生码子任务。

  2. 考虑到流程规范性,约束按照mvc分层生码,不仅能避免模块生码过程,模型偶尔丢失controller层代码问题,也能避免不同接口依赖同一个表或者接口、方法,导致merge冲突问题。

【方案】

  • 固化生码指令,设计mvc三层各自的生码workflow。
  • 优化生码指令,增加统一的命名规范、鲁棒性处理、可读性等质量要求。

3.5 自动review需求效果

【方案】

通过自定义prompt,固化需求实现效果总结指令,从变更代码结构、功能覆盖范围、稳定性需求、代码实现方案等多维度总结,降低cr难度。

[图示已省略]

4. 评测与数据更新,持续增强能力

a. 动态更新知识库,确保数据准确性

[图示已省略]

b. 能力评测

【评测重点】

  • RAG+知识图谱:评测知识召回能力
  • **召回率:**实际命中文件数/目标召回文件数据,目前运行时核心链路能完全召回。
  • **准确率:**实际命中文件数/实际召回文件总数。
  • 模型训练:评测需求拆解偏好
  • 总计1分,按照奖分方案,不扣分。
  • **输出格式:**严格按照json格式、根据需求复杂度合理规划任务列表个数。
  • **业务逻辑:**拆解任务列表需要满足三板斧、鲁棒性、任务依赖顺序合理等要求。

[图示已省略]

需求拆解能力:评测agent+上下文作用

  • 拆解prompt优化效果:简单prompt vs 复杂prompt
  • 拆解上下文作用:优化背景知识召回能力

[图示已省略]

端到端AICoding能力评测

评测数据覆盖标签范围

  • **业务类别:**业务风控相关需求、反洗钱相关需求、高可用相关需求、处罚相关需求、终端相关需求、流量风控相关需求、内容风控相关需求、其他外包小二需求。业务相关核心场景占比63%,高可用占比14%。
  • 需求场景:管理时需求(MVC类型服务架构,涉及接口、Controller等)占比34%;运行时需求(纯业务逻辑实现,不涉及Cotroller接口实现)占比66%
  • **需求类别:**新增、修改、新增+修改(占比77%)。
  • **需求复杂度:**从拆出的需求任务个数和可能实现代码行数评估。简单10%、中等50%、困难40%。

评测重点

  • **完整性:**需求是否覆盖prd文档中领域模型、业务流程和状态机相关内容,其他内容做参考。
  • **一致性:**需求内容是否与PRD描述的领域模型、业务流程和状态机相关内容,其他内容做参考,领域模型属性描述不完全不影响需求列表的准确性。
  • **依赖合理性:**需求间的依赖关系是否符合技术实现顺序。
  • **覆盖范围:**拆分的需求列表是否包含prd以外的内容。如果包含,对于合理的额外内容,比如线程锁、单元测试等属于正常范围的合理扩展。其他额外内容,如增加prd不涉及的接口,此类占比超过整个需求列表的20%,则视为拆解不准确。
  • **鲁棒性:**需求拆解过程是否考虑到包括数据、业务逻辑、安全、资源、外部依赖等各维度鲁棒性。
  • **高可用能力:**可监控、可灰度、可应急

5. 通过AIcoding编码实际使用情况

内嵌表格

CodeFuse 用户提交代码 AI 占比:43.25% 全部提交代码AI占比:36.01%