第 11 章 · 知识图谱 GraphRAG

生成式AI进入知识图谱时代?微软开源的GraphRAG爆火,Github Star量破万 这里,这两个答案都是准确的。近日,Neo4j 公司 CTO Philip Rathle 发布了一篇标题为《GraphRAG 宣言:将知识加入到生成式 AI 中》的博客文章,Rathle 用通俗易懂的语言详细介绍了 GraphRAG 的原理、与传统 RAG 的区别、GraphRAG 的优势等。现如今,RAG 是一种使用真实世界信息改进 LLM 输出的技术,是大多数基于 LLM 的工具的重要组成部分,一般而言,RAG 使用向量相似性作为搜索,称之为 Baseline RAG(基准RAG)。 阅读详情

版本:Spring AI 2.0.1

目标:弄清知识图谱和向量 RAG 各解决什么问题;用 Neo4j + 结构化抽取 + 受限 Cypher Tool,把「写图 → 查图」接到 ChatClient。

说明: Spring AI 2.0.1 没有独立的 GraphRAG 模块。本章做的是:在图库上自己建 schema、自己写图、自己用 @Tool 查图。

向量 RAG 按语义相似度找文本片段。下面这类问题,只靠向量往往不够稳:

问题类型例子向量 RAG 容易怎样
多跳Acme 的供应商合规等级是什么?两段文档可能分别提到供应商和合规,但拼不成路径
约束谁同时在项目 X,又不能接触数据 Y?相似段落有了,交集/排除难做准
消歧两个「张三」各在哪家公司?同名实体容易混

知识图谱把事实写成节点 + 边,查询用 Cypher 沿关系走,而不是只比向量距离。


11.1 和向量 RAG 怎么选

向量 RAG(第 10 章)知识图谱(本章)
存什么文本 chunk + embedding实体节点、关系边、属性
怎么查向量相似度图模式匹配 / Cypher
适合FAQ、手册、非结构化叙述多跳、约束、关系校验
你要付的成本切分、embedding、召回调参schema、抽取质量、图数据治理
Spring AI 里用什么VectorStore + QA / Modular AdvisorNeo4jVectorStore(向量)、entity(...)(抽取)、@Tool(查图)

判断口诀:

只要「找相关段落」→ 向量 RAG
必须「沿关系走两步以上」→ 图谱(或图 + 向量一起用)
先上线问答 → 先 RAG;关系类问题变多再补图

11.2 Neo4jVectorStore 是什么、不是什么

依赖与配置:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-vector-store-neo4j</artifactId>
</dependency>
spring:
  ai:
    vectorstore:
      neo4j:
        database-name: neo4j
        index-name: spring-ai-index
  neo4j:
    uri: bolt://localhost:7687
    authentication:
      username: neo4j
      password: ${NEO4J_PASSWORD}

Neo4jVectorStore 的含义很具体:把向量检索放在 Neo4j 里做。 它不会自动帮你建业务实体、建 WORKS_AT 边,也不会自动生成 GraphRAG Agent。

业务知识图谱还要你自己做三件事:

  1. 定 schema(有哪些 Label、Relationship、主键、租户字段)

  2. 从文档抽出三元组,用参数化 Cypher 写入

  3. 用预置 @Tool 查图,而不是让模型自由拼 Cypher

另外还有 Neo4jChatMemoryRepository:那是对话记忆存在 Neo4j,和业务知识图谱不是一回事。


11.3 落地路径:抽 → 写 → 查

整条链路就是图上那五步:文档 → entity() 抽三元组 → MERGE 写 Neo4j → 受限 @Tool → ChatClient 回答。

1)先定 Schema

关系名、主键、租户字段先写死,再让模型填值。Schema 漂了,抽取和查询一起漂。

(:Person {id, name, tenantId})
(:Company {id, name, tenantId})
(:Document {id, title})
(Person)-[:WORKS_AT]->(Company)
(Company)-[:SUPPLIES]->(Company)
(Document)-[:MENTIONS]->(Person|Company)

建议同时建唯一约束,例如 Person(id, tenantId)、Company(id, tenantId),避免重复节点。

2)用 entity() 抽三元组

public record KgTriple(String subjectId, String subjectName,
                       String relation,
                       String objectId, String objectName) {}
