在人工智能快速发展的今天,大语言模型(LLMs)已经成为信息处理的重要工具。但仅凭模型自身的知识,往往难以精准回答复杂或专业领域的问题。这就是检索增强生成(RAG)系统的价值所在——它能为LLMs提供来自数据库或知识图谱的上下文,帮助模型生成更准确的回答。

不过,传统RAG系统存在一个明显局限:它们大多依赖向量存储中的文本匹配,这种方式往往难以捕捉信息之间的深层关联。为此,研究人员开发了一系列新型知识图谱遍历算法,通过在知识图谱中进行有意义的移动,提取与用户查询高度相关的精准信息。本文将详细介绍这些算法的原理、实现和效果,帮助你理解如何利用知识图谱提升RAG系统的性能。

什么是语义检索增强生成(RAG)系统?

简单来说,语义RAG系统是一种结合了信息检索和生成式AI的技术。当用户提出一个问题时,系统不会直接让大语言模型生成答案,而是先从预设的知识库中找到与问题相关的信息,再将这些信息作为上下文传递给模型,让模型基于这些“依据”生成回答。

传统RAG系统的工作流程大致是:

  1. 将用户的查询转化为向量(通过嵌入模型)
  2. 在向量数据库中寻找与查询向量最相似的文本片段
  3. 将找到的文本片段输入大语言模型,生成回答

这种方式的问题在于,它更像是“大海捞针”式的匹配,可能会漏掉那些虽然表面相似性不高,但在语义关联上更重要的信息。而基于知识图谱的RAG系统,则通过构建信息之间的关联网络,让检索过程更接近人类的“思考路径”——从一个知识点出发,逐步探索相关联的内容,最终找到最有价值的信息。

知识图谱的架构:让信息“互联互通”

要理解这些新型遍历算法,首先需要了解它们所依赖的知识图谱是如何构建的。这个知识图谱采用了分层结构,既保证了信息的颗粒度,又实现了高效的关联。

从文本到知识图谱:分块与关联

构建知识图谱的第一步是处理原始文档。研究中采用了“三句滑动窗口”的分块策略:以3个句子为一个基本单位,每次移动1个句子,这样能确保相邻块之间有一定重叠,让信息过渡更“平滑”。

为什么要这样做?因为知识的关联往往存在于句子之间的衔接处,重叠的分块方式能避免因生硬切割而破坏语义关联。比如一段关于“机器学习发展史”的文字,相邻的句子可能分别提到“1950年代的早期探索”和“1960年代的算法突破”,重叠分块能让这两个相关内容被更自然地关联起来。

相似度矩阵:找到信息的“亲密关系”

分块之后,系统会计算所有块之间的相似度,形成一个“相似度矩阵”。这个矩阵就像一张“关系网”,红色表示两个块的语义相似度高,蓝色则表示相似度低。

样本相似度矩阵
图A:维基百科“神经科学”文档的相似度矩阵,展示了所有3句窗口之间的余弦相似度比较。对角线的红色表示块与自身的相似度为1,蓝色区域则表示相关性较低。

为了减少内存占用,系统不会存储所有相似度数据,而是只保留每个块的前10个最相似块( intra-document 相似度,即文档内的关联)和跨文档的前若干个相似块( inter-document 相似度,即文档间的关联)。这些保留的高相似度对,就构成了知识图谱的“边”,将不同的信息块连接起来。

层级属性:让知识更有“层次感”

这个知识图谱分为三个层级,就像一个“信息金字塔”:

  • 文档级:每个文档会提取5个核心主题(比如“机器学习”文档可能提取“监督学习”“无监督学习”等主题),这些主题会传递给文档内的所有块和句子。
  • 块级:基于前面提到的相似度矩阵,存储文档内和跨文档的高相似度关联。
  • 句子级:每个句子作为其父块的子节点存在,只与自身所在的块关联,避免图谱过于复杂。

这种结构既能保证信息的细粒度(句子级),又能通过主题和相似度关联实现宏观的知识整合。

