亚马逊AWS官方博客

悠星运维团队的 GenAI 技术实践:Claude 3-Powered Code Reviewer

关于悠星

上海悠星网络科技有限公司成立于 2014 年,总部位于中国上海,并于日本东京和韩国首尔设有办事处。自成立以来,悠星致力于成为全球领先的游戏研发、产品发行、战略投资及 IP 管理商。

自 2017 年起,悠星网络先后成功发行了《碧蓝航线》、《明日方舟》及《蔚蓝档案》等多款高知名度产品,在日、韩、欧美等地区屡创佳绩;为了给玩家带来不止于游戏的体验,悠星先后成立了 2D 动画公司 Yostar Pictures 与 3D 动画公司 ARCUS,力求提供多样化、不同形式的内容供玩家享受。

2023 年,悠星网络进一步拓宽业务区域,于中国大陆发行了《蔚蓝档案》简体中文版。未来,悠星将继续秉承稳扎稳打的发展路线,维持精准独到的战略眼光,致力于将优质游戏带给全球玩家,提供最本真的游戏乐趣。

悠星官网

Amazon Bedrock 和 Claude 3 模型

Amazon Bedrock 是一个完全托管的服务,通过单一 API 为头部 AI 公司如 AI21 Labs、Anthropic、Cohere、Meta、Stability AI 提供高性能的基础模型选择,以及构建具有安全性、隐私性和负责任 AI 的生成式 AI 应用程序所需的广泛功能。Claude 3 模型基于 Anthropic 公司对于创建可靠、可解释和可控制的 AI 系统的研究。

Claude 3 使用 Constitutional AI 和无害训练等技术创建,在思考对话、内容创建、复杂推理、代码审查、代码生成、代码分析和优化、错误检测和调试、文档生成、代码重构和维护等方面表现卓越。Claude 3 Haiku,这是速度最快、最紧凑的模型,可实现近乎即时的响应;Claude 3 Sonnet,这是平衡了技能和速度的理想模型;Claude 3 Opus,这个模型最智能,可在处理高度复杂的任务时提供顶级性能。

悠星运维团队的 GenAI 技术实践:Claude 3-Powered Code Reviewer

业务场景

在现代软件开发中,代码审查(Code Review)是确保代码质量和项目成功的关键步骤。悠星网络科技有限公司(Yostar)作为国内顶尖的游戏开发和发行公司,始终致力于技术创新和高效运维。为了进一步提升代码审查的效率和质量,悠星运维团队引入了 Amazon Bedrock 基础模型 Claude 3 语言模型,开启了 GenAI 技术在代码审查中的实践之路。

悠星运维团队认为在游戏开发过程中,代码审查(Code Review)不仅是一个技术流程,更是提升团队协作、知识共享和项目成功率的重要手段。基于大模型 Claude 3 系统的代码审查流程,游戏公司可以提高代码质量、降低项目风险、促进团队协作和开发人员的成长,从而在激烈的市场竞争中保持领先地位。

技术需求

  • Code Review Result 需要提供有价值的代码洞察,能识别 bug 和安全漏洞,时间效率和内存效率问题等
  • GitLab 仓库必须通过白名单控制,只允许指定的 IP 才能连接,并结合 GitLab Access Token 进行访问
  • 方便通过 GitLab Webhook 与 CI/CD 进行集成
  • Code Review 需要支持 commit 级别和整个代码仓库级别的 Review
  • 支持 Go、Python、JavaScript 等编程语言的 Code Review
  • 开发人员和开发经理可以便捷地查看 Code Review Task 状态与结果
  • 对于整个代码仓库级别的 Review,需要有 Review Summary

技术方案

经过与亚马逊云科技快速原型团队,解决方案架构师团队和技术客户经理团队讨论和研究,悠星运维团队决定使用如下架构:

Claude 3-Powered Code Reviewer 架构示意图

出于安全考虑,尽量避免数据暴露于互联网,我们将所有 Amazon Lambda 函数放在一个 VPC 中,通过 NAT Gateway 访问互联网,通过 VPC Endpoint Gateway 访问 DynamoDB 和 S3,通过 VPC Endpoint Interface 访问 Bedrock Claude 3 和 Amazon SQS。

① 通过 GitLab Webhook 自动探测开发人员针对代码仓库的 Push event

② 调用 Codereview Post API 提交 Code Review Task

③ 检查 Code Review Task 中是否有需要 review 的代码文件,如果不存在直接 return “No file need review”,如果存在,则进入④,⑤

④ 将 Code Review 任务状态存储到 Amazon DynamoDB 中

