Kpole95/llm-code-review-agent

GitHub: Kpole95/llm-code-review-agent

基于 LangGraph 和 Claude 的 AI 代码审查 Agent,通过双层检测与 RAG 检索为五种主流语言提供附带修复建议和解释的 bug 与安全漏洞分析。

Stars: 0 | Forks: 0

# 🔍 LLM 代码审查 Agent **一个 AI Agent,用于审查代码中的 bug 和安全漏洞——支持五种语言——并提供修复建议和通俗易懂的英文解释。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/de145c73dd011137.svg)](https://github.com/Kpole95/llm-code-review-agent/actions/workflows/ci.yml) [![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
![演示](https://raw.githubusercontent.com/Kpole95/llm-code-review-agent/main/docs/images/demo.gif) ## 功能简介 粘贴代码片段、指定本地文件,或者提供一个公开的 GitHub pull request URL。该 Agent 会审查代码并返回一个**审查结果**列表——每一个结果代表一个独立的 bug 或安全漏洞,包含: - 文件名和具体的行号, - 严重程度 (`low` · `medium` · `high` · `critical`), - 类别(例如 `sql_injection`, `hardcoded_secret`, `xss`), - 原始代码片段, - 建议的修复方案,以及 - 一段简短、通俗易懂的英文解释,说明其重要性以及修复方案为何有效。 它支持 **Python、JavaScript、TypeScript、Java 和 Go**,并将其安全判断基于一个检索知识库,该知识库是根据 OWASP 指南和特定语言的最佳实践构建的。 ## 解决的问题 手动代码审查速度慢、不一致,且在面临截止日期压力时很容易被省略——而那些漏网的问题(如 SQL 注入、硬编码的密钥、未经处理的用户输入)往往代价高昂。纯粹的静态分析器只能捕获已知的模式,而忽略了上下文,也无法解释自身的原因。本项目探索了一条折中之路:一个 LLM Agent,能够在上下文中推理代码,将其安全发现建立在参考资料之上,提出具体的修复方案,并像资深工程师在 PR 评论中那样解释其推理过程。 ## 核心功能 - **五种语言** —— Python、JavaScript、TypeScript、Java、Go,使用 tree-sitter 进行解析。 - **双层检测** —— 针对最高置信度问题(硬编码密钥、`eval`/`exec`)的确定性正则表达式扫描,加上基于 LLM 的广泛扫描,并通过 RAG 结合 OWASP 上下文。 - **可操作的输出** —— 每一项发现都带有修复后的代码片段和解释,而不仅仅是警告。 - **Schema 保证的结果** —— 发现结果通过强制工具调用生成,因此严重程度和类别始终来自固定的有效词汇表。 - **语义去重** —— 来自两个检测器的重叠检测结果会被合并,因此每个真实问题您只会看到一次。 - **三种界面** —— CLI、FastAPI 服务和 Streamlit Web 应用,全部运行相同的流水线。 - **诚实的评估** —— 系统从未针对其进行过调整的保留测试集,结果以范围的形式报告,以反映 LLM 的方差。 - **生产级架构** —— Docker 容器化,在 CI 中进行 lint 和测试,通过 CD 部署到 AWS ECS,并带有 LangSmith 追踪和 MLflow 实验追踪。 ## 演示 ### 审查粘贴的代码 Web UI 将审查结果渲染为 git-diff 风格的卡片——红色代表原始代码,绿色代表建议的修复方案——按文件分组并按严重程度排序。 | Python | JavaScript | |:------:|:----------:| | ![Python 审查](https://raw.githubusercontent.com/Kpole95/llm-code-review-agent/main/docs/images/python-review.gif) | ![JavaScript 审查](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/0932e9749b011154.gif) | | TypeScript | Java | Go | |:----------:|:----:|:--:| | ![TypeScript 审查](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/7bcd2a3878011200.gif) | ![Java 审查](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/551a8a3250011205.gif) | ![Go 审查](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/ab894314fd011210.gif) | ### 审查 GitHub pull request 给它一个 PR URL,它就会拉取所有更改过的文件并对它们一起进行审查。 ![PR 审查](https://raw.githubusercontent.com/Kpole95/llm-code-review-agent/main/docs/images/pr-review.gif) ### 命令行 ![CLI 审查](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/ad60e3a967011221.gif) ## 架构 每个界面都调用同一个函数 —— `run_review(files)` —— 该函数执行一个已编译的 **LangGraph** 流水线。CLI、API 和 UI 之间没有重复的审查逻辑。 ``` flowchart LR A[Input
paste / path / PR] --> B[run_review] B --> C[analyze
tree-sitter parse] C --> D[detect
bug_detector +
security_scanner
then deduplicate] D --> E[enrich
RAG context +
fix + explanation] E --> F[Findings] KB[knowledge_base/*.md] -->|build_index| VS[(ChromaDB)] VS -.->|retrieval| D VS -.->|retrieval| E ``` - **analyze** 解析每个文件的结构(仅供参考;检测无论如何都会运行)。 - **detect** 对每个文件运行两个检测器,然后对组合结果进行去重 —— 先在 `(file, line, category)` 上进行精确匹配,接着在 `category + description` 的向量嵌入上进行语义匹配。 - **enrich** 附加上下文知识库,为每一项发现生成修复方案和解释(跨发现并行执行),并在返回前清除所有多余的 HTML。 更深入的文章 —— 包括数据契约、双检测器设计原理,以及该架构的演进过程 —— 位于 [`docs/architecture.md`](docs/architecture.md) 中。 ## 评估 系统针对一个**包含 10 个代码片段的保留测试集进行了评分,系统在开发和调优期间从未见过这些片段**,涵盖了所有五种语言和一系列漏洞类别,其中包括一个用于检查误报的干净文件。 由于模型具有非确定性,结果将以**跨运行的范围**报告,而不是单一的精挑细选的数字: | 指标 | 保留集运行范围 | |--------|----------------------------| | Precision (精确率) | 0.69 – 0.91 | | Recall (召回率) | 0.90 – 1.00 | | **F1** | **0.78 – 0.95** | 评估工具将**调优集**(在迭代期间使用,因此存在乐观偏差)与这个保留集分开,并将每次运行连同参数和指标记录到 MLflow 中,以提供可查询的历史记录。 ## 技术栈 | 领域 | 工具 | |------|-------| | 语言 / 打包 | Python 3.11, [`uv`](https://github.com/astral-sh/uv) | | Agent pipeline | LangGraph | | 模型 | Anthropic Claude (`claude-haiku-4-5`) | | 解析 | tree-sitter (5 种语法) | | 检索 (RAG) | ChromaDB + `all-MiniLM-L6-v2` | | 接口 | FastAPI, Streamlit, `rich` CLI | | 可观测性 | LangSmith (追踪), DagsHub 上的 MLflow (实验) | | 基础设施 | Docker, GitHub Actions (CI/CD), AWS ECR + ECS | ## 快速开始 **前置条件:** Python 3.11、[`uv`](https://github.com/astral-sh/uv) 和一个 Anthropic API 密钥。Docker 是可选的,但推荐用于运行完整技术栈。 ``` # Clone 并安装依赖项 git clone https://github.com/Kpole95/llm-code-review-agent.git cd llm-code-review-agent uv sync # 配置环境 cp .env.example .env # 然后编辑 .env 并添加你的 ANTHROPIC_API_KEY # 构建 RAG index uv run python -m src.rag.build_index # 从命令行运行 review uv run python -m src.cli review tests/fixtures/sql_injection.py ``` ### 运行完整技术栈 (API + Web UI) ``` docker compose up --build ``` 然后在浏览器中打开位于 **http://localhost:8501** 的 Streamlit UI(它会与位于 **http://localhost:8000** 的 API 通信)。粘贴代码或 GitHub PR URL 即可运行审查。 ## 使用方法 **CLI** ``` uv run python -m src.cli review path/to/file_or_directory ``` **API** ``` curl -X POST http://localhost:8000/review \ -H "Content-Type: application/json" \ -d '{"files": [{"path": "x.py", "content": "...", "language": "python"}]}' ``` 交互式 API 文档可在 `http://localhost:8000/docs` 获取。 **Web UI** —— 粘贴代码(选择语言)或粘贴公开的 GitHub PR URL。 ## 项目结构 ``` src/ ├── agent/ # LangGraph pipeline, state contract, prompts, LLM client ├── parsing/ # tree-sitter parser + local/GitHub file loaders ├── rag/ # knowledge-base indexing and retrieval ├── tools/ # detectors (bug, security) + enrichers (fix, explain) ├── eval/ # metrics, tuning set, hold-out set, MLflow logging ├── api/ # FastAPI service └── cli.py # command-line interface streamlit_app/ # Streamlit web UI knowledge_base/ # OWASP + best-practice docs (RAG source — required) docker/ # Dockerfile .github/workflows/ # CI (lint + test) and CD (build + deploy) docs/ # architecture, complete guide, results history ``` ## CI / CD - **CI** 在每次 push 和 pull request 时运行:`ruff` lint、RAG 索引构建以及 `pytest` 测试套件。 - **CD** 在向 `main` 分支 push 时运行:它会构建 Docker 镜像,将其推送到 Amazon ECR(使用 commit SHA 作为 tag),并在 AWS ECS 上强制进行新部署。 部署使用一个专用的、范围受限的 IAM 用户,其凭证存储在 GitHub Actions secrets 中,与任何个人密钥分开。 ![GitHub Actions](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/259c7a378b011226.png) ## 已知局限 - **仅在独立代码片段上进行了基准测试**,而非大型多文件代码库——请参阅上面的评估说明。 - **输出具有非确定性** —— 相同的代码在不同运行中可能会产生略微不同的审查结果;这是基于 LLM 系统的固有特性,也是为什么结果以范围形式报告的原因。 - 在非常大的文件中,**行号偶尔会发生偏移**。 - PR 模式下若没有 token 则**不支持私有仓库**;该设计主要针对公开 PR。 - **延迟随发现数量增加而增加** —— 一个包含大量漏洞的文件会产生多次模型调用(通过并行化富集步骤可以缓解此问题,但仍受限于 API)。 ## 许可证 基于 MIT 许可证发布。详见 [`LICENSE`](LICENSE)。
标签:AWS, DPI, Kubernetes, LLM Agent, RAG, 人工智能, 代码审查, 用户模式Hook绕过, 请求拦截, 逆向工具, 错误基检测, 静态代码分析