news 2026/5/3 14:55:46

Blob与BlobParser代替LangChain文档加载器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Blob与BlobParser代替LangChain文档加载器

01. LangChain 中的 Blob 方案

许多文档加载器都涉及到解析文件,此类加载器之间的差异通常源于文件解析方式,而不是文件加载方式。例如,你可以使用 open() 函数来读取 PDF 或 Markdown 文件的二进制内容,但是需要不同的解析逻辑来将二进制数据转换为文本。

在 LangChain 中也提供了一个类似的解决方案 Blob,其灵感来源于 Blob WebAPI规范(这是前端 Web 浏览器中定义的相关规范)。

Blob WebAPI 规范文档链接:https://developer.mozilla.org/en-US/docs/Web/API/Blob。

该方案下有 Blob、BlobLoader 和 BaseBlobParser 三个类,含义如下:

  1. Blob:LangChain 封装的数据对象,通过引用或值表示原始数据,该类提供一个接口,以表示不同形式具体化的二进制数据,使用该类可以有助于将数据加载器的开发与解析器耦合。
  2. BlobLoader:Blob 数据加载器,类似 DocumentLoader,不过 BlobLoader 被设计成可以加载任何数据(未来的规划)。
  3. BlobParser:Blob 数据解析器,用于将传入的 Blob 数据转换成文档列表。

在这个方案下,文档加载器的运行流程变成如下

例如上节课的需求(加载对应的文本信息,其中每行数据都作为一个 Document 组件),使用 Blob 的方案来实现,只需自定义一个解析器并实现 lazy_parser() 方法即可,示例代码如下from typing import Iterator

from langchain_core.document_loaders import Blob

from langchain_core.document_loaders.base import BaseBlobParser

from langchain_core.documents import Document

class CustomParser(BaseBlobParser):

"""自定义解析器,提取文本文件的每一行为一个Document元素"""

def lazy_parse(self, blob: Blob) -> Iterator[Document]:

line_number = 0

with blob.as_bytes_io() as f:

for line in f:

yield Document(

page_content=line,

metadata={"source": blob.source, "line_number": line_number}

)

line_number += 1

blob = Blob.from_path("./喵喵.txt")

parser = CustomParser()

documents = list(parser.lazy_parse(blob))

print(documents)

print(len(documents))

print(documents[0].metadata)

输出内容:

[Document(page_content='喵喵��\r\n', metadata={'source': './喵喵.txt', 'line_number': 0}), Document(page_content='喵喵��\r\n', metadata={'source': './喵喵.txt', 'line_number': 1}), Document(page_content='喵����', metadata={'source': './喵喵.txt', 'line_number': 2})]

3

{'source': './喵喵.txt', 'line_number': 0}

除了 from_path() 函数,Blob 类还可以在构造时传递 data 参数,直接从内存中加载内容,而无需从文件中获取,示例如下

blob = Blob(data="喵喵��\r\n喵喵��\r\n喵����")

02. Blob 数据存储类

LangChain 中设计的 Blob 数据存储类和 Blob WebAPI规范 定义的类非常接近,拥有以下方法和属性:

  1. data:原始数据,支持存储字节、字符串数据。
  2. mimetype:文件的 mimetype 类型。
  3. encoding:文件的编码,默认值为 utf-8。
  4. path:文件的原始路径,支持传递字符串路径或者 Path 类。
  5. metadata:存储的元数据,一般都有 source 字段。
  6. source():只读函数/属性,用于返回数据的来源。
  7. as_string():将数据转换成字符串。
  8. as_bytes():将数据转换成字节数据。
  9. as_bytes_io():将数据转换成缓冲流字节数据。
  10. from_path():从对应的路径中加载 Blob 数据(文件)。
  11. from_data():从对应的原始数据中加载 Blob 数据(非文件)。

03. Blob 加载器

解析器封装了将二进制数据解析为 Document 组件所需的逻辑,而 Blob 加载器则封装了从给定存储位置加载 Blob 所需的逻辑。不过目前在 LangChain 中,只集成了一个 FileSystemBlobLoader,即文件系统二进制数据加载器。

这个加载器可以加载传入文件夹下的特定文件,代码示例

from langchain_community.document_loaders.blob_loaders import FileSystemBlobLoader

loader = FileSystemBlobLoader(".", show_progress=True)

for blob in loader.yield_blobs():

print(blob.source)

输出内容

100%|██████████| 3/3 [00:00<00:00, 58.15it/s]

