链载Ai

标题: 快速掌握 langchain 文档加载器 [打印本页]

作者: 链载Ai    时间: 昨天 09:47
标题: 快速掌握 langchain 文档加载器

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 2em auto 1em;padding-right: 1em;padding-left: 1em;border-bottom: 2px solid rgb(15, 76, 129);color: rgb(63, 63, 63);">document loaders 文本加载器

使用文档加载器将源中的数据加载为Document,Document是一段文本和关联的元数据。例如,有用于加载简单.txt文件、加载任何网页的文本内容,甚至用于加载 YouTube 视频的转录的文档加载器。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">文档加载器提供了加载方法,用于从配置的源中将数据作为文档加载器。他们还可以选择实现“延迟加载”, 以延迟将数据加载到内存中。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 4em auto 2em;padding-right: 0.2em;padding-left: 0.2em;background: rgb(15, 76, 129);color: rgb(255, 255, 255);">加载txt文档

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">fromlangchain_community.document_loadersimportTextLoader

loader=TextLoader("./index.md")
loader.load()

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">response:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">[
Document(page_content='---\nsidebar_position:0\n---\n#Documentloaders\n\nUsedocumentloaderstoloaddatafromasourceas`Document`\'s.A`Document`isapieceoftext\nandassociatedmetadata.Forexample,therearedocumentloadersforloadingasimple`.txt`file,forloadingthetext\ncontentsofanywebpage,orevenforloadingatranscriptofaYouTubevideo.\n\nEverydocumentloaderexposestwomethods:\n1."Load":loaddocumentsfromtheconfiguredsource\n2."Loadandsplit":loaddocumentsfromtheconfiguredsourceandsplitthemusingthepassedintextsplitter\n\nTheyoptionallyimplement:\n\n3."Lazyload":loaddocumentsintomemorylazily\n',metadata={'source':'../docs/docs/modules/data_connection/document_loaders/index.md'})
]

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 4em auto 2em;padding-right: 0.2em;padding-left: 0.2em;background: rgb(15, 76, 129);color: rgb(255, 255, 255);">CSV

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">逗号分隔值 (CSV) 文件是使用逗号分隔值的分隔文本文件。文件的每一行都是一条数据记录。每条记录由一个或多个字段组成,用逗号分隔。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 4em auto 2em;padding-right: 0.2em;padding-left: 0.2em;background: rgb(15, 76, 129);color: rgb(255, 255, 255);">加载每个文档一行的 CSV 数据

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">fromlangchain_community.document_loaders.csv_loaderimportCSVLoader

loader=CSVLoader(file_path='./example_data/mlb_teams_2012.csv')
data=loader.load()

Response:

