AI 术语表 · 基础 · 语言模型
分块
分块(chunking)是把文档切分成名为“块”(chunk)的小片段,以便 AI 检索和利用长文档的工作。它主要是在构建 RAG 这类由 AI 查找外部资料来回答问题的系统时,事先要经过的准备步骤。
工作原理
首先,按固定长度、段落或句子等单位切分文档。切出的每个片段都会被转换成一串称为“嵌入”的数字。嵌入是用数字来表示文本含义的方式。这样转换后的片段存储在向量数据库中。用户提问时,系统找出与问题含义最接近的片段交给 AI,AI 参考这些内容作答。根据 Anthropic 的说明,单个片段的长度通常不超过几百个 token。
为什么重要
Pinecone 从两个方面解释了需要分块的原因。第一,嵌入模型一次能处理的文本量(上下文窗口)有上限,超出部分会被截掉,可能丢失重要信息。第二,要能被检索到,每个片段都必须包含有用的信息。只由脱离前后文就读不懂的句子组成的片段,在检索中很难被命中。因此,如何切分片段在很大程度上决定了 RAG 回答的质量。
发展历程
起初,常见做法是简单地按固定长度切分文档。2023 年的论文“Dense X Retrieval”提出用“命题”代替段落或句子作为检索单位。命题指只包含一个事实、简短且本身就能读懂的句子,该论文报告称,这样细分后检索性能优于按段落切分。2024 年的论文“RAPTOR”关注的是相反方向的问题,即仅凭短片段难以理解整篇文档。为此,它反复把片段归组并进行摘要,构建出树状结构,使检索可以在从细节到主干的多个层级上进行。Anthropic 于 2024 年 9 月介绍了一种名为“Contextual Retrieval”的方法:在存储前,为每个片段附上一句说明它在整篇文档中处于什么上下文的文字。Anthropic 表示,这样做可以减少检索失败。
注意事项
不存在适用于所有情况的唯一正确大小。片段大,上下文得以保留,但检索不够精确;片段小,检索更精确,却容易丢失上下文。因此,通常的做法是根据文档类型和问题类型试验多种方式后再做选择。Anthropic 还指出,如果全部资料少到能整体放进模型的上下文窗口,那么不做分块、不用 RAG,直接全部放进提示词可能更简单。
示例
假设要做一个根据公司内部规章作答的咨询聊天机器人。把几百页的规章手册按条款或段落切分并存进向量数据库后,当员工问“差旅费报销截止日期是什么时候?”时,就可以只找出包含相应条款的片段交给 AI。此时,如果在片段上一并注明其所属上下文,例如“差旅费规定第 3 章的一部分”,检索效果会更好。Anthropic 介绍的 Contextual Retrieval 正是出自这种思路。