Summarization with Langchain

news/2024/11/15 21:57:02/文章来源:https://www.cnblogs.com/IcyFeather/p/18372390

教程链接 — https://youtu.be/w6wOhSThnoo

摘要是自然语言处理(NLP)的一个关键方面,它能够将大量文本浓缩成简洁的摘要。LangChain,作为NLP领域中的一个强大工具,提供了三种不同的摘要技术:stuffmap_reducerefine。每种方法都有其独特的优点和局限性,使它们适用于不同的情况。本文深入探讨了这些技术的细节、它们的优缺点以及理想的应用场景。

教程中使用的完整实现代码和数据可在以下存储库中找到。

摘要技术

图片 3

来自langchain

  1. Stuff Chain

stuff链特别适用于处理大型文档。它的工作原理是将文档转换为较小的块,分别处理每个块,然后将摘要组合起来生成最终摘要。这种方法适用于管理庞大的文件,并且可以通过递归字符文本分割器的帮助来实现。

优点:

  • 高效处理大型文档。
  • 允许逐块摘要,适合管理庞大的文件。

缺点:

  • LLM上下文窗口
from langchain.chains.combine_documents.stuff import StuffDocumentsChain  
from langchain.chains.llm import LLMChain  
from langchain.prompts import PromptTemplate # 定义提示  
prompt_template = """Write a concise summary of the following:  
"{text}"  
CONCISE SUMMARY:"""  
prompt = PromptTemplate.from_template(prompt_template)  
# 定义 LLM 链  
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo-16k")  
llm_chain = LLMChain(llm=llm, prompt=prompt)  
# 定义 StuffDocumentsChain  
stuff_chain = StuffDocumentsChain(llm_chain=llm_chain, document_variable_name="text")  
docs = loader.load()  
print(stuff_chain.run(docs))

Map-Reduce 方法

映射-归约方法涉及分别对每个文档进行摘要(映射步骤),然后将这些摘要组合成最终摘要(归约步骤)。这种方法更可扩展,并且可以处理更大量的文本。map_reduce技术旨在摘要超出语言模型令牌限制的大型文档。它涉及将文档分成块,为每个块生成摘要,然后将这些摘要组合起来创建最终摘要。这种方法对处理大型文件高效,并且显著减少了处理时间。

优点:

  • 通过将大型文档分成可管理的块来有效处理。
  • 通过分别处理块来减少处理时间。

缺点:

  • 需要额外的步骤来组合单独的摘要,这可能会增加过程的复杂性。

以下是如何实现映射-归约方法的示例:

from langchain.chains import MapReduceDocumentsChain, ReduceDocumentsChain  
from langchain_text_splitters import CharacterTextSplitter # 映射  
map_template = """The following is a set of documents  
{docs}  
Based on this list of docs, please identify the main themes   
Helpful Answer:"""  
map_prompt = PromptTemplate.from_template(map_template)  
map_chain = LLMChain(llm=llm, prompt=map_prompt)  
# 归约  
reduce_template = """The following is set of summaries:  
{docs}  
Take these and distill it into a final, consolidated summary of the main themes.   
Helpful Answer:"""  
reduce_prompt = PromptTemplate.from_template(reduce_template)  
reduce_chain = LLMChain(llm=llm, prompt=reduce_prompt)  
# 通过映射链组合文档,然后组合结果  
map_reduce_chain = MapReduceDocumentsChain(  llm_chain=map_chain,  reduce_documents_chain=reduce_documents_chain,  document_variable_name="docs",  return_intermediate_steps=False,  
)  
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=1000, chunk_overlap=0)  
split_docs = text_splitter.split_documents(docs)  
print(map_reduce_chain.run(split_docs))

Refine 方法

Refine方法通过循环遍历输入文档来迭代更新其答案。对于每个文档,它将所有非文档输入、当前文档和最新的中间答案传递给LLM链以获得新答案。这种方法适用于根据新上下文细化摘要。

refine技术是map_reduce技术的简单替代方案。它涉及为第一个块生成摘要,将其与第二个块组合,生成另一个摘要,并继续这个过程,直到最终摘要完成。这种方法适用于大型文档,但与map_reduce相比,需要的复杂性较小。

优点:

  • map_reduce技术更简单。
  • 对于大型文档,以较小的复杂性实现了类似的结果。

缺点:

  • 与其它技术相比,功能有限。

以下是如何实现Refine方法的示例:

