你传一份有 5,000 条记录的 orders.json,问”加州客户的订单金额中位数是多少”。ChatGPT 不写 pandas 代码,扫一眼前几千个字符就回”根据数据样本,中位数大约 80 美元左右”。这答案是凭感觉,不是算出来的。模型把 JSON 当成 prose 读,没去触发 Code Interpreter 真正解析和聚合。结果听着自信、带数字,是错的。
根本原因是 ChatGPT 自己决定文件走”代码执行”路径还是”上下文阅读”路径。JSON 经常被路由到”上下文阅读”——尤其是文件够小能塞进 prompt,或者你的问题听起来像在请求总结。这篇讲怎么把它逼到正确路径上。
常见原因
按命中率从高到低:
1. 文件够小塞得下,模型干脆不调 Code Interpreter
JSON 大致 200 KB 以下,模型常直接把整份内容内联进 prompt,当文本推理。没有 Python 跑过。中位数、百分位、group-by 这些聚合都是用眼睛估的。
如何判断:ChatGPT 没显示 “Analyzing” 也没代码块。回答数字不精确。问”把你用的 Python 给我看”,它回”我从数据里估的”而不是给代码。
2. 问题写得像”总结”,不是”计算”
“告诉我这份数据的情况""主要规律是什么”——听起来像总结。模型走便宜路径,扫开头然后描述。量化措辞会触发代码,定性措辞不会。
如何判断:换成”用 Python 计算中位数并把代码给我看”会触发 Code Interpreter;原来的”大致是多少”不会。
3. JSON 结构不规整,模型放弃结构化处理
记录的 key 不一致、深度嵌套带可选字段、根层 array 和 object 混着。模型一看没法简单映射到表,干脆回退到文本阅读。
如何判断:本地检查 schema 会发现确实有可选 / 嵌套 / 不一致字段。ChatGPT 回答夹着”该数据集结构有差异”再做定性陈述。
4. NDJSON / JSON Lines 用了 .json 扩展名
文件每行一个 JSON 对象(NDJSON),扩展名却是 .json。json.load() 会失败。Code Interpreter 真被调起来也会抛 parse error,模型回退到读原始字节当文本。
如何判断:第一个字符是 { 第二行也是 { 开头 = NDJSON 不是 JSON。json.load() 会挂;pd.read_json(..., lines=True) 才行。
5. JSON 是 Project / Custom GPT 的 knowledge 文件
Projects 和 Custom GPT 的 knowledge 文件走的是 vector embedding,不是 Code Interpreter。查询返回片段——永远不会作为数字被聚合。
如何判断:这份 JSON 是当初建 Project 时上传的,不是每条消息附件。聚合类问题返回的是检索到的片段,不是合计。
6. 当前模式没有 Code Interpreter
语音模式、某些移动端流程、某些 Custom GPT 默认没启用 Code Interpreter。在这些模式里对数据文件做数值回答永远是估的。
如何判断:Custom GPT 的 Capabilities 配置里没列 Code Interpreter。或者你在的对话里附件加号菜单没有 “Code Interpreter” 选项。
7. token 预算到顶,文件被静默截断
大 JSON 内联进 prompt:只有头 N 个 token 进得来,之后的记录对模型来说不存在。聚合只在可见部分算出来。
如何判断:问”这份文件总共多少条记录?“如果回答是一个可疑的整数(比如”大约 1,000”)且实际数对不上 = 被截断了。
最短修复路径
Step 1: 显式要求用 Python
把”订单金额中位数是多少”换成:
用 Code Interpreter 把
orders.json读进 pandas DataFrame。按state分组算total字段的中位数。把代码和结果表都给我看。
这种措辞强制 tool-call。工具可用时,模型极少拒绝显式的 Code Interpreter 请求。
Step 2: 如果是 NDJSON 直接告诉它
这份文件是 NDJSON(每行一个 JSON 对象)。用
pd.read_json('orders.json', lines=True) 读。
把解析那一行喂到它嘴边,parse 失败分支整条消失。
Step 3: 先验证行数
每次都问:
先打印
len(df)和df.dtypes。确认你读到了所有行再答。
行数和你预期对不上 = 截断 / NDJSON 误读 / 重复解析这类问题立刻暴露。
Step 4: 嵌套 JSON 先扁平化再聚合
import json, pandas as pd
with open('orders.json') as f:
data = json.load(f)
df = pd.json_normalize(data, sep='_')
json_normalize 把嵌套键压成扁平列。之后 group-by 和聚合就和普通 CSV 一样。
Step 5: Project / Custom GPT knowledge 改成每条消息附件
需要聚合答案的话,别把 JSON 放进 Knowledge。改成在 Code Interpreter 可用的对话里每条消息上传。Knowledge 是检索用的,不是算术用的。
Step 6: Knowledge 留给参考文字,不放数据
schema 规范、分类法、品牌文案——这类放 Project Knowledge。需要计数 / 过滤 / 求和的表格数据——这类做每条消息附件。
Step 7: 用一个你已知的数字交叉验证
挑一个你能对得上的值(记录总数、某一小列的 sum、某条具体记录)。让 ChatGPT 算这个值再对照。对得上 = 聚合结果可信;对不上 = 回去查哪一步偏了。
不是你的锅的部分
是否触发 Code Interpreter 这个决策完全不透明。OpenAI 调触发启发式,不同模型之间还会变。上个月能触发的 prompt 这个月可能不行了。唯一稳定的防御是显式要求”写代码”。
vector-embedded 的 Knowledge 仓在本质上就不是算术引擎。如果产品把你的文件路由到了那里,你没法靠 prompt 后期补上聚合能力。
容易误诊为
- “ChatGPT 数学不行”——Python 跑起来时它数学很好。读 prose 时才不行。
- “文件太大”——几 MB 以内对 Code Interpreter 完全没压力。问题是触发不触发,不是大小。
- “JSON 写坏了”——多半没坏。先
jq . orders.json > /dev/null验证一下,jq不报错就说明文件没事。 - “Custom GPT 指令没生效”——指令不能可靠强制 tool-call,模型仍然会根据问题自己路由。
预防
- 凡是对文件的量化问题,默认用”用 Code Interpreter 算 X 并把代码给我”这种措辞。
- 留一句固定的开场白:“先打印行数、列名、dtype 再答。”
- 任何”需要聚合”的数据不要放进 Project Knowledge。Knowledge 是搜索索引,不是数据库。
- 行分隔 JSON 用
.ndjson扩展名,格式无歧义。 - 复杂 schema 本地用
jq或 pandas 先压平成 CSV,上传扁的 CSV。给模型留的功课越少越稳。
FAQ
- 为什么 CSV 行 JSON 不行? CSV 几乎一定触发 Code Interpreter——扁、表格化、一眼能看出。JSON 有歧义;小 JSON 尤其常被路由到”读 prose”路径。
- 能不能让 Custom GPT 永远走 Code Interpreter? 在 config 里开启该能力,再用 system prompt 要求任何分析类问题都写代码。即便如此,模型偶尔在边缘情况下还是会跳过。
Related
- ChatGPT csv column misread
- ChatGPT data file analysis wrong
- ChatGPT spreadsheet too large truncated
- ChatGPT file analysis too shallow
- ChatGPT large document incomplete analysis
- ChatGPT excel formula not evaluated
- ChatGPT multiple files not used together
- ChatGPT project vector search misses
- ChatGPT project files not referenced
- ChatGPT file type unsupported
- ChatGPT zip archive not extracted
- ChatGPT generated file download failed
标签: #ChatGPT #ChatGPT 文件 #排查 #排查 #json #数据分析 #code-interpreter