从超长文档里提取关键信息:分块提取再合并

OpenAI 官方 Cookbook。文档装不进上下文窗口时,把它切块、逐块提取、最后合并。附一份模板提示词——其中「带上页码」和「没有就说没有」两条最要紧。

2026/08/06约 6 分钟HiBridge 编译
译文本文是英文原文的中文翻译,原作者与原文链接如下。
原作者
OpenAI
原文标题
Long Document Content Extraction
原发布平台
OpenAI Cookbook
原发布日期
2026/08/06

译者说明:本文译自 OpenAI 官方 Cookbook。原文写于上下文窗口还很小的时期, 演示如何处理「装不进窗口」的文档。今天的模型窗口大得多,这个前提已经变了—— 但方法本身在几种情况下依然有效,见文末译后附记。

长文档内容提取

模型可以帮我们从大到装不进上下文窗口的文档中,提取关键数字、日期或其他重要内容。

解决这个问题的一种做法是:把文档切成块,分别处理每一块,最后合并成一份答案清单。

整体方法

  • 准备:拿一份很长的法规文档,把文字提取出来
  • 简单实体提取
    • 创建一个模板提示词,包含你的问题以及期望的输出格式示例
    • 写一个函数,接收一块文本,与提示词组合后获取回应
    • 跑一个脚本:切块、提取答案、输出以供解析
  • 复杂实体提取:提出一些需要更强推理才能得出的更难的问题
  • 合并

模板提示词

原文用的提示词模板(针对一份法规文档):

可复制的提示词
Extract key pieces of information from this regulation document.
If a particular piece of information is not present, output "Not specified".
When you extract a key piece of information, include the closest page number.
Use the following format:

0. Who is the author
1. What is the amount of the "Power Unit Cost Cap" in USD, GBP and EUR
2. What is the value of External Manufacturing Costs in USD
3. What is the Capital Expenditure Limit in USD

Document: """<document>"""

0. Who is the author: Tom Anderson (Page 1)
1.

复制为纯文本,换行与缩进原样保留,可直接粘贴进对话框。

中文对照:

可复制的提示词
从这份法规文档中提取关键信息。
如果某条特定的信息不存在,输出「未说明」。
每提取一条关键信息时,附上最接近的页码。
使用以下格式:

0. 作者是谁
1. ……的金额是多少(分别以美元、英镑、欧元计)
2. ……的数值是多少
3. ……的上限是多少

文档:"""<文档内容>"""

0. 作者是谁:Tom Anderson(第 1 页)
1.

复制为纯文本,换行与缩进原样保留,可直接粘贴进对话框。

注意最后两行:先给出第 0 题的答案作为示范,然后留下 1. 让模型接着往下写。这既规定了格式,又直接把它带进了作答状态。

结果与调优

原文的诚实结论:

我们成功、稳妥地提取出了前两个答案,而第三个被每一页上都出现的日期干扰了——不过正确答案也在结果里。

进一步调优可以尝试:

  • 更具描述性、更具体的提示词
  • 如果有足够的训练数据,微调一个模型
  • 改变切块方式——原文用的是 1000 token 无重叠,而按章节切分、按 token 数切分等更智能的分块方式可能得到更好的结果

只做了最少的调优,我们就用一份长文档回答了 6 个难度不等的问题,而且得到了一套可复用的方法,可以应用到任何需要实体提取的长文档上。


译后附记:今天还需要分块吗

原文的前提是「文档装不进上下文窗口」。这个前提在多数情况下已经不成立了——现在主流模型在付费计划上有 1M token 的窗口,一份几百页的报告可以整个塞进去。

那么这套方法什么时候还有用?四种情况。

一、文档真的超大

上千页的标书合集、多年的历史报告归档。1M 也装不下的时候,分块仍是唯一的路。

二、要控制成本

整份塞进去,每问一个问题都要为全文付费。如果你要问二十个问题,分块 + 只处理相关块便宜得多。

三、要处理一批文档,不是一份

四十份合同各提取五个字段——这本质上就是分块处理,只不过「块」的边界是文档本身。

四、需要可追溯

这是最重要的一条。分块处理天然带来定位能力:你知道这条答案来自哪一块、哪一页。

整份塞进去问一个问题,答案是对的,但你不知道它是从哪儿看来的

提示词里最值钱的两条

不管分不分块,这两条都该抄走:

一、「如果某条信息不存在,输出『未说明』」

不给退路,它就会用常识填空。这是所有反复出现的同一条原则——先给它承认不知道的权利,它才不会编。

二、「每提取一条信息时,附上最接近的页码」

这一条把「提取」变成了「可核查的提取」。一份要交给客户的合同要点摘录,每条后面带页码和不带页码,是两种东西

那个日期干扰值得记住

原文提到第三个问题被「每页都出现的日期」干扰了。这类问题在真实文档里非常常见:

  • 页眉页脚里的日期、文档编号、机密标识
  • 每章重复的免责声明
  • 目录里的条目被当成正文内容

处理长文档前,先看一眼有没有这类「每页都有」的东西。 有的话,在提示词里明确排除:

可复制的提示词
注意:页眉、页脚、每页重复出现的日期与文档编号不是正文内容,
提取时请忽略它们。

复制为纯文本,换行与缩进原样保留,可直接粘贴进对话框。

一份改给咨询场景的模板

可复制的提示词
从下面这份文档中提取以下信息。

规则:
- 某条信息不存在时,输出「未说明」,不要推断
- 每条信息后面附上它所在的页码
- 页眉页脚、每页重复的日期与编号不算正文,忽略
- 原文表述有歧义时,照抄原文并标注「表述存疑」

需要提取的信息:
1. [字段一]
2. [字段二]
3. [字段三]

文档:"""
<粘贴文档内容>
"""

1.

复制为纯文本,换行与缩进原样保留,可直接粘贴进对话框。

最后单独留一行 1. 是原文的技巧——它把模型直接带进作答状态,不给它写开场白的机会。