论文阅读:BitsAI-CR: Automated Code Review via LLM in Practice
论文《BitsAI-CR: Automated Code Review via LLM in Practice》技术详解
1. 背景与挑战
代码审查是软件开发中确保代码质量的关键环节,但在大规模工业环境中面临以下挑战:
- 资源密集:人工审查耗时(如ByteDance内部数据显示,50%的审查耗时超过15分钟),且难以覆盖所有代码变更。
- 现有工具的局限性:
- 静态分析工具:依赖复杂配置和编译,影响开发效率。
- 现有LLM方案:生成的意见可能存在技术错误(低精确度)或实用性不足(如正确但冗余的建议),且缺乏持续优化的机制。
2. BitsAI-CR框架设计
BitsAI-CR通过两阶段流程(RuleChecker + ReviewFilter)和数据飞轮机制,实现高效、精准的自动化代码审查。
2.1 两阶段审查流程
RuleChecker:
功能:基于细调的LLM,结合219条代码审查规则(覆盖代码缺陷、安全漏洞、可维护性、性能问题等维度),初步检测代码问题。
规则来源:整合企业内部静态分析规则和人工审查经验,动态更新。
上下文准备:对代码差异(diff)进行分块处理,扩展函数定义边界,并标记修改状态(如“已删除”或“新增”),确保模型输入的结构化和完整性。
ReviewFilter:
- 功能:对RuleChecker的检测结果进行二次验证,过滤误报和幻觉(如错误变量命名检查)。
- 推理模式:采用“结论优先”(Conclusion-First)模式,首先生成决策(保留/丢弃),再提供理由,平衡精确性与推理速度。
- 效果:将整体精确度从54.5%提升至75.0%。
评论聚合(Comment Aggregation):
- 使用余弦相似度(基于内部嵌入模型)合并相似评论,避免信息过载。
2.2 核心创新:过时率(Outdated Rate)
- 定义:被BitsAI-CR标记的代码行在后续提交中被修改的比例,反映开发者对审查意见的实际采纳情况。
- 公式:
- 作用:替代传统手动评估,支持大规模自动化优化。例如,Go语言的过时率稳定在26.7%,接近人工审查的35%-46%。
2.3 数据飞轮机制
- 核心流程:
- 数据收集:从代码合并请求(MR)中提取12万条审查意见,结合静态分析和人工反馈。
- 数据精炼:通过LLM(Doubao-Pro-32K-0828)过滤非实质性内容,扩展建议的详细性。
- 持续优化:
- 用户反馈:通过“点赞/点踩”收集直接评价。
- 手动标注:每日抽样标注在线数据,优化低精确度规则。
- 动态规则调整:结合过时率与精确度,淘汰低价值规则(如高精确度但低过时率的规则)。
3. 实验结果与部署效果
- 离线实验:
- 精确度提升:两阶段流程使整体精确度从30.9%(仅RuleChecker)提升至65.6%(结合ReviewFilter)。
- 规则分类效果:安全漏洞类别的精确度最高(61.3%),性能问题次之(72.0%)。
- 在线部署:
- 用户规模:服务超12,000周活跃用户(WAU),页面周访问量210,000次。
- 用户留存:第2周留存率61.6%,第8周仍保持48%。
- 实际影响:开发者对74.5%的审查意见表示认可,错误意见占比仅10.9%。
4. 与传统方案的对比
- Google AutoCommenter:仅生成最佳实践链接,缺乏具体代码建议。
- Tencent方案:聚焦代码可维护性,覆盖维度单一。
- BitsAI-CR优势:结合规则分类、两阶段验证、数据飞轮,实现高精确度与实用性。
5. 未来方向
- 多语言支持:当前支持Go、Java等5种语言,计划扩展至全编程语言。
- 跨文件审查:增强上下文理解能力,支持跨文件依赖分析。
- 开发者体验优化:提供一键修复建议、自定义规则配置等。
6. 总结
BitsAI-CR通过LLM与规则驱动的两阶段流程,显著提升了自动化代码审查的精确度和实用性。其创新的过时率指标和数据飞轮机制,为工业级代码审查工具的设计提供了重要参考,尤其适用于大规模、高并发的开发场景。
RuleChecker
RuleChecker 是 BitsAI-CR 框架中用于检测潜在代码问题的核心组件,以下是详细介绍:
RuleChecker 的作用
RuleChecker 是 BitsAI-CR 两阶段代码审查流程的第一阶段,其主要作用是基于预定义的代码审查规则分类体系,在代码变更中识别潜在问题,如代码缺陷、安全漏洞、可维护性和可读性问题以及性能问题等。
RuleChecker 的工作原理
- 输入准备:接收代码差异(code diff),运用树形结构解析器(tree-sitter)将代码分割成多个分析单元,并依据特定规则扩展至完整函数范围。每行代码都标注其状态和位置,为后续分析构造明确的上下文。
- 模型选择:基于字节跳动内部代码标准及审查规则分类体系,采用微调的大型语言模型(LLM)进行综合训练,该模型经预训练后,通过企业内部代码仓库的数据与专业标注数据以监督学习的方式再次训练,确保模型可以精准理解代码语义及其上下文。
- 问题检测:通过上下文理解,将代码与预定义的审查规则分类体系对比,模型可精准地为每一行被改动或新增的代码生成详细的解释性信息,例如问题类别、具体问题描述、问题严重程度以及修改建议等。
- 动态调整:包含规则类别拦截器,依据用户反馈动态调整审查规则,无需重新训练模型即可实现审查规则的实时增删改。
RuleChecker 的实现细节
- 技术选型:利用 LoRA(低秩自适应)微调技术和字节跳动内部开发的 Doubao-Pro-32K-0828 LLM,结合内部代码审查数据进行训练,确保模型理解和生成符合内部标准,可精准理解代码缺陷及潜在逻辑错误。
- 精准审查:基于对代码库知识的学习,精准生成代码审查建议,能够检测难以被传统工具发现的逻辑漏洞,例如在特定业务场景下可能出现的隐性条件限制缺陷。
- 安全性保障:能够检测可能导致数据泄露、越权访问等安全隐患的代码片段,如未经认证的接口调用、对敏感数据的不当存储与处理等。
- 动态适配:可根据用户反馈动态调整审查规则,无需重新训练模型即可实现审查规则的实时增删改,确保审查规则与企业实践同步。
RuleChecker 的动态性
- 规则分类体系:RuleChecker 的规则分类体系可根据用户反馈进化,初期基于历史代码审查数据构建,随着运行不断优化。
- 规则更新:规则更新基于用户反馈。若用户频繁报告某条规则(如禁止数字硬编码)未被触发或触发不必要,平台自动调整规则参数或在反馈积累到阈值时移除规则。
- 规则淘汰:通过追踪规则在审查中的表现,如对某个规则的反馈长期负面,系统将认定该规则对现有环境不适用并予以移除,保障规则的实用性。
RuleChecker 的输出结构化信息与稳定性
- 结构化输出:输出结构化信息,包括问题类别、代码位置、解释和建议,便于快速定位和修复问题。
- 性能与稳定性:能高效处理大量代码审查任务,目前部署在字节跳动内部,每周活跃用户超 1.2 万,页面浏览量达 21 万,且每周有较高的用户留存率,证明了其在实际应用中的可靠性和稳定性。
RuleChecker 通过严谨的规则分类、算法训练、动态优化,结合高性能模型和企业实践数据,为开发者提供精准且实用的代码审查服务,协助提升代码质量,加快开发进度。
ReviewFilter
ReviewFilter 介绍
ReviewFilter 是 BitsAI-CR 框架中的一个关键组件,用于对 RuleChecker 生成的审查评论进行二次验证,以提高审查的精度。它通过另一个经过微调的 LLM 对 RuleChecker 的输出进行验证,确保生成的审查评论具有高准确性和实用性。
ReviewFilter 的功能
- 二次验证:ReviewFilter 对 RuleChecker 生成的每一条审查评论进行验证,判断评论是否应该保留。
- 提高精度:通过验证,ReviewFilter 有效过滤掉模型幻觉和低价值评论,提高审查评论的精度。
- 推理模式:ReviewFilter 支持多种推理模式,包括“直接结论”、“推理在前”和“结论在前”,以适应不同的验证需求。
- 动态调整:ReviewFilter 会根据验证结果动态调整审查规则,移除生成低价值评论的规则。
ReviewFilter 的工作原理
- 输入处理:ReviewFilter 接收 RuleChecker 生成的审查评论作为输入。
- 验证过程:ReviewFilter 使用经过微调的 LLM 对评论进行验证,输出一个二元判断(Yes 或 No)来决定是否保留评论,并提供相应的判断依据。
- 推理模式:ReviewFilter 支持三种推理模式:
- 直接结论:生成一个单一的决策(Yes 或 No)。
- 推理在前:先提供完整的推理过程,再得出结论。
- 结论在前:先输出决策,再提供支持推理的依据。
- 输出处理:ReviewFilter 的输出结果会经过评论聚合机制处理,避免重复信息干扰开发者。
ReviewFilter 的实现细节
- 模型选择:ReviewFilter 使用经过 LoRA 微调的 Doubao-Pro-32K-0828 模型,确保模型在安全性和性能上的平衡。
- 推理模式优化:通过实验比较,ReviewFilter 选择了“结论在前”模式,该模式在准确率和推理时间上表现最佳,准确率达到 77.09%。
- 动态调整:ReviewFilter 会根据验证结果动态调整审查规则,移除生成低价值评论的规则,确保审查标准与企业实践动态对齐。
ReviewFilter 的动态性
- 规则更新:ReviewFilter 会根据验证结果动态调整审查规则,移除生成低价值评论的规则。
- 性能优化:通过实验优化推理模式,ReviewFilter 在保持高准确率的同时,确保推理时间较短,提高系统效率。
ReviewFilter 的输出处理
- 评论聚合:ReviewFilter 的输出结果会经过评论聚合机制处理,使用基于 Doubao-embedding-large 的向量化方法计算评论相似度,从每组相似评论中随机保留一条,有效避免开发者被过多重复信息打扰。
- 结果展示:最终的审查结果会以结构化的方式展示,包括问题类别、代码位置、解释和建议,便于开发者快速定位和修复问题。
ReviewFilter 通过严谨的验证机制和动态调整,确保生成的审查评论具有高准确性和实用性,有效提升了 BitsAI-CR 系统的整体性能。