graphrag bm25 和 embedding混合使用

知识图谱在模型侧(含训练 / 推理、存储与交换、以及输入大模型的向量格式)主要分三类:符号化三元组(RDF / 属性图)、结构化文本 / JSON、嵌入向量(Embedding)。

一、核心数据模型(存储的逻辑格式)
  1. RDF 三元组(学术 / 标准)

格式:(主体 Subject, 谓词 Predicate, 客体 Object),简称 SPO。示例:

(马云, 是创始人, 阿里巴巴)

(阿里巴巴, 总部位于, 杭州)

特点:W3C 标准,国际通用;语义强、支持推理;但是边不能直接带属性。RDF 的关系只能是一个名字,不能像 Neo4j 那样给关系直接加年份、分值、类型等附加字段。Neo4j 可以创建类似马云 --创立[年份:1999]--> 阿里巴巴;直接添加年份等形式的附加字段,但是如果使用RDF三元组,则需要使用两条三元组来进行表述,例如(马云 创立 阿里巴巴)和(创立事件 发生年份 1999)。

常用的序列化文件格式:

.nt(N-Triples):每行一个三元组,无冗余,适合批量处理。

.ttl(Turtle):可读性好,支持前缀缩写。

.jsonld:JSON+RDF,Web 友好。

  1. 属性图(工业界 / 图数据库,如 Neo4j)

格式:节点 (实体,标签,属性) + 边 (关系,属性)。

节点: 马云 {标签:人物, 年龄:59}

边: 马云 -[创始人, 年份:1999]-> 阿里巴巴

特点:节点和边都能挂多个属性,贴近业务,查询快。

常用文件:.graphml、.csv(节点 / 边分表)、.json。

  1. 关系数据库表(传统存储)

三元组表:(s,p,o) 三列表,最简单但查询慢。

属性表:实体一行,属性多列(如:人物 (姓名,年龄,国籍))。

水平表 / 垂直划分:按类型分表,提升查询效率。

二、从知识图谱到graphRAG

把知识图谱直接给到大模型,大模型自身是很难高效利用已有的图谱知识结构的,大模型是序列模型,天然擅长连续文本和自然语言;相比较下并不擅长:图结构遍历、路径搜索、多跳关联、拓扑推理;海量离散三元组的全局关联建模;因此Graph RAG 就是为解决这个问题诞生。

  1. 普通 RAG vs Graph RAG 核心区别

    普通 RAG:切块文档 → 向量相似度检索 → 塞给大模型,只能做到「关键词相似」,完全没有关系、逻辑、链路

    Graph RAG:

    把知识固化成 实体节点 + 关系边 的图结构,检索时不是向量瞎搜,而是先找实体 → 再遍历关系 → 抓取关联路径 / 子图 → 再喂给大模型

  2. Graph RAG 标准处理流程

    步骤 1:图谱结构化入库

    把你的 JSON:

    entities → 存入图数据库节点(人物 / 企业 / 地点)

    relations → 存入图数据库有向边(所属、总部、隶属、创立)

    存储载体:Neo4j、Nebula、Dgraph、轻量图结构索引

    步骤 2:用户问题 → 实体抽取

    大模型 / 实体链接模型,从问题里抠出关键实体

    例如针对问题:华为创始人所在关联的省份有哪些?抽取实体:华为、任正非

    步骤 3:图检索(核心!区别普通 RAG)

    在图中命中「任正非、华为」节点

    按关系向外多跳遍历:任正非 → 创立 → 华为;华为 → 总部 → 深圳;深圳 → 隶属 → 广东

    裁剪出和问题强相关的局部子图

    步骤 4:子图结构化压缩

    把遍历出来的小范围关联图谱,整理成干净三元组 / 结构化文本:

    plaintext:任正非 创立 华为;华为 总部位于 深圳市;深圳市 隶属于 广东省

    步骤 5:送入大模型生成答案

    大模型拿到浓缩、有关联、有链路的结构化知识,轻松完成:多跳推理、溯源、链路拆解、因果分析。

三、实际工业使用

实际工业使用中会综合多种检索方式,即混合检索,核心的解决问题思想是互补兜底。

