
大家好,我是飞哥!👋
欢迎来到吴恩达《LangChain:Chat with Your Data》系列课程的第二讲。上一讲我们了解了 RAG 的全流程,今天我们正式开工,攻克第一关:Document Loading (文档加载)。
1. 为什么:Garbage In, Garbage Out 🗑️
💡 场景锚定
做饭要先买菜洗菜,训练 AI 也是一样。如果你喂给 AI 的数据格式乱七八糟、乱码满天飞,那么 AI 输出的答案肯定也是一塌糊涂。
- PDF 里有复杂的表格和页眉页脚。
- 网页里有一堆广告和导航栏。
- YouTube 视频只有声音没有文字。
⚠️ 核心痛点
我们需要一个"万能转换器",把这些五花八门的数据源(PDF, HTML, Audio, Notion)统一转换成 AI 能读懂的标准格式。
2. 是什么:LangChain 的 Document Loaders 🏗️
LangChain 提供了超过 80 种文档加载器(Document Loaders),它们的作用就是把各种非结构化数据加载为统一的 Document 对象。
🗂️ 80+ 种文档格式大揭秘 (分类概览)
虽然我们不可能把 80 种全列出来,但我们可以把它们分成三大类:
- 公共非结构化数据 (Public Unstructured Data) :
- 网页/互联网:HTML 网页、YouTube 视频字幕、Twitter 推文、Hacker News 帖子、GitHub 代码库等。
- 私有非结构化数据 (Proprietary Unstructured Data) :
- 本地文件:PDF、Word 文档、PowerPoint 幻灯片、Markdown 文件、TXT 纯文本。
- 第三方SaaS工具:Notion 笔记、Figma 设计稿、Slack 聊天记录、Confluence。
- 结构化数据 (Structured Data) :
- 表格与数据库:CSV 表格、JSON 文件、Airbyte 数据源、Stripe 账单数据、Airtable 表格等(提取其中的文本字段用于问答)。
一个标准的 Document 对象包含两部分:
page_content: 文档的文本内容(比如 PDF 的一页文字)。metadata: 文档的元数据(比如文件名、页码、来源 URL)。
3. 怎么用:实战代码 💻
3.1 加载 PDF (PyPDFLoader) 📄
这是最常见的需求。我们使用 PyPDFLoader 来处理 PDF 文件。
提示 :为了保证代码可运行,脚本中默认会自动下载一个示例 PDF (
helloworld.pdf)。如果你想加载自己的 PDF,只需修改代码中的路径即可。
python
from langchain_community.document_loaders import PyPDFLoader
# 加载 PDF (示例代码加载的是 Andrew Ng 的讲义,脚本实际运行可能加载的是 helloworld.pdf)
loader = PyPDFLoader("docs/cs229_lectures/MachineLearning-Lecture01.pdf")
pages = loader.load()
# 查看页数
print(len(pages))
# 输出: 22 (脚本实际输出可能为 1)
# 查看第一页内容(前200字符)
print(pages[0].page_content[0:200])
# 输出: MachineLearning-Lecture01 ... (脚本实际输出: Hello, world!)
# 查看元数据
print(pages[0].metadata)
# 输出: {'source': '...', 'page': 0}
3.2 加载 YouTube 音频 (YoutubeAudioLoader + OpenAIWhisper) 📺
想让 AI 总结 YouTube 视频?我们可以先提取音频,再用 OpenAI 的 Whisper 模型转录成文字。
注意 :这需要安装
yt_dlp,pydub,librosa以及ffmpeg。同时需要 OpenAI API Key (Whisper 服务)。
python
from langchain_community.document_loaders.generic import GenericLoader
from langchain_community.document_loaders.parsers import OpenAIWhisperParser
from langchain_community.document_loaders.blob_loaders.youtube_audio import YoutubeAudioLoader
url = "https://www.youtube.com/watch?v=jGwO_UgTS7I"
save_dir = "docs/youtube/"
# 组合加载器:下载音频 + 转录文字
loader = GenericLoader(
YoutubeAudioLoader([url], save_dir),
OpenAIWhisperParser()
)
docs = loader.load()
print(docs[0].page_content[0:500])
# 输出: Welcome to CS229 Machine Learning. Andrew Ng here. ...
3.3 加载网页 (WebBaseLoader) 🌐
想爬取网页内容?WebBaseLoader 可以帮你搞定。它会自动去除 HTML 标签,只保留文本。
python
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://github.com/basecamp/handbook/blob/master/37signals-is-you.md")
docs = loader.load()
print(docs[0].page_content[:500])
# 输出: 37signals Is You ...
3.4 加载 Notion (NotionDirectoryLoader) 📝
Notion 是很多人的知识库。你可以先将 Notion 页面导出为 Markdown/CSV,然后加载。
python
from langchain_community.document_loaders import NotionDirectoryLoader
loader = NotionDirectoryLoader("docs/Notion_DB")
docs = loader.load()
print(docs[0].page_content[:200])
# 输出: # Blendle's Employee Handbook ...
📝 飞哥总结
- 标准化接口 :无论来源是 PDF 还是 YouTube,加载后都是统一的
Document对象。 - 元数据很重要 :
metadata(如页码、来源)在后续的检索环节非常有用,可以帮你定位答案的出处。 - 依赖管理 :不同的 Loader 需要不同的依赖包(如
pypdf,yt_dlp),用到什么装什么。
一句话记住它 💡:Document Loaders 就像是 AI 的"进食口",把各种"生食"(原始数据)加工成 AI 能消化的"熟食"(标准文档对象)!