使用 n8n 结合大模型自动进行 code review

2,960 阅读1分钟

背景

随着 AI 越来越火,在很多方面提高了开发效率,比如智能填充代码、AI 生成单测、AI 进行 Code review 等,本期讲解下在 Github/GitLab 提交 PR 时,使用 chatGPT 等大模型对提交的代码变动进行 Code Review,最终以将建议提交到 PR 中评论中。

实现效果如下:

image.png

image.png

前置要求

  1. 足够的 token:OpenAI 或者其他大模型都可以;
  2. n8n:实现一个工作流,可用云服务或者自建;
  3. GitHub/GitLab:一个可测试的项目;
  4. ngrok:自建 n8n 内网穿透用;

n8n 本地部署

Docker 安装

按照官网的流程执行,由于国内从 Docker Hub 镜像会失败,这里直接找一个 Docker 同步的网站下载 n8n 的镜像

$ docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/n8n-io/n8n:1.59.4
$ docker volume create n8n_data

$ docker run -it --name n8n -p 5678:5678 \
  -e GENERIC_TIMEZONE=Asia/Shanghai \
  -e TZ=Asia/Shanghai \
  -v n8n_data:/home/node/.n8n \
  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/n8n-io/n8n:1.59.4

启动成功后按指引打开 http://localhost:5678 然后注册登陆。

workflow 配置

成功登陆后,创建一个新的 workflow,导入以下配置

GitHub: gist.github.com/JeaNile/0ee…

GitLab: gist.github.com/JeaNile/978…

配置需要调整的点:

  1. GitHub/Gitlab 的 token
  2. LLM 的 key

后续从流程配置上详细讲解。

ngrok 内网穿透

由于后续的 webhook 需要能访问的公网,这里直接用 ngrok,按照官网操作,将应用下载后执行以下命令

# 解压下载的ngrok文件到本地bin目录,以便在系统任何位置都可以运行ngrok
sudo unzip ~/Downloads/ngrok-v3-stable-darwin-amd64.zip -d /usr/local/bin

# 查看版本
ngrok -v

# 为ngrok添加认证令牌,自行替换成自己的 token
ngrok config add-authtoken <YOU_TOKEN>

# 禁用HTTP代理
set http_proxy=false

# 将n8n的暴露到公网上
ngrok http http://localhost:5678

启动成功后,会显示如下信息,Forwarding 中的提供了一个公网,点击这个链接,能够能访问到 n8n 的页面就说明转发成功了

❤️  ngrok? We're hiring https://ngrok.com/careers

Session Status                online
Account                       ** (Plan: Free)
Version                       3.18.2
Region                        Japan (jp)
Web Interface                 http://127.0.0.1:4040
Forwarding                    https://505d-61-141-167-205.ngrok-free.app -> http://localhost:5678

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

n8n 流程配置

关于每一步的流程在最后详细讲解

git webhook

首先第一步就是将 n8n 提供的 webhook URL 配置到 GitHub/Gitlab 上,由于这里是自建所以复制 URL 后需要替换成 ngrok 提供的公网域名,也就是最终域名如下:

https://505d-61-141-167-205.ngrok-free.app/webhook-test/4b8de672-fbc8-41c9-a4b4-a218579206cc

GitHub

image.png

image.png

GitLab

image.png

image.png

git token

GitHub

到个人设置创建一个提供 n8n 调用评论的 token

Setting -> Developer Settings -> Personal access tokens -> Tokens (classic) -> Generate new token (classic)直达

image.png

同时配置权限,这里 discussion 一定要选上,不然可能没权限 GitHub 会报 404,并不会给到实际错误。

image.png

创建成功的后会出现对应 ghp_ 开头的 token,直接复制保存好。

ghp_xxxxxxx

将「Get Changes」和「Post Discussions」 里 token value 替换成对自己的 token ,注意保留前面的 token

image.png

Gitlab

创建 token

image.png

和 GitHub 一样,不过不需要保留 token

image.png

LLM key

由于 OpenAI 充值比较麻烦,这里直接用国产大模型,目前国产还是挺多注册送大量 token,这里使用「智谱」。

image.png

这里替换 URL 使用智谱的 API,同时填入对应模型,居然看官方文档:智谱AI开放平台

image.png

填写 API KEY

image.png

n8n 执行效果

image.png

image.png

节点解释

当前存在的问题

费用问题

目前各平台的模型价格对比:国内外 AI 大语言模型 API 价格对比 | AI 排行榜官网 - AIGCRank.cn

OpenAI:

  1. 当前已使用:Site Unreachable
  2. Token 费用计算:Site Unreachable

需要根据项目每天的 PR 和代码量评估费用,有同事测试了提交 50 次,PR 改动大概百行,只使用了 0.19,预计每日使用不超过0.19,预计每日使用不超过 1,看起来价格是可接受范围。

rate-limits

每个平台都存在请求速率限制的情况,并且按用户等级划分,比如 OpenAI 的免费用户只能每分钟请求 3 次,而 PR 是按改动文件划分,因此如果超过三个文件则会被限制。

解决方法:

  1. 提升用户等级;
  2. 限流后使用指数退避的形式。

OpenAI

智谱 AI 开放平台

代码安全问题

提交给 AI 平台的代一般是 PR 中的 Diff 代码,不涉及文件内的完整代码,理论上是可接受的,如果无法接受任何代码暴漏,那么可以自行部署大模型。

参考

yp8uiaigqd.feishu.cn/docx/GIOddT…

n8n.io/workflows/2…