Spring AI Alibaba Graph

旨在利用 Spring AI 作为桥梁,连接阿里巴巴的大语言模型(如通义千wen)和图数据库(如阿里云 GDB),以实现通过自然语言与复杂关联数据进行交互的目的。

底层核心原理是 Text-to-Cypher/Gremlin,即将用户的自然语言问题,通过大语言模型(LLM)动态翻译成图数据库的专业查询语言

设计思想

图数据库(Graph Database)非常擅长处理实体之间的复杂关系,例如社交网络中的“朋友的朋友”、金融风控中的“资金链路”、电商中的“共同购买”等。但要查询这些数据,需要使用专门的图查询语言,如 Gremlin (阿里云 GDB 支持) 或 Cypher。这些语言学习门槛高,普通业务人员无法直接使用。

“Spring AI Alibaba Graph”架构的核心思想就是解决这个问题:让 LLM 充当一个智能的“翻译官”。

流程:

赋予 LLM 上下文知识 (Context Awareness):一个通用的 LLM 不知道你的图数据库里有什么。因此,必须在查询时,动态地告诉 LLM 图的“Schema”(模式),包括:

  • 节点标签 (Node Labels):例如 Person(人)、Company(公司)、Product(产品)。

  • 边标签 (Edge Labels):例如 WORKS_FOR(为...工作)、INVESTED_IN(投资了)、BOUGHT(购买了)。

  • 属性 (Properties):每个节点和边上可能有的属性,例如 Person 节点有 name, age 属性。

利用 LLM 的代码生成能力 (Code Generation):大语言模型本质上是一个强大的序列生成器,它不仅能生成文章,也能生成代码。通过精巧的提示工程 (Prompt Engineering),我们可以引导 LLM 将用户的自然语言问题,结合我们提供的图 Schema,生成一段完全正确的 Gremlin 或 Cypher 查询代码。

自动化执行与反馈:生成查询代码后,程序自动执行它,并将结果返回。为了提升用户体验,甚至可以将图数据库返回的结构化数据再次交给 LLM,让它用自然语言进行总结和概括。

架构

实际流程:

用户提问: 用户通过前端界面或 API,输入自然语言问题:“查询投资了‘阿里巴巴’的所有人的姓名”。

Spring 应用接收: 一个基于 Spring Boot 和 Spring AI 构建的后端服务接收到这个请求。

构建精确的 Prompt: 这是最关键的一步。程序会动态构建一个发给 LLM 的 Prompt,它通常包含以下部分:

  • 入口 : 开发者代码调用 graphClient.query("查詢投資了阿里巴巴的所有人")委派 : DefaultGraphClient 将请求委派给 graphChatService.chat("...")检索(Retrieval) : graphChatService 首先调用其持有的 graphStore.getSchema() 方法。 Neo4jGraphStore (假设)会连接 Neo4j 数据库,执行 CALL db.schema.visualization() 或类似命令,获取 Schema 并格式化为文本。 构建(Prompt Construction) : graphChatService 使用 GraphChatPromptFactory ,将上一步获取的 Schema 文本和用户问题填充到一个预设的模板中,生成最终的 Prompt 对象。 生成(Generation) : graphChatService 调用 chatClient.call(prompt)spring-ai-alibaba-tongyi-starter 捕获此调用,向通义千问 API 发送请求。 解析(Parsing) : 通义千问返回一个包含 Cypher 查询的 ChatResponsegraphChatService 使用 GraphCypherResponseParser 从中提取出纯净的 Cypher 查询字符串。 执行(Execution) : graphChatService 拿到查询字符串后,调用 graphStore.execute(cypherQuery)返回 : Neo4jGraphStore 使用 Neo4j Java Driver 执行查询,并将结果返回。这个结果最终沿着调用链返回给开发者。

三大核心

GraphStore,图存储的统一抽象

设计目的 : 将上层的“Text-to-Query”逻辑与底层具体的图数据库(Neo4j, NebulaGraph, 阿里云 GDB 等)完全解耦。无论底层是什么图数据库,对上层来说,它们都只是一个 GraphStore

核心方法:

getSchema() : 这是实现 RAG 的信息来源 。此方法负责连接到底层数据库,并提取其 Schema 信息(节点标签、边标签、属性等),将其格式化为一个可以喂给 LLM 的字符串。

execute(String query) : 这是执行查询的统一入口。它接收 LLM 生成的查询字符串(如 Cypher 或 Gremlin),并通过具体的数据库驱动来执行它,然后返回结果。

设计模式 : 策略模式(Strategy Pattern) 。用户可以根据自己的数据库类型,注入不同的 GraphStore 实现(例如 Neo4jGraphStore , TinkerPopGremlinGraphStore ),而上层 GraphClient 的代码无需任何改动。一个抽象类的实现

问题and挑战:

  1. GraphStore.getSchema() 的“信息密度”挑战

“提示词爆炸” (Prompt Explosion) 与成本问题:当图的 Schema 变得非常庞大时(成百上千种节点和边),getSchema() 返回的字符串会非常长。这不仅会急剧增加调用 LLM 的 Token 成本,更严重的是,过长的、充斥着大量无关信息的上下文,反而可能降低 LLM 的理解和推理能力,导致生成错误的查询。

