资讯详情

资讯详情

开源 CLI 代码评审工作流:基于 Git Diff 与本地 LLM Agent 的结构化 CR 实践

1. 项目概述这不是一个“工具”而是一套可落地的开源代码评审工作流“open-code-review”这五个字母组合最近在工程师茶水间、技术 Slack 频道和 GitHub Trending 页面上频繁出现。它不是某个新发布的 SaaS 服务也不是某家大厂刚开源的神秘项目——它本质上是一套以 CLI 为入口、以 Git Diff 为输入源、以 LLM Agent 为智能内核、完全透明可审计的代码评审Code Review实践范式。我从去年底开始在三个中型团队里推动这套流程从最初用 shell 脚本硬凑到后来基于开源 LLM 模型自建轻量级 Agent再到如今稳定运行在 CI/CD 流水线中的标准化 CLI 工具链整个过程踩过的坑比写过的 patch 还多。它解决的不是“要不要做 Code Review”这个老问题而是“为什么工程师总把 CR 当成负担为什么 PR 描述永远只有‘fix bug’为什么资深同事的评论总卡在‘建议加个注释’这种无效反馈上”——这些问题背后是评审粒度失焦、上下文缺失、反馈语言模糊、结果不可追溯四大顽疾。“open-code-review”的核心价值就是用极简 CLI 命令触发一次结构化、带上下文、可复现、带评分依据的评审动作让每次 CR 都像一次小型技术对谈而不是盖章流程。它适合三类人想摆脱“CR 形式主义”的 Tech Lead、需要快速理解陌生代码库的新人工程师、以及正在构建内部 DevOps 平台的平台工程团队。你不需要懂 LLM 训练也不用部署 GPU 集群——只要你会用git diff和curl就能在 10 分钟内跑通第一个评审实例。2. 整体设计思路为什么放弃 Web UI死磕 CLI Git Diff2.1 评审必须发生在“代码诞生的瞬间”而不是“PR 提交之后”传统 Code Review 流程天然存在时间断层开发者写完代码 → 提交 commit → 推送分支 → 创建 PR → 等待 reviewer 分配 → reviewer 切换上下文 → 开始阅读 diff → 写出评论 → 提交 → 开发者再切回上下文修改。这个链条里上下文损耗率超过 60%。我统计过自己团队去年 Q3 的 217 个被驳回的 PR其中 83% 的驳回原因不是逻辑错误而是“这个函数为什么要改原逻辑缺陷在哪你新增的这个状态机是否和上游 service 冲突”——这些问题本该在git commit时就被触发思考而不是等 PR 页面加载完才浮现。所以“open-code-review”的第一设计原则就是评审触发点前移到git diff输出那一刻。CLI 工具监听本地 git 操作在git add后自动捕获 staged diff或在git commit -m xxx执行前拦截将 raw diff 文本连同当前 branch 名、commit message、甚至.git/config中的 remote URL 一起打包作为评审 Agent 的原始输入。这不是为了炫技而是因为 diff 是唯一不依赖 IDE 渲染、不依赖 Git Hosting 平台 API、不依赖用户登录态的“纯代码事实”。它像一张 X 光片直接暴露变更的骨骼结构没有 UI 层的修饰与干扰。2.2 LLM Agent 不是“AI 替代人”而是“上下文编织者”与“语言校准器”网络热词里反复出现的 “agent vs LLM vs model” 其实是个伪命题——真正该问的是“在这个具体任务里你需要模型做什么” 对于 Code ReviewLLM 本身只负责两件事理解代码语义比如识别出for i in range(len(arr)):是典型的 Python 索引陷阱和生成人类可读的自然语言反馈比如把“建议改用enumerate()”转化成“当前遍历方式易引发索引越界且不符合 Python 惯例推荐使用for idx, item in enumerate(arr):既安全又语义清晰”。但光有这两项能力远远不够。真正的瓶颈在于单靠 diff 片段LLM 无法判断这段代码在整个系统中的角色。一个user.delete()调用在用户注销流程里是合理操作在支付回调里就是致命漏洞。这就是 Agent 层的价值它不是另一个大模型而是一个轻量级调度器负责在调用 LLM 前动态注入三类关键上下文代码上下文自动提取 diff 所在文件的前后 10 行非 diff 行补全函数签名、类定义、import 语句项目上下文读取项目根目录下的README.md、ARCHITECTURE.md、.codeclimate.yml提取技术栈约束如“禁止使用eval()”、“所有 API 必须返回 JSON:API 格式”历史上下文查询本地.git/logs/HEAD获取最近 3 次对该文件的修改 commit message判断本次变更是否属于连续迭代。我试过直接把 raw diff 丢给 DeepSeek-Coder 32B结果是它能精准指出语法错误但对“为什么这个 HTTP status code 从 200 改成 409”完全无感。加上 Agent 层后同样的 diff它会先查git log -n 3 --oneline src/api/order.py发现上一次修改 message 是 “fix race condition in order creation”再结合ARCHITECTURE.md里写的 “order state transition must be idempotent”最终给出“检测到订单状态更新从 200 改为 409符合幂等性设计原则冲突时返回 409 而非重试建议在 commit message 中明确说明此变更目的”。这才是工程师需要的反馈——有依据、可验证、带推理链。2.3 为什么坚持 CLI 而非集成 VS Code 或飞书看到热搜词里大量出现 “codex cli 接入飞书”、“vs code gemini cli companion”我能理解这种集成冲动——毕竟消息提醒和一键跳转太诱人了。但我们在真实产线验证过任何需要用户主动“打开插件”或“点击按钮”的评审动作使用率都会断崖式下跌。我们做过 A/B 测试一组用 VS Code 插件在编辑器右键菜单里添加 “Review This File”另一组用纯 CLI在git commit前执行ocr review --staged。结果是插件组的周均使用率 12%CLI 组 78%。原因很现实插件要加载、要等待 LSP 初始化、要处理 UI 渲染而 CLI 命令在终端里敲完回车2 秒内就返回 Markdown 格式的评审报告。更重要的是CLI 天然兼容所有自动化场景你可以把它塞进 pre-commit hook也可以在 CI 的before_script里调用甚至用 cron 每小时扫描main分支的最新 commit 自动评审。而飞书/钉钉机器人那种“收到 PR 就推送评审结果”的模式本质还是把评审变成被动接收信息而非主动参与设计决策。我们的实践结论是评审工具的终极形态应该像git一样成为开发者肌肉记忆的一部分而不是一个需要额外学习的“应用”。3. 核心细节解析CLI 如何把 Git Diff 变成可评审的“语义包”3.1 Diff 解析不是简单截取而是结构化语义切片很多人以为git diff输出就是一串带-的文本直接喂给 LLM 就行。实测下来这是最严重的误区。原始 diff 包含大量噪声文件头diff --git a/src/main.py b/src/main.py、元信息index abc123..def456 100644、空行、二进制文件标记Binary files a/img.png and b/img.png differ。如果把这些全塞进去LLM 会浪费 30% 的 token 在解析格式上还容易因index行里的哈希值产生幻觉。我们的 CLI 工具ocropen-code-review 的缩写采用三级过滤策略物理层过滤用正则^diff --git|^index |^Binary files|^old mode|^new mode|^deleted file|^new file|^--- |^\\\ |^精准剔除所有非代码行只保留-行及紧邻的上下文行即 -10,5 10,7 后面的真实代码逻辑层切片将过滤后的 diff 按函数粒度拆分。例如一个 diff 修改了UserService.create_user()和OrderService.validate_payment()两个函数ocr会自动识别出这两个函数名并把各自相关的-行及其前后 3 行代码打包成两个独立评审单元。这样做的好处是每个单元的上下文更聚焦LLM 不会因为跨函数的 diff 而混淆职责边界语义层标注在每个切片开头插入一行注释标明变更类型。例如# [CHANGE_TYPE: BUG_FIX] UserService.create_user() - added null check for email field # [CONTEXT_FILE: src/services/user_service.py] # [PARENT_COMMIT: a1b2c3d] if not email: raise ValueError(Email cannot be empty)这个标注不是装饰而是 Agent 调度的关键信号。当 LLM 生成反馈时它会优先引用这些标签确保评论能精准锚定到具体位置。我们曾对比过带标注和不带标注的输出质量前者在“定位准确率”上提升 42%后者常出现“建议修改第 15 行”但实际 diff 只有 12 行的尴尬情况。3.2 LLM Agent 的 Prompt Engineering不是“写提示词”而是构建评审契约网上教程教你怎么写“请审查以下代码”这远远不够。“open-code-review” 的核心竞争力恰恰藏在 Prompt 的骨架设计里。我们不用通用指令而是定义了一套Code Review 专用 Prompt 协议CRPP包含四个强制区块Role Constraint Block角色与约束块You are a senior backend engineer at a fintech company, reviewing production-grade Python code. You MUST NOT suggest stylistic changes (e.g., PEP8) unless they impact security or performance. You MUST prioritize findings by severity: CRITICAL HIGH MEDIUM LOW.这个区块把 LLM 从“通用助手”锁定为“特定领域专家”并用MUST NOT/MUST强制约束输出范围避免它陷入无关的格式讨论。Context Injection Block上下文注入块Project Context: This is a payment orchestration service. All user-facing APIs must return HTTP 400 for invalid input, never 500. Database transactions must be atomic. [INSERT_PROJECT_CONTEXT_HERE]这里插入的是前面提到的ARCHITECTURE.md提取的关键规则让 LLM 的判断有据可依而非凭空猜测。Diff Slice BlockDiff 切片块[DIFF_SLICE_START] ... [DIFF_SLICE_END]严格限定输入范围防止 LLM “脑补”不存在的代码。Output Schema Block输出格式块Respond ONLY in this exact JSON format: { findings: [ { severity: CRITICAL|HIGH|MEDIUM|LOW, line_number: 42, code_snippet: if not email:, explanation: Null pointer risk when email is None, suggestion: Add explicit None check: if email is None: } ], summary: 3 findings: 1 CRITICAL, 2 MEDIUM }强制结构化输出便于后续解析、存档、甚至生成 Jira ticket。我们测试过 7 个主流开源模型Qwen2.5-Coder、DeepSeek-Coder、Phi-3.5-mini、StarCoder2、CodeLlama、StableCode、Ollamas codellama只有加入 Output Schema Block 后JSON 格式合规率从 58% 提升到 99.2%。提示不要迷信“更大的模型更好”。我们在 16GB 显存的 A10 上实测Qwen2.5-Coder-1.5B 在 CRPP 协议下对 Python 代码的逻辑缺陷检出率F1-score比 32B 的 DeepSeek-Coder 高 7.3%因为小模型在固定 Prompt 下更“听话”幻觉更少。选型逻辑很简单在满足准确率阈值我们设为 85%的前提下选推理延迟最低、显存占用最小的模型。3.3 本地模型部署为什么放弃 API 调用选择 Ollama LM Studio 组合热搜词里充斥着 “chatgpt failed to start. unable to locate the codex cli binary” 这类报错根源在于过度依赖外部 API。我们团队在公有云环境试过 OpenAI、Claude、Gemini 的 API结果是平均延迟 3.2 秒失败率 11.7%超时/限流/网络抖动且每次调用都需配置 API Key、管理 Rate Limit、处理 Token 计费。更致命的是API 返回的反馈无法审计——你永远不知道模型是基于哪几行上下文做出的判断。转向本地部署后我们用 Ollama 管理模型生命周期ollama pull qwen2.5-coder:1.5b用 LM Studio 提供 Web UI 调试 Prompt再通过ocrCLI 的--model qwen2.5-coder:1.5b参数无缝对接。关键优势有三点确定性同一份 diff每次评审结果完全一致便于回归测试隐私性所有代码 never leave 本地机器符合金融/医疗行业合规要求可调试性当某次评审出错你可以直接ollama run qwen2.5-coder:1.5b进入交互模式粘贴相同的 Prompt 和 diff实时观察模型思考过程。部署步骤极其简单以 macOS 为例# 1. 安装 Ollama curl -fsSL https://ollama.com/install.sh | sh # 2. 拉取轻量级代码模型2GBA10 显存友好 ollama pull qwen2.5-coder:1.5b # 3. 启动模型服务默认 http://localhost:11434 ollama serve # 4. 验证连接 curl http://localhost:11434/api/tags # 返回 {models:[{name:qwen2.5-coder:1.5b,...}]}整个过程 5 分钟搞定比配置一个飞书机器人 SDK 还快。而所谓的 “codex cli 安装失败”往往只是用户没搞清codex是 OpenAI 的旧版私有工具链早已停止维护现在社区通用的其实是llama.cpp或Ollama生态。4. 实操过程从零搭建你的第一个 open-code-review 环境4.1 环境准备三步完成基础依赖安装别被“LLM”“Agent”这些词吓住整个环境搭建的核心依赖只有三个Git、Python 3.10、Ollama。不需要 Docker、不碰 Kubernetes、不配 Kubernetes。我用一台 2018 款 MacBook Pro16GB RAMIntel i7实测全程离线可完成。第一步确认 Git 和 Python 版本# 检查 Git必须 2.25支持 --no-pager git --version # 应输出 git version 2.39.2 或更高 # 检查 Python必须 3.10因使用 match-case 语法 python3 --version # 应输出 Python 3.10.12 或更高 # 如果 Python 版本过低推荐用 pyenv 管理避免污染系统 Python curl https://pyenv.run | bash # 按照输出提示将 pyenv 加入 shell profile然后 pyenv install 3.11.9 pyenv global 3.11.9第二步安装并验证 Ollama# macOS 直接下载安装包https://ollama.com/download或用 Homebrew brew install ollama # LinuxUbuntu/Debian curl -fsSL https://ollama.com/install.sh | sh # Windows 用户请访问官网下载 .exe 安装程序不要用 WSL 模拟——Ollama 对 WSL2 支持不稳定 # 启动 Ollama 服务 ollama serve # 测试服务是否正常返回空 JSON 表示成功 curl http://localhost:11434注意Ollama 默认绑定localhost:11434如果你的机器有防火墙请确保该端口未被拦截。常见错误Failed to connect to localhost port 11434: Connection refused90% 是因为ollama serve没运行而不是端口被占。第三步安装 open-code-review CLI 工具# 创建项目目录 mkdir ~/ocr-env cd ~/ocr-env # 使用 pip 安装我们已将 CLI 打包为 PyPI 包 pip install open-code-review # 验证安装 ocr --version # 应输出 0.3.1 或更高版本 # 查看帮助 ocr --help这个open-code-review包是我和团队开源的GitHub: github.com/your-org/open-code-review它不包含任何模型只是一个智能 CLI 包装器负责 diff 解析、上下文注入、Ollama API 调用、结果渲染。所有模型权重都由 Ollama 独立管理彻底解耦。4.2 首次评审用一个真实 Django 视图函数演示全流程我们拿一个真实的、有缺陷的 Django 视图函数来演示。假设你正在开发一个博客系统views.py里有这样一个函数# views.py from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt import json csrf_exempt def create_post(request): if request.method POST: try: data json.loads(request.body) title data[title] content data[content] # 漏掉 author 字段校验 post Post.objects.create(titletitle, contentcontent) return JsonResponse({id: post.id}) except Exception as e: return JsonResponse({error: str(e)}, status400) return JsonResponse({error: Method not allowed}, status405)Step 1制造一个 staged diff# 修改 views.py 后暂存变更不要 commit git add views.py # 查看 staged diff git diff --cached # 输出会显示上面那个函数的修改假设你刚加了 csrf_exemptStep 2运行 ocr 进行评审# 执行评审命令自动读取 staged diff ocr review --staged # 或指定文件评审 ocr review --file views.pyStep 3观察 CLI 输出精简版 Reviewing 1 file: views.py ⚙️ Using model: qwen2.5-coder:1.5b (local) Context loaded: README.md, ARCHITECTURE.md, .git/config ✅ Finding #1 (CRITICAL) Line 12: if request.method POST: Explanation: CSRF exemption without explicit validation opens XSS attack vector. Suggestion: Replace csrf_exempt with manual token validation using django.middleware.csrf.get_token(). ✅ Finding #2 (HIGH) Line 15: data json.loads(request.body) Explanation: Untrusted JSON parsing may cause DoS via deep recursion or large payloads. Suggestion: Add payload size limit (e.g., request.body[:1024*1024]) and use json.JSONDecodeError handling. ✅ Finding #3 (MEDIUM) Line 18: post Post.objects.create(titletitle, contentcontent) Explanation: Missing author field assignment violates data integrity constraint. Suggestion: Extract author from request.user or require author_id in JSON payload. Summary: 3 findings (1 CRITICAL, 1 HIGH, 1 MEDIUM) — Review passed? NOStep 4深度解读这个结果CRITICAL 级别不是因为代码不能运行而是因为它直接违反了 OWASP Top 10 的 A1:2021失效的访问控制。csrf_exempt是危险信号Agent 结合ARCHITECTURE.md里写的 “All public APIs must validate CSRF tokens” 规则精准定位风险。HIGH 级别json.loads()在无防护情况下解析任意大小 payload是经典的 ReDoS正则表达式拒绝服务入口。Agent 从README.md的 “Security Policy” 部分读取到 “All JSON endpoints must enforce 1MB payload limit”从而提出具体建议。MEDIUM 级别Post.objects.create()缺少author字段这在 Django ORM 中会导致NOT NULL constraint failed错误。Agent 通过解析models.pyCLI 自动查找并注入中的Post.author models.ForeignKey(User)定义推断出必填字段。整个过程耗时 1.8 秒本地 A10 显卡比你手动读完这个函数还要快。而且所有建议都带具体行号、代码片段、解释和可执行方案不是泛泛而谈的“注意安全”。4.3 集成到日常开发流pre-commit hook 自动化评审让评审真正融入肌肉记忆关键是把它变成git commit的一部分。我们用标准 pre-commit hook 实现Step 1创建 hook 文件# 在项目根目录创建 .git/hooks/pre-commit #!/bin/sh # 检查是否有 staged python 文件 CHANGED_PY$(git diff --cached --name-only --diff-filterACMR | grep \.py$) if [ -n $CHANGED_PY ]; then echo Running open-code-review on staged Python files... # 执行 ocr失败则中断 commit if ! ocr review --staged --fail-on-critical; then echo ❌ open-code-review found CRITICAL issues. Fix them before committing. exit 1 fi fiStep 2赋予执行权限chmod x .git/hooks/pre-commitStep 3测试效果# 修改一个 .py 文件并暂存 echo print(hello) test.py git add test.py # 尝试 commit —— 会自动触发 ocr 评审 git commit -m test ocr hook # 如果评审通过commit 成功如果发现 CRITICALcommit 被拒绝并打印详细报告这个 hook 的设计哲学是只阻断 CRITICAL 问题不阻断 MEDIUM/HIGH。因为工程师需要快速迭代但绝不能把高危漏洞带入主干。我们团队上线此 hook 后生产环境因 CSRF 或 SQL 注入导致的线上事故归零而开发者的抱怨声反而下降——因为他们终于不用在 Code Review 时被反复追问“这个 API 为什么没校验 token”。4.4 进阶配置为不同项目定制评审规则ocr支持项目级配置文件.ocr.yaml放在项目根目录即可生效。这是一个真实电商项目的配置示例# .ocr.yaml model: qwen2.5-coder:1.5b review_rules: - severity: CRITICAL pattern: os.system|subprocess.call|eval message: Direct system call detected — use subprocess.run() with shellFalse - severity: HIGH pattern: datetime.now() message: Use timezone-aware datetime.utcnow() or django.utils.timezone.now() - severity: MEDIUM pattern: print\\( message: Use logging.getLogger(__name__).info() instead of print() context_files: - README.md - ARCHITECTURE.md - SECURITY_POLICY.md output_format: markdown # 可选 markdown/json/cli-tableCLI 会自动读取这个文件并在生成 Prompt 时把review_rules转换成自然语言约束加入 Role Block。比如当 diff 里出现os.system(rm -rf /tmp/*)Agent 就会触发第一条 CRITICAL 规则而不是等 LLM 自己“想起来”。这种规则引擎比纯 LLM 更可靠因为它是确定性的、可测试的、可版本化的。5. 常见问题与排查技巧实录那些官方文档不会写的坑5.1 “ocr command not found” —— 90% 是 PATH 问题不是安装失败这是新手遇到的第一个拦路虎。当你pip install open-code-review后执行ocr --version却提示command not found别急着重装。根本原因是pip 安装的可执行文件路径没加入系统 PATH。诊断方法# 查看 pip 安装位置 pip show open-code-review | grep Location # 输出类似Location: /Users/you/Library/Python/3.11/lib/python/site-packages # 查看可执行文件实际位置 ls -la $(python -c import open_code_review; print(open_code_review.__file__)) # 通常在 /Users/you/Library/Python/3.11/bin/ocr解决方案macOS/Linux# 将 pip bin 目录加入 PATH永久生效 echo export PATH$HOME/Library/Python/3.11/bin:$PATH ~/.zshrc source ~/.zshrc # 验证 which ocr # 应输出 /Users/you/Library/Python/3.11/bin/ocrWindows 用户在“系统属性 → 高级 → 环境变量”里找到用户变量Path添加C:\Users\YourName\AppData\Roaming\Python\Python311\Scripts。注意不要用sudo pip install这会把可执行文件装到/usr/local/bin但普通用户无权写入反而更麻烦。5.2 “Model qwen2.5-coder:1.5b not found” —— Ollama 模型名大小写敏感Ollama 的模型名是严格区分大小写的。qwen2.5-coder:1.5b和Qwen2.5-Coder:1.5b是两个不同的模型。当你执行ollama list时输出是NAME ID SIZE LAST PULLED qwen2.5-coder:1.5b 1a2b3c4d 1.8 GB 2 hours ago那么ocrCLI 里就必须用小写qwen2.5-coder:1.5b。如果输错会报错HTTP 404: Model not found。解决方案很简单始终用ollama list的输出作为模型名来源复制粘贴不要手敲。5.3 评审结果“过于保守”或“过于激进”—— 调整 temperature 和 top_p 参数LLM 的输出稳定性由temperature随机性和top_p核采样概率控制。默认值temperature0.1,top_p0.9适合代码评审——低随机性保证结果可复现高 top_p 保证多样性。但如果你发现过于保守总是只报 syntax error不提架构问题尝试--temperature 0.3增加一点创造性过于激进频繁报出不存在的 security issue降低--top-p 0.7让模型更聚焦于高概率 token。调整命令# 更激进的评审适合探索性重构 ocr review --staged --temperature 0.4 --top-p 0.95 # 更保守的评审适合金融核心模块 ocr review --staged --temperature 0.05 --top-p 0.6我们团队的黄金参数是temperature0.15,top_p0.85在准确率和实用性之间取得最佳平衡。5.4 如何让 ocr 支持私有 Git Hosting如 Gitee、内部 GitLabocrCLI 本身不依赖任何 Git Hosting 平台它只消费本地git diff输出。但如果你希望它自动拉取ARCHITECTURE.md等上下文文件而这些文件只存在于私有仓库只需配置 Git 的 credential helper# 配置 Git 凭据存储macOS Keychain git config --global credential.helper osxkeychain # 第一次 clone 私有仓库时输入账号密码Git 会自动存入钥匙串 git clone https://gitee.com/your-org/your-project.git # ocr 在读取 context_files 时会用同样的凭据访问远程 URL对于无外网的内网环境ocr支持--offline模式只读取本地已存在的文件完全不发起任何网络请求。5.5 性能瓶颈排查为什么评审突然变慢评审延迟主要来自三部分diff 解析毫秒级、上下文读取毫秒级、LLM 推理秒级。如果延迟超过 5 秒99% 是 LLM 推理问题。排查步骤确认模型是否在 GPU 上运行# macOS M系列芯片 ollama run qwen2.5-coder:1.5b --gpu # 强制启用 Metal GPU # NVIDIA 显卡 ollama run qwen2.5-coder:1.5b --num-gpu 1检查显存是否溢出# NVIDIA nvidia-smi # 查看 GPU memory usage # 如果 90%说明显存不足换更小的模型如 qwen2.5-coder:0.5b验证 Ollama 是否被其他进程抢占# 查看 Ollama 进程 ps aux | grep ollama # 如果有多个 ollama serve 进程kill 掉多余的 pkill -f ollama serve我们实测在 RTX 4090 上qwen2.5-coder:1.5b的平均推理延迟是 0.8 秒在 M2 Ultra 上Metal 加速后是 1.2 秒而在仅 CPU 模式下--num-gpu 0同一模型要 8.3 秒——所以GPU 加速不是可选项而是必选项。6. 实战扩展从单机 CLI 到团队级评审流水线6.1 在 CI/CD 中嵌入自动化评审以 GitLab CI 为例把ocr接入 CI能让每次 MRMerge Request都自动获得一份评审报告无需人工触发。以下是.gitlab-ci.yml的核心片段stages: - review code-review: stage: review image: python:3.11 before_script: - pip install open-code-review - curl -fsSL https://ollama.com/install.sh | sh - ollama pull qwen2.5-coder:1.5b script: - ocr review --branch $CI_COMMIT_REF_NAME --output-format markdown review-report.md artifacts: - review-report.md only: - merge_requests关键点--branch $CI_COMMIT_REF_NAME让 CLI 自动 checkout 并 diff 当前 MR 的变更artifacts将评审报告作为 CI 产物GitLab 会自动在 MR 页面展示only: merge_requests确保只在 MR 时运行不污染 pipeline。我们团队用这套配置后MR 平均评审时长从 4.2 小时缩短到 1.1 小时因为工程师在提交前已根据 CLI 报告修复了 70% 的问题。6.2 构建团队知识库用评审历史训练专属 LLMocr的每一次评审都会生成结构化 JSON 输出。我们把这些数据定期导出构建团队专属的 Code Review 知识库# 导出最近 30 天的所有评审记录 ocr export --since 30 days ago --format json review-history.json # 用这些数据微调一个轻量级 LoRA 模型基于 Qwen2.5-Coder # 输入diff slice project context # 输出团队风格的评审建议比如我们团队习惯说“建议改为 xxx”而非“你应该 xxx”微调后的模型对团队特有的代码模式如自研 RPC 框架的异常处理规范识别准确率提升 35%证明了“领域微调”比“通用大模型”更适合 Code Review。6.3 与现有工具链打通为什么不用替代 GitLab Review 或 SonarQubeocr的定位从来不是取代现有工具而是填补空白。GitLab Review 是 PR 级别的协作平台SonarQube 是静态扫描的指标仪表盘而ocr是开发者本地的、变更粒度的、带上下文的智能协作者。它们的关系是ocr在git commit前提供即时反馈预防SonarQube 在 CI 中做全量扫描检测GitLab Review 在 MR 中做人工决策确认。我们用ocr生成的 JSON 报告可以轻松转换成
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →