为什么Mindory最终选择了基于字符(Character) 的分块方式,而不是听起来更“智能”的句子或词语分割?这背后是一系列与产品定位紧密相关的工程权衡。
1. Mindory的核心产品定位
首先需要明确,Mindory并非一个通用型的 RAG问答项目。它是一套本地优先、面向阅读的系统,其立场非常鲜明:
- 以书籍为中心,而非各种零散的文档或数据库。
- 以阅读体验为核心,而非仅仅提供问答。
- 强调 AI的理解 必须与原文的具体位置强绑定。
- 工程上优先追求:确定性、可追溯性和可测试性。
这样的定位带来了一条不容妥协的铁律:
每一个用于生成向量(Embedding)的文本块(chunk),都必须能够精准、无歧义地定位回原始文本。
不是近似匹配,也不是启发式推断,必须是完全确定且可复现的映射关系。仅仅这一条,就足以淘汰许多“理论上更优”的分块方案。
2. 分块的真正目的
分块存在的唯一目的是什么?是为 Embedding Model 提供一个大小合理的语义窗口。请注意,分块并不直接负责:
这些能力主要由其他机制来保障,例如分块间的重叠(chunk overlap)、检索时的Top-k聚合以及最终整合信息的LLM。在评估方案时,明确这一点至关重要。
3. 评估三大主流分块策略
我们将在Mindory的真实约束下(而非抽象的理论最优),来审视三种典型的分块方案。
方案一:基于句子/词语的分块
核心思路:按照句子或词语的边界来切分文本,确保每个分块在语言学上“语义完整”。这在传统NLP领域非常流行。
隐藏的代价:
- 丧失确定性:句子边界并非绝对可靠。不同的写作风格、语言(尤其是中文无显式句号时)、小说诗歌等特殊文体,乃至OCR生成的残损文本,都会让句法分析退化为启发式规则,丧失确定性。
- 破坏可追溯性:Mindory要求
processed_text_char_index能精确映射到original_text_char_offset。感知句子的分块会产生变长的、非线性偏移的分块,导致跨边界的合并与拆分,使得精准高亮、跳转和溯源变得异常复杂(例如,意识流小说的单句可能极长)。
- 用户收益不明显:用户并不直接阅读原始分块。他们看到的是LLM生成的答案以及被高亮的原文段落。一个符合NLP理论的“完美句子”,并不会直接提升用户的阅读体验。
结论:此方案与Mindory的确定性原则冲突,降低了可追溯性,增加了工程复杂度,却未带来明显的用户价值。
方案二:基于Tokenizer的分块
核心思路:按照目标Embedding Model的Token进行分块,试图与模型“理解”文本的方式对齐。
面临的现实问题:
- 坐标系的混乱:Token、字符和原文位置无法建立干净、单调的映射关系。分词器引入的特殊Token、空格处理、文本归一化等操作,直接破坏了Mindory依赖的清晰位置映射。
- 架构污染:Mindory的设计原则是 “Embedding Model 可替换,数据处理管道(Pipeline)保持稳定”。基于Token的分块将这一关系颠倒,导致Pipeline与特定模型强绑定,分词器的选择渗透到数据导入流程,极大增加了更换模型的风险和成本。
- 收益边际化:在真实的RAG产品场景中,分词级别的那一点精度提升,几乎无法转化为用户可感知的体验改善。
结论:此方案破坏了文本可追溯性,与模型过度耦合,用户可感知的收益却很小。
方案三:基于字符(Character)的分块(Mindory的选择)
核心思路:基于UTF-8字符进行固定长度的分块,中英文通用,并辅以简单可控的重叠(overlap)机制。
为何对Mindory格外有效:
- 完美可追溯:字符偏移量具备稳定性、语言中立性,可以直接、精确地映射回原文。这为精准高亮、可靠跳转和可信引用溯源提供了坚实基础。
- 行为完全确定:相同的输入必然产生相同的分块,没有任何启发式规则或NLP歧义。这对于测试、调试和长期维护具有极高价值。
- “足够好”的语义效果:现代的Embedding Model并不要求完美的句子边界或语言学纯净度。它们只需要:足够的上下文、合理的长度、以及由Overlap保障的上下文连续性。基于字符的固定分块完全满足这三点,是一种 深思熟虑的工程决策。
4. 这会影响AI的理解能力吗?
简短回答:不会。
详细解释:检索过程会同时召回多个相关的分块,分块间的Overlap平滑了边界切割可能带来的语义断裂,而最终的LLM会基于所有召回信息整体重构语义。用户感知不到分块边界,他们只感知最终的回答和被高亮的原文段落。
只要分块长度设置合理(不过短、不孤立),并配以适当的Overlap,其对最终语义理解的影响几乎可以忽略。
总结
Mindory的chunk策略看似简单直白,实则是一次高度对齐其产品目标、用户体验和架构简洁性的选择。它坚定地服务于一个最高优先级:
在Mindory中,可追溯是头等大事。智能,是建立在此基础之上的事情。
这种以确定性为基石的设计哲学,确保了系统的可靠性和可维护性,为后续的功能迭代和体验优化铺平了道路。
|