Open Code Review 详解:阿里巴巴开源 AI 代码审查工具

Open Code Review 详解:阿里巴巴开源 AI 代码审查工具

阿里巴巴开源 · AI 代码审查 CLI 工具

源自阿里巴巴内部数万开发者验证的 AI 代码审查 Agent,通过确定性工程与大语言模型混合架构,实现行级精度的深度代码审查。

指标 数值
内部活跃用户 10K+
Token 成本 (vs Claude Code) 1/9
AACR-Bench F1 最高分 25.10%
支持编程语言 10+

目录

  1. 项目概述
  2. 核心架构
  3. 审查规则体系详解
  4. 安装与配置
  5. 使用方法
  6. 亮点与优势
  7. 常用场景
  8. 案例示例
  9. 工作流程图
  10. 性能基准测试
  11. 总结
  12. 集成到GitLab通知示例

项目概述

Open Code Review(简称 OCR)是阿里巴巴集团开源的 AI 驱动代码审查命令行工具,采用 Apache 2.0 许可证。它起源于阿里巴巴内部官方 AI 代码审查助手,在过去两年中服务了数万名开发者,识别了数百万代码缺陷。经过大规模生产环境验证后,阿里巴巴将其孵化为开源项目,供社区使用 1

核心工作原理是:读取 Git 差异(diff),通过具备工具调用能力的 Agent 将变更文件发送给可配置的大语言模型,生成 行级精度的结构化审查评论。Agent 能够读取完整文件内容、搜索代码库、检查其他变更文件以获取上下文,从而产出深度审查结果,而非仅停留在表面的 diff 反馈 1

核心定位 :不同于 GitHub Copilot 或 Cursor 这类 AI 编码助手,OCR 专注于代码审查环节 --- 它不帮你写代码,而是帮你审查代码,在代码合入主干之前拦截缺陷。

除 diff 审查外,ocr scan 命令支持对整个文件进行全量扫描审查,适用于审查不熟悉的代码库或没有有意义差异的目录。只需配置一个模型端点即可开始使用,数据完全私有化,不依赖任何第三方账号 2


核心架构

OCR 的核心设计理念是 "确定性工程 × Agent 混合架构" --- 将确定性工程与 Agent 结合,各自负责擅长的部分 1

通用 Agent 的痛点

使用 Claude Code 等通用 Agent 配合 Skills 进行代码审查时,开发者常遇到以下问题:

痛点 描述
覆盖不完整 处理较大变更集时,Agent 往往"偷懒",选择性审查部分文件而遗漏其他文件
位置漂移 报告的问题经常与实际代码位置不匹配,行号或文件引用偏离目标
质量不稳定 自然语言驱动的 Skills 难以调试,审查质量随提示词微小变化而大幅波动
Token 消耗大 通用 Agent 缺乏针对性的上下文管理,Token 消耗通常是 OCR 的 9 倍以上

根本原因在于:纯语言驱动的架构缺乏对审查过程的硬性约束

混合架构:确定性 + Agent

