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.mzph.cn/news/808735.shtml

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

相关文章

安卓刷机fastboot分段传输

win10 fastboot 无法识别,驱动下载地址GitHub - xushuan/google_latest_usb_driver_windows 把inf文件更新到设备管理器驱动更新即可 问题 archive does not contain super_empty.img Sending vbmeta_a (4 KB) OKAY [ 0.117s] Writing …

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中,如果只是做一个简单的单元测试(不涉及端到端、数据库交互、API调用、消息队列处理等),我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

Redis中的集群(六)

集群 ASK错误 在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存在目标节点里面。当客户端向源节点发送一个与数据库有关的命令&#xf…

std::vector的核心框架接口的模拟实现bit::vector

std::vector的核心框架接口的模拟实现bit::vector #pragma once #include<iostream> #include<assert.h> #include<string> #include<algorithm> #include<vector>using std::cout; using std::endl;namespace bit {template<class T>cla…

C中自定义类型——结构体

一.前言 在C语言中&#xff0c;不仅有int、char、short、long等内置类型&#xff0c;C语言还有一种特殊的类型——自定义类型。该类型可以由使用者自己定义&#xff0c;可以解决一些复杂的个体。 二.结构体 2.1结构体的声明 我们在利用结构体的时候一般是用于描述一些有多种…

c++ 类型转换dynamic_cast

在C中&#xff0c;dynamic_cast 是一种用于安全地将指针或引用从一个类类型转换为另一个类类型的运算符。它主要用于在继承层次结构中进行类型转换&#xff0c;并在运行时执行类型检查&#xff0c;以确保转换的安全性。 dynamic_cast 执行以下操作&#xff1a; 1. 它检查 expr…

【SpinalHDL】Scala编程中的var及val

1. var与val区别及相同点 在SpinalHDL中&#xff0c;var 和 val 是两种不同的变量声明方式&#xff0c;它们在用法和语义上有一些区别和相同点&#xff1a; 1. 区别 var&#xff1a;代表可变变量&#xff0c;类似于其他编程语言中的可变变量。使用 var 声明的变量可以在声明…

javaweb配置JSTL

首先配置好javaweb项目。 在网上下载好jakarta-taglibs-standard并解压。 在web/WEB-INF目录下创建lib目录。 在jakarta-taglibs-standard目录下lib目录内的两个.jar文件复制到javaweb项目lib目录下。 将这两个.jar包导入库。 在idea菜单栏找到“文件”并打开&#xff0c;点…

linux磁盘知识学习

文章目录 linux 磁盘阵列知识积累配置RAID方案在Linux中配置RAID在其他设备上配置RAID 确认是什么RAID级别cat /proc/mdstat 输出示例mdadm --detail /dev/md0输出示例 如何确认设备是否做了RAID其他方式fdisklsblkpartedlshwlsscsismartctlblkid 不同命令使用场景1.fdisk2.mda…

nvm更新node版本

1、nvm安装和管理多个 Node.js 版本&#xff1a;NVM 允许用户在计算机上同时安装多个不同版本的 Node.js。这使得开发人员可以轻松地在不同的项目中使用不同的 Node.js 版本&#xff0c;而无需手动安装或卸载。 2、nvm切换 Node.js 版本&#xff1a;通过 NVM&#xff0c;用户可…

好菜每回味道不同--建造者模式

1.1 炒菜没放盐 中餐&#xff0c;老板需要每次炒菜&#xff0c;每次炒出来的味道都有可能不同。麦当劳、肯德基这些不过百年的洋快餐却能在有千年饮食文化的中国发展的那么好呢&#xff1f;是因为你不管何时何地在哪里吃味道都一样&#xff0c;而鱼香肉丝在我们中餐却可以吃出上…

Langchain-Chatchat 从入门到精通(基于本地知识库的问答系统)(更新中)

目录 前言一、Langchain-Chatchat介绍1-1、Langchain-Chatchat介绍1-2、LangChainChatGLM 工作流1-3、文档角度的工作流 二、快速上手2-0、硬件要求2-1、环境配置2-2、模型下载2-3、初始化知识库和配置文件2-4、一键启动 三、配置文件详解&#xff08;config目录下&#xff09;…

浏览器输入域名执行全过程?

当你在浏览器中输入www.baidu.com并按下回车键时&#xff0c;会触发一系列复杂的过程才能在你的屏幕上显示出百度的首页。以下是这一过程的详细步骤&#xff1a; 1. 解析域名 首先&#xff0c;浏览器需要解析你输入的域名www.baidu.com。这个过程称为DNS查询。 浏览器缓存&a…

MybatisPlus实现数据权限隔离

引言 Mybatis Plus对Mybatis做了无侵入的增强&#xff0c;非常的好用&#xff0c;今天就给大家介绍它的其中一个实用功能&#xff1a;数据权限插件。 数据权限插件的应用场景和多租户的动态拦截拼接SQL一样。建议点赞收藏关注&#xff0c;方便以后复习查阅。 依赖 首先导入M…

【Java集合】面试题汇总

Java 集合Java 集合概览1. List, Set, Queue, Map 四者的区别&#xff1f;2. ArrayList 和 Array&#xff08;数组&#xff09;的区别&#xff1f;3. ArrayList 和 Vector 的区别?4. Vector 和 Stack 的区别?&#xff08;了解即可&#xff09;5. ArrayList 可以添加 null 值吗…

【端云一体化开发】云函数本地运行/调试启动失败的两种解决方案

最近本地调试云函数一直出现这个错误&#xff1a;Before launch task execute failed! details:java.lang.lllegalStateException: npm installfailed 这个问题的原因似乎是运行云函数的时候会重新下载 npm 及相关依赖文件&#xff0c;但是 DevEco 的 npm 模块出错导致这个步骤…

智慧园区平台再升级!智慧迭代,服务升级

伴随物联网、人工智能等技术的迅速发展和智能化水平的提高&#xff0c;智慧园区成为了现代区域经济高质量发展的重要组成部分&#xff0c;上承智慧城市的建设&#xff0c;下接智慧运营和管理。智慧园区是一种基于信息技术的智能化管理模式&#xff0c;通过物联网、大数据、人工…

java中常见的几种排序

常见的几种排序整理 冒泡排序选择排序插入排序希尔排序快速排序归并排序堆排序 冒泡排序 思想&#xff1a;对比当前值的下一个值&#xff0c;如果大就交换位置 代码&#xff1a; /*** 冒泡排序*/ public class bubbleSort {public static void main(String[] args) {int[] ar…

【域适应】深度域适应常用的距离度量函数实现

关于 深度域适应中&#xff0c;有一类方法是实现目标域和源域的特征对齐&#xff0c;特征对齐的衡量函数主要包括MMD&#xff0c;MK-MMD&#xff0c;A-distance&#xff0c;CORAL loss&#xff0c; Wasserstein distance等等。本文总结了常用的特征变换对齐的函数定义。 工具 …

初始C++之缺省参数 函数重载 引用

初始C之缺省参数 函数重载 引用& 文章目录 初始C之缺省参数 函数重载 引用&一、缺省参数1.1 缺省参数的定义1.2 缺省参数的分类1.3 注意事项 二、 函数重载2.1 函数重载的定义2.2 参数个数不同2.3 参数类型不同2.4 类型顺序不同2.5 为什么C语言不支持函数重载 三、引用…