分块策略(固定、句子、语义)
比较固定大小、感知句子边界和语义分块对检索质量的取舍。
分块策略(固定、句子、语义) 是 CoddyKit 上的免费 AI Agents 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Agents 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Agents 课程共包含 4 节课。
为什么要分块
您不能将一份完整的 200 页 PDF 作为一个向量生成嵌入——这个向量会过于抽象,无法匹配具体查询。您需要将文档分成更小的片段(每个约 200–800 个令牌),分别生成嵌入,然后在分块层级进行搜索。
固定大小分块
最简单的方法——每隔 N 个字符或令牌进行拆分:
def fixed_chunks(text, chunk_size=1000, overlap=200):
chunks = []
i = 0
while i < len(text):
chunks.append(text[i:i + chunk_size])
i += chunk_size - overlap
return chunks
sample_text = "A" * 2500
chunks = fixed_chunks(sample_text, chunk_size=1000, overlap=200)
print(f"Split {len(sample_text)} characters into {len(chunks)} chunks")
for i, c in enumerate(chunks):
print(f"Chunk {i+1}: {len(c)} chars")
为什么要重叠
重叠部分(通常为分块大小的 10%–20%)可以确保跨越边界的句子至少在一个分块中保持完整。没有重叠时,被拆分到不同分块中的关键信息可能无法被检索到。
基于句子的分块
在句子边界处拆分——绝不在句子中间截断:
import re
def sentence_chunks(text, max_chars=1000):
sentences = re.split(r'(?<=[.!?])\s+', text)
chunks = []
current = ''
for s in sentences:
if len(current) + len(s) > max_chars and current:
chunks.append(current.strip())
current = s
else:
current += ' ' + s
if current:
chunks.append(current.strip())
return chunks
sample_text = "This is sentence one. This is sentence two! Is this sentence three? Yes it is."
chunks = sentence_chunks(sample_text, max_chars=40)
for i, c in enumerate(chunks):
print(f"Chunk {i+1}: {c!r}")
递归拆分(LangChain)
LangChain 的 RecursiveCharacterTextSplitter 会优先尝试在段落边界处拆分,然后是句子边界,最后是单词边界——尽可能保留结构。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=100,
separators=['\n\n', '\n', '. ', ' ']
)
chunks = splitter.split_text(document)语义分块
在主题发生变化的地方拆分。具体实现会为每个句子生成嵌入,并在相邻句子的嵌入向量相距较远的位置进行拆分。
计算速度较慢,但生成的分块在主题上更加连贯。
Markdown 感知分块
对于 Markdown 文档,请在标题边界处拆分,以保持各个部分的完整。每个分块都会继承其父级标题作为上下文。
代码感知分块
对于源代码,请按照函数或类的边界拆分,而不是按字符数拆分。tree-sitter 等工具可以提供 AST 感知的分块。
选择分块大小
需要权衡:
- 小分块(约 200 个令牌)——匹配更精确,但需要管理更多分块
- 大分块(约 1000 个令牌)——每次匹配包含更多上下文,但精确度较低
默认设置:500–800 个令牌,重叠比例为 10%–20%。
保留元数据
为每个分块附加元数据:
- 来源 URL / 文件路径
- 页码
- 文档标题
- 部分或标题
- 创建或更新时间戳
这些信息可用于过滤、引用和重新排序。
带上下文的分块
一种较新的技术:在每个分块前添加一行由 LLM 生成的上下文(例如“此分块来自公司 2024 年第二季度财务报告,讨论收入情况。”)。可将检索效果提升 30%–50%。
父子分块
为实现精确匹配而索引小分块,但检索其较大的父级段落以获取上下文:
- 为句子级分块生成嵌入
- 匹配后,返回包含 800 个令牌的父级分块
为什么要重叠
为什么分块通常要重叠 10%–20%?
回顾
首先使用递归字符拆分,将分块大小设为约 800 个令牌,重叠比例设为 10%。随着需求增长,再增加语义或结构感知能力。
常见问题解答
「分块策略(固定、句子、语义)」课时是免费的吗?
是的 — 「分块策略(固定、句子、语义)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Agents 课程的其余内容,请升级到 CoddyKit PRO。 AI Agents 课程共包含 4 节课。
「分块策略(固定、句子、语义)」这节课中我会学到什么?
比较固定大小、感知句子边界和语义分块对检索质量的取舍。 你通过在浏览器中直接运行的动手代码来练习 AI Agents,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Agents 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Agents 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「分块策略(固定、句子、语义)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Agents 课中编写并运行代码吗?
能。每节 AI Agents 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- RAG 解决什么问题(知识截止时间、幻觉)
- 分块策略(固定、句子、语义)
- 为文档集建立索引
- 使用 FAISS 或 Chroma 构建朴素 RAG