1. RAG系统设计全景图:从零构建的四大核心模块
作为一名经历过多个RAG项目落地的技术负责人,我深刻理解新手在接触RAG系统时最容易陷入的误区——把各个模块当成独立组件来理解和优化。实际上,一个高效的RAG系统更像是一个精密运转的钟表,每个齿轮的转动都会影响整体性能。让我们先建立完整的认知框架。
1.1 离线解析:知识库的基石工程
离线解析模块是RAG系统的地基,它决定了后续所有模块能建多高。这个阶段的核心任务是将原始文档转化为可检索的结构化知识。在我的项目实践中,完整的处理流水线通常包含以下步骤:
-
文档预处理:处理PDF/Word/HTML等异构格式,使用Apache Tika或MinerU进行版面分析和OCR识别。这里有个关键细节:保留文档的原始层级结构(章节标题、列表编号等),这些元数据对后续chunk划分至关重要。
-
智能分块(Chunking):这是影响系统效果最关键的参数之一。我们采用动态窗口算法:
- 基础chunk大小为300-500 token(根据后续测试LLM的上下文窗口调整)
- 设置50 token的重叠区域(overlap)避免边界信息丢失
- 在自然段落/列表项/表格等语义边界处强制分割
-
向量化处理:选用BGE-M3作为embedding模型,它不仅生成768维的稠密向量,还会输出lexical weight用于后续混合检索。对于专业领域,建议用业务数据做domain adaption微调。
-
索引构建:采用多级索引策略:
- 向量索引:Milvus集群部署,IVF_FLAT索引类型(召回率与性能的平衡)
- 关键词索引:Elasticsearch构建BM25倒排索引
- 元数据索引:记录每个chunk的来源文档、章节路径、创建时间等
实战经验:在金融领域的项目中,我们发现加入"文档重要性权重"(如监管文件>内部指引>历史案例)可以显著提升检索质量。这需要在离线阶段就标注好相关元数据。
1.2 Query理解:搜索的智能调度中心
当用户输入"去年发布的理财产品中收益率超过5%的有哪些"这样的查询时,Query理解模块需要完成以下关键解析:
- 意图识别:通过finetune的BERT模型判断这是"产品查询"意图,而非客服咨询或操作指引
- 实体抽取:
- 时间实体:"去年" → 2023年
- 数值条件:"收益率>5%"
- 产品类型:"理财产品"
- 查询改写:
- 原query:"收益率超过5%"
- 改写为:"年化收益率>5% OR 预期收益>5%"(覆盖不同表述)
- 路由决策:根据意图选择"产品索引"而非通用知识库检索
我们构建了一个轻量级规则引擎来处理特殊场景:
python复制if 检测到"最新"、"最近"等时间敏感词:
添加时间排序权重
elif 查询包含"怎么操作"、"步骤"等:
优先返回操作手册类文档
1.3 在线召回:精准检索的艺术
检索阶段绝不是简单的向量相似度计算,而是多策略融合的精密过程:
- 混合检索:
- 向量检索:cosine相似度Top100
- 关键词检索:BM25得分Top100
- 使用
