企业级 RAG 的精准召回通常要同时走语义检索与关键词检索,单走一条路可能会漏掉一类问题。
语义检索将文本映射为稠密向量,通过余弦相似度衡量语义距离,擅长打通同义表达------以"上个季度华东区为什么退货变多"为例,语义检索能同时召回"退换货上升""客诉里说不想留货"等相关表述。但是它处理专名的能力很差:产品型号、合同编号、物料代码本身几乎没有语义信息,向量空间里没有对应坐标。
关键词检索基于 Lucene 倒排索引,只匹配精确字符串,错一个字符就无法命中,专名严格匹配。短板正好相反:换个问法就匹配不上。例如"去年退得最多的那款",关键词检索无法对应到具体的产品编号。
两类问题企业里都常见,所以两条路必须并进。
技术选型逻辑:为什么是 BGE-M3(1024维)
语义检索先 embedding,把文字压成一串实数,意思近实数也近。向量维度的选择直接影响资源成本:维度过低可能影响语义区分度,维度更高通常会增加显存和存储成本。一个文档 1024 维 float32 约 4KB,百万文档就是 4GB 向量,还没算索引。
BGE-M3 默认 1024 维,卡在区分度与成本中间,且原生支持稠密、稀疏、多向量三种表征:一次推理同时产出语义相似度用的稠密向量、关键词匹配用的稀疏向量、token 级细粒度匹配的多向量。中英文混排、合同与说明书长短句并存的企业语料,三种表征各补一段。一段文字变 1024 个小数,就是给语义留了一张指纹,多语言与多粒度在这一张指纹里取得平衡,正好适配企业多格式语料。
Milvus 的工程优势
语义检索要在百万级向量里找近邻,全量比不现实,用 ANN 近似最近邻换速度。Milvus 以 IVF_FLAT、HNSW 承载这部分,两种索引算法按数据规模灵活配置。数据量小,IVF 量化把向量分区,先粗定位再细查;数据量大,换 HNSW 图索引跳过大量无关向量------海量非结构化数据的相似度搜索落到毫秒级。
不过代价是HNSW 几乎全驻留 RAM,内存按向量总量预留,节点得留够。随着文档量持续增长,Milvus 集群可通过水平扩展分散压力,避免单点过载。
Elasticsearch的精确匹配补充
在专有名词的匹配上,向量检索存在明显短板。型号"HT-2024-0873"错一位就指向别的东西,语义检索把它当无含义文本忽略,向量里没有对应坐标。
Elasticsearch 底层 Lucene 倒排索引,BM25 全文排序,只认串有没有原样出现,产品型号、专有名词、固定数据表述靠它严格匹配。它也是分布式架构,集群水平扩展,文档多了加节点。企业问答中最容易出错的地方,往往在于编号匹配------差一个字符就可能导致结论完全不同,语义理解偏差反而是次要问题。这类场景通常更依赖关键词检索。
融合召回:语义相似度 + 关键词匹配的权重融合策略与排序调优
两套并进,权重融合策略决定最终排序质量。余弦相似度落在 -1,1,BM25 分数没上界,直接加权相加会被大尺度的路主导,所以向量库旁挂搜索引擎各查各的,不算混合检索。
工程上RRF 只取各自排名倒数融合,绕开分数尺度不可比,简单稳。另一类是先把两路分数归一化再加权相加,通过权重调整召回率与精准率的平衡,权重偏哪边看企业更常吃同义还是专名的亏。
无论选哪类,要再提一档就接 cross-encoder 重排,对 query 与候选句联合打分置顶最相关。权重没有通吃,用离线评测集 recall@10 反复校才是依据。融合这一步兼顾召回率与精准率,是整条链路里最依赖调优、也最具价值的一环。
混合检索如何为 RAG 提供高质量片段, 缓解 大模型幻觉 风险
小艾智能体把上面的工程化召回做成 RAG 的知识底座。BGE-M3 把文档变成向量与稀疏表征,Milvus 存向量做毫秒级 ANN 近邻,Elasticsearch 锁定型号与专名,融合检索把两路并成一个排序再递给大模型。
维护上向量和倒排两套索引管线各自更新,换 embedding 模型存量向量全要重算重灌。小艾把这套维护工作收进统一处理与编排流程,文档自动走切分、向量化、建索引的流水线,模型热切换重算有章法。
提升专名召回覆盖率,并增强同义表达理解能力,幻觉根因------检索给错依据------拦在前面。这也是企业级 RAG 方案、混合检索优化与 RAG 幻觉的重要解决思路:它跑在 LangGraph 工作流与 Agent 编排引擎之上,对外是企业级 Agent 架构的一部分;知识图谱 RAG 再叠实体关系,让找片段变找关联,回答从单段依据走向跨文档逻辑。
工程化召回能力是影响RAG效果上限的重要因素,两套偏科的方法各覆盖一段,有助于提升召回完整性。语义检索管同义,关键词检索卡死专名,融合补缺口。