from langchain.chains.summarize import load_summarize_chain
prompt = """Please provide a summary of the following text.TEXT: {text}SUMMARY:"""question_prompt = PromptTemplate(template=question_prompt_template, input_variables=["text"]
)refine_prompt_template = """Write a concise summary of the following text delimited by triple backquotes.Return your response in bullet points which covers the key points of the text.```{text}```BULLET POINT SUMMARY:"""refine_template = PromptTemplate(template=refine_prompt_template, input_variables=["text"]# Load refine chain
chain = load_summarize_chain(llm=llm,chain_type="refine",question_prompt=question_prompt,refine_prompt=refine_prompt,return_intermediate_steps=True,input_key="input_documents",output_key="output_text",
)
result = chain({"input_documents": split_docs}, return_only_outputs=True)

选择合适的技术

摘要技术的选择取决于当前任务的具体要求。对于大型文档,建议使用map_reducerefine技术,因为它们能够有效地进行分块摘要。stuff链特别适合于太大而无法一次性处理的文档,为管理庞大的文件提供了实用的解决方案。

每种方法都有其优势,适用于不同场景。Stuff方法简单但可能不适用于处理大量文本。Map-Reduce方法更可扩展,可以处理更大的文档,但需要更多的设置。Refine方法适用于基于新上下文迭代细化摘要,使其成为动态摘要任务的良好选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785029.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R绘图(06)——带errorbar的柱状图

每次找R绘图美化都很麻烦,索性自己写个笔记慢慢补充绘图美化的指令### 生成数据 ### # 设置种子以获得可重复的结果 set.seed(222) # 生成字符序列 "AAAABBBB" char_sequence <- c("A", "A", "A", "A", "B", …

WPF:MVVM的由来与属性绑定的过程

WPF:MVVM的由来与属性绑定的过程 1、MVVM (1)MVVM是什么? ​ MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式。有助于分离应用程序的业务逻辑和用户界面层,使得开发过程更易于管理,同时也便于单元测试。Model? 现实世界中对象的抽象结果。 View? View=U…

异或的常用性质

性质 1. 百度百科给的最主要的性质就是归零和结合,其他的就都是拓展了。 例题:P1469 2. \(a \bigoplus b<=a+b\) 关于这个不等式比较好的理解为异或就是不进位的加法 例题:luoguP5514 应用 异或哈希 异或跟hash一样,也是会发生冲突的 例如:$1 \bigoplus 2 = 5 \bigopl…

虚拟机的搭建

1.Download VMware Workstation 下载和安装关注微信公众号“软件安装大神”找到虚拟机VMware16 2.DownloadingKali Linux 搜索官网:Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution 解压,然后在第一步 虚拟机VMware16安装成功后打开第二部解压文…

AcWing 1078. 旅游规划 (DFS找树的直径+直径中点性质求解,无DP)

原题链接 题目描述算法 引用自 树的直径 - OI-Wiki:若树上所有边边权均为正,则树的所有直径中点重合 证明:使用反证法。设两条中点不重合的直径分别为 \(\delta(s,t) 与 \delta(s,t)\),中点分别为 \(x\) 与 \(x\)。显然,\(\delta(s,x) = \delta(x,t) = \delta(s,x) = \del…

世上最好的共享内存(Linux共享内存最透彻的一篇)------宋宝华

共享单车、共享充电宝、共享雨伞,世间的共享有千万种,而我独爱共享内存。 早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这片内存。现阶段广泛应用于多媒体、Graphics领域的共享内存方…

P7706 文文的摄影布置 题解

一道不错的线段树题P7706 文文的摄影布置 题解 原题 读完题,发现是线段树。单点修改+区间查询。 不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个 ψ 值(下称待求值)。 对于一个区间的待求值,大概有四种情况:如上图四种情况分别为:待求值最大值在左区间 待求值最大…

信息学奥赛初赛天天练-71-NOIP2016普及组-基础题2-进制转换、二进制转八进制、八进制转二进制、二叉树数组存储、寻址空间

NOIP 2016 普及组 基础题2 4 以下不是 CPU 生产厂商的是( ) A Intel B AMD C Microsoft D IBM 8 与二进制小数 0.1相等的八进制数是( ) A 0.8 B 0.4 C 0.2 D 0.1 9 以下是 32 位机器和 64 位机器的区别是( ) A 显示器不同 B 硬盘大小不同 C 寻…

CF 2001 E2 solution (967 Div.2)

CF 2001 E2 由于对称,所以设 \(heap[u]\) 为两次确定堆,且第一次弹出的是 \(u\),\(heap[u,v]\) 是第一次 \(u\) ,第二次 \(v\) 则答案就是 \(\sum heap[u]=2^{n-1}heap[x]\) 其中 \(x\) 任意。 不妨我们考虑第一次都是从第一个叶子弹出,那么对于其他不同的第二个弹出的点…

pytest和unittest的几个区别

主要区别1、安装需求:  pytest:作为第三方单元测试库,需要额外安装。  unittest:是Python标准库的一部分,无需额外安装。2、用例编写规则:  pytest:编写规则较为简单,兼容性好,可以执行unittest风格的测试用例,无需修改unittest用例的任何代码。  unittest:…

【Linux】分区向左扩容的方法

@目录为什么是向左扩容操作前的备份方法:启动盘试用Ubuntu后进行操作为什么是向左扩容 Linux向右扩容非常简单,无论是系统自带的disks工具还是apt安装的gparted工具,都有图像化的界面可以操作。但是,都不支持向左扩容。笔者这里的磁盘情况如下:其中磁盘1的99.5GB是我的Lin…

linux开机自启脚本运行完之后不关闭应用程序

最近在用petalinux2323.2版本编译的系统镜像,想在系统开机后自动运行程序,发现按照2021.2相同的方式启动之后,软件在开机脚本运行完就会自动退出了,经过查找发现petalinux2023.2编译的镜像默认使用的systemd去运行开机脚本,而2021.2是使用的init.d。在systemd方式下需要在…