本章节介绍 GC-QA-RAG 智能问答系统的核心检索技术原理,包括向量化策略、混合检索机制、RRF 融合排序等关键实现细节。

1. 检索流程概述

系统采用典型的 RAG(Retrieval-Augmented Generation)三阶段架构,检索阶段的目标是:在用户提问时,结合关键词与语义理解,快速定位最相关的知识点,为后续生成高质量答案提供支撑。

检索流程如下:

  1. 用户输入问题;
  2. 系统对问题进行向量化(稠密+稀疏);
  3. 在知识库中并行检索“问题”和“答案”字段;
  4. 采用 RRF(Reciprocal Rank Fusion)算法融合多路检索结果,返回 TopK 最优答案。

2. 混合检索机制

2.1 多通道检索

系统采用混合检索(Hybrid Search),即同时利用稀疏向量(BM25)和稠密向量(Dense Embedding)两种方式,分别对“问题”和“答案”字段进行检索:

  • 稀疏检索(BM25):适合关键词明确的查询,召回能力强;
  • 稠密检索(Dense Vector):基于语义相似度,适合复杂表达和模糊查询。

每一路检索均获取 TopK=40 条候选结果。

2.2 检索字段

每个知识条目包含四类向量特征:

  • Prefix_Question_Dense
  • Prefix_Answer_Dense
  • Prefix_Question_Sparse
  • Prefix_Answer_Sparse

检索时,用户问题会分别与“预设问题”和“答案”字段的稠密/稀疏向量进行匹配,极大提升了召回率和相关性。

2.3 RRF 融合排序

多路检索结果通过 RRF(Reciprocal Rank Fusion)算法进行融合排序,最终选取 TopK=8 条最优结果返回。RRF 能有效兼顾不同检索通道的优势,提升最终结果的多样性和准确性。

3. 检索实现细节

3.1 向量化与查询

  • 用户问题首先通过 embedding 模型生成稠密向量和稀疏向量(如 BM25 权重);
  • 检索时,分别以“问题稠密”、“答案稠密”、“问题稀疏”、“答案稀疏”四路向量为查询,调用向量数据库(如 Qdrant)的多路预取(Prefetch)接口;
  • 检索结果通过 RRF 融合,去重后返回。

3.2 代码实现要点

以 search.py 为例,核心检索逻辑如下:

  • get_embedding_pair:对输入问题生成稠密和稀疏向量;
  • search_sementic_hybrid_single:对单个知识库集合,分别以四路向量进行预取检索(Prefetch),并通过 RRF 融合排序;
  • search_sementic_hybrid:对所有知识库(如文档、论坛问答、教程)并行检索,合并结果;
  • distinct_search_hits:对检索结果去重,确保每个知识点唯一。

3.3 检索流程示意

用户问题

├─> 生成稠密/稀疏向量

├─> [问题稠密] ─┐
├─> [答案稠密] ─┼─> 多路检索(TopK=40)
├─> [问题稀疏] ─┤
└─> [答案稀疏] ─┘

└─> RRF 融合排序 → TopK=8

└─> 返回检索结果

4. 检索结果的结构与用途

每条检索结果包含:

  • Question:预设问题
  • Answer:标准答案
  • FullAnswer:详细解释
  • Summary:上下文摘要
  • Url、Title、Category、Date 等元数据

这些信息不仅用于直接展示,也为后续大模型生成答案提供丰富上下文。

5. 技术优势与优化点

  • 多路混合检索:兼顾关键词和语义理解,极大提升召回率和准确性;
  • RRF 融合排序:有效融合多通道结果,提升多样性和相关性;
  • Prefix 机制:通过文档类别/标题前缀,避免语义混叠,提升检索精准度;
  • 高效去重:确保每个知识点唯一,避免重复信息干扰。

6. 总结

本系统通过多通道混合检索、RRF 融合排序、丰富的向量化与元数据设计,实现了高效、精准的知识检索能力,为智能问答系统提供了坚实的基础。

历史文章

GC-QA-RAG 智能问答系统的文档切片

了解更多

AI智能体开发指南

