在人工智能快速发展的今天,大语言模型(LLMs)已经成为信息处理的重要工具。但仅凭模型自身的知识,往往难以精准回答复杂或专业领域的问题。这就是检索增强生成(RAG)系统的价值所在——它能为LLMs提供来自数据库或知识图谱的上下文,帮助模型生成更准确的回答。
不过,传统RAG系统存在一个明显局限:它们大多依赖向量存储中的文本匹配,这种方式往往难以捕捉信息之间的深层关联。为此,研究人员开发了一系列新型知识图谱遍历算法,通过在知识图谱中进行有意义的移动,提取与用户查询高度相关的精准信息。本文将详细介绍这些算法的原理、实现和效果,帮助你理解如何利用知识图谱提升RAG系统的性能。
什么是语义检索增强生成(RAG)系统?
简单来说,语义RAG系统是一种结合了信息检索和生成式AI的技术。当用户提出一个问题时,系统不会直接让大语言模型生成答案,而是先从预设的知识库中找到与问题相关的信息,再将这些信息作为上下文传递给模型,让模型基于这些“依据”生成回答。
传统RAG系统的工作流程大致是:
-
将用户的查询转化为向量(通过嵌入模型) -
在向量数据库中寻找与查询向量最相似的文本片段 -
将找到的文本片段输入大语言模型,生成回答
这种方式的问题在于,它更像是“大海捞针”式的匹配,可能会漏掉那些虽然表面相似性不高,但在语义关联上更重要的信息。而基于知识图谱的RAG系统,则通过构建信息之间的关联网络,让检索过程更接近人类的“思考路径”——从一个知识点出发,逐步探索相关联的内容,最终找到最有价值的信息。
知识图谱的架构:让信息“互联互通”
要理解这些新型遍历算法,首先需要了解它们所依赖的知识图谱是如何构建的。这个知识图谱采用了分层结构,既保证了信息的颗粒度,又实现了高效的关联。
从文本到知识图谱:分块与关联
构建知识图谱的第一步是处理原始文档。研究中采用了“三句滑动窗口”的分块策略:以3个句子为一个基本单位,每次移动1个句子,这样能确保相邻块之间有一定重叠,让信息过渡更“平滑”。
为什么要这样做?因为知识的关联往往存在于句子之间的衔接处,重叠的分块方式能避免因生硬切割而破坏语义关联。比如一段关于“机器学习发展史”的文字,相邻的句子可能分别提到“1950年代的早期探索”和“1960年代的算法突破”,重叠分块能让这两个相关内容被更自然地关联起来。
相似度矩阵:找到信息的“亲密关系”
分块之后,系统会计算所有块之间的相似度,形成一个“相似度矩阵”。这个矩阵就像一张“关系网”,红色表示两个块的语义相似度高,蓝色则表示相似度低。

图A:维基百科“神经科学”文档的相似度矩阵,展示了所有3句窗口之间的余弦相似度比较。对角线的红色表示块与自身的相似度为1,蓝色区域则表示相关性较低。
为了减少内存占用,系统不会存储所有相似度数据,而是只保留每个块的前10个最相似块( intra-document 相似度,即文档内的关联)和跨文档的前若干个相似块( inter-document 相似度,即文档间的关联)。这些保留的高相似度对,就构成了知识图谱的“边”,将不同的信息块连接起来。
层级属性:让知识更有“层次感”
这个知识图谱分为三个层级,就像一个“信息金字塔”:
-
文档级:每个文档会提取5个核心主题(比如“机器学习”文档可能提取“监督学习”“无监督学习”等主题),这些主题会传递给文档内的所有块和句子。 -
块级:基于前面提到的相似度矩阵,存储文档内和跨文档的高相似度关联。 -
句子级:每个句子作为其父块的子节点存在,只与自身所在的块关联,避免图谱过于复杂。
这种结构既能保证信息的细粒度(句子级),又能通过主题和相似度关联实现宏观的知识整合。

