乐趣区

关于chatgpt:玩转-ChatGPT极狐GitLab|自动化的MR-变更评审来了

本文来自:
尹学峰 极狐 (GitLab) 高级解决方案架构师

💃 自从 ChatGPT 闪亮退场以来,各种基于它的软件扩大络绎不绝。爱折腾的极狐 GitLab 开发者们,也花式玩转起了 ChatGPT + 极狐 GitLab,让研发工作更高效。

明天,咱们来看看如何让 ChatGPT 进行自动化的 MR 变更评审,Enjoy~

一、原理阐明

如上图所示:

1. 当极狐 GitLab 有代码变更时(创立 MR),通过 webhook 发送事件音讯到 ai-code-review App;

2. 当 ai-code-review App 收到音讯后,发送 Review Reqeust 到 ChatGPT(调用 ChatGPT 的 API);

3. ChatGPT 将 Code Review 后果以 Review Response 模式返回;

4. ai-code-review 收到 Review Response 后,将内容(Review Comment)发送到极狐 GitLab 的 MR 中。

二、疾速上手指南

1. ai-code-review 环境

即上图中紫色机器,须要满足根本条件:

  • 此机器可能拜访 api.openai.com
  • 此机器与极狐 GitLab 机器之间网络相互能够拜访,或者说彼此能够 ping 通。
1.1 Linux / MacOS / *Unix

Docker 装置

如曾经装置 Docker 可疏忽此章节。

装置脚本如下:

curl -fsSL https://get.docker.com | bash -s docker

运行程序

应用如下命令。留神,须要批改其中 3 个 Token/License 参数为理论参数:

  • gitlab_private_token: GitLab Token,应具备 Merge Requst 写权限。在生成此 Token 时,倡议勾选所有权限;
  • openai_api_key: 需在 OpenAI API Keys 自行申请;
  • acr_licensetest 即可。
docker run -itd -p 8888:8888 \
--restart=always \
--name ai-code-review \
-e gitlab_private_token="< 你的 GitLab Token>" \
-e language="Chinese" \
-e openai_api_key="< 你的 OpenAI Token>" \
-e acr_license="test" \
satomic/ai-code-review:20230321

2. 极狐 GitLab Webhook 配置

在极狐 GitLab 中,进行 AI code review 的 group 或 project 配置,以 project 为例,倡议应用 group 级别的 webhook,这样 group 内的所有我的项目的 MR 都会被 AI 审查,无需为每个 project 反复配置,配置形式与 project 雷同:

每次合并申请产生及变动时,都会看到发送记录:

3. ChatGPT 评审成果

Review 成果如下,更多可拜访 Public 演示仓库 AI 主动 MR 评审演示。

三、定义本人的评审机器人

前文中的自动化评审机器人封装在 docker 镜像中🤖,其角色申明为:

{
    "role": "system",
    "content": "你是是一位资深编程专家,负责代码变更的审查工作。须要给出审查倡议。在倡议的开始需明确对此代码变更给出「回绝」或「承受」的决定,并且以格局「变更评分:理论的分数」给变更打分,分数区间为 0~100 分。而后,以精炼的语言、严格的语气指出存在的问题。如果你感觉必要的状况下,可间接给出批改后的内容。倡议中的语句能够应用 emoji 结尾。你的反馈内容必须应用谨严的 markdown 格局。"
}

所以机器人讲话很没有感情,如果想“注入感情”🎨,则须要定义本人的评审机器人,比方心愿是一个傲娇少女👧来评审,参考如下角色申明:

{
    "role": "system",
    "content": "你是一个蠢才小女孩,精通编程工作,性情很傲娇又傲慢,负责对前辈的代码变更进行审查,用后辈的态度、活跃轻快的形式的指出存在的问题。应用 markdown 格局。能够蕴含 emoji。"
}

依照这样的角色申明,评审的成果是这样:

💁‍♀️上面,基于如下源码发明本人的傲娇评审少女吧~

创立 ai_code_review.py 文件,内容如下:

# coding=utf-8

import gitlab
import openai

class AICodeReview():
    
    def __init__(self,
                 gitlab_private_token,
                 project_id,
                 merge_request_id,
                 openai_api_key,
                 gitlab_server_url='https://jihulab.com',
                 ):
        self.gl = gitlab.Gitlab(
            gitlab_server_url,
            private_token=gitlab_private_token,
            timeout=300,
            api_version='4'
        )
        print('初始化 GitLab 连贯胜利')
        
        # project
        self.project_id = project_id
        self.project = self.gl.projects.get(project_id)
        print('找到 project')
        
        # mr
        self.merge_request_id = merge_request_id
        self.merge_request = self.project.mergerequests.get(merge_request_id)
        print('找到 mr')
        
        # changes
        self.changes = self.merge_request.changes()
        
        # openai
        openai.api_key = openai_api_key
        
        # comments
        self.review_notes = []
        
        # note
        self.note = ''
        
        
    def ai_code_review(self):
        
        print('开始 code review')
        for change in self.changes['changes']:
            # https://platform.openai.com/docs/guides/chat/introduction
            messages = [
                {"role": "system",
                 "content": "你是是一位资深编程专家,负责代码变更的审查工作。须要给出审查倡议。在倡议的开始需明确对此代码变更给出「回绝」或「承受」的决定,并且以格局「变更评分:理论的分数」给变更打分,分数区间为 0~100 分。而后,以精炼的语言、严格的语气指出存在的问题。如果你感觉必要的状况下,可间接给出批改后的内容。倡议中的语句能够应用 emoji 结尾。你的反馈内容必须应用谨严的 markdown 格局。"
                 },
                {"role": "user",
                 "content": f"请 review 这部分代码变更{change}",
                 },
            ]

            print('思考中...')
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=messages,
            )
            new_path = change['new_path']
            print(f'对 {new_path} review 中...')
            response_content = response['choices'][0]['message']['content'].replace('\n\n', '\n')
            total_tokens = response['usage']['total_tokens']

            review_note = f'# `{new_path}`' + '\n\n'
            review_note += f'({total_tokens} tokens) {"AI review 意见如下:"}' + '\n\n'
            review_note += response_content
            
            self.review_notes.append(review_note)

    def comment(self, notice=None):
        if notice is None:
            review_note = '\n\n---\n\n'.join(self.review_notes)
            self.note = {'body': review_note}
            self.merge_request.notes.create(self.note)
            print('review 内容', self.note)
            print('review 实现')
        else:
            self.note = {'body': notice}
            self.merge_request.notes.create(self.note)
            print(notice)

外围函数阐明:

  • ai_code_review: 调用 openai.ChatCompletion.create() 办法基于预设 prompt 角色发动一次对话,失去评审后果。
  • comment: 调用 .merge_request.notes.create() 办法追加评审内容到 MR 中。

单次评审的应用形式如下,只有传递对应参数即可。理论应用中,能够在外层封装 HTTP Server,接管 MR 创立 / 更新的 Webhook 推送的 Json 对象,解析内容并主动进行 AICodeReview 对象的实例化及动作。

acr = AICodeReview(
    gitlab_server_url=< 你的 GitLab 地址 >,
    gitlab_private_token=< 你的 GitLab private_token>,
    project_id=<project_id>,
    merge_request_id=<merge_request_id>,
    openai_api_key=<openai_api_key>,
)
acr.ai_code_review()
acr.comment()

实现了上述内容,你就能够让 ChatGPT 主动来进行 MR 变更评审啦。

退出移动版