0Pricing
AI Agents · 课时

分块策略(固定、句子、语义)

比较固定大小、感知句子边界和语义分块对检索质量的取舍。

分块策略(固定、句子、语义) 是 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%。

父子分块

为实现精确匹配而索引小分块,但检索其较大的父级段落以获取上下文:

  1. 为句子级分块生成嵌入
  2. 匹配后,返回包含 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. RAG 解决什么问题(知识截止时间、幻觉)
  2. 分块策略(固定、句子、语义)
  3. 为文档集建立索引
  4. 使用 FAISS 或 Chroma 构建朴素 RAG
← 返回 AI Agents