图D:多层知识图谱架构。文档级提取主题,块级存储相似度关联,句子级作为子节点存在,形成轻量级且易于遍历的结构。
知识图谱遍历算法:七种方式探索信息网络
有了结构清晰的知识图谱,接下来的核心就是如何“游走”在这个网络中,找到与用户查询最相关的信息。研究中提出了七种算法,每种算法都有其独特的“探索策略”。
所有算法的起点都是一致的:先找到与用户查询最相似的“锚点块”(anchor chunk),就像航海时先确定第一个坐标。然后,不同算法会按照各自的规则选择下一步的方向。
1. basic_retrieval:传统RAG的“对照组”
这是最基础的算法,没有遍历过程,主要作为对比基准。它的工作方式和传统RAG类似:
-
将用户查询转化为向量 -
直接在知识图谱中找到与查询向量最相似的块 -
不断选取相似度最高的块,直到收集到10-15个句子,或者新找到的块不如已提取的句子相关
这种方式简单直接,但缺乏对知识图谱中关联信息的探索,可能会漏掉那些需要“多跳”才能找到的重要内容。
2. query_traversal:以查询为“指南针”
这种算法始终以用户查询为导向,就像带着指南针在地图上导航:
-
从锚点块出发 -
每次都选择与用户查询最相似的相邻块(包括文档内和跨文档的关联块) -
提取每个访问过的块中的句子,且不重复访问同一区块 -
当收集到足够的句子(10-15句),或者已提取的句子比任何未访问的块更相关时,停止遍历
这种方式的优势是始终聚焦于查询本身,不容易“跑偏”,适合需要精准匹配查询意图的场景。

3. kg_traversal:跟着“本地关系”探索
和query_traversal不同,这种算法更像是“随遇而安”的探索者,不看查询,只看当前所在块的邻居:
-
从锚点块出发 -
每次选择与当前块最相似的相邻块(只看知识图谱内部的关联,不考虑与查询的相似度) -
为了避免重复,跳过包含已提取句子的块 -
当下一步的相似度不如上一步时(说明可能偏离主题),或者收集到足够句子时,停止遍历
这种方式更擅长探索知识图谱中的“隐藏关联”,但也可能因为远离查询而收集到不相关的信息。
4. triangulation_average:平衡“三方意见”
这种算法就像在做“三方投票”,综合考虑查询、当前块和候选块三者的关系:
-
从锚点块出发 -
对每个候选块,计算三个相似度的平均值:查询与当前块的相似度、查询与候选块的相似度、当前块与候选块的相似度 -
选择平均值最高的候选块作为下一步 -
当已提取句子的平均相似度超过所有候选块时,停止遍历
通过平衡三方关系,这种算法既能保持对查询的关注,又能利用知识图谱的内部关联,适合需要兼顾精准性和探索性的场景。

5. triangulation_geometric_3d:用几何位置“定位”相关信息
这种算法将高维的向量嵌入通过PCA降维到3D空间,就像把复杂的信息映射到一个可可视化的立体地图上:
-
将查询、当前块、候选块的向量都降维到3D空间 -
计算这三个点形成的三角形的“重心” -
选择重心最接近查询点的候选块作为下一步
通过几何空间的直观距离来判断相关性,这种方式能利用空间关系捕捉潜在的语义关联。
6. triangulation_fulldim:保留完整信息的“精确计算”
和3D几何 triangulation 类似,但它不做降维,直接在原始的高维向量空间(通常是1024维)中计算:
-
基于原始高维向量,计算查询、当前块、候选块形成的三角形重心 -
选择重心与查询向量距离最近的候选块
这种方式保留了向量的全部信息,数学上更严谨,适合对精度要求高的场景,但计算成本也相对较高。
7. llm-guided_traversal:让AI来“做决定”
这种算法引入了大语言模型作为“向导”,类似于请一位专家来规划探索路径:
-
从锚点块出发,每次找出与查询最相似的5个候选块 -
向LLM提供以下信息:用户的查询、已提取的句子摘要、5个候选块的预览和相似度 -
LLM根据这些信息选择下一步的块,或者决定停止遍历 -
如果LLM的回答无效,自动 fallback 到相似度最高的候选块
这种方式灵活性最高,能处理复杂的语义判断,但速度较慢,且会产生额外的API调用成本。

