你上传一份 5 万行的 CSV,问”所有行的平均营收”,ChatGPT 基于前 1000 行作答——总数明显错。两种不同的失败模式都会导致这个:普通对话里 ChatGPT 是把文件部分内容塞进 context,剩下的丢掉;Code Interpreter(Advanced Data Analysis)里文件完整落盘,但模型只对 df.head() 做汇总,没真的跑聚合。修法:强制 pandas 在完整 DataFrame 上执行;超大文件用 chunksize 分块;或者本地预聚合后再上传 rollup。
常见原因
1. 普通对话只采样,不加载
没开 Code Interpreter 时,ChatGPT 读文件就是把部分文本塞进 context。token 预算把这个上限定在大约前 1000-3000 行。后面的所谓”分析”都是外推、不是计算。
如何判断:分析过程没有 Python 工具图标;报告的行数特别整(1000、2000)。
2. Code Interpreter 加载了,但只 print 了 df.head()
在 ADA 里 pandas 能整份读。但 prompt 含糊(“汇总这个文件”),模型默认就 print 前 5 行 + 列信息,再口述结论,从不跑 df.shape 或 df.describe()。
如何判断:代码 cell 里只有 df.head() 和 df.dtypes,没有 df.shape、没有任何聚合。文字里写”based on the sample…“
3. 真正巨大的文件撞沙箱内存上限
2GB CSV、2000 万行会把沙箱内存撑爆,pd.read_csv 抛 MemoryError 或者直接 kill kernel。模型为了”让它能跑”会自动加 nrows=1000 重试,然后把这个子集当答案。
如何判断:Code Interpreter 输出里有 kernel restart 或 memory error。
4. chunksize 累加遗漏
用 chunksize= 读但忘了累加,最终答案只来自最后一块。自定义聚合 prompt 经常踩这个。
5. 列方向被显示截断
pd.set_option("display.max_columns") 默认很低。50 列文件 print 中间是 ...,模型有时会断言那些列”不存在”。
最短修复路径
Step 1:先确认整份文件被加载了
每次都用这段开头:
import pandas as pd
df = pd.read_csv("/mnt/data/big.csv")
print("rows:", df.shape[0])
print("cols:", df.shape[1])
print("memory MB:", df.memory_usage(deep=True).sum() / 1e6)
rows 对得上你预期,文件就完整加载了,后续聚合可信。
Step 2:把 prompt 写成聚合请求,不是汇总请求
用 pandas 加载 /mnt/data/big.csv,打印 df.shape。
然后计算:
- df["revenue"].sum()
- df.groupby("region")["revenue"].sum()
- df["date"].min(), df["date"].max()
给我实际数字,不要采样。
ADA 会逐行执行,答案就是真值。
Step 3:超大文件用 chunksize 流式处理
文件大到放不下:
import pandas as pd
total = 0
n = 0
for chunk in pd.read_csv("/mnt/data/huge.csv", chunksize=200_000):
total += chunk["revenue"].sum()
n += len(chunk)
print("rows processed:", n)
print("total revenue:", total)
对求和、计数、大多数 groupby 聚合都管用。百分位需要跨 chunk 保留 partial state。
Step 4:本地预聚合后再上传
内存吃紧或只要 rollup 的,在你机器上先聚合:
# 本地
import pandas as pd
df = pd.read_csv("huge.csv")
rollup = df.groupby(["region","quarter"]).agg(
rev_sum=("revenue","sum"),
rev_avg=("revenue","mean"),
rows=("revenue","count"),
).reset_index()
rollup.to_csv("rollup.csv", index=False)
上传 rollup.csv(几百行)。ChatGPT 立刻能分析,原始数据也不离开你机器。
Step 5:拆成 N 份分别分析
确实需要行级访问、但又装不下时,先拆:
split -l 100000 huge.csv part_
每次一份 + 一个问题;或者全放 Project 里让 ChatGPT 逐份迭代。文件数控制在 10 个以内,检索质量才稳。
预防
- 重复分析大数据,先在本地用 pandas / DuckDB 建管线,只把聚合结果上传给 ChatGPT。
- 上传时第一条 prompt 永远包含
df.shape+df.head(),亲眼验证整份文件加载成功。 - 文件 > 100MB 优先用 Parquet 而不是 CSV——体积小 5-10 倍、读取快、保留 dtype。
- 临时探索可以采样:
df.sample(10_000, random_state=42)——可复现的子集、任何 prompt 都装得下。 - 大屏 / 周期性报表用 Code Interpreter + 整份文件,但 prompt 永远写成明确的聚合,绝不写”汇总”。