乐于分享
好东西不私藏

LangChain入门教程07:PDF、网页、表格该怎么读

LangChain入门教程07:PDF、网页、表格该怎么读

PDF、网页、表格该怎么读

大模型本身有两个天然限制。第一,它的上下文窗口终究有限,不可能一次把整个资料库都塞进去。第二,它的知识是静态的,训练完成后就停在某个时间点。这两点是检索系统存在的原因:模型不能吃下整个语料,也不知道你公司昨天刚更新的制度文档。文档加载的意义,就是把“外部知识”接进来,让后续的切分、索引和检索有可靠的语料用。

01

LangChain 里的“文档”是什么

文档加载并不是把文档读出来就完事了,文档加载工程中关键在于你能不能把各种来源不同、格式不同、结构不同的数据,稳定地转换成后面检索系统能理解、能切分、能索引、能追溯来源的统一对象。langchain给我们提供了loader,能把 Slack、Notion、Google Drive、网页、PDF 等不同来源的数据,读成统一的 Document 格式,方便后续一致处理。

在 LangChain 里,Document 是为检索流程服务的数据对象,它和我们之前学的聊天消息是两套东西。

02

loader

LangChain 官方把 document loader 设计成统一接口。所有 LangChain 文档加载器都继承自 BaseLoader 基类,并提供了两个核心方法:

  • .load()
    :这个方法会将指定来源的所有文档一次性加载到内存中,并以列表的形式返回。对于小文件来说,这个方法简单直接。但是,当你处理一个几百MB甚至几个GB的超大文件时,.load()可能会导致内存溢出。
  • .lazy_load()
    :这个方法返回一个迭代器(iterator),允许你逐个(或逐页)地处理文档。这意味着你不需要把整个文件都读入内存,而是处理完一页就释放一页的内存,非常适合处理大文件或海量文档。

这个设计能让你面对不同数据源时,心智模型一致。也就是在你读CSV、Word、Notion、网页还是 PDF,核心思路都差不多:先拿 loader,接着产出 Document,再交给后面的 splitter、embedding。

LangChain 支持很多种不同类型的文档加载器,我们介绍几种常用的

03

TextLoader
from pathlib import Path

from langchain_community.document_loaders import TextLoader

txt_path = Path(
    "/Users/lihaoran/Desktop/cai/langchain-getting-started/documents/text_loader_demo.txt"
)

# TextLoader 默认会把整个 txt 文件读成一个 Document
loader = TextLoader(str(txt_path), encoding="utf-8")
docs = loader.load()

print(f"共加载 {len(docs)} 个 Document\n")

for i, doc in enumerate(docs, start=1):
    print(f"--- Document {i} ---")
    print(f"metadata: {doc.metadata}")
    print(f"content: {doc.page_content}")

04

PyPDFLoader
from pathlib import Path

from langchain_community.document_loaders import PyPDFLoader

pdf_path = Path("/Users/lihaoran/Desktop/cai/langchain-getting-started/documents/sample.pdf")
docs = PyPDFLoader(str(pdf_path)).load()
print(f"共加载 {len(docs)} 个 Document")

if docs:
    print(f"metadata: {docs[0].metadata}")
    print(f"content预览: {docs[0].page_content.strip()}")

05

CSVLoader
from pathlib import Path

from langchain_community.document_loaders import CSVLoader

csv_path = Path("/Users/lihaoran/Desktop/cai/langchain-getting-started/documents/sample.csv")
docs = CSVLoader(str(csv_path), encoding="utf-8").load()
print(f"共加载 {len(docs)} 个 Document")

if docs:
    print(f"metadata: {docs[0].metadata}")
    print(f"content预览: {docs[0].page_content.strip()}")

06

Docx2txtLoader
from pathlib import Path

from langchain_community.document_loaders import Docx2txtLoader

docx_path = Path("/Users/lihaoran/Desktop/cai/langchain-getting-started/documents/sample.docx")
docs = Docx2txtLoader(str(docx_path)).load()
print(f"共加载 {len(docs)} 个 Document")

if docs:
    print(f"metadata: {docs[0].metadata}")
    print(f"content预览: {docs[0].page_content.strip()}")

TextLoader、CSVLoader、PyPDFLoader、Docx2txtLoader都是用来读取本地文件的,你看他们的读取方式都很统一,都是loader方法

07

WebBaseLoader

加载web资源也差不多

import os

os.environ["USER_AGENT"] = "langchain-getting-started/1.0"

from langchain_community.document_loaders import WebBaseLoader

url = "https://python.langchain.com/docs/introduction/"
docs = WebBaseLoader(url).load()
print(f"共加载 {len(docs)} 个 Document")

if docs:
    print(f"metadata: {docs[0].metadata}")
    print(f"content预览: {docs[0].page_content[:500].strip()}")

08

总结

学 LangChain 的 document loaders,感觉就像是读文件的小工具。loader把 常见的文本、网页、云盘、Notion等各种来源的数据,统一转换成 LangChain 可处理的 Document 对象;而 Document 的核心价值,就在于同时保留正文内容 page_content 和来源、页码、标签等 metadata,方便后续切分、向量化、检索和答案溯源。

我们下一篇见~

感谢阅读

如果觉得文章有帮助,欢迎点赞、分享和关注