最近很热的话题是询问AI讨论:9.9和9.11哪个大?AI给出9.11更大 的错误答案。为什么会出现这种问题呢?
一种解释是:因为缺乏正确的语境理解能力和背景知识。提到“9.11”时,通常指的是2001年9月11日发生的美国恐怖袭击,而不是一个数值。比较时候AI会给出错误答案。
如果从技术的角度看,是什么原因导致的呢?
抛砖引玉一下,如果是单纯比较数值大小,因为浮点数在计算机中的存储和表示是有限的,可能会存在精度丢失的情况,进而出现比较的问题。例如代码
public class Example {
public static void main(String[] args) {
float num1 = 9.11f;
float num2 = 9.9f;
if (num1 < num2) {
System.out.println(num1 + " 小于 " + num2);
} else if (num1 > num2) {
System.out.println(num1 + " 大于 " + num2);
} else {
System.out.println(num1 + " 等于 " + num2);
}
}
}
在精度丢失的情况下,9.11 被认为比 9.9 更大hhh,一种好的方式应该是用减法来规避精度丢失带来的问题。
同时也看到了比较权威的大牛回答:
文字是个有限集,数字是个无限集。GPT模型不善于处理无限集,GPT的设计就让它很难识数。
GPT模型,就是个“预测下一个词(next token prediction)”的“猜词游戏”。在预测的时候,需要计算每个候选词的概率,取最大那个作为下一个词。进而,控制候选词的数量,就能减小计算量。自然数是个无穷集合,就不可能每个数字都能成为一个候选词。实际的词表大小常常是5w-20w。而中文词、英文词是有限集合,而且还不大,所以,GPT能轻松处理得很好。
如果你问“既然是分词的问题,那我们换个分词的方法就好了?”答案是否定的。模型进行预训练之前第一件事就是确定词表。GPT的词表是结合BPE(byte pair encoding)编码方式来做的。把几个billion的文本,进行统计,如何用最少的token数覆盖整个文本。就像我国1956年确立了简体字,之后用起来了就不能随意改字了。搞数学最好的是woldfram模型,它是做文本分析,尝试精准提取数学符号,硬编码计算规则。它就和GPT的算法相去甚远了。
LLM在做特定计算任务的时候其实是并不理解计算规则,只是按next-token-prediction去预测下一个token,这样很难保证答案正确的稳定性。一般针对这类计算题会采用工具或者代码的方式来进行计算,也就是说LLM先根据题目生成代码,然后工具执行代码来得到答案。
例如腾讯云AI代码助手的回答结果是区别其他对话的结论的,可以尝试体验下解放双手的代码搭子!