⑤ 触发 Lambda 异步处理,根据文件拆分细化任务到 Amazon SQS 中,白名单设置(处理的文件尾缀:.go/.py/.java 等,Lambda 的环境变量)

⑥ 获取 commit diff file 等信息

⑦ 将 Code Review message 放入 Amazon SQS

⑧ 更新 Amazon DynamoDB 中需要处理的文件数目

⑨ Amazon Lambda 订阅 Amazon SQS,根据 Amazon SQS 中的 message 来 review code

⑩ 将需要 review 的代码通过 Amazon Lambda 并发提交给 Claude 3 进行 review

⑪ 将 Claude 3 返回的结果存储到 S3 中的文件中

⑫ 更新 Amazon DynamoDB 中需要处理的文件数目和已处理文件数目

⑬ 用户发起代码审查结果查询给 Amazon Amplify

⑭ Amazon Amplify 通过 Amazon API Gateway 发送查询请求

⑮ 根据 ReviewId 等信息查询当前代码审查的状态与结果

⑯ 根据提交的 ReviewId,查询 Amazon DynamoDB 中任务的状态

⑰ 读取 S3 的内容生成 Pre-signed URL 返回给用户

主要问题

Code Review 过程中的安全问题

  • GitLab 仓库通过白名单控制,只允许 VPC 中的 NAT Gateway 固定的 IP 地址和端口与 GitLab 仓库交互
  • 通过 Amazon Bedrock 使用 Claude 3 更加安全。Amazon Bedrock 处理的任何客户内容都会被加密。用户输入和模型输出不会与任何模型提供商共享。AWS 和第三方模型提供商不会使用 Amazon Bedrock 的任何输入或输出来训练 Amazon Titan 或任何第三方模型。使用了 AWS PrivateLink 建立从 Amazon VPC 到 Amazon Bedrock 的私有连接,而无需将数据暴露给互联网流量
  • Amazon Bedrock 提供多种支持安全和隐私要求的功能。Bedrock 符合服务和组织控制(SOC)、国际标准化组织(ISO)、健康保险流通与责任法案(HIPAA)等常见合规标准,客户可以在符合《通用数据保护条例》(GDPR)的情况下使用 Bedrock。Amazon Bedrock 包含在 SOC 1、2、3 报告的范围内,使客户能够深入了解我们的安全控制措施。我们通过对我们的 AWS 控制进行广泛的第三方审核来证明合规性。Amazon Bedrock 是符合 ISO 9001、ISO 27001、ISO 27017、ISO 27018、ISO 27701、ISO 22301 和 ISO 20000 标准的 AWS 服务之一。Amazon Bedrock 已获得 CSA 安全信任保障和风险(STAR)2 级认证,该认证验证 AWS 云产品的最佳实践使用情况和安全状况。

支持的编程语言类型与扫描方式

Claude 3-Powered Code Reviewer 支持多种编程语言包括 Go、Python、Java、C++、JavaScript、C#、Ruby 等,并且可以通过 Amazon Lambda 环境变量进行控制,只 review 指定类型的代码文件。除了支持对单个 commit 的 review,还支持对整个代码仓库的 review 以及对 review 结果的总结。

Code Review 结果是否有价值

Claude 3 在 Code 方面的能力参考下图中红色方块部分:

经过测试发现,Claude 3 可以通过简单的 Prompt 提供有价值的代码洞察,用户可以根据个性化需求修改 Prompt,下面是测试示例:

  • Commit 级别的扫描

Claude 3 对每个 commit 中每个修改的文件进行 review,参考 Prompt 如下:

"""You are a Code Review master. Please provide a concise summary of the bug found in the code, describing its characteristics, location, and potential effects on the overall functionality and performance of the application.
    Also provide your code suggestion if there is a more time efficient or memory efficient way to implement the same functionality.
    I would appreciate any feedback you can provide to help me improve my coding skills. Please let me know if you need any clarification or additional context about the code changes.
    Important: Include block of code / diff in the summary.

    Here is the complete code in file of the commit:
    <code>
    {file_content}
    </code>

    Below is the code diff of the commit:
    <diff>
    {file_diff}
    </diff>

    请使用中文回答
    
    """

一段含有 Bug 的 python 代码如下:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for num in numbers:
    if num % 2 == 0:
        numbers.remove(num)

print(numbers)

通过 commit 提交代码后,Code Review 结果如下:

在提供的代码中,存在一个严重的 bug 和安全漏洞。这个问题的特点如下:

在提供的代码中,存在一个严重的 bug 和安全漏洞。这个问题的特点如下:

1. 位置: 在 `for` 循环中,当遍历列表 `numbers` 时,
通过 `numbers.remove(num)` 来删除元素。

