fastgpt 社区版探究:mongo db 全文检索算法探秘

近几日在研究fast gpt 的源码,对于它的混合检索比较好奇:全文检索是怎么实现的?向量检索呢?

看了源码才了解到,实际上fastgpt 支持三种向量库,一是minlvs , 二是 pgsql vector, 三是oceanbase(阿里的)。

向量检索,以pgvector为例简单说一下,就是在pg库里加载了pgvector插件,在postgresql 库中创建了 modeldata 的表,其中有字段名为 vector,类型也是vector,就存储切块后的内容的向量值。是1536维的,据说在精准度和计算量之间达到了一个比较好的平衡。

建立向量索引,以及搜索算法,都是pgvector所支持的,不再细说。

令我好奇的是,其全文检索是基于mongo db内置的来实现的。从源码来看,用到了jieba 分词,将句子分此后,用空格连接,以便兼容mongo db的算法(按照英文习惯,单词之间用空格分隔)。这说明实际上原始内容存储到mongo db的数据库字段里,也应该是经过分词后,将每个词之间采用空格分开的。

那么,接下来我的疑问便是,其内部究竟是怎么实现的。为此我求助了腾讯元宝的DeepSeek深度搜索,提示词如下:

假如在 mongo db 中存储了文章的内容,并对内容字段建立了全文检索的索引,那么加入搜索一个经过中文分词后的句子"中国 汽车 品牌 世界 最强",在mongo db 内部是怎么进行检索并对检索结果进行打分的?假如有个记录的内容是 "中国的汽车品牌 是世界上最强的没有之一" ,另一个是"日本汽车比不上中国汽车", 它们各自的得分会是多少?这个得分是按照内容包含了相应的关键字就得分呢?还是关键字在其中出现次数多也有助于高的得分呢?还是怎么样的?

以下便是值得记录的它的回答:

MongoDB 的全文检索基于 ​​倒排索引​ ​ 和 ​​TF-IDF 算法​​ 进行匹配和打分。以下是针对你问题的详细分析:


​一、检索过程解析​

​1. 索引构建​
  • 对文章内容字段建立全文索引后,MongoDB 会:

    1. ​分词​ ​:将文本拆分为词元(如 ["中国", "汽车", "品牌", "世界", "最强"])。

    2. ​构建倒排索引​​:记录每个词元出现的文档位置及频率。

      复制代码
      "中国" → [文档1_ID, 文档2_ID]
      "汽车" → [文档1_ID, 文档2_ID]
      "品牌" → [文档1_ID]
      "世界" → [文档1_ID]
      "最强" → [文档1_ID]
​2. 查询处理​
  • 查询 中国 汽车 品牌 世界 最强被拆分为独立词元。

  • MongoDB 执行 ​​OR 逻辑​ ​:匹配包含任意查询词元的文档(除非使用 ""指定短语)。


​二、相关性打分机制​

得分由 ​​TF-IDF 算法​​ 计算,公式简化如下:

复制代码
Score = TF(词频) × IDF(逆文档频率)
​1. TF (词频)​
  • ​词在文档中出现的次数越高,得分越高​​。

  • 示例:

    • 文档1:"中国的汽车品牌是世界上最强的没有之一"

      • 中国:1, 汽车:1, 品牌:1, 世界:1, 最强:1
    • 文档2:"日本汽车比不上中国汽车"

      • 中国:1, 汽车:2(其他词未出现)
​2. IDF (逆文档频率)​
  • ​词在整个集合中的稀有程度​​。词越常见,IDF 越低。

  • 公式:

    复制代码
    IDF = log(总文档数 / 包含该词的文档数)
  • 假设集合中有 1000 篇文档:

    • 汽车出现在 800 篇 → IDF = log(1000/800) ≈ 0.1

    • 最强出现在 10 篇 → IDF = log(1000/10) ≈ 2.0

​3. 最终得分计算​
  • ​文档1​​:

    复制代码
    Score = (TF_中国 × IDF_中国) + (TF_汽车 × IDF_汽车) + ... 
            ≈ (1×0.2) + (1×0.1) + (1×1.5) + (1×0.3) + (1×2.0) = 4.1
  • ​文档2​​:

    复制代码
    Score = (TF_中国 × IDF_中国) + (TF_汽车 × IDF_汽车) 
            ≈ (1×0.2) + (2×0.1) = 0.4

✅ ​​结论​​:文档1 得分远高于文档2,因为它包含更多查询词元且包含高 IDF 词(如"最强")。


​三、其他影响因素​

  1. ​词元位置与权重​​:

    • 标题中的词可能比正文权重更高(取决于索引配置)。
  2. ​短语匹配​​:

    • 若查询用引号包裹 "中国汽车",连续出现的短语会获得额外加分。
  3. ​停用词过滤​​:

    • "的"、"是"等停用词会被忽略,不计入打分。
  4. ​词干提取​​:

    • 英文中"running"会被归并为"run",中文需依赖分词工具(如你的代码中的 jiebaSplit)。

​四、你的示例结果对比​

文档内容 匹配词元 TF-IDF 得分 原因分析
中国的汽车品牌是世界上最强的没有之一 中国、汽车、品牌、世界、最强 较高 (如4.1) 命中全部查询词元,且包含高 IDF 词(如"最强")
日本汽车比不上中国汽车 中国、汽车 较低 (如0.4) 仅命中2个词元,且"汽车"因常见导致 IDF 低

​关键结论​

  • ​命中词元数量​ ​和​​词元的稀有度​​(IDF)是得分的核心因素。

  • 代码中的 score: { $meta: 'textScore' }正是获取这个 TF-IDF 分数。

  • 中文场景需依赖分词工具(如你的 jiebaSplit)预处理查询词,否则 MongoDB 默认按空格分词(对中文不友好)。

ok,本篇结束。感谢AI 的回复。

相关推荐
小贺儿开发2 小时前
【Arduino与Unity交互探究】01 摇杆模块
科技·unity·游戏引擎·arduino·串口通信·摇杆·硬件交互
洛阳泰山3 小时前
MaxKB4j Docker Compose 部署指南
java·docker·llm·springboot·rag·maxkb4j
华奥系科技4 小时前
智慧经济新格局:解码社区、园区与城市一体化建设逻辑
大数据·人工智能·科技·物联网·安全
大傻^9 小时前
Spring AI 2.0 企业级 RAG 架构:混合检索、重排序与多模态知识库
人工智能·spring·架构·多模态·rag·混合检索·重排序
大模型RAG和Agent技术实践10 小时前
破译Word文档的“语义黑盒”:企业级DOCX RAG架构演进与全链路实战(完整源代码)
人工智能·架构·大模型·word·智能问答·rag
2501_9464903810 小时前
演艺科技艺术实践——Hirender“一控一显”架构在中戏光影艺术节的应用解析
科技·hirender·hecoos·多媒体播控·多媒体服务器·播控
大傻^10 小时前
LangChain4j 核心抽象:ChatMessage、UserMessage 与模型无关设计
人工智能·rag·langchain4j
金士镧(厦门)新材料有限公司11 小时前
氧化镧:现代工业的重要稀土材料
人工智能·科技·安全·全文检索·生活·能源
人工智能培训咨询叶梓11 小时前
SYNCHECK:提升检索增强型语言模型的可信度
人工智能·深度学习·语言模型·大模型·检索增强·多模态·rag
爱学习的程序媛12 小时前
【Web前端】“十五五”重大项目中的前端机遇
前端·科技·信息可视化·前端框架·创业创新·信息与通信