1.Blob解析器示例.py

2.FileSystemBlobLoader示例.py

喵喵.txt

如果要实现一个 Blob 加载器,只需要继承 BlobLoader 类,并实现 yield_blobs() 方法即可,BlobLoader 类的代码如下

# langchain_core/document_loaders/blob_loaders::BlobLoader->yield_blobs

class BlobLoader(ABC):

"""Abstract interface for blob loaders implementation.

Implementer should be able to load raw content from a storage system according

to some criteria and return the raw content lazily as a stream of blobs.

"""

@abstractmethod

def yield_blobs(

self,

) -> Iterable[Blob]:

"""A lazy loader for raw data represented by LangChain's Blob object.

Returns:

A generator over blobs

"""

04. Blob 通用加载器

在上面的示例中,Blob 加载器与解析器是分开使用的,其实在 LangChain 中还封装了一个由 BlobLoader 与 BaseBlobParser 组成的类——GenericLoader,这个类旨在提供标准化的方法,让 BlobLoader 使用更简单,不过目前也仅支持 FileSystemBlobLoader。

使用示例如下

from langchain_community.document_loaders.generic import GenericLoader

loader = GenericLoader.from_filesystem(".", glob="*.txt", show_progress=True)

for idx, doc in enumerate(loader.lazy_load()):

print(f"当前加载第{idx + 1}个文件,文件信息:{doc.metadata}")

输出内容

100%|██████████| 1/1 [00:00<00:00, 19.76it/s]

当前加载第1个文件,文件信息:{'source': '喵喵.txt'}

整体来说,Blob 解决方案目前 LangChain 封装与集成得非常少,如果需要使用 Blob 的形式来加载文件,目前还需要大量编写加载文件与解析数据的逻辑,效率比较低,不过随着未来 LangChain 团队封装的 Blob 解析逻辑越来越多,会逐渐代替 DocumentLoader 的方案。对于目前的版本来说,大家只需要知道有这个东西即可

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 6:20:58

基于langchain RAG问答应用实战

一、前言 介绍 本次选用百度百科——藜麦数据&#xff08;https://baike.baidu.com/item/藜麦/5843874&#xff09;模拟个人或企业私域数据 &#xff0c;并基于langchain开发框架&#xff0c;实现一种简单的RAG问答应用示例。软件资源 CUDA 11.7Python 3.10pytorch 1.13.1cu1…

作者头像 李华
网站建设 2026/5/3 13:37:00

探索岛屿设计的无限可能:Happy Island Designer创意指南

探索岛屿设计的无限可能&#xff1a;Happy Island Designer创意指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Animal Crossin…

作者头像 李华
网站建设 2026/5/2 15:56:35

命令执行状态跟踪机制失效问题深度剖析与系统性解决方案

命令执行状态跟踪机制失效问题深度剖析与系统性解决方案 【免费下载链接】claude-code Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, an…

作者头像 李华
网站建设 2026/5/1 5:14:24

AI艺术创作趋势解读:Z-Image-Turbo开源模型部署必看指南

AI艺术创作趋势解读&#xff1a;Z-Image-Turbo开源模型部署必看指南 1. 为什么Z-Image-Turbo正在改变AI绘画的使用门槛 最近刷到不少设计师朋友在群里转发一张图&#xff1a;一只毛发根根分明的橘猫蹲在窗台&#xff0c;阳光在它耳尖镀上金边&#xff0c;背景虚化得恰到好处—…

作者头像 李华
网站建设 2026/5/1 2:06:31

Payload SDK零基础入门无人机开发指南

Payload SDK零基础入门无人机开发指南 【免费下载链接】Payload-SDK DJI Payload SDK Official Repository 项目地址: https://gitcode.com/gh_mirrors/pa/Payload-SDK Payload SDK是大疆为开发者打造的无人机负载应用开发工具包&#xff0c;通过它可以轻松实现无人机与…

作者头像 李华
网站建设 2026/5/1 14:43:35

音乐流派分类不求人:ccmusic-database/music_genre保姆级教程

音乐流派分类不求人&#xff1a;ccmusic-database/music_genre保姆级教程 你是否曾听到一段旋律&#xff0c;心头一动却叫不出它的名字&#xff1f;是爵士的慵懒即兴&#xff0c;还是金属的磅礴张力&#xff1f;是拉丁的热情律动&#xff0c;还是古典的精密结构&#xff1f;过…

作者头像 李华