知识图谱架构
图D:多层知识图谱架构。文档级提取主题,块级存储相似度关联,句子级作为子节点存在,形成轻量级且易于遍历的结构。

知识图谱遍历算法:七种方式探索信息网络

有了结构清晰的知识图谱,接下来的核心就是如何“游走”在这个网络中,找到与用户查询最相关的信息。研究中提出了七种算法,每种算法都有其独特的“探索策略”。

所有算法的起点都是一致的:先找到与用户查询最相似的“锚点块”(anchor chunk),就像航海时先确定第一个坐标。然后,不同算法会按照各自的规则选择下一步的方向。

1. basic_retrieval:传统RAG的“对照组”

这是最基础的算法,没有遍历过程,主要作为对比基准。它的工作方式和传统RAG类似:

  1. 将用户查询转化为向量
  2. 直接在知识图谱中找到与查询向量最相似的块
  3. 不断选取相似度最高的块,直到收集到10-15个句子,或者新找到的块不如已提取的句子相关

这种方式简单直接,但缺乏对知识图谱中关联信息的探索,可能会漏掉那些需要“多跳”才能找到的重要内容。

2. query_traversal:以查询为“指南针”

这种算法始终以用户查询为导向,就像带着指南针在地图上导航:

  1. 从锚点块出发
  2. 每次都选择与用户查询最相似的相邻块(包括文档内和跨文档的关联块)
  3. 提取每个访问过的块中的句子,且不重复访问同一区块
  4. 当收集到足够的句子(10-15句),或者已提取的句子比任何未访问的块更相关时,停止遍历

这种方式的优势是始终聚焦于查询本身,不容易“跑偏”,适合需要精准匹配查询意图的场景。

查询遍历示意图

3. kg_traversal:跟着“本地关系”探索

和query_traversal不同,这种算法更像是“随遇而安”的探索者,不看查询,只看当前所在块的邻居:

  1. 从锚点块出发
  2. 每次选择与当前块最相似的相邻块(只看知识图谱内部的关联,不考虑与查询的相似度)
  3. 为了避免重复,跳过包含已提取句子的块
  4. 当下一步的相似度不如上一步时(说明可能偏离主题),或者收集到足够句子时,停止遍历

这种方式更擅长探索知识图谱中的“隐藏关联”,但也可能因为远离查询而收集到不相关的信息。

4. triangulation_average:平衡“三方意见”

这种算法就像在做“三方投票”,综合考虑查询、当前块和候选块三者的关系:

  1. 从锚点块出发
  2. 对每个候选块,计算三个相似度的平均值:查询与当前块的相似度、查询与候选块的相似度、当前块与候选块的相似度
  3. 选择平均值最高的候选块作为下一步
  4. 当已提取句子的平均相似度超过所有候选块时,停止遍历

通过平衡三方关系,这种算法既能保持对查询的关注,又能利用知识图谱的内部关联,适合需要兼顾精准性和探索性的场景。

三角平均遍历示意图

5. triangulation_geometric_3d:用几何位置“定位”相关信息

这种算法将高维的向量嵌入通过PCA降维到3D空间,就像把复杂的信息映射到一个可可视化的立体地图上:

  1. 将查询、当前块、候选块的向量都降维到3D空间
  2. 计算这三个点形成的三角形的“重心”
  3. 选择重心最接近查询点的候选块作为下一步

通过几何空间的直观距离来判断相关性,这种方式能利用空间关系捕捉潜在的语义关联。

6. triangulation_fulldim:保留完整信息的“精确计算”

和3D几何 triangulation 类似,但它不做降维,直接在原始的高维向量空间(通常是1024维)中计算:

  1. 基于原始高维向量,计算查询、当前块、候选块形成的三角形重心
  2. 选择重心与查询向量距离最近的候选块

这种方式保留了向量的全部信息,数学上更严谨,适合对精度要求高的场景,但计算成本也相对较高。

7. llm-guided_traversal:让AI来“做决定”

