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

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...