# 把一份长文件传进去，它到底读到了什么

上传不等于整份都在它眼前：上下文窗口、切片检索，以及材料位置如何决定它答得准还是“没提到”

> 使用技巧 · 大模型原理 · 长文档 · 约 6 分钟 · 10 月 29 日

## 本篇要点

1. 模型手里没有“文件”，只有这一轮上下文里的文字；上传、解析、读取都是外面那层产品做的，模型只负责读摆到眼前的字。
2. 文件装得下时整份进上下文，装不下时被切成片段、按“和你这句话像不像”挑出几段递过去，挑哪几段你看不到，所以“它读过全文”不能默认。
3. 材料在上下文里的位置会影响结果：同一项研究里，答案放开头准确率约 76%，放中间约 54%，甚至低于完全不给材料的 56.1%，而窗口更长的版本并没有更好。
4. 它说“文件里没有提到”，分不清是没看到还是真没有，所以这句话只能当作“换个问法再查”的信号。
5. 减少遗漏的办法是顺着机制走：用文件原词提问、把范围指到章节、先让它抄原句再给结论、长文件分段处理、通读全篇的活改成清单式逐节跑。
6. “没读到”和“读到了却答错”是两种问题，前者靠换问法和切分，后者只能靠追问和核对。

---

你传进去一份 60 页的合同，问“违约金怎么约定的”，它答得很具体，连原句都抄了出来。你接着问“附件三里那个付款周期是多久”，它回：“文件中未提及。”

你翻到附件三，白纸黑字写着 90 天。

这时通常会得出两个结论：它没读，或者它在撒谎。两个都不太准。更接近实情的是：**它读到的，很可能不是你以为它读到的那份东西。**

## 它手里没有“文件”，只有这一次对话里的文字