这种算法引入了大语言模型作为“向导”,类似于请一位专家来规划探索路径:

  1. 从锚点块出发,每次找出与查询最相似的5个候选块
  2. 向LLM提供以下信息:用户的查询、已提取的句子摘要、5个候选块的预览和相似度
  3. LLM根据这些信息选择下一步的块,或者决定停止遍历
  4. 如果LLM的回答无效,自动 fallback 到相似度最高的候选块

这种方式灵活性最高,能处理复杂的语义判断,但速度较慢,且会产生额外的API调用成本。

LLM引导遍历示意图

如何使用这些算法?

如果你想亲自尝试这些算法,可以按照以下步骤操作:

1. 准备环境

首先,确保你的电脑安装了Python 3.12和ollama(用于运行本地大语言模型)。然后执行以下命令:

# 克隆代码仓库
git clone https://github.com/glacier-creative-git/knowledge-graph-traversal-semantic-rag-research
cd knowledge-graph-traversal-semantic-rag-research

# 创建虚拟环境
python3.12 -m venv .venv 
source .venv/bin/activate  # Windows系统使用 .venv\Scripts\activate

# 安装依赖
pip install -r requirements.txt

2. 配置API密钥

创建一个.env文件,填入所需的API密钥(根据你使用的服务选择填写):

# OpenAI配置
OPENAI_API_KEY=你的openai-api-key

# Ollama配置(本地运行时无需密钥)
OLLAMA_BASE_URL=http://localhost:11434

# Anthropic配置
ANTHROPIC_API_KEY=你的anthropic-api-key

# 评估工具配置
CONFIDENT_AI_API_KEY=你的deepeval-api-key

其中,CONFIDENT_AI_API_KEY需要注册DeepEval账号获取,这是用于评估算法性能的工具。

3. 运行演示 notebook

执行以下命令启动交互式笔记本,里面包含算法测试和知识图谱可视化:

jupyter notebook research_demonstration.ipynb

在笔记本中,你可以直观地看到不同算法的遍历路径,比如下面这样的可视化结果:

全局遍历路径示例
图B:LLM在“机器学习”和“人工智能”文档之间的全局遍历路径。从“机器学习”出发,第5步短暂跳转到“人工智能”,然后返回。

4. 运行基准测试

如果想对比不同算法的性能,可以使用benchmark.py脚本:

# 查看帮助
python benchmark.py --help

# 运行测试(默认测试所有七种算法)
python benchmark.py

配置文件config.yaml可以调整测试参数,比如测试的问题数量、每个算法的最大句子数等。

算法性能如何?测试结果分析

为了验证这些算法的效果,研究中使用了两个合成数据集进行测试,分别包含20个和50个问题,涵盖推理、多上下文和比较性查询等场景。测试指标包括:

  • 精确率(Precision):检索到的信息与查询的相关性
  • 召回率(Recall):是否检索到了所有必要的信息
  • 答案相关性(Answer Relevancy):生成的答案与查询的匹配度
  • 忠实度(Faithfulness):答案与检索到的信息的一致性

20题数据集(主题导向)测试结果

算法 精确率 召回率 答案相关性 忠实度 通过测试数
basic_retrieval 0.87 0.74 0.91 0.93 16/20
query_traversal 0.83 0.83 0.91 1.00 16/20
kg_traversal 0.73 0.72 0.98 0.92 15/20
triangulation_average 0.84 0.77 0.96 1.00 16/20
triangulation_geometric_3d 0.86 0.77 0.96 1.00 16/20
triangulation_fulldim 0.90 0.78 0.95 0.99 17/20
llm_guided_traversal 0.88 0.82 0.95 1.00 17/20

在这个侧重跨文档主题关联的数据集上,triangulation_fulldimllm_guided_traversal表现最佳,通过了最多的测试。其中triangulation_fulldim的精确率最高(0.90),而query_traversal在精确率和召回率上达到了平衡(均为0.83)。

50题数据集(多跳序列)测试结果

