系统学习 AI 学习路径:从 GPU 运行时到推理、微调与 RAG 评估

chunking

文档分块策略:按结构、语义和检索目标切分,而不是固定字数硬切

补充说明

分块决定 RAG 的召回上限:块太小会丢上下文,块太大会稀释语义、浪费 token;切在表格、代码块或句子中间,会让检索和生成都变差。分块不是“按 500 字切一刀”,而是结合文档结构(标题、段落、列表、表格、代码)、语义边界和检索粒度做取舍。

常见策略:固定 token/字符窗口(简单基线)、递归字符切分(按段落/句子优先级)、结构感知切分(Markdown 标题、PDF 版面)、语义切分(相邻句子相似度)、父子块/小到大检索(子块召回、父块生成)。中文还要考虑 tokenizer 和标点。

常用示例

# LangChain:递归字符切分,优先按段落/句子断开
from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=600,
    chunk_overlap=80,
    separators=["\n\n", "\n", "。", "!", "?", ";", " ", ""],
)
chunks = splitter.split_text(text)
# LlamaIndex:按句子/ token 切分,并保留元数据
from llama_index.core.node_parser import SentenceSplitter

parser = SentenceSplitter(chunk_size=512, chunk_overlap=64)
nodes = parser.get_nodes_from_documents(documents)
# 结构感知:按 Markdown 标题切分,保留标题路径
from langchain_text_splitters import MarkdownHeaderTextSplitter

splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=[("#", "h1"), ("##", "h2"), ("###", "h3")]
)
sections = splitter.split_text(markdown)
实用起点:
- 块大小:300–800 tokens,按文档类型调整
- 重叠:10%–20%,避免边界信息丢失
- 元数据:标题路径、页码、来源、租户、权限
- 表格/代码:单独成块,保留表头/语言标识

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 块太小和块太大分别会带来什么问题?
  2. 为什么表格和代码块不适合按固定字数切分?
  3. 分块参数应该怎样验证?
答案
  1. 块太小缺少上下文,生成答案不完整;块太大混入多个主题,向量被稀释,召回不准且浪费 token。
  2. 固定字数会切断表头/数据行或代码语法,导致语义丢失;应整体成块或按结构解析。
  3. 用真实问题集测 recall@k、答案正确率和人工抽查,比较不同块大小/重叠/策略,不要只看 embedding 相似度。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令