让 AI 帮忙做 code review
文章目录
- 背景
- 实现步骤
- 1.本地部署 AI 服务
- 2.开启服务接口
- 3.获取 diff
- 4.获取 code review的结果,并推送给相关人员
背景
我们平时的工作当中合并代码的时候都需要进行 code review,很多工具都能帮助我们自动进行代码审查,但一般都只能够进行代码格式和代码风格的检查,一些简单的逻辑就没有办法了。有没有可能让 AI 来帮我们做 code review 呢?让 AI 帮助我们检查代码的风格或者逻辑漏洞,并给出建议,最后再让相关的人确认,听起来这似乎是可行的。
具体的流程如下:
我们目前的工程托管在了 gitlab 上,每次发起一次 merge request 的时候都会产生一个事件,触发服务端将 diff 代码发送给本地 AI 大模型,AI review 完成之后,再将结果推送给相关人员。
code review 涉及到代码的保密,所以这里并没有使用 chatgpt 之类的服务,而是需要在本地部署一个 AI 服务。
实现步骤
1.本地部署 AI 服务
我用的是 llama3.1:8b 模型,实际测试资源占用相对较少,也能满足我们的需求,而且部署起来也非常的方便。
从这里下载:https://ollama.com/download/windows
选择对应的系统进行安装,安装完成之后执行命令,等待下载
ollama run llama3.1:8b
下载成功之后,就可以和它进行交互了
2.开启服务接口
这里我是用的是 lobe-chat,可以很方便的测试各种 AI 大模型,并且还可以在本地开启一个服务接口,通过 http 的方式和大模型进行交互。
地址:https://github.com/lobehub/lobe-chat.git
clone 下来之后在根目录执行
pnpm install
pnpm dev
执行完了之后,在浏览器输入 http://localhost:3010/ ,就可以看到 lobe-chat 的界面了,
我们可以在设置界面看到本地安装的大模型
设置之后可以和大模型进行对话
可以看到每次对话访问的都是本地的接口
这样我们也可以仿照这种方式和大模型进行交互。
3.获取 diff
gitlab 支持 webhook,并且 mr 事件当中还包含合并的 id,我们可以根据 id 获取到这次代码合并的 diff
https://gitlab.cn/docs/jh/api/merge_requests.html
def getDiff(project, mergeRequestId):
token = project['token']
projectId = project["projectId"]
webhookUrl = "xxx"
headers = {
"PRIVATE-TOKEN": token
}
response = requests.get(webhookUrl, headers=headers)
text = response.json()
print(response.status_code)
print(response.text)
return text
4.获取 code review的结果,并推送给相关人员
这里直接利用 lobe-chat 访问的接口,将 diff 给到大模型,其中有几个参数需要注意,
temperature:控制生成文本的随机性,值越低输出更确定,值越高输出会更具创意,code review场景比较适合较低的值;
top_p:控制采样策略,较高的 top_p 会让模型选择更多样的词语。这里推荐的是0.8-0.9;
frequency_penalty:较高的值鼓励模型避免重复,较低的值允许模型更自由的重复;
presence_penalty:较高的值鼓励模型提出新观点或者主题,较低的值限制新话题产生,保持专注;推荐0.2-0.5;
def aiCodeReview(language, diff):
print("start code review")
url = "http://localhost:11434/api/chat"
data = {
"messages": [
{
"content": "你是一个资深的开发人员,非常擅长代码的code review",
"role": "system"
},
{
"content": f"下面是gitlab中一次merge request的差异代码,使用的是{language}语言,请帮忙做一次code review,有问题可以直接指出问题,回答尽可能简洁。{diff}",
"role": "user"
}
],
"model": "llama3.1:8b",
"options": {
"frequency_penalty": 0.8,
"presence_penalty": 0.2,
"temperature": 0.3,
"top_p": 0.9
},
"stream": False
}
headers = {
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
content = response.json()
suggest = content['message']['content']
print(suggest)
return suggest
AI 返回建议之后,将建议推送给相关人员,这里使用的是飞书机器人
这样就实现了每次发起 mr 之后,触发 AI 自动 code review 的能力。