别光调API了!用Neo4j+LangChain手把手教你搭建一个GraphRAG问答系统(附完整代码)

张开发
2026/4/16 7:44:53 15 分钟阅读

分享文章

别光调API了!用Neo4j+LangChain手把手教你搭建一个GraphRAG问答系统(附完整代码)
从零构建GraphRAG问答系统Neo4j与LangChain实战指南在人工智能技术快速迭代的今天开发者们逐渐意识到单一技术的局限性。大语言模型虽然展现出惊人的文本生成能力但其幻觉问题和缺乏结构化知识支撑的缺陷日益凸显。这正是知识图谱技术重新受到关注的原因——它能将离散的知识点通过关系网络有机连接为AI系统提供可验证的事实依据。本文将带您亲手搭建一个结合两者优势的GraphRAG图检索增强生成系统使用Neo4j图数据库存储结构化知识通过LangChain框架协调大语言模型与知识图谱的交互最终实现基于企业真实知识的智能问答。1. 环境准备与数据建模1.1 技术栈选型与安装构建GraphRAG系统需要精心挑选技术组件并确保它们能无缝协作。以下是我们的核心工具链# 基础环境 conda create -n graphrag python3.10 conda activate graphrag # 核心依赖 pip install neo4j5.12.0 langchain0.0.340 openai0.28.0 pip install streamlit1.28.0 py2neo2021.2.3组件对比表技术选项优势适用场景Neo4j原生图存储Cypher查询语言关系密集型知识表示LangChain模块化设计丰富的LLM集成AI工作流编排OpenAI GPT-4强大的语义理解能力自然语言生成与理解Streamlit快速构建交互界面系统演示与原型开发1.2 知识图谱数据建模设计合理的图模式是系统成功的关键。假设我们要构建一个IT产品知识库可以采用以下数据模型# 产品知识图谱模式设计 product_schema { 节点类型: [产品, 组件, 客户, 问题], 关系类型: { 产品-包含-组件: {属性: [数量]}, 客户-购买-产品: {属性: [日期]}, 问题-影响-产品: {属性: [严重程度]} } }提示实际项目中应先用白板绘制ER图明确实体间的基数关系再转化为图数据库模式2. 数据导入与知识图谱构建2.1 结构化数据导入企业数据通常分散在多个系统中我们需要将其统一导入Neo4j。以下是从CSV导入数据的示例// 导入产品数据 LOAD CSV WITH HEADERS FROM file:///products.csv AS row CREATE (p:Product { id: row.product_id, name: row.name, category: row.category, description: row.description })对于非结构化文档如PDF手册可先用LLM提取结构化信息from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter loader PyPDFLoader(product_manual.pdf) pages loader.load_and_split( text_splitterRecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200 ) )2.2 知识抽取与图谱增强利用LLM从文本中识别实体和关系from langchain.chains import create_extraction_chain schema { properties: { product_name: {type: string}, compatible_with: {type: string} }, required: [product_name] } extraction_chain create_extraction_chain(schema, llm) extracted_data extraction_chain.run(pages[0].page_content)3. GraphRAG核心实现3.1 检索增强流程设计GraphRAG与传统RAG的关键区别在于检索阶段使用图查询而非向量搜索graph TD A[用户问题] -- B[问题解析] B -- C[Cypher查询生成] C -- D[Neo4j执行] D -- E[子图抽取] E -- F[LLM生成回答]图GraphRAG工作流程注实际实现中应避免使用mermaid图表3.2 动态查询生成将自然语言问题转换为Cypher查询是实现智能问答的核心from langchain.chains import GraphCypherQAChain cypher_chain GraphCypherQAChain.from_llm( graphgraph, cypher_llmChatOpenAI(temperature0, modelgpt-4), qa_llmChatOpenAI(temperature0.3, modelgpt-4), verboseTrue ) question 哪些客户购买了与故障组件X相关的产品 response cypher_chain.run(question)典型查询模式示例直接属性查询MATCH (p:Product) WHERE p.name CONTAINS 服务器 RETURN p路径查询MATCH path(c:Client)-[:PURCHASED]-(p:Product)-[:CONTAINS]-(comp:Component) RETURN path推荐查询MATCH (c:Client)-[:PURCHASED]-(p1:Product), (p1)-[:SIMILAR_TO]-(p2:Product) WHERE NOT (c)-[:PURCHASED]-(p2) RETURN p24. 系统优化与部署4.1 性能调优策略随着知识图谱规模扩大需要优化查询性能// 创建索引提高查询速度 CREATE INDEX product_name_index IF NOT EXISTS FOR (p:Product) ON (p.name) // 使用APOC库的图算法 CALL apoc.path.subgraphAll( startNode, {relationshipFilter: CONTAINS, maxLevel:3} ) YIELD nodes, relationships查询优化对照表优化前查询优化方案性能提升全图扫描添加属性索引10x多层可变长度路径设置最大深度限制5x复杂计算在客户端使用存储过程3x4.2 Streamlit前端集成创建用户友好的问答界面import streamlit as st from graph_qa import GraphQAEngine st.title(企业知识图谱问答系统) question st.text_input(请输入您的问题) if question: engine GraphQAEngine() answer, subgraph engine.query(question) st.markdown(f**回答**: {answer}) st.cytoscape(subgraph, layout{name: cose}, style{width: 100%, height: 400px})5. 实战案例IT运维知识库假设我们为数据中心运维构建知识库以下是典型问题处理流程故障诊断场景用户问交换机A端口灯不亮可能是什么原因系统执行MATCH (s:Switch {name:A})-[:HAS_PORT]-(p:Port)-[r]-(x) WHERE r.type IN [CONNECTED_TO, CONFIGURED_AS] RETURN p, r, x生成回答可能原因包括1) 连接的服务器B网卡故障参考案例CT20232) VLAN配置不匹配需检查...配置推荐场景用户问为新建的K8s集群推荐网络设备配置系统检索MATCH (c:Cluster {type:K8s})-[:USES]-(n:NetworkConfig) MATCH (n)-[r:RECOMMENDS]-(e:Equipment) RETURN n, r, e ORDER BY r.score DESC LIMIT 3在实现过程中我们发现几个关键经验首先图模式设计要预留扩展空间初期可以简化但必须保持一致性其次LLM生成的Cypher查询需要加入验证环节避免执行危险操作最后用户界面应可视化返回的子图增强结果可信度。

更多文章