模型只会做一件事：看一段文字，接着往下写。它没有“打开文件”这个动作，也没有“翻到第 41 页”这个动作。上传和解析都是模型外面那层产品替它做的——这也是同一款模型换到别的产品就像换了个人 _[它其实不会上网](https://pangzhengboyin.com/articles/llm-vs-tools-web-search-26773830)_ 的原因之一。

所以“传一个文件”实际发生的事比你以为的多几步：

```mermaid
flowchart LR
  A["你上传的 PDF 或表格"] --> B["产品把它转成文字"]
  B --> C{"这些文字塞得进这次对话吗"}
  C -->|"塞得下"| D["整份放进上下文"]
  C -->|"塞不下"| E["切成小片段，按你的问题挑出若干段"]
  E --> D
  D --> F["模型只看这些文字，接着往下写"]
```

关键在于最后两步。**上下文**就是模型这一次能读到的全部文字：你这次的问题、文件内容、它前几轮说过的话，全算在里面 _[同一句问题，为什么答案时好时坏](https://pangzhengboyin.com/articles/why-same-prompt-gets-different-answers-12fde62a)_。文件不是存在某个书架上等它去翻，而是被摆进这摞纸里。它答得出来，是因为那几行字这次真的在纸上；答不出来，往往是那几行字这次没被摆上来。

## 这摞纸有多厚，是有限的

模型数长度用的是 **token**，可以粗略理解成“词片”，英文大约 4 个字符算 1 个，中文大致一个汉字算一到两个（各家算法不同，只作估算）。**上下文窗口**就是一次能装多少 token 的上限，装满了就塞不进去。

这个上限不是固定数字，同一家公司不同档位也能差好几倍：Anthropic 的开发者文档里，较新的 Claude 模型是 100 万 token，较早的只有 20 万；它还规定一次请求最多带 600 张图或 PDF 页，20 万 token 的模型只给 100 页[4]。

所以要建立的第一个直觉是：**“传进去了”不等于“整份都在它眼前”。**六十页的 PDF 多数产品装得下，几百页的扫描件、一整个文件夹的报表就不一定了。装不下，就进入下一步。

## 书太厚的时候，是别人替你挑了几页

装不下时，产品一般做两件事，业内叫**切片**和**检索**：先把文件切成一段一段存起来；你提问时，拿你的问题去和这些片段比对，挑出“最像”的若干段，拼进这一轮的上下文。微软给开发者的文档就是这样描述这套流程的[3]。

这里有个决定成败的细节：**挑片段的标准是“和你这句话像不像”，不是“这段重不重要”。**上面那个例子里，附件三写的是“结算周期为 90 天”，你问的是“付款周期”。在人看来是一回事，在按字面相似度排序的检索里未必靠得近。那一段可能压根没被挑中。于是模型的处境是：手里只有几页纸，而答案不在其中。它不是不知道，是没看见。

还有一处必须说清的不确定：各家产品怎么切、挑几段、规则会不会变，通常不公开，界面上也看不到“这次递了哪几段”。所以对一份长文件，**“它读过全文”是不能默认的假设。**

## 就算挑对了，也可能被跳过

假设含答案的那段被挑中了，问题就完了吗？没有。

2023 年的一项研究（后发表于 TACL）给模型 20 篇文档，其中一篇含答案，然后把这篇文章在序列里的位置前后挪动。结果是明显的 U 型曲线：答案排在第 1 位时准确率约 76%，挪到中间降到约 54%，排到最后回升到约 63%[1][2]。更值得注意的是最低点——把答案埋在中间时，准确率甚至低于完全不给任何文档的 56.1%。也就是说，塞给它一堆材料，有时反而帮了倒忙。

![同一份材料放在开头、中间、结尾，模型用得上的程度不一样，中间最低](https://mitp.silverchair-cdn.com/mitp/content_public/journal/tacl/12/10.1162_tacl_a_00638/1/m_tacl_a_00638_f001.png?Expires=1795888648&Signature=S5QO3ILYuhMhYxNaRrjv2X68tiU48-0lQbQvdt3KE5~L7aoNQjcPHhKRvQ7Ciec-YJvEYOG1wk3S6IFwIP-G0Baie2ZMdwZcl35yvDXTVSn6iz~ubMRQV9x1Lux2KSs60Ir-jrfcDpWc0vm8iYWpPPOVSgC4i33jvonvNsMzgPeEx02YyC71Ogag3z-7JsNsrNb5xZEoiGk8ijq0O-HFF~0t9Fnn5JNsljHwcJnnPYW9JbpKjRpJX~roOsfFFcJKz50~J8CmaVJYy5aXOqK09vX9Bql~8V9q9iBe46fpQnT~ZX7wojtfHQbhAQIWg~lCwTuTU4CACiaDfHBx7L~m0Q__&Key-Pair-Id=APKAIE5G5CRDK6RD3PGA)

同一项研究还发现：上下文窗口更长的版本，在材料都装得下时，位置效应几乎一样，并没有更会“用”上下文[1][2]。

## 三个可以直接用的推论

**“文件里没有提到”不能当结论。**它没看到，和文件里没有，说出来是同一句话。缺的是材料不是判断，它自己区分不了。遇到这种回答，下一步是换问法或把范围指死，不是跟它争论。

**换个问法就是换一批纸。**同一份文件问三遍得到三个答案不奇怪，每次挑中的片段可能不同。哪个对，只能回原文核对——这也是上一篇那条顺序的直接应用：处理你给的材料属于“对错在原文里”那一类，抽查成本很低。

**对话越长，纸越挤。**聊了半小时再传文件，前面内容占掉大量位置，早期对话可能被截断或摘要掉。它“忘了刚才说的”，是结构使然，不是态度敷衍。

## 怎么问才不漏

1. **用文件里的词问。**想知道付款周期，就把“结算”“账期”一起用上。相似度那一步靠字面起作用，你的转述越接近原文越容易被挑中。
2. **把范围指死。**“在第三章第二节里”“在附录二的表格里”比“在文件里”有效得多，它省掉了替你猜位置这一步。
3. **先要原文，再要结论。**让它把依据的原句抄出来，附上章节或页码。抄不出来，就只有两种可能：没读到，或者记错了。这比通读它的答案省事得多。
4. **长文件分段处理。**一次一章，先逐节摘出原文要点，再基于摘要提问。每轮纸薄一点，比一次塞满可靠。
5. **需要通读全篇的任务，别指望一次问答。**“找出所有对我方不利的条款”要的是全文覆盖，而这正是这套流程最不擅长的。改成给它一份清单逐节跑，或自己先按关键词搜出几处，再局部提问。

## 这个比喻在哪里会推过头

把文件想成“递过去的几页纸”，容易让人以为它永远只看得到片段。不对：装得下的时候，它确实整份读了进去，漏掉是因为注意力分配，不是没给；装不下时才是真只给了片段。

另外要把两件事分开：**没读到**和**读到了却答错**。前者换问法、指范围、换切分能救；后者是理解偏了或写歪了，只能靠追问和拿原文核对。同样一句错答案，原因不同，处理办法也不同。

## 思维导图

```mermaid
flowchart LR
  A["上传一份长文件"] --> B["产品转成文字"]
  B --> C{"装得进上下文窗口吗"}
  C -->|"装得下"| D["整份进上下文"]
  C -->|"装不下"| E["切片 + 按相似度检索"]
  E --> D
  D --> F["位置效应：中间最容易被跳过"]
  F --> G["没看到 = 它说没有提到"]
  G --> H["用原词问、指死范围、先抄原句、分段处理"]
```

## 术语表

- token：模型数文字长度的单位，英文约 4 个字符算 1 个，中文大致一个汉字算一到两个。
- 上下文窗口：模型一次能读到的文字上限，你的文件、提问和它自己说过的话都算在里面。
- 切片（chunk）：把长文件切成小段单独存放，好让检索能挑。
- 检索（retrieval）：按你的问题从这些片段里挑出若干段递进上下文，挑的标准是相似度，不是重要性。
- 位置效应：同一份材料放在开头或结尾容易被用上，放在中间容易被跳过。

## 来源

1. [Liu 等《Lost in the Middle: How Language Models Use Long Contexts》，TACL 2024 — 长上下文中的 U 型位置效应](https://aclanthology.org/2024.tacl-1.9/)
2. [同一研究的预印本 — 含 76%、56.1% 等具体数据与扩展窗口对比](https://arxiv.org/abs/2307.03172)
3. [Microsoft Learn：Advanced retrieval-augmented generation — 切片、检索、检索后过滤与重排](https://learn.microsoft.com/en-us/azure/developer/ai/advanced-retrieval-augmented-generation)
4. [Anthropic 文档：Context windows — 各模型上下文窗口大小与单次请求的图片／PDF 页数上限](https://platform.claude.com/docs/en/build-with-claude/context-windows)

---

原文：https://pangzhengboyin.com/articles/why-long-documents-get-partially-read-b7956af9

> **庞征博引** · 想学的，慢慢都会
>
> 庞征博引是把想学的东西写成连载的 AI 学习工具：每篇 5–10 分钟，边读边问，接下来学什么跟着你走。这篇就是这样写出来的。
>
> 开始你自己的连载 → https://pangzhengboyin.com
