菜单

查询处理

相关源文件

本文档涵盖了自然语言处理(NLP)管道,该管道将用户查询转换为结构化搜索表达式,用于在 RAGFlow 中检索文档。查询处理包括分词、术语加权、同义词扩展和相似度计算,以实现跨知识库的有效全文和混合搜索。

有关更广泛的 RAG 管道工作流程的信息,请参阅RAG 管道。有关知识库管理和文档索引的详细信息,请参阅知识库管理

概述

查询处理系统将自然语言用户查询转换为优化的搜索表达式,这些表达式可以在 Elasticsearch 或 Infinity 文档存储上执行。该系统处理多语言文本(中文和英文),应用术语加权算法,并生成结合了向量和基于分词的匹配的混合相似度分数。

来源: rag/nlp/query.py26-278 rag/nlp/rag_tokenizer.py31-476 rag/nlp/term_weight.py27-245

核心组件

FulltextQueryer 类

FulltextQueryer 类是查询处理的主要协调器,它实现了将用户查询转换为搜索表达式的核心 question() 方法。

组件目的关键方法
FulltextQueryer主查询处理器question(), hybrid_similarity(), paragraph()
term_weight.Dealer术语加权和评分weights(), split(), pretoken()
synonym.Dealer同义词扩展lookup()
RagTokenizer文本分词tokenize(), fine_grained_tokenize()

来源: rag/nlp/query.py26-39 rag/nlp/query.py85-217

搜索字段配置

系统将查询映射到具有加权重要性分数的特定文档字段

  • title_tks^10 - 分词后的标题(最高权重)
  • important_kwd^30 - 重要关键词(最大权重)
  • content_ltks^2 - 长分词内容
  • question_tks^20 - 问题特有分词

来源: rag/nlp/query.py30-38

查询转换管道

文本预处理

系统在分词前应用多个标准化步骤

来源: rag/nlp/query.py86-96 rag/nlp/query.py75-83 rag/nlp/query.py45-53

分词过程

RagTokenizer 实现了使用动态规划优化进行正向和反向最大匹配的复杂分词算法

来源: rag/nlp/rag_tokenizer.py61-89 rag/nlp/rag_tokenizer.py249-271 rag/nlp/rag_tokenizer.py273-294

术语加权系统

权重计算算法

术语加权系统结合多个因素来衡量分词的重要性

因素目的公式
频率 (IDF1)文档频率逆向log10(10 + (N-s+0.5)/(s+0.5))
集合频率 (IDF2)语料库频率逆向log10(10 + (N-s+0.5)/(s+0.5))
命名实体识别实体类型加权{"toxic": 2, "func": 1, "corp": 3, ...}
词性词性标签加权{"ns": 3, "nt": 3, "n": 2, ...}

来源: rag/nlp/term_weight.py162-244 rag/nlp/term_weight.py191-221

相似度计算

混合相似度评分

系统实现了结合基于分词和基于向量匹配的混合相似度

来源: rag/nlp/query.py219-227 rag/nlp/query.py229-241

分词相似度算法

分词相似度使用术语加权来计算查询和文档分词之间的重叠度

来源: rag/nlp/query.py243-255

查询表达式生成

最后一步生成包含 Elasticsearch 兼容查询语法的 MatchTextExpr 对象

来源: rag/nlp/query.py129-131 rag/nlp/query.py214-216 rag/nlp/query.py276-277