#mermaid-svg-K13sCbpBAzZDXbg0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-K13sCbpBAzZDXbg0 .error-icon{fill:#552222;}#mermaid-svg-K13sCbpBAzZDXbg0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-K13sCbpBAzZDXbg0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-K13sCbpBAzZDXbg0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-K13sCbpBAzZDXbg0 .marker.cross{stroke:#333333;}#mermaid-svg-K13sCbpBAzZDXbg0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-K13sCbpBAzZDXbg0 p{margin:0;}#mermaid-svg-K13sCbpBAzZDXbg0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-K13sCbpBAzZDXbg0 .cluster-label text{fill:#333;}#mermaid-svg-K13sCbpBAzZDXbg0 .cluster-label span{color:#333;}#mermaid-svg-K13sCbpBAzZDXbg0 .cluster-label span p{background-color:transparent;}#mermaid-svg-K13sCbpBAzZDXbg0 .label text,#mermaid-svg-K13sCbpBAzZDXbg0 span{fill:#333;color:#333;}#mermaid-svg-K13sCbpBAzZDXbg0 .node rect,#mermaid-svg-K13sCbpBAzZDXbg0 .node circle,#mermaid-svg-K13sCbpBAzZDXbg0 .node ellipse,#mermaid-svg-K13sCbpBAzZDXbg0 .node polygon,#mermaid-svg-K13sCbpBAzZDXbg0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-K13sCbpBAzZDXbg0 .rough-node .label text,#mermaid-svg-K13sCbpBAzZDXbg0 .node .label text,#mermaid-svg-K13sCbpBAzZDXbg0 .image-shape .label,#mermaid-svg-K13sCbpBAzZDXbg0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-K13sCbpBAzZDXbg0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-K13sCbpBAzZDXbg0 .rough-node .label,#mermaid-svg-K13sCbpBAzZDXbg0 .node .label,#mermaid-svg-K13sCbpBAzZDXbg0 .image-shape .label,#mermaid-svg-K13sCbpBAzZDXbg0 .icon-shape .label{text-align:center;}#mermaid-svg-K13sCbpBAzZDXbg0 .node.clickable{cursor:pointer;}#mermaid-svg-K13sCbpBAzZDXbg0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-K13sCbpBAzZDXbg0 .arrowheadPath{fill:#333333;}#mermaid-svg-K13sCbpBAzZDXbg0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-K13sCbpBAzZDXbg0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-K13sCbpBAzZDXbg0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-K13sCbpBAzZDXbg0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-K13sCbpBAzZDXbg0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-K13sCbpBAzZDXbg0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-K13sCbpBAzZDXbg0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-K13sCbpBAzZDXbg0 .cluster text{fill:#333;}#mermaid-svg-K13sCbpBAzZDXbg0 .cluster span{color:#333;}#mermaid-svg-K13sCbpBAzZDXbg0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-K13sCbpBAzZDXbg0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-K13sCbpBAzZDXbg0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-K13sCbpBAzZDXbg0 .icon-shape,#mermaid-svg-K13sCbpBAzZDXbg0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-K13sCbpBAzZDXbg0 .icon-shape p,#mermaid-svg-K13sCbpBAzZDXbg0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-K13sCbpBAzZDXbg0 .icon-shape .label rect,#mermaid-svg-K13sCbpBAzZDXbg0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-K13sCbpBAzZDXbg0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-K13sCbpBAzZDXbg0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-K13sCbpBAzZDXbg0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输出层
行级精度审查评论
结构化 JSON 输出
会话管理与回放
Agent 层 --- 动态决策
场景调优提示词

代码审查专用 Prompt
场景调优工具集

file_read / code_search / 等
动态上下文获取

读取完整文件、搜索代码库
确定性工程层 --- 硬约束
精确文件选择

筛选需要审查的文件
智能文件打包

相关文件组成审查单元
细粒度规则匹配

规则匹配到文件特征
外部定位与反思

评论定位 + 反思模块

图 1:Open Code Review 混合架构示意图

确定性工程层 --- 保证不出错:

  • 精确文件选择 --- 确定哪些文件需要审查、哪些应过滤,确保不遗漏重要变更。
  • 智能文件打包 --- 将相关文件组成单一审查单元(如 message_en.propertiesmessage_zh.properties 打包在一起),每个包作为独立上下文的子 Agent 运行,天然支持并发审查。
  • 细粒度规则匹配 --- 将审查规则匹配到每个文件的特征,使模型注意力高度聚焦,从源头消除信息噪声。
  • 外部定位与反思模块 --- 独立的评论定位和评论反思模块系统性提升 AI 反馈的位置准确性和内容准确性。

Agent 层 --- 动态决策:

  • 场景调优提示词 --- 针对代码审查深度优化的提示词模板,提升效果同时降低 Token 消耗。
  • 场景调优工具集 --- 从大规模生产数据的工具调用轨迹中提炼,形成专为代码审查定制的工具集。

审查规则体系详解

审查规则是 OCR 的核心机制之一,它决定了 哪些文件需要审查、按什么标准审查。OCR 使用四层优先级链解析审查规则,每层采用首次匹配获胜策略 3

四层优先级链

