当前位置: 首页 > news >正文

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

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_chainsm_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确保输出可靠性。这种分层处理模式为语言模型的实际落地提供了重要方法论支持。

相关文章:

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

LangChain的合并链旨在解决语言模型处理长文本时的上下文限制问题,包含Stuff、MapReduce、Refine和Rerank四种策略。Stuff链通过简单拼接文档块实现快速处理,适用于短文本但受限于模型token容量;MapReduce链采用分治思想,先独立处…...

rtcwake - Linux下定时唤醒计算机

rtcwake 是一个用于通过实时时钟(RTC)唤醒计算机的工具。它常用于在 Linux 系统中设置计算机在指定时间自动唤醒或关闭。以下是对命令 rtcwake -m off -s ${sleep_time} 的详细解析: 命令解析 bash复制 rtcwake -m off -s ${sleep_time} 1…...

MATLAB在投资组合优化中的应用:从基础理论到实践

引言 投资组合优化是现代金融理论中的核心问题之一,旨在通过合理配置资产,实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱,成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…...

什么是“可迭代”

在 Python 中,“可迭代”(Iterable)是一个非常重要的概念,它指的是任何可以被逐个访问其元素的对象。换句话说,如果一个对象支持迭代操作(比如可以通过 for 循环逐个访问其元素),那么…...

Python天梯赛10分题-念数字、求整数段和、比较大小、计算阶乘和

007-念数字 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu输入格式: 输入在一行中给出一个整数,如&…...

C#初级教程(6)——函数:从基础到实践

一、函数的核心价值:简化与复用代码 以游戏开发项目为例,在游戏中,角色的移动、攻击等行为并非只在单一场景中出现。设想一下,若每次需要角色执行这些行为时,都要重新编写对应的代码,那将是何等繁琐且易错的…...

【Bluedroid】AVRCP 连接源码分析(一)

一、AVRCP协议简介 AVRCP(Audio/Video Remote Control Profile)是蓝牙协议栈中的一个重要部分,它定义了蓝牙设备之间的音视频传输控制的流程和特点。AVRCP使得用户可以通过一个蓝牙设备(如手机)远程控制另一个蓝牙设备(如蓝牙耳机或音箱)上的音视频播放,如播放、暂停、…...

编程考古-忘掉它,Delphi 8 for the Microsoft .NET Framework

忘掉它吧,作一篇记录! 【圣何塞,加利福尼亚 – 2003年11月3日】在今日的Borland开发者大会上,Borland正式推出了Delphi 8 for Microsoft .NET Framework。这款新版本旨在为Delphi开发者提供一个无缝迁移路径,将现有的…...

Linux-Ansible基础模块

文章目录 模块Command模块Shell模块Script模块 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月22日19点21分 模块 Command模块 Command模块实践 ansible 192.168.1.100 -m com…...

正则表达式–断言

原文地址:正则表达式–断言 – 无敌牛 欢迎参观我的个人博客:正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...):正向预查(positive lookahead),表示某个字符串后面应该跟着什么。但这个字符串本身…...

Swiper插件的运用和学习

Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 Swiper 是目前最流行的免费开源轮播组件之一,它功能强大、高度可定制且兼容性好,支持移动端手势操作和丰富的交互动画。 下载Swiper压缩包 轮播图演示页面。可以看见各种不同切换效果的轮播图 然后解压…...

标准I/O与文件I/O

一、概念 标准IO:标准IO是指程序与标准输入(stdin)、标准输出(stdout)和标准错误(stderr)之间的输入输出操作。通常用于与用户交互或输出调试信息。文件IO:文件IO是指程序与文件系统…...

JavaScript函数-函数的参数

在JavaScript编程语言中,函数是组织代码和实现复杂逻辑的基本单元。而函数参数则是这些功能的重要组成部分,它们允许我们将数据传递给函数,从而使得函数更加通用和灵活。本文将深入探讨JavaScript函数参数的各种特性及其最佳实践。 参数基础…...

Android TabLayout 实现随意控制item之间的间距

效果 红色标注是不同的间距。 实现方式 1、xml中定义 <com.google.android.material.tabs.TabLayoutandroid:id"id/tab_layout"android:layout_width"wrap_content"app:tabIndicatorColor"color/color_FF00B2E3"app:tabBackground"a…...

STM32的“Unique device ID“能否修改?

STM32F1系列的"Unique device ID"寄存器的地址为0x1FFFF7E8。 这个寄存器是只读的。 "Unique device ID"寄存器位于“System memory”中。“System memory”地址范围为“0x1FFF F000- 0x1FFF F7FF”。 所有STM32 MCU上都存在系统引导加载程序。顾名思义&a…...

STM32-温湿度上传OneNET项目

一、项目需求 使用 ESP8266 连接 OneNET 云平台&#xff0c;并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11&#xff08;原理驱动&#xff09; | 良许嵌入式 3.1 正常工作验证 #​ 上电后&#xff…...

前端面试-JavaScript 数据类型详解

目录 一、数据类型分类 二、核心区别对比 1. 存储方式 2. 比较方式 3. 类型检测方法 三、特殊类型详解 1. Symbol 2. BigInt 3. null vs undefined 四、常见面试扩展问题 五、总结 一、数据类型分类 JavaScript 数据类型分为 基本数据类型&#xff08;原始类型&…...

