LangChain入门教程07:PDF、网页、表格该怎么读
PDF、网页、表格该怎么读
大模型本身有两个天然限制。第一,它的上下文窗口终究有限,不可能一次把整个资料库都塞进去。第二,它的知识是静态的,训练完成后就停在某个时间点。这两点是检索系统存在的原因:模型不能吃下整个语料,也不知道你公司昨天刚更新的制度文档。文档加载的意义,就是把“外部知识”接进来,让后续的切分、索引和检索有可靠的语料用。
01
文档加载并不是把文档读出来就完事了,文档加载工程中关键在于你能不能把各种来源不同、格式不同、结构不同的数据,稳定地转换成后面检索系统能理解、能切分、能索引、能追溯来源的统一对象。langchain给我们提供了loader,能把 Slack、Notion、Google Drive、网页、PDF 等不同来源的数据,读成统一的 Document 格式,方便后续一致处理。
在 LangChain 里,Document 是为检索流程服务的数据对象,它和我们之前学的聊天消息是两套东西。
02
LangChain 官方把 document loader 设计成统一接口。所有 LangChain 文档加载器都继承自 BaseLoader 基类,并提供了两个核心方法:
.load()
:这个方法会将指定来源的所有文档一次性加载到内存中,并以列表的形式返回。对于小文件来说,这个方法简单直接。但是,当你处理一个几百MB甚至几个GB的超大文件时, .load()可能会导致内存溢出。.lazy_load()
:这个方法返回一个迭代器(iterator),允许你逐个(或逐页)地处理文档。这意味着你不需要把整个文件都读入内存,而是处理完一页就释放一页的内存,非常适合处理大文件或海量文档。
这个设计能让你面对不同数据源时,心智模型一致。也就是在你读CSV、Word、Notion、网页还是 PDF,核心思路都差不多:先拿 loader,接着产出 Document,再交给后面的 splitter、embedding。
LangChain 支持很多种不同类型的文档加载器,我们介绍几种常用的
03
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
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
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
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
加载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,方便后续切分、向量化、检索和答案溯源。
我们下一篇见~
感谢阅读
如果觉得文章有帮助,欢迎点赞、分享和关注
夜雨聆风