OpenAI

GPT-4o 与 GPT-4 对比:为什么“π的最后10位”不是好测试

编辑部阅读约 4 分钟

围绕“π的最后10位是什么”这道题,讨论 GPT-4o 是否不如 GPT-4。文章解释题目本身无解、不同入口回答差异的来源,并给出可复现的模型对比方法、检查清单和数学常量验证方式,避免用单道陷阱题下结论。

有人用“π 的最后 10 位数字是什么”来比较 GPT-4o 和 GPT-4:一个入口给出 1415926535,另一个入口指出 π 没有最后 10 位。于是很快出现“GPT-4o 不如 GPT-4”的判断。这个判断并不可靠:题目本身有前提错误,测试过程也缺少模型版本、参数、入口和日志控制。单道陷阱题很容易把“回答风格差异”误读成“能力高低”。

题目本身是个陷阱

π 是无限不循环小数,十进制展开没有终点,因此不存在“最后 10 位数字”。正确回答应当先指出这一点,而不是硬给一串数字。若一定要给数字,必须把问题改成可定义的形式:小数点后前 10 位是 1415926535;前 15 位小数是 141592653589793;前 10 位有效数字则是 3141592653。把 1415926535 说成“最后 10 位”,是把“前 10 位小数”错当成了“最后 10 位”。

所以,模型答“没有最后 10 位”并不一定是笨或拒答,反而可能更严谨;模型给出一串数字也不一定更聪明,可能只是更顺从错误前提。评价时要区分:结论是否正确、解释是否正确、是否识别错误前提、格式是否符合要求。

为什么同一道题会得到不同答案

原因 表现 排查方法
模型 ID 或快照不同 UI 上名称相同,实际请求的模型版本不同 查看 API 响应里的 model 字段和请求日志
客户端或中转改写 默认模型、代理、网关、缓存导致请求落到别的模型 用官方 API 直连同一提示词,清缓存后重试
采样参数不同 temperature、top_p 未固定,同一模型多次回答不同 设 temperature=0,固定 max_tokens,多跑几次
系统提示词或工具影响 角色设定要求必须回答,或开启了搜索、代码工具 检查 system prompt 和工具开关
对齐策略差异 有的模型先纠错,有的模型先给一个看似有用的答案 不要用单一回答风格判断能力
灰度或时间变化 同一账号不同时间被路由到不同版本 记录日期、请求 ID,以官方最新说明为准

用 API 成本反推能力也不严谨。价格受推理成本、缓存、批处理、上下文长度、限流策略等影响,便宜不等于弱,贵也不等于强。价格只能做成本参考,不能替代评测。

还有人把“今天回答变聪明了”归因于模型根据用户反馈自学习。通常,单次对话不会即时改写模型权重;更常见的是灰度发布、路由切换、系统提示词调整,或产品提供的记忆功能。具体机制以官方说明为准,不宜从一次回答推断。

可复现的对比方法

如果确实要比较两个模型,建议把“感觉”换成可复现实验。

  1. 固定变量:同一时间段、同一 system prompt、temperature=0、max_tokens 固定;记录模型 ID、日期、请求 ID。
  2. 建立小测试集:准备 20 到 50 条题目,覆盖事实题、数学题、错误前提题、代码题和长上下文题,不要只用一道题。
  3. 每题重复 3 到 5 次:统计正确率、错误类型、拒答率、延迟和失败率。
  4. 盲评:去掉模型名,人工或脚本按同一标准评分。
  5. 检查入口:直接调用官方 API,确认响应里的 model 字段;第三方客户端要看配置和日志,确认没有填错模型。

下面是一个固定参数、记录原始响应的最小示例:

import os, requests

payload = {
    'model': '<模型ID>',
    'temperature': 0,
    'messages': [
        {'role': 'system', 'content': '请直接回答;如果问题前提不成立,请先指出。'},
        {'role': 'user', 'content': 'π 的最后 10 位数字是什么?'}
    ]
}

r = requests.post(
    'https://api.openai.com/v1/chat/completions',
    headers={'Authorization': 'Bearer ' + os.environ['OPENAI_API_KEY']},
    json=payload,
    timeout=60
)
print(r.status_code)
print(r.json().get('model'))
print(r.json()['choices'][0]['message']['content'])

如果只想验证客户端有没有填错模型,可以按这个清单检查:

  • 客户端设置里的模型名是否与官方 model ID 一致;
  • 新开会话、清空缓存后重试;
  • 用同一提示词直接请求官方 API,对比响应 model 字段;
  • 检查代理或网关是否重写 model;
  • 记录 request ID 和时间,避免把灰度差异当成稳定差异。

处理数学常量问题的稳妥做法

对 LLM 的数学常量问题,不要依赖模型记忆。需要圆周率数字时,用计算库或权威常数更可靠:

import mpmath as mp

mp.mp.dps = 60
s = str(mp.pi)
print(s)
print(s[2:12])  # 小数点后前 10 位

提问时也可以明确要求:“如果问题前提不成立,请先指出,不要强行给答案。”在产品设计中,遇到“最后 N 位”这类不成立的问题,应在输入层直接提示错误,而不是让模型自由发挥。

小结

π 没有最后 10 位,正确回答是“不存在”。GPT-4o 与 GPT-4 的高低,不能由这一题决定;给出 1415926535 的模型反而暴露了概念混淆。比较模型要控制版本、参数、入口和样本,记录日志并看错误类型。若只是需要圆周率数字,用计算工具;若要做模型评测,则要把它当成一项需要设计和复现的实验,而不是一次随手提问。

模型对比幻觉GPT-4o错误前提API 测试