#mermaid-svg-9UGmgGhoVpgvGmHH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9UGmgGhoVpgvGmHH .error-icon{fill:#552222;}#mermaid-svg-9UGmgGhoVpgvGmHH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9UGmgGhoVpgvGmHH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9UGmgGhoVpgvGmHH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9UGmgGhoVpgvGmHH .marker.cross{stroke:#333333;}#mermaid-svg-9UGmgGhoVpgvGmHH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9UGmgGhoVpgvGmHH p{margin:0;}#mermaid-svg-9UGmgGhoVpgvGmHH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9UGmgGhoVpgvGmHH .cluster-label text{fill:#333;}#mermaid-svg-9UGmgGhoVpgvGmHH .cluster-label span{color:#333;}#mermaid-svg-9UGmgGhoVpgvGmHH .cluster-label span p{background-color:transparent;}#mermaid-svg-9UGmgGhoVpgvGmHH .label text,#mermaid-svg-9UGmgGhoVpgvGmHH span{fill:#333;color:#333;}#mermaid-svg-9UGmgGhoVpgvGmHH .node rect,#mermaid-svg-9UGmgGhoVpgvGmHH .node circle,#mermaid-svg-9UGmgGhoVpgvGmHH .node ellipse,#mermaid-svg-9UGmgGhoVpgvGmHH .node polygon,#mermaid-svg-9UGmgGhoVpgvGmHH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9UGmgGhoVpgvGmHH .rough-node .label text,#mermaid-svg-9UGmgGhoVpgvGmHH .node .label text,#mermaid-svg-9UGmgGhoVpgvGmHH .image-shape .label,#mermaid-svg-9UGmgGhoVpgvGmHH .icon-shape .label{text-anchor:middle;}#mermaid-svg-9UGmgGhoVpgvGmHH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9UGmgGhoVpgvGmHH .rough-node .label,#mermaid-svg-9UGmgGhoVpgvGmHH .node .label,#mermaid-svg-9UGmgGhoVpgvGmHH .image-shape .label,#mermaid-svg-9UGmgGhoVpgvGmHH .icon-shape .label{text-align:center;}#mermaid-svg-9UGmgGhoVpgvGmHH .node.clickable{cursor:pointer;}#mermaid-svg-9UGmgGhoVpgvGmHH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9UGmgGhoVpgvGmHH .arrowheadPath{fill:#333333;}#mermaid-svg-9UGmgGhoVpgvGmHH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9UGmgGhoVpgvGmHH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9UGmgGhoVpgvGmHH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9UGmgGhoVpgvGmHH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9UGmgGhoVpgvGmHH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9UGmgGhoVpgvGmHH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9UGmgGhoVpgvGmHH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9UGmgGhoVpgvGmHH .cluster text{fill:#333;}#mermaid-svg-9UGmgGhoVpgvGmHH .cluster span{color:#333;}#mermaid-svg-9UGmgGhoVpgvGmHH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9UGmgGhoVpgvGmHH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9UGmgGhoVpgvGmHH rect.text{fill:none;stroke-width:0;}#mermaid-svg-9UGmgGhoVpgvGmHH .icon-shape,#mermaid-svg-9UGmgGhoVpgvGmHH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9UGmgGhoVpgvGmHH .icon-shape p,#mermaid-svg-9UGmgGhoVpgvGmHH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9UGmgGhoVpgvGmHH .icon-shape .label rect,#mermaid-svg-9UGmgGhoVpgvGmHH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9UGmgGhoVpgvGmHH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9UGmgGhoVpgvGmHH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9UGmgGhoVpgvGmHH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是 → 使用该规则

匹配 → 使用该规则

匹配 → 使用该规则

文件路径输入
第 1 层: --rule 参数

CLI 显式指定?
CLI 覆盖规则
第 2 层: 项目配置

.opencodereview/rule.json?
项目级规则

可提交到 Git
第 3 层: 全局配置

~/.opencodereview/rule.json?
用户级规则

个人偏好
第 4 层: 系统默认

内嵌 system_rules.json
内置规则

覆盖常见语言和文件类型

图 2:审查规则四层优先级解析链

优先级 来源 路径 说明
1(最高) --rule 参数 用户指定路径 CLI 显式覆盖,临时使用自定义规则
2 项目配置 <repoDir>/.opencodereview/rule.json 项目级规则,可提交到 Git,团队共享
3 全局配置 ~/.opencodereview/rule.json 用户级个人偏好,跨项目生效
4(最低) 系统默认 内嵌 system_rules.json 内置规则,覆盖常见语言和文件类型

规则文件格式

第 1-3 层使用相同的 JSON 格式定义规则。每个规则由 path(路径匹配模式)和 rule(审查规则描述)组成 3

json 复制代码
// .opencodereview/rule.json --- 项目级审查规则
{
  "rules": [
    {
      "path": "force-api/**/*.java",
      "rule": "All new methods must validate required parameters for null values"
    },
    {
      "path": "**/*mapper*.xml",
      "rule": "Check SQL for injection risks, parameter errors, and missing closing tags"
    },
    {
      "path": "**/*{Controller,Resource}.java",
      "rule": "Verify all endpoints have proper authentication and authorization checks"
    },
    {
      "path": "**/*.go",
      "rule": "Check for goroutine leaks, proper error handling, and context cancellation"
    }
  ]
}

路径匹配规则path 字段支持 ** 递归匹配和 {java,kt} 花括号展开。每层内规则按声明顺序评估 --- 首次匹配获胜。规则文件不存在时静默跳过。

系统默认规则覆盖范围

系统内置规则集覆盖 10+ 种编程语言和文件类型 2

