从Java转行大模型应用,GraphRAG 及相关技术学习
一、RAG 回顾——基于向量的 RAGVector RAG1.1 RAG 核心定义RAGRetrieval-Augmented Generation检索增强生成是一种结合“检索外部知识”与“大模型生成”的技术核心解决大模型“知识滞后”“幻觉生成”的问题通过先检索相关知识再基于检索结果生成准确、有依据的回答。1.2 Vector RAG 核心原理Vector RAG向量型 RAG是最主流的 RAG 实现方式核心依赖“向量嵌入”与“向量数据库”流程如下文档处理将原始文档分割为小块Chunk避免文本过长无法有效嵌入向量嵌入通过嵌入模型如 BERT、Sentence-BERT将每个文本块转化为高维向量嵌入向量向量的相似度对应文本语义的相似度向量存储将嵌入向量存入向量数据库如 Pinecone、Chroma便于快速检索检索生成用户提问后将问题转化为向量在向量数据库中检索相似度最高的文本块将检索结果作为上下文输入 LLM生成回答。1.3 Vector RAG 的优势与局限优势实现简单、检索速度快能快速匹配语义相似的文本适配大多数通用场景局限无法捕捉文本间的“结构化关系”如“张三是李四的同事”“A 公司收购 B 公司”检索结果易碎片化难以处理需要“关联推理”的场景如多文档交叉关联、逻辑链条查询。二、Graph RAG 核心2.1 Graph RAG 定义Graph RAG图检索增强生成是 Vector RAG 的进阶形式将“非结构化文本”转化为“结构化知识图谱”基于知识图谱的节点、关系进行检索再结合 LLM 生成回答核心解决 Vector RAG 无法捕捉结构化关系、缺乏推理能力的问题。2.2 Graph RAG 与 Vector RAG 的核心区别对比维度Vector RAGGraph RAG数据形式非结构化文本块向量形式结构化知识图谱节点、关系、属性检索方式语义相似度匹配向量距离节点关联查询、关系推理图查询核心能力快速匹配相似文本捕捉结构化关系、多步推理适用场景通用问答、简单信息检索复杂推理、关联查询如金融、法律、知识库2.3 Graph RAG 核心流程文本结构化将非结构化文本文档、对话等解析为知识图谱的“节点、关系、属性”知识存储将知识图谱存入图数据库如 Neo4j维护节点与关系的关联图检索用户提问后将问题转化为图查询语句如 Cypher检索知识图谱中相关的节点、关系增强生成将图检索到的结构化知识作为上下文输入 LLM生成具有逻辑关联、可追溯的回答。三、知识图谱建模节点、关系、属性知识图谱Knowledge Graph是结构化的知识表示形式核心由“节点Entity”“关系Relationship”“属性Property”三部分组成本质是“图结构”由节点和边构成边即关系。3.1 节点Entity节点是知识图谱的核心元素代表“实体”即现实世界中可区分、可识别的对象分为两类实体节点具体的人、事、物如“张三”“北京”“苹果公司”“《三体》”概念节点抽象的概念、类别如“城市”“水果”“小说”“职业”。节点的核心作用承载知识的“主体”所有关系和属性都围绕节点展开。3.2 关系Relationship关系是连接两个节点的“边”代表节点之间的关联核心作用是“描述节点间的逻辑关系”分为两类实体间关系如“张三-同事-李四”“苹果公司-总部位于-北京”实体与概念间关系如“北京-属于-城市”“《三体》-属于-小说”。注意关系具有“方向性”如“张三-父亲-李四”≠“李四-父亲-张三”且需具有明确的语义避免模糊如用“同事”而非“认识”。3.3 属性Property属性是节点或关系的“附加信息”用于补充描述节点/关系的特征键值对Key-Value形式存储节点属性如“张三”的属性年龄30职业工程师性别男“北京”的属性面积16410 平方公里人口约 2184 万关系属性如“张三-同事-李四”的属性共事时间5 年所属部门技术部。3.4 建模示例文本“张三30 岁是一名工程师和李四是同事两人在技术部共事 5 年李四今年 32 岁。”节点张三属性年龄30职业工程师、李四属性年龄32、技术部属性无关系张三-同事-李四属性共事时间5 年所属部门技术部。四、Neo4j 数据库基础操作4.1 Neo4j 简介Neo4j 是最流行的“原生图数据库”专门用于存储和查询知识图谱图结构数据相比关系型数据库如 MySQL无需定义表结构能高效处理节点与关系的关联查询核心优势是“图遍历速度快”。核心概念节点Node对应知识图谱的节点可添加标签Label区分类别如 :Person、:City关系Relationship对应知识图谱的关系有方向、类型如 :COLLEAGUE、:LOCATED_IN属性Property节点和关系的附加信息键值对形式标签Label用于分类节点如给“张三”“李四”添加 :Person 标签给“北京”添加 :City 标签。4.2 Neo4j 基础操作桌面版4.2.1 启动与连接启动 Neo4j 桌面版创建新项目Project新建数据库Database设置用户名默认 neo4j和密码启动数据库点击“Open Browser”输入用户名密码进入查询界面Browser。4.2.2 核心基础操作Cypher 语句后续详细讲解创建节点创建带标签和属性的节点如创建张三节点创建关系连接两个已存在的节点添加关系类型和属性查询节点/关系检索指定标签、属性的节点或指定类型的关系更新属性修改节点或关系的属性值删除节点/关系删除指定节点需先删除关联关系否则报错、关系。4.2.3 关键注意事项Neo4j 中节点必须通过关系连接孤立节点可存在但无实际意义删除节点前必须先删除该节点的所有关联关系否则会触发约束报错标签可给一个节点添加多个如 :Person :Engineer便于分类查询。五、Cypher 查询语言5.1 Cypher 简介Cypher 是 Neo4j 的专用查询语言语法简洁、接近自然语言核心用于“创建、查询、更新、删除”图数据类比关系型数据库的 SQL但专为图结构设计重点关注“节点与关系的关联”。5.2 核心语法常用操作5.2.1 创建CREATE创建单个节点CREATE (:Person {name: 张三, age: 30, job: 工程师})创建多个节点CREATE (:Person {name: 李四, age: 32}), (:City {name: 北京, area: 16410})创建节点关系CREATE (a:Person {name: 张三})-[:COLLEAGUE {workYears: 5}]-(b:Person {name: 李四})说明() 代表节点[:关系类型] 代表关系- 表示关系方向{} 内是属性。5.2.2 查询MATCH RETURN查询所有 Person 节点MATCH (p:Person) RETURN p.name, p.age;查询张三的同事MATCH (p:Person {name: 张三})-[:COLLEAGUE]-(colleague) RETURN colleague.name;查询带条件的节点MATCH (p:Person) WHERE p.age 30 RETURN p.name;查询关系及属性MATCH (a:Person)-[r:COLLEAGUE]-(b:Person) RETURN a.name, r.workYears, b.name;5.2.3 更新SET更新节点属性MATCH (p:Person {name: 张三}) SET p.age 31, p.job 高级工程师;更新关系属性MATCH (a:Person)-[r:COLLEAGUE]-(b:Person) WHERE a.name 张三 SET r.workYears 6;5.2.4 删除DELETE REMOVE删除关系MATCH (a:Person)-[r:COLLEAGUE]-(b:Person) DELETE r;删除节点先删关系MATCH (p:Person {name: 张三})-[r]-() DELETE r, p;删除属性MATCH (p:Person {name: 张三}) REMOVE p.job;5.2.5 常用技巧用 AS 取别名MATCH (p:Person) RETURN p.name AS 姓名, p.age AS 年龄;用 LIMIT 限制结果数量MATCH (p:Person) RETURN p.name LIMIT 10;用 ORDER BY 排序MATCH (p:Person) RETURN p.name, p.age ORDER BY p.age DESC;六、Graph RAG 实现6.1 Graph RAG 实现核心流程完整链路数据准备获取非结构化文本数据如文档、PDF、对话记录进行清洗去重、去噪、分割文本结构化知识抽取通过 LLM 或知识抽取工具如 spaCy、 Stanford CoreNLP从文本中抽取“节点、关系、属性”示例给 LLM 输入提示词“从以下文本中抽取实体、关系和属性格式为节点1-关系-节点2属性节点属性”让 LLM 输出结构化结果知识存储将抽取到的节点、关系、属性通过 Cypher 语句写入 Neo4j 数据库构建知识图谱图检索将用户提问转化为 Cypher 查询语句可通过 LLM 实现“自然语言转 Cypher”查询 Neo4j 得到相关结构化知识增强生成将图检索结果节点、关系、属性作为上下文输入 LLM生成回答需提示 LLM 基于检索到的知识避免幻觉优化迭代根据用户反馈调整知识抽取规则、Cypher 查询逻辑优化知识图谱的完整性和检索准确性。6.2 关键难点知识抽取准确性LLM 可能抽取错误的节点/关系需添加人工校验或规则约束自然语言转 Cypher用户提问可能模糊需让 LLM 精准理解意图生成正确的 Cypher 语句知识图谱维护随着数据增加需定期更新节点、关系避免知识滞后或冗余。七、LLM Neo4j 实现 Graph RAG7.1 核心逻辑LLM 负责“自然语言理解”和“结构化生成”Neo4j 负责“知识存储”和“图检索”两者结合实现端到端的 Graph RAG核心分工LLM① 将非结构化文本抽取为节点、关系、属性② 将用户自然语言提问转化为 Cypher 查询语句③ 基于 Neo4j 检索到的知识生成自然语言回答Neo4j① 存储知识图谱节点、关系、属性② 执行 Cypher 查询返回结构化知识。7.2 实现步骤简化版环境准备安装 Neo4j桌面版/服务器版、LLM SDK如 OpenAI API、LangChain、Neo4j Python 驱动neo4j知识抽取调用 LLM API输入文本和提示词抽取节点、关系、属性整理为 Cypher 创建语句写入 Neo4j通过 Python 驱动连接 Neo4j执行 Cypher 创建语句构建知识图谱自然语言转 Cypher用户提问后调用 LLM输入提问和提示词如“将以下问题转化为 Neo4j 的 Cypher 查询语句只返回 Cypher 语句不添加其他内容”得到 Cypher 语句图检索与生成执行 Cypher 语句获取检索结果将结果作为上下文输入 LLM生成最终回答。7.3 示例代码片段Python# 1. 连接 Neo4j from neo4j import GraphDatabase uri bolt://localhost:7687 user neo4j password your_password driver GraphDatabase.driver(uri, auth(user, password)) # 2. 调用 LLM 抽取知识以 OpenAI 为例 import openai openai.api_key your_api_key text 张三30 岁是一名工程师和李四是同事两人在技术部共事 5 年。 prompt f从以下文本中抽取实体、关系和属性生成 Neo4j Cypher 创建语句只返回 Cypher 语句{text} response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[{role: user, content: prompt}] ) cypher_create response.choices[0].message.content # 3. 执行 Cypher写入知识图谱 with driver.session() as session: session.run(cypher_create) # 4. 自然语言转 Cypher user_question 张三的同事是谁共事多少年 prompt_cypher f将问题转化为 Neo4j Cypher 查询语句只返回 Cypher{user_question} cypher_query openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[{role: user, content: prompt_cypher}] ).choices[0].message.content # 5. 执行查询获取结果 with driver.session() as session: result session.run(cypher_query) data [dict(record) for record in result] # 6. 调用 LLM 生成回答 prompt_answer f基于以下知识回答用户问题{data}\n用户问题{user_question} answer openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[{role: user, content: prompt_answer}] ).choices[0].message.content print(answer)八、LangChain 知识图谱 实现 Graph RAG8.1 LangChain 核心作用LangChain 是一个大模型应用开发框架提供了丰富的组件简化 Graph RAG 的实现核心优势集成 LLM支持 OpenAI、Anthropic、本地化 LLM如 Llama 2无需单独封装 API 调用集成 Neo4j提供专门的 Neo4j 组件Neo4jVector、Neo4jGraph简化数据库连接和查询流程封装将“知识抽取、图检索、生成回答”的链路封装为 Chain无需手动拼接各步骤工具调用支持“自然语言转 Cypher”工具CypherQueryGenerator自动生成查询语句。8.2 LangChain Neo4j 实现步骤8.2.1 环境准备安装依赖包pip install langchain openai neo4j python-dotenv8.2.2 核心组件说明Neo4jGraphLangChain 中连接 Neo4j 的核心组件用于操作知识图谱CypherQueryGenerator将自然语言提问转化为 Cypher 查询语句的工具GraphQAChain端到端的 Graph RAG 链整合“图检索 LLM 生成”。8.2.3 示例代码片段Pythonfrom dotenv import load_dotenv from langchain.graphs import Neo4jGraph from langchain.chat_models import ChatOpenAI from langchain.chains import GraphQAChain from langchain.prompts import PromptTemplate # 1. 加载环境变量存储 OpenAI API 密钥、Neo4j 连接信息 load_dotenv() # 2. 连接 Neo4j自动读取环境变量中的 NEO4J_URI、NEO4J_USER、NEO4J_PASSWORD graph Neo4jGraph() # 3. 向 Neo4j 写入知识可通过 LangChain 工具抽取或手动执行 Cypher cypher_create CREATE (p1:Person {name: 张三, age: 30, job: 工程师}) CREATE (p2:Person {name: 李四, age: 32}) CREATE (p1)-[:COLLEAGUE {workYears: 5, department: 技术部}]-(p2) graph.query(cypher_create) # 4. 初始化 LLMOpenAI GPT-3.5 llm ChatOpenAI(model_namegpt-3.5-turbo, temperature0) # 5. 构建 Graph RAG 链 graph_qa_chain GraphQAChain.from_llm( llmllm, graphgraph, verboseTrue, # 打印中间过程Cypher 语句、检索结果 return_intermediate_stepsTrue # 返回中间步骤便于调试 ) # 6. 提问并获取回答 user_question 张三的同事是谁他们在哪个部门共事 response graph_qa_chain({query: user_question}) # 输出结果 print(回答, response[result]) print(中间步骤, response[intermediate_steps])8.3 关键优化点提示词优化自定义 PromptTemplate让 LLM 更精准地生成 Cypher 语句、更贴合知识图谱的结构知识抽取优化使用 LangChain 的 DocumentLoader 加载文档结合 TextSplitter 分割文本再用 LLMChain 抽取知识多轮对话支持结合 ConversationBufferMemory让 Graph RAG 记住上下文支持多轮关联提问。九、学习总结Vector RAG 是基础核心解决“相似文本检索”但缺乏结构化关系捕捉能力Graph RAG 是进阶通过知识图谱实现“关联推理”适配复杂场景知识图谱建模是 Graph RAG 的核心需准确识别节点、关系、属性确保知识的结构化和准确性Neo4j 是图数据库的核心工具Cypher 是操作 Neo4j 的关键需熟练掌握创建、查询、更新、删除等基础操作Graph RAG 的核心实现逻辑是“文本结构化→知识存储→图检索→增强生成”LLM 负责理解和生成Neo4j 负责存储和检索LangChain 简化了 Graph RAG 的开发通过封装好的组件可快速实现端到端的链路重点掌握 Neo4jGraph、GraphQAChain 等核心组件的使用。