Open Code Review 详解:阿里巴巴开源 AI 代码审查工具
阿里巴巴开源 · AI 代码审查 CLI 工具
源自阿里巴巴内部数万开发者验证的 AI 代码审查 Agent,通过确定性工程与大语言模型混合架构,实现行级精度的深度代码审查。
| 指标 | 数值 |
|---|---|
| 内部活跃用户 | 10K+ |
| Token 成本 (vs Claude Code) | 1/9 |
| AACR-Bench F1 最高分 | 25.10% |
| 支持编程语言 | 10+ |

目录
项目概述
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.properties和message_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 |
输出格式:text 或 json |
--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 完整工作流程图
关键流程步骤说明
- 触发审查 --- 开发者通过 CLI 命令或 CI/CD 流水线触发审查,指定审查范围(工作区变更、分支差异、单次提交或全文件扫描)。
- Git Diff 读取 --- OCR 读取 Git 差异,获取所有变更文件列表,包括新增、修改和删除的文件。
- 确定性文件选择与过滤 --- 工程逻辑精确筛选需要审查的文件,排除 lock 文件、自动生成文件等无需审查的内容,确保不遗漏重要变更。
- 智能文件打包 --- 将相关文件组成审查单元(如 i18n 属性文件对、接口与实现类),每个包作为独立上下文的子 Agent 运行。
- 规则匹配 --- 通过四层优先级链(CLI → 项目 → 全局 → 系统默认)为每个文件匹配适用的审查规则。
- 并行 Agent 审查 --- 每个文件包在独立子 Agent 中并行审查,Agent 通过 file_read、code_search 等工具获取上下文,调用 LLM 进行风险检测和语义分析。
- 评论定位与反思 --- 独立的三级渐进式定位模块将评论精确定位到行级别;反思模块拦截幻觉和知识漂移,提升反馈准确性。
- 结果输出与会话保存 --- 合并所有子 Agent 的审查结果,去重排序后输出(终端文本、JSON 或 WebUI),同时保存会话以支持恢复和回放。
性能基准测试
OCR 构建了一个基于真实场景的代码审查基准测试(AACR-Bench),从 50 个热门开源仓库 、200 个真实 PR 、10 种编程语言 中提取,由 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 是一个值得尝试的利器。
相关链接
- GitHub 仓库:github.com/alibaba/open-code-review
- 官方文档:open-codereview.ai/docs
- 审查规则文档:open-codereview.ai/docs/review-rules
集成到GitLab通知示例
-
飞书通知


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