写点什么

使用智能代理在亚马逊云科技无服务器架构上进行源代码分析

  • 2025-10-31
    山东
  • 本文字数:6348 字

    阅读完需:约 21 分钟

摘要

随着软件开发规模的不断扩大和代码复杂性的增加,传统的代码分析方法已经无法满足现代开发团队的需求。本文探讨了如何利用生成式人工智能代理(GenAI Agent)结合亚马逊云科技无服务器架构来构建高效、可扩展的源代码分析平台。我们通过多个基于生成式 AI 智能体的代码分析项目实施案例总结了在亚马逊云环境中部署智能代码分析解决方案的最佳实践和通用设计模式。

📢限时插播:无需管理基础设施,利用亚马逊技术与生态,快速集成与部署生成式 AI 模型能力。

✨ 精心设计,旨在引导您深入探索 Amazon Bedrock 的模型选择与调用、模型自动化评估以及安全围栏(Guardrail)等重要功能。

⏩快快点击进入《多模一站通 —— Amazon Bedrock 上的基础模型初体验》实验

构建无限, 探索启程!

背景

为什么需要使用智能代理进行代码分析?

在现代软件开发过程中,代码分析已成为保障软件质量、提升开发效率的关键环节。传统的静态代码分析工具虽然能够发现语法错误和基本的代码质量问题,但在以下方面存在明显不足:

  • 理解上下文的局限性:传统工具难以理解代码的业务逻辑和设计意图,无法提供深层次的架构建议。

  • 跨文件关联分析能力不足:现代应用通常由数百甚至数千个文件组成,文件间的依赖关系复杂,传统工具难以进行全局性的影响分析。

  • 缺乏智能化建议:传统工具主要基于预定义规则,无法根据具体场景提供个性化的优化建议。

  • 无法进行跨项目对比:传统工具无法实现项目之间的异同分析对比,无法判断项目抄袭。

智能代理的引入为解决这些问题提供了新的思路,基于大语言模型的 AI 代理具备以下优势:

  • 自然语言理解能力:能够理解代码注释、变量命名等语义信息

  • 上下文推理能力:可以分析代码间的逻辑关系和业务关联

  • 知识迁移能力:能够应用已有的编程最佳实践和设计模式理解代码架构和模式

  • 多模态分析能力:可以同时处理代码、文档、配置、图片文件等多种类型的信息

  • 代码总结分析分类能力:可以理解代码,快速代码实现进行总结,模块分类

代码分析的主要类型

根据分析目标和应用场景,代码分析可以分为以下几种类型:

  • 相似性分析:检测代码重复、抄袭或功能相似的模块,常用于知识产权保护和代码去重。

  • 质量评估:评估代码的可读性、可维护性、性能等质量指标,帮助开发团队提升代码标准。

  • 架构分析:分析系统架构的合理性,识别设计缺陷和优化机会。

  • 影响分析:评估代码变更对系统其他部分的潜在影响,降低变更风险。

技术挑战

构建智能代码分析平台面临以下主要技术挑战:

  • 计算资源需求:大型代码库的分析需要大量的计算资源,特别是使用大语言模型进行深度分析时。

  • 存储和访问:需要高效地存储和访问大量的源代码文件,同时保证数据安全性。

  • 并发处理:多个分析任务需要并发执行,要求系统具备良好的可扩展性。

  • 成本控制:代码分析属于低频异步场景,需要在保证并发扩展性时减少不必要的计算资源驻留。

  • 准确性保证:AI 模型存在不确定性,需要建立有效的质量控制机制。

  • 可观测性:多数代码分析流程较长,需要保证有效的可观测机制和日志追踪。

通用代码分析平台设计

基于多个实际项目的经验,我们总结出了一套通用的代码分析平台设计模式。该设计充分利用了亚马逊云科技无服务器架构的优势,实现了高可用、高扩展性和成本优化的目标。

分析任务触发机制

代码分析平台支持多种触发方式,以适应不同的使用场景:

API 触发:通过 RESTful API 接口主动发起分析任务,适用于集成到现有的开发工具链中。这种方式为用户提供了最大的灵活性,可以根据具体需求定制分析参数:如项目名称,版本,源代码地址等等。

{"app_name": "MyApplication","version": "1.0.0","s3_url": "s3://code-bucket/app.zip","analysis_type": "similarity_check","notification_email": "developer@company.com"}
复制代码

Git Webhook 触发:与 Git 仓库深度集成,在代码提交、合并请求或分支创建时自动触发分析。这种集成方式能够实现真正的 CI/CD 流水线自动化。

{"commitid": "abc123def456","project_web_url": "https://gitlab.example.com/project","branch": "feature/new-feature","scan_scope": "DIFF-MR","merge_request_id": "123","author_email": "developer@company.com"}
复制代码