​
public record KgExtractResult(List<KgTriple> triples) {}
​
KgExtractResult extracted = chatClient.prompt()
        .system("""
                从文本中抽取实体关系三元组。
                relation 只能是:WORKS_AT、SUPPLIES、MENTIONS。
                subjectId / objectId 用稳定业务 id;没有 id 时用规范化名称生成可复现的 key。
                """)
        .user(documentText)
        .call()
        .entity(KgExtractResult.class);
​
kgWriter.mergeTriples(tenantId, documentId, extracted.triples());

要点:

  • relation 限制在白名单,减少模型乱造边类型

  • 抽出的结果要校验(空 id、非法 relation 直接丢掉)

  • 本章目标是「抽得出、写得进」;更重的自纠流水线以后再加

3)参数化 MERGE 写图

以 WORKS_AT 为例:

public void mergeWorksAt(String tenantId,
                         String personId, String personName,
                         String companyId, String companyName,
                         String documentId) {
    String cypher = """
            MERGE (p:Person {id: $personId, tenantId: $tenantId})
            SET p.name = $personName
            MERGE (c:Company {id: $companyId, tenantId: $tenantId})
            SET c.name = $companyName
            MERGE (p)-[:WORKS_AT]->(c)
            MERGE (d:Document {id: $documentId})
            MERGE (d)-[:MENTIONS]->(p)
            MERGE (d)-[:MENTIONS]->(c)
            """;
    neo4jClient.query(cypher)
            .bind(tenantId).to("tenantId")
            .bind(personId).to("personId")
            .bind(personName).to("personName")
            .bind(companyId).to("companyId")
            .bind(companyName).to("companyName")
            .bind(documentId).to("documentId")
            .run();
}

mergeTriples 里按 relation 映射到固定方法,不要把模型吐出的关系名直接拼进 Cypher:

public void mergeTriples(String tenantId, String documentId, List<KgTriple> triples) {
    for (KgTriple t : triples) {
        switch (t.relation()) {
            case "WORKS_AT" -> mergeWorksAt(
                    tenantId, t.subjectId(), t.subjectName(),
                    t.objectId(), t.objectName(), documentId);
            case "SUPPLIES" -> mergeSupplies(
                    tenantId, t.subjectId(), t.subjectName(),
                    t.objectId(), t.objectName(), documentId);
            case "MENTIONS" -> mergeMentions(tenantId, documentId, t);
            default -> { /* 非法关系:丢弃并记日志 */ }
        }
    }
}

4)查询:受限 Cypher Tool

模型只负责选「调哪个预置查询」并填业务参数;Cypher 模板和 tenantId 都在服务端。

@Service
public class KgQueryTools {
​
    private final KgQueryService kgQueryService;
​
    public KgQueryTools(KgQueryService kgQueryService) {
        this.kgQueryService = kgQueryService;
    }
​
    @Tool(description = "查询某人任职的公司")
    public String companiesOfPerson(
            @ToolParam(description = "人员业务 id") String personId,
            ToolContext ctx) {
        String tenantId = String.valueOf(ctx.getContext().get("tenantId"));
        return kgQueryService.findCompanies(tenantId, personId);
    }
​
    @Tool(description = "查询公司两跳供应商的合规等级")
    public String supplierCompliance(
            @ToolParam(description = "公司业务 id") String companyId,
            ToolContext ctx) {
        String tenantId = String.valueOf(ctx.getContext().get("tenantId"));
        return kgQueryService.supplierComplianceTwoHop(tenantId, companyId);
    }
}

服务端查询仍然参数化:

MATCH (p:Person {id: $personId, tenantId: $tenantId})-[:WORKS_AT]->(c:Company)
RETURN c.id AS id, c.name AS name

两跳供应商示例:

MATCH (a:Company {id: $companyId, tenantId: $tenantId})
      -[:SUPPLIES]->(b:Company {tenantId: $tenantId})
OPTIONAL MATCH (b)-[:HAS_COMPLIANCE]->(g:Compliance)
RETURN b.id AS supplierId, b.name AS supplierName, g.level AS level

挂到 ChatClient:

chatClient.prompt()
        .user("张三现在在哪家公司?")
        .tools(kgQueryTools)
        .toolContext(Map.of("tenantId", tenantId))
        .call()
        .content();