GC-QA-RAG 智能问答系统的向量检索的更多相关文章

  1. [python] 向量检索库Faiss使用指北

    Faiss是一个由facebook开发以用于高效相似性搜索和密集向量聚类的库.它能够在任意大小的向量集中进行搜索.它还包含用于评估和参数调整的支持代码.Faiss是用C++编写的,带有Python的完 ...

  2. Improving Commonsense Question Answering by Graph-based Iterative Retrieval over Multiple Knowledge Sources —— 基于多知识库迭代检索的常识问答系统

    基于多知识库迭代检索的问答系统 论文地址 背景 常识问答任务需要引入外部知识来帮助模型更好地理解自然语言问题,现有的解决方案大都采用两阶段框架: 第一阶段 -- 从广泛的知识来源中找到与给定问题相关的 ...

  3. QA问答系统,QA匹配论文学习笔记

    论文题目: WIKIQA: A Challenge Dataset for Open-Domain Question Answering 论文代码运行: 首先按照readme中的提示安装需要的部分 遇 ...

  4. 【转】Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  5. Java 内存模型及GC原理 (转载)

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  6. zz阿里妈妈深度树检索技术(TDM)及应用框架的探索实践

    分享嘉宾:何杰 阿里妈妈 高级算法专家 编辑整理:孙锴 内容来源:DataFun AI Talk 出品社区:DataFun 注:欢迎转载,转载请注明出处 导读:阿里妈妈是阿里巴巴集团旗下数字营销的大中 ...

  7. JVM相关文章和GC原理算法

    参考推荐: Java内存模型及GC原理 一个优秀的Java程序员必须了解的GC机制 Android 智能指针原理(推荐) Java虚拟机规范 Java虚拟机参数 Java内存模型 Java系列教程(推 ...

  8. HMS Core AR Engine 2D图片/3D物体跟踪技术 助力打造更智能AR交互体验

    AR技术已经被广泛应用于营销.教育.游戏.展览等场景.通过2D图像跟踪技术和3D物体跟踪技术,用户只需使用一台手机进行拍摄,即可实现海报.卡牌等平面物体以及文物.手办等立体物体的AR效果.尽管近年来2 ...

  9. java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  10. Java的性能优化

    http://www.toutiao.com/i6368345864624144897/?tt_from=mobile_qq&utm_campaign=client_share&app ...

随机推荐

  1. 【ABAQUS Material】density 行为

    1.overview 进行eigenfrequency . transient dynamic analysis. transient heat transfer analysis. adiabati ...

  2. Golang 入门 : 包名与导入路径

    math/rand包有一个Intn函数,可以生成一个随机数,所以我们需要导入math/rand.然后调用rand.Intn生成随机数. 等一下!Intn来自math/rand包,那为什么我们调用包的时 ...

  3. 在Ubuntu上安装php7.2、php7.3、php7.4

    目录 开始之前 在Ubuntu 18.04或16.04上安装PHP 7.4 更新Ubuntu 添加PHP存储库 安装PHP 7.4 在Ubuntu 16.04上安装PHP 7.2 更新Ubuntu 添 ...

  4. Linux reboot全过程

    一.版本说明嵌入式Linux 下面的reboot命令看似简单,但出问题时定位起来发现别有洞天.下面就按在shell下执行reboot命令之后程序的执行过程进行解析.Busybox:1.23.2     ...

  5. g2o优化库实现曲线拟合

    g2o优化库实现曲线拟合 最近学习了一下g2o优化库的基本使用,尝试着自己写了一个曲线拟合的函数,也就是下面这个多项式函数: \[y = ax^3 + bx^2 + cx + d \] 我们以 \(a ...

  6. go 语言中的占位符详解

    在 Go 语言的 fmt 包中,占位符用于格式化输出,允许在输出时插入变量的值.以下是一些常用的占位符及其用法: 通用占位符: %v:按照值的默认格式输出. %+v:输出结构体时,会添加字段名. %# ...

  7. 一文搞懂Dockerfile

    Dockerfile官网 https://docs.docker.com/reference/dockerfile/ 什么是Dockerfile? Dockerfile 是一个文本文件,其内包含了一条 ...

  8. Spring Boot 根据配置决定服务(集群、单机)是否使用某些主件

    比如:在集群模式下,我想用 Nacos 组件,单机版不想用它. server: name: VipSoft Server Dev port: 8193 cloud: nacos: discovery: ...

  9. 基于 OT-JSON 与 Immer 设计低代码/富文本场景的状态管理方案

    在复杂应用中,例如低代码.富文本编辑器的场景下,数据结构的设计就显得非常重要,这种情况下的状态管理并非是redux.mobx等通用解决方案,而是需要针对具体场景进行定制化设计,那么在这里我们来尝试基于 ...

  10. DP学习总结

    动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. -----OI Wiki 例.1-最大子段和 分析 DP四步 ⑴定义状态 定义\(dp_i\)表示以\(i\)结尾的最大子段 ...