LangChain-RAG学习之 文档加载器

目录

一、实现原理

二、文档加载器的选择

(一).PDF

加载本地文件

可能需要的环境配置

(二).CSV

[1、使用每个文档一行的 CSV 数据加载 CSVLoader](#1、使用每个文档一行的 CSV 数据加载 CSVLoader)

[2、自定义 csv 解析和加载 (csv_args](#2、自定义 csv 解析和加载 (csv_args)

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

[(三)、文件目录 file_directory](#(三)、文件目录 file_directory)

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

[2、显示进度条 (tqdm,show_progress](#2、显示进度条 (tqdm,show_progress)

[3、使用多线程 (use_multithreading](#3、使用多线程 (use_multithreading)

4、更改加载器类(loader_cls

(四)、HTML

[1、加载 html (UnstructuredHTMLLoader](#1、加载 html (UnstructuredHTMLLoader)

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

(五)、JSON

[1、使用 json 加载数据](#1、使用 json 加载数据)

[2、使用 JSONLoader](#2、使用 JSONLoader)

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

[(六)、Markdown ( UnstructuredMarkdownLoader](#(六)、Markdown ( UnstructuredMarkdownLoader)

[保留元素(Retain Elements)](#保留元素(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 PyPDFLoader

loader = 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 OnlinePDFLoader

loader = 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 CSVLoader

loader = 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 TextLoader

loader = 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 pprint

from langchain.document_loaders import JSONLoader

file_path='./facebook_chat.json'
data = json.loads(Path(file_path).read_text())
2、使用 JSONLoader

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

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

pip install jq


loader = 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博客

相关推荐
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
infiniteWei2 小时前
【Lucene】原理学习路线
学习·搜索引擎·全文检索·lucene
follycat2 小时前
[极客大挑战 2019]PHP 1
开发语言·学习·网络安全·php
并不会6 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
龙鸣丿6 小时前
Linux基础学习笔记
linux·笔记·学习
Nu11PointerException8 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
@小博的博客12 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生12 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步13 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope13 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习