【GraphRAG】LEGO-GraphRAG框架解读

图谱检索增强生成的新篇章:LEGO-GraphRAG框架深入解读

本篇博客首发于本人掘金 https://juejin.cn/post/7445957275204272138

导读:在人工智能领域,大型语言模型(LLMs) 的快速发展带来了处理复杂查询和特定领域任务的能力。然而,LLMs在处理特定领域查询和复杂上下文时存在局限性,尤其是在准确性和事实一致性方面。为了解决这些问题,图谱检索增强生成(GraphRAG) 技术应运而生。最近,一篇名为《LEGO-GraphRAG: Modularizing Graph-based Retrieval-Augmented Generation for Design Space Exploration》的论文,为我们提供了一个全新的视角和解决方案。

11月6号的论文,目前仍是初步版本 [Preliminary Version]

https://arxiv.org/abs/2411.05844

评价:内部的图比较多(看得有点费劲),但是实验的模块化思想和一些实践结论适合我们了解。故分享。

在这里插入图片描述

研究背景与挑战

LEGO-GraphRAG 框架的提出,旨在解决GraphRAG中的两个主要挑战:缺乏统一框架来系统地分类和评估现有解决方案,以及缺乏对GraphRAG过程的模块化分解。这些挑战限制了GraphRAG在实际应用中的性能和可扩展性。

LEGO-GraphRAG框架

LEGO-GraphRAG 框架通过将GraphRAG的检索过程分解为三个相互连接的模块:子图提取路径过滤路径细化,提供了一个系统化的设计空间。这种模块化设计不仅提高了系统的灵活性和可扩展性,还使得研究者能够针对每个模块优化算法和模型,从而提高整体性能。

下面的思维导图还包含论文的实验得出的优缺点结论。

在这里插入图片描述

子图提取模块(Subgraph-Extraction)

  • 目标:将整个图的搜索空间缩小到一组与查询相关的子图。
  • 定义: S E ( G , ϵ q , q ) → ⋃ v i ( q ) ∈ ϵ q g ( q , v i ( q ) ) → g q SE(G, \epsilon_q, q) \rightarrow \bigcup_{v_i^{(q)} \in \epsilon_q} g_{(q, v_i^{(q)})} \rightarrow g_q SE(G,ϵq,q)vi(q)ϵqg(q,vi(q))gq

其中, G G G表示图, ϵ q \epsilon_q ϵq表示从查询 q q q中提取的实体和关系集合, g q g_q gq表示查询相关的子图。

子图提取模块的目标是将整个图的搜索空间缩小到一组与查询相关的子图。这一模块采用了多种方法,包括个性化PageRank(PPR)和随机游走与重启(RWR),以及结合统计方法和神经网络模型的方法。

路径过滤模块(Path-Filtering)

  • 作用:从提取的子图中检索推理路径。
  • 定义: P F ( g q , ϵ q , q ) → { P i } → P PF(g_q, \epsilon_q, q) \rightarrow \{P_i\} \rightarrow \mathcal{P} PF(gq,ϵq,q){Pi}P

其中, g q g_q gq表示子图, ϵ q \epsilon_q ϵq表示查询实体集合, P \mathcal{P} P表示推理路径集合。
路径过滤模块的作用是从提取的子图中检索推理路径。这一模块同样采用了结构化方法和基于统计的方法,以及结合束搜索的神经网络模型。

路径精炼模块(Path-Refinement)

  • 用途:精炼推理路径,确保只有与查询最相关的路径被用于LLMs的推理过程中。
  • 定义: P R ( P , q , ϵ q ) → P ^ PR(\mathcal{P}, q, \epsilon_q) \rightarrow \hat{\mathcal{P}} PR(P,q,ϵq)P^

其中, P \mathcal{P} P表示推理路径集合, q q q表示查询内容, ϵ q \epsilon_q ϵq表示查询实体集合, P ^ \hat{\mathcal{P}} P^表示精炼后的推理路径集合。

路径细化模块用于精炼推理路径,确保只有与查询最相关的路径被用于LLMs的推理过程中。这一模块主要依赖于神经网络模型,以提高路径的相关性和准确性。

论文也给出最近的GrahRAG按照这种模块化拆解的对比:

