LangChain系列教程之数据加载器

2023-08-10 13:41:18 浏览数 (1)

前言

"LangChain 系列" 是一系列全面的文章和教程,探索了 LangChain 库的各种功能和特性。LangChain 是由 SoosWeb3 开发的 Python 库,为自然语言处理(NLP)任务提供了一系列强大的工具和功能。

该系列涵盖了与 NLP 相关的广泛主题,包括数据加载、文本预处理、文本分割、嵌入等等。系列中的每篇文章深入探讨了 LangChain 的特定方面,提供详细的解释、代码示例和实际应用案例。

"LangChain 系列" 的目标是帮助开发人员和数据科学家利用 LangChain 的功能来构建强大且高效的 NLP 应用程序。无论您是 NLP 的新手还是经验丰富的从业者,本系列都提供有价值的见解和指导,以提升您的 NLP 项目。

通过跟随 "LangChain 系列" 中的文章,您将全面了解如何在各种 NLP 任务中使用 LangChain,并发挥您的 NLP 项目的全部潜力。

学习如何使用LangChain文档加载器

介绍

这是我们掌握LangChain的旅程的第三个模块,我们将涵盖使用LangChain进行应用程序开发的第一步:数据加载器的领域。我们将探索它们的作用,检查LangChain框架中提供的各种加载器,并引导您逐步将它们融入到您自己的代码中。

查看系列的前两部分: •设置完美的Python环境以使用LangChain开发[9]。•了解LangChain项目的基本结构。[10]

什么是LangChain中的数据加载器

在这个背景下,"加载器"是一种实用程序或函数,它将数据从特定的格式或来源转换为语言模型可以使用的格式,这里的目标格式称为"文档"。

加载器是机器学习数据预处理流程中的重要组件。在这里,LangChain在幕后完成了繁重的工作,将使您在格式化数据方面省下大量的工作。

数据源可以非常多样化,从各种格式的文件(如CSV、SQL、PDF和图像文件)到来自公共或专有在线服务和数据集(如维基百科、Google Drive或Twitter)的数据。想象一下,如果您不得不设计自定义代码来适应每种遇到的独特数据类型,那将是多么繁琐 - 然而,这只是冰山一角。

[11]LangChain中可用的加载器种类

LangChain中的加载器分为三类:

1.转换加载器:这些加载器将数据从特定格式转换为Document格式,即文本。它们可以处理各种文件类型,包括文本、PowerPoint、图像、HTML、PDF等。该类别中的一些具体加载器包括CSV、SQL、Jupyter Notebook、Pandas DataFrame等。这些加载器使用了Unstructured Python包。2.公共数据集或服务加载器:这些加载器从公共数据集和服务中检索和处理数据。这些加载器不需要特殊的访问权限。它们包括Hacker News、维基百科、YouTube转录等加载器。3.专有数据集或服务加载器:这些加载器与不属于公共领域的数据集和服务一起使用。它们通常需要访问令牌或其他参数才能访问数据。例如,Google Drive、AWS S3、Azure Blob Storage、Google Cloud Storage、Reddit和Twitter的加载器。

在LangChain的文档中,可以找到完整的数据加载器列表[12]。

[13]在LangChain中使用数据加载器

正如我们之前提到的,这是开发基于语言模型的应用程序的第一步;现在,让我们看看如何使用这些加载器。如果您没有从一开始就跟着这个系列,确保返回第1集,了解如何正确设置环境[14]。

请注意,我们在第一集中安装了基本依赖项,但您可能需要安装特定于加载器的依赖项;不用担心,它会有所解释。

在接下来的示例中,我们将使用几个不同的加载器,以便让您有一个好的理解。

[15]PDF加载器

正如显而易见的,这个加载器允许您加载PDF文件。根据您的需求,可以使用不同的专用包来实现不同的选项。让我们用一些代码示例来介绍一下:

在LangChain文档中有一个PDF加载器列表[16]。

[17]一般的PDF使用

如果您使用的是一般的PDF文件,可以使用由PyPDF库提供支持的PDF加载器。PyPDF是一个全面的Python库,专为操作PDF文件而设计。它的功能包括拆分和合并文档、裁剪页面布局和转换PDF文件的结构。LangChain提供了一个基于PyPDF的加载器选项,这将非常适合加载您想要处理的特定PDF文件。