2. 问题描述: 在遍历列表的同时修改列表的大小会导致意外的行为。
当某个偶数元素被删除后,列表的长度会减小,导致后续的索引发生变化。
这会导致一些元素被跳过,从而无法完全删除所有的偶数元素。

3. 潜在影响: 这个 bug 会导致应用程序的功能和性能受到严重影响。
它可能会导致数据丢失或不一致,并且可能会引发其他未预料的问题。

为了解决这个问题,我建议使用一种更加高效和安全的方法来删除列表中的偶数元素。
以下是一个更好的实现方式:

```python
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_numbers = [num for num in numbers if num % 2 != 0]
print(new_numbers)
```

这种方法使用了列表推导式,它更加简洁、高效和安全。
它创建了一个新的列表 `new_numbers`,
其中只包含原始列表 `numbers` 中的奇数元素。
这种方法不会修改原始列表,因此不会出现遍历和修改列表大小的问题。

这种实现方式的优点如下:

1. 时间效率更高: 列表推导式的时间复杂度为 O(n),
而原始代码的时间复杂度为 O(n^2),因为需要遍历列表两次(一次用于删除,一次用于打印)。

2. 内存效率更高: 原始代码在删除元素时会修改原始列表,
这可能会导致内存碎片化和性能下降。而列表推导式创建了一个新的列表,
不会对原始列表造成任何影响。

总的来说,这个代码修改建议可以帮助你提高代码的质量、可读性和性能。
如果你有任何其他问题或需要进一步的解释,请随时告诉我。

Claude 3 可以在 10 秒内生成上面 code review 结果,不难看出 Claude 3 找到了 bug 位置,并且对 bug 进行描述,说明了潜在影响,并且给出了一个时间效率更高和内存效率更优秀的实现方式。

开发人员可以快速根据 review result 对 bug 进行修复,同时提升自身开发技能,从而减少 bug 数目,减少生产问题的产生。

相较于传统的人工 code review 方式,Claude 3-Powered Code Reviewer 大大地降低了 code review 的时间成本和人工成本,并且精通多种编程语言和自然语言。

相较于传统的基于规则扫描方式,Claude 3-Powered Code Reviewer 可以理解代码,并且给出更加深刻和详细的代码洞察。

Commit 级别的扫描运行效果截图如下

Commit 扫描结果

  • 代码仓库级别的扫描

Claude 3 对仓库中每个文件进行 Review,参考 Prompt 如下:

"""You are a code review master. Analyze the code 
    <code>
    {file_content}
    </code>
    and provide a concise summary of the bug and vulnerability issue found in the code, describing its characteristics, location, and potential effects on the overall functionality and performance of the application.
    Also provide your code suggestion if there is a more time efficient or memory efficient way to implement the same functionality.
    If there is no bug, just reply "没有发现bug" **Do not write explanations.**
    请使用中文回答,回答要简洁
    
    """

Claude 3 对仓库中所有文件的 Review 结果进行总结,参考 Prompt 如下:

"""You are a code review result summary master. Please tell me the total number of bug issues and the number of vulnerability issues in the GitLab reposity.
And list the whole file path accordingly.

    Here is the review result of each file in the reposity:    
    <file_name>
    {file_name}
    </file_name> 
    <file_review_result>
    {file_review_result}
    </file_review_result>
    ...
 请使用中文回答
    """

代码仓库级别的扫描运行效果截图如下

代码仓库 Review  Summary

代码仓库每个文件 Review Result

Runtime Quotas

方案可以通过 Lambda 环境变量控制使用 Claude 3 Opus,Sonnet 和 Haiku,用户可以根据实际需求选择最适合自己的模型。在按需使用场景下的 Claude 3  Runtime Quotas 如下:

Claude 3 Opus,Sonnet 和 Haiku Runtime Quotas

Review History By Claude 3 Haiku

Claude 3 Haiku,这是速度最快、最紧凑的模型,从上图 Review History 图片中可以看出,对于有 47 个文件的代码仓库整体 Review Task 可以在 18s 内完成,对于单个 commit Review Task 最低可以在 8s 内完成。

UI 设计

  • 使用 Amplify 托管 React UI,UI 层负责实现本方案中需要展示的代码审核 Portal、Review 页面嵌入、URL 参数跳转等功能。UI 页面将 S3 的地址生成 Per-sign URL,通过 ifream 嵌入并最终展现
  • 获取 Review 列表页面的信息,支持分页,并且可以按 Project,Branch,ScanScope,CommitId 进行检索
  • 支持点击 Url 直接定位指定 Project、Branch、CommitId 的 review 记录,方便与即时通信系统(如飞书,企业微信,钉钉)集成,并自动刷新 Code Review Task 状态,待 Code Review Task 完成后点击 Review Id 字段即可获得 Code Review Result

