知识图谱与RAG的结合使用
知识图谱 RAGGraphRAG完整通俗解释一、基础概念区分普通文本 RAG传统 RAG数据源非结构化文档PDF、Word、网页文本 处理方式文本切分→向量嵌入→向量库检索→大模型回答短板只能捕捉浅层语义相似度无法理解实体之间的关系。 例如 文档张三在A公司任职A公司总部在北京提问张三所在公司总部在哪 传统 RAG 依靠文本片段匹配容易断裂关联复杂多跳推理极易出错。知识图谱KGKnowledge Graph核心结构实体 - 关系 - 实体三元组标准格式(头实体关系尾实体)示例(张三任职于A 公司)、(A 公司总部位于北京) 特点结构化存储天然支持多跳关联查询。知识图谱 RAG GraphRAG融合方案知识图谱 向量检索 大语言模型两种主流路线轻量混合 RAG知识图谱 文本向量库并行检索深度原生 GraphRAG微软 GraphRAG 方案文本自动构建图谱 社区摘要二、两种主流 GraphRAG 架构方案 1混合式知识图谱 RAG工业最常用整体流程分为构建阶段 推理阶段1离线构建数据预处理① 原始非结构化文本报告、知识库、论文 ②实体 关系抽取LLM / 信息抽取模型抽取出三元组 ③ 存入知识图谱数据库Neo4j、NebulaGraph、TuGraph ④ 同时把原始文本切片生成向量存入向量数据库Chroma、Milvus、PGVector两套索引并存图谱存关系 向量库存原始上下文2在线问答检索生成用户问题输入分支 1问题解析 → 提取实体生成 Cypher/nGQL 图谱查询语句 在 KG 中查询实体、关联链路拿到结构化事实分支 2问题向量化向量库检索相似文本片段融合两路检索结果拼接 Prompt 送入大模型LLM 结合结构化知识 原文上下文生成答案✅优势结构化知识保证事实准确解决大模型幻觉向量文本保留细节描述弥补图谱信息缺失改造简单可以在现有 RAG 系统上叠加知识图谱方案 2微软 GraphRAG原生图谱 RAG核心创新不只抽取三元组对图谱做社区聚类 高层摘要流程文本分块 → 抽取实体、关系构建全局知识图谱使用图算法Louvain对图谱划分社区高度关联实体集群对每个社区生成高层文本摘要宏观知识查询时支持两级检索局部检索精准实体、近距离关系细粒度事实全局检索社区摘要适合宏观、综合性问题 适合长篇书籍、大量文档综合分析、跨文档多跳推理三、知识图谱 RAG 解决了传统 RAG 哪些痛点✅多跳推理能力增强传统 RAG多步关联信息分散在不同文本块很难一次性召回 GraphRAG沿着图谱关系链式查询轻松实现 A→B→C→D 多跳问答。✅减少事实幻觉知识图谱存储确定性三元组模型可以严格基于结构化事实作答不容易编造不存在的关联。✅精准关联检索避免语义漂移向量检索依靠相似度容易出现 “字面相似但无关”图谱基于实体精确匹配。✅支持复杂逻辑类问题例如统计、链路溯源、关系梳理、因果查询单纯向量 RAG 很难胜任。四、知识图谱 RAG 存在的短板重点实体关系抽取成本高非结构化文本自动抽取三元组总会存在错误脏数据会传导至问答高质量图谱往往需要人工校验。查询门槛高需要 LLM 把自然语言正确转换成图查询语句 (Cypher)转换失败则图谱检索失效常见难点。不擅长开放式细节描述知识图谱只存结构化关系长段落、细节描述依然依赖原始文本向量。结论几乎没有纯图谱 RAG 落地工业界都是「图谱 向量双检索混合架构」五、极简对比传统 RAG VS GraphRAG表格维度普通向量 RAG知识图谱 RAG (GraphRAG)数据形态文本块、向量实体 关系三元组 向量文本擅长场景浅层问答、细节查找多跳推理、关联溯源、知识脉络梳理推理方式语义相似度匹配图遍历 语义检索融合依赖能力嵌入模型实体抽取、图查询、向量模型维护成本低较高图谱治理、清洗六、典型落地场景企业知识库人员、项目、组织关系查询医疗疾病、症状、药物多跳关联问诊政务 / 法律法条、案件主体关系梳理环境监测、智能制造设备故障溯源金融企业股权、担保关系穿透查询七、最简工作示例知识库两段文本文本 1华为发布鸿蒙操作系统。 文本 2鸿蒙系统搭载方舟编译器。抽取三元组 (华为发布鸿蒙 OS)、(鸿蒙 OS, 搭载方舟编译器)用户提问华为发布的系统使用什么编译器图谱执行两跳查询华为→鸿蒙 OS→方舟编译器同时召回原始文本作为补充上下文LLM 整合信息输出答案补充关键术语二、LangChain Neo4j GraphRAG 最简可运行 Demo环境依赖安装bashpip install langchain langchain-openai langchain-neo4j neo4j python-dotenv前置条件完整代码 graph_rag_demo.pypython运行from dotenv import load_dotenv import os from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_neo4j import Neo4jGraph, GraphQAChain from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.vectorstores import Neo4jVector from langchain.chains import RetrievalQA load_dotenv() # 1. 配置连接信息 NEO4J_URI bolt://localhost:7687 NEO4J_USER neo4j NEO4J_PASSWORD 你的neo4j密码 LLM_API_KEY os.getenv(OPENAI_API_KEY) LLM_BASE_URL https://api.openai.com/v1 EMBEDDING_MODEL text-embedding-ada-002 LLM_MODEL gpt-3.5-turbo # 初始化图数据库连接 graph Neo4jGraph( urlNEO4J_URI, usernameNEO4J_USER, passwordNEO4J_PASSWORD ) # 初始化大模型 Embedding llm ChatOpenAI( modelLLM_MODEL, api_keyLLM_API_KEY, base_urlLLM_BASE_URL, temperature0 ) embeddings OpenAIEmbeddings(modelEMBEDDING_MODEL, api_keyLLM_API_KEY) # 2. 初始化向量库Neo4j内置向量索引简化部署 # 如果你有独立Milvus可以替换成Milvus neo4j_vector_store Neo4jVector( embeddingembeddings, urlNEO4J_URI, usernameNEO4J_USER, passwordNEO4J_PASSWORD, index_namedocument_vector, node_labelDocumentChunk, text_node_propertytext, embedding_node_propertyembedding ) retriever neo4j_vector_store.as_retriever(search_kwargs{k: 3}) # 3. 导入测试知识三元组文档文本 # 清空测试数据 graph.query(MATCH (n) DETACH DELETE n) # 写入知识图谱三元组 cypher_insert CREATE (huawei:Company{name:华为}) CREATE (harmonyos:System{name:鸿蒙操作系统}) CREATE (ark:Compiler{name:方舟编译器}) CREATE (huawei)-[:RELEASE]-(harmonyos) CREATE (harmonyos)-[:DEPEND_ON]-(ark) graph.query(cypher_insert) # 写入原始文档片段存入向量库 texts [ 华为正式发布鸿蒙操作系统面向全场景智能设备。, 鸿蒙操作系统深度搭载方舟编译器提升应用运行效率。, 方舟编译器支持静态编译提升移动端程序性能。 ] neo4j_vector_store.add_texts(texts) # 4. 构建两条链路图谱问答链 向量检索链 # GraphQAChain自然语言自动生成Cypher查询图谱 graph_qa_chain GraphQAChain(llmllm, graphgraph, verboseTrue) # 普通向量RAG链 vector_qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, verboseTrue ) # 5. 融合GraphRAG主逻辑混合检索 def graph_rag_query(question: str): print(【1.知识图谱结构化查询结果】) try: graph_result graph_qa_chain.invoke({query: question}) graph_context graph_result[result] except Exception as e: print(fCypher生成/执行失败降级{e}) graph_context 图谱未查询到相关信息 print(\n【2.向量文本检索结果】) vector_result vector_qa_chain.invoke({query: question}) vector_context vector_result[result] # 融合上下文交给LLM最终汇总回答 merge_prompt f 【图谱结构化知识】 {graph_context} 【文档原文上下文】 {vector_context} 用户问题{question} 要求结合上面所有信息回答不要编造不存在事实如果信息不足如实说明。 final_answer llm.invoke(merge_prompt).content return final_answer # 测试调用 if __name__ __main__: query 华为发布的操作系统使用什么编译器 ans graph_rag_query(query) print(\n最终GraphRAG回答) print(ans)适配改造提示国内大模型替换 ChatOpenAI 为 LangChain 对应厂商类DashScope、ZhipuAI分离向量库Milvus/PGVector 替代 Neo4jVector增量数据新增文档自动抽取三元组可搭配 LLM 做 NERRE三、自然语言转 CypherNL2Cypher提示词模板模板 A标准版日常业务知识库推荐LangChain GraphQAChain 默认替换 promptplaintext你是Neo4j Cypher查询专家根据知识图谱结构将用户自然语言问题生成正确、可直接执行的Cypher语句。 【图谱Schema信息必须同步最新实体、关系】 实体标签Company, System, Compiler 关系类型 - (Company)-[:RELEASE]-(System) - (System)-[:DEPEND_ON]-(Compiler) 实体属性name 规则约束 1. 只输出Cypher代码不要额外解释不要markdown代码块以外多余文字 2. 实体名称严格模糊匹配使用toLower()或者contains避免大小写问题 3. 禁止执行删除、修改、创建类语句只允许MATCH查询 4. 如果无法构建有效查询直接返回文本NO_QUERY 5. 不要使用不存在的实体标签、关系名称 6. 不要返回图中不存在的关联 用户问题{query} Cypher模板 B增强容错版生产环境首选增加异常处理、多跳查询引导plaintext# 任务自然语言转Neo4j Cypher只读查询 # 数据库Schema 节点标签与属性 Company{name}, System{name}, Compiler{name} 关系 [:RELEASE] 公司发布系统 [:DEPEND_ON] 系统依赖编译器 # 严格规则 1. 仅生成MATCH查询严禁CREATE、DELETE、SET、MERGE写操作 2. 识别问题中的实体优先匹配name属性支持同义词模糊检索 3. 需要多跳推理时正确书写链式路径 (a)-[r1]-(b)-[r2]-(c) 4. 如果问题信息不足、找不到对应关系输出 NO_QUERY 5. 输出内容只能是Cypher语句禁止额外说明、中文解释 用户提问{question} 输出Cypher模板 C带结果解释增强版GraphRAG 端到端查询后自动解析使用场景生成 Cypher 同时指导 LLM 读懂查询返回的图结构数据plaintext你需要完成两步工作 第一步根据图谱Schema生成合法只读Cypher 第二步想好如何利用Cypher返回的图数据回答用户问题。 【图谱Schema】 节点Company, System, Compiler 关系RELEASE, DEPEND_ON 约束 - 禁止写操作实体基于name匹配多跳链路完整书写 - 无法构建查询输出 NO_QUERY 输出格式 CYPHER:【生成的语句】 GUIDE:【简要说明拿到查询结果后如何组织答案】 用户问题{query}使用关键工程技巧拓展可选优化方向如果你后续要落地三元组 Triplet知识图谱基础单元 (s,p,o)CypherNeo4j 查询语言实体链接 Entity Linking把文本名词匹配图谱中标准实体解决同义词问题关系抽取 RE识别两个实体之间存在何种关联包含1. 文字架构图2.LangChainNeo4j 最简 Demo3.NL2Cypher 提示词模板方案混合式 GraphRAG工业主流架构知识图谱检索 向量文本检索两路融合区别于微软原生 GraphRAG一、GraphRAG 系统工程架构图【文字版】分为两大阶段离线构建流水线在线推理问答流水线plaintext 离线构建阶段数据入库一次性/定时增量 原始数据源 │ ├─ 非结构化文档(PDF/MD/TXT) ──文档加载器── 文本切分(RecursiveCharacterTextSplitter) │ │ │ ├─────────────────────┐ │ ▼ ▼ │ 文本块向量化嵌入 LLM实体关系抽取RENER │ │ │ │ ▼ ▼ │ 向量数据库(Milvus/PGVector) 三元组(s,p,o) │ │ │ ▼ │ 实体链接 消歧(同义词归一) │ │ │ ▼ │ 知识图谱数据库(Neo4j) │ └─ 结构化业务数据(Excel/数据库) ──ETL── 直接生成三元组导入Neo4j 在线推理阶段用户问答实时链路 用户自然语言 Question │ ├────────────────────────────────┐ ▼ ▼ 【分支A图谱检索链路】 【分支B向量文本检索链路】 问题实体抽取 Question向量化 │ │ ▼ ▼ LLM 将自然语言 → Cypher语句 向量库TopK相似文本片段检索 │ ▼ Neo4j执行Cypher查询获取结构化知识实体关系路径 │ └──────────────────┬──────────────────┘ ▼ 检索结果融合模块 (图谱三元组事实 原始文本上下文) │ ▼ 组装Prompt送入大模型LLM │ ▼ 输出最终答案模块说明实体链接解决别名问题如 “华为技术有限公司” 华为防止图谱重复实体结果融合策略图谱数据提供确定关系、多跳链路事实向量文本提供细节描述、佐证原文容错机制Cypher 生成失败时自动降级为纯向量 RAG本地启动 Neo4j创建数据库修改连接地址、账号密码准备 OpenAI 兼容接口可替换通义千问 / DeepSeek 等预先导入图谱数据或使用代码内置样例三元组Schema 动态注入不要写死 Schema程序运行时自动调用CALL db.schema.visualization()获取节点、关系动态填充 Prompt图谱更新不用改提示词。防注入安全规则限制只能 MATCH禁止所有写入语句增加关键词黑名单DELETE, MERGE, CREATE失败降级策略LLM 输出 NO_QUERY / Cypher 执行报错 → 直接跳过图谱检索仅使用向量 RAG实体前置预处理先用 NER 提取问题实体做实体链接归一化再送入 NL2Cypher大幅降低生成错误增加 Cypher 语法校验模块执行前先校验语句合法性示例少样本 Prompt (Few-shot)加入多条「问题→Cypher」样例提升复杂问题准确率构建修正链Cypher 执行报错 → 将报错信息丢回 LLM 自动修正查询语句混合检索 Hybrid Retrieval向量检索 图谱检索并行融合新增交付内容文档文本自动抽取三元组 批量导入 Neo4j 完整代码GraphRAG 生产级融合回答 Prompt图谱结构化数据 向量原文融合前置依赖bashpip install langchain langchain-openai neo4j python-dotenv一、文本自动抽取三元组 写入 Neo4j 完整代码文件triple_extractor.py核心能力输入段落文本LLM 抽取标准化三元组(head, relation, tail)实体简单归一化、去重自动转换成 Cypher MERGE 语句避免重复创建实体支持批量文本循环导入可适配任意 OpenAI 兼容大模型DeepSeek、通义千问、智谱等python运行from dotenv import load_dotenv import os import json from langchain_openai import ChatOpenAI from langchain_neo4j import Neo4jGraph load_dotenv() # 配置区 NEO4J_URI bolt://localhost:7687 NEO4J_USER neo4j NEO4J_PASSWORD 你的Neo4j密码 LLM_API_KEY os.getenv(LLM_API_KEY) LLM_BASE_URL https://api.openai.com/v1 LLM_MODEL gpt-3.5-turbo # 初始化 graph Neo4jGraph(urlNEO4J_URI, usernameNEO4J_USER, passwordNEO4J_PASSWORD) llm ChatOpenAI( modelLLM_MODEL, api_keyLLM_API_KEY, base_urlLLM_BASE_URL, temperature0 ) # 三元组抽取Prompt TRIPLET_EXTRACT_PROMPT 任务从给定文本中抽取知识三元组。 三元组格式[{head:头实体,relation:关系,tail:尾实体}] 规则 1. 输出严格JSON数组不要任何额外文字、注释、markdown 2. 实体尽量精简统一称谓避免别名泛滥 3. 关系动词化简短明确不要过长句子 4. 不要抽取模糊、猜测、不确定的信息 5. 一条事实生成一条三元组一条文本可以输出多条 6. 没有有效事实返回空数组[]。 待抽取文本 {text} JSON输出 def extract_triples(text: str): 文本抽取三元组返回列表 prompt TRIPLET_EXTRACT_PROMPT.format(texttext) resp llm.invoke(prompt) content resp.content.strip() try: triples json.loads(content) return triples except Exception as e: print(f三元组解析失败:{e}, raw:{content}) return [] def save_triples_to_neo4j(triples): 批量将三元组写入Neo4j使用MERGE避免重复实体与关系 if not triples: return # 批量执行Cypher cypher UNWIND $triples AS item MERGE (h:Entity{name: item.head}) MERGE (t:Entity{name: item.tail}) MERGE (h)-[r:REL{name: item.relation}]-(t) graph.query(cypher, {triples: triples}) print(f成功导入 {len(triples)} 条三元组) def process_document_text(text: str): 入口函数输入文本 → 抽取 → 入库 triples extract_triples(text) save_triples_to_neo4j(triples) return triples if __name__ __main__: # 测试样例文本可以替换成你的文档段落 doc_text 华为正式发布鸿蒙操作系统鸿蒙操作系统搭载方舟编译器。 方舟编译器能够提升智能终端应用运行效率。 res_triples process_document_text(doc_text) print(抽取三元组结果) for t in res_triples: print(t)工程优化说明生产改造点实体分层标签当前全部节点统一标签Entity业务场景可优化自动识别实体类型公司、产品、人物创建不同 LabelCompany,Product,Person实体链接消歧增强增加同义词字典例如 {华为技术有限公司:华为}抽取后统一标准化实体名称长文档处理超长文本先做文本切分分段抽取防止 LLM 上下文溢出数据校验新增入库前过滤无效三元组head/tail 为空增量更新增加来源文档标识节点新增属性source_text,source_file方便溯源拓展与之前 GraphRAG Demo 联动读取文档 → 文本切片 切片一路向量化存入向量库 切片二路调用process_document_text(chunk_text)抽取三元组进图谱二、GraphRAG 生产级融合回答 Prompt场景 两路检索完成【图谱结构化结果】【向量检索原文片段】送入 LLM 生成最终答案分为两套 Prompt 1标准版通用知识库、企业内部问答 Prompt 2严谨风控版政务、法律、金融、溯源场景强防幻觉Prompt 1通用生产融合 Prompt推荐绝大多数场景plaintext# 角色 你是专业知识问答助手结合【知识图谱结构化事实】和【原始参考文档】回答用户问题。 ## 可用参考资料 【知识图谱结构化事实实体与关系链路】 {graph_context} 【原始文档片段文本细节补充】 {vector_context} ## 硬性规则 1. 优先采信知识图谱中明确的实体关系文档内容作为细节补充 2. 禁止编造不存在的实体、关系、数据参考资料不存在的信息不要猜测直接说明“暂无相关信息” 3. 如果图谱信息和文档信息出现冲突优先保留原始文档内容并在答案中注明存在信息冲突 4. 回答逻辑清晰涉及多主体关联关系时梳理清楚链路 5. 不要输出无关内容不要复述全部参考资料精炼作答 6. 不要输出markdown代码块正常自然语言回答。 用户问题{question} 你的回答Prompt 2严谨风控版高可信场景环境溯源、法律、金融、政企plaintext# 任务说明 基于提供的结构化图谱数据与原始文档素材回答问题严格防范AI幻觉所有结论必须有据可查。 ## 参考素材 【知识图谱查询结果】 {graph_context} 【原始检索文档上下文】 {vector_context} ## 强制约束 1. 所有结论必须能够在上方素材中找到依据任何无法证实的推论禁止写入答案 2. 区分两类信息 - 确定事实图谱/原文明确记载内容 - 信息缺失素材中无相关内容如实告知禁止主观推断 3. 当图谱仅提供关系链路、缺少细节描述时可以引用原始文档补充细节 4. 若多处资料信息矛盾需要清晰标注冲突点不要自行选择采信某一方 5. 如果用户问题需要多跳关联请清晰展示推理链路 6. 禁止拓展回答素材以外的延伸知识。 用户提问{question} 请给出严谨回答代码中如何嵌入使用示例python运行# 填充模板 final_prompt_template # 角色 你是专业知识问答助手结合【知识图谱结构化事实】和【原始参考文档】回答用户问题。 ## 可用参考资料 【知识图谱结构化事实实体与关系链路】 {graph_context} 【原始文档片段文本细节补充】 {vector_context} ## 硬性规则 1. 优先采信知识图谱中明确的实体关系文档内容作为细节补充 2. 禁止编造不存在的实体、关系、数据参考资料不存在的信息不要猜测直接说明“暂无相关信息” 3. 如果图谱信息和文档信息出现冲突优先保留原始文档内容并在答案中注明存在信息冲突 4. 回答逻辑清晰涉及多主体关联关系时梳理清楚链路 5. 不要输出无关内容不要复述全部参考资料精炼作答 6. 不要输出markdown代码块正常自然语言回答。 用户问题{question} 你的回答 prompt_fill final_prompt_template.format( graph_contextgraph_context, vector_contextvector_context, questionuser_query ) final_answer llm.invoke(prompt_fill).content

相关新闻

最新新闻

日新闻

周新闻

月新闻