让我们最后来编写一些代码,看看如何使用这个加载器来加载和解析SpaceX CRS-5任务新闻简报[18]!确保激活我们在第1章中创建的新环境,然后将此文件保存在您的项目中。我将创建一个名为pdf_files的新目录。

安装PyPDF库:

代码语言:javascript复制
pip install pypdf

然后创建一个名为main.py的新文件;第一步是导入我们需要的加载器,这将是一个常见的主题;我们可以从langchain.document_loaders中导入任何加载器。你可能会感到惊讶,但是使用LangChain加载和解析PDF文档只需要以下代码就足够了!

代码语言:javascript复制
from langchain.document_loaders import PyPDFLoader

# Use the PyPDFLoader to load and parse the PDF
loader = PyPDFLoader("./pdf_files/SpaceX_NASA_CRS-5_PressKit.pdf")
pages = loader.load_and_split()

现在我们有一个名为pages的列表,其中包含我们解析的文档,太棒了!PyPDFLoader创建了一个列表,其中每个元素都是PDF的一页;每个元素包含两个字段:

page_content,其中包含页面的实际内容。•metadata,这是一个带有source(在这种情况下为NASA文件)和page页码的对象。

将以下打印语句添加到您的代码中,在控制台上显示我们获得了多少页以及第一页的内容:

代码语言:javascript复制
print(len(pages))
print(pages[0])

如果你运行python3 main.py,你应该会得到以下结果:

代码语言:javascript复制
$ python3 main.py
26
page_content='1 n n nSpaceX CRS-5 Mission Press Kit  n n nCONTENTS  n n3 Mission Overview  n7 Mission Timeline  n9 Graphics – Rendezvous, Grapple and Berthing, Departure and Re -Entry  n11 International Space Station Overview  n14 CASIS Payloads  n15 Falcon 9 Overview  n18 Dragon Overview  n20 SpaceX Facilities  n22 SpaceX Overview  n24 SpaceX Leadership  n n nSPACEX MEDIA CONTACT  n nJohn Taylor  nDirector of Communications  n310-363-6703  nmedia@spacex.com   n n nNASA PUBLIC AFFAIRS  CONTACT S  n n n n n  Joshua Buck  nPublic Affairs Officer  nHuman Exploration and Operations  nNASA Headquarters  n202-358-1100  n nStephanie Schierholz  nPublic Affairs Officer  nHuman Exploration and Operations  nNASA Headquarters  n202-358-1100  Michael Curie  nNews Chief  nLaunch Operations  nNASA Kennedy Space Center  n321-867-2468  n nGeorge Diller  nPublic Affairs Officer  nLaunch Operations  nNASA Kennedy Space Center  n321-867-2468  Dan Huot  nPublic Affairs Officer  nInternational Space Station  nNASA Johnson Space Center  n281-483-5111' metadata={'source': './pdf_files/SpaceX_NASA_CRS-5_PressKit.pdf', 'page': 1}

此时,pages列表已准备好传递给文本拆分器了!这难道不是很简单吗?

但是,如果我们有一个完整的包含多个PDF的目录怎么办?

[19]加载PDF目录

别担心,在这种情况下,您可以使用PyPDF目录加载器,它具有相同的原理,但它会加载目录中的每个PDF文件。让我们看看它是如何工作的。下载一些更酷的PDF文件并将其添加到pdf_files目录中;我使用了以下文件:

•FAA咨询通告61-67C[20]•FAA咨询通告35.4-1[21]

咨询通告是飞行员用来学习额外重要知识的文件!

将这些文件放在同一个目录中,然后让我们尝试一下目录加载器。

代码语言:javascript复制
from langchain.document_loaders import PyPDFDirectoryLoader

# Use the PyPDFDirectoryLoader to load and parse the PDFs from a directory
loader = PyPDFDirectoryLoader("./pdf_files/")
docs = loader.load_and_split()

print(len(docs))
print(docs[0])

这次你会看到我们解析了61页,这是所有三个文档的内容。

[22]更多的PDF用例

到目前为止,你已经了解了大致情况;LangChain提供了不同类型的PDF加载器,使用不同的Python包进行支持。例如,如果你需要处理带有数学公式的PDF,你可以使用MathPix加载器[23];MathPix提供了一个API来识别数学符号,可以这样使用。

