本文档涵盖了自然语言处理(NLP)管道,该管道将用户查询转换为结构化搜索表达式,用于在 RAGFlow 中检索文档。查询处理包括分词、术语加权、同义词扩展和相似度计算,以实现跨知识库的有效全文和混合搜索。
有关更广泛的 RAG 管道工作流程的信息,请参阅RAG 管道。有关知识库管理和文档索引的详细信息,请参阅知识库管理。
查询处理系统将自然语言用户查询转换为优化的搜索表达式,这些表达式可以在 Elasticsearch 或 Infinity 文档存储上执行。该系统处理多语言文本(中文和英文),应用术语加权算法,并生成结合了向量和基于分词的匹配的混合相似度分数。
来源: rag/nlp/query.py26-278 rag/nlp/rag_tokenizer.py31-476 rag/nlp/term_weight.py27-245
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.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
分词相似度使用术语加权来计算查询和文档分词之间的重叠度
最后一步生成包含 Elasticsearch 兼容查询语法的 MatchTextExpr 对象
来源: rag/nlp/query.py129-131 rag/nlp/query.py214-216 rag/nlp/query.py276-277