方案优势

  • 接近实时生成的 Code Review Result 提供有价值的代码洞察,能识别 bug 和安全漏洞,时间效率和内存效率问题等,并给出解释与优化后的代码示例
  • 与传统人工 Code Review 相比,极大的降低了人工成本和时间成本,并且 Claude 3 精通多种编程语言和自然语言
  • 与传统基于规则的静态扫描工具相比,Claude 3 可以理解代码,并提供更加深刻和详细的代码洞察
  • 使用 Serverless 技术架构,按需付费,无固定成本,相比传统的静态扫描工具和人工 Code Review 成本更低
  • 扩展性好,只需要修改环境变量就可以控制 review 的代码种类
  • Review Prompt 简单,易于客户化修改
  • 使用 REST API 提交 Code Review Task 方便与 CI/CD 集成
  • 独立的 Code Review Portal 方便查看 Review History 以及与即时通信系统(如飞书,企业微信,钉钉)集成
  • 用户可以根据实际需求选择最适合自己的模型
  • 无需迁移 GitLab 仓库,只需提供访问 API 即可

业务成果

悠星运维团队通过与亚马逊云科技合作,将 Claude 3-Powered Code Reviewer 在一个月内从 POC 到生产上大规模使用,遍及数百个 GitLab 仓库。使用之后,Code Review 花费时间仅需原流程的 2% 左右,提高了开发效率,代码质量显著提高,降低了 bug 数量,减少了生产问题,提高了生产效率,降低了运营成本。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

参考链接

Large Language Models for Code Analysis: Do LLMs Really Do Their Job?:https://arxiv.org/abs/2310.12357

AWS Bedrock FAQ:https://thinkwithwp.com/cn/bedrock/faqs

Claude 3 for coding:https://claude3.pro/claude-3-opus-vs-gpt-4-for-coding

Claude docs:https://docs.anthropic.com/claude/docs

Claude Prompt Engineering Techniques:https://docs.google.com/presentation/d/1zxkSI7lLUBrZycA-_znwqu8DDyVhHLkQGScvzaZrUns/edit#slide=id.g288a92597fe_0_487

BotNet-Generator:https://github.com/JacobFischer/BotNet-Generator

llms-for-code-analysis:https://github.com/aseec-lab/llms-for-code-analysis

Claude 3: https://thinkwithwp.com/cn/blogs/china/anthropics-claude-3-haiku-model-is-now-available-in-amazon-bedrock

本篇作者

刘耸

悠星技术平台负责人,拥有逾 10 年游戏行业经验。从端游到手游项目,专注于游戏技术平台的研发与管理,涵盖运维、安全、信息化及大数据等多个关键部门。致力于推动平台标准化与自动化进程,通过提高效率和降低成本,确保为游戏运营提供更稳定和便捷的支持服务。

虞政栋

悠星运维负责人,拥有逾 10 年多业态运维经验。涉及互联网、音视频、游戏等相关行业,专注于系统架构、自动化、平台化、以及高可用性和业务连续的体系建设。致力于确保基础设施的高效、安全运行,通过不断优化技术和流程,提高系统稳定性和架构韧性。

赵才

亚马逊云科技快速原型解决方案架构师,专注于生成式 AI 相关应用创新与落地实施,曾就职于 AI 芯片公司负责大模型适配与性能优化,对大模型在云、边、端上的应用有深入的研究和丰富的经验。

李佳

亚马逊云科技快速原型解决方案研发架构师,主要负责微服务与容器原型设计与研发。

王宇

亚马逊云科技快速原型方案架构师,负责大前端领域的产品研究与交付。针对应用程序中所涉及的移动端、前端、BFF 层原型及交付等均有涉猎,曾主导过金融、零售与广告、企业应用、大数据、AI 等领域多个大型业务系统的交互设计与实现。

姬军翔

亚马逊云科技资深解决方案架构师,在快速原型团队负责创新场景的端到端设计与实现。

付小飞

西云数据企业服务经理,负责企业级客户架构及成本优化、技术支持等工作。深耕游戏、金融、汽车等行业多年,加入西云数据之前,为游戏行业资深解决方案架构师,并在存储、大数据及容器等领域拥有多年技术架构及支持经验。

谢意清

亚马逊云科技技术客户经理,负责企业级客户的架构设计、成本优化和技术支持等工作,支持多个知名游戏公司在全球的项目发行工作。

彭嘉

亚马逊云科技技术客户经理,负责企业级客户架构及成本优化、技术支持等工作,致力于游戏及金融等行业,在数据库、边缘计算及容器等领域拥有多年技术架构及支持经验。