算法 精确率 召回率 答案相关性 忠实度 通过测试数
basic_retrieval 0.93 0.88 0.99 0.99 48/50
query_traversal 0.91 0.91 0.98 1.00 50/50
kg_traversal 0.93 0.87 0.99 0.99 49/50
triangulation_average 0.92 0.87 0.98 0.99 49/50
triangulation_geometric_3d 0.93 0.85 0.98 1.00 48/50
triangulation_fulldim 0.93 0.87 1.00 0.97 47/50
llm_guided_traversal 0.91 0.94 0.99 0.99 49/50

在这个更复杂的多跳场景中,query_traversal表现最为突出,通过了所有50个测试,且精确率和召回率均为0.91,平衡得非常好。llm_guided_traversal则以0.94的召回率领先,说明它能更全面地捕捉必要信息。

关键发现

  1. query_traversal的普适性:在两个数据集上都表现优异,尤其在多跳场景中实现了100%的通过率,说明以查询为导向的遍历在大多数情况下是可靠的选择。
  2. LLM引导的优势llm_guided_traversal在召回率上领先,适合需要全面信息覆盖的场景,但速度和成本是需要考虑的因素。
  3. 三角测量算法的精准性:三种triangulation算法在精确率上表现较好,适合对信息相关性要求高的场景,但召回率略低,可能需要进一步优化。
  4. kg_traversal的局限性:由于不直接参考查询,它在两个数据集上的表现都相对较弱,说明完全依赖知识图谱内部关联可能会偏离查询意图。

常见问题解答(FAQ)

这些算法和传统RAG有什么本质区别?

传统RAG更像“一次性检索”,直接从向量库中找出最相似的文本片段;而这些算法则是“探索式检索”,从一个锚点出发,通过知识图谱的关联逐步扩展,像“寻宝”一样找到相关信息。这种方式能捕捉到那些需要多步关联才能发现的深层信息。

如何选择适合自己的算法?

  • 如果追求简单高效,选basic_retrieval
  • 如果需要平衡精准性和探索性,选query_traversal
  • 如果重视信息的全面性,且能接受较高成本,选llm_guided_traversal
  • 如果对精确率要求极高,且能接受略低的召回率,选triangulation_fulldim

知识图谱的大小会影响算法效果吗?

会。实验中使用了10个文档的小型知识图谱,当图谱扩大到数百甚至数千个文档时,算法的性能可能会变化。比如kg_traversal在大型图谱中可能更容易偏离主题,而query_traversal的稳定性可能更突出。

这些算法可以应用在哪些领域?

适合需要深度语义理解的领域,比如:

  • 学术研究:快速从大量论文中梳理关联知识点
  • 智能问答:为用户提供更全面、准确的答案
  • 信息分析:从多源文档中提取关键关联信息

运行这些算法需要很强的算力吗?

基础算法(如query_traversaltriangulation_average)对算力要求不高,普通电脑即可运行;但triangulation_fulldim由于涉及高维向量计算,可能需要更强的CPU;llm_guided_traversal则受限于LLM的运行速度,本地部署 Ollama 模型(如llama 3.1:8b)是比较经济的选择。

总结:知识图谱遍历算法的价值与未来

这些新型知识图谱遍历算法为语义RAG系统提供了更灵活、更智能的信息检索方式。通过在知识图谱中进行有目的的探索,它们能够突破传统RAG的局限,捕捉到信息之间的深层关联,从而为大语言模型提供更精准、更全面的上下文。

从测试结果来看,query_traversalllm_guided_traversal在大多数场景中表现最佳,既能保持对查询的聚焦,又能有效利用知识图谱的关联信息。未来,这些算法还有很大的优化空间,比如加入“路径预测”功能(提前规划多步遍历路径)、适配更大规模的知识图谱、结合领域知识进行算法微调等。

如果你正在构建RAG系统,或者对知识图谱的应用感兴趣,这些算法提供了一个值得探索的方向。通过平衡精准性、全面性和效率,它们有望让AI系统在处理复杂信息时更接近人类的思维方式——不仅能找到“表面相似”的信息,更能理解“深层关联”的意义。