Alibaba 开源的 OpenCodeReview 是一个面向代码评审的 AI CLI。它没有把所有任务都交给大模型,而是将文件选择、代码打包和规则匹配交给确定性流程,再让 LLM agent 负责需要上下文理解的动态分析。这种组合更适合接入 CI:输入范围可控、规则执行稳定,同时保留 AI 对复杂缺陷的判断能力。
为什么要把规则引擎和 LLM 分开
纯 LLM 代码评审通常会遇到三个实际问题:输入代码过多、每次分析范围不一致,以及结果难以复现。OpenCodeReview 的思路是先用确定性流水线完成基础工作:
- 根据变更选择需要检查的文件,避免把整个仓库无差别发送给模型。
- 将相关文件打包,给模型提供必要的调用上下文。
- 先匹配明确的检查规则,再让 agent 深入分析规则无法简单覆盖的逻辑。
摘要中提到的内置检查包括空指针异常、线程安全、XSS 和 SQL 注入。这类问题既有一部分可以通过规则或模式快速筛选,也需要结合调用链、数据来源和运行上下文判断。把两类能力组合起来,能够减少无关告警,同时让模型集中处理高价值路径。
一条更适合 CI 的评审流程
可以把一次评审拆成下面几个阶段:
- 读取 Pull Request 或提交差异。
- 按文件类型、目录和变更范围筛选输入。
- 将源文件、差异和相关依赖组织成模型上下文。
- 执行确定性规则,例如危险 SQL 拼接或明显的空值访问。
- 调用 LLM agent 分析跨函数、跨文件以及线程模型相关的问题。
- 输出带有文件位置、风险说明和修复建议的评审结果。
其中最重要的工程边界是:AI 结果应该作为评审意见或风险信号,而不是未经验证就自动修改生产代码。对阻断合并的规则,可以要求确定性检查命中后直接失败;对模型发现的问题,则可以先设置为非阻断评论,等团队积累足够的准确率数据后再调整策略。
可以这样接入一个命令行流水线
下面是一个可复制改造的 Bash 示例。命令名称和参数是示意性的,实际接入时应替换为当前 OpenCodeReview 版本提供的 CLI 参数;示例重点展示如何限制评审范围、保存报告,并区分确定性失败和 AI 建议。
#!/usr/bin/env bash
set -euo pipefail
BASE_SHA="${BASE_SHA:-origin/main}"
HEAD_SHA="${HEAD_SHA:-HEAD}"
REPORT_DIR="${REPORT_DIR:-artifacts/code-review}"
mkdir -p "$REPORT_DIR"
# 只把本次变更中的后端源码交给评审工具,避免无关文件消耗上下文。
mapfile -t FILES < <(
git diff --name-only "$BASE_SHA" "$HEAD_SHA" -- \
'*.py' '*.java' '*.go' '*.js' '*.ts' |
grep -vE '(^|/)(vendor|node_modules|dist|build)/' || true
)
if ((${#FILES[@]} == 0)); then
echo "No supported source files changed."
exit 0
fi
# 以下参数名为接入示例,请按实际 CLI 文档调整。
opencode-review \
--base "$BASE_SHA" \
--head "$HEAD_SHA" \
--files "${FILES[@]}" \
--rules null-pointer,thread-safety,xss,sql-injection \
--format json \
--output "$REPORT_DIR/report.json"
# 将报告交给 CI 的后续步骤:可以上传为构建产物,或转换成 Pull Request 评论。
python -m json.tool "$REPORT_DIR/report.json" > "$REPORT_DIR/report.pretty.json"
echo "Review report: $REPORT_DIR/report.pretty.json"
在真实项目中,建议同时配置三类约束:文件白名单、敏感目录排除规则和单次评审的上下文大小上限。配置越明确,模型越容易聚焦于实际变更;不过,过度排除也可能隐藏定义在未修改文件中的关键接口,因此可以为公共库、认证模块和数据库访问层保留关联文件扩展策略。
结果治理比模型调用更重要
AI 代码评审上线后,需要用工程指标观察它是否真正改善了评审质量:
- 告警被开发者采纳的比例。
- 重复告警和误报比例。
- 从发现问题到修复问题的平均时间。
- 规则检查与人工评审发现的问题重叠度。
- 单次评审的耗时、Token 消耗和失败率。
还要注意数据边界。源代码、差异和模型输出都可能包含敏感信息。企业接入时应明确模型服务的位置、日志保留策略、密钥管理方式以及哪些仓库禁止发送到外部模型。对于 SQL 注入、XSS 和线程安全问题,评审报告也应避免直接暴露生产凭据或完整用户数据样本。
采用建议
OpenCodeReview 适合从低风险、可度量的场景开始:先对 Pull Request 做非阻断评审,开启少量内置规则,收集两到四周的误报和采纳数据,再决定是否阻断合并。团队还应保留人工复核,尤其是涉及权限、支付、并发状态和数据迁移的改动。
判断这类工具是否值得长期使用,不应只看它能否生成一段看起来合理的评论,而要看它能否稳定覆盖正确的文件、给出可验证的问题证据,并且在 CI 的时间和成本约束内持续运行。确定性流水线负责可控性,LLM agent 负责理解复杂逻辑,二者的边界设计决定了 AI 评审最终能否进入日常开发流程。