agentic_huge_data_base / wiki
页面 RAGFlow · 9.2 查询处理与混合检索·DeepWiki 中文全文译文

9.2 · 查询处理与混合检索(Query Processing and Hybrid Search)

复杂文档理解与引用检索 · 聚焦本章的模块关系、源码依据与实现要点。

项目RAGFlow 章节9.2 状态全文译文 模块检索、召回与索引、入库与解析、文档对象与元数据、系统架构
源码线索
  • api/db/__init__.py
  • api/db/db_models.py
  • api/db/services/dialog_service.py
  • api/db/services/document_service.py
  • api/db/services/file_service.py
  • api/db/services/knowledgebase_service.py
  • api/db/services/llm_service.py
  • api/db/services/task_service.py
  • api/db/services/user_service.py
  • common/metadata_utils.py
模块标签
  • 检索、召回与索引
  • 入库与解析
  • 文档对象与元数据
  • 系统架构
  • 界面与交互

章节正文

查询处理与混合检索

查询处理与混合搜索

相关源文件

本章引用的主要源码文件:

  • api/db/__init__.py
  • api/db/db_models.py
  • api/db/services/dialog_service.py
  • api/db/services/document_service.py
  • api/db/services/file_service.py
  • api/db/services/knowledgebase_service.py
  • api/db/services/llm_service.py
  • api/db/services/task_service.py
  • api/db/services/user_service.py
  • common/metadata_utils.py
  • common/query_base.py
  • deepdoc/parser/paddleocr_parser.py
  • memory/services/query.py
  • rag/nlp/query.py
  • rag/nlp/rag_tokenizer.py
  • rag/nlp/search.py
  • rag/nlp/term_weight.py
  • rag/prompts/meta_filter.md
  • rag/raptor.py
  • rag/svr/task_executor.py
  • test/unit_test/common/test_apply_semi_auto_meta_data_filter.py
  • test/unit_test/common/test_metadata_filter_operators.py
  • web/src/components/metadata-filter/index.tsx
  • web/src/components/metadata-filter/metadata-filter-conditions.tsx
  • web/src/components/metadata-filter/metadata-semi-auto-fields.tsx
  • web/src/components/originui/time-range-picker.tsx
  • web/src/components/paddleocr-options-form-field.tsx
  • web/src/components/ui/input-select.tsx
  • web/src/pages/user-setting/setting-model/modal/paddleocr-modal/index.tsx

本文档介绍了驱动 RAGFlow 检索系统的查询处理管线与混合搜索机制。内容涵盖用户查询的预处理、转换为搜索向量、与基于关键词的搜索相结合,以及在文档存储中执行查询的完整流程。

概述

RAGFlow 实现了一种结合以下三种策略的混合搜索方案:

  • 向量搜索:通过 MatchDenseExpr rag/nlp/search.py:61 使用嵌入向量模型进行语义相似度匹配。
  • 全文搜索:通过 MatchTextExpr rag/nlp/query.py:177-179 使用类似 BM25 的算法进行关键词匹配。
  • 融合:使用 FusionExpr rag/nlp/search.py:25 对两种搜索方法进行加权组合。

查询处理流程包括语言检测、多轮对话的查询优化、关键词提取,以及由 rag/nlp/search.py 中的 Dealerrag/nlp/search.py:37-41 管理的自适应搜索策略。

查询预处理管线

在执行搜索之前,用户查询会经过多个预处理步骤,以提高检索质量。

多轮对话的查询优化

当用户进行多轮对话时,RAGFlow 可以选择性地通过引入前几轮对话的上下文来优化查询。rag/nlp/query.py 中的 FulltextQueryer 类处理了将自然语言问题转换为结构化查询表达式的核心逻辑 rag/nlp/query.py:27-40

查询优化流程图

RAGFlow · 多轮对话的查询优化 · 图 1
RAGFlow · 多轮对话的查询优化 · 图 1

优化过程通常会使用一个大语言模型(LLM)来重写当前查询。此操作在 DialogService 内部通过 full_question 提示词进行管理 api/db/services/dialog_service.py:51。然后,FulltextQueryer.question 方法会准备包含优化后文本的 MatchTextExpr rag/nlp/query.py:41-94

来源:rag/nlp/query.py:27-94, api/db/services/dialog_service.py:51, rag/nlp/query.py:41-94

跨语言查询处理

RAGFlow 通过检测查询语言并可选地进行翻译来支持跨语言检索。rag_tokenizer 提供了处理繁简体中文转换和全角半角字符规范化的工具 rag/nlp/query.py:53-54

RAGFlow · 跨语言查询处理 · 图 2
RAGFlow · 跨语言查询处理 · 图 2

rag/prompts/generator.py 中的 cross_languages 函数由 DialogService 调用,用于规范化问题语言 api/db/services/dialog_service.py:51

来源:rag/nlp/query.py:52-60, api/db/services/dialog_service.py:51, rag/nlp/rag_tokenizer.py:1-20

关键词提取与词项加权

为了增强检索效果,RAGFlow 会提取关键词并分配权重。

  • 词项加权:权重基于词性标注和频率数据计算得出 rag/nlp/query.py:29-30
  • 同义词:通过 synonym.Dealer 查找,并以降低的权重(例如 w/4.0)添加到查询中 rag/nlp/query.py:68-72
  • 提取逻辑FulltextQueryer 会拆分查询并为每个 Token 生成词项权重 rag/nlp/query.py:105-115

来源:rag/nlp/query.py:27-30, rag/nlp/query.py:60-72, rag/nlp/query.py:105-115

混合搜索架构

核心搜索机制通过加权融合策略,将向量相似度与关键词匹配相结合。

搜索组件架构
RAGFlow · 搜索组件架构 · 图 3
RAGFlow · 搜索组件架构 · 图 3

来源:rag/nlp/search.py:37-61, rag/nlp/query.py:27-40, rag/nlp/search.py:132-170

向量搜索组件

向量搜索组件使用嵌入向量进行语义匹配。

  • 度量:余弦相似度是标准度量 rag/nlp/search.py:61
  • 列选择:系统会根据维度识别合适的向量列,例如 q_{len}_vec rag/nlp/search.py:60
  • 编码:通过 emb_mdl.encode_queries 调用嵌入向量模型 rag/nlp/search.py:54

来源:rag/nlp/search.py:53-61, api/db/services/llm_service.py:120-134

全文搜索组件

全文搜索针对 FulltextQueryer 中定义的多个字段进行,并带有特定的权重提升 rag/nlp/query.py:31-39

  • title_tks^10
  • important_kwd^30
  • question_tks^20
  • content_ltks^2

来源:rag/nlp/query.py:31-39, rag/nlp/search.py:173-180

融合策略

Dealer 类通过将 MatchTextExprMatchDenseExprFusionExpr 结合来实现混合融合。

  • 融合执行:系统会创建一个 FusionExpr 并将其传递给数据存储的搜索方法 rag/nlp/search.py:175-180

来源:rag/nlp/search.py:25, rag/nlp/search.py:175-180

元数据过滤

RAGFlow 支持在检索过程中进行复杂的元数据过滤。Dealer.get_filters 方法将请求参数映射到数据库字段 rag/nlp/search.py:120-130

参数数据库字段描述
kb_idskb_id知识库标识符
doc_idsdoc_id文档标识符
available_intavailable_int状态过滤器(激活/未激活)
knowledge_graph_kwdknowledge_graph_kwd知识图谱(KG)特定过滤器
entity_kwdentity_kwd实体过滤器

common/metadata_utils.py 中的 apply_meta_data_filter 函数负责处理应用这些规则的逻辑,包括支持“自动”(由大语言模型(LLM)生成)、“半自动”和“手动”模式 common/metadata_utils.py:38

来源:rag/nlp/search.py:120-130, common/metadata_utils.py:38, api/db/services/dialog_service.py:38

搜索执行流程

搜索过程由 Dealer.search 方法编排,该方法负责处理分页、字段选择和结果修剪。

RAGFlow · 搜索执行流程 · 图 4
RAGFlow · 搜索执行流程 · 图 4

来源:rag/nlp/search.py:77-118, rag/nlp/search.py:132-180

RAPTOR 与 GraphRAG 集成

查询处理还与高级检索结构进行交互:

  • RAPTORrag/raptor.py 中的 RecursiveAbstractiveProcessing4TreeOrganizedRetrieval 类为树状组织检索构建摘要层 rag/raptor.py:156-172
  • GraphRAG:系统可以针对知识图谱执行搜索,利用 Dealer 中的 knowledge_graph_kwd 和基于实体的过滤器等字段 rag/nlp/search.py:126-127task_executor.py 负责处理 GRAPH_RAG 任务类型 rag/svr/task_executor.py:125

来源:rag/raptor.py:156-186, rag/svr/task_executor.py:122-128, rag/nlp/search.py:126-127