语言 检查范围
Java NPE 检查、线程安全、资源泄漏、空指针异常
TypeScript / JavaScript XSS 漏洞、类型安全、异步错误处理
Go Goroutine 泄漏、错误处理、Context 取消
Python 类型提示、异常处理、安全编码
Kotlin 空安全、协程使用、不可变性
Rust / C++ / C 内存安全、生命周期、缓冲区溢出

规则预览命令

你可以使用 ocr rules check 命令预览某个文件路径适用的审查规则,无需实际运行审查:

bash 复制代码
# 预览某个 Java 文件适用的规则
ocr rules check src/main/java/com/example/Foo.java

# 预览某个 XML Mapper 文件适用的规则
ocr rules check src/main/resources/mapper/UserMapper.xml

这在调试自定义规则时非常有用,可以快速确认规则匹配是否符合预期。


安装与配置

前置条件

Git >= 2.41 --- OCR 依赖 Git 进行差异生成、代码搜索和仓库操作 1

安装方式

方式一:NPM 安装(推荐)
bash 复制代码
npm install -g @alibaba-group/open-code-review

安装后 ocr 命令全局可用。

方式二:Windows 一键安装
powershell 复制代码
irm https://raw.githubusercontent.com/alibaba/open-code-review/main/install.ps1 | iex
方式三:从 GitHub Release 下载
bash 复制代码
# macOS (Apple Silicon)
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-darwin-arm64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr

# Linux (x86_64)
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-linux-amd64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr
方式四:从源码编译
bash 复制代码
git clone https://github.com/alibaba/open-code-review.git
cd open-code-review
make build
sudo cp dist/opencodereview /usr/local/bin/ocr

配置 LLM

审查代码前必须配置 LLM(除非使用 Delegation Mode)。OCR 提供交互式配置向导 1

bash 复制代码
# 交互式配置 --- 选择内置 Provider 或添加自定义
ocr config provider

# 选择模型
ocr config model

也可以通过命令行直接设置:

bash 复制代码
ocr config set llm.url https://api.anthropic.com/v1/messages
ocr config set llm.auth_token your-api-key-here
ocr config set llm.model claude-sonnet-4-20250514
ocr config set llm.use_anthropic true

或通过环境变量配置(优先级最高):

powershell 复制代码
$env:OCR_LLM_URL = "https://api.anthropic.com/v1/messages"
$env:OCR_LLM_TOKEN = "your-api-key-here"
$env:OCR_LLM_MODEL = "claude-sonnet-4-20250514"
$env:OCR_USE_ANTHROPIC = "true"

多模型协议支持:OCR 支持 Anthropic Messages API、OpenAI Chat Completions API 和 OpenAI Responses API。内置预设 Provider 包括 Anthropic、OpenAI、DashScope(通义千问)、DeepSeek 和 Z.AI,同时也支持自定义模型端点用于私有化部署 2

配置完成后,测试连接:

bash 复制代码
ocr llm test

使用方法

核心命令一览

命令 别名 说明
ocr review ocr r 启动代码审查(最核心命令)
ocr scan --- 全文件扫描审查(无需 Git 历史)
ocr delegate --- 委托模式(由你的 AI 编码 Agent 执行审查)
ocr rules check <file> --- 预览某文件路径适用的审查规则
ocr config set <key> <value> --- 设置配置值
ocr llm test --- 测试 LLM 连接
ocr viewer ocr v 启动 WebUI 会话查看器
ocr session list --- 列出审查会话
ocr session comments <id> --- 查看保存会话中的审查评论

三种审查模式

1. Diff 审查(ocr review)
bash 复制代码
# 工作区模式 --- 审查所有已暂存、未暂存和未跟踪的变更
ocr review

# 分支范围 --- 比较两个引用(merge-base 模式)
ocr review --from main --to feature-branch

# 单个提交审查
ocr review --commit abc123

# 预览将审查哪些文件(不调用 LLM)
ocr review --preview

# 使用更高并发审查
ocr review --from main --to my-feature --concurrency 4

# 审查特定提交,输出 JSON(适合 CI/CD)
ocr review --commit abc123 --format json --audience agent

# 使用自定义审查规则
ocr review --rule /path/to/my-rules.json
2. 全文件扫描(ocr scan)
bash 复制代码
# 扫描整个仓库
ocr scan

# 扫描特定目录或文件
ocr scan --path internal/agent

# 恢复中断的扫描
ocr scan --resume <session-id>
3. 委托模式(ocr delegate)

委托模式让 AI 编码 Agent(如 Claude Code)自己执行审查,OCR 负责文件选择和规则解析 --- 无需配置 LLM API Key 1

