LangChain-RAG学习之 文档加载器

server/2024/10/21 4:16:30/

目录

一、实现原理

二、文档加载器的选择 

(一).PDF

 加载本地文件

可能需要的环境配置

(二).CSV

1、使用每个文档一行的 CSV 数据加载 CSVLoader

2、自定义 csv 解析和加载 (csv_args

3、指定用于 标识文档来源的 列(source_column

(三)、文件目录 file_directory

1、加载文件目录数据(DirectoryLoader

2、显示进度条 (tqdm,show_progress

3、使用多线程 (use_multithreading

4、更改加载器类(loader_cls

(四)、HTML

1、加载 html (UnstructuredHTMLLoader

2、使用 BeautifulSoup4 加载 HTML (BSHTMLLoader我们还可以使用 BeautifulSoup4 使用 BSHTMLLoader 加载 HTML 文档。这将提取 HTML 中的文本到 page_content,并将页面标题作为 metadata 的 title。

(五)、JSON

1、使用 json 加载数据 

2、使用 JSONLoader

3、提取元数据 (Extracting metadata)通常,我们希望将 JSON 文件中的元数据包含到从内容创建的文档中。

(六)、Markdown ( UnstructuredMarkdownLoader

保留元素(Retain Elements)


 

一、实现原理

(1) 上传文档:用户上传包含知识的文档,支持 txt、pdf、docx 等格式,LangChain Chatchat 会将文档转换为 Markdown 格式

(2) 文本切割:为了便于分析和处理,将长文本切割为小块(chunk)

(3) 文本向量化:将切割的 chunk 通过 embedding 技术,转换为算法可以处理的向量,存入向量数据库

(4) 问句向量化:用户提问后,同样将用户的问句向量化

(5) 语义检索匹配:将用户的问句与向量数据库中的 chunk 匹配,匹配出与问句向量最相似的 top k 个

(6) 提交 prompt 至 LLM:将匹配出的文本和问句,一起添加到配置好的 prompt 模板中,提交给 LLM

(7) 生成回答:LLM 生成回答,返回给用户

二、文档加载器的选择 

LangChain封装了一系列类型的文档加载模块,例如PDF、CSV、HTML、JSON、Markdown、File Directory等。下面以PDF文件夹在为例看一下用法,其它类型的文档加载的用法都类似。

(一).PDF

 加载本地文件

LangChain加载PDF文件使用的是pypdf,先安装:

pip install pypdf
from langchain_community.document_loaders import PyPDFLoaderloader = PyPDFLoader("知识问答.pdf")
pages = loader.load_and_split()print(f"第0页:\n{pages[0]}") ## 也可通过 pages[0].page_content只获取本页内容

加载在线PDF文件 

可能需要的环境配置

在开始之前,你可能需要安装以下的Python包:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple unstructured
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pdf2image
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple unstructured-inference
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pikepdf

除了Python包,还需要下载 nltk_data,这东西非常大,下载起来非常慢。所以们可以事先下好,放到固定的位置。


下载地址:https://github.com/nltk/nltk_data/tree/gh-pages
下载完后,将其中的packages文件夹内的全部内容拷贝到固定位置,例如上面的
原文链接:https://blog.csdn.net/Attitude93/article/details/135996698

from langchain_community.document_loaders import OnlinePDFLoaderloader = OnlinePDFLoader("https://arxiv.org/pdf/2302.03803.pdf")
data = loader.load()
print(data)

(二).CSV

逗号分隔值(CSV) 文件是一种使用逗号分隔值的定界文本文件。
文件的每一行是一个数据记录;每个记录由一个或多个字段组成,字段之间用逗号分隔。


1、使用每个文档一行的 CSV 数据加载 CSVLoader
from langchain.document_loaders.csv_loader import CSVLoaderloader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
data = loader.load()
2、自定义 csv 解析和加载 (csv_args

参见 csv 模块 文档,了解支持的 csv 参数的更多信息。

loader = CSVLoader(file_path='./mlb_teams_2012.csv', csv_args={'delimiter': ',','quotechar': '"','fieldnames': ['MLB Team', 'Payroll in millions', 'Wins']})data = loader.load()
3、指定用于 标识文档来源的 列(source_column

使用 source_column 参数指定从每一行创建的文档的来源。
否则,file_path 将作为从 CSV 文件创建的所有文档的来源。

在使用基于来源回答问题的链时,这非常有用。

loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv',source_column="Team")data = loader.load()

(三)、文件目录 file_directory

这里介绍了如何加载目录中的所有文档。

在底层,默认情况下使用 UnstructuredLoader

我们可以使用 glob 参数来控制要加载的文件。

请注意,这里不加载 .rst 文件或 .html文件。


1、加载文件目录数据(DirectoryLoader
from langchain.document_loaders import DirectoryLoader
loader = DirectoryLoader('../', glob="**/*.md")
docs = loader.load()
len(docs) # -> 1

 

2、显示进度条 (tqdm,show_progress

默认情况下,不会显示进度条。
要显示进度条,请安装 tqdm 库(如 pip install tqdm),并将 show_progress 参数设置为 True

loader = DirectoryLoader('../', glob="**/*.md", show_progress=True)
docs = loader.load()
3、使用多线程 (use_multithreading

默认情况下,加载操作在 一个线程 中进行。
为了利用多个线程,将 use_multithreading标志设置为 True。

loader = DirectoryLoader('../', glob="**/*.md", use_multithreading=True)
docs = loader.load() 
4、更改加载器类(loader_cls

默认情况下使用 UnstructuredLoader 类。但是,您可以相当容易地 更改加载器的类型。

from langchain.document_loaders import TextLoaderloader = DirectoryLoader('../', glob="**/*.md", loader_cls=TextLoader)docs = loader.load()
len(docs)
# -> 1

 

(四)、HTML

超文本标记语言或 HTML 是用于在 Web 浏览器中显示的文档的标准标记语言。

1、加载 html (UnstructuredHTMLLoader

这部分介绍如何将 HTML 文档加载到 我们可以在下游使用的文档格式中。

from langchain.document_loaders import UnstructuredHTMLLoader
loader = UnstructuredHTMLLoader("example_data/fake-content.html")
data = loader.load()
2、使用 BeautifulSoup4 加载 HTML (BSHTMLLoader
我们还可以使用 BeautifulSoup4 使用 BSHTMLLoader 加载 HTML 文档。
这将提取 HTML 中的文本到 page_content,并将页面标题作为 metadata 的 title。
 
from langchain.document_loaders import BSHTMLLoader
loader = BSHTMLLoader("example_data/fake-content.html")
data = loader.load()

(五)、JSON

JSON (JavaScript Object Notation) 是一种开放标准的文件格式和数据交换格式,存储和传输方便,且可读。

JSON 对象由属性 key - 值 value 对和数组(或其他可序列化值)组成的数据对象。

1、使用 json 加载数据 
import json
from pathlib import Path
from pprint import pprintfrom langchain.document_loaders import JSONLoaderfile_path='./facebook_chat.json'
data = json.loads(Path(file_path).read_text())

 

2、使用 JSONLoader

JSONLoader 使用指定的 jq schema 来解析 JSON 文件。

它使用 jq python 包。 查看这个 手册 来详细了解 jq 语法。

pip install jqloader = JSONLoader(file_path='./facebook_chat.json',jq_schema='.messages[].content')data = loader.load()

 

3、提取元数据 (Extracting metadata)
通常,我们希望将 JSON 文件中的元数据包含到从内容创建的文档中。

下面演示了如何使用 JSONLoader 提取元数据。

需要注意一些关键的更改。在前一个示例中,我们没有收集元数据,在模式中直接指定了 page_content 的值的提取位置。

(六)、Markdown ( UnstructuredMarkdownLoader

Markdown 是一种轻量级标记语言,用于使用纯文本编辑器创建格式化文本。

这部分内容介绍了如何将 Markdown 文档 加载到我们可以在应用程序中 要使用的文档格式中。

! pip install unstructured > /dev/null

 

from langchain.document_loaders import UnstructuredMarkdownLoader
markdown_path = "../../../../../README.md"
loader = UnstructuredMarkdownLoader(markdown_path)
data = loader.load()

 

保留元素(Retain Elements)

在底层,Unstructured 为不同的文本块创建不同的“元素”。
默认情况下,我们将它们组合在一起,但通过指定 mode="elements" 可以轻松保留该分离。

loader = UnstructuredMarkdownLoader(markdown_path, mode="elements")
data = loader.load()

更多方法可以阅读此篇文章 LangChain - 文档加载_langchain自带页面来源文档展示部分-CSDN博客


http://www.ppmy.cn/server/35056.html

相关文章

18.Blender 渲染工程、打光方法及HDR贴图导入

HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角,点击箭头,展开详细部分 点击材质球,会出现下面一列材质球,将鼠标拖到第二个材质球,会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…

(06)vite与ts的结合

文章目录 系列全集package.json在根目录创建 tsconfig.json 文件在根目录创建 vite.config.ts 文件index.html额外的类型声明 系列全集 (01)vite 从启动服务器开始 (02)vite环境变量配置 (03)vite 处理 c…

Linux搭建mysql环境

搭建 MySQL 环境 1、使用 wget 下载安装包,下载到 opt 目录中 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2、安装 MySQL 公钥 rpm -i mysql57-community-release-el7-10.noarch.rpmrpm --import https://repo.mysql.com/RPM-GP…

Nvme协议第三章 Controller Registers

控制器寄存器位于MLBAR/MUBAR寄存器(PCI BAR0和BAR1)中,该寄存器应映射到支持有序访问和可变访问宽度的内存空间。host主机通过访问虚拟内存的方式访问该部分寄存器。 注:访问过程只能一次访问一个寄存器,不能多个访问…

安卓第三方app调用system/lib库报错的问题

报错如下 04-29 13:45:13.787 2339 2339 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libxxxx.so" needed or dlopened by "/apex/com.android.art/lib/libnativeloader.so" is not accessible for the nam…

第3章 WebServer重构

3.1 重构原生Web服务框架 3.1.1 分析原生Web服务框架 在服务端代码的 ClientHandler 中,请求解析、处理请求、返回响应的代码混杂在一起,这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性,我们需要对这些代码…

8、基本数据类型转换(自动转换和强制转换)

基本类型转换 1、自动类型转换2、强制类型转换 1、自动类型转换 定义:当Java程序在进行赋值或者运算时,精度小的类型会自动转换成精度大的数据类型,这个就是自动类型转换。(自动小转大) 背多芬: 这里要明…

云原生周刊:Terraform 1.8 发布 | 2024.5.6

开源项目推荐 xlskubectl 用于控制 Kubernetes 集群的电子表格。xlskubectl 将 Google Spreadsheet 与 Kubernetes 集成。你可以通过用于跟踪费用的同一电子表格来管理集群。 git-sync git-sync 是一个简单的命令,它将 git 存储库拉入本地目录,等待一…