tenantId 放进 ToolContext,不要做成模型可随意填写的 @ToolParam。


11.4 和向量 RAG 一起用

常见拼法:

用户问题
  → 向量 RAG 召回相关文档 / 实体线索(人名、公司名、文档 id)
  → 图谱 Tool 做多跳扩展或约束校验
  → 模型综合回答(注明依据:文档 id / 图路径)

Advisor 顺序通常仍是:记忆 → RAG → Tool(图谱查询挂在 Tool 层)。 Spring AI 没有「打开一个开关就自动 GraphRAG」的 Advisor;混合就是同一次对话里同时挂上向量检索和图谱 Tool。


11.5 安全与数据质量

风险做法
模型自由拼 Cypher只暴露预置查询 Tool;模板 + $param
跨租户读到别人的图节点带 tenantId;查询强制过滤;tenantId 来自 ToolContext
抽出不存在的边关系白名单;抽检;关键关系二次确认
图越写越脏幂等 MERGE;带来源 Document id,方便回溯
对话里误删图写图 Tool 和读图 Tool 分开;对用户开放的对话默认只挂读

11.6 小结

  • 向量 RAG:找相近段落。

  • 知识图谱:沿实体关系回答多跳和约束问题。

  • Neo4jVectorStore:只是「向量存在 Neo4j」;业务图要自己建。

  • 本章闭环:定 schema → entity() 抽取 → 参数化 MERGE → 受限 Cypher @Tool →(可选)和 RAG 一起用。

基于知识图谱与GraphRAG的医疗问答系统:从原理到工程实践 知识图谱作为一种结构化的知识表示方法,通过实体、属性和关系构建语义网络,能够精准表达领域内复杂的关联信息。其核心原理在于将非结构化数据转化为图结构,利用图数据库(如Neo4j)进行高效存储与关联查询。这一技术价值在于为人工智能应用提供了可解释、可追溯的精准知识源,尤其在医疗、金融等专业领域,能有效解决传统检索方法难以处理的复杂关系推理问题。结合大语言模型(LLM)强大的自然语言理解与生成能力,知识图谱可作为其可靠的外部知识库,通过检索增强生成(RAG)技术,将检索到的结构化知识片段注入LLM上下文,从而生成 阅读详情

相关推荐

LLM - 使用 Neo4j 可视化 GraphRAG 构建的 知识图谱(KG) 教程

Neo4j 是一个高性能的图形数据库,允许用户以图形的形式存储和检索数据,这种形式非常适合处理复杂的关系和网络结构,因其在数据关系处理方面的强大能力而广受欢迎,尤其是在社交网络、推荐系统、网络分析等领域。

AGI 3283

GraphRAG - 使用 LLM 生成知识图谱

GraphRAG是微软开源的一个项目,它利用图(Graph)来增强检索(Retrieval)和生成(Generation)的能力,通过结合知识图谱与图机器学习,提升大型语言模型在私有数据集上的推理和问答性能。

1811

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7633

微软开源GraphRAG的使用教程-使用自定义数据测试GraphRAG

这篇文章主要介绍了微软开源的GraphRAG的安装教程,并以《太白金星有点烦》为例,动手实操测试了下GraphRAG的实际效果。

luxinfeng的博客 2万+

详细解读文字识别工具———Tesseract-OCR

   在尝试破解12306验证码的时候,提前了解了一下应对各种验证码的解决方案,这里主要是学习到了面对文字图片验证码,例如亚马逊、豆瓣等平台的登录时会遇到的情况,效果还不错。 一、工具介绍 ​    Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition...

别看我只是一只羊 2万+

ROS2实战:构建模块化启动文件(launch file)以驱动复杂机器人系统

本文详细介绍了ROS2中构建模块化启动文件(launch file)的最佳实践,帮助开发者高效管理复杂机器人系统的节点启动。通过功能分解、参数化设计和嵌套启动等技术,实现批量管理、依赖控制和配置统一,显著提升系统稳定性和调试效率。文章包含实战代码示例和工程化建议,特别适合自动驾驶、物流机器人等场景应用。

weixin_28744613的博客 215

GraphRAG:基于知识图谱的RAG,好用,贼贵!

