当前位置: 首页 > article >正文

让 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 的能力。


http://www.kler.cn/a/417780.html

相关文章:

  • 【python】图像、音频、视频等文件数据采集
  • 【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现
  • ceph 报错 crush rule 20 type does not match pool
  • 算法妙妙屋-------1.递归的深邃回响:全排列的奇妙组合
  • LinkedList的了解
  • 【绘图】数据可视化(python)
  • .NET 9 AOT的突破 - 支持老旧Win7与XP环境
  • 1-1 Gerrit实用指南
  • Elasticearch索引mapping写入、查看、修改
  • 【AI赋能 Python编程】 第十三章 AI辅助单元测试生成指南
  • 基于多VSG独立微网的多目标二次控制MATLAB仿真模型
  • 乘积最大子数组
  • 南京移动“智慧+关怀”服务体系助力老年群体生活安全有保障
  • C/C++ 每日一练:在矩阵中查找特定值
  • 异步处理优化:多线程线程池与消息队列的选择与应用
  • Linux - web服务器
  • 算法——反转字符串二(leetcode541)
  • 在Java中使用Apache POI导入导出Excel(四)
  • JMeter参数化redis
  • 【特殊子序列 DP】力扣2501. 数组中最长的方波
  • 【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算。
  • 具体的技术和工具在县级融媒体建设3.0中有哪些应用?
  • Zookeeper选举算法与提案处理概览
  • Spring Boot 集成 Knife4j 的 Swagger 文档
  • Unity 超链接文本类
  • 【Oracle11g SQL详解】GROUP BY 和 HAVING 子句:分组与过滤