print(data)
[Document(page_content='Team:Nationals\n"Payroll(millions)":81.34\n"Wins":98',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':0},lookup_index=0),Document(page_content='Team:Reds\n"Payroll(millions)":82.20\n"Wins":97',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':1},lookup_index=0),Document(page_content='Team:Yankees\n"Payroll(millions)":197.96\n"Wins":95',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':2},lookup_index=0),Document(page_content='Team:Giants\n"Payroll(millions)":117.62\n"Wins":94',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':3},lookup_index=0),Document(page_content='Team:Braves\n"Payroll(millions)":83.31\n"Wins":94',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':4},lookup_index=0),Document(page_content='Team:Athletics\n"Payroll(millions)":55.37\n"Wins":94',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':5},lookup_index=0),Document(page_content='Team:Rangers\n"Payroll(millions)":120.51\n"Wins":93',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':6},lookup_index=0),Document(page_content='Team:Orioles\n"Payroll(millions)":81.43\n"Wins":93',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':7},lookup_index=0),Document(page_content='Team:Rays\n"Payroll(millions)":64.17\n"Wins":90',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':8},lookup_index=0),Document(page_content='Team:Angels\n"Payroll(millions)":154.49\n"Wins":89',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':9},lookup_index=0),Document(page_content='Team:Tigers\n"Payroll(millions)":132.30\n"Wins":88',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':10},lookup_index=0),Document(page_content='Team:Cardinals\n"Payroll(millions)":110.30\n"Wins":88',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':11},lookup_index=0),Document(page_content='Teamodgers\n"Payroll(millions)":95.14\n"Wins":86',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':12},lookup_index=0),Document(page_content='Team:WhiteSox\n"Payroll(millions)":96.92\n"Wins":85',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':13},lookup_index=0),Document(page_content='Team:Brewers\n"Payroll(millions)":97.65\n"Wins":83',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':14},lookup_index=0),Document(page_content='Teamhillies\n"Payroll(millions)":174.54\n"Wins":81',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':15},lookup_index=0),Document(page_content='Teamiamondbacks\n"Payroll(millions)":74.28\n"Wins":81',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':16},lookup_index=0),Document(page_content='Teamirates\n"Payroll(millions)":63.43\n"Wins":79',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':17},lookup_index=0),Document(page_content='Teamadres\n"Payroll(millions)":55.24\n"Wins":76',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':18},lookup_index=0),Document(page_content='Team:Mariners\n"Payroll(millions)":81.97\n"Wins":75',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':19},lookup_index=0),Document(page_content='Team:Mets\n"Payroll(millions)":93.35\n"Wins":74',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':20},lookup_index=0),Document(page_content='Team:BlueJays\n"Payroll(millions)":75.48\n"Wins":73',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':21},lookup_index=0),Document(page_content='Team:Royals\n"Payroll(millions)":60.91\n"Wins":72',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':22},lookup_index=0),Document(page_content='Team:Marlins\n"Payroll(millions)":118.07\n"Wins":69',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':23},lookup_index=0),Document(page_content='Team:RedSox\n"Payroll(millions)":173.18\n"Wins":69',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':24},lookup_index=0),Document(page_content='Team:Indians\n"Payroll(millions)":78.43\n"Wins":68',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':25},lookup_index=0),Document(page_content='Team:Twins\n"Payroll(millions)":94.08\n"Wins":66',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':26},lookup_index=0),Document(page_content='Team:Rockies\n"Payroll(millions)":78.06\n"Wins":64',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':27},lookup_index=0),Document(page_content='Team:Cubs\n"Payroll(millions)":88.19\n"Wins":61',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':28},lookup_index=0),Document(page_content='Team:Astros\n"Payroll(millions)":60.65\n"Wins":55',lookup_str='',metadata={'source':'./example_data/mlb_teams_2012.csv','row':29},lookup_index=0)]

自定义 CSV 解析和加载

有关支持哪些 csv 参数的更多信息,请参阅 csv 模块文档

loader=CSVLoader(file_path='./example_data/mlb_teams_2012.csv',csv_args={
'delimiter':',',
'quotechar':'"',
'fieldnames':['MLBTeam','Payrollinmillions','Wins']
})
data=loader.load()

指定用于标识文档源的列

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

当使用从 CSV 文件加载的文档时,这很有用,因为链使用源来回答问题。

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

文件目录加载器

DirectoryLoader加载目录中的所有文档

fromlangchain_community.document_loadersimportDirectoryLoader
loader=DirectoryLoader('../',glob="**/*.md")
docs=loader.load()

我们可以使用该glob参数来控制要加载的文件。请注意,这里它不会加载.rst文件或.html文件。

显示加载进度条

默认情况下,不会显示文档加载的进度,如果要显示文档加载的进度条,需要安装tqdmpip install tqdm,并将show_progress参数设置为True

loader=DirectoryLoader('../',glob='**/*.md',show_progress=True)
docs=loader.load()
Requirementalreadysatisfied:tqdmin/Users/jon/.pyenv/versions/3.9.16/envs/microbiome-app/lib/python3.9/site-packages(4.65.0)


0it[00:00,?it/s]

使用多线程加载文档

默认情况下,加载文档是单线程的,我们可以使用多线程加载文档提升文档的加载速度,为了利用多线程,我们可以设置use_multithreading=True来使用多线程加载器。

loader=DirectoryLoader('../',glob="**/*.md",use_multithreading=True)
docs=loader.load()

更改加载程序类

默认情况下会加载器使用UnstructuredLoader类,但是我们也可以很轻松的修改文档加载器的类型.

fromlangchain_community.document_loadersimportTextLoader
loader=DirectoryLoader('../',glob='**/*.md',loader_cls=TextLoader)
docs=loader.load()

如果需要加载Python代码,我们使用PythonLoader

fromlangchain_community.document_loadersimportPythonLoader
loader=DirectoryLoader('../../../../../',glob="**/*.py",loader_cls=PythonLoader)
docs=loader.load()

文件编码

如果我们加载的目录中文档有多种不同的编码方式,我们在执行load()函数的时候回失败,并显示一条有用的消息,指示哪个文件example-non-utf8.txt解码失败。

在默认情况下TextLoader,任何未能加载任何文档都将使整个加载过程失败,并且不会加载任何文档。如果要解决部分失败的情况,我们可以使用一下方法:

1、可以将参数silent_errors传递DirectoryLoader,跳过无法加载的文档,并继续执行加载过程。

loader=DirectoryLoader(path,glob="**/*.txt",loader_cls=TextLoader,silent_errors=True)
docs=loader.load()

2、我们可以配置文档加载器自动检测编码

我们还可以通过将autodetect_encoding传递给加载器类来要求TextLoader在失败之前自动检测文件编码。

text_loader_kwargs={'autodetect_encoding':True}
loader=DirectoryLoader(path,glob="**/*.txt",loader_cls=TextLoader,loader_kwargs=text_loader_kwargs)
docs=loader.load()

HTML loader

我们可以按以下方式去加载一个HTML网页文档

fromlangchain_community.document_loadersimportUnstructuredHTMLLoader
loader=UnstructuredHTMLLoader("example_data/fake-content.html")
data=loader.load()

使用 BeautifulSoup4 加载 HTML

我们还可以使用BeautifulSoup4BSHTMLLoader.这会将 HTML 中的文本提取到page_content中,并将页面标题提取为titlemetadata

fromlangchain_community.document_loadersimportBSHTMLLoader
loader=BSHTMLLoader("example_data/fake-content.html")
data=loader.load()

JSON格式

文档连接:https://python.langchain.com/docs/modules/data_connection/document_loaders/json

JSON(JavaScript 对象表示法)是一种开放的标准文件格式和数据交换格式,它使用人类可读的文本来存储和传输由属性值对和数组(或其他可序列化值)组成的数据对象。JSON 行是一种文件格式,其中每行都是一个有效的 JSON 值。

JSONLoader使用指定的 jq 模式来解析 JSON 文件。它使用jqpython 包。

#!pipinstalljq
fromlangchain_community.document_loadersimportJSONLoader
importjson
frompathlibimportPath
frompprintimportpprint

file_path='./example_data/facebook_chat.json'
data=json.loads(Path(file_path).read_text())

如果我们需要提取json数据中某个字段的数据,可以通过下面的示例轻松提取,JSONLoader

loader=JSONLoader(
file_path='',
file_path='./example_data/facebook_chat.json',
jq_schema='.messages[].content',
text_content=False,
)
data=loader.load()

JSON 行文件

如果要从 JSON 行文件加载文档,请传递json_lines=True并指定jq_schemapage_content从单个 JSON 对象中提取。

file_path='./example_data/facebook_chat_messages.jsonl'
pprint(Path(file_path).read_text())
loader=JSONLoader(
file_path='./example_data/facebook_chat_messages.jsonl',
jq_schema='.content',
text_content=False,
json_lines=True)

data=loader.load()

设置jq_schema='.'另一个选项并提供content_key

loader=JSONLoader(
file_path='./example_data/facebook_chat_messages.jsonl',
jq_schema='.',
content_key='sender_name',
json_lines=True)

data=loader.load()

JSON 中提取元数据

通常,我们希望将JSON文件中可用的元数据包含在我们从内容创建的文档中,

加载Markdown

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

#!pipinstallunstructured>/dev/null
fromlangchain_community.document_loadersimportUnstructuredMarkdownLoader
markdown_path="../../../../../README.md"
loader=UnstructuredMarkdownLoader(markdown_path)
data=loader.load()

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

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

加载PDF

文档:https://python.langchain.com/docs/modules/data_connection/document_loaders/pdf

使用 PyPDF

使用pypdf将 PDF 加载到文档数组中,其中每个文档都包含页面内容和带有page编号的元数据。

pipinstallpypdf
fromlangchain_community.document_loadersimportPyPDFLoader

loader=PyPDFLoader("example_data/layout-parser-paper.pdf")
pages=loader.load_and_split()

这种方法的一个优点是可以使用页码检索文档。

我们想要使用OpenAIEmbeddings,所以我们必须获得 OpenAI API 密钥。

importos
importgetpass

os.environ['OPENAI_API_KEY']=getpass.getpass('OpenAIAPIKey:')
fromlangchain_community.vectorstoresimportFAISS
fromlangchain_openaiimportOpenAIEmbeddings

faiss_index=FAISS.from_documents(pages,OpenAIEmbeddings())
docs=faiss_index.similarity_search("Howwillthecommunitybeengaged?",k=2)
fordocindocs:
print(str(doc.metadata["page"])+":",doc.page_content[:300])

提取PDF中的图像

使用该rapidocr-onnxruntime包,我们也可以将图像提取为文本:

pipinstallrapidocr-onnxruntime
loader=PyPDFLoader("https://arxiv.org/pdf/2103.15348.pdf",extract_images=True)
pages=loader.load()
pages[4].page_content

使用MathPix

fromlangchain_community.document_loadersimportMathpixPDFLoader
loader=MathpixPDFLoader("example_data/layout-parser-paper.pdf")
data=loader.load()

使用非结构化

fromlangchain_community.document_loadersimportUnstructuredPDFLoader
loader=UnstructuredPDFLoader("example_data/layout-parser-paper.pdf")
data=loader.load()

保留元素

UnstructuredPDFLoader为不同的文本块创建不同的“元素“,默认情况下,我们将这些组合在一起,但您可以通过指定mode="elements"来轻松保持这种分离。

loader=UnstructuredPDFLoader("example_data/layout-parser-paper.pdf",mode="elements")
data=loader.load()

使用非结构化方式获取远程 PDF

很多时候我们需要读取远程网络的pdf文件并解析以加载到我们下游使用的文档格式,所有其他 PDF 加载器也可用于获取远程 PDF,但这是OnlinePDFLoader旧功能,专门用于UnstructuredPDFLoader. // todo

fromlangchain_community.document_loadersimportOnlinePDFLoader
loader=OnlinePDFLoader("https://arxiv.org/pdf/2302.03803.pdf")
data=loader.load()

使用 PyPDFium2

fromlangchain_community.document_loadersimportPyPDFium2Loader
loader=PyPDFium2Loader("example_data/layout-parser-paper.pdf")
data=loader.load()

使用 PDFMiner

fromlangchain_community.document_loadersimportPDFMinerLoader
loader=PDFMinerLoader("example_data/layout-parser-paper.pdf")
data=loader.load()

使用 PDFMiner 生成 HTML 文本

使用 PDFMiner 生成 HTML 文本有助于在语义上将文本分块。可以通过解析输出html内容BeautifulSoup来获取有关字体大小、页码、PDF 页眉/页脚等的更结构化和丰富的信息。

fromlangchain_community.document_loadersimportPDFMinerPDFasHTMLLoader
loader=PDFMinerPDFasHTMLLoader("example_data/layout-parser-paper.pdf")
data=loader.load()[0]#entirePDFisloadedasasingleDocument
frombs4importBeautifulSoup
soup=BeautifulSoup(data.page_content,'html.parser')
content=soup.find_all('div')






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5