亚马逊AWS官方博客

提升研发运维效能:Pacvue 泊客电商的 GenAI 技术实践

关于 Pacvue 泊客电商

Pacvue 是唯一一个为整个市场提供统一商务和零售媒体平台的解决方案——从小型到中型卖家,直至企业品牌都能受益。自 2018 年以来,Pacvue 的使命一直是在不断发展的商务和零售媒体格局中,提供领先的解决方案,以加速品牌的成功。

Pacvue 泊客电商官网

Amazon Bedrock 和 Anthropic Claude 模型

Amazon Bedrock 是一项完全托管的服务,通过单个 API 提供来自 AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI 和 Amazon 等领先人工智能公司的高性能基础模型(FM),以及通过安全性、隐私性和负责任的人工智能构建生成式人工智能应用程序所需的一系列广泛功能。使用 Amazon Bedrock,您可以轻松试验和评估适合您的使用案例的热门 FM,通过微调和检索增强生成(RAG)等技术利用您的数据对其进行私人定制,并构建使用您的企业系统和数据来源执行任务的代理。由于 Amazon Bedrock 是无服务器的,因此您无需管理任何基础设施,并且可以使用已经熟悉的 AWS 服务将生成式人工智能功能安全地集成和部署到您的应用程序中。

Claude 使用 Constitutional AI 和无害训练等技术创建,在思考对话、内容创建、复杂推理、代码审查、代码生成、代码分析和优化、错误检测和调试、文档生成、代码重构和维护等方面表现卓越。Claude 3.5 Haiku 是一款高效快速的优质模型;Claude 3 Opus 适用于处理复杂任务,表现出色;Claude 3.5 Sonnet v2 是 Anthropic 最智能、最先进的模型,在各类任务和评估中展现卓越性能,整体优于 Claude 3 Opus。

Pacvue 泊客电商的 GenAI 技术实践

Claude-Powered Code Reviewer For GitHub Repositories

业务场景

Pacvue 泊客电商作为电商技术领域的创新先锋,充分利用 GitHub 平台进行代码托管、协作开发、代码审查以及持续集成/持续部署(CI/CD)等关键开发流程。秉承持续创新的理念,Pacvue 泊客电商的开发与运维团队一直致力于通过前沿技术提升整体研发运维效能。

为了进一步提升代码审查的效率和代码质量,Pacvue 泊客电商的开发与运维团队决定引入 Amazon Bedrock 上的 Claude 模型,开启 GenAI 技术在 GitHub 代码审查中的实践之路。

技术需求

  • Code Review Result 需要提供有价值的代码洞察,能识别 bug 和安全漏洞,时间效率和内存效率问题,并给出修改建议;
  • 对每个 Pull Request/Repo 进行量化评分,对每个 Pull Request/Repo 中修改的文件进行量化评价,便于跟踪和管理;
  • 将评分结果与 CI/CD 流程结合,实现代码质量的自动化管理;
  • GitHub 仓库必须通过白名单控制,只允许指定的 IP 才能连接,并结合 GitHub Access Token 进行访问;
  • Code Review 需要支持 Pull Request 级别和整个代码仓库级别的 Review;
  • 支持 Java、Python、JavaScript 等编程语言的 Code Review,确保工具的广泛适用性;
  • 开发人员和开发经理可以便捷的查看 Code Review Task 状态与结果,提高团队协作效率;
  • 对于整个代码仓库级别的 Review,需要有 Review Summary,以快速了解代码库的整体状况。

技术方案

经过与亚马逊云科技快速原型团队和解决方案架构师团队讨论和研究,Pacvue 泊客电商开发与运维团队决定使用如下架构:

Claude-Powered Code Reviewer 架构示意图

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

①通过 GitHub Webhook/Action 自动探测开发人员针对代码仓库的 Pull Request event

②调用 Codereview Post API 提交 Code Review Task

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

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

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

⑥ 获取 Pull Request diff file 等信息

⑦将 Code Review message 放入 Amazon SQS

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

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

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

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

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

⑬ 用户发起代码审查结果查询给 Amazon EC2(通过nginx Host UI)

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

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

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

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

主要挑战

