跳到正文

RAG 知识库搭建流程?

文档预处理、分块、向量化与索引构建全解析

原题:请描述搭建RAG(Retrieval-Augmented Generation)系统中知识库的主要流程,包括文档预处理、分块、向量化存储及检索索引构建等关键步骤。

文档处理 · 美团真题

回答与解析

1. 文档预处理

  • 格式解析:用PyPDF2python-docx等提取文本,扫描件需OCR(PaddleOCR/EasyOCR)
  • 清洗去噪:去除页眉页脚、特殊符号、重复内容,保留表格/标题结构信息
  • 元数据标注:记录文档来源、章节、时间戳,用于过滤和溯源

2. 文本分块(Chunking)

策略 特点 适用场景
固定长度 简单高效,可能切断语义 通用场景,追求速度
递归分块 按标点层级分割,保持句子完整 大多数文本
语义分块 用模型判断语义边界,块大小不均 对连贯性要求高的文档

关键权衡:块太小可能缺上下文,块太大可能引入噪声。应把多组 chunk size 与 overlap 组合放进同一评测集,比较召回、答案质量和成本。

3. 向量化与存储

  • Embedding选型:中文用BGEM3E,多语言用E5OpenAI text-embedding-3
  • 向量数据库:Milvus(大规模)、Qdrant(易用)、Elasticsearch(混合检索方便)
  • 索引构建:HNSW(图索引,召回率高)、IVF-PQ(内存友好),根据数据规模和延迟要求选择

4. 检索优化

  • 混合检索:向量相似度 + 关键词匹配(BM25),用RRF融合排序
  • 查询改写:扩展同义词、纠错,提升召回
  • 重排序(Rerank):用Cross-Encoder精排Top-K结果

学习建议

建议系统学习该知识点

口语版讲法(约4分钟)

  • 定位:RAG知识库搭建本质是质量与延迟的平衡
  • 预处理:格式解析与元数据,扫描件OCR的坑
  • 分块:固定长度与语义切分的适用边界,重叠窗口
  • 向量化与索引:Embedding选型、HNSW与IVF-PQ的取舍
  • 检索优化:混合检索与重排序,落地风险

这道题我觉得本质上不是在问流程,而是在问你怎么在检索质量、存储成本和响应延迟之间做取舍。搭建RAG知识库,我一般会按预处理、分块、向量化、索引构建、检索优化这几个环节来走,但每个环节都有很多坑,我重点说几个。

先说文档预处理。这一步核心是格式解析和清洗。比如PDF,如果是文本型的,用PyPDF2或者python-docx直接提取就够;但如果是扫描件,那就必须走OCR,我会用PaddleOCR或者EasyOCR。这里有个坑,OCR识别率不是100%,尤其表格和数字,识别错了直接带偏后续检索。所以我会在清洗阶段保留结构信息,比如标题、表格的边框,同时标注元数据,比如文档来源、章节、时间戳,这样后面检索时可以按时间过滤,也能溯源。

预处理完就是分块,这是最影响检索质量的环节之一。很多人一上来就照搬一个固定长度分块,简单高效,但很容易切断一句话,导致语义不完整。真正落地时我会看场景:如果是客服退款政策这种结构清晰的文档,我倾向于用Chunk递归分块,按句号、换行层级切,尽量保持段落完整;如果是长篇小说或者对话记录,对连贯性要求高,那就得上语义分块,用模型判断语义边界。但语义分块也有代价,块大小不均匀,索引效率低。所以我的取舍是把递归分块、语义分块与多组 chunk size、overlap 组合都作为候选,用同一评测集比较边界召回、答案正确率、索引体积和延迟。参数过小可能缺上下文,过大可能引入噪声,不能脱离数据直接给默认值。

分完块就要向量化。中文Embedding我常用BGE或者M3E,多语言场景用E5。选型上我会优先看它在领域数据上的召回率,而不是盲目追新。存储方面,向量数据库我选过Milvus和Qdrant。Milvus适合大规模、高并发,但运维成本高;Qdrant上手快,小规模够用。索引构建是性能关键,HNSW召回率高,但内存消耗大;IVF-PQ内存友好,但召回率会降。我一般先评估数据量:百万级以内用HNSW,千万级以上用IVF-PQ做量化,再调nprobe参数平衡速度和精度。

最后是检索优化,这里有两个点。一是混合检索,把向量相似度和关键词匹配(比如BM25)结合起来,用RRF融合排序。为什么呢?因为向量擅长语义相似,但精确匹配不行,比如订单号、错误码,关键词搜更准。二是重排序,对Top-K结果用Cross-Encoder精排,提升最终质量。但重排序有延迟,所以我会控制K值,比如先召回20条,重排后取前5。

其实还有一个方向我没展开,就是知识库更新频繁时,怎么保证索引的实时性和一致性。比如新增文档,直接增量插入;但删除和修改,如果原地动图索引,召回率会崩,我会用软删除加异步重建。

所以整体上,我更倾向把知识库搭建看作一个持续调优的过程,而不是一次性工程。前提是数据质量要过关,如果源文档噪声太大,后面所有环节都会打折扣。常见失败场景就是预处理没做好,导致检索结果一堆垃圾,用户直接弃用。上线后我会特别关注Recall@K和延迟的监控,定期做bad case分析。

关键一句:知识库频繁更新时,如何平衡索引实时性与检索质量,特别是删除和修改操作的处理

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设咱们要给电商客服做个智能问答,需要把商品手册、售后政策这些文档都喂进去。你拿到一堆PDF和Word,第一步会怎么处理?从原始文档到能检索的知识库,关键步骤有哪些?

  2. 问法 2 · 层层追问

    RAG系统里知识库的构建流程你了解吗?……文档进来之后,你是怎么把长文本切成小段的?……切完怎么转成向量存起来?检索的时候怎么保证又快又准?

  3. 问法 3 · 直球架构

    直接说,搭建一个RAG知识库,从文档预处理、分块、向量化到索引构建,整个流程你怎么设计?每个步骤选什么工具或策略?为什么?

同模块相关题目