【进程 】

【进程】 目录1. ELF格式程序与进程2. 进程的组织方式3. 进程的复刻&#xff08;fork&#xff09;4. 进程的状态 目录 1. ELF格式程序与进程 在Linux系统里&#xff0c;程序文件普遍采用ELF&#xff08;Executable and Linkable Format&#xff09;格式。这种格式的程序文件存…...

深入HBase——数据结构与算法

引入 通过前面的文章&#xff0c;我们对HBase已经有了基本认识&#xff0c;下面我们从HBase最核心的算法和数据结构进一步深入HBase。 HBase的一个列簇&#xff08;Column Family&#xff09;本质上就是一棵LSM树&#xff08;Log-Structured Merge-Tree&#xff09;​。LSM树…...

Python爬虫实战:获取六图网漫画图

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 一、引言 Python 作为一种广泛应用于数据处理和网络爬虫领域的编程语言,拥有丰富的库和框架。其中,Scrapy 框架以其高效、灵活、可扩展等特点,成为构建爬虫程序的…...

2026届毕业生推荐的六大降AI率助手实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 维普平台针对人工智能生成内容也就是AIGC的检测标准已渐渐清晰&#xff0c;此刻&#xff0c;…...

Onekey终极指南:5分钟搞定Steam清单下载的完整教程

Onekey终极指南&#xff1a;5分钟搞定Steam清单下载的完整教程 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为复杂的Steam Depot清单下载而烦恼吗&#xff1f;Onekey就是你的救星&#x…...

Kafka命令行实战:从查看主题到生产消费数据的完整操作手册(附常见错误排查)

Kafka命令行实战&#xff1a;从查看主题到生产消费数据的完整操作手册&#xff08;附常见错误排查&#xff09; 接手一个新的Kafka集群时&#xff0c;命令行操作是每位开发者和运维人员必须掌握的核心技能。本文将带你从零开始&#xff0c;通过任务驱动的方式&#xff0c;系统掌…...

Glide缓存调优实战:根据你的App场景,选对DiskCacheStrategy和skipMemoryCache

Glide缓存调优实战&#xff1a;根据App场景定制DiskCacheStrategy与skipMemoryCache 在移动应用开发中&#xff0c;图片加载的性能直接影响用户体验。Glide作为Android平台最受欢迎的图片加载库之一&#xff0c;其缓存机制设计精妙但配置灵活&#xff0c;不同的业务场景需要不同…...

从像素到电影:Photon光影着色器如何重新定义Minecraft渲染管线

从像素到电影&#xff1a;Photon光影着色器如何重新定义Minecraft渲染管线 【免费下载链接】photon A gameplay-focused shader pack for Minecraft 项目地址: https://gitcode.com/gh_mirrors/photon3/photon 在数字渲染领域&#xff0c;实现真实感与性能平衡一直是开发…...

从YUV序列到码流分析:一次完整的H.266/VVC编码实验与问题排查实录

从YUV序列到码流分析&#xff1a;一次完整的H.266/VVC编码实验与问题排查实录 在视频编码技术快速迭代的今天&#xff0c;H.266/VVC作为新一代标准&#xff0c;其压缩效率相比前代提升显著&#xff0c;但随之而来的复杂度也令许多开发者望而生畏。本文将带您深入实战&#xff0…...

15分钟搞定Ncorr 2D数字图像相关软件:材料力学位移测量的终极指南

15分钟搞定Ncorr 2D数字图像相关软件&#xff1a;材料力学位移测量的终极指南 【免费下载链接】ncorr_2D_matlab 2D Digital Image Correlation Matlab Software 项目地址: https://gitcode.com/gh_mirrors/nc/ncorr_2D_matlab 还在为复杂的数字图像相关软件安装而烦恼吗…...

Linux文件系统性能调优:深入理解dentry缓存机制与实战监控

Linux文件系统性能调优&#xff1a;深入理解dentry缓存机制与实战监控 当你在Linux服务器上执行ls -l /usr/bin时&#xff0c;系统几乎瞬间就能返回结果——这种看似简单的操作背后&#xff0c;隐藏着Linux文件系统最精妙的缓存设计。作为系统管理员&#xff0c;我曾经历过一次…...

Excel数据分析师必看:从入门到精通Power Pivot的5个核心DAX函数实战(含CALCULATE、RELATED避坑指南)

Excel数据分析师进阶指南&#xff1a;5个核心DAX函数实战精解与避坑手册 当你第一次在Power Pivot中看到DAX公式时&#xff0c;可能会被它看似简单的语法迷惑——直到你尝试构建第一个复杂计算指标。与Excel函数不同&#xff0c;DAX的真正威力隐藏在筛选上下文这个核心概念中。…...

【实战指南】OpenXLab 数据集高效下载:从环境配置到完整流程解析

1. 环境配置&#xff1a;从零搭建OpenXLab工作流 第一次接触OpenXLab数据集下载时&#xff0c;我在配置环境阶段就踩过坑。当时直接用系统Python安装依赖&#xff0c;结果因为版本冲突导致后续步骤全部报错。后来发现用conda创建独立环境才是最佳实践&#xff0c;这里分享我的标…...