最近ChatGPT被持续火热关注。有人盛赞它的智能超群,似乎要掀翻很多行业,重新洗盘;而有的人却不以为然,觉得它并没有这么厉害。今天我做一个小测试从编程这个需要一定逻辑能力的方面来考察一下。
首先我提出一个解答24点的问题:
它响应速度很快,几秒内就给出了答案。可是不对啊,它居然说“得到7.875,约等于24”。我着实被它的谬论惊到了,太糊弄人了吧。我有些不甘心,指出了问题。它像往常一样,迅速的道歉,然后一顿输出。
错得很离谱了,直接奔着结果8去了。这也太弱了吧?我猜是不是我表达的不清楚,难道它们(美国人)不太理解24点游戏的规则?不对啊,ChatGPT采用了全网数据训练,应该知道的。
我接着指出问题。它再次迅速道歉,说“看错了题目”!但是还是把结果算错了,犯了与第一次错误相同的错误。
我不知道为什么这个看来简单的问题它却反复出错。我接下来直接考察下它对24点规则是否理解,提出让它编写个JavaScript程序。
看到它迅速写出一行行代码,函数名称、注释都写得有板有眼,我开始打消对它的轻蔑了。
function calculate24(num1, num2, num3, num4) {
var results = [];
// 共有 6 种不同的组合
var combinations = [
[num1, num2, num3, num4],
[num1, num2, num4, num3],
[num1, num3, num2, num4],
[num1, num3, num4, num2],
[num1, num4, num2, num3],
[num1, num4, num3, num2]
];
// 针对每个组合,生成所有可能的运算符组合
for (var i = 0; i < combinations.length; i++) {
var nums = combinations[i];
var operators = ["+", "-", "*", "/"];
for (var j = 0; j < operators.length; j++) {
for (var k = 0; k < operators.length; k++) {
for (var l = 0; l < operators.length; l++) {
var expression = nums[0] + operators[j] + nums[1] +
operators[k] + nums[2] + operators[l] + nums[3];
try {
// 尝试计算表达式的值
var result = eval(expression);
if (result === 24) {
results.push(expression + " = 24");
}
} catch (e) {
// 忽略除数为 0 等错误
}
}
}
}
}
return results;
}
// 示例调用
console.log(calculate24(6, 7, 8, 3));
我们继续看聊天窗口,它给出这段代码后,还把程序设计思想讲了下。通过排列组合不停得试,这个思路没问题。一般我们思考也是这个套路
打开浏览器,按F12进入控制台,把这段代码粘贴进去,按回车执行。果然有了好多答案:
'6+7+8+3 = 24', '6+7+3+8 = 24', '6+8+7+3 = 24', '6+8+3+7 = 24', '6+3+7+8 = 24', '6+3+8+7 = 24'。不过因为这4个数很简单,相加就能得24,它给出的答案只不过是排列组合一下,实际就给出了一种。
我又出了4个稍微复杂得数字,它没能给出答案,我分析了代码,发现它只是把数字和运算符排列组合考虑了,但是没有考虑括号。我又询问它。
它果断道歉(态度让人感动),生成了一个更加复杂的代码,考虑了括号。并且仍然讲了下思路,最后还提醒程序的风险,挺好。
我运行测试了这段代码,发现有bug,指出
它针对我指出的代码又优化了。虽然后面测试还有问题,但是我提出的部分已经被它改进了。几个回合下来,代码最终没有完善,但是过程已经震撼到我了,这个过程就像一个老程序员指导新程序员优化代码,但是老程序员心里明白,这个新家伙虽然经验不足,智商却不可低估。