【RAG入门教程03】Langchian框架-文档加载


Langchain 使用文档加载器从各种来源获取信息并准备处理。这些加载器充当数据连接器,获取信息并将其转换为 Langchain 可以理解的格式。

LangChain 中有几十个文档加载器,可以在这查看https://python.langchain.com/v0.2/docs/integrations/document_loaders/

但是实际使用过程中,这些解析的效果层次补齐,需要结合自己的文件去写如何加载具体文档。这个也是在后续开发框架的过程中,我们可以选取langchian的document作为处理对象,但是文件解析需要自己去写和实现。

在本章中,我们将介绍其中的一些:

  • TextLoader
  • CSVLoader
  • UnstructuredFileLoader
  • DirectoryLoader
  • UnstructuredHTMLLoader
  • JSONLoader
  • PyPDFLoader
  • ArxivLoader
  • Docx2txtLoader

TextLoader

from langchain_community.document_loaders import TextLoaderloader = TextLoader("text.txt")
loader.load()"""
[Document(page_content='I have some instructions here.\nThis is the second row.', metadata={'source': 'text.txt'})]
"""loader = TextLoader("index.md")
loader.load()"""
[Document(page_content='some instructions\n', metadata={'source': 'index.md'})]
"""

CSVLoader

import pandas as pd# Create a simple DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['New York', 'Los Angeles', 'Chicago']
}
df = pd.DataFrame(data)# Export the DataFrame to a CSV file
csv_file_path = 'sample_data.csv'
df.to_csv(csv_file_path, index=False)
from langchain_community.document_loaders.csv_loader import CSVLoaderloader = CSVLoader(file_path='sample_data.csv')
data = loader.load()data"""
[Document(page_content='Name: Alice\nAge: 25\nCity: New York', metadata={'source': 'sample_data.csv', 'row': 0}),Document(page_content='Name: Bob\nAge: 30\nCity: Los Angeles', metadata={'source': 'sample_data.csv', 'row': 1}),Document(page_content='Name: Charlie\nAge: 35\nCity: Chicago', metadata={'source': 'sample_data.csv', 'row': 2})]
"""

如有必要,我们可以在读取文件时自定义 CSV 参数:

loader = CSVLoader(file_path='sample_data.csv', csv_args={'delimiter': ',','quotechar': '"','fieldnames': ['Name', 'Age', 'City']
})data = loader.load()data # now the headers are also a row.
"""
[Document(page_content='Name: Name\nAge: Age\nCity: City', metadata={'source': 'sample_data.csv', 'row': 0}),Document(page_content='Name: Alice\nAge: 25\nCity: New York', metadata={'source': 'sample_data.csv', 'row': 1}),Document(page_content='Name: Bob\nAge: 30\nCity: Los Angeles', metadata={'source': 'sample_data.csv', 'row': 2}),Document(page_content='Name: Charlie\nAge: 35\nCity: Chicago', metadata={'source': 'sample_data.csv', 'row': 3})]
"""

当从 CSV 文件加载数据时,加载器通常会为 CSV 中的每一行数据创建一个单独的“文档”对象。

默认情况下,每个文档的来源都设置为 CSV 本身的整个文件路径。如果想跟踪 CSV 中每条信息的来源,这可能并不理想。

可以使用 source_column 指定 CSV 文件中的列名。然后,每行特定列中的值将用作从该行创建的相应文档的单独来源

loader = CSVLoader(file_path='sample_data.csv', source_column="Name")data = loader.load()data"""
[Document(page_content='Name: Alice\nAge: 25\nCity: New York', 
metadata={'source': 'Alice', 'row': 0}),Document(page_content='Name: Bob\nAge: 30\nCity: Los Angeles', 
metadata={'source': 'Bob', 'row': 1}),Document(page_content='Name: Charlie\nAge: 35\nCity: Chicago', 
metadata={'source': 'Charlie', 'row': 2})]
"""