触发器架构设计:

  • 使用 Amazon API Gateway 作为统一的入口点

  • Amazon Lambda 函数处理不同类型的触发请求

  • 使用 Amazon DynamoDB 记录触发历史和任务状态

此外,根据场景不同,还可以选择:

  • 定时触发:使用 Amazon EventBridge 定期执行代码分析任务,适用于周期性的代码质量检查和合规性审计。

  • 事件驱动触发:当代码文件上传到 Amazon S3 时自动触发分析流程,支持批量处理和增量分析。

代码存储

代码存储采用分层架构,兼顾性能、成本和安全性。这种设计模式在两个项目中都得到了验证,能够有效支持大规模代码分析的需求。

Amazon S3 对象存储层:

  • 原始代码存储:存储从 GitLab 下载或用户上传的 ZIP 格式代码包

  • 分析结果归档:存储 HTML 报告、JSON 数据文件和可视化图表

  • 版本管理:利用 S3 的版本控制功能管理代码历史,支持回溯分析

  • 生命周期管理:配置自动归档策略,将超过 30 天的数据转移到 IA 存储类别,90 天后转移到 Glacier

Amazon EFS 共享文件系统层:

  • 高性能访问:为 Lambda 函数提供低延迟的文件 I/O 操作

  • 并发支持:支持多个 Lambda 函数同时访问同一代码库,实现真正的并行分析

  • 动态扩展:根据实际使用量自动扩展存储容量,无需预先规划

  • POSIX 兼容:提供标准的文件系统接口,简化代码迁移和工具集成

代码存储工作流:

1、代码获取阶段:

  • 从 GitLab 仓库克隆代码或从 Amazon S3 下载 ZIP 包

  • 解压到 Amazon EFS 的临时工作目录(/mnt/efs/tasks/{task_id}/)

  • 验证文件完整性和格式合规性

2、预处理阶段:

  • 过滤不需要分析的文件(如二进制文件、依赖库)

  • 按文件类型和模块进行分类组织

  • 生成文件清单和依赖关系图

3、分析阶段:

  • 多个 Amazon Lambda 函数并发访问 EFS 中的代码文件

  • 每个函数处理特定的代码模块或文件类型

  • 实时写入中间结果到 EFS 临时目录

4、结果存储阶段:

  • 将最终分析结果上传到 Amazon S3 进行持久化存储

  • 清理 Amazon EFS 中的临时文件释放存储空间

  • 更新 Amazon DynamoDB 中的任务状态和文件路径

Amazon DynamoDB 元数据管理:

  • 任务状态跟踪:记录每个分析任务的详细状态信息

  • 文件路径索引:存储 S3 中分析结果的完整路径,便于快速检索

  • 性能指标:记录分析耗时、文件数量等关键指标用于优化

  • 错误日志:详细记录分析过程中的异常和错误信息

存储架构设计:

分析流程:Step Functions 状态机编排

分析流程采用 Amazon Step Functions 状态机进行编排,实现复杂业务逻辑的可视化管理,除了每个步骤自己的日志,状态机也会保存所有的步骤的执行日志,可以清楚的看到每个步骤的输入输出,所用时间,错误等,方便后续追踪。每个分析步骤都有明确的任务定义和输出产物,确保整个流程的可追溯性和可维护性。以下阶段只是示例,需要根据实际需求进行调整。

阶段一:预处理(Pre-process)

  1. 代码获取:从 GitLab 仓库克隆或从 S3 下载代码包

  2. 解压和验证:解压 ZIP 文件到 EFS 工作目录,验证文件完整性

输出产物:

  • json:文件清单和基本信息

  • json:项目基本元数据(包括 EFS 文件路径等信息)

阶段二:特征提取(Feature Extraction)

  1. 特征分析:读取特征文件(如 Android app 中的 xml 文件)了解项目的基本信息,如 package name,权限,第三方依赖,重要图片,表单等。

  2. 代码结构:扫描代码结构,代码文件路径,资源文件路径,配置文件路径。

  3. 模块分析:将主要代码文件按照模块分类,如登陆模块,广告模块,游戏引擎,第三方集成模块等。

  4. 模式识别:识别设计模式和架构模式。

输出产物:

  • json:整个项目的特征文件

  • json:整个项目的模块化分析

阶段三(代码 review):智能分析(Intelligent Analysis)

  1. 并行分析:多个 Lambda 函数并行处理不同更改

  2. 深度理解:AI 代理分析代码逻辑找到关联文件

  3. 问题识别:识别修改潜在的质量问题和安全风险已经修改对关联文件的影响

