1. 工业级Agent检索系统的核心痛点与解决思路
在构建工业级Agent检索系统的过程中,开发者们普遍面临着两个令人头疼的问题:"搜不到"和"搜不准"。这两个问题看似简单,实则严重影响了RAG(Retrieval-Augmented Generation)系统的实际应用效果。
1.1 "搜不到"问题的本质
"搜不到"问题通常表现为:明明知识库中存在相关答案,但系统却无法召回这些文档。这种情况往往源于单一检索方式的局限性:
- 向量检索的盲区:虽然擅长捕捉语义相似性,但对于特定关键词、数字、日期等精确信息的匹配能力较弱
- 关键词检索的局限:过于依赖字面匹配,无法理解同义词、近义词或语义相近但表述不同的内容
在实际案例中,当用户查询"2025年Q1的A100芯片销量"时,向量检索可能返回"2024年GPU市场概览",而关键词检索则可能返回"A100驱动安装指南"——两者都与真实需求相去甚远。
1.2 "搜不准"问题的根源
"搜不准"问题则表现为:系统召回了相关文档,但排序不合理,真正有用的信息被埋没在一堆似是而非的结果中。这主要源于:
- 不同检索方式评分标准不统一
- 缺乏对检索结果的精细化评估
- 没有考虑文档与查询的多维度相关性
1.3 混合检索的解决之道
针对上述问题,混合检索方案应运而生。其核心思想是:
- 双路并行召回:同时使用向量检索和关键词检索,确保不遗漏任何可能的候选文档
- 结果融合与精排:通过科学的方法合并两种检索结果,再使用更精细的模型进行重排序
这种方案就像同时聘请了"印象派画家"和"严谨会计"来协同工作——前者把握整体语义,后者确保细节准确,最后再由一位"资深编辑"对结果进行精修。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 混合检索的架构设计与实现
2.1 漏斗理论:搜索的本质过程
搜索本质上是一个"由粗到细"的筛选过程,可以用漏斗理论完美解释:
code复制海量文档库
↓
L1检索:快速召回候选文档(毫秒级)
↓
L2重排序:精细评估Top候选(百毫秒级)
↓
最终结果
2.1.1 L1检索阶段的设计要点
L1阶段的核心目标是"快"和"全",需要:
- 采用近似最近邻(ANN)算法加速向量检索
- 使用倒排索引优化关键词检索
- 设置合理的召回数量(通常为最终需求的5-10倍)
2.1.2 L2重排序阶段的关键考量
L2阶段则追求"精"和"准",特点是:
- 使用计算成本更高但精度更好的模型
- 只对少量候选文档进行处理
- 综合考虑多维度相关性特征
2.2 双路召回的具体实现
实现双路召回时,需要注意以下几个技术细节:
2.2.1 并行执行优化
java复制// Java示例:使用CompletableFuture实现并行检索
CompletableFuture<List<Document>> vectorFuture =
CompletableFuture.supplyAsync(() -> vectorStore.search(query, candidateSize));
CompletableFuture<List<Document>> keywordFuture =
CompletableFuture.supplyAsync(() -> esClient.bm25Search(query, candidateSize));
// 等待两者完成
List<Document> vectorDocs = vectorFuture.join();
List<Document> keywordDocs = keywordFuture.join();
2.2.2 候选文档数量设置
经验公式:
code复制candidateSize = topK * expansionFactor
其中:
- topK:最终需要的文档
