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

[code-review] AI聊天接口 | 语言模型通信器

第4章:AI聊天接口(语言模型通信器)

欢迎回来

在第3章:部署配置(托管策略)中,我们学习了ChatGPT-CodeReview机器人如何接收来自GitHub的消息

在此之前,在第2章:Probot应用核心(审查协调器)中,我们看到了机器人的"大脑"如何协调整个审查过程

现在,是时候深入了解最令人兴奋的部分之一:

  • 我们的机器人如何实际与人工智能对话,本章将全面介绍AI聊天接口(语言模型通信器)

它解决了什么问题?

想象一下,我们的机器人Probot应用核心已经从拉取请求中收集了所有代码变更

它知道需要审查什么。但它如何从像ChatGPT这样的AI那里获得实际审查呢?它不能只是发送原始代码并期待奇迹发生

AI聊天接口解决了AI通信的问题。

它充当一个高度专业化的翻译和信使。接收代码变更,精心准备一个给AI的问题(“提示”),将其发送到选定的AI服务(如OpenAI的ChatGPT、Azure OpenAI或GitHub Models),然后理解AI的回复,确保其格式可以被我们的机器人使用

可以这样理解:

  • 我们机器人的大脑(Probot应用核心):我们,有一个需要解决的问题(审查这段代码)
  • AI聊天接口:一个知道如何与AI对话的熟练翻译
  • AI模型(ChatGPT):提供建议的专家

我们给翻译提供代码并说:"请专家进行代码审查。"翻译将问题完美地表述给专家,获取答案,然后以清晰、结构化的方式翻译回给我们

没有这个翻译,我们的机器人将不知道如何向AI寻求帮助或理解其答案。

核心工作:与AI通信

项目中的Chat类就是这个专门的"AI聊天接口"。让我们分解它的关键职责。

1. 选择合适的AI(连接管理器)

市面上有许多优秀的AI模型。我们的机器人需要足够灵活,能够根据我们的设置使用不同的模型。Chat接口首先确定要连接到哪个AI服务

这个决定是在创建Chat对象时根据我们提供的环境变量(如AZURE_API_VERSIONUSE_GITHUB_MODELS)做出的。

以下是它的决策方式:

// 文件: src/chat.ts (简化的构造函数)
import { OpenAI, AzureOpenAI } from 'openai'; // 用于与AI对话的工具export class Chat {private openai: OpenAI | AzureOpenAI; // 保存与AI的连接private isAzure: boolean; // 标志:我们是否使用Azure OpenAI?private isGithubModels: boolean; // 标志:我们是否使用GitHub的模型?constructor(apikey: string) {// 检查是否提供了Azure OpenAI设置this.isAzure = Boolean(process.env.AZURE_API_VERSION && process.env.AZURE_DEPLOYMENT);// 检查是否应该使用GitHub内置的模型this.isGithubModels = process.env.USE_GITHUB_MODELS === 'true';if (this.isAzure) {// 如果是Azure,设置与Azure OpenAI的连接this.openai = new AzureOpenAI({ /* Azure特定设置 */ });} else {// 否则,设置与标准OpenAI(或GitHub Models)的连接this.openai = new OpenAI({apiKey: apikey,baseURL: this.isGithubModels ? 'https://models.github.ai/inference' : process.env.OPENAI_API_ENDPOINT,});}}// ... 类的其余部分 ...
}

解释:当我们创建一个新的Chat对象时,它会立即查看机器人的设置(环境变量)

  • 如果找到AZURE_API_VERSIONAZURE_DEPLOYMENT,它知道我们想使用Azure OpenAI
  • 如果USE_GITHUB_MODELStrue,它会连接到GitHub自己的AI模型
  • 否则,它会连接到标准的OpenAI服务
  • 然后,它创建一个特定的OpenAIAzureOpenAI对象,就像拿到正确的电话拨打正确的AI服务。

2. 设计完美的问题(提示工程师)

一旦连接到AI,Chat接口需要提出一个清晰、精确的问题。

