首测!GPT-4o做Code Review可行吗?
liuian 2025-04-29 02:06 20 浏览
编辑 | 言征
出品 | 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合集-mysql5.7及mysql8的一些特性
-
1、Json支持及虚拟列1.1jsonJson在5.7.8原生支持,在8.0引入了json字段的部分更新(jsonpartialupdate)以及两个聚合函数,JSON_OBJECTAGG,JS...
- MySQL 双表架构在房产中介房源管理中的深度实践
-
MySQL房源与价格双表封神:降价提醒实时推送客户房产中介实战:MySQL空间函数精准定位学区房MySQL狠招:JSON字段实现房源标签自由组合筛选房源信息与价格变更联动:MySQL黄金搭档解决客户看...
- MySQL 5.7 JSON 数据类型使用总结
-
从MySQL5.7.8开始,MySQL支持原生的JSON数据类型。MySQL支持RFC7159定义的全部json数据类型,具体的包含四种基本类型(strings,numbers,boolea...
- MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
-
前言提到SQL优化,大多数人想到的还是那些经典套路:建索引、避免全表扫描、优化JOIN顺序…这些确实是基础,但如果你还停留在MySQL5.7时代的优化思维,那就out了。MySQL8.0已经发布好...
- 如何在 MySQL 中使用 JSON 数据(mysql的json函数与实例)
-
在MySQL中学习“NoSQL”MySQL从5.7版本开始就支持JSON格式的数据类型,该数据类型支持JSON文档的自动验证和优化存储和访问。尽管JSON数据最好存储在MongoDB等...
- MySQL中JSON的存储原理(mysql中json字段操作)
-
前言:表中有json字段后,非索引查询性能变得非常糟糕起因是我有一张表,里面有json字段后,而当mysql表中有200w数据的时候,走非索引查询性能变得非常糟糕需要3到5s。因此对mysql的jso...
- mysql 之json字段详解(多层复杂检索)
-
MySQL5.7.8开始支持JSON数据类型。MySQL8.0版本中增加了对JSON类型的索引支持。示例表CREATETABLE`users`(`id`intNOTNULLAU...
- VMware vCenter Server 8.0U3b 发布下载,新增功能概览
-
VMwarevCenterServer8.0U3b发布下载,新增功能概览ServerManagementSoftware|vCenter请访问原文链接:https://sysin.or...
- Spring Boot 3.x 新特性详解:从基础到高级实战
-
1.SpringBoot3.x简介与核心特性1.1SpringBoot3.x新特性概览SpringBoot3.x是建立在SpringFramework6.0基础上的重大版...
- 如何设计Agent的记忆系统(agent记忆方法)
-
最近看了一张画Agent记忆分类的图我觉得分类分的还可以,但是太浅了,于是就着它的逻辑,仔细得写了一下在不同的记忆层,该如何设计和选型先从流程,作用,实力和持续时间的这4个维度来解释一下这几种记忆:1...
- Spring Boot整合MyBatis全面指南:从基础到高级应用(全网最全)
-
一、基础概念与配置1.1SpringBoot与MyBatis简介技术描述优点SpringBoot简化Spring应用开发的框架,提供自动配置、快速启动等特性快速开发、内嵌服务器、自动配置、无需X...
- 5大主流方案对比:MySQL千亿级数据线上平滑扩容实战
-
一、扩容方案剖析1、扩容问题在项目初期,我们部署了三个数据库A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在Service服务层使用uid%3进行取模分片,从而将数据...
- PostgreSQL 技术内幕(五)Greenplum-Interconnect模块
-
Greenplum是在开源PostgreSQL的基础上,采用MPP架构的关系型分布式数据库。Greenplum被业界认为是最快最具性价比的数据库,具有强大的大规模数据分析任务处理能力。Greenplu...
- 在实际操作过程中如何避免出现SQL注入漏洞
-
一前言本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。二SQL注入漏洞的原理、形...
- 运维从头到尾安装日志服务器,看这一篇就够了
-
一、rsyslog部署1.1)rsyslog介绍Linux的日志记录了用户在系统上一切操作,看日志去分析系统的状态是运维人员必须掌握的基本功。rsyslog日志服务器的优势:1、日志统一,集中式管理...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
python使用fitz模块提取pdf中的图片
-
- 最近发表
-
- MySQL合集-mysql5.7及mysql8的一些特性
- MySQL 双表架构在房产中介房源管理中的深度实践
- MySQL 5.7 JSON 数据类型使用总结
- MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
- 如何在 MySQL 中使用 JSON 数据(mysql的json函数与实例)
- MySQL中JSON的存储原理(mysql中json字段操作)
- mysql 之json字段详解(多层复杂检索)
- VMware vCenter Server 8.0U3b 发布下载,新增功能概览
- Spring Boot 3.x 新特性详解:从基础到高级实战
- 如何设计Agent的记忆系统(agent记忆方法)
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)