Schema 的“知识”密度不足:Schema 只定义了“结构”,但没有定义“语义”。例如,一个 TRANSACTION 的边,其 amount 属性是正是负代表什么业务含义?LLM 仅从 Schema 中无法得知。

解决:

一个更先进的 GraphStore 实现,不应该仅仅是“暴力”地返回整个 Schema。它应该进化为一个“Schema 智能检索器”

  1. Schema 知识图谱化/向量化:将图的 Schema 本身(节点标签、边标签、属性及其注释)也构建成一个小型知识图谱或将其向量化存储。

  2. 两阶段 RAG:当用户提问时,第一阶段,先对用户的问题进行向量相似度搜索,从海量的 Schema 中检索出与问题最相关的子图 Schema(例如,问题关于“交易”,就只提取 Account, Transaction 等相关的节点和边)。第二阶段,再将这个高度相关的、精简的子图 Schema 喂给 LLM 去生成查询。

  3. 动态数据样本getSchema() 还可以被增强为 getContext(),除了返回 Schema,还能动态地从图中抓取几条与问题相关的实际数据样本(例如,几条交易记录),一并作为上下文提供给 LLM。这能极大地帮助 LLM 理解数据格式和语义,提升查询准确率。

GraphClient :面向用户的核心入口

设计目的 : 隐藏所有内部复杂的交互流程(获取 Schema -> 构建 Prompt -> 调用 LLM -> 解析响应-> 执行查询),为最终用户提供一个极其简单的接口。

核心方法剖析:

  • query(String question, ...) : 这是最核心的方法。开发者只需要传入自然语言问题,就可以得到图数据库的查询结果。它的默认实现 DefaultGraphClient编排下面要讲的 GraphChatServiceGraphStore 来完成整个流程。

GraphChatService :LLM 交互与智能的核心

设计目的 : 专门负责处理与大语言模型(LLM)之间的所有交互,实现核心的“Text-to-Query”转换逻辑。

核心:

依赖注入 : 它会被注入一个 GraphStore 实例和一个 Spring AI 的 ChatClient 实例。 Prompt 工厂 : 内部会使用一个 GraphChatPromptFactory 来创建 Prompt。这个工厂是提示工程(Prompt Engineering) 的具体体现,它会接收 GraphStore.getSchema() 获取到的 Schema 和用户问题,然后把它们组装成一个结构化、高质量的 Prompt 模板。 调用 LLM : 它使用注入的 ChatClient 将生成的 Prompt 发送给 LLM(例如通义千问)。响应解析 : 它还包含一个 ResponseParser 。因为 LLM 的返回内容可能不只是纯粹的查询语句(例如,可能包含在 Markdown 的 cypher ... 代码块中,或者有一些解释性的文字), ResponseParser 负责从 LLM 的原始响应中精确地提取出可执行的查询代码 。这一步是保证系统稳定性的关键。

Google GraphRAG

Google GraphRAG 的核心目标是从非结构化文本中构建图,以优化 RAG 的检索效果

传统的向量检索(Vector Search)只能找到与问题“表面相似”的文本片段,却忽略了文档内部和文档之间隐藏的深层语义关联。GraphRAG 的核心思想就是通过从文本中提取实体和关系来构建知识图谱,并利用图的社区结构来发现这些深层关联,从而为 LLM 提供更全面、更具上下文的背景信息

图的角色:在这里,图不是最终的知识库,而是一个为了提升检索质量而生成的“中间索引结构”。最终答案的来源(Source of Truth)依然是原始的文本。


GraphRAG 的流程分为“离线索引”和“在线查询”两个阶段。

阶段一:离线索引(数据预处理)

  1. 实体与关系提取 (Information Extraction):系统读取所有源文档(如 PDF, Word, TXT),利用 LLM 遍历这些文本,提取出关键的实体(人、事、物、概念)以及它们之间的关系。

  2. 图谱构建 (Graph Construction):将提取出的实体作为“节点”,关系作为“边”,构建一个全局的知识图谱。

  3. 社区检测 (Community Detection):在构建好的图上运行图算法(如 Leiden 算法),将整个图划分成若干个高内聚、低耦合的“语义社区”。每个社区代表了一组在语义上紧密相关的主题或事件。

  4. 社区摘要 (Community Summarization):利用 LLM 为每一个检测出的社区生成一个高度概括的摘要描述。

阶段二:在线查询(应答用户提问)

  1. 用户提问:用户提出一个问题。

  2. 多路检索 (Multi-path Retrieval):系统并行地在两个层面上进行检索:

    • 全局检索:在所有“社区摘要”上进行向量检索,快速定位到与问题最相关的几个社区。

    • 局部检索:同时,也在所有原始文本块上进行传统的向量检索。

  3. 上下文构建 (Context Building):这是 GraphRAG 的核心创新。一旦通过全局检索定位到了一个或多个相关社区,系统不再是只返回几个零散的文本块,而是将整个社区内的所有实体、关系、以及关联的原始文本块,作为一个完整的、结构化的上下文提供出来。

  4. 生成答案 (Answer Generation):将这个极其丰富且上下文完整的“社区信息包”喂给 LLM,让它基于这些信息生成最终的、高质量的答案。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