No history yet

数据清洗分块策略

超越固定窗口

在构建企业知识库时,我们面对的原始数据往往是复杂的PDF、扫描件和各种非结构化文档。简单的固定长度分块,就像用一把固定的尺子去裁剪一件定制西装,常常会把完整的句子或段落拦腰截断,破坏了信息的上下文完整性。这种粗糙的方法在面对法律条款或技术手册这类逻辑严谨的文档时,其弊端尤为明显。

为了解决这个问题,我们需要更智能的分块策略。与其盲目地切割字符,不如让文档自身的结构来引导我们。这就是“启发式分块”和“结构化分块”的用武之地。这些方法尊重文档的内在逻辑,比如根据标题、段落、列表或代码块来进行分割,确保每个分块都是一个相对独立的知识单元。

深入语义:当结构不足时

结构化分块极大地提升了知识单元的完整性,但它并非万能。在许多现实场景中,一个长段落或一个章节内可能混合了多个不同的子主题。例如,一篇产品介绍可能在同一段里先讲功能A,再讲功能B。如果仅按段落分块,用户查询功能A时,检索到的内容会包含不相关的B,影响了答案的精确度。

这时,我们需要一种更深层次的方法,它能理解文字的“含义”而非仅仅是“形式”。这就是语义分块的切入点。它不依赖于换行符或标题,而是通过分析句子之间的语义关联来动态地划分边界。当话题发生转变时,即便没有明显的格式分隔,语义分块也能精准地识别并切分。

Lesson image

实现语义分块的核心在于将文本转化为机器可以理解的数学形式,即“嵌入向量”。每个句子或短语都被一个高维向量所代表,这个向量捕捉了它的核心语义。

算法会逐句计算相邻句子嵌入向量之间的“距离”或“相似度”。当两个连续句子之间的语义距离突然增大,超过一个预设的阈值时,系统就判定这里发生了一个话题跳跃。这就像在对话中,当一个人突然从讨论天气转向讨论电影时,我们能立刻感知到话题的切换。这个“感知”到的切换点,就是新的分块边界。

处理复杂文档的组合拳

面对企业中大量扫描的PDF和包含图表的报告,单一的分块策略往往力不从心。我们需要一套组合拳来应对这些多模态数据。

首先,对于表格和图表,关键在于“文本化提取”。利用光学字符识别(OCR)和专门的表格识别工具,我们可以将视觉信息转化为结构化的文本。例如,一个表格可以被转换成Markdown格式,而一个柱状图可以被描述为:“图表显示,2023年第一季度销售额为100万,第二季度为120万……”。这样,原本对语言模型不可见的视觉数据,就变成了可供检索和分析的文本信息。

其次,为了在检索时既能获得精确的细节,又不失宏观的背景,我们可以采用父子文档检索(Parent-Document Retrieval)架构。在这种架构中,我们将文档分割成较小的、精确的“子文档”(例如,一个法律条款的具体某一项),用于精确匹配用户查询。同时,我们保留了包含这些子文档的更大范围的“父文档”(例如,该条款所属的整个章节)。

当用户的查询匹配到一个子文档时,系统不仅返回这个精确的片段,还会一并提供其所在的父文档。这使得大语言模型在生成答案时,既能利用子文档的精确信息,又能参考父文档的完整上下文,从而生成更全面、更准确的回答。

最后,我们还需要根据最终的应用任务来定制分块策略,即“任务感知分块”。如果最终任务是生成一个简短摘要,那么分块可以相对较大,以包含足够的信息。但如果任务是进行需要多个知识点串联的“多跳推理”,那么更小、更原子化的分块会更有利于模型准确定位和组合信息。

没有一种分块策略是万能的。成功的企业级知识库,其背后必然是一套精心设计、针对不同数据类型和业务场景的、灵活组合的数据处理流水线。

Quiz Questions 1/5

为什么简单的固定长度分块策略在处理如法律条款等逻辑严谨的文档时效果不佳?

Quiz Questions 2/5

“语义分块”是如何决定在哪里切分文档的?