本篇文章,我们就来探索GraphRAG的魅力,看它是否真的能带来意想不到的惊喜。

2401_82469710的博客 1034

STM32 FATFS文件系统按行读取SD卡数据

STM32 SD数据实现按行读取

qq_32216815的博客 7826

【GraphRAG】基于知识图谱的RAG:高效好用,但成本不菲!

官网:https://microsoft.github.io/graphrag微软开源的一项结合了知识图谱的检索增强生成技术。简单来说,它可以显著提升AI知识库的性能,让AI能根据你提供的文档,更准确地回答你提出的复杂问题。

2401_84494441的博客 1478

2D激光slam四种算法建图效果对比

2d激光slam四种算法建图比较

m0_73791170的博客 8449

从4A架构的角度出来 帮我分析一下:数字化转型深水区:企业架构如何成为价值重构的核心引擎?

4A 架构的本质是构建企业的数字神经系统,通过业务感知、数据传输、决策执行、技术支撑的闭环,实现从效率提升到生态重构的质变。正如华为通过该架构实现全球研发资源统一调度,某零售集团借此打造线上线下融合的新零售体系,当业务、数据、应用、技术四个维度形成共振时,企业将获得持续进化的数字免疫力,在不确定的市场环境中保持韧性生长。这一过程不仅需要技术工具的升级,更依赖组织文化的变革 —— 从 “部门墙” 到 “能力网” 的转型,才是数字化转型深水区的终极挑战。

金牌架构师 1046

GraphRAG配置系统详解:构建高效AI知识图谱的完整指南

本文深入探讨了GraphRAG(Graph-based Retrieval Augmented Generation)的配置系统,这是一个强大的AI知识图谱构建工具。我们将从基础配置到高级特性,全面解析如何通过YAML/JSON配置文件来定制化GraphRAG的行为。通过本文,您将掌握如何构建高效、可扩展的知识图谱系统,为您的AI应用提供强大的知识支持。fill:#333;color:#333;color:#333;fill:none;配置文件YAML/JSON解析器配置管理器语言模型配置。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1430

库存管理系统项目部署方案(基于jdk17)

不需要安装到服务器,运维本地安装就行,主要是用来编译前端代码的。构建完成后将dist文件夹复制到服务器内。

程序员诚哥 6373

GraphRAG 入门:4 条命令把一堆文本变成可查询的知识图谱