检索类型 核心能力 负责场景
稠密向量 Embedding 语义理解、上下文、同义、模糊 泛化问答、语义类问题
BM25 稀疏检索 关键词、实体、术语、精准词 专有名词、专业内容、硬匹配
结构化检索 字段过滤、图谱关系、条件筛选 知识图谱、表格、业务结构化数据

整体架构:

分词 / 实体抽取 → 多路并行检索(向量 + BM25 + 结构化)→ 结果融合 → 重排序 Rerank → 上下文拼接 → LLM 生成

分步拆解

  1. 文档预处理层
    通用文本:分词、分块、清洗
    知识图谱数据:实体 / 关系单独建结构化索引
    同时构建两套索引:
    向量库:Chunk Embedding 存入 Milvus/FAISS/ES-dense
    稀疏倒排库:全文分词,构建 BM25 索引(Elasticsearch/Whoosh)
  2. 问题预处理
    问句分词、关键词提取、实体识别
    拆分:语义问题 + 关键实体 / 术语
  3. 多路并行检索(核心)
    向量检索:问句 Embedding → 向量库 Top-K 召回
    BM25 检索:问句关键词 → 全文倒排索引 Top-K 召回
    结构化检索(图谱场景):
    抽取实体 / 关系 → 图数据库 / 结构化索引精准过滤
  4. 多路结果融合(Reciprocal Rank Fusion RRF)
    不用简单拼接,用RRF 算法加权融合:
    避免单一检索偏科
    向量高分 + BM25 高分的内容优先保留
    解决「向量召回垃圾、关键词漏召回」问题
  5. 重排序 Rerank
    用轻量交叉编码器模型(BGE-Rerank、Cohere Rerank)
    对融合后的候选片段精细打分,筛选最相关上下文
  6. 大模型生成
    把高质量、强相关的上下文送入 LLM,最终回答
四、BM25的算法原理

BM25 检索原理 通俗+公式+完整拆解

BM25 是改进版 TF-IDF ,目前 RAG 稀疏检索、全文检索工业界事实标准,专门解决 TF-IDF 的缺陷:词频无限叠加、文档长度不敏感、长尾词权重不合理。


一、先搞懂 3 个基础概念

1. TF (Term Frequency)词频

TF(t,d)TF(t,d)TF(t,d)

词汇 ttt 在当前文档 ddd 里出现的次数。

关键词出现越多,和问题越相关。

2. IDF (IDF:Inverse Document Frequency )逆文档频率

IDF(t)IDF(t)IDF(t)

词汇在全局所有文档里稀有程度。

  • 冷门专业词(Lidar、QAR):IDF 高,权重极高
  • 通用停用词(的、是、和):IDF 极低,几乎无权重

3. 文档长度

BM25 核心优化点:惩罚长文档、优待紧凑短文档

TF-IDF 缺陷:长文档随便堆词,分数天然更高,不合理。


二、BM25 核心公式(最常用 BM25 Okapi)

单词条 ttt 对文档 ddd 的得分:
score(t,d)=IDF(t)⏟稀有度权重×TF(t,d)⋅(k1+1)⏞词频饱和上限TF(t,d)+k1⋅(1−b+b⋅∣d∣avgdl)⏟文档长度归一化惩罚 \text{score}(t,d) = \underbrace{IDF(t)}{\text{稀有度权重}} \times \frac {\overbrace{TF(t,d)\cdot (k_1+1)}^{\text{词频饱和上限}}} {\underbrace{TF(t,d) + k_1 \cdot \big(1-b + b\cdot \frac{|d|}{\text{avgdl}}\big)}{\text{文档长度归一化惩罚}}} score(t,d)=稀有度权重 IDF(t)×文档长度归一化惩罚 TF(t,d)+k1⋅(1−b+b⋅avgdl∣d∣)TF(t,d)⋅(k1+1) 词频饱和上限

整体文档得分 = 问句所有关键词得分累加


三、逐段拆解关键参数(超好懂)