保障 Code Review 过程的安全

  • GitHub 仓库通过白名单控制,只允许 VPC 中的 NAT Gateway 固定的 IP 地址和端口与 GitHub 仓库交互。
  • 通过 Amazon Bedrock 使用 Claude 更加安全。Amazon Bedrock 处理的任何客户内容都会被加密。用户输入和模型输出不会与任何模型提供商共享。AWS 和第三方模型提供商不会使用 Amazon Bedrock 的任何输入或输出来训练 Amazon Titan 或任何第三方模型。使用了 AWS PrivateLink 建立从 Amazon VPC 到 Amazon Bedrock 的私有连接,而无需将数据暴露给互联网流量。
  • Amazon Bedrock 提供多种支持安全和隐私要求的功能。Amazon Bedrock 符合服务和组织控制(SOC)、国际标准化组织(ISO)、健康保险流通与责任法案(HIPAA)等常见合规标准,客户可以在符合《通用数据保护条例》(GDPR)的情况下使用 Amazon 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-Powered Code Reviewer 支持多种编程语言,包括 Go、Python、Java、C++、JavaScript、C#、Ruby 等,并且可以通过 Amazon lambda 环境变量进行控制,只 review 指定类型的代码文件。除了支持对单个 Pull Request 的 review,还支持对整个代码仓库的 review 以及对 review 结果的总结。

Code Review 结果是否有价值

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

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

  • Pull Request 级别的扫描

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

"""You are a code review master. Firstly, You should figure out the code type, and then think step by step as a code review master of this code type. Please 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.
    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.
    And you should score the complete code, the best code scores 100, and the worst code socore 0.
    Here is the complete code in file of the pull request:
    <code>
    {file_content}
    </code>

    Below is the code diff of the pull request:
    <diff>
    {file_diff}
    </diff>
    **Respond in valid XML format with the tags as "review_score", "review_result"**. 
    Here is one   sample:
    <review_score>
    30
    <\review_score>
    <review_result>
    "这个代码中存在一个明显的 bug"
    <\review_result>
    请使用中文回答
    
    """
PowerShell

一段含有 bug 的 Java 代码如下:

import java.util.ArrayList;
import java.util.List;

public class MemoryLeakExample {
    // 静态集合,用于缓存对象
    private static final List<Object> cache = new ArrayList<>();

