0Pricing
Learn AI with Python · 课时

文档加载、拆分与嵌入

PyPDFLoader、RecursiveCharacterTextSplitter、OpenAIEmbeddings,以及嵌入策略。

文档加载、拆分与嵌入 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

RAG 数据摄取流水线

LLM 要想根据您的文档回答问题,您必须先加载、切分并嵌入这些文档。本课将介绍这条数据摄取流水线,它是每个检索增强生成系统的基础。

pip install langchain-community pypdf langchain-openai

加载 PDF

PyPDFLoader 会读取 PDF,并返回一个文档对象列表,每页对应一个对象。每个文档都有 page_content(文本)和 metadata(来源、页码)。

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("handbook.pdf")
docs = loader.load()
print(len(docs), "pages")

为什么要切分文档

整页内容通常太大,无法进行嵌入或放入提示词。切分会将文本分成更小的片段,使其能够顺利嵌入,并让检索只返回相关段落,而不是整页内容。

RecursiveCharacterTextSplitter

推荐使用的切分器是 RecursiveCharacterTextSplitter。它会先尝试按段落切分,然后按句子、单词切分,尽量保持片段的语义连贯性,而不是从单词中间截断。

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)

分块大小和分块重叠量

chunk_size 设置每个分块的最大字符数;chunk_overlap 会让相邻分块之间重复一部分文本,以免上下文在边界处丢失。1000/200 的分块设置是常见的起点。

chunks = splitter.split_documents(docs)
print(len(chunks), "chunks")
print(chunks[0].page_content[:120])

调整分块大小

较小的分块能带来更精确的检索,但可能遗漏周围的上下文。较大的分块能保留上下文,但会稀释相关性并消耗更多令牌。将重叠量设置为分块大小的 10% 到 20%,通常是衔接边界的良好默认值。

什么是嵌入

嵌入会将文本转换为能够表达其含义的定长数字向量。相似的文本会产生彼此接近的向量。这样我们就能根据语义相似性而不是关键词进行搜索。

OpenAIEmbeddings

使用 OpenAIEmbeddings 创建嵌入。text-embedding-3-small 模型成本低且效果好。embed_query 用于嵌入一个字符串;embed_documents 用于嵌入一个列表。

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector = embeddings.embed_query("How do I reset my password?")
print(len(vector))  # 1536

批量创建嵌入

一次性为所有分块创建嵌入。每个分块都会变成一个向量,之后您可以将其存储在向量数据库中,以便快速进行相似性搜索。

texts = [c.page_content for c in chunks]
vectors = embeddings.embed_documents(texts)
print(len(vectors), "vectors of dim", len(vectors[0]))

估算嵌入成本

嵌入按令牌计费。请估算所有分块中的令牌总数,然后乘以每 1000 个令牌的价格。在嵌入前进行统计,可以避免处理大型语料库时产生意外账单。

import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
total = sum(len(enc.encode(c.page_content)) for c in chunks)
price_per_1k = 0.00002
print("tokens:", total, "cost $:", total / 1000 * price_per_1k)

流水线概要

数据摄取流程如下:加载文档,将其切分为相互重叠的分块,将每个分块嵌入为向量,然后在下一课中将其存储起来。在这里做好分块并关注成本,将决定整个 RAG 系统的质量和价格。

快速检查

测试您对数据摄取的理解。

回顾:加载、切分与嵌入

您使用 PyPDFLoader 加载文档,使用带有 chunk_size 和 chunk_overlap 的 RecursiveCharacterTextSplitter 对文档进行分块,并使用 OpenAIEmbeddings 将分块转换为向量。您还学会了在处理大型语料库前估算每个令牌的嵌入成本。

常见问题解答

「文档加载、拆分与嵌入」课时是免费的吗?

是的 — 「文档加载、拆分与嵌入」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「文档加载、拆分与嵌入」这节课中我会学到什么?

PyPDFLoader、RecursiveCharacterTextSplitter、OpenAIEmbeddings,以及嵌入策略。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「文档加载、拆分与嵌入」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. LangChain 架构与 LCEL
  2. 文档加载、拆分与嵌入
  3. 向量存储:Chroma 与 FAISS
  4. 端到端构建 RAG 问答系统
← 返回 Learn AI with Python