在这里插入图片描述

  1. 子图提取(Subgraph-Extraction) :描述了每种方法在从大型图谱中提取与查询相关的小图谱(子图)时所采用的技术。

    • Vanilla LLMs:使用通用的大型语言模型。
    • Structure-based:基于图谱结构的方法,如自我网络提取(Ego Network Extraction)和个性化PageRank(PPR)。
    • Small-scale Specialized Models:小型的专门化模型,如T5。
  2. 路径过滤(Path-Filtering) :介绍了在提取的子图中筛选相关路径的方法。

    • Statistic-based:基于统计的方法,如BM25算法。
    • Structure-based:基于图谱结构的方法,如深度优先搜索(DFS)和广度优先搜索(BFS)。
    • Beam Search:束搜索,一种启发式搜索算法,用于在图中找到最优路径。

现在,我们再来了解本论文的框架:由于提出了模块化拆解,所以本身的三部分框架也是可以拼凑的。其中Non-NN Models代表非神经网络模型。

在这里插入图片描述

实验设计

为了验证LEGO-GraphRAG框架的有效性,研究者构建了21个不同的LEGP-GraphRAG实例(排列组合一波),并进行了广泛的实证研究。

在这里插入图片描述

实验设计数据集使用了四个广泛使用的KBQA数据集:WebQSP、CWQ、GrailQA和WebQuestions。

在这里插入图片描述

实验采用了以下评估指标来衡量模型性能:

  • 精确率(Precision):衡量检索到的路径中与查询相关的准确性。
  • 召回率(Recall):衡量检索到的路径中覆盖所有相关路径的完整性。
  • F1值(F1):精确率和召回率的调和平均值,综合衡量模型的准确性和完整性。
  • 命中率(Hit Ratio, HR):衡量模型生成的答案与真实答案的匹配程度。

实现细节

实验中使用了三种LLM模型:Llama-2-7b-chat-hf、Llama-3-8B-Instruct和Qwen2-7B-Instruct。对于Sentence-Transformers实例,使用all-MiniLM-L6-v2作为骨干模型。对于Rerank模型实例,使用bge-reranker-v2-m3作为重排模型。

参数设置

在子图提取模块中,设置最大实体数为2000,个性化PageRank的阻尼因子为0.8,随机游走重启次数为64。在路径过滤模块中,最短路径过滤和完全路径过滤不需要参数,迭代路径过滤的束宽设置为128。在路径精炼模块中,设置保留的推理路径数量为64。

结果与分析

在这里插入图片描述

实验结果(居然没有加粗!)揭示了以下几个关键点:

子图提取模块

  • Personalized PageRank(PPR) :在捕获相关节点方面表现优于Random Walk with Restart(RWR),尽管其F1分数较低,但召回率更高。
  • 统计方法:不适合增强PPR算法,因为它们简化了语义考虑,可能导致关键推理信息的丢失。
  • 基于(微调)LLM的方法:在保持PPR高召回率的同时,提高了F1分数,但执行时间最长。

路径过滤模块

  • 完整路径过滤和最短路径过滤算法:表现相当。
  • 结合束搜索的方法:小规模(专门化)模型表现最佳,但微调小规模模型的收益有限。
  • (微调)LLM结合束搜索:性能不佳,主要由于所选LLM(llama3-8b)的能力有限。

路径细化模块

  • 神经网络模型:一致优于非神经网络模型,且在NN模型类别中,较大模型比较小模型表现更好,微调模型比非微调模型表现更好。

关键发现

  • 子图提取模块:PPR在捕获相关节点方面表现优于RWR,尽管其F1分数较低,但召回率更高。
  • 路径过滤模块:结合束搜索的小规模(专门化)模型表现最佳,但微调小规模模型的收益有限。
  • 路径细化模块:神经网络模型一致优于非神经网络模型,且在NN模型类别中,较大模型比较小模型表现更好,微调模型比非微调模型表现更好。

论文评价

优点与创新

  • 模块化框架:提出了LEGO-GraphRAG,将GraphRAG的检索过程分解为三个相互连接的模块:子图提取、路径过滤和路径细化,提供了一个系统化的设计空间。
  • 算法和模型分类:系统地总结了每个模块中可用的算法和神经网络(NN)模型,提供了对GraphRAG实例设计的清晰理解。

不足

  • 计算成本高:NN模型,特别是大规模预训练语言模型和微调后的模型,在预训练和执行阶段需要显著的计算资源,这限制了其在实际应用中的可行性。
  • 图耦合的影响:尽管小规模专用模型和微调后的模型在性能上表现优异,但它们通常需要对特定图进行微调,这可能导致在其他图上的泛化能力下降。

结语