GraphRAG 是微软开源的模块化图检索增强生成(RAG)系统:你不用手写标注脚本,把一堆非结构化文本丢进目录,它会用大语言模型自动抽取实体和关系,构建分层知识图谱,并为每个社区生成摘要报告,从而能同时回答“某个角色是谁”和“整个语料在讲什么”这类不同层次的问题。如果你之前只用过传统向量检索,又想试试基于图谱的检索方式,这是一条开箱即用的流水线。注意该项目目前处于维护模式(以修 bug 和更新依

gitblog_00971的博客 866

一文学会VOS2009对接网关指定走某个落地网关

介绍:  在我们日常使用VOS2009/3000的过程中,肯定会有很多落地网关与对接网关,并且某些时候还需要某些对接网关指定去走某个落地网关或者某些落地网关,从而实现比较精准的控制对接网关与落地网关的关系,下面就演示下在VOS2009/3000中如何配置某个对接网关指定走某个或者多个落地网关。 实现步骤:  VOS2009可以通过添加固定前缀的方式来指定对接网关走某个落地网关。 比如:  r1对接网关在被叫改写规则里面填写*:a*  r2对接网关在被叫改写规则里填写*:b* 1.登录VOS客户端 2.进入

非著名运维的博客 1963

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【亲测免费】 nano-graphrag:简化版的GraphRAG实现

在自然语言处理(NLP)领域,图关系自动生成(GraphRAG)是一种有效的技术,它通过构建文本片段之间的关联图来增强语言模型的理解能力。然而,现有的GraphRAG官方实现复杂且难以修改。nano-graphrag项目提供了一个简化、易于理解的GraphRAG实现,保持了核心功能的同时,提供了更加灵活和轻量级的解决方案。 ## 项目技术分析 nano-graphrag是基于Python的开源

gitblog_00308的博客 1019

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

GraphRag知识图谱可视化工具:Gephi操作完全指南

知识图谱(Knowledge Graph)作为连接实体与关系的结构化数据模型,在增强检索(Retrieval-Augmented Generation, RAG)系统中扮演关键角色。GraphRag生成的知识图谱包含大量实体、关系和属性信息,直接分析原始数据文件(如GraphML)难以直观理解其结构特征。Gephi作为开源网络分析与可视化工具,提供了强大的布局算法、社区检测和交互式探索功能,可帮助...

gitblog_00544的博客 1557

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

GraphRAG:基于知识图谱的RAG,好用,但是贼贵!

在实际使用过程中,我们发现传统RAG的表现并未完全满足预期(例如:在处理数据时,使用默认效果不佳,切片乱七八糟。因此需要花费很大精力去处理数据,比如编写文档时统一规范、使用一些工具/脚本对数据源进行预处理和清洗,这些比起AI本身的价值更大)。

Y525698136的博客 2902

通用知识库搭建与知识图谱构建全指南(RAG + GraphRAG 实战)

微软 2024 年开源了 microsoft/graphrag,是目前 GraphRAG 事实上的标准实现。构建阶段(Indexing)切片:与 RAG 类似,把文档切成片段;LLM 建图:用 LLM 从每个片段中抽取实体和关系,写入知识图谱;社区检测(Community Detection):用图算法(如 Leiden)把图谱划分成"社区"(联系紧密的节点簇);社区摘要(Community Summaries):用 LLM 为每个社区生成一段摘要——相当于给"关系网"写"部门简介"。

ITOfDragon的博客 1244

实战微软新一代RAG:GraphRAG

1.它是基于LLM构建的知识图谱,在构建过程中会消耗大量的Token,其中本次测试2.9w花费了大概13w token。2.它支持2种搜索方法,局部和全局,全局效果最好,但是对模型的token处理能力有要求。3.框架仅支持OpenAI SDK协议的的LLM,国内目前只有千问和月之暗面可以,如果精力充足的网友也可以基于OpenAI的协议魔改自己想要接入的大模型,其实就是封装一个网关。

我是新手的博客 2371

从自己的文本构建可查询的知识图谱:GraphRAG 完整实战指南

GraphRAG 是微软开源的模块化图检索增强生成(RAG)系统,它让 LLM 自动从非结构化文本里抽取实体与关系,聚合成带社区报告的分层知识图谱。读完这篇文章,你能走通 GraphRAG 安装、索引构建、四种问法查询的主流程,并知道批量使用前该动哪几处配置。 ## 从切片到图谱:GraphRAG 到底解决什么问题 传统 RAG 把文档切成文本块,靠向量相似度捞回几个片段再拼给 LLM。遇到"

gitblog_00476的博客 957

如何用 GraphRAG 把一堆文档变成可问答的知识图谱

你有没有过这样的经历:硬盘里堆着几百份报告、会议纪要和访谈记录,想弄清楚"谁和谁合作过""哪些决策影响了哪些事件",关键词检索翻了一天,只找到零散的片段,串不成完整的线索。 GraphRAG 就是为这种场景做的开源系统。它是一个基于知识图谱的检索增强生成(RAG)框架——RAG 指的是先从知识库中检索相关资料、再让大模型基于资料作答的方式,知识图谱则是由实体(人、地点、事件)和它们之间的关系连成

gitblog_00922的博客 245

GraphRAG 怎么用知识图谱回答“整个语料库在讲什么主题“

GraphRAG 是微软研究院开源的一套基于图的检索增强生成(RAG)系统:它用大语言模型从非结构化文本中抽取实体和关系,构建知识图谱并自动生成多级社区报告,让你能问出"整批文档里有哪些反复出现的主题"这类传统 RAG 很难回答的全局问题,并附带引用来源。这篇文章按"问题 → 机制 → 上手 → 进阶"的顺序讲清楚它怎么工作、怎么跑起来。 ## 痛点:传统 RAG 回答不了"全局性"问题 假设

gitblog_00100的博客 796

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 225
上一篇: 第 10 章 · Embedding、VectorStore 与 RAG
下一篇: 第 12 章 · AI智能体的结构化输出与流式响应
AI深栈
博客等级 码龄14年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值