前言
"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
库:
pip install pypdf
然后创建一个名为main.py
的新文件;第一步是导入我们需要的加载器,这将是一个常见的主题;我们可以从langchain.document_loaders
中导入任何加载器。你可能会感到惊讶,但是使用LangChain加载和解析PDF文档只需要以下代码就足够了!
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
,你应该会得到以下结果:
$ 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
,这样我们可以获取视频的元数据。
pip install youtube-transcript-api pytube
请使用以下代码在您的main
文件中:
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
:包含有关视频的信息,例如source
、title
、description
、view_count
、thumbnail_url
、publish_date
、length
和author
。这些元数据可在您的应用程序中使用!
在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
参数传入要包含的部分或页面的列表:
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创建一个函数来解决这个问题:
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