这个问题被称为"提示"。一个好的提示对于获得有用的审查至关重要。它包括:

  • 实际的代码变更(patch
  • 关于我们需要哪种审查的指令(例如,查找错误、提出改进建议)
  • 要求答案以特定格式返回(非常重要,eg. 告诉AI以JSON格式响应
// 文件: src/chat.ts (简化的generatePrompt方法)
export class Chat 
{// ... 构造函数和其他部分 ...private generatePrompt = (patch: string) => {// 确定AI回答的期望语言const answerLanguage = process.env.LANGUAGE ? `${process.env.LANGUAGE}回答我,` : '';// 获取用户自定义提示,或使用默认提示const userPrompt = process.env.PROMPT || '请审查以下代码补丁。';// 关键:告诉AI以JSON格式响应const jsonFormatRequirement = '\n以严格的JSON格式提供反馈,结构如下:\n' +'{\n' +'  "lgtm": boolean, // 如果代码看起来可以合并则为true,否则为false\n' +'  "review_comment": string // 详细的审查评论(可以使用markdown)\n' +'}\n';return `${userPrompt}${jsonFormatRequirement} ${answerLanguage}:${patch}`; // 将所有部分组合成最终提示};// ... 类的其余部分 ...
}

解释generatePrompt函数构建给AI的消息。

  • 它检查LANGUAGE设置(例如,“English”)。
  • 它使用PROMPT设置(例如,“专注于错误…”)或默认提示。
  • 最重要的部分是jsonFormatRequirement。它告诉AI:"不要写文章!以结构化的JSON对象形式给出答案,包含lgtm(Looks Good To Merge)和review_comment字段。"这确保我们的机器人可以轻松理解和使用AI的响应。
  • 最后,它添加实际的patch(代码变更),以便AI有内容可以审查。

3. 发送请求并解释响应(信使与翻译)

在这里插入图片描述

在建立AI连接并准备好提示后,Chat接口发送请求并处理AI的回复

// 文件: src/chat.ts (简化的codeReview方法)
export class Chat 
{// ... 构造函数和其他部分 ...public codeReview = async (patch: string): Promise<{ lgtm: boolean, review_comment: string }> => {if (!patch) { // 如果没有代码需要审查,直接返回LGTMreturn { lgtm: true, review_comment: "" };}const prompt = this.generatePrompt(patch); // 创建完整的提示// 将提示发送给AI并等待其响应const res = await this.openai.chat.completions.create({messages: [{ role: 'user', content: prompt }], // 我们的提示放在这里model: process.env.MODEL || (this.isGithubModels ? 'openai/gpt-4o-mini' : 'gpt-4o-mini'), // 使用哪个AI模型response_format: { type: "json_object" }, // 关键:强制JSON输出});if (res.choices.length) {try {// 尝试将AI的响应解析为JSONconst json = JSON.parse(res.choices[0].message.content || "");return json; // 返回结构化的JSON} catch (e) {// 如果AI没有返回有效的JSON,将其视为非LGTM评论return { lgtm: false, review_comment: res.choices[0].message.content || "" };}}return { lgtm: true, review_comment: "" }; // 如果没有响应,返回默认值};
}

解释codeReview方法是魔法发生的地方。

  • 它首先使用generatePrompt创建prompt
  • 然后,this.openai.chat.completions.create是实际调用AI服务的代码。它发送我们的prompt并指定AI model(例如,gpt-4o-mini)。
  • 注意这里的response_format: { type: "json_object" }!这是额外的保护层,直接告诉AI服务我们要求JSON响应。
  • 一旦AI返回response,代码尝试JSON.parse它。这是"解释"步骤。
  • 如果解析成功,意味着AI遵循了指令,我们会得到一个漂亮的lgtm布尔值和review_comment字符串。
  • 如果AI以某种方式返回了无效JSON的文本,catch块会处理它,确保我们的机器人仍然获得一些反馈(即使是非结构化的),并且知道不要将其标记为LGTM。

整体连接方式

让我们追踪代码补丁通过AI聊天接口的旅程:

在这里插入图片描述

  1. Probot应用核心发送代码:我们机器人的大脑(第2章)提取一个patch(一个文件的代码变更)并调用chat.codeReview(patch)
  2. Chat初始化:如果是第一次,Chat对象会设置与所选AI(OpenAI、Azure或GitHub模型)的连接。
  3. 提示生成Chat对象使用其generatePrompt方法为AI创建一个详细的消息,特别要求以JSON格式的审查。
  4. 发送给AIcodeReview方法使用已建立的AI连接(this.openai)将此提示发送给AI服务。
  5. AI处理:AI模型接收提示,理解请求,并根据patch和指令生成代码审查。
  6. AI响应:AI发送回其审查,理想情况下按照要求格式化为JSON字符串。
  7. 解析响应codeReview方法接收此字符串并尝试使用JSON.parse()将其解析回JavaScript对象。
  8. 返回结构化审查:最后,Chat接口将结构良好的审查对象({ lgtm: boolean, review_comment: string })返回给Probot应用核心,然后可以使用此信息在我们的拉取请求上发布评论。

总结

**AI聊天接口(语言模型通信器)**是机器人不可或缺的翻译和信使 (github code和ai的中间层)

它专业地管理与各种AI服务(OpenAI、Azure OpenAI、GitHub Models)的连接,精心制作包含特定格式要求的精确提示,将这些提示发送给AI,然后解释AI的响应,确保它们是结构化的且可供我们的机器人使用。

这种抽象使得ChatGPT-CodeReview能够有效地利用AI的力量进行自动化代码审查。

现在我们了解了机器人如何与AI对话,让我们探索它如何决定哪些文件需要展示给AI。在下一章中,我们将深入探讨第5章:文件过滤逻辑(范围管理器)


文章转载自:

http://6IYVI2h8.qggxt.cn
http://82iO4vfO.qggxt.cn
http://FDOiZbNk.qggxt.cn
http://eX346qQL.qggxt.cn
http://a6muog1h.qggxt.cn
http://z3kVl8zZ.qggxt.cn
http://MM9QGpc8.qggxt.cn
http://IRD723Cb.qggxt.cn
http://P4QtFuDK.qggxt.cn
http://xXGsRuDT.qggxt.cn
http://z5s6igcX.qggxt.cn
http://p9yNfyCe.qggxt.cn
http://O5YyJlaR.qggxt.cn
http://z3NrCJYA.qggxt.cn
http://a6BIZ4GD.qggxt.cn
http://rLrr6vhE.qggxt.cn
http://7a8RvH75.qggxt.cn
http://7B3wNEGo.qggxt.cn
http://NSy3p8Sk.qggxt.cn
http://rq7e6hv3.qggxt.cn
http://nYSixwi8.qggxt.cn
http://srTSNCxp.qggxt.cn
http://ySIPspF5.qggxt.cn
http://RdFympYl.qggxt.cn
http://NPn0LwqC.qggxt.cn
http://MjFnYRpJ.qggxt.cn
http://Ghbtp2xe.qggxt.cn
http://6xpnGOz6.qggxt.cn
http://pOIss6hT.qggxt.cn
http://LMI1iEz2.qggxt.cn
http://www.dtcms.com/a/381525.html

相关文章:

  • 力扣刷题笔记-删除链表的倒数第N个结点
  • 代码审计-PHP专题原生开发SQL注入1day分析构造正则搜索语句执行监控功能定位
  • dots.llm1:小红书开源的 MoE 架构大语言模型
  • --gpu-architecture <arch> (-arch)
  • uniapp动态修改tabbar
  • Spring Boot 集成 Flowable 7.1.0 完整教程
  • 教你使用服务器如何搭建数据库
  • Kafka如何配置生产者拦截器和消费者拦截器
  • uniapp:根据目的地经纬度,名称,唤起高德/百度地图来导航,兼容App,H5,小程序
  • 欧拉函数 | 定义 / 性质 / 应用
  • 【更新至2024年】1996-2024年各省农业总产值数据(无缺失)
  • 财报季观察|消费“分野”,燕之屋(1497.HK)们向上生长
  • 机械制造专属ERP:降本增效与数字转型的关键
  • 基于node.js+vue的医院陪诊系统的设计与实现(源码+论文+部署+安装)
  • 【大语言模型 59】监控与日志系统:训练过程全面监控
  • HIS架构智能化升级编程路径:从底层原理到临床实践的深度解析(下)
  • Node.js中package.json详解
  • 当AI遇上数据库:Text2Sql.Net如何让“说人话查数据“成为现实
  • 数据结构8——双向链表
  • 问卷系统自动化测试报告
  • Python 的函数柯里化(Currying)
  • 渗透测试信息收集详解
  • 【连载3】C# MVC 异常日志进阶:结构化日志与性能优化技巧
  • 冯诺依曼体系:现代计算机的基石与未来展望
  • 关于在阿里云DMS误操作后如何恢复数据的记录
  • 贪心算法应用:神经网络剪枝详解
  • 灵活学习PyTorch算法:从动态计算图到领域最佳实践
  • [code-review] 部署配置 | Docker+PM2 | AWS Lambda | Vercel+边缘函数
  • 递归,搜索与回溯算法
  • 31.网络基础概念(一)