14.2 知识库构建与向量化

高质量的数据是 RAG 系统效果的基石。本节我们将处理“垃圾进,垃圾出”(Garbage In, Garbage Out)的问题。

14.2.1 数据清洗与预处理

格式统一

不同来源的文档需要转换为统一的中间格式(各类 Parser)。

  • PDF:使用 PyMuPDFMarker 提取文本和表格。注意去除页眉页脚的干扰信息。

  • Markdown:保留标题层级结构(Header Metadata),这对于后续检索至关重要。

  • Word/Excel:使用 python-docx / pandas 提取内容。

清洗策略

  • 去除乱码和不可见字符。

  • 合并断行的段落(PDF 常见问题)。

  • 去除无意义的短文本(如“版权所有”)。

14.2.2 文档分块

我们在第 5 章讨论过分块策略,这里我们采用 “语义分块” + “滑动窗口” 的组合策略。

# 伪代码示例:基于 Token 的滑动窗口分块
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=512,      # 块大小
    chunk_overlap=64,    # 重叠部分,保证上下文连续性
    separators=["\n\n", "\n", "", "", ""] # 优先按段落和句子切分
)

实战技巧

  • 父子索引 (Parent-Child Indexing):切分成小块(Child)用于向量检索,但检索到后返回其所属的大块(Parent)或全文给 LLM。这能兼顾检索的精准度和上下文的完整性。

14.2.3 向量化

模型选择

可参考公开的嵌入评测(如 MTEB 等)选择候选模型,并结合自身语料与任务评测集做最终选型。

  • 开源方向:中文/多语言嵌入模型、指令式嵌入模型等。

  • 商用方向:通用嵌入服务,按质量/成本/延迟权衡。

向量库写入

使用向量数据库或带向量扩展的数据库存储向量。务必为每个 Chunk 附带元数据(Metadata):

  • source: 来源文件名

  • page: 页码

  • created_at: 创建时间

  • category: 文档分类(用于后续过滤)

最后更新于