使用相同的语法导入它,并像使用PyPDF加载器一样使用它:

代码语言:javascript复制
from langchain.document_loaders import MathpixPDFLoader

loader = MathpixPDFLoader("./pdf_files/my_algebra.pdf")
data = loader.load()

PyMuPDF加载器[24]是另一个例子,它与PyPDF执行相同的功能,但速度更快。

在LangChain文档中找到PDF加载器的完整列表[25]。

[26]YouTube加载器

这是我最喜欢的用例之一;它允许你直接从URL中检索和解析YouTube视频的字幕。该加载器使用YouTube API来获取字幕、缩略图和其他数据。正如你可以想象的那样,与LangChain一起使用非常简单;让我们通过解析这个关于早期计算的精彩视频的字幕[27]来尝试一下。

即使你安装了langchain库,你可能仍然需要安装一些额外的包;我建议安装pytube,这样我们可以获取视频的元数据。

代码语言:javascript复制
pip install youtube-transcript-api pytube

请使用以下代码在您的main文件中:

代码语言:javascript复制
from langchain.document_loaders import YoutubeLoader

# 使用add_video_info=True以获取视频元数据;需要pytube库
loader = YoutubeLoader.from_youtube_url("https://www.youtube.com/watch?v=O5nskjZ_GoI", add_video_info=True)
video = loader.load()
print(video)

完成!现在您已经在video变量中获得了视频的转录和视频数据,准备进行下一步处理。这返回的结果类似于PDF加载器:

•一个Document对象,包含以下元素:•page_content:视频的文本转录•metadata:包含有关视频的信息,例如sourcetitledescriptionview_countthumbnail_urlpublish_datelengthauthor。这些元数据可在您的应用程序中使用!

在LangChain文档中了解更多关于YouTube加载器[28]的信息。

正如您所看到的,它们都遵循相同的(简单)原则,但我想再探索另一个加载器,以便您可以全面了解。

Sitemap Loader

Sitemap loader(站点地图加载器)在需要高效地抓取和索引整个网站时非常有用;例如,这对于文档编制来说是一个非常好的用例。

站点地图(Sitemap)是一个文件,您可以在其中提供有关站点的页面、视频和其他文件以及它们之间的关系的信息。搜索引擎如Google会读取该文件以抓取您的网站。我们可以利用这一点来高效地加载和索引整个网站。让我们以Chainstack文档站点地图[29]作为示例(这是我作为开发者倡导者所在的区块链基础设施提供商)。我选择使用此示例是因为它涵盖了我可以用来展示重要功能的所有用例!

首先,您可能需要安装以下用于此加载器的库:

代码语言:javascript复制
pip install lxml bs4

然后让我们导入加载器并抓取站点地图:

代码语言:javascript复制
from langchain.document_loaders.sitemap import SitemapLoader

loader = SitemapLoader(
    "https://docs.chainstack.com/sitemap.xml",
)

documents = loader.load()
print(len(documents))
print(documents[0])

与之前的原理相同,它将遍历站点地图中的每个页面,并将其存储在documents列表中。如果您运行此程序,将抓取整个Chainstack文档[30],这可能是您想要的,但如果您不需要每个页面呢?能否筛选出我们想要的部分呢?猜猜看?LangChain给了我们这个选项。假设我们只想筛选出docs部分,我们可以在加载器构造函数中使用filter_urls参数传入要包含的部分或页面的列表:

代码语言:javascript复制
from langchain.document_loaders.sitemap import SitemapLoader

loader = SitemapLoader(
    "https://docs.chainstack.com/sitemap.xml",
    filter_urls=["https://docs.chainstack.com/docs/"]
)

documents = loader.load()
print(len(documents))
print(documents[0])

运行此代码,您将索引100多个页面,并注意存储在documents变量中的内容与我们之前看到的类似。列表中的对象将具有一个page_content字段,其中包含文本和一些元数据。

因此,通过筛选,我们已经能够仅获取我们想要或需要的页面,但是通过打印第一页,您会注意到文本中有很多噪声;特别是工具还抓取了所有的菜单和导航,这在以后肯定会带来问题。我们该如何解决这个问题呢?站点地图加载器使用了BeautifulSoup4,这是一个流行的Python抓取库,幸运的是,我们可以制作一个自定义的抓取函数并将其包含在加载器中。

