当前位置: 首页 > 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 框架以其高效、灵活、可扩展等特点,成为构建爬虫程序的…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...