ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

DeepSeek+GitHub Actions实现PR自动Review的实战指南

DeepSeek+GitHub Actions实现PR自动Review的实战指南 先说个我的个人结论给 GitHub 仓库接入 DeepSeek 做 PR 自动 Review这件事我在真实项目上跑了一个多月它没法替代人工 code review但确实能把 70% 以上的机械性问题直接过滤掉剩下的才是真正值得花脑力去思考的架构、可维护性和产品逻辑问题。这篇文章就讲清楚整套方案怎么落地、踩过哪些坑、以及最终怎么调才能让团队真的愿意用。它适合谁看如果你在维护一个活跃的 GitHub 仓库、是团队里的技术负责人或者一个人管着好几个项目、每天在 PR 列表里反复看同样的低级错误那这套自动 review 能帮你省下大量时间。如果你想跑通之后继续调优前面几节的踩坑记录比教程本身更值钱。1. 先说结论为什么我给仓库接入 AI 自动 Review而不是继续指望人工1.1 人工 Review 的三个现实困境我一开始也没想过要上 AI review毕竟 code review 是最讲究“人味”的环节。但真实项目跑久了几个问题越来越明显。第一个困境是维护者时间完全碎片化。PR 不像是开会可以你定个时间一起看。它往往是你在写下一个功能的时候突然冒出来的你得从当前上下文里跳出来去理解别人改了什么然后再跳回去。一天如果有三四个 PR来回切换的损耗其实非常大。第二个困境是低级问题占用了太多注意力。我经常在 review 里看到未处理的边界条件、缺少空值判断、日志打错变量、注释和代码不一致这类问题。不是说这些问题不重要而是这些问题太机械了它会让评审者有一种“我怎么又在重复说这件事”的疲惫感真正重要的架构问题反而没精力仔细想了。第三个困境是大 PR 特别容易漏。改了两三千行的 PR人工逐行去看根本不现实最后就是大概扫一遍重点看 diff 里的可疑区域。结果往往就是问题刚好藏在那些“大概扫一眼”的位置等合并上线之后才暴露。1.2 AI Review 的定位不是替代人是过滤 80% 的机械问题接入 DeepSeek 之后我最深的体感是它不能替代人做判断但它能当一个极其负责的“初筛员”。我现在的流程是PR 一提交AI 先过一遍把空指针风险、异常处理缺失、硬编码、明显的逻辑边界问题、遗留的调试代码全部找出来直接在 PR 里评论。团队成员看到评论之后能快速判断哪条是真的需要改哪条是误报。然后人工 review 聚焦在“这个设计合不合理”“这个抽象该不该引入”“这个接口有没有扩展性”这些问题上。说白了AI 负责处理机器能看出规律的部分人负责处理需要经验和品味的部分。这个分工一旦建立review 的节奏就健康了。1.3 DeepSeek 在这一场景里的独特优势为什么选 DeepSeek 而不是 Claude 或者 GPT最直接的原因是价格和上下文的平衡。Code review 这个场景的输入往往是一大段 diff 文本动辄几千甚至上万 token。如果用最贵的模型一次 PR review 跑下来一天几十个 PR账单会非常可观。DeepSeek 的 API 价格属于便宜的那一档上下文长度也足够放下一整个中等规模 PR 的 diff再加上它对中文和英文混杂的代码注释理解得都不错对于我的使用场景来说性价比非常高。我个人的使用感受是DeepSeek 在代码理解上当然不是最强的但作为一个“初筛员”它的准确率完全够用。尤其在中文注释较多的项目里它的反馈经常比英文模型更贴合上下文。价格、上下文、语言适配这三个因素合起来它就变成了一个可以长期稳定跑在 CI 里的角色。2. 方案选型自研全家桶还是拥抱现成 Action2.1 现有开源方案盘点动手之前我先把市面上的方案过了一遍。只列我实际试用过的三款方便你做选择。方案语言优点缺点能否接 DeepSeekopenai-code-reviewTypeScript配置简单、生态成熟、社区活跃开箱即用Prompt 是内置的改起来不够灵活规则偏通用可以它支持自定义 baseURL 和 modelVibe ReviewGo单二进制文件、速度快、依赖少输出逻辑比较简单复杂场景能力弱可以环境变量改 baseURLCodium PR AgentPython功能全面支持多种 review 模式、命令交互较重依赖多自助部署要折腾云服务收费官方支持多种模型配置 DeepSeek 需要手动改我的结论是如果你只是想给团队快速上一个 AI review不想花太多时间维护直接用 openai-code-review把 baseURL 改成 DeepSeek 的 API 地址十几分钟就能跑通。但如果你跟我一样对 review 的规范有自己的想法想完全控制 prompt 和评论格式那就值得自研一个轻量脚本。我选择自研还有一个原因现成方案普遍默认把所有 diff 一次性塞给模型输出的评论没有严重级别区分也没有上传到 Files changed 的 inline 位置对团队实际协作的干扰挺大的。自己写虽然要维护但“行为可控”这件事在长期使用中太值钱了。2.2 我最终选择的架构GitHub Actions 一个轻量 Node.js 脚本最终我的架构是GitHub Actions 负责事件触发一个 Node.js 脚本负责业务流程。整个链路是GitHub 收到 PR 事件 → workflow 被触发 → checkout 代码 → 脚本读取 PR diff → 调用 DeepSeek API → 解析模型返回的 JSON → 通过 GitHub API 把 review 评论写回 PR。没有常驻服务器没有复杂的消息队列就是一次事件驱动式的任务。选择这个架构最关键的原因是GitHub Actions 的免费额度对一个中型团队来说足够了而且 workflow 天然可以复用仓库的 secrets 和 token不用自己另外管理密钥。为什么不写一个常驻的 GitHub App Bot如果你要做企业级多仓库、有自定义 UI、要批量管理确实值得做 Bot。但我这边就是几个仓库需要自动 review常驻服务的运维成本完全是浪费。2.3 触发方式的关键差异pull_request 与 pull_request_target这里有个非常重要的分支点你自己的仓库和 fork 仓库的 PR 处理方式完全不同。pull_request这个触发事件是最直观的PR 打开或更新时触发 workflow。但它有两个限制对于 fork 仓库的 PRGITHUB_TOKEN默认只有只读权限你没办法用它在 PR 里写评论而且 fork PR 的 workflow 默认不会自动读取仓库 secrets需要维护者手动批准才跑一次。pull_request_target则是在 base 分支的上下文里运行的token 有写权限也可以读取 secrets但是因为它在 base 分支上执行未经审查的 PR 代码理论上可能通过恶意脚本影响 workflow 环境存在注入风险。我的建议非常简单内部团队仓库直接用pull_request配合适当的 permissions 配置就可以写评论开放仓库需要处理外部贡献者的 PR再考虑pull_request_target并务必在 workflow 里限制外部脚本的执行范围不能无脑用。3. 落地第一版30 分钟跑通“PR 提交后自动评论”3.1 workflow 配置文件逐行拆解有了选型之后第一版其实很快。我先贴出完整的 workflow 文件再拆关键字段。name: deepseek-pr-review on: pull_request: types: [opened, synchronize, reopened] permissions: contents: read pull-requests: write concurrency: group: pr-review-${{ github.event.pull_request.number }} cancel-in-progress: true jobs: review: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkoutv4 with: fetch-depth: 0 - name: Setup Node uses: actions/setup-nodev4 with: node-version: 20 - name: Install dependencies run: npm ci - name: Run DeepSeek review run: node review.mjs env: DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }} GITHUB_BASE_REF: ${{ github.base_ref }}几个字段单独说一下。types: [opened, synchronize, reopened]意思是 PR 刚创建、有新 commit 推送、被重新打开这三种时候触发。synchronize 特别重要它保证同一轮 review 评论只针对最新代码避免团队在旧代码上反复讨论。permissions必须显式写清楚。尤其是pull-requests: write少了它后续调用 GitHub API 创建 review 会直接 403。fetch-depth: 0是为了 checkout 时拉取完整历史。我第一版没写这个参数结果git diff时拿不到完整对比只能靠 GitHub API 补救。如果确定用 API 方式获取 difffetch-depth可以不用 0但本地 diff 的方式更可控后面会说。concurrency这一段是我被坑过之后加上的。同一 PR 如果连续 push 两次会同时触发两个 workflow不加并发控制就会出现重复评论。同组的cancel-in-progress: true会让旧的 review 任务直接取消只保留最新一次。3.2 Review 脚本的核心流程workflow 只是骨架真正干活的是review.mjs。流程分成四步取 diff、组装 prompt、调 DeepSeek、写评论。取 diff 有两种做法。第一种是用 GitHub API 直接拿 PR 的 diff这种方式不用依赖本地仓库历史代码也更简单大致是这样import { Octokit } from octokit; const owner process.env.GITHUB_REPOSITORY.split(/)[0]; const repo process.env.GITHUB_REPOSITORY.split(/)[1]; const prNumber Number(process.env.PR_NUMBER); const octokit new Octokit({ auth: process.env.GITHUB_TOKEN }); const pr await octokit.rest.pulls.get({ owner, repo, pull_number: prNumber, }); const diffResp await fetch(pr.data.diff_url, { headers: { Authorization: Bearer ${process.env.GITHUB_TOKEN}, Accept: application/vnd.github.v3.diff, }, }); const diff await diffResp.text();第二种是 checkout 之后本地git diffimport { execSync } from node:child_process; const baseRef process.env.GITHUB_BASE_REF; const diff execSync( git diff --unified20 origin/${baseRef}...HEAD, { maxBuffer: 10 * 1024 * 1024 } ).toString();两种我都用过后来我固定在本地 diff。原因是 API 返回的 diff 默认unified3上下文太少模型经常因为看不到函数上下文而误判。本地执行--unified20可以让每段 diff 带上更多上下文模型判断准确率明显提升。拿到 diff 之后拼一个用户消息调用 DeepSeek 的 chat completions 接口const systemPrompt 你是一名资深代码评审专家。你的任务是审查 Pull Request 的 diff 内容找出明确的问题例如空指针风险、异常处理缺失、明显的逻辑错误、资源未释放、硬编码、调试残留代码、并发问题等。只报告你有把握的问题不要为了凑数量而输出。; const userPrompt 请 review 以下 Pull Request 的 diff 内容。\n\nPR 编号#${prNumber}\n分支${baseRef}...HEAD\n\n${diff}; const resp await fetch(https://api.deepseek.com/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${process.env.DEEPSEEK_API_KEY}, }, body: JSON.stringify({ model: deepseek-chat, temperature: 0.2, max_tokens: 4096, messages: [ { role: system, content: systemPrompt }, { role: user, content: userPrompt }, ], }), }); const data await resp.json(); const reviewContent data.choices[0].message.content;这里的temperature: 0.2是一个关键参数。最开始我用默认的 1.0模型输出天马行空经常提出“建议把整段函数重写”这类不靠谱的意见。降到 0.2 之后输出稳定很多更接近“客观审查”而不是“自由发挥”。3.3 把评论发回 PRGitHub API 的三种姿势模型返回内容之后怎么把它发回去也有讲究。GitHub 提供三种写评论的方式我整理成表格供你对照。API入口展示位置适合场景Issue CommentPOST /repos/{owner}/{repo}/issues/{issue_number}/commentsPR 对话页的评论区快速验证流程、输出整体 review 报告Pull Request ReviewPOST /repos/{owner}/{repo}/pulls/{pull_number}/reviewsFiles changed 页面的 review 摘要正式 review 评论可设 eventCOMMENTPull Request Review CommentPOST /repos/{owner}/{repo}/pulls/{pull_number}/comments具体代码行旁边精确定位到 diff 某一行我先用的第一种因为实现最简单几行代码就能跑通。但用了两天发现如果真的发几十条 issue commentPR 页面会被刷屏团队成员的 GitHub 通知直接爆炸。后来我改成第二种把模型输出的全部意见汇总成一条 review 摘要通过createReview发出去这样至少有“整体报告”的格式感评论数量被压到一条。最终版本是两种混用整体 summary 用 review 提交具体到每个文件的问题用 inline 评论提交到对应代码行。代码大概这样await octokit.rest.pulls.createReview({ owner, repo, pull_number: prNumber, event: COMMENT, body: AI 自动 review 结果\n\n summaryText, });inline 评论相对复杂它需要你传入具体的commit_id、path和line参数而且只能定位到 diff 中包含的行。我的做法是让模型在输出 JSON 时附带file和line字段脚本解析后再逐条提交。3.4 环境变量与 token 权限配置这一节是我第一次部署时踩坑的重灾区必须单独拎出来说。GITHUB_TOKEN是 GitHub Actions 自动注入的临时 token不需要你自己去生成 PAT。它的权限范围由 workflow 里的permissions字段控制。上面 yaml 里写的是read加上pull-requests: write这就能创建 review 和评论了。如果你嫌不够还可以加issues: write但一般用不上。DEEPSEEK_API_KEY需要去 DeepSeek 开放平台创建然后手动添加到仓库的Settings - Secrets and variables - Actions里key 名随意只要和 workflow 里env的变量名对得上就行。还有两个容易忽略的细节脚本里绝对不要console.log任何包含 API key 的变量否则在 Actions 日志里就能看到你要保密的东西fetch请求失败时要做好重试因为大模型 API 偶尔会因限流返回 429最简单的做法是加一个三到五次的指数退避重试。4. Prompt 才是这套系统的灵魂4.1 我调了三版才满意的 Prompt 结构第一版 prompt 我就写了句“请 review 这个 PR”结果模型确实 review 了但全是大而化之的建议比如“这段代码可以优化为更简洁的方式”这种车轱辘话对代码没有任何帮助。第二版我加了限制条件要求“找出所有问题”结果它走向另一个极端每个变量声明都能挑出毛病一次 PR 能生成四五十条评论团队成员被逼得想把这个 workflow 关掉。第三版我彻底重构了 prompt核心是这四块角色定义、审查规则、输出格式、不要做什么。我现在的 system prompt 长这样已经稳定用了好几周你是一名专业的代码评审专家正在审查一个 Pull Request。 你的职责 1. 只报告你确信存在的问题不要输出猜测或风格建议。 2. 检查范围包括空指针风险、未处理的异常、边界条件缺失、并发访问问题、资源泄漏、明显的逻辑错误、调试残留代码、安全问题。 3. 忽略纯格式问题例如缩进、空格、命名风格除非它与项目既有约定明显冲突。 4. 如果某个问题只涉及可能存在风险的写法用建议而不是必须的措辞。 5. 不要尝试重写整段代码不要建议大规模重构除非当前实现存在致命缺陷。 6. 输出必须是一个 JSON 数组不要包含其他任何文字。 JSON 结构 [ { file: 相对路径, line: 行号, severity: error | warning | suggestion, message: 一句话说清问题必须具体 } ]这版 prompt 的关键是把“确定有问题”和“可能有问题”分开把“风格建议”直接禁止掉。我始终认为AI review 的定位是抓确定性问题不是替代人做架构建议。4.2 如何把 diff 塞进上下文并控制成本代码 review 最费 token 的地方就是 diff 太长。动辄上万字单次请求很容易把上下文吃满。我的处理办法有三个。第一是按文件分批 review。修改文件超过一定数量时把文件拆成多个批次分别调用 DeepSeek最后再汇总。这样每个请求的上下文都控制在合适长度避免一次请求里塞太多内容导致模型理解能力下降。第二是截断超大文件。单个文件超过 1500 行 diff 的时候我会截取前 1500 行并在 prompt 末尾加一句“以下代码超长已被截断请只 review 可见部分”。这个明确提示比强行全部塞进去强得多因为模型看到不完整代码时如果不知道被截断了就容易根据前面内容自己脑补后半段给出完全错误的建议。第三是跳过不需要 review 的文件。package-lock.json、yarn.lock、dist 目录下的产物、图片和 PDF 这类二进制变更可以直接过滤掉既省 token 又避免噪音。成本方面DeepSeek 的 API 价格我在用的时候足够低日常一个中等规模的 PR几十个文件、几千行 diff折合下来基本是几分钱到一毛钱量级对个人开发者来说几乎可以忽略不计。部署之后建议留意一个月账单心里有个底。4.3 输出格式约定与评论去重先说输出格式。我上面特意要求模型输出纯 JSON 数组但大模型并不总是听话经常会在 JSON 外面包一层 markdown 代码块。所以脚本里一定要有解析兜底function extractJson(text) { const match text.match(/(?:json)?\s*([\s\S]*?)/); const content match ? match[1] : text; return JSON.parse(content); }解析失败的时候不要直接让 workflow 失败而是把原始文本作为一条普通 review 评论发回去这样至少团队知道 AI 出了什么问题而不是在 CI 日志里找半天。再说去重。如果 PR 连续更新了好几次第一次 review 的评论还挂在旧代码上第二次 review 又一次提交页面就变得特别乱。我的做法是每次 review 之前先删除我自己机器人之前发过的 review 评论。删除接口不好用的话可以直接列出现有评论通过评论里的固定标记比如!-- ai-review:deepseek --识别自己的评论再逐个删除。去重的核心逻辑是同一个 commit 只 review 一次同一个 PR 的新 commit 要清掉旧评论再发新的。5. 上线后踩过的 7 个坑从权限 403 到评论轰炸5.1 权限不足导致的 403 与解决方案现象很典型workflow 日志里 API 调用返回403但代码明明在执行。我一度以为是 token 过期折腾了半天才发现问题在 workflow 的permissions字段。GitHub Actions 的默认权限在某些场景下不是写权限尤其是你想通过 API 创建 review 时默认的GITHUB_TOKEN可能只有contents: read。解决方式就是在 workflow 里显式声明permissions: pull-requests: write。这个字段是 workflow 级的放在 jobs 外面就可以了。排查方法很简单在脚本里捕获错误时输出 response bodyGitHub API 会明确告诉你缺少什么 scope。5.2 diff 过大超 tokens 截断后AI 开始胡说这个问题是最难发现的。有几次 review 评论看起来有板有眼但建议的内容完全是错的严重到会误导人。后来我把发送给 API 的完整请求打出来看才发现是因为 diff 超过了模型上下文长度被客户端或服务端截断之后模型看到的只是函数的开头部分剩下的全是它自己脑补的。从那之后我做了两件事一是在代码里主动判断 diff 长度超过阈值先按文件拆批次二是截断时一定要在 prompt 里写清楚“以下代码不完整只 review 你看到的这部分”。如果不加这句话模型会默认代码是完整的然后基于不完整的信息给出“自信且错误”的建议。5.3 评论轰炸每个文件都挑毛病PR 没法看第二版 prompt 的惨痛教训。模型一旦被要求“找出所有问题”它能把每个文件都评论一遍哪怕只是把i改成i 1也要给一条 suggestion。那次一个改了三行代码的 PR模型硬是回了 20 条评论团队群里全是吐槽。解决方式就是我前面提到的在 prompt 里明确“只报告 error 和 warning 级别的确定问题”并且在脚本侧再加一道关卡——最多只发 10 条评论超出部分只保留前 10 条。事实证明强制限制评论数量比依赖模型自觉可靠得多。5.4 并发触发与重复 review 问题第一次遇到重复评论是因为作者 push 了一次代码紧接着又 push 了一次两个 workflow 几乎同时启动都拿到了旧 diff然后各自调了一次 API各发了一条几乎一样的评论。添加concurrency之后同一 PR 的冲突任务会自动取消新任务会等旧任务清理完再跑。另外删除旧评论的逻辑也要在写新评论之前执行否则即使并发控制生效同一个 PR 跑三次还是会有三条。5.5 markdown 渲染失败的评论这个问题说起来很蠢。模型返回的内容里包含代码块我的脚本把它拼进 review body 之后GitHub 在渲染评论时出现了嵌套代码块的显示混乱。评论区看起来像被炸过一样代码块互相咬合。后来我统一要求模型返回纯 JSON不再返回大段 markdown 文本。JSON 解析后由脚本重新组织成简洁的文本再提交这样渲染问题基本消失。如果你一定要保留 markdown 报告格式至少要对评论内容里的反引号做转义。5.6 中文 prompt 在多语言仓库里的表达漂移我的仓库里有大量中文注释但代码里的变量名和关键字是英文的。有一阵子模型的 review 评论一会儿中文一会儿英文同一个 PR 里两种语言混着发特别乱。解决方案是在 prompt 里明确指定输出语言固定用中文输出评论。如果你团队是国际化协作也可以改成“使用与代码注释一致的语言”然后让模型自己判断。5.7 API 限流与成本控制大模型 API 不是无限量的。团队成员多人同时提交 PR 时偶尔会遇到 429 限流。我处理的方式是请求重试但重试有个上限超过三次就不再尝试以避免 workflow 卡在那十分钟。成本控制上除了前面说的过滤文件和截断 diff我还会在 PR 变更行数超过 1000 行时只对新增代码进行 review完全忽略删除和未修改的部分。新增代码是问题高发区这样能让成本大头花在最有价值的地方。6. 进阶让 AI Review 真正融入团队工作流6.1 只 review 变更文件不 review 整个项目第一版脚本有个很傻的做法我把 checkout 下来的整个仓库内容塞了一半进上下文想着让模型有更多背景信息。后来发现这不仅费 token还让模型经常提出“和本次改动无关”的建议。正确的做法是只给模型看 PR 的 diff也就是变更文件的新旧内容对比。模型需要判断的是“这一次改动引入了什么问题”而不是“这个项目整体有什么问题”。范围控制住之后输出质量立刻提升了一个档次。6.2 按文件路径/语言过滤 review 范围不是所有 PR 都需要 AI review。文档更新、配置文件微调、依赖升级这些场景跑一遍大模型纯属浪费。现在我在 workflow 和脚本里做了两层过滤。workflow 层用paths字段控制只在特定目录变更时触发on: pull_request: paths: - src/** - tests/**脚本层则是读取变更文件列表如果全是.md或.json这类文件直接跳过 API 调用打印一下“本次变更无需 review”就结束。这个判断逻辑虽然简单但省下来的 token 和噪音是真的多。6.3 与 CI 状态联动把 review 结果作为 check评论只是“提示”团队很容易忽略。后来我用 GitHub Checks API 把 AI review 结果挂成一次真正的 check run这样 PR 合并按钮旁边会直接显示一个检查项。如果 check run 结论是failure至少能拦住一部分人在合并前不点确认。实现不复杂脚本里调用 checks APIawait octokit.rest.checks.create({ owner, repo, name: DeepSeek Review, head_sha: pr.data.head.sha, status: completed, conclusion: hasErrors ? failure : success, output: { title: DeepSeek 自动 Review 结果, summary: 发现 ${errorCount} 个错误、${warningCount} 个警告, }, });不要一上来就把结论设成 failure否则第一天就会被团队关掉。建议前两周只作为 neutral 状态展示等大家认可了再把它升级成硬性检查。6.4 用 review 历史数据反哺 Prompt团队里的 code review 是有“约定俗成”的比如错误必须用自定义 error 类型、禁止直接抛字符串、日志必须包含请求 ID 等等。这些规范写不进通用 prompt但对团队很重要。我的做法是每个季度整理一次团队的 review 惯例挑出最近一个月人工 review 里反复出现的要求把它们写成“项目规范”追加到 system prompt 末尾。用了之后明显感觉到模型输出的建议越来越贴合团队的实际约定。比如我们有一条规范是“禁止裸字符串抛错”我把这条加到 prompt 后AI 会在团队有人写throw new Error(xxx)时提醒统一使用AppError这个反馈以前是完全没有的。6.5 什么场景我不建议 AI Review最后泼一盆冷水。如果你的仓库很小、参与人数就两三个、PR 频率很低不要上这套方案。维护脚本和调 prompt 的成本可能比人工 review 还高。如果你的代码涉及大量敏感逻辑或者公司要求模型不能出内网那也别让代码直接发送到第三方 API。这种情况下要么用私有化部署的小模型要么干脆只跑本地静态检查。还有一个很实际的情况如果你的团队目前连人工 review 都还没跑起来先别指望 AI 代替流程。AI review 永远是辅助它帮不了你建立 review 文化只能在你已经有了 review 习惯的基础上帮你减负。我现在的用法是让 DeepSeek 只负责找“确定有把握的问题”风格建议交给 lint架构讨论留给人。它偶尔也会给出非常愚蠢的建议比如把一段没问题的高阶函数改写成 for 循环但当你把 prompt 里“不要建议大规模重构”提到显眼位置并且团队已经习惯了“AI 评论仅供参考”之后整体收益是非常明显的。如果你也在折腾这个方向我的建议是从一条汇总 review 评论开始先让团队接受这个机器人的存在再逐步调优成 inline 模式或 check 模式。不要一上来就铺满评论机器人的口碑一旦做砸了后面想再捡起来就难了。
返回列表