这在使用涉及根据信息来源回答问题的“链”(可能是数据处理管道)时特别有用。通过为每个文档提供单独的源信息,这些链可以在处理时考虑数据的来源,并可能提供更细致入微或更可靠的答案。

UnstructuredCSVLoader

CSVLoader 不同,CSVLoader 将每一行视为一个单独的文档,并使用标题定义数据,而在 UnstructuredCSVLoader 中,整个 CSV 文件被视为单个“非结构化表”元素。当您想要将数据作为整个表而不是单个条目进行分析时,这很有用。

from langchain_community.document_loaders.csv_loader import UnstructuredCSVLoaderloader = UnstructuredCSVLoader(file_path="sample_data.csv", mode="elements"
)
docs = loader.load()docs"""
[Document(page_content='\n\n\nName\nAge\nCity\n\n\nAlice\n25\nNew York\n\n\nBob\n30\nLos Angeles\n\n\nCharlie\n35\nChicago\n\n\n', metadata={'source': 'sample_data.csv', 'filename': 'sample_data.csv', 'languages': ['eng'], 'last_modified': '2024-03-04T18:05:41', 'text_as_html': '<table border="1" class="dataframe">\n  <tbody>\n    <tr>\n      <td>Name</td>\n      <td>Age</td>\n      <td>City</td>\n    </tr>\n    <tr>\n      <td>Alice</td>\n      <td>25</td>\n      <td>New York</td>\n    </tr>\n    <tr>\n      <td>Bob</td>\n      <td>30</td>\n      <td>Los Angeles</td>\n    </tr>\n    <tr>\n      <td>Charlie</td>\n      <td>35</td>\n      <td>Chicago</td>\n    </tr>\n  </tbody>\n</table>', 'filetype': 'text/csv', 'category': 'Table'})]
"""

如果在“元素”模式下操作,则表的 HTML 表示将可在元数据中访问。

print(docs[0].metadata["text_as_html"])"""
<table border="1" class="dataframe"><tbody><tr><td>Name</td><td>Age</td><td>City</td></tr><tr><td>Alice</td><td>25</td><td>New York</td></tr><tr><td>Bob</td><td>30</td><td>Los Angeles</td></tr><tr><td>Charlie</td><td>35</td><td>Chicago</td></tr></tbody>
</table>
"""

UnstructuredFileLoader

TextLoader 等专为特定格式设计的加载器不同,UnstructuredFileLoader会自动检测您提供的文件类型。

加载器利用了底层的“unstructured”库。该库会分析文件内容并尝试根据文件类型提取有意义的信息。