输出产物:

  • json:详细分析结果

  • json:发现的问题和建议

  • json:质量评分

阶段三(应用对比):对比分析(Similarity Analysis)

  1. 并行分析:多个 Lambda 函数并行处理不同模块代码相似度详细对比

  2. 深度理解:基于两个项目的特征文件进行架构,功能,权限,重要图片之间的对比

  3. 抄袭识别:识别同模块下的相似代码片段,进行相似度打分

输出产物:

  • md:基于项目的特征信息对比结果

  • md:按照模块进行代码对比的结果

阶段四:结果整合(Summary)

  1. 数据汇总:整合各模块的分析结果

  2. 报告生成:生成 HTML 格式的可视化报告

  3. 评分计算:计算综合质量评分

  4. 建议生成:基于分析结果生成改进建议

输出产物:

  • html:完整的分析报告

  • json:分析摘要

  • json:改进建议

流程控制特性:

  1. 错误处理:每个步骤都配置了重试机制和错误捕获

  2. 并发控制:Map 状态限制最大并发数避免资源过载

  3. 状态传递:使用 ResultPath 精确控制状态数据的传递

  4. 超时保护:为每个 Lambda 函数设置合理的超时时间

监控和日志:

  • 使用 CloudWatch 监控状态机执行情况

  • 记录每个步骤的执行时间和资源消耗

  • 在 DynamoDB 中存储详细的执行日志

  • 支持实时查询任务进度和状态

智能代理:Lambda 部署与 Strands Agent SDK

智能代理是整个平台的核心组件,部署在 Amazon Lambda 上,使用 Strands Agent SDK 进行开发。

Amazon Lambda 是一种无服务器的计算资源,Lambda 可以进行快速纵向扩展并且在不需要时缩减至零,适合代码分析的低频使用场景。

Strands Agent 是一个简单易用且可用于生产环境,代码优先的生成式 AI 代理(GenAI Agent)构建框架。其主要特点包括:

  • 简单的代理循环系统(agent loop),运行稳定且完全可定制。

  • 完整的可观测性、追踪功能,以及支持大规模运行代理的部署选项。

  • 支持来自多个提供商的多种不同模型。

  • 支持对话式、非对话式、流式和非流式:支持各种工作负载的所有类型代理。

  • 提供强大的工具,覆盖广泛的功能。

这种部署架构设计充分利用了无服务器计算的优势,实现了自动扩展和成本优化。

Lambda 部署架构:

函数配置:

  • 运行时:Python 3.13(或者选择最新的版本)

  • 超时时间:15 分钟(Lambda 最大限制)

  • 环境变量:模型配置、S3 桶名、DynamoDB 表名等

  • 网络配置:需部署在 VPC 内以访问 EFS

  • 文件系统:挂载 EFS

  • 权限:

  • AWSLambdaBasicExecutionRole (managed policy)

  • AWSLambdaVPCAccessExecutionRole (managed policy)

  • s3 读写权限 (从 S3 上读取之前的生成物,上传新的生成物到 S3 上面)

  • dynamodb 读写权限(读取生成物路径,更新任务状态)

  • EFS 挂载和读写权限

  • bedrock 模型 invoke 权限

Strands Agent SDK 集成:

在代码分析的不同阶段中,我们会配置不同的 Strands agent,这些 agent 的主要区别是:

  • 模型:我们推荐对于不同的任务使用不同的模型,这样可以在一定程度上节省成本。

  • 提示词:对于不同的分析任务,我们会编写不同的提示词,此外我们建议将提示词保存成模版放在 S3 上(不要写死在 Lambda 代码中),方便后面编辑更新。

  • 工具:我们可以使用 Strands agent 内置的 file_read, file_write, shell 等强大功能帮助我们读取文件,甚至编写代码分析文件。

提示词:

对于生成式 AI agent 来说,提示词(Prompt)的重要性可以说是决定性的。提示词的质量直接决定了你的智能代码分析平台能否真正发挥 AI 的优势,实现从传统规则驱动向智能理解驱动的转变。

提示词工程的最佳实践:

系统级提示词(角色定义)↓任务级提示词(具体分析目标)↓上下文级提示词(项目特定信息)↓输出级提示词(格式和结构要求)

示例:

作为一个资深的 Java 代码审查专家,先阅读项目特征文件,了解项目的基本信息,然后分析以项目代码。重点关注:

  1. 安全漏洞(SQL 注入、XSS 等)

  2. 性能问题(N+1 查询、内存泄漏)

  3. 架构设计缺陷(违反 SOLID 原则)

  4. 代码可维护性问题

Sprint Boot 项目代码目录:/abc/project/项目特征文件路径:/abc/feature.json