bash 复制代码
# 预览委托审查将审查哪些文件
ocr delegate preview

# 预览特定文件适用的规则
ocr delegate rule src/main.go src/handler.go

审查参数详解

参数 简写 默认值 说明
--repo --- 当前目录 Git 仓库根目录
--from --- --- 源引用(如 main
--to --- --- 目标引用(如 feature-branch
--commit -c --- 审查单个提交
--preview -p false 预览将审查哪些文件(不调用 LLM)
--format -f text 输出格式:textjson
--concurrency --- 8 最大并发文件审查数
--timeout --- 10 并发任务超时时间(分钟)
--audience --- human human 显示进度,agent 仅显示摘要
--rule --- --- 自定义 JSON 审查规则路径

会话管理与回放

OCR 自动保存每次审查会话,支持恢复中断的审查和在浏览器中查看历史会话:

bash 复制代码
# 列出所有审查会话
ocr session list

# 恢复中断的审查
ocr review --from main --to feature-branch --resume <session-id>

# 查看保存会话中的审查评论
ocr session comments <session-id>

# 按严重性过滤评论并输出 JSON
ocr session comments --severity critical,high --json <session-id>

# 启动浏览器查看器(localhost:5483)
ocr viewer

亮点与优势

亮点 描述
混合架构 确定性工程处理文件选择、规则匹配、行号定位等"绝不能出错"的步骤,Agent 负责语义理解和动态决策,兼顾稳定性与灵活性。
行级精度定位 独立的三级渐进式 LLM 评论定位模块,将每条评论精确定位到具体代码行。独立的反思模块拦截幻觉和知识漂移。
1/9 Token 成本 在相同底层模型下,OCR 的 Token 消耗仅为 Claude Code 的约 1/9,同时实现更高的 Precision 和 F1 分数。
动态并发处理 动态拆分子任务进行并行审查,默认 8 个 goroutine worker,大型变更集也能快速完成。
智能内存压缩 专为代码审查设计的 3 级分区(frozen/compress/active)上下文管理,突破 Token 限制实现深度审查。
数据完全私有 自托管部署,自带 LLM API Key,代码数据不经过任何第三方服务。支持私有化模型端点。
多平台集成 支持 Claude Code 插件、Cursor、Codex、OpenCode 等 AI 编码 Agent,以及 GitHub Actions、GitLab CI、Gerrit 等 CI/CD 平台。
可观测性 内置 OpenTelemetry 集成,提供 spans 和 metrics 可观测性,支持审查过程的全链路追踪。

与通用 Agent 的关键差异 :OCR 选择精度优先于召回率的策略 --- 这是有意的设计权衡。宁可少报一些问题,也要确保报出的每个问题都是真实的缺陷,减少开发者处理误报的负担 1


常用场景

场景一:本地开发即时审查

开发者在本地编写代码后,在提交前运行 OCR 进行即时审查,快速发现潜在问题:

bash 复制代码
# 审查当前工作区所有变更
ocr review

# 审查结果会直接在终端输出
# ─── src/auth/login.go:42-45 ───
# Consider using bcrypt cost factor ≥ 12 for password hashing.

场景二:分支合并前审查

在 feature 分支合并到 main 之前,审查整个分支的变更:

bash 复制代码
ocr review --from main --to feature/user-auth --concurrency 4

场景三:CI/CD 自动审查

在 GitHub Actions 或 GitLab CI 中自动审查 Pull Request / Merge Request:

bash 复制代码
ocr review \
  --from "origin/main" \
  --to "origin/feature-branch" \
  --format json \
  --audience agent

--format json--audience agent 参数输出机器可读结果,适合 CI 脚本解析和门禁判断 3

场景四:审查不熟悉的代码库

接手新项目或开源项目时,使用全文件扫描模式快速了解代码质量和潜在风险:

bash 复制代码
# 扫描整个仓库
ocr scan

# 只扫描关键模块
ocr scan --path src/auth --path src/payment

场景五:AI 编码 Agent 集成审查

将 OCR 集成到 Claude Code 等 AI 编码 Agent 中,在 Agent 工作流中直接进行代码审查 1

bash 复制代码
# 在 Claude Code 中安装插件
/plugin marketplace add alibaba/open-code-review
/plugin install open-code-review@open-code-review

# 使用斜杠命令触发审查
/open-code-review:review

场景六:ML 训练中的代码质量验证

在强化学习训练管线中,使用 OCR 作为代码质量验证器,为代码生成模型提供可靠的奖励信号 2

场景七:团队自定义规则审查

将项目特定的编码规范和审查标准定义为 JSON 规则文件,提交到 Git 仓库,确保团队所有成员使用统一的审查标准:

json 复制代码
// .opencodereview/rule.json
{
  "rules": [
    {
      "path": "**/Controller*.java",
      "rule": "All endpoints must use @Validated and check permissions"
    },
    {
      "path": "**/*.py",
      "rule": "Check for hardcoded secrets and SQL injection risks"
    }
  ]
}

案例示例

案例 1:Java 服务端参数校验

开发者在 API 层新增了一个用户注册方法,OCR 基于项目自定义规则发现了参数校验缺失问题:

java 复制代码
// src/main/java/com/example/api/UserController.java
@PostMapping("/register")
public Result register(UserDTO userDTO) {
    // OCR 审查评论 [HIGH]: Missing parameter validation
    // 建议添加 @Validated 注解并校验必填字段
    return userService.register(userDTO);
}

// 修复后
@PostMapping("/register")
public Result register(@Validated UserDTO userDTO) {
    return userService.register(userDTO);
}

案例 2:Go 并发安全检查

一个 Go 服务中存在 goroutine 泄漏风险,OCR 通过读取完整文件上下文发现了问题:

go 复制代码
// internal/worker/pool.go
func (p *Pool) Start() {
    for i := 0; i < p.workers; i++ {
        go p.worker(ctx)
        // OCR 审查评论 [CRITICAL]: Goroutine leak detected
        // ctx 没有传递到 worker 中,goroutine 无法被取消
    }
}

// 修复后
func (p *Pool) Start(ctx context.Context) {
    for i := 0; i < p.workers; i++ {
        go p.worker(ctx) // ctx 传递,支持优雅关闭
    }
}

案例 3:MyBatis XML SQL 注入检查

基于用户偏好的 SQL 开发规范(MyBatis 原生 SQL 用于复杂查询),OCR 检查出 Mapper XML 中的注入风险:

xml 复制代码
<!-- src/main/resources/mapper/UserMapper.xml -->
<select id="findByName" resultType="User">
    SELECT * FROM user WHERE name = '${name}'
    <!-- OCR 审查评论 [CRITICAL]: SQL Injection risk -->
    <!-- 使用 ${} 会导致 SQL 注入,应改为 #{} -->
</select>

<!-- 修复后 -->
<select id="findByName" resultType="User">
    SELECT * FROM user WHERE name = #{name}
    <!-- 使用 #{} 预编译参数,安全 -->
</select>

案例 4:CI/CD 中自动门禁

以下是一个 GitHub Actions 工作流示例,在 PR 提交时自动运行 OCR 审查,并根据审查结果决定是否允许合并:

yaml 复制代码
# .github/workflows/code-review.yml
name: AI Code Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install OCR
        run: npm install -g @alibaba-group/open-code-review

      - name: Run Code Review
        env:
          OCR_LLM_TOKEN: ${{ secrets.OCR_LLM_TOKEN }}
          OCR_LLM_URL: ${{ secrets.OCR_LLM_URL }}
          OCR_LLM_MODEL: ${{ secrets.OCR_LLM_MODEL }}
        run: |
          ocr review \
            --from origin/main \
            --to origin/${{ github.head_ref }} \
            --format json \
            --audience agent \
            --output review-results.json

      - name: Check for Critical Issues
        run: |
          # 如果存在 critical 级别问题,阻止合并
          jq '[.[] | select(.severity == "critical")] | length' review-results.json

工作流程图

以下流程图展示了 OCR 从启动审查到输出结果的完整工作流程:
#mermaid-svg-VpifD6jjENjKvVni{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VpifD6jjENjKvVni .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VpifD6jjENjKvVni .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VpifD6jjENjKvVni .error-icon{fill:#552222;}#mermaid-svg-VpifD6jjENjKvVni .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VpifD6jjENjKvVni .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VpifD6jjENjKvVni .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VpifD6jjENjKvVni .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VpifD6jjENjKvVni .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VpifD6jjENjKvVni .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VpifD6jjENjKvVni .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VpifD6jjENjKvVni .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VpifD6jjENjKvVni .marker.cross{stroke:#333333;}#mermaid-svg-VpifD6jjENjKvVni svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VpifD6jjENjKvVni p{margin:0;}#mermaid-svg-VpifD6jjENjKvVni .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VpifD6jjENjKvVni .cluster-label text{fill:#333;}#mermaid-svg-VpifD6jjENjKvVni .cluster-label span{color:#333;}#mermaid-svg-VpifD6jjENjKvVni .cluster-label span p{background-color:transparent;}#mermaid-svg-VpifD6jjENjKvVni .label text,#mermaid-svg-VpifD6jjENjKvVni span{fill:#333;color:#333;}#mermaid-svg-VpifD6jjENjKvVni .node rect,#mermaid-svg-VpifD6jjENjKvVni .node circle,#mermaid-svg-VpifD6jjENjKvVni .node ellipse,#mermaid-svg-VpifD6jjENjKvVni .node polygon,#mermaid-svg-VpifD6jjENjKvVni .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VpifD6jjENjKvVni .rough-node .label text,#mermaid-svg-VpifD6jjENjKvVni .node .label text,#mermaid-svg-VpifD6jjENjKvVni .image-shape .label,#mermaid-svg-VpifD6jjENjKvVni .icon-shape .label{text-anchor:middle;}#mermaid-svg-VpifD6jjENjKvVni .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VpifD6jjENjKvVni .rough-node .label,#mermaid-svg-VpifD6jjENjKvVni .node .label,#mermaid-svg-VpifD6jjENjKvVni .image-shape .label,#mermaid-svg-VpifD6jjENjKvVni .icon-shape .label{text-align:center;}#mermaid-svg-VpifD6jjENjKvVni .node.clickable{cursor:pointer;}#mermaid-svg-VpifD6jjENjKvVni .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VpifD6jjENjKvVni .arrowheadPath{fill:#333333;}#mermaid-svg-VpifD6jjENjKvVni .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VpifD6jjENjKvVni .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VpifD6jjENjKvVni .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VpifD6jjENjKvVni .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VpifD6jjENjKvVni .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VpifD6jjENjKvVni .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VpifD6jjENjKvVni .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VpifD6jjENjKvVni .cluster text{fill:#333;}#mermaid-svg-VpifD6jjENjKvVni .cluster span{color:#333;}#mermaid-svg-VpifD6jjENjKvVni div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VpifD6jjENjKvVni .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VpifD6jjENjKvVni rect.text{fill:none;stroke-width:0;}#mermaid-svg-VpifD6jjENjKvVni .icon-shape,#mermaid-svg-VpifD6jjENjKvVni .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VpifD6jjENjKvVni .icon-shape p,#mermaid-svg-VpifD6jjENjKvVni .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VpifD6jjENjKvVni .icon-shape .label rect,#mermaid-svg-VpifD6jjENjKvVni .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VpifD6jjENjKvVni .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VpifD6jjENjKvVni .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VpifD6jjENjKvVni :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开发者触发审查

ocr review / CI/CD
读取 Git Diff

获取变更文件列表
确定性: 文件选择与过滤

排除 lock 文件、生成文件等
确定性: 智能文件打包

相关文件组成审查单元
确定性: 规则匹配

四层优先级链解析规则
并行分发

每个文件包

独立子 Agent
子 Agent 1

文件包 A
子 Agent 2

文件包 B
子 Agent N

文件包 N
Agent 工具调用

file_read / code_search

cross_file_check
Agent 工具调用

file_read / code_search

cross_file_check
Agent 工具调用

file_read / code_search

cross_file_check
LLM 推理

风险检测 + 上下文分析
LLM 推理

风险检测 + 上下文分析
LLM 推理

风险检测 + 上下文分析
评论定位模块

行级精度定位
评论定位模块

行级精度定位
评论定位模块

行级精度定位
评论反思模块

拦截幻觉与知识漂移
结果合并

去重 + 排序
输出审查结果

text / json / WebUI
保存会话

支持恢复与回放

图 3:Open Code Review 完整工作流程图

关键流程步骤说明

  1. 触发审查 --- 开发者通过 CLI 命令或 CI/CD 流水线触发审查,指定审查范围(工作区变更、分支差异、单次提交或全文件扫描)。
  2. Git Diff 读取 --- OCR 读取 Git 差异,获取所有变更文件列表,包括新增、修改和删除的文件。
  3. 确定性文件选择与过滤 --- 工程逻辑精确筛选需要审查的文件,排除 lock 文件、自动生成文件等无需审查的内容,确保不遗漏重要变更。
  4. 智能文件打包 --- 将相关文件组成审查单元(如 i18n 属性文件对、接口与实现类),每个包作为独立上下文的子 Agent 运行。
  5. 规则匹配 --- 通过四层优先级链(CLI → 项目 → 全局 → 系统默认)为每个文件匹配适用的审查规则。
  6. 并行 Agent 审查 --- 每个文件包在独立子 Agent 中并行审查,Agent 通过 file_read、code_search 等工具获取上下文,调用 LLM 进行风险检测和语义分析。
  7. 评论定位与反思 --- 独立的三级渐进式定位模块将评论精确定位到行级别;反思模块拦截幻觉和知识漂移,提升反馈准确性。
  8. 结果输出与会话保存 --- 合并所有子 Agent 的审查结果,去重排序后输出(终端文本、JSON 或 WebUI),同时保存会话以支持恢复和回放。

性能基准测试

OCR 构建了一个基于真实场景的代码审查基准测试(AACR-Bench),从 50 个热门开源仓库200 个真实 PR10 种编程语言 中提取,由 80+ 位高级工程师交叉验证,共标注 1,505 个真实缺陷 1

F1 / Precision / Recall 对比

模型 工具 F1 Precision Recall Avg Time
Claude-4.6-Opus Open Code Review 25.10% 33.90% 20.00% 1m23s
Qwen3.8-Max Open Code Review 23.00% 33.90% 17.40% 5m14s
GLM-5.2 Open Code Review 21.30% 32.30% 15.90% 7m58s
Qwen3.7-Max Open Code Review 21.20% 25.20% 18.30% 4m41s
GPT-5.5 Open Code Review 21.00% 32.10% 15.50% 2m51s
Claude-4.6-Opus Claude Code 11.57% 7.23% 28.90% 13m6s
Qwen3.7-Max Claude Code 12.17% 8.23% 23.37% 8m6s
GLM-5.1 Claude Code 11.93% 8.37% 20.80% 14m10s
GPT-5.5 Claude Code 8.36% 27.82% 4.92% 2m58s
Deepseek-V4-Pro Claude Code 10.93% 8.27% 16.13% 14m24s

Token 消耗对比(越低越好)

模型 OCR Token Claude Code Token 倍数差异
Claude-4.6-Opus 385K 5,664K ~14.7x
Qwen3.7-Max 625K 5,153K ~8.2x
GLM-5.1 743K 4,038K ~5.4x
GPT-5.5 422K 525K ~1.2x
Deepseek-V4-Pro 394K 5,450K ~13.8x

关键发现 :在相同底层模型下,OCR 相比 Claude Code 实现了显著更高的 Precision 和 F1 分数,同时仅消耗约 1/9 的 Token,审查速度更快。Recall 略低是故意的设计权衡 --- 优先保证精度,减少误报干扰 1


总结

Open Code Review 是一款经过阿里巴巴大规模生产环境验证的 AI 代码审查工具,其核心价值在于:

  • 确定性 + Agent 混合架构 解决了通用 Agent 在代码审查中覆盖不完整、位置漂移、质量不稳定的问题
  • 四层规则优先级链 提供了从系统默认到 CLI 覆盖的灵活规则配置,支持团队级、项目级和个人级的规则管理
  • 行级精度定位 + 反思模块 确保审查评论的准确性和可操作性
  • 1/9 Token 成本 相比通用 Agent 大幅降低 API 调用成本
  • 多平台集成 支持本地 CLI、CI/CD、AI 编码 Agent 等多种使用方式

对于追求代码质量、希望在 AI 编码时代保持审查标准的团队和个人开发者来说,OCR 是一个值得尝试的利器。

相关链接


集成到GitLab通知示例

  • 飞书通知

  • 自动在合并请求下面进行评论


参考资料

  1. Alibaba, Open Code Review GitHub README. 项目介绍、架构设计、使用方法、Benchmark 数据。
  2. Open Code Review 官方网站. 产品功能、核心特性、受众群体、Benchmark 排行榜。
相关推荐
JaydenAI1 小时前
[基于AgentEvals的自动化评估-04]全面优化面向LangGraph的轨迹评估[下篇]
ai·langchain·agent·evaluation·openevals
bytemaster1 小时前
GitLab CE 团队卡不住 commit 规范?我用一个全局 Hook 把整个公司拦下了
代码规范
灵析表格2 小时前
灵析表格财务函数深度实用性分析与实操教程
开发语言·ai·json·excel·wps
Json____2 小时前
AI内容创作平台项目源码
人工智能·ai·agent·内容创作·wwwoop.com
Jay-r2 小时前
DeepSeek Harness 极简上手:装好、玩熟、让它自己长新能力
人工智能·windows·ai·github·ai编程·deepseek·harness
嵌入式学习_force3 小时前
BES2810ZP深度解析
ai·蓝牙·bes2810
lifallen3 小时前
DeepSeek Harness:把 Agent 做成可替换的运行时插件树
人工智能·学习·ai·开源软件·ai编程
御风之翼_唤星者4 小时前
LoadFramePackModel模块报错bad escape
python·ai
todoitbo4 小时前
把蓝耘接入鸿蒙健康教练:一句话打卡,模型估热量,网关记账
华为·ai·harmonyos·蓝耘·第三方api