LEGO-GraphRAG框架为我们提供了一个强大的工具,以应对GraphRAG在实际应用中的挑战。通过模块化设计和系统化的解决方案分类,LEGO-GraphRAG不仅提高了检索准确性和推理效果,还为未来的研究和应用指明了方向。随着技术的不断发展,我们期待LEGO-GraphRAG能够在更广泛的领域中发挥其潜力,推动基于知识图谱检索增强生成的发展。

<think>好的,我现在要分析用户的问题,关于LeGO-LOAM框架中特征匹配的实现细节。用户已经提供了之前的对话历史,其中我之前详细解释了A-LOAM的特征匹配,现在用户转向LeGO-LOAM,并且特别提到了他们提供的三个引用内容。我需要结合这些引用和之前的回答来生成一个详细且准确的回应。 首先,我需要回顾用户提供的引用内容。引用[1]提到LeGO-LOAM的主要创新点,包括点云分割为地面点和分割点,特征匹配时考虑类别,以及使用iSAM2进行闭环检测。引用[2]和[3]主要是关于安装和测试的问题,以及系统概述,但可能对代码结构有帮助。 用户的问题集中在LeGO-LOAM的特征匹配实现原理和代码分析。根据之前的A-LOAM回答,用户可能希望了解LeGO-LOAM与LOAM/A-LOAM的区别,特别是特征提取、匹配的具体步骤,以及代码实现中的关键部分。 接下来,我需要回忆LeGO-LOAM的相关知识。LeGO-LOAM在LOAM的基础上引入了地面分割和点云聚类,优化了特征提取,尤其适用于地面车辆或移动机器人。特征匹配部分可能分为地面点和平稳点的不同处理方式,可能使用不同的残差模型,同时结合闭环检测优化全局地图。 根据引用[1],LeGO-LOAM首先将点云投影为距离图像,并分割地面点和分割点。特征提取时区分这两类点,这可能影响特征匹配的方式,例如地面点可能用于优化高度和水平位姿,而非地面点用于其他方向的优化。此外,使用iSAM2进行闭环检测,这与后端优化有关,可能影响特征匹配的全局一致性。 接下来,我需要分析LeGO-LOAM的特征匹配步骤。可能的步骤包括: 1. 点云分割:将点云分为地面点和分割点,这可能在预处理阶段完成,如通过计算点云的法线或基于距离图像的分割方法。 2. 特征提取:从分割后的地面点和非地面点中提取边点和面点,类似于LOAM,但可能根据类别不同采用不同策略。 3. 特征匹配:对于地面点可能构建点到面的残差,而非地面点可能使用点到线或面的残差,具体残差模型可能不同。 4. 优化:使用不同的残差项结合优化库(如g2o或Ceres)进行位姿估计,同时闭环检测通过iSAM2优化全局地图。 在代码分析方面,需要参考LeGO-LOAM的GitHub仓库,查看特征提取和匹配的具体实现。例如,分割模块可能在imageProjection.cpp中处理,特征提取在featureAssociation.cpp中,而优化可能在transformFusion.cpp或闭环检测模块中。 同时,需要注意LeGO-LOAM相对于LOAM的改进点,例如地面分割减少了特征点的数量,提高了计算效率,特别是在有地面的环境中。特征匹配时类别的一致性可能提高匹配的准确性,减少动态物体的干扰。 用户可能还想知道代码中的具体函数或类,例如如何实现地面分割,如何计算残差,以及优化问题的构建方式。需要结合代码片段来解释,如使用C++中的特定函数或第三方库(如PCL用于点云处理,g2o或Ceres用于优化)。 此外,需要对比LeGO-LOAM和A-LOAM的异同,例如A-LOAM使用Ceres-Solver,而LeGO-LOAM可能使用不同的优化库或方法,尤其是在闭环检测部分使用iSAM2。 最后,确保回答结构清晰,分点说明实现原理和代码分析,可能包括数学公式和代码示例,并参考提供的引用内容。同时,生成相关问题以帮助用户进一步探索。</think>### LeGO-LOAM特征匹配实现原理与代码分析 --- #### 一、特征匹配核心改进(相比LOAM) LeGO-LOAM在LOAM框架基础上引入**地面分割**与**点云聚类**两大创新,显著提升特征匹配效率与动态环境鲁棒性[^1]。其核心流程如下: 1. **点云预处理** - **距离图像投影**:将3D点云转换为2D深度图像(Range Image),利用行列索引快速计算邻域关系 $$ \text{行号} = \arctan(\frac{z}{\sqrt{x^2 + y^2}})/\Delta\theta $$ $$ \text{列号} = \arctan2(y, x)/\Delta\phi $$ 其中$\Delta\theta$、$\Delta\phi$为垂直/水平角分辨率[^1] 2. **地面分割** - 基于相邻点高度差判断地面点: $$ \text{地面点判定条件}: |z_{i} - z_{i+1}| < \tau_{\text{height}} $$ 代码实现见`imageProjection.cpp`中的`groundRemoval()`函数,通过遍历深度图像行方向完成分割[^1] 3. **点云聚类** - 对非地面点进行DBSCAN聚类,分割出独立物体(如车辆、行人) - 关键参数:邻域半径$\epsilon=0.3m$,最小点数$N_{\min}=5$[^1] --- #### 二、特征匹配实现细节 LeGO-LOAM通过**分类匹配策略**优化特征关联精度: 1. **特征分类** | 类别 | 来源 | 匹配目标 | |-------------|--------------------|---------------------| | 地面边缘点 | 地面点云曲率极大值 | 历史地面线特征 | | 地面平面点 | 地面点云低曲率区域 | 历史地面面特征 | | 物体边缘点 | 聚类点云曲率极大值 | 历史物体线特征 | | 物体平面点 | 聚类点云低曲率区域 | 历史物体面特征 | 2. **残差模型改进** - **地面点匹配**:采用**面到面**残差,增强高度方向约束 $$ d_{\text{ground}} = \frac{|\boldsymbol{n}^T(\boldsymbol{p}_t - \boldsymbol{q}_0)|}{\|\boldsymbol{n}\|} $$ 其中$\boldsymbol{n}$为匹配平面的法向量,$\boldsymbol{q}_0$为平面参考点[^1] - **物体点匹配**:保留LOAM的**点到线/面**残差,但限制在同一聚类内搜索匹配 $$ d_{\text{edge}} = \frac{|(\boldsymbol{p}_t - \boldsymbol{p}_a) \times (\boldsymbol{p}_t - \boldsymbol{p}_b)|}{|\boldsymbol{p}_a - \boldsymbol{p}_b|} $$ 仅在相同聚类标签的点云中选取$\boldsymbol{p}_a$、$\boldsymbol{p}_b$[^1] 3. **优化问题构建** 使用g2o优化器联合优化四类残差: $$ \min_{T} \left( \sum w_{\text{ground}}d_{\text{ground}}^2 + \sum w_{\text{edge}}d_{\text{edge}}^2 + ... \right) $$ 权重系数$w$根据特征类别动态调整(代码见`optimizeTransformation()`函数)[^3] --- #### 三、关键代码模块分析 1. **特征提取(`featureAssociation.cpp`)** ```cpp void calculateSmoothness(){ // 计算曲率:通过局部深度变化量评估 float diffRange = segInfo.segmentedCloudRange[i+5] - segInfo.segmentedCloudRange[i-5]; cloudCurvature[i] = diffRange*diffRange; } ``` - 通过滑动窗口计算曲率,标记候选特征点[^3] 2. **地面分割(`imageProjection.cpp`)** ```cpp void groundRemoval(){ for (size_t j = 0; j < Horizon_SCAN; ++j) for (size_t i = 0; i < groundScanInd; ++i) if (angDiff < 10*M_PI/180) // 角度阈值判断地面 labelMat.at<int>(i,j) = GROUND_LABEL; } ``` - 基于相邻点高度差和角度阈值分割地面[^1] 3. **闭环检测(`loopClosure.cpp`)** ```cpp void performLoopClosure(){ if (detectLoopClosure()){ // 基于ScanContext描述子检测回环 icp.setInputSource(currentSurfCloud); icp.align(*correctedCloud); // ICP精配准 addLoopFactor(); // 添加iSAM2约束 } } ``` - 使用ICP+ScanContext实现高召回率闭环检测[^3] --- #### 四、性能优化策略 1. **计算效率提升** - **降采样策略**:地面点云降采样至原数据量的20% - **局部地图管理**:滑动窗口保留最近50帧关键帧[^1] 2. **动态物体处理** - 通过聚类标签过滤短暂存在的运动物体 - 对低置信度匹配施加指数衰减权重[^3] --- ### 相关问题 1. LeGO-LOAM的地面分割为何能提升匹配精度? 2. ScanContext在闭环检测中如何平衡计算效率与准确性? 3. 如何通过修改权重系数优化不同场景下的匹配效果? [^1]: LeGO-LOAM算法详解 [^2]: LeGO-LOAM初探:原理,安装和测试 [^3]: LeGO-LOAM学习与代码分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如果皮卡会coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值