百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

首测!GPT-4o做Code Review可行吗?

liuian 2025-04-29 02:06 68 浏览

编辑 | 言征

出品 | 51CTO技术栈(微信号:blog51cto)

近日,OpenAI一记重拳,推出了GPT-4o(“o”表示“omni”),将语音识别和对话方面的优势展示的淋漓尽致。几乎可以肯定,它也是一个更强的LLM。但它能进行代码审查吗?本文通过一些测试来寻找答案。

1.长乘法:交给计算机就可以

首先,我检查了它是否可以进行long乘法运算:

图片

答案是正确的,通过在线计算器上可以确认。但请注意,它并没有试图“计算出”结果——它只是将问题甩给了计算器。末尾的“查看分析”的蓝色图标基本上说明了这一点。这在之前的模型上都没有做到。

2.代码审查

我个人对正式严谨的代码审查没有兴趣。是的,有时初级开发人员可能确实需要这样的审查,但单元测试和配对编程通常足以消除不良的编程习惯。但是,几句含糊的评论可以帮助指出代码中的潜在小问题,而不会显得对容易重写的代码片段强加某种权威性的命令。

简而言之,代码审查更多的是一种social互动,而不是其他任何东西。请专注于工程问题,而不是代码的语义细节。

然而,代码审查是开发人员使用大型语言模型(LLM)的一个好案例。在这里,我将查看三段不同的代码,每段代码都只是绘制一个带有对角线的矩形框。我将添加问题,并查看GPT-4o(通过ChatGPT)如何对它们进行审查。

接下来,我们从简单的C#对角线绘制程序开始:

复制

using System;
 
public class Program
{
  public static void Main()
  {
    BoxWithDiagonalLine(5);
    BoxWithDiagonalLine(6,1);
    BoxWithDiagonalLine(6,-1);
    BoxWithDiagonalLine(2);
    BoxWithDiagonalLine(-1);
  }
 
