【可能是全网最丝滑的LangChain教程】十三、LangChain进阶之Document loaders

不要让别人告诉你你能做什么,不能做什么。如果你有一个梦想,就去捍卫它。

01 介绍

Document loader(文档加载器),使用文档加载器将数据从数据源加载为 Document 对象的数据。

Document 是 LangChain 提供的一个类,包含一段文本和与文本关联的元数据。我们读取数据后就会转换成 Document 对象。

例如,有一些文档加载器用于加载简单的 .txt 文件、加载任何网页的文本内容,甚至用于加载 YouTube 视频。文档加载器提供了“ load ”方法,用于从配置的源加载数据,转换为 Document。它们还可以选择实现“延迟加载”,以便将数据延迟加载到内存中。

基于 LLM 的应用程序经常需要从数据库或文件(如 PDF)中提取数据,并将其转换为 LLM 可以使用的格式。在LangChain中,这通常涉及创建 Document 对象,这些对象封装了提取的文本(page_content)以及元数据(metadata 包含文档详细信息的字典),例如作者姓名或出版日期。

Document 对象通常被格式化为提示,这些提示被输入到 LLM 中,允许 LLM 使用 Document 中的信息来生成所需的响应(例如,总结文档)。Documents 既可以立即使用,也可以索引到向量存储中,以备将来检索和使用。

02 基础使用

这里以TextLoader为例

from langchain_community.document_loaders import TextLoader

"""
file_path:要加载的文件的路径。
encoding:要使用的文件编码。如果“无”,将加载文件使用默认的系统编码。
autodetect_encoding:是否尝试自动检测文件编码如果指定的编码失败。
"""
loader = TextLoader("./index.txt",encoding='utf-8',autodetect_encoding=True)
loader.load()

"""
[
    Document(
        page_content='电影中的经典台词往往能够深入人心,成为人们记忆中的一部分。以下是一些电影中的经典台词:\n\n"生活就像一盒巧克力,你永远不知道你会得到什么。" ——《阿甘正传》(Forrest Gump, 1994)\n\n"永远不要小看自己,因为你永远不知道自己有多强大。" ——《狮子王》(The Lion King, 1994)\n\n"我会回来的。" ——《终结者》(The Terminator, 1984)\n\n"你不能改变过去,但你可以改变未来。" ——《回到未来》(Back to the Future, 1985)\n\n"即使世界末日来临,我也要和你一起度过。" ——《泰坦尼克号》(Titanic, 1997)\n\n"不要让别人告诉你你能做什么,不能做什么。如果你有一个梦想,就去捍卫它。" ——《当幸福来敲门》(The Pursuit of Happyness, 2006)\n\n"我将永远爱你。" ——《保镖》(The Bodyguard, 1992)\n\n"这就是生活,小家伙。" ——《美丽人生》(Life is Beautiful, 1997)\n\n"我有一个梦想。" ——《我有一个梦想》(I Have a Dream, 1963)\n\n"你只需要跟随你的黄砖路。" ——《绿野仙踪》(The Wizard of Oz, 1939)\n\n这些台词不仅在电影中令人难忘,也在现实生活中激励着许多人。',
         metadata={'source': './index.txt'}
    )
]
"""

通过以上代码我们可以看到:

  1. load方法返回的是 Document 列表。
  2. Document 里面主要包含两个元素,page_content 和 metadata。
  3. metadata 是字典类型,这里包含 source 键,表示数据源位置。metadata内容和 Loader 对象有关,不同的对象,生成的 metadata 内容不同。

03 自定义Document Loader

在自定义之前,先了解几个组件

组件
描述
Document
包含文本内容和元数据
BaseLoader
用于将源数据转换成Document
Blob
用于二进制数据的处理
BaseBlobParser
将二进制数据转换成Document

Standard Document Loader

标准文档加载器。文档加载器可以通过从 BaseLoader 进行子类化来实现,它提供了用于加载文档的标准接口。

自定义标准文档加载器必须实现的方法是:lazy_load

你说你还想实现其他方法,能不能行?当然能行!建议这样做吗?肯定不建议!为什么不建议这样做?源码里面有解释,大家可以自己跟一下源码,我这里就不贴了!😂

这里我会创建一个自定义的标准文档加载器,该加载器每次从文档中读取一行数据并创建 Document 对象返回。代码来源于官方文档,如下:

from typing import AsyncIterator, Iterator

from langchain_core.document_loaders import BaseLoader
from langchain_core.documents import Document


class CustomDocumentLoader(BaseLoader):
    """An example document loader that reads a file line by line."""

    def __init__(self, file_path: str) -> None:
        """Initialize the loader with a file path.

        Args:
            file_path: The path to the file to load.
        """
        self.file_path = file_path
    
    def lazy_load(self) -> Iterator[Document]:  # <-- Does not take any arguments
        """A lazy loader that reads a file line by line.

        When you're implementing lazy load methods, you should use a generator
        to yield documents one by one.
        """
        with open(self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值