我将跳过检查的过程,但是如果您检查Chainstack文档页面中的一个页面,您将看到噪声来自<nav><header>标签,因此让我们使用BeautifulSoup4创建一个函数来解决这个问题:

代码语言:javascript复制
from langchain.document_loaders.sitemap import SitemapLoader
from bs4 import BeautifulSoup

def remove_nav_and_header_elements(content: BeautifulSoup) -> str:
    # Find all 'nav' and 'header' elements in the BeautifulSoup object
    nav_elements = content.find_all('nav')
    header_elements = content.find_all('header')

    # Remove each 'nav' and 'header' element from the BeautifulSoup object
    for element in nav_elements   header_elements:
        element.decompose()

    return str(content.get_text())

loader = SitemapLoader(
    "https://docs.chainstack.com/sitemap.xml",
    filter_urls=["https://docs.chainstack.com/docs/"],
    parsing_function=remove_nav_and_header_elements  
)

documents = loader.load()
print(len(documents))
print(documents[0])

parsing_function参数允许我们传递我们创建的函数名称,并告诉加载器使用该函数而不是默认函数。您会注意到响应更加清晰,这是一种仅获取与我们相关的内容的好方法。

通过这种方式,我们还学会了如何从站点地图中索引整个网站。LangChain提供了许多其他数据加载器,我建议您探索该列表,找到适合您需求的加载器。

在LangChain文档中找到加载器列表[31]。

您会发现它们基本上都遵循我们在本文中探讨的原则。

结论

哇,这是一个很长的文章,但是这为您提供了使用LangChain集合中的任何数据加载器的坚实基础。下一步是了解文本分割器,这是在加载数据之后的下一步。

声明

本文翻译整理自:https://blog.davideai.dev/the-ultimate-langchain-series-data-loaders,感兴趣的请点赞、收藏。

References

[1] 介绍: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-introduction [2] 什么是LangChain中的数据加载器: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-what-are-data-loaders-in-langchain [3] LangChain中可用的加载器类型: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-kind-of-loaders-available-in-langchain [4] 在LangChain中使用数据加载器: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-use-data-loaders-in-langchain [5] PDF加载器: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-pdf-loader [6] YouTube加载器: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-youtube-loader [7] Sitemap加载器: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-sitemap-loader [8] 结论: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-conclusion [9] 设置完美的Python环境以使用LangChain开发: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-environment-setup [10] 了解LangChain项目的基本结构。: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-projects-structure [11] Permalink: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-kind-of-loaders-available-in-langchain [12] 完整的数据加载器列表: https://python.langchain.com/en/latest/modules/indexes/document_loaders.html [13] Permalink: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-use-data-loaders-in-langchain [14] 设置环境: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-environment-setup [15] Permalink: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-pdf-loader [16] PDF加载器列表: https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/pdf.html#using-unstructured [17] Permalink: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-general-pfd-use [18] SpaceX CRS-5任务新闻简报: https://www.nasa.gov/sites/default/files/files/SpaceX_NASA_CRS-5_PressKit.pdf [19] Permalink: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-load-a-pdf-directory [20] FAA咨询通告61-67C: https://www.faa.gov/documentLibrary/media/Advisory_Circular/AC_61-67C.pdf [21] FAA咨询通告35.4-1: https://www.faa.gov/documentLibrary/media/Advisory_Circular/AC_35_4-1.pdf [22] Permalink: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-more-pdf-use-cases [23] MathPix加载器: https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/pdf.html#using-mathpix [24] PyMuPDF加载器: https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/pdf.html#using-pymupdf [25] PDF加载器的完整列表: https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/pdf.html [26] Permalink: https://soosweb3.hashnode.dev/the-ultimate-langchain-series-data-loaders#heading-youtube-loader [27] 视频的字幕: https://www.youtube.com/watch?v=O5nskjZ_GoI [28] YouTube加载器: https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/youtube_transcript.html#youtube-transcripts [29] Chainstack文档站点地图: https://docs.chainstack.com/sitemap.xml [30] Chainstack文档: https://docs.chainstack.com/docs [31] 加载器列表: https://python.langchain.com/en/latest/modules/indexes/document_loaders.html

0 人点赞