    public static void main(String[] args) {
        while (true) {
            // 每次循环创建一个新对象并添加到缓存中
            Object obj = new Object();
            cache.add(obj);

            // 打印当前缓存的大小
            System.out.println("Cache size: " + cache.size());

            // 休眠一段时间,避免过快地填满内存
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
PowerShell

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

Here is my code review response in Chinese and XML format:

<review_score>
20
</review_score>

<review_result>
这段代码存在严重的内存泄漏问题,可能导致应用程序最终耗尽内存而崩溃。主要问题如下:

1. 内存泄漏:
   代码中使用了一个静态的ArrayList来存储对象,但没有任何移除机制。在无限循环中不断添加新对象,会导致内存持续增长直到耗尽。

   ```java
   private static final List<Object> cache = new ArrayList<>();
   
   while (true) {
     Object obj = new Object();
     cache.add(obj);
     // 没有移除机制
   }
   ```

2. 无限循环:
   main方法中的while(true)循环会一直运行,没有退出条件。

3. 线程睡眠处理不当:
   虽然有try-catch块处理InterruptedException,但只是打印堆栈跟踪,并未采取任何有意义的操作。

改进建议:

1. 使用有界集合如LinkedHashMap,并实现LRU(最近最少使用)缓存策略:

   ```java
   private static final int MAX_CACHE_SIZE = 1000;
   private static final Map<Integer, Object> cache = new LinkedHashMap<Integer, Object>(MAX_CACHE_SIZE, 0.75f, true) {
       @Override
       protected boolean removeEldestEntry(Map.Entry<Integer, Object> eldest) {
           return size() > MAX_CACHE_SIZE;
       }
   };
   ```

2. 添加退出条件或使用定时器来控制程序运行时间。

3. 正确处理InterruptedException,例如退出循环或重新设置线程的中断状态。

4. 考虑使用Java的软引用(SoftReference)或弱引用(WeakReference)来允许垃圾收集器在需要时回收缓存的对象。

这些改进可以显著提高代码的健壮性和性能,避免内存泄漏问题。
</review_result>
PowerShell

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

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

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

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

Pull Request 级别的扫描运行效果截图如下:

Pull Request 扫描结果 1

针对每个 Pull Request 提供量化评分,汇总 Pull Request 中每个修改文件的评分(0 分代表最差的代码,100 分代表最好的代码),计算出每个 Pull Request 中文件最低分,平均分,最高分,开发人员可以迅速通过量化指标衡量 Pull Request 的代码质量。

Pull Request 扫描结果 2

发现 Pull Request 中文件最低分,平均分比较低,开发人员点击链接即可获得每个文件的修改建议并及时修改代码,从而提升代码质量,减少 bug 的产生,从而减少生产问题的出现。

  • 代码仓库级别的扫描

Claude 对仓库中每个文件进行 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.**
    请使用中文回答,回答要简洁
    
    """
PowerShell

Claude 对仓库中所有文件的 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 GitHub 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>
    ...
 请使用中文回答
    """
PowerShell

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

代码仓库 Review List

代码仓库 Review  Summary

代码仓库每个文件 Review Result

代码仓库 Review  Summary 可帮助开发经理快速掌握整理代码的质量,代码仓库每个文件的 Review Result。

UI 的设计和功能

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

方案优势

  • 接近实时生成的 Code Review Result 提供有价值的代码洞察,能识别 bug 和安全漏洞,时间效率和内存效率问题等,并给出解释与优化后的代码示例,代码进行量化评分,将评分结果与 CI/CD 流程结合,可以实现代码质量的自动化管理;
  • 与传统人工 Code Review 相比,极大地降低了人工成本和时间成本,并且适配多种编程语言和自然语言;
  • 与传统基于规则的静态扫描工具相比,Claude 可以理解代码,并提供更加深刻和详细的代码洞察;
  • 扩展性好,只需要修改环境变量就可以控制 review 的代码种类;
  • Review Prompt 简单,易于客户化修改;
  • 使用 REST API 提交 Code Review Task,方便与 CI/CD 集成;
  • 独立的 Code Review Portal 方便查看 Review History 以及与即时通信系统(如飞书、企业微信、钉钉、Slack)集成;
  • 无需迁移代码仓库,只需提供访问 API 即可。

系统集成与效果展示

GitHub CI/CD 集成,实现 Diff 自动评审

CI/CD 设置如下:

配置 GitHub Action 工作流,当每次有 PR 被创建时会自动触发这个工作流

GitHub Action 工作流配置

通过浏览器插件可视化展示文件层面评审结果

使用浏览器插件可以很方便地向 GitHub 页面注入自定义的内容,核心逻辑如下:

function appendCommentToElement(ele, cmt) {
  const eId = cmt.file_name.replace(/\//g, '_').replace(/\./g, '_');
  if (document.getElementById(eId)) {
    return;
  }
  const fileContent = ele.querySelector('.js-file-content');
  if (!fileContent) {
    return;
  }
  fileContent.style.display = 'flex';
  fileContent.children[0].style.width = '70%';
  const res = document.createElement('div');
  res.id = eId;
  res.style.width = '30%';
  res.className = 'comment-body markdown-body js-comment-body soft-wrap css-overflow-wrap-anywhere user-select-contain d-block'
  if (cmt.comment) {
    const comment = marked.parse(cmt.comment);
    if (cmt.score && cmt.score < currentSettings.codeReviewEnhancement.warningThreshold) {
      res.innerHTML = `
            <div style="padding:14px;" class="glowing-border">
                <p>
                  ${comment}
                </p>
            </div>
        `;
    } else {
      res.innerHTML = `
            <div style="padding:14px;">
                <p>
                  ${comment}
                </p>
            </div>
        `;
    }
    fileContent.appendChild(res);
  }
}
PowerShell

浏览器插件展示文件层面评审结果示例图

通过浏览器插件可视化展示 PR 层面评审总结结果

PR 层面的评审实际上是将每个变更文件的评审结果进行一次归纳,并将本次审查的评分分布情况通过图表展示出来:

async function checkAndAppendSummary() {
  if (document.getElementById('summary')) {
    return
  }
  const discussionBucket = document.getElementById('discussion_bucket');
  if (discussionBucket && currentSummary && currentSummary.warnings && Object.keys(currentSummary.warnings).length > 0) {
    const res = document.createElement('div');
    res.id = 'summary';
    res.style.marginBottom = 'var(--stack-gap-normal)';
    res.className = 'comment-body markdown-body js-comment-body soft-wrap css-overflow-wrap-anywhere user-select-contain d-block';
    const minScore = Math.min(...currentComments.map((comment) => comment.score));
    if (minScore > 0 && minScore < currentSettings.codeReviewEnhancement.warningThreshold) {
      res.className += ' glowing-border';
    } else {
      res.className += ' summary-border';
    }
    var content = '';
    const currentUrl = window.location.href;
    for (const [file, comments] of Object.entries(currentSummary.warnings)) {
      if (comments.length === 0) {
        continue;
      }
      const hash = await sha256(file);
      content += `[${file}](${currentUrl}/files#diff-${hash}) \n\n ${comments.join('\n')} \n\n`;
    }
    content = content.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    content = marked.parse(content);
    res.innerHTML = `
    <div style="display: flex;">
     <div style="width: 70%; display: flex; flex-direction: column;">
      <div style="font-size: 1.25em; font-weight: var(--base-text-weight-semibold, 600); padding-bottom: var(--stack-gap-normal);">AI Review Summary</div>
      <div>${content}</div>
     </div>
     <div style="width: 30%; height: 100%;">
      <div style="display: flex; flex-direction: column; height: 240px;">
        <div style="font-size: 1.25em; font-weight: var(--base-text-weight-semibold, 600); padding-bottom: var(--stack-gap-normal);">Score Distribution</div>
        <div id="chartContainer"></div>
      </div>
     </div>
    </div>
    `;
    discussionBucket.insertBefore(res, discussionBucket.firstChild);
    showCharts();
  }
}
PowerShell

PR 进行 review 之后的总结图

支持手动按需触发单个文件评审

当我们查看代码仓库里的某个文件时,如果想让 AI 快速给出总结或者分析,可以使用插件增强的功能:

支持手动按需触发完整文件评审

PMD 这类基于规则的 Review 对比,可以提供更深层次的代码洞察

PMD 是一种静态代码分析工具,主要用于检测代码中的潜在问题。它基于预定义的规则集工作,能够快速识别代码中的常见问题,如未使用的变量、重复代码、代码风格违规等。由于其规则驱动的特性,PMD 的执行速度非常快,适合集成到 CI/CD 管道中,帮助开发者在早期发现并修复问题。此外,PMD 支持规则的自定义,用户可以根据项目需求调整或扩展规则集,使其更贴合实际开发场景。然而,PMD 的局限性在于它主要关注代码的表面问题,难以发现复杂的逻辑错误或设计缺陷。虽然它支持多种编程语言,但每种语言的规则需要单独配置,这必然会增加一定的维护成本。

下图是我们使用 PMD 扫描后的一个结果片段:

PMD 扫描后结果片段

与规则驱动的工具不同,AI 大模型可以分析代码的逻辑结构,发现潜在的设计问题、性能瓶颈甚至安全漏洞。它的优势在于能够结合上下文提供更准确的建议,并且通过不断升级模型,逐步优化其审查能力。此外,AI 大模型通常支持多种编程语言和框架,具有较强的灵活性。另一方面我们也看到,AI 大模型的资源消耗较大,并发调用比较大的情况下分析速度相对较慢,可能不适合需要快速实时反馈的场景。

静态扫描和 AI 大模型在代码审查中各有优势。PMD 一类的工具适合用于快速检测代码中的常见问题,尤其是在需要频繁集成的开发环境中;而 AI 大模型则更适合用于深度分析,帮助发现复杂的逻辑或设计问题。在实际开发中,可以结合两者的优势:使用 PMD 进行快速扫描,确保代码符合基本规范;同时利用 AI 大模型进行更深层次的审查,以提升代码的整体质量。这种组合方式能够兼顾效率与深度,为开发者提供更全面的代码质量保障。

业务成果

Pacvue 泊客电商开发与运维团队通过与亚马逊云科技合作,将 Claude-Powered Code Reviewer 在一个月内从 POC 到生产上大规模使用,覆盖了数百个 GitHub 仓库。使用之后,Code Review 时间减少 70%,提高了开发效率,代码质量显著提高,bug 减少 30%,减少了生产问题,提高了生产效率,降低了运营成本。


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

参考链接

Claude 3-Powered Code Reviewer:https://aws.amazon.com/cn/blogs/china/genai-technology-practice-of-yostar-operation-and-maintenance-team-claude-3-powered-code-reviewer

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

AWS Bedrock FAQ:https://aws.amazon.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://aws.amazon.com/cn/blogs/china/anthropics-claude-3-haiku-model-is-now-available-in-amazon-bedrock/

本篇作者

唐雷明

泊客电商中台技术负责人,拥有逾 10 年的技术研发和管理经验。专注于中台业务和技术能力建设,致力于通过平台化、组件化和服务化落地中台战略,提升业务响应速度,降低研发和运维成本,赋能业务端快速迭代创新。

江正贯

泊客电商的运维负责人,拥有超过6年多的行业运维经验,涵盖互联网、医疗和电商领域。专注于系统架构、自动化和平台化建设,致力于实现高可用性和业务连续性。不断优化技术和流程,以确保基础设施的高效、安全运行,提升系统的稳定性和架构韧性。

赵才

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

彭金冬

亚马逊云科技解决方案架构师,负责电商行业客户的架构设计和技术支持。

田然

亚马逊云科技快速原型团队客户经理。关注人工智能、大数据及现代化应用领域的创新实践与落地应用。

姬军翔

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