langchain txt 文档加载,分割

stuff 策略

加载 arXiv 论文,让模型总结前 2000 字

这里采用的是 stuff 策略,也就是将一大段文本。按字数分割成 N 个文本块,又合并成一个大的文本块。

对超大规模不友好,没有区分文档重要性,适合文档量较少场景

import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
load_dotenv('key.env')  # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY')  # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量
model = Tongyi(temperature=1)from langchain_core.prompts import PromptTemplate, format_document
from langchain_core.output_parsers import StrOutputParser
from langchain_community.document_loaders import ArxivLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
loader = ArxivLoader(query="2210.03629",load_max_docs=1  # 加载第一个匹配的文档
)
docs = loader.load()
print(docs[0].metadata)# 把文本分割成 500 字一组的切片
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=0  # 要求文本没有重叠
)
chunks = text_splitter.split_documents(docs)# 构建 Stuff 形态(即文本直接拼合)的总结链
doc_prompt = PromptTemplate.from_template("{page_content}")
chain = ({"content": lambda docs: "\n\n".join(format_document(doc, doc_prompt) for doc in docs)}| PromptTemplate.from_template("用中文总结以下内容,不需要人物介绍,字数控制在 50 字以内:\n\n{content}")| model| StrOutputParser()
)
# 由于论文很长,我们只选取前 2000 字作为输入并调用总结链
res = chain.invoke(chunks[:4])
print(res)

MapReduce 策略

对每个文本块最一个回答,最后汇总到一起

但适合超大成千上万的文档量,因为是并行,map,reduce 需要不同提示词模版,多次调用问答模型,效率低

import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
load_dotenv('key.env')  # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY')  # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量
model = Tongyi(temperature=1)from functools import partial
from langchain_core.prompts import PromptTemplate, format_document
from langchain_core.output_parsers import StrOutputParser
from langchain_community.document_loaders import ArxivLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
loader = ArxivLoader(query="2210.03629", load_max_docs=1)
docs = loader.load()# 把文本分割成 500 字一组的切片
text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500,chunk_overlap = 50  # 允许文档重叠字数
)
chunks = text_splitter.split_documents(docs)# 构建工具函数:将 Document 转换成字符串
document_prompt = PromptTemplate.from_template("{page_content}")
partial_format_document = partial(format_document, prompt=document_prompt)# 构建 Map 链:对每个文档都先进行一轮总结
map_chain = ({"context": partial_format_document}| PromptTemplate.from_template("Summarize this content:\n\n{context}")| model| StrOutputParser()
)# 构建 Reduce 链:合并之前的所有总结内容
reduce_chain = ({"context": lambda strs: "\n\n".join(strs)}| PromptTemplate.from_template("Combine these summaries:\n\n{context}")| model| StrOutputParser()
)# 把两个链合并成 MapReduce 链
map_reduce = map_chain.map() | reduce_chain
res = map_reduce.invoke(chunks[:4], config={"max_concurrency": 5})
print(res)

Refine 策略

也是多轮,但每一轮输入都只包含一个文档,以及之前轮次的中间回答

优势:

每次只需要针对一个文档生成回答,避免过长 context;回答是逐步推理和完善的,而不是一次性塞入所有信息;可以自定义每轮的提示词模版,实现更精细的控制

劣势:

文档顺序对结果又很大影响,需要智能排序;计算时间高

import os
from dotenv import load_dotenv
from langchain_community.llms import Tongyi
load_dotenv('key.env')  # 指定加载 env 文件
key = os.getenv('DASHSCOPE_API_KEY')  # 获得指定环境变量
DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"]  # 获得指定环境变量
llm = Tongyi(temperature=1)from functools import partial
from operator import itemgetter
from langchain_core.prompts import PromptTemplate, format_document
from langchain_core.output_parsers import StrOutputParser
from langchain_community.document_loaders import ArxivLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
loader = ArxivLoader(query="2210.03629", load_max_docs=1)
docs = loader.load()# 把文本分割成 500 字一组的切片
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50
)
chunks = text_splitter.split_documents(docs)# 构建工具函数:将 Document 转换成字符串
document_prompt = PromptTemplate.from_template("{page_content}")
partial_format_document = partial(format_document, prompt=document_prompt)# 构建 Context 链:总结第一个文档并作为后续总结的上下文
first_prompt = PromptTemplate.from_template("Summarize this content:\n\n{context}")
context_chain = {"context": partial_format_document} | first_prompt | llm | StrOutputParser()# 构建 Refine 链:基于上下文(上一次的总结)和当前内容进一步总结
refine_prompt = PromptTemplate.from_template("Here's your first summary: {prev_response}. ""Now add to it based on the following context: {context}"
)
refine_chain = ({"prev_response": itemgetter("prev_response"),"context": lambda x: partial_format_document(x["doc"]),}| refine_prompt| llm| StrOutputParser()
)# 构建一个负责执行 Refine 循环的函数
def refine_loop(docs):summary = context_chain.invoke(docs[0])for i, doc in enumerate(docs[1:]):summary = refine_chain.invoke({"prev_response": summary, "doc": doc})return summaryres = refine_loop(chunks[:4])
print(res)

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

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

