每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/
2023年11月,GitHub宣布推出代码扫描自动修复功能,借助AI技术为用户代码库中的安全漏洞提出修复建议。该文章深入探讨了自动修复的内部工作机制以及用于测试和迭代的评估框架。
github
代码扫描自动修复是什么?GitHub代码扫描通过分析仓库代码,找出安全漏洞和其他错误。扫描可以根据计划或特定事件(例如,推送至分支或打开拉取请求)触发。当发现问题时,会向用户显示警告。代码扫描可以与第一方或第三方警报工具配合使用,包括开源和私有工具。GitHub提供了一个由CodeQL支持的第一方警报工具,CodeQL是其语义代码分析引擎,允许像查询数据一样查询代码库。GitHub的内部安全专家开发了一套丰富的查询,可以跨多种流行语言和框架检测安全漏洞。在此检测能力的基础上,代码扫描自动修复通过建议AI生成的修复方案,进一步提升了安全性。在首次迭代中,自动修复针对拉取请求中检测到的CodeQL警告启用,首先支持JavaScript和TypeScript警告。它以自然语言解释问题及其修复策略,直接在拉取请求页面显示建议的修复方案,并允许开发者提交、忽略或编辑这些建议。
自动修复背后的基本思想简单明了:当诸如CodeQL之类的代码分析工具发现问题时,GitHub会将受影响的代码和问题描述发送给大型语言模型(LLM),请求它提出代码编辑建议,以修复问题而不改变代码功能。文章接下来深入讨论了构建LLM提示、处理模型响应、评估功能质量以及向用户提供服务的细节和微妙之处。
自动修复提示是技术的核心,GitHub向LLM发出请求,通过LLM提示表达。CodeQL静态分析检测到漏洞,生成警告,引用问题代码位置及任何其他相关位置。例如,对于SQL注入漏洞,警告会标记使用不受信任数据构建数据库查询的位置,并包括一个或多个流程路径,显示不受信任数据如何到达该位置而未经消毒。GitHub从警告中提取信息,构建LLM提示,然后要求模型展示如何编辑代码以修复漏洞。
GitHub采用严格的格式描述模型输出,以便自动处理。模型输出Markdown,包含:
- 详细的自然语言指令,用于修复漏洞。
- 需要的代码编辑的完整规格,按照提示中定义的格式。
- 如果适用,应添加到项目中的依赖项列表。
GitHub将自然语言解释与代码扫描警告一起展示给用户,随后是由代码编辑和添加的依赖项构成的差异补丁。用户可以审查建议的修复方案,必要时编辑和调整它,并将其作为提交应用于他们的拉取请求。
为了支持现实世界的复杂性并克服LLM的限制,GitHub采用了仔细的提示制作和后处理启发式规则。文章还概述了选择向模型展示的代码、添加依赖项、指定代码编辑的格式以及克服模型错误的方法。
通过广泛的自动化测试工具,GitHub能够对其提示和启发式规则进行迭代改进,同时最小化LLM计算成本。这种严谨的数据驱动开发方法使GitHub能够在同时将LLM计算需求降低六倍的情况下,将成功率提高了三倍。
用户体验通过增强代码扫描拉取请求体验,将有用的修复展示给用户。用户现在可以看到建议的修复方案,这可能包括多个文件中的建议更改,也可能超出拉取请求差异的范围。还会显示修复的自然语言解释。用户可以直接将建议的修复提交到拉取请求,或者在本地IDE或GitHub Codespace中编辑建议。
随着GitHub将代码扫描自动修复测试版推广给越来越多的用户,它正在收集反馈,修复小问题,并监控指标,以确保其建议实际上对野外的安全漏洞有用。与此同时,GitHub正在将自动修复扩展到更多语言和用例,并改进用户体验。