LangChain系列:精通LangChain的合并文档链

news/2025/2/27 4:42:42

LangChain的合并链旨在解决语言模型处理长文本时的上下文限制问题,包含Stuff、MapReduce、Refine和Rerank四种策略。Stuff链通过简单拼接文档块实现快速处理,适用于短文本但受限于模型token容量;MapReduce链采用分治思想,先独立处理各文档块再整合结果,适合超长或多文档场景,但计算成本较高;Refine链通过迭代优化逐步完善输出,适合逻辑连贯的长文本生成任务,但效率较低;Rerank链依赖排序算法筛选最优答案,提升结果相关性,但需额外模型支持。四者各具优势,实际应用中需结合文本长度、质量需求与资源条件灵活选择。

LangChain的合并链是为了解决语言模型在处理长文本或多文档时的上下文限制问题而设计的。由于大多数语言模型存在token长度限制,直接处理超长文本会导致信息截断或性能下降,合并链通过不同的策略对分割后的文档块进行有效整合,从而突破这一瓶颈。目前主要有四种核心合并链:Stuff、MapReduce、Refine和Rerank,每种策略针对不同的场景需求,具有独特的优缺点。
在这里插入图片描述

Stuff链

Stuff链是最直接的合并方式,其核心思想是将所有文档块简单拼接后一次性输入模型。这种链适用于文档总长度较短、且模型上下文窗口足够容纳的场景,例如快速汇总单篇短文或分析少量用户评论。
它的优势在于实现简单且计算成本低,仅需一次模型调用即可完成。然而,当文档总长度超过模型限制时,这种方法会直接失效。例如,在总结一篇2000字的文章时,若模型最大token数为4096,可直接使用Stuff链;但若文章长达1万字,则需改用其他策略。

在这里插入图片描述
下面是示例代码:

from langchain.document_loaders import UnstructuredFileLoader
from langchain.chains.summarize import load_summarize_chain

sm_loader = UnstructuredFileLoader("../data/muir_lake_tahoe_in_winter.txt")
small_doc = sm_loader.load()

from langchain import OpenAI
OPENAI_API_KEY = '...'
llm = OpenAI(openai_api_key=OPENAI_API_KEY)

chain = load_summarize_chain(llm, chain_type="stuff", verbose=True)
chain.run(small_doc)

MapReduce链

MapReduce链借鉴了分布式计算中“分而治之”的思想,先对每个文档块独立处理(Map阶段),再将所有结果合并后二次加工(Reduce阶段)。这种链适合处理超长文档或批量文档,例如分析数百页的财报或处理大量用户反馈。
其优势在于可通过并行处理提升效率,且Reduce阶段能提炼全局信息。缺点是计算资源消耗较大,尤其是文档块较多时需多次调用模型。例如,分析一本电子书时,可先将各章节分别提取关键词(Map),再整合所有关键词生成全书摘要(Reduce)。

在这里插入图片描述
首先,我们使用文本分割器将文档分割成更小的块,然后将其传递给链。下面示例代码:

chain = load_summarize_chain(llm, chain_type="map_reduce", verbose=True)
lg_loader = UnstructuredFileLoader("../data/PaulGrahamEssays/worked.txt")
large_doc = lg_loader.load()

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    # Set a really small chunk size, just to show.
    chunk_size = 400,
    chunk_overlap = 0
)
large_docs = text_splitter.split_documents(large_doc)
chain.run(large_docs[:5])

Refine链

Refine链采用迭代优化的方式,按顺序处理每个文档块,并逐步将当前结果与后续块结合更新。这种方法适用于需要渐进式完善输出的场景,例如撰写技术报告或构建知识图谱。
其优势在于能通过多次修正提升结果质量,尤其适合前后文档块存在逻辑关联的情况。缺点是处理速度较慢,且无法并行化。例如,在编写市场分析报告时,可先基于第一章数据生成初稿,再依次融入后续章节的数据不断优化结论。
在这里插入图片描述
示例实现代码:

chain = load_summarize_chain(llm, chain_type="refine", verbose=True)
chain.run(large_docs[:5])

Rerank链

Rerank链的核心是对多个中间结果进行排序筛选,通常结合语义相关性算法(如MMR)选择最优答案。这种链适用于需要从多角度信息中提取核心内容的场景,例如智能问答系统或争议性话题分析。
其优势在于能通过重排序提升结果的相关性和准确性,但需要引入额外的排序模型或算法,增加了系统复杂性。例如,在回答一个医学问题时,可先通过MapReduce生成多个候选答案,再根据与问题的相关性排序,选择最权威的解答。
在这里插入图片描述
示例实现代码:

from langchain.chains.question_answering import load_qa_chain
chain = load_qa_chain(llm, chain_type="map_rerank", verbose=True, return_intermediate_steps=True)

query = "Who was the authors friend who he got permission from to use the IBM 1401?"
result = chain({"input_documents": large_docs[:5], "question": query}, return_only_outputs=True)
result['output_text']

总体来看,四种合并链构成了处理不同规模与复杂度文档需求的工具箱。Stuff链以简单高效见长,MapReduce链侧重规模化处理,Refine链追求渐进优化,而Rerank链强调结果优选。实际应用中常需根据文本长度、质量要求、计算资源等要素进行组合使用,例如先通过MapReduce生成粗粒度结果,再用Refine链进行局部优化。随着语言模型上下文窗口的扩大,这些链的适用边界可能发生变化,但其分阶段处理的核心思想仍将持续影响长文本处理的技术架构。

最后总结

合并链的设计反映了对语言模型局限性的针对性突破。其核心价值在于通过分阶段、多策略的文本处理,平衡效率与质量:Stuff链以简驭繁,MapReduce链以并行换规模,Refine链以时间换精度,Rerank链以筛选提纯度。这些策略的共存体现了“没有最优解,只有最适解”的工程思维。未来,尽管模型上下文窗口的扩展可能削弱部分链的必要性,但其分治、迭代、筛选的思想仍将影响复杂文本处理系统的架构设计。开发者需根据具体场景(如实时性要求、文本复杂度、硬件资源)动态选择或组合链策略,例如先用MapReduce粗处理,再用Refine精细化,最终通过Rerank确保输出可靠性。这种分层处理模式为语言模型的实际落地提供了重要方法论支持。


http://www.niftyadmin.cn/n/5869450.html

相关文章

Gradio全解11——使用transformers.agents构建Gradio UI(6)

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(6) 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.6 通过agents构建Gradio UI11.6.1 ChatMessage数据类1. 数据结构2. 例程11.6.2 构建Gradio UI示例1. 代码及运行2. 代码解读参考文献前言 本…

【HTML— 快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器,我们在写前端代码时,使用 Sublime Text 打开比使用记事本打开,得到的代码体验更好,比 vscode…

学习笔记05——HashMap实现原理及源码解析(JDK8)

HashMap实现原理及源码解析(JDK8) 一、核心设计思想 数组链表红黑树:桶数组存储Node节点,哈希冲突时形成链表,链表长度≥8且桶数量≥64时转红黑树扰动函数:(h key.hashCode()) ^ (h >>> 16) 消除…

springBoot统一响应类型3.0版本

前言&#xff1a;起于环境&#xff0c;先于实践&#xff0c;源于变化&#xff0c;升于思考&#xff0c;再于实践&#xff0c;形于总结——实践至上&#xff01; 简单回顾&#xff1a; /*** 基础统一响应类* param <T>*/Data public class apiResult<T> {private in…

九、数据治理架构流程

一、总体结构 《数据治理架构流程图》&#xff08;Data Governance Architecture Flowchart&#xff09; 水平结构&#xff1a;流程图采用水平组织&#xff0c;显示从数据源到数据应用的进程。 垂直结构&#xff1a;每个水平部分进一步划分为垂直列&#xff0c;代表数据治理的…

在WINDOWS系统使用CMake gui编译NLopt配合VSCode使用

1. 准备工作 安装CMake&#xff1a;从CMake官网下载并安装CMake。下载Nlopt源码&#xff1a;从Nlopt官网或GitHub仓库下载Nlopt源码。安装编译器&#xff1a;确保已安装Visual Studio或其他支持的编译器&#xff08;如MinGW&#xff09;。 2. 配置CMake 方式1 打开CMake GU…

网页五子棋——项目测试

目录 测试用例设计 功能测试 注册功能测试 正常注册 异常注册 登录功能测试 正常登录 异常登录 匹配功能测试 对战功能测试 自动化测试 引入依赖 Utils 注册测试 登录测试 匹配测试 RunTest 界面测试 性能测试 总结 测试用例设计 在本篇文章中&#xff0c;…

Maven 依赖的深入理解(一)

一、Maven 依赖初相识 在 Java 项目开发的广袤天地里&#xff0c;Maven 就如同一位得力的助手&#xff0c;而 Maven 依赖则是其核心的 “魔法棒”&#xff0c;为项目构建带来了前所未有的便利与高效。随着项目规模的日益壮大&#xff0c;依赖的管理变得愈发复杂&#xff0c;手…