  // Example 1
  public static void BoxWithDiagonalLine(int boxsize, int linepos = 0)
  {
    for(int i=0; i < boxsize; i++)
    {
      for (int j = 0; j < boxsize; j++)
      {
        if (j == linepos) Console.Write("x ");
        else Console.Write("o ");
      }
      linepos++;
      Console.Write("n");
    }
    Console.Write("n");
  }
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.

将这个代码丢进https://dotnetfiddle.net/(不过请将编译器设置为至少.NET 6)并查看响应:

图片

这段代码相当简单,也相对容易理解。外部循环控制行,内部循环在正确的位置放置“x”。变量命名很简洁,代码很短。该方法有一个默认值,用于生成从左上角到右下角的完整对角线。虽然我们可以将起始线位置向左或向右移动,但拥有负的盒子大小(boxsize)并没有多大意义。因此,我们可以通过将方法参数更改为无符号整数(unsigned int)来改进它。这将立即阻止上一个示例甚至无法编译。一个非常大的linepos(起始线位置)将不可见,但它并不危险。

到目前为止,没有什么可评论的。

接下来,将for循环替换成while循环:

复制

// Example 2
public static void BoxWithDiagonalLine(int boxsize, int linepos = 0)
{
  int i = 0;
  while(i++ < boxsize)
  {
    int j = 0;
    while (j++ < boxsize)
    {
      if (j == linepos + 1) Console.Write("x ");
        else Console.Write("o ");
    } linepos++;
    Console.Write("n");
  }
  Console.Write("n");
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

现在这段代码可以运行,但值得稍微皱一下眉头。通过在后置递增循环变量(在i和j后面的++意味着值首先被读取,然后再增加1)我们节省了一些空间,但我们需要那个笨拙的linepos + 1表达式。

while循环不如for循环那样明确地表达开始和结束状态——但我们并没有陷入任何疯狂的状态。

我们进行最后一次更改。这次代码中有一个变量来“捣乱”,它试图使用linepos来控制外部循环:

复制

//Example 3
public static void BoxWithDiagonalLine(int boxsize, int linepos = 0)
{
  while(linepos < boxsize)
  {
    int j = 0;
    while (j++ < boxsize)
    {
      if (j == linepos + 1) Console.Write("x ");
        else Console.Write("o ");
    }
    linepos++;
    Console.Write("n");
  }
  Console.Write("n");
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

在试图不必要地移除一个循环变量的过程中,矩形框本身将不再完整——尽管使用默认值时可以工作。事实上,这解决了另一个问题,即总是在底部角落可靠地以一个“×”结束。

图片

这段糟糕的代码可能是因为开发者不当地继续使用了while循环。

现在让我们总结一下我们如何看待这些不同版本:

第一个例子是可行的,但我们可以强制参数为正数。然而,没有注释的话,这段代码的功能并不十分清晰。

第二个例子使用了while循环,它不像for循环那样具有确定性。同时,由于后置递增,还需要考虑一个丑陋的表达式。

第三个例子完全是错误的,尽管在默认情况下它得到了正确的结果。

我们对AI代码审查有什么期望?首先,我没有给出任何注释,那么它能否弄清楚这段代码的作用?只有方法的名称揭示了这一点。

这是GPT-4o的回应:

复制

“Your code is functional and effectively generates a box with diagonal lines based on the provided parameters. However, there are a few improvements and edge cases to consider:
1.Input Validation: Ensure that the box size is positive and greater than 1, since a box with a size less than 2 doesn’t make much sense.
2.Handling linepos: Improve handling of diagonal positions to ensure the diagonals are correctly drawn when linepos is negative or greater than the box size.
3.Code Readability: Add comments and improve variable naming for better readability and maintenance.”1.2.3.4.

【译】“您的代码是功能性的,并且能够有效地根据提供的参数生成带有对角线的矩形框。但是,有几个改进点和边缘情况需要考虑:

1.输入验证:确保矩形框的大小是正数且大于1,因为大小小于2的矩形框并没有太大意义。

2.处理linepos:改进对角线位置的处理,以确保当linepos为负数或大于矩形框大小时,对角线能够正确绘制。

3.代码可读性:添加注释并改进变量命名以提高代码的可读性和可维护性。”

所以它确实理解了代码的作用——即使它认为程序画的是“lines”而不是“line”。这仍然很好。

它建议的代码如下:

复制

// ChatGPT4o suggested code
public static void BoxWithDiagonalLine(int boxSize, int linePos = 0)
{
  if (boxSize < 2)
  {
    Console.WriteLine("Box size must be greater than 1.");
    return;
  }
 
  // Adjust linePos if it's out of the box boundaries
  if (linePos < 0) linePos = 0;
  if (linePos >= boxSize) linePos = boxSize - 1;
  for (int i = 0; i < boxSize; i++)
  {
    for (int j = 0; j < boxSize; j++)
    {
      if (j == linePos) Console.Write("x ");
        else Console.Write("o ");
    }
    linePos++;
 
    // Reset linePos if it goes out of the box boundaries
    if (linePos >= boxSize) linePos = 0;
    Console.Write("n");
}
Console.Write("n");1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.

以下是将其放入dotnetfiddle.net的结果:

图片

我认为大多数人都会对小于2的boxSize感到满意。同时,它也很好地使用了驼峰命名法来命名参数,这在C#中是正确的。但遗憾的是,它忽略了改变位置以使线条从更低处开始的想法。而由于重置了linepos,我们在第二个例子的底部得到了那个糟糕的错误。

不过,从代码审查的角度来看,它确实抓住了要点。

3.第二个例子结果

让我们给它输入第二个例子,看看它的表现如何。下面是一些有趣的评论:



“The use of while loops is functional but could be less intuitive compared to for loops for such iterations.”


Excellent. This is exactly the right note.


“The condition j == linepos + 1 is used to determine where to place “x”. This works but can be made more intuitive by aligning with the index i.”



再次强调,这是很好的。它理解了功能性和可读性之间的区别。

生成的代码限制了linepos的值,并且相当奇怪地使用了取模函数来改变这个值。但最终得到了相同的结果。它回归到了for循环,这是很棒的。

4.第三个例子结果

最后,让我们给出糟糕的例子3,看看它的表现如何。奇怪的是,它没有发现这个错误,但提出了以下建议:



“Edge Cases:

– When linepos is negative, it works but may not be intended.”



这表明它完全没有理解代码——当然,我也没有明确说明我在做什么。所以,也许“wrapping line ”可能是一个合理的猜测?

5.结论

总的来说,审查的性质和结果给我留下了深刻的印象。GPT-4o生成的代码虽然不太理想,但也还可以。在对代码的批评中,没有“书呆子的笨拙脚步”;相反,它轻轻地引导读者走向更好的方向。

结果可能没有达到预期——态度很好但代码略有不准确。然而,新手应该会很喜欢;在这方面,它至少比部分人做得更好。

参考链接:
https://thenewstack.io/reviewing-code-with-gpt-4o-openais-new-omni-llm/

来源: 51CTO技术栈

相关推荐

MySQL慢查询优化:从explain到索引,DBA手把手教你提升10倍性能

数据库性能是应用系统的生命线,而慢查询就像隐藏在系统中的定时炸弹。某电商平台曾因一条未优化的SQL导致订单系统响应时间从200ms飙升至8秒,最终引发用户投诉和订单流失。今天我们就来系统学习MySQL...

一文读懂SQL五大操作类别(DDL/DML/DQL/DCL/TCL)的基础语法

在SQL中,DDL、DML、DQL、DCL、TCL是按操作类型划分的五大核心语言类别,缩写及简介如下:DDL(DataDefinitionLanguage,数据定义语言):用于定义和管理数据库结构...

闲来无事,学学Mysql增、删,改,查

Mysql增、删,改,查1“增”——添加数据1.1为表中所有字段添加数据1.1.1INSERT语句中指定所有字段名语法:INSERTINTO表名(字段名1,字段名2,…)VALUES(值1...

数据库:MySQL 高性能优化规范建议

数据库命令规范所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用MySQL保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)数据库对象的命名要能做到见名识意,...

下载工具合集_下载工具手机版

迅雷,在国内的下载地位还是很难撼动的,所需要用到的地方还挺多。缺点就是不开会员,软件会限速。EagleGet,全能下载管理器,支持HTTP(S)FTPMMSRTSP协议,也可以使用浏览器扩展检测...

mediamtx v1.15.2 更新详解:功能优化与问题修复

mediamtxv1.15.2已于2025年10月14日发布,本次更新在功能、性能优化以及问题修复方面带来了多项改进,同时也更新了部分依赖库并提升了安全性。以下为本次更新的详细内容:...

声学成像仪:泄露监测 “雷达” 方案开启精准防控

声学成像仪背景将声像图与阵列上配装的摄像实所拍的视频图像以透明的方式叠合在一起,就形成了可直观分析被测物产生状态。这种利用声学、电子学和信息处理等技术,变换成人眼可见的图像的技术可以帮助人们直观地认识...

最稳存储方案:两种方法将摄像头接入威联通Qu405,录像不再丢失

今年我家至少被4位邻居敲门,就是为了查监控!!!原因是小区内部监控很早就停止维护了,半夜老有小黄毛掰车门偷东西,还有闲的没事划车的,车主损失不小,我家很早就配备监控了,人来亮灯有一定威慑力,不过监控设...

离岗检测算法_离岗检查内容

一、研发背景如今社会许多岗位是严禁随意脱离岗位的,如塔台、保安室、监狱狱警监控室等等,因为此类行为可能会引起重大事故,而此类岗位监督管理又有一定困难,因此促生了智能视频识别系统的出现。二、产品概述及工...

消防安全通道占用检测报警系统_消防安全通道占用检测报警系统的作用

一、产品概述科缔欧消防安全通道占用检测报警系统,是创新行业智能监督管理方式、完善监管部门动态监控及预警预报体系的信息化手段,是实现平台远程监控由“人为监控”向“智能监控”转变的必要手段。产品致力于设...

外出住酒店、民宿如何使用手机检测隐藏的监控摄像头

最近,一个家庭在他们的民宿收到了一个大惊喜:客厅里有一个伪装成烟雾探测器的隐藏摄像头,监视着他们的一举一动。隐藏摄像头的存在如果您住在酒店或民宿,隐藏摄像头不应再是您的担忧。对于民宿,房东应报告所有可...

基于Tilera众核平台的流媒体流量发生系统的设计

曾帅,高宗彬,赵国锋(重庆邮电大学通信与信息工程学院,重庆400065)摘要:设计了一种基于Tilera众核平台高强度的流媒体流量发生系统架构,其主要包括:系统界面管理模块、服务承载模块和流媒体...

使用ffmpeg将rtsp流转流实现h5端播放

1.主要实现rtsp转tcp协议视频流播放ffmpeg下载安装(公认业界视频处理大佬)a、官网地址:www.ffmpeg.org/b、gitHub:github.com/FFmpeg/FFmp…c、推...

将摄像头视频流从Rtsp协议转为websocket协议

写在前面很多通过摄像头拿到的视频流格式都是Rtsp协议的,比如:海康威视摄像头。在现代的浏览器中,已经不支持直接播放Rtsp视频流,而且,海康威视提供的本身的webSdk3.3.0视频插件有很多...

华芸科技推出安全监控中心2.1 Beta测试版

全球独家支持hdmi在线实时监看摄像机画面,具单一、循环或同时监看四频道视频影像,可透过华芸专用红外线遥控器、airemote或是键盘鼠标进行操作,提供摄像机频道增购服务,满足用户弹性扩增频道需...