文章目录
Prompt实战之多文档总结 3)Map-Reduce 策略高效总结大规模文档
3.1 引言
当文档数量变多、单份内容变长时,Stuff 策略就会遇到上下文超长、成本飙升等问题。
这一章我们将学习Map-Reduce 策略,一种经典的分步总结法,专门应对大规模、多内容场景。
3.2 什么是 Map-Reduce 策略?
Map-Reduce 策略包括两个阶段:
- Map 阶段:每份文档单独总结出一个“小总结”;
- Reduce 阶段:将所有小总结再次整合、归纳为最终总结。
这种方法灵感来自分布式计算中的 MapReduce 思想,可以有效降低单次调用的上下文量,提高扩展性。
适用场景
- 文档数量多(10份以上);
- 单份文档很长(几千字甚至上万字);
- 总长度超出 LLM 单次上下文窗口限制。
▶️ 提示:Map-Reduce 是处理大规模内容总结的黄金法则,但整体推理链更长,响应时间略慢。
3.3 流程图
看懂整个 Map-Reduce 总结流程:
3.4 实战步骤
3.4.1 加载大批文档
这里我们可以模拟批量网页加载,也可以使用本地批量 PDF 作为示例。
from langchain_community.document_loaders import WebBaseLoader
# 示例:加载多个网页
urls = [
"https://python.langchain.com/docs/get_started/introduction",
"https://python.langchain.com/docs/get_started/installation",
"https://python.langchain.com/docs/get_started/quickstart",
"https://python.langchain.com/docs/components/models",
]
loader = WebBaseLoader(urls)
documents = loader.load()
print(f"一共加载了 {len(documents)} 份文档")
3.4.2 构建 Map-Reduce Summarization Chain
使用 load_summarize_chain
,指定 chain_type="map_reduce"
,自动开启分步总结模式。
from langchain_openai import ChatOpenAI
from langchain.chains.summarize import load_summarize_chain
# 初始化 OpenAI Chat 模型
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 创建 Map-Reduce Summarization Chain
map_reduce_chain = load_summarize_chain(
llm,
chain_type="map_reduce",
)
# 执行总结
summary = map_reduce_chain.invoke(documents)
print(summary['output_text'])
▶️ 小贴士
如果想自定义 Map 阶段或 Reduce 阶段的提示词(prompt),可以分别传入 map_prompt
和 combine_prompt
参数。
3.5 Map-Reduce 关键优势
- 可扩展性:可以处理成百上千份文档;
- 灵活性:可以对 Map 阶段与 Reduce 阶段分别设置不同的总结风格;
- 高效成本控制:避免一次性把所有内容送入 LLM,减少上下文溢出与费用。
3.6 整合代码示例
完整一版 Map-Reduce 总结流程:
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import ChatOpenAI
from langchain.chains.summarize import load_summarize_chain
# 加载多个网页
urls = [
"https://python.langchain.com/docs/get_started/introduction",
"https://python.langchain.com/docs/get_started/installation",
"https://python.langchain.com/docs/get_started/quickstart",
"https://python.langchain.com/docs/components/models",
]
loader = WebBaseLoader(urls)
documents = loader.load()
# 初始化 LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 创建 Map-Reduce Summarization Chain
map_reduce_chain = load_summarize_chain(llm, chain_type="map_reduce")
# 执行总结
summary = map_reduce_chain.invoke(documents)
# 输出最终总结
print(summary['output_text'])
3.7 本章小结
在本章中,我们:
- 了解了 Map-Reduce 策略的原理与应用场景;
- 使用 LangChain 实现了大规模文档总结;
- 掌握了处理超大文档集合时的基本方法。
掌握 Map-Reduce,是迈向构建企业级 LLM 应用的重要一环!
✏️ 练习
- 找到 10+ 份本地 Markdown 或 PDF 文件,尝试用 Map-Reduce 策略总结它们。
- 修改 Map 阶段提示词,让 LLM 输出“小总结 + 关键问题”,再 Reduce 归纳所有问题清单。
- 将模型换成
gpt-3.5-turbo-1106
,比较响应速度和成本变化