把分析结果保存成 /abc/report.md ,报告中每个发现的问题提供:

– 问题描述和风险等级

– 具体的代码位置

– 修复建议和最佳实践

– 相关的代码示例

此外,提示词不是一成不变的,随着项目的演进,大模型能力的增强,需要不断收集用户反馈,分析报告中的误报和漏报信息,不断的调整提示词的表述和结构。

通知机制:SES 邮件与 API 状态查询

代码分析通常所需要的时间较长,应该设计为一个异步流程,即开启任务之后,用户不会一直等待,而需要任务结束之后主动通知用户。完善的通知机制确保用户及时了解分析进度和结果,支持多种通知方式以适应不同的使用场景。

Amazon SES 邮件通知:

SES(Simple Email Service)是我们主要的通知渠道,具有以下优势:

  • 高可靠性:9%的邮件送达率保证

  • 成本效益:按发送量付费,无需维护邮件服务器

  • 模板化支持:支持 HTML 和文本格式的邮件模板

  • 多语言支持:根据用户偏好发送中英文通知

邮件通知触发时机:

  • 分析任务开始时发送确认邮件

  • 分析过程中的关键节点更新

  • 分析完成时发送详细报告

  • 分析失败时发送错误通知

  • 分析流程中需要人工介入/审批的时候

API 状态查询接口:

由于我们已经把代码分析过程中的状态和各种生成物路径持久化在了 DynamoDB 中,除了邮件通知,我们还可以设计 RESTful API 供用户主动查询任务状态:

如 API 端点设计 GET /api/v1/analysis/tasks/{task_id}/status 响应格式示例

{    "task_id": "task_20241127_001",    "status": "completed",    "progress": 100,    "start_time": "2024-11-27T10:00:00Z",    "end_time": "2024-11-27T10:15:30Z",    "duration_seconds": 930,    "current_step": "ResultAggregation",    "steps_completed": [        "PreProcess",        "FeatureExtraction",         "IntelligentAnalysis",        "ResultAggregation"    ],    "results": {        "overall_score": 85,        "report_url": "https://reports.example.com/task_20241127_001/report.html",        "artifacts": [            {                "type": "technical_report",                "url": "https://s3.amazonaws.com/bucket/task_20241127_001/reports/technical_report.html"            }        ]    },    "error": null}
复制代码

结论

通过构建基于亚马逊云科技无服务器架构的智能代码分析平台,我们成功解决了以下核心问题:

可扩展性问题:

  • 利用 Lambda 的自动扩展能力,系统可以根据负载自动调整计算资源

  • Step Functions 提供了可靠的工作流编排,支持复杂的并行处理逻辑

  • EFS 和 S3 的组合使用实现了存储的弹性扩展

成本优化:

  • 按需付费的模式显著降低了运营成本

  • 智能的资源调度减少了空闲资源的浪费

  • 通过缓存和增量分析进一步优化了计算成本

分析质量:

  • AI 代理的引入大幅提升了分析的深度和准确性

  • 上下文感知的分析能力解决了传统工具的局限性

开发效率:

  • 自动化的分析流程减少了人工干预

  • 实时的反馈机制加速了问题发现和修复

  • 标准化的报告格式便于团队协作

最终架构示例:

通过持续的技术创新和实践优化,智能代码分析平台将成为现代软件开发不可或缺的基础设施,为提升软件质量和开发效率发挥更大的价值。随着 AI 技术的不断发展和云计算成本的持续下降,我们相信这种基于无服务器架构的智能分析平台将会得到更广泛的应用和推广。

本文基于亚马逊云科技无服务器架构的实际项目经验总结而成,文中提出的通用设计模式和最佳实践,旨在为构建类似的智能代码分析解决方案提供参考和指导。随着技术的不断发展,相关的架构设计和实施方法也将持续演进和完善。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者


本期最新实验《多模一站通 —— Amazon Bedrock 上的基础模型初体验

✨ 精心设计,旨在引导您深入探索 Amazon Bedrock 的模型选择与调用、模型自动化评估以及安全围栏(Guardrail)等重要功能。无需管理基础设施,利用亚马逊技术与生态,快速集成与部署生成式 AI 模型能力。

⏩️[点击进入实验] 即刻开启 AI 开发之旅

构建无限, 探索启程!

用户头像

还未添加个人签名 2019-09-17 加入

进入亚马逊云科技开发者网站,请锁定 https://dev.amazoncloud.cn 帮助开发者学习成长、交流,链接全球资源,助力开发者成功。

评论

发布
暂无评论
使用智能代理在亚马逊云科技无服务器架构上进行源代码分析_亚马逊云科技 (Amazon Web Services)_InfoQ写作社区