1. k1k_1k1:词频饱和系数(一般取值 1.2 ~ 2.0

  • 作用:限制词频无限暴涨
  • TF-IDF 问题:一个词重复100遍,分数无限涨
  • BM25:词频涨到一定程度就饱和封顶,杜绝恶意堆砌关键词

实际意义:关键词出现 3次 和 30次,分数差距不会离谱拉大

2. bbb:文档长度平衡系数(一般取 0.75

  • b∈[0,1]b \in [0,1]b∈[0,1]
  • ∣d∣\boldsymbol{|d|}∣d∣:当前文档长度
  • avgdl\boldsymbol{\text{avgdl}}avgdl:全部文档平均长度

逻辑:

  • b=1b=1b=1:完全参考文档长度,严格惩罚长文档
  • b=0b=0b=0:完全忽略文档长度,退化成无长度约束模型

3. IDF 改良公式(BM25 专用)

IDF(t)=ln⁡(N−df(t)+0.5df(t)+0.5+1) IDF(t) = \ln\left( \frac{N - df(t) + 0.5}{df(t) + 0.5} + 1 \right) IDF(t)=ln(df(t)+0.5N−df(t)+0.5+1)

  • NNN:总文档数
  • df(t)df(t)df(t):包含词 ttt 的文档数量

改良亮点:

  1. 避免 IDF 出现负数(TF-IDF 高频词会负分)
  2. 平滑处理,防止生僻词/新词计算异常

四、BM25 对比 TF-IDF 核心优势

  1. 词频饱和

    TF-IDF:词越多分越高 ❌

    BM25:词频到达阈值不再加分 ✅

  2. 文档长度归一化

    长文档天然降权,不会因为字数多无脑排前面 ✅

  3. IDF 平滑稳定

    高频通用词不会负分,检索更稳 ✅

  4. 适合短问句+长文档

    完美匹配 RAG 场景:用户短句提问、知识库长文档检索


五、BM25 工作流程(RAG 落地视角)

  1. 建库阶段(离线)

    • 全文档分词(中文:jieba/hanlp)
    • 统计:每个词 TF、全局 DF、文档平均长度 avgdl
    • 构建倒排索引:词语 → 包含该词的文档列表
  2. 检索阶段(在线)

    • 用户问题分词,提取关键词
    • 逐个关键词查倒排索引,命中候选文档
    • 套 BM25 公式逐篇计算相关性分数
    • 按分数从高到低排序,返回 Top-K

六、通俗大白话总结

  1. 一个词越少见(专业术语、专有名词),权重越高;
  2. 关键词在文档里适量出现最好,疯狂重复不加分;
  3. 同样关键词密度下:短文档 > 长文档
  4. 只看关键词字面精准匹配,完全不懂语义、同义词、意译;

七、RAG 里为什么必须「BM25 + 向量Embedding」组合

维度 BM25(稀疏检索) Embedding向量(稠密检索)
匹配逻辑 关键词字面精准 语义、上下文、同义、模糊
擅长内容 编号、术语、实体、人名、代码 口语提问、改写、理解类问题
缺点 不懂语义,换种说法搜不到 专有名词易被稀释、易幻觉召回
五、RRF(Reciprocal Rank Fusion,倒数排名融合

RRF(Reciprocal Rank Fusion,倒数排名融合) 是一种只靠排名、不靠原始分数 就能把多个排序列表合并成一个高质量列表的算法;在RAG/混合检索里是BM25+向量检索融合的标配。


一、核心定义与公式

  • 全称:Reciprocal Rank Fusion(RRF)
  • 用途:融合多个独立排序结果(如BM25、向量检索、多查询结果)
  • 核心思想:在多个列表里都排得靠前的文档,最终得分更高

公式(标准):
RRF_score(d)=∑i=1n1k+ranki(d)\text{RRF\score}(d)=\sum{i=1}^{n}\frac{1}{k+\text{rank}_i(d)}RRF_score(d)=i=1∑nk+ranki(d)1

  • (d):当前文档
  • (n):参与融合的列表数
  • ranki(d)\text{rank}_i(d)ranki(d):文档 ddd 在第 iii 个列表中的排名(从1开始)
  • (k):平滑常数 (常用值 60,可调;作用:降低排名靠后的噪声、削弱极端高排名的主导)

二、为什么用RRF(解决什么问题)

混合检索(如BM25 + 向量检索)中常见痛点:

  • 分数分布完全不一样:
    • BM25:0~几十
    • 向量余弦相似度:0~1
  • 直接相加不可行:量纲不同、一个容易"盖住"另一个
  • 归一化复杂、易失真

✅ RRF的解决方式:

  • 扔掉原始分数,只看排名
  • 排名越靠前,贡献的分数越大(倒数衰减)
  • 多列表累加,共同靠前的文档自然上浮

三、假设两路检索结果(取前3):

  • 列表A(BM25):Doc1(第1)、Doc2(第2)、Doc3(第3)
  • 列表B(向量):Doc2(第1)、Doc1(第2)、Doc4(第3)

取 (k=60),计算每个文档RRF分数:

  • Doc1:
    160+1+160+2≈0.0164+0.0161=0.0325 \frac{1}{60+1}+\frac{1}{60+2}\approx0.0164+0.0161=0.0325 60+11+60+21≈0.0164+0.0161=0.0325

  • Doc2:
    160+2+160+1≈0.0161+0.0164=0.0325 \frac{1}{60+2}+\frac{1}{60+1}\approx0.0161+0.0164=0.0325 60+21+60+11≈0.0161+0.0164=0.0325

  • Doc3:
    160+3+0≈0.0159 \frac{1}{60+3}+0\approx0.0159 60+31+0≈0.0159

  • Doc4:
    0+160+3≈0.0159 0+\frac{1}{60+3}\approx0.0159 0+60+31≈0.0159

最终排序:Doc1 ≈ Doc2 > Doc3 ≈ Doc4(在两路检索结果中都靠前的文档,融合后排名会更靠前)

四、关键特性(优缺点)

优点
  1. 无需归一化:不关心原始分数,只看位次,天然适配多源融合
  2. 简单稳定、少调参:仅 (k) 一个参数,默认60即很好用
  3. 公平融合:多个列表的贡献被平滑,不易被单一检索器主导
  4. 增强鲁棒性:个别列表排序波动影响小
缺点
  1. 完全抛弃原始分数信息:如果某检索器分数非常高(强相关),RRF无法利用这一点
  2. 排名"断层"不敏感:第1名和第2名差距远大于第10名和第11名,但RRF只看位次
  3. 对极端排名依赖 (k):(k) 太小易受噪声影响,太大则区分度下降

五、和其他融合方法对比

  • 直接加权求和:依赖分数分布、需归一化、调参成本高
  • CombMNZ:分数求和 × 出现次数,仍依赖原始分数
  • Condorcet:两两比较,计算复杂、效率低
  • RRF :仅用排名、公式简单、效果稳定、落地成本低(工业首选

RRF是"用排名投票"的融合算法 :不看分数、只看位次,简单有效,是当前混合检索与RAG系统的标配融合方案

相关推荐
庞轩px3 天前
Embedding与向量语义——大模型是怎样“理解”文字的?
人工智能·自然语言处理·embedding·向量检索·余弦相似度·rag·高维向量空间
Aision_3 天前
LangGraph 中 State、Node、Edge 是怎么协作的?
langchain·prompt·aigc·embedding·ai编程·ai写作·agi
Arhero3 天前
Semantic Chunk 为什么需要 Embedding API
动态规划·embedding·rag·文本切分·语义分块
鹏子训7 天前
AI记忆新思路:用SQLite替代向量数据库,去EMBEDDINGS化,谷歌开源Google Always On Memory Agent
数据库·人工智能·sqlite·embedding
马优晨8 天前
大语言模型(LLM)、Embedding 模型、reranker重排序模型 有什么关系
人工智能·语言模型·embedding·embedding 模型·大语言模型(llm)
猫头虎9 天前
如何搭建 24 小时 AI 直播平台:魔珐星云数字人打造无人值守 “AI 销冠” 全流程实战教程
人工智能·langchain·开源·prompt·aigc·embedding·agi
ydmy12 天前
Embedding层(个人理解)
python·深度学习·embedding