相关文章

SystemUI QuickQSPanel所在的位置

QuickQSPanel 为蓝色 位置: quick_status_bar_expanded_header.xml 图片:

Qt中播放GIF动画

在Qt应用程序中,如果你想在QLabel控件上播放GIF动画,可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例: 步骤1:引入必要的头文件 首先,在你的源代码文件中包含QMovie和QLabel相关的头文件:…

解决Idea中文乱码

解决 Idea 中文乱码问题的方法通常包括以下几个步骤: 1、调整文件编码:确保项目中的文件编码与 Idea 中的编码设置一致。通常情况下,使用 UTF-8 编码是比较合适的选择。你可以在 Idea 中通过 File -> Settings -> Editor -> File E…

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型。在当下数字化转型的热潮中,集装箱5G智能制造工厂数字孪生可视化平台成为了推动企业转型升级的重要工具。这一平台将先进的5G技术与智能制造相结合,通过数字孪生技术实现生产过程…

SQL优化之EXPLAIN执行计划(转载)

目录 第一章、快速了解EXPLAIN1.1)EXPLAIN是什么1.2)示例 第二章、结果列说明2.1)id 与table2.2)select_type:2.3)type2.4)possible_keys与key2.5) key_len2.6)rows2.7&a…

遥感图像处理:从畸变消除到专题信息提取

​ ​ ​在遥感技术的应用中,图像处理是不可或缺的关键步骤。从消除各种辐射畸变和几何畸变,到利用增强技术突出景物的光谱和空间特征,再到进一步理解、分析和判别处理后的图像,这一过程为我们呈现了一幅幅更为真实、清晰的…

500元以下户外运动耳机哪款好?五大绝佳好货推荐

户外运动已经成为许多人日常生活的一部分,无论是晨跑、骑行还是徒步,音乐总能为我们带来无尽的活力与乐趣,而一款优质的户外运动耳机,更是能为我们带来沉浸式的音乐体验,让运动更加充满激情,那么如何在500元…

紧急 CCF-C ICPR 2024摘要投稿日期延期至4月10日 速投速成就科研梦

会议之眼 快讯 第27届ICPR(The International Conference on Pattern Recognition)即国际模式识别会议将于 2024年 12月1日-5日在印度加尔各答的比斯瓦孟加拉会议中心举行!ICPR是国际模式识别协会的旗舰会议,也是模式识别、计算机…

【可视化大屏开发】17. 加餐-ECharts定制省份地图

各身份地图数据下载小工具 DataV.GeoAtlas地理小工具系列 登录DataV 后,直接通过选择点击获取需要的省份地区数据 > 其实单击即可完成选择 检查下载的数据格式是否正常 自定义字体 更新地图部分代码 index.less部分 //声明字体 font-face{ font-family: …

农资行业短视频宣传怎么做?小魔推打造高效农业矩阵!

近年来传统农业正在经历一场改革,不论是生产方式还是消费需求,农资行业都发生了翻天覆地的变化。而且从去年到今年农业涌现出了一些新玩法,结合这些新玩法,更是能够改变农资行业的宣传与盈利模式! 前几天梳理的小魔推…

btSoftRigidDynamicsWorld 类是 Ammo.js 物理库中的一个类,表示一个动态世界,用于处理软体和刚体物体的物理模拟。

demo案例 btSoftRigidDynamicsWorld 类是 Ammo.js 物理库中的一个类,表示一个动态世界,用于处理软体和刚体物体的物理模拟。让我们按照输入参数、输出、属性和方法来详细解释其 API: 输入参数: dispatcher:这是一个…

一天300收入打底,​一个适合任何人的创业项目!

共享旅游卡项目,一天300收入打底,一个适合任何人的创业项目! 只要你不懒,生活总过得不会太差。只要你不贪,就算不能大富大贵,至少不会负债累累。 人性最难戒掉的两个字:一个是懒,另…