from langchain_community.document_loaders import UnstructuredFileLoaderloader = UnstructuredFileLoader("text.txt")docs = loader.load()docs"""
[Document(page_content='I have some instructions here.\n\nThis is the second row.', metadata={'source': 'text.txt'})]
"""loader = UnstructuredFileLoader("text.txt", mode="elements"
)docs = loader.load()docs"""
[Document(page_content='I have some instructions here.', metadata={'source': 'text.txt', 'filename': 'text.txt', 'last_modified': '2024-03-04T18:15:12', 'languages': ['eng'], 'filetype': 'text/plain', 'category': 'NarrativeText'}),Document(page_content='This is the second row.', metadata={'source': 'text.txt', 'filename': 'text.txt', 'last_modified': '2024-03-04T18:15:12', 'languages': ['eng'], 'filetype': 'text/plain', 'category': 'NarrativeText'})]
"""loader = UnstructuredFileLoader("your_report.html")docs = loader.load()docs"""
[Document(page_content='Toggle navigation\n\nPandas Profiling Report\n\nOverview\n\nVariables\n\nInteractions\n\nCorrelations\n\nMissing values\n\nSample\n\nOverview\n\nOverview\n\nAlerts 44\n\nReproduction\n\nDataset statistics\n\nNumber of variables 44 Number of observations 58592 Missing cells 0 Missing cells (%) 0.0% Duplicate rows 0 Duplicate rows (%) 0.0% Total size in memory 19.7 MiB Average record size in memory 352.0 B\n\nVariable types\n\nText 1 Numeric 10 Categorical 16 Boolean 17\n\nairbags is highly overall correlated with cylinder and 28 other fields High correlation cylinder is highly overall correlated with airbags and 22 other fields High correlation displacement is highly overall correlated with airbags and 33 other fields High correlation engine_type is highly overall correlated with airbags and 30 other fields High correlation fuel_type is highly overall correlated with airbags and 30 other fields High correlation gear_box is highly overall correlated with airbags and 23 other fields High correlation gross_weight is highly overall correlated with airbags and 32 other fields High correlation height is highly overall correla
"""# pip install "unstructured[pdf]"loader = UnstructuredFileLoader("ticket.pdf")docs = loader.load()docs"""
[Document(page_content='Event\n\nCommence Date\n\nReference\n\nPaul Kalkbrenner\n\n10 September,Satu
info@biletino.com', metadata={'source': 'ticket.pdf'})]
"""

DirectoryLoader

DirectoryLoader 可帮助一次性从整个目录加载多个文档。它利用了 UnstructuredFileLoader

from langchain_community.document_loaders import DirectoryLoaderloader = DirectoryLoader('folder/')docs = loader.load()print(len(docs)) # 3# we can declare extension, display progress bar, use multithreading
loader = DirectoryLoader('folder/', glob="*.txt", show_progress=True, use_multithreading=True)docs = loader.load()print(len(docs)) # 1 

UnstructuredHTMLLoader

它利用“非结构化”库的功能从存储为 HTML 文件的网页中提取有意义的内容。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div>A div element</div><p>a p element</p><div><p>a p inside of a div</p></div></body>
</html
from langchain_community.document_loaders import UnstructuredHTMLLoaderloader = UnstructuredHTMLLoader("index.html")data = loader.load()data"""
[Document(page_content='A div element\n\na p element\n\na p inside of a div', metadata={'source': 'index.html'})]
"""

我们可以使用BeautifulSoup4通过BSHTMLLoader来解析 HTML 文档。

from langchain_community.document_loaders import BSHTMLLoaderloader = BSHTMLLoader("index.html")
data = loader.load()
data"""
[Document(page_content='\n\n\n\nDocument\n\n\nA div element\na p element\n\na p inside of a div\n\n\n\n', metadata={'source': 'index.html', 'title': 'Document'})]
"""

JSONLoader

JSONLoader 被设计用于处理以 JSON 形式存储的数据。

[{"id": 1,"name": "John Doe","email": "john.doe@example.com","age": 30,"city": "New York"},{"id": 2,"name": "Jane Smith","email": "jane.smith@example.com","age": 25,"city": "Los Angeles"},{"id": 3,"name": "Alice Johnson","email": "alice.johnson@example.com","age": 28,"city": "Chicago"}
]

JSONLoaders 利用 JQ 库来解析 JSON 数据。JQ 提供了一种专为处理 JSON 结构而设计的强大查询语言。

jq_schema 参数允许在 JSONLoader 函数中提供 JQ 表达式。

from langchain_community.document_loaders import JSONLoaderloader = JSONLoader(file_path='example.json',jq_schema='map({ name, email })',text_content=False)data = loader.load()data"""
[Document(page_content="[{'name': 'John Doe', 'email': 'john.doe@example.com'},{'name': 'Jane Smith', 'email': 'jane.smith@example.com'}, {'name': 'Alice Johnson', 'email': 'alice.johnson@example.com'}]", metadata={'source': '/Users/okanyenigun/Desktop/codes/python__general/example.json', 'seq_num': 1})]
"""

JSON 行文件是一个文本文件,其中每行都是一个有效的 JSON 对象,由换行符分隔。

{"name": "John Doe", "age": 30}
{"name": "Jane Smith", "age": 25}
{"name": "Alice Johnson", "age": 28}
loader = JSONLoader(file_path='example.jsonl',jq_schema='.content',text_content=False,json_lines=True)data = loader.load()
from pprint import pprintpprint(data)"""
[Document(page_content='', metadata={'source': '/Users/okanyenigun/Desktop/codes/python__general/example.jsonl', 'seq_num': 1}),Document(page_content='', metadata={'source': '/Users/okanyenigun/Desktop/codes/python__general/example.jsonl', 'seq_num': 2}),Document(page_content='', metadata={'source': '/Users/okanyenigun/Desktop/codes/python__general/example.jsonl', 'seq_num': 3})]
"""

PyPDFLoader

它利用 pypdf 库来加载 PDF 文件。

from langchain_community.document_loaders import PyPDFLoaderloader = PyPDFLoader("ticket.pdf")
pages = loader.load_and_split()pages[0]
"""
Document(page_content='Paul Kalkbrenner\nThis electronically generated document will grant you entry to the event and time specified on this ticket. The security of the ticket belongs to the\nowner
...
Sarıyer, İstanbul', metadata={'source': 'ticket.pdf', 'page': 0})
"""

我们还可以使用 UnstructuredPDFLoader 来加载 PDF。

from langchain_community.document_loaders import UnstructuredPDFLoaderloader = UnstructuredPDFLoader("ticket.pdf")data = loader.load()

我们有 OnlinePDFLoader 来加载在线 PDF。

from langchain_community.document_loaders import OnlinePDFLoaderloader = OnlinePDFLoader("https://arxiv.org/pdf/2302.03803.pdf")data = loader.load()data"""
[Document(page_content='3 2 0 2\n\nb e F 7\n\n]\n\nG A . h t a m\n\n[\n\n1 v 3 0 8 3 0 . 2 0 3 2 : v i X r a\n\nA WEAK (k, k)-LEFSCHETZ THEOREM FOR PROJECTIVE TORIC ORBI...
"""

还有更多利用不同来源的……

# PyPDFium2Loaderfrom langchain_community.document_loaders import PyPDFium2Loaderloader = PyPDFium2Loader("ticket.pdf")data = loader.load()# PDFMinerLoaderfrom langchain_community.document_loaders import PDFMinerLoaderloader = PDFMinerLoader("ticket.pdf")data = loader.load()# PDFMinerPDFasHTMLLoaderfrom langchain_community.document_loaders import PDFMinerPDFasHTMLLoaderloader = PDFMinerPDFasHTMLLoader("ticket.pdf")data = loader.load()[0]   # entire PDF is loaded as a single Document# PyMuPDFLoaderfrom langchain_community.document_loaders import PyMuPDFLoaderloader = PyMuPDFLoader("ticket.pdf")data = loader.load()# Directory loader for PDFfrom langchain_community.document_loaders import PyPDFDirectoryLoaderloader = PyPDFDirectoryLoader("folder/")docs = loader.load()

ArxivLoader

它旨在从 arXiv 开放存取库中获取和处理文档。

# pip install arxivfrom langchain_community.document_loaders import ArxivLoaderdocs = ArxivLoader(query="1605.08386", load_max_docs=2).load()print(len(docs))
print()
print(docs[0].metadata)"""
1{'Published': '2016-05-26', 'Title': 'Heat-bath random walks with Markov 
bases', 'Authors': 'Caprice Stanley, Tobias Windisch', 'Summary': 
'Graphs on lattice points are studied whose edges come from a finite set of\nallowed moves of arbitrary length. We show that the diameter of these graphs on\nfibers of a fixed integer matrix can be bounded from above by a constant. We\nthen study the mixing behaviour of heat-bath random walks on these graphs. We\nalso state explicit conditions on the set of moves so that the heat-bath random\nwalk, a generalization of the Glauber dynamics, is an expander in fixed\ndimension.'}
"""

Docx2txtLoader

它适用于 Microsoft Office Word 文档。

from langchain_community.document_loaders import Docx2txtLoaderloader = Docx2txtLoader("example_data/fake.docx")data = loader.load()data"""
[Document(page_content='Lorem ipsum dolor sit amet.', 
metadata={'source': 'ex...
"""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 双屏异显-学习笔记

双屏异显 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现Android 的双屏异显,Google 也提供了相应的 API方法 Presentation。…

链表实现例子

链表概述 链表是一种基础的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。这些链表的实现展示了如何添加、删除和搜索节点,以及如何显示链表中的所有节点。根据具体需求,可以选择适合的链表类型。单向链表:每个节点只包含指向下一个节点的指针。双…

小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦

下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址&#xff1a;https://www.ventoy.net/cn/&#xff0c;找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址&#xff0c;如下图所示。 4、如下就是我下…

弘君资本股市资讯:突发!英伟达,被查!

4家科技巨擘一同被查&#xff01; 科技巨擘们&#xff0c;正迎来反独占风暴。据美媒报道&#xff0c;美国将对英伟达、微软、OpenAI翻开反独占查询&#xff0c;这标志着监管部门对人工智能工作的查看力度越来越大。 与此一同&#xff0c;苹果也面对新费事。6月6日&#xff0c…

iOS开发-锚点

在iOS开发的面试中&#xff0c;锚点&#xff08;Anchor Point&#xff09;是一个可能涉及的高级主题&#xff0c;尤其是在讨论视图布局、动画和图层&#xff08;CALayer&#xff09;相关的内容时。以下是一些关于锚点的面试题&#xff0c;涵盖了基础概念、实际应用以及可能的陷…

python-微分方程计算

首先导入数据 import numpy as np from scipy.integrate import odeint from scipy.optimize import minimize import matplotlib.pyplot as pltdata np.array([[30, 4],[47.2, 6.1],[70.2, 9.8],[77.4, 35.2],[36.3, 59.4],[20.6, 41.7],[18.1, 19],[21.4, 13],[22, 8.3],[2…

java线程相关知识点

Java多线程涉及以下几个关键点 1.线程生命周期&#xff1a;理解线程从创建到销毁的各个阶段&#xff0c;包括新建、运行、阻塞、等待、计时等待和终止。 2.线程同步&#xff1a;掌握如何使用synchronized关键字和Lock接口来同步代码&#xff0c;防止数据竞争和死锁。 3.线程间通…

数据分析必备:一步步教你如何用Pandas做数据分析(21)

1、Pandas 可视化 Pandas 可视化是指使用 Pandas 库中的函数和方法来创建数据可视化图表。Pandas 提供了一些基本的绘图功能&#xff0c;例如折线图、柱状图、饼图等&#xff0c;可以通过调用相应的函数来创建这些图表。 2、基本绘图&#xff1a;绘图 Series和DataFrame上的…

预期值与实际值对比

编辑实际值和预期值变量 因为在单独的代码当中&#xff0c;我们先定义了变量str&#xff0c;所以在matcher时传入str参数&#xff0c;但当我们要把这串代码写在testrun当中&#xff0c;改下传入的参数&#xff0c;与excel表做连接 匹配的结果是excel表中的expect结果&#xf…

等级保护政策法规解读:构建网络安全的法律基石

等级保护政策法规解读&#xff1a;构建网络安全的法律基石 引言 等级保护制度作为中国网络安全管理的基石&#xff0c;其政策法规构成了网络运营者履行安全保护义务的法律框架。随着技术的发展和网络安全形势的变化&#xff0c;等级保护政策法规也在不断更新和完善。本文旨在解…

Python的列表和元组之间的区别是?在 Python 中,如何使用列表和元组进行高效的数据操作?

Python 中的列表&#xff08;List&#xff09;和元组&#xff08;Tuple&#xff09;是两种不同的数据结构&#xff0c;它们有以下主要区别&#xff1a; 可变性&#xff1a; 列表是可变的&#xff08;Mutable&#xff09;&#xff0c;这意味着你可以在创建列表后添加、删除或更改…

有序二叉树java实现

类实现&#xff1a; package 树;import java.util.LinkedList; import java.util.Queue;public class BinaryTree {public TreeNode root;//插入public void insert(int value){//插入成功之后要return结束方法TreeNode node new TreeNode(value);//如果root为空的话插入if(r…

RK3288 android7.1 实现ota升级时清除用户数据

一&#xff0c;OTA简介(整包&#xff0c;差分包) OTA全称为Over-The-Air technology(空中下载技术)&#xff0c;通过移动通信的接口实现对软件进行远程管理。 1. 用途&#xff1a; OTA两种类型最大的区别莫过于他们的”出发点“&#xff08;我们对两种不同升级包的创建&…

SolidityFoundry 安全审计测试 Delegatecall漏洞

名称&#xff1a;Delegatecall漏洞 描述&#xff1a; 代理合约所有者操纵漏洞&#xff0c;是智能合约设计中的一个缺陷&#xff0c;允许攻击者操纵代理合约所有者。该漏洞允许攻击者操纵代理合约的所有者&#xff08;这里我们把所有者硬编码为 0xdeadbeef&#xff09;。漏洞产…

牛客多校Ancestor(lca,集合的lca)

题目描述 NIO is playing a game about trees. The game has two trees A,BA, BA,B each with NNN vertices. The vertices in each tree are numbered from 111 to NNN and the iii-th vertex has the weight viv_ivi​. The root of each tree is vertex 1. Given KKK key n…

PHP实名认证接口开发示例、银行卡实名认证API

在互联网技术多元化、高速的发展下&#xff0c;催生出在挑战中不断奋勇前进的互联网企业。但不能忽视的是&#xff0c;互联网技术的快速迭代也会使部分企业在冲击中败下阵来&#xff0c;面临淘汰的危机。随着O2O、共享经济等新兴商业形式的兴起&#xff0c;企业对实名认证业务的…

如何使用Python中的列表解析(list comprehension)进行高效列表操作

Python中的列表解析&#xff08;list comprehension&#xff09;是一种创建列表的简洁方法&#xff0c;它可以在单行代码中执行复杂的循环和条件逻辑。列表解析提供了一种快速且易于阅读的方式来生成新的列表。 以下是一些使用列表解析进行高效列表操作的示例&#xff1a; 1.…

用Python编写自动发送每日电子邮件报告的脚本

为了用 Python 编写自动发送每日电子邮件报告的脚本&#xff0c;你可以使用 smtplib 库来发送电子邮件&#xff0c;使用 email 库来创建电子邮件内容。此外&#xff0c;你可以使用 schedule 库来安排每天发送邮件的任务。以下是一个示例脚本以及如何设置和运行它的指导。 步骤…

JSON如何处理包含特殊字符的字段

在JSON中处理包含特殊字符的字段时&#xff0c;你通常不需要直接处理这些特殊字符&#xff0c;因为JSON格式本身就会对特殊字符进行转义。当你使用编程语言或工具来生成或解析JSON时&#xff0c;这些转义通常是自动处理的。 然而&#xff0c;如果你需要手动处理或理解这些转义…

华为策略流控

以下脚本仅做参考&#xff0c;具体IP地址和接口请按照现场实际情况写入。 [Huawei]acl 3001 [Huawei-acl-adv-3001]rule permit ip source 192.168.1.10 0.0.0.0 destination 192.168.2.10 0.0.0.0 //匹配需要做测试的源和目标地址 [Huawei-acl-adv-3001]rule permit ip sour…