如何使用这些算法?
如果你想亲自尝试这些算法,可以按照以下步骤操作:
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_fulldim和llm_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的召回率领先,说明它能更全面地捕捉必要信息。
关键发现
-
query_traversal的普适性:在两个数据集上都表现优异,尤其在多跳场景中实现了100%的通过率,说明以查询为导向的遍历在大多数情况下是可靠的选择。 -
LLM引导的优势: llm_guided_traversal在召回率上领先,适合需要全面信息覆盖的场景,但速度和成本是需要考虑的因素。 -
三角测量算法的精准性:三种triangulation算法在精确率上表现较好,适合对信息相关性要求高的场景,但召回率略低,可能需要进一步优化。 -
kg_traversal的局限性:由于不直接参考查询,它在两个数据集上的表现都相对较弱,说明完全依赖知识图谱内部关联可能会偏离查询意图。
常见问题解答(FAQ)
这些算法和传统RAG有什么本质区别?
传统RAG更像“一次性检索”,直接从向量库中找出最相似的文本片段;而这些算法则是“探索式检索”,从一个锚点出发,通过知识图谱的关联逐步扩展,像“寻宝”一样找到相关信息。这种方式能捕捉到那些需要多步关联才能发现的深层信息。
如何选择适合自己的算法?
-
如果追求简单高效,选 basic_retrieval -
如果需要平衡精准性和探索性,选 query_traversal -
如果重视信息的全面性,且能接受较高成本,选 llm_guided_traversal -
如果对精确率要求极高,且能接受略低的召回率,选 triangulation_fulldim
知识图谱的大小会影响算法效果吗?
会。实验中使用了10个文档的小型知识图谱,当图谱扩大到数百甚至数千个文档时,算法的性能可能会变化。比如kg_traversal在大型图谱中可能更容易偏离主题,而query_traversal的稳定性可能更突出。
这些算法可以应用在哪些领域?
适合需要深度语义理解的领域,比如:
-
学术研究:快速从大量论文中梳理关联知识点 -
智能问答:为用户提供更全面、准确的答案 -
信息分析:从多源文档中提取关键关联信息
运行这些算法需要很强的算力吗?
基础算法(如query_traversal、triangulation_average)对算力要求不高,普通电脑即可运行;但triangulation_fulldim由于涉及高维向量计算,可能需要更强的CPU;llm_guided_traversal则受限于LLM的运行速度,本地部署 Ollama 模型(如llama 3.1:8b)是比较经济的选择。
总结:知识图谱遍历算法的价值与未来
这些新型知识图谱遍历算法为语义RAG系统提供了更灵活、更智能的信息检索方式。通过在知识图谱中进行有目的的探索,它们能够突破传统RAG的局限,捕捉到信息之间的深层关联,从而为大语言模型提供更精准、更全面的上下文。
从测试结果来看,query_traversal和llm_guided_traversal在大多数场景中表现最佳,既能保持对查询的聚焦,又能有效利用知识图谱的关联信息。未来,这些算法还有很大的优化空间,比如加入“路径预测”功能(提前规划多步遍历路径)、适配更大规模的知识图谱、结合领域知识进行算法微调等。
如果你正在构建RAG系统,或者对知识图谱的应用感兴趣,这些算法提供了一个值得探索的方向。通过平衡精准性、全面性和效率,它们有望让AI系统在处理复杂信息时更接近人类的思维方式——不仅能找到“表面相似”的信息,更能理解“深层关联”的意义。

