查询处理与混合检索
查询处理与混合搜索
相关源文件
本章引用的主要源码文件:
api/db/__init__.pyapi/db/db_models.pyapi/db/services/dialog_service.pyapi/db/services/document_service.pyapi/db/services/file_service.pyapi/db/services/knowledgebase_service.pyapi/db/services/llm_service.pyapi/db/services/task_service.pyapi/db/services/user_service.pycommon/metadata_utils.pycommon/query_base.pydeepdoc/parser/paddleocr_parser.pymemory/services/query.pyrag/nlp/query.pyrag/nlp/rag_tokenizer.pyrag/nlp/search.pyrag/nlp/term_weight.pyrag/prompts/meta_filter.mdrag/raptor.pyrag/svr/task_executor.pytest/unit_test/common/test_apply_semi_auto_meta_data_filter.pytest/unit_test/common/test_metadata_filter_operators.pyweb/src/components/metadata-filter/index.tsxweb/src/components/metadata-filter/metadata-filter-conditions.tsxweb/src/components/metadata-filter/metadata-semi-auto-fields.tsxweb/src/components/originui/time-range-picker.tsxweb/src/components/paddleocr-options-form-field.tsxweb/src/components/ui/input-select.tsxweb/src/pages/user-setting/setting-model/modal/paddleocr-modal/index.tsx
本文档介绍了驱动 RAGFlow 检索系统的查询处理管线与混合搜索机制。内容涵盖用户查询的预处理、转换为搜索向量、与基于关键词的搜索相结合,以及在文档存储中执行查询的完整流程。
概述
RAGFlow 实现了一种结合以下三种策略的混合搜索方案:
- 向量搜索:通过
MatchDenseExprrag/nlp/search.py:61使用嵌入向量模型进行语义相似度匹配。 - 全文搜索:通过
MatchTextExprrag/nlp/query.py:177-179使用类似 BM25 的算法进行关键词匹配。 - 融合:使用
FusionExprrag/nlp/search.py:25对两种搜索方法进行加权组合。
查询处理流程包括语言检测、多轮对话的查询优化、关键词提取,以及由 rag/nlp/search.py 中的 Dealer 类 rag/nlp/search.py:37-41 管理的自适应搜索策略。
查询预处理管线
在执行搜索之前,用户查询会经过多个预处理步骤,以提高检索质量。
多轮对话的查询优化
当用户进行多轮对话时,RAGFlow 可以选择性地通过引入前几轮对话的上下文来优化查询。rag/nlp/query.py 中的 FulltextQueryer 类处理了将自然语言问题转换为结构化查询表达式的核心逻辑 rag/nlp/query.py:27-40。
查询优化流程图
优化过程通常会使用一个大语言模型(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。
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
混合搜索架构
核心搜索机制通过加权融合策略,将向量相似度与关键词匹配相结合。
搜索组件架构
来源: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}_vecrag/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^10important_kwd^30question_tks^20content_ltks^2
来源:rag/nlp/query.py:31-39, rag/nlp/search.py:173-180
融合策略
Dealer 类通过将 MatchTextExpr 和 MatchDenseExpr 与 FusionExpr 结合来实现混合融合。
- 融合执行:系统会创建一个
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_ids | kb_id | 知识库标识符 |
doc_ids | doc_id | 文档标识符 |
available_int | available_int | 状态过滤器(激活/未激活) |
knowledge_graph_kwd | knowledge_graph_kwd | 知识图谱(KG)特定过滤器 |
entity_kwd | entity_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 方法编排,该方法负责处理分页、字段选择和结果修剪。
来源:rag/nlp/search.py:77-118, rag/nlp/search.py:132-180
RAPTOR 与 GraphRAG 集成
查询处理还与高级检索结构进行交互:
- RAPTOR:
rag/raptor.py中的RecursiveAbstractiveProcessing4TreeOrganizedRetrieval类为树状组织检索构建摘要层rag/raptor.py:156-172。 - GraphRAG:系统可以针对知识图谱执行搜索,利用
Dealer中的knowledge_graph_kwd和基于实体的过滤器等字段rag/nlp/search.py:126-127。task_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