langchain txt 文档加载,分割

news2024/11/29 7:59:22

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 summary


res = refine_loop(chunks[:4])
print(res)

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

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

相关文章

未来课堂革命:OpenAI 发布 ChatGPT 使用指南,探索生成式 AI 如何重塑教育景观

随着新学期的来临,众多初登教师舞台的 00 后们,也完成了他们的第一个教师身份下的暑期生活。 对于开学的抵触情绪,不仅学生们普遍存在,许多 00 后的新晋教师们也同样感同身受。某种程度上,这些抗拒上班的年轻教师群体…

编译原理 学习笔记

1、代码: (1 2) * 3 2、词法解析: 3、抽象语法树: 4、语法树递归下降求值: 先Current_Node是根节点乘号,乘号,是中缀运算符,找左子节点,是加号,加号是中缀表达式&…

生产问题排查指南:从定位到解决

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 一、引言 二、 观察和定位问题 监控系统 日志分析 用户反馈 其他观察方式 注意事项…

共享低碳未来!科士达新一代工商业储能产品引爆ESIE 2024

4月11日,第十二届储能国际峰会暨展览会(ESIE 2024)在北京首钢会展中心盛大开幕,科士达以“数智光储,共享低碳未来”为主题,携多款工商业储能产品及解决方案惊艳亮相本次盛会。 展会首日,科士达展…

C语言——实践小游戏(贪吃蛇)代码版

大家好久不见,我是残念我回来了,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客&#x…

196算法之谜在 JSP 中使用内置对象 request 获取 form 表单的文本框 text 提交的数据。

(1)编写 inputNumber . jsp ,该页面提供一个 form 表单,该 form 表单提供一个文本框 text ,用于用户输入一个正整数,用户在 form 表单中输入的数字,单击 submit 提交键将正整数提交给 huiwenNumber . jsp 页…

基于JSP+Mysql+HTml+Css仓库出入库管理系统设计与实现

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

Leetcode二十二题:合并K个升序链表【22/1000 python】

“合并K个升序链表”,这是一道中等难度的题目,经常出现在编程面试中。以下是该问题的详细描述、解题步骤、不同算法的比较、代码示例及其分析。 问题描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中…

BUCK 电路详解

参考内容: 手撕Buck!Buck公式推导过程 电力电子的基础应用 《精通开关电源设计(第二版)》 Buck电源芯片输出有问题?检查这几样 原来PWM这么简单! BUCK 电路构建 根据高中所学习的物理知识可以很容易的想到…

Harmony鸿蒙南向驱动开发-MIPI CSI接口使用

功能简介 CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。 物理层支持HS(High …

18_SPI通信外设

SPI通信外设 SPI通信外设SPI外设简介SPI框图SPI基本结构主模式全双工连续传输非连续传输 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

蓝桥杯备考day4

1.1 二分查找模板 bool check(int x) {// 进行某些操作 } // 二分查找函数 int binarySearch() {int l 1, r n; // 初始化左右边界while (r - l > 1) // 当右边界与左边界相差大于1时{int mid (l r) >> 1; // 取中间位置if (check(mid)) // 如果满足条件r mid; …

[目标检测] OCR: 文字检测、文字识别、text spotter

概述 OCR技术存在两个步骤:文字检测和文字识别,而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像,主要由合成图像,产品描述,网络广告(淘宝)MS…

AcWing-直方图中最大的矩形

131. 直方图中最大的矩形 - AcWing题库 所需知识:单调栈 思路:要求最大矩形,所以需要使矩形的高与长的乘积最大即可,依次从左到右将每一列当作中心列,向两边扩散,直到两边的高都小于该列的高,…

Prj文件的几种制作方式

0.序: 多数平面坐标的设计成果,不论是CAD文件,还是BIM模型,还是投影单独存储的tif影像,还是国土部门申请的平面坐标的文本文件,要想和底图叠加,都需要通过正确的投影匹配起来。 多数软件都提供…

解决源 “MySQL 8.0 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

源 “MySQL 8.0 Community Server” 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。 失败的软件包是:mysql-community-server-8.0.31-1.el7.x86_64 GPG 密钥配置为:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql…

8. 托盘图标与菜单

内容概要: 托盘图标的设置与事件 右键菜单的相关操作 窗口组件: 1.组件的属性 组件属性:位置 组件属性:可视 2.组件的事件 窗口_托盘事件-带有参数的事件的使用方法 3.组件的方法 置托盘图标 菜单的操作 1.创建菜单 …

模型训练----apex库报错IndexError: tuple index out of range

问题描述 在训练模型的过程中遇到了apex库的报错IndexError: tuple index out of range导致无法训练。在github查询后找到了解决方法 问题解决 需要修改/apex-master/apex/amp/utils.py这个文件的代码 从93行开始修改 if x in cache:cached_x cache[x]next_functions_ava…

nvm更新node版本

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