基于LangChain与Neo4j的GraphRAG智能问答系统实战

📅 2026/8/15 5:40:40
基于LangChain与Neo4j的GraphRAG智能问答系统实战
在工程领域尤其是桥梁、建筑等基础设施的运维管理中如何从海量的规范文档和巡检报告中快速、准确地找到所需信息是工程师们长期面临的痛点。传统的关键词搜索往往只能找到包含特定词汇的文档却无法理解问题的深层含义和实体间的复杂关系导致信息检索效率低下且容易遗漏关键关联。本文将介绍如何利用 LangChain 框架结合知识图谱Neo4j与大语言模型LLM构建一个面向“桥梁规范与巡检报告”的智能问答系统。通过 GraphRAG图检索增强生成技术系统不仅能理解自然语言提问还能从结构化的知识图谱中精准检索相关实体和关系生成准确、有据可依的答案。无论你是想了解智能体Agent工作流编排还是希望将 GraphRAG 应用于垂直领域知识管理本文都将提供从原理到部署的完整实战指南。1. 背景与核心概念在深入代码之前我们需要厘清几个核心概念及其在本系统中的作用。1.1 什么是 LangChain 与智能体AgentLangChain 是一个用于开发由大语言模型驱动的应用程序的框架。它并非一个单一的模型而是一个“粘合剂”和“工具箱”帮助开发者将 LLM 与外部数据源、计算工具、记忆系统等连接起来构建功能复杂的应用。智能体Agent是 LangChain 中的一个核心概念。你可以将其理解为一个具备“思考”和“行动”能力的智能程序。它根据用户的输入问题、自身的“记忆”历史对话或知识以及可用的“工具”如搜索、计算、查询数据库自主决定下一步该做什么调用哪个工具并整合工具返回的结果最终生成给用户的回答。在本系统中Agent 负责协调整个问答流程理解问题、决定是否需要查询知识图谱、如何查询、以及如何组织答案。1.2 知识图谱与 Neo4j知识图谱是一种用图结构来建模和存储知识的数据库。它由“节点”实体如“XX大桥”、“混凝土裂缝”和“边”关系如“位于”、“属于”、“表现为”组成。这种结构非常擅长表达实体间丰富、复杂的关系。Neo4j是目前最流行的原生图数据库之一。它使用 Cypher 查询语言其语法直观地匹配图模式使得查询关系数据变得非常高效和简单。在我们的系统中Neo4j 将存储所有关于桥梁规范条款、巡检报告条目、桥梁部件、缺陷类型等实体及其相互关系。1.3 GraphRAG图检索增强生成RAG检索增强生成已成为解决 LLM 知识滞后与幻觉问题的主流方案。传统的 RAG 通常基于向量数据库进行语义检索但它检索的是“相似的文本片段”可能丢失重要的结构化关系信息。GraphRAG是 RAG 的一种演进形式它利用知识图谱进行检索。其核心优势在于关系感知检索不仅能找到与问题相关的实体还能沿着图中的关系路径找到与之相连的其他相关实体。例如询问“桥墩裂缝如何处理”系统不仅能找到“裂缝”实体还能通过关系找到与之相关的“处理工艺”、“规范条款”、“历史案例”等。可解释性检索结果基于清晰的图结构节点和边使得答案的生成过程更具可解释性。我们可以追溯是哪些实体和关系支撑了最终答案。多跳推理支持通过多步关系进行推理。例如“找到所有在2023年巡检中发现裂缝的桥梁并列出其对应的养护部门”。本系统正是基于 GraphRAG 范式将用户的自然语言问题转化为对 Neo4j 知识图谱的查询检索出相关的子图再将此结构化信息与问题一同提交给 LLM生成最终的自然语言答案。2. 环境准备与版本说明本项目是一个 Python 应用程序主要依赖 LangChain 生态和 Neo4j 数据库。2.1 软件与环境操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04)。本文演示基于 macOS/Linux 环境Windows 用户请注意路径差异。Python版本 3.9 或 3.10。推荐使用 3.10 以保证依赖兼容性。可使用python --version检查。包管理工具pip(Python 3.10 通常自带)。数据库Neo4j 数据库。我们将使用Neo4j AuraDB云托管免费版或Neo4j Desktop本地安装进行演示。Neo4j 5.x 版本均可。大语言模型我们将使用 OpenAI 的 GPT 模型如 gpt-3.5-turbo作为 LLM 核心。你需要准备一个有效的 OpenAI API Key。也可以替换为其他兼容 OpenAI API 的模型如 DeepSeek、智谱AI等。2.2 创建项目与安装依赖首先创建一个新的项目目录并进入。mkdir bridge-qa-system cd bridge-qa-system建议创建一个 Python 虚拟环境来隔离依赖。python -m venv venv # 激活虚拟环境 # macOS/Linux: source venv/bin/activate # Windows: # venv\Scripts\activate创建requirements.txt文件并填入以下核心依赖langchain0.1.0 langchain-community0.0.10 langchain-openai0.0.5 langchain-experimental0.0.49 # 包含一些实验性图功能 neo4j5.14.0 python-dotenv1.0.0 openai1.6.1 tiktoken0.5.2然后安装依赖pip install -r requirements.txt版本说明LangChain 版本迭代较快以上版本为撰写本文时的稳定版本。若遇到兼容性问题可尝试调整版本。核心是确保langchain,langchain-community,langchain-openai和neo4j驱动能协同工作。2.3 配置 Neo4j 数据库方案一使用 Neo4j AuraDB免费云数据库推荐新手访问 Neo4j Aura 官网注册账号。创建一个免费的 AuraDB 实例如 “Free” 套餐。创建完成后你会获得一个连接 URI格式如neo4js://xxxx.databases.neo4j.io、用户名默认为neo4j和密码。请妥善保存。方案二使用 Neo4j Desktop本地安装从 Neo4j 官网下载 Neo4j Desktop 并安装。创建一个新的本地数据库设置名称和密码。启动数据库其默认的 Bolt 连接 URI 通常是bolt://localhost:7687用户为neo4j密码为你设置的密码。2.4 配置环境变量在项目根目录创建.env文件用于存储敏感信息避免硬编码在代码中。# .env 文件 OPENAI_API_KEY你的OpenAI_API_Key NEO4J_URI你的Neo4j连接URI NEO4J_USERNAMEneo4j NEO4J_PASSWORD你的Neo4j密码3. 系统核心原理与架构拆解在开始编码前理解系统如何运作至关重要。下图展示了核心工作流用户提问 ↓ [LangChain Agent] ↓ (决策需要查询图谱) [Graph Retrieval Tool] ↓ (将问题转为Cypher查询) [Neo4j Knowledge Graph] ↓ (返回相关子图-节点和边) [Response Synthesis] ↓ (将子图信息与问题结合) [LLM (e.g., GPT)] ↓ 生成最终答案3.1 知识图谱数据模型设计对于“桥梁规范与巡检报告”领域我们需要设计一个贴合业务的知识图谱模型。以下是一个简化的示例模型节点类型标签:Bridge: 桥梁属性有id,name,location,build_year。InspectionReport: 巡检报告属性有report_id,date,inspector。Defect: 缺陷属性有id,description,severity。Specification: 规范条款属性有code,title,content。Component: 桥梁部件属性有type(如Deck,Pier,Abutment)。MaintenanceAction: 养护措施属性有action,standard。关系类型:HAS_REPORTBridge-InspectionReport桥梁拥有巡检报告IDENTIFIESInspectionReport-Defect报告识别出缺陷LOCATED_INDefect-Component缺陷位于部件上GOVERNED_BYDefect或Component-Specification受规范条款约束REQUIRESDefect-MaintenanceAction缺陷需要某种养护措施REFERS_TOSpecification-Specification规范条款相互引用这个模型允许我们进行复杂的查询例如“查询所有桥墩存在裂缝的桥梁并列出对应的规范要求和推荐养护措施”。3.2 LangChain 中的图检索工具Graph Retrieval Tool这是实现 GraphRAG 的关键。我们需要创建一个工具其功能是接受自然语言问题自动或半自动将其转换为 Cypher 查询语句在 Neo4j 中执行并将返回的图数据节点和关系列表格式化为文本供 LLM 理解。LangChain 社区提供了Neo4jGraph和GraphCypherQAChain等组件来简化这一过程。GraphCypherQAChain内部集成了一个 LLM专门用于将问题转换为 Cypher 查询但它可能不够灵活。在智能体工作流中我们更倾向于将其封装成一个独立的Tool由 Agent 来调度。4. 完整实战构建桥梁智能问答系统现在我们将一步步实现这个系统。4.1 初始化 Neo4j 图数据库连接首先我们编写一个模块来连接 Neo4j。创建文件graph_db.py。# graph_db.py from langchain_community.graphs import Neo4jGraph from dotenv import load_dotenv import os load_dotenv() # 加载 .env 文件中的环境变量 def init_neo4j_graph(): 初始化并返回一个连接到 Neo4j 的图对象。 此对象用于执行 Cypher 查询和获取图模式信息。 graph Neo4jGraph( urlos.getenv(NEO4J_URI), usernameos.getenv(NEO4J_USERNAME), passwordos.getenv(NEO4J_PASSWORD), ) # 可选刷新图模式信息让 LangChain 了解数据库中有哪些节点和关系标签 graph.refresh_schema() print(Neo4j 图数据库连接成功模式已刷新。) return graph if __name__ __main__: # 测试连接 graph init_neo4j_graph() # 打印当前图的模式节点和关系类型 print(graph.schema)运行python graph_db.py测试连接是否成功。如果成功会打印出数据库的模式信息可能是空的因为我们还没导入数据。4.2 构建知识图谱数据导入我们需要向空的 Neo4j 数据库中导入示例数据。创建import_data.py文件。这里我们使用 Cypher 语句直接创建节点和关系。# import_data.py from graph_db import init_neo4j_graph def import_sample_data(): graph init_neo4j_graph() # 清空现有数据生产环境慎用 graph.query(MATCH (n) DETACH DELETE n) print(已清空旧数据。) # 定义示例数据导入的 Cypher 语句 cypher_statements [ # 创建桥梁 CREATE (b1:Bridge {id: B001, name: 新华大桥, location: A市, build_year: 2005}), (b2:Bridge {id: B002, name: 胜利大桥, location: B市, build_year: 2010}) , # 创建巡检报告 CREATE (r1:InspectionReport {report_id: R2023001, date: 2023-05-10, inspector: 张三}), (r2:InspectionReport {report_id: R2023002, date: 2023-08-22, inspector: 李四}) , # 创建缺陷 CREATE (d1:Defect {id: D001, description: 混凝土表面纵向裂缝, severity: 中等}), (d2:Defect {id: D002, description: 钢筋局部锈蚀, severity: 轻微}), (d3:Defect {id: D003, description: 支座位移超限, severity: 严重}) , # 创建规范条款 CREATE (s1:Specification {code: JTG H20-2015 4.2.1, title: 裂缝宽度限值, content: 钢筋混凝土构件受拉区裂缝宽度不得大于0.2mm。}), (s2:Specification {code: JTG H20-2015 5.3.3, title: 锈蚀处理, content: 发现钢筋锈蚀应及时除锈并做防腐处理。}), (s3:Specification {code: JTG H20-2015 6.1.2, title: 支座检查, content: 应定期检查支座位移和变形情况。}) , # 创建部件 CREATE (c1:Component {type: 主梁}), (c2:Component {type: 桥墩}), (c3:Component {type: 支座}) , # 创建养护措施 CREATE (m1:MaintenanceAction {action: 表面封闭处理, standard: 采用环氧树脂灌缝}), (m2:MaintenanceAction {action: 除锈防腐, standard: Sa2.5级喷砂除锈后涂装}), (m3:MaintenanceAction {action: 支座调整或更换, standard: 根据设计单位方案进行}) , # 建立关系 MATCH (b:Bridge {id: B001}), (r:InspectionReport {report_id: R2023001}) CREATE (b)-[:HAS_REPORT]-(r) , MATCH (b:Bridge {id: B002}), (r:InspectionReport {report_id: R2023002}) CREATE (b)-[:HAS_REPORT]-(r) , MATCH (r:InspectionReport {report_id: R2023001}), (d:Defect {id: D001}) CREATE (r)-[:IDENTIFIES]-(d) , MATCH (r:InspectionReport {report_id: R2023001}), (d:Defect {id: D002}) CREATE (r)-[:IDENTIFIES]-(d) , MATCH (r:InspectionReport {report_id: R2023002}), (d:Defect {id: D003}) CREATE (r)-[:IDENTIFIES]-(d) , MATCH (d:Defect {id: D001}), (c:Component {type: 桥墩}) CREATE (d)-[:LOCATED_IN]-(c) , MATCH (d:Defect {id: D002}), (c:Component {type: 主梁}) CREATE (d)-[:LOCATED_IN]-(c) , MATCH (d:Defect {id: D003}), (c:Component {type: 支座}) CREATE (d)-[:LOCATED_IN]-(c) , MATCH (d:Defect {id: D001}), (s:Specification {code: JTG H20-2015 4.2.1}) CREATE (d)-[:GOVERNED_BY]-(s) , MATCH (d:Defect {id: D002}), (s:Specification {code: JTG H20-2015 5.3.3}) CREATE (d)-[:GOVERNED_BY]-(s) , MATCH (d:Defect {id: D003}), (s:Specification {code: JTG H20-2015 6.1.2}) CREATE (d)-[:GOVERNED_BY]-(s) , MATCH (d:Defect {id: D001}), (m:MaintenanceAction {action: 表面封闭处理}) CREATE (d)-[:REQUIRES]-(m) , MATCH (d:Defect {id: D002}), (m:MaintenanceAction {action: 除锈防腐}) CREATE (d)-[:REQUIRES]-(m) , MATCH (d:Defect {id: D003}), (m:MaintenanceAction {action: 支座调整或更换}) CREATE (d)-[:REQUIRES]-(m) , ] for stmt in cypher_statements: try: graph.query(stmt) except Exception as e: print(f执行语句时出错: {stmt[:50]}... \n错误: {e}) print(示例数据导入完成) # 再次打印模式现在应该能看到所有标签和关系 print(\n当前图谱模式) print(graph.schema) if __name__ __main__: import_sample_data()运行python import_data.py将示例数据导入 Neo4j。你可以在 Neo4j BrowserAuraDB 或 Desktop 都提供中可视化查看导入的图谱。4.3 创建图检索工具Graph Retrieval Tool这是实现 GraphRAG 的核心。我们创建一个自定义工具它利用 LLM 将问题转换为 Cypher 查询。创建graph_retrieval_tool.py。# graph_retrieval_tool.py from langchain.tools import Tool from langchain.chains import GraphCypherQAChain from langchain_openai import ChatOpenAI from graph_db import init_neo4j_graph import os from dotenv import load_dotenv load_dotenv() class GraphQAChainTool: 封装 GraphCypherQAChain 为 LangChain Tool 的工具类。 def __init__(self): self.llm ChatOpenAI( modelgpt-3.5-turbo, temperature0, # 温度设为0使生成更确定适合查询生成 openai_api_keyos.getenv(OPENAI_API_KEY) ) self.graph init_neo4j_graph() # 初始化 GraphCypherQAChain self.cypher_chain GraphCypherQAChain.from_llm( llmself.llm, graphself.graph, verboseTrue, # 设置为 True 可以看到链的思考过程调试时很有用 allow_dangerous_requestsTrue # 允许执行写入操作仅用于演示生产环境需严格控制 ) def run(self, query: str) - str: 执行图检索问答。 参数: query: 用户的自然语言问题。 返回: 基于图谱检索结果生成的答案。 try: result self.cypher_chain.run(query) return result except Exception as e: return f查询图谱时出现错误{str(e)}。请确保问题与桥梁规范或巡检报告相关并尝试重新表述。 def get_graph_retrieval_tool(): 创建并返回一个 LangChain Tool 实例。 tool_instance GraphQAChainTool() return Tool( nameBridge_Knowledge_Graph, functool_instance.run, description专门用于查询桥梁工程领域知识图谱的工具。 当用户的问题涉及桥梁信息、巡检报告内容、缺陷类型、规范条款或养护措施时使用此工具。 输入应为清晰的自然语言问题。 例如 - 新华大桥有哪些缺陷 - 混凝土裂缝对应的规范要求是什么 - 支座位移超限应该采取什么养护措施 ) if __name__ __main__: # 测试工具 tool get_graph_retrieval_tool() test_question 新华大桥有哪些缺陷严重程度如何 print(f测试问题: {test_question}) answer tool.run(test_question) print(f工具回答: {answer})这个工具的核心是GraphCypherQAChain。它会根据图谱模式schema和用户问题让 LLM 生成一个可能的 Cypher 查询。在 Neo4j 中执行该查询。将查询结果图数据和原始问题再次交给 LLM生成最终的自然语言答案。4.4 构建智能体Agent工作流现在我们将图检索工具整合进一个智能体中让 Agent 来决定何时使用这个工具。创建bridge_qa_agent.py。# bridge_qa_agent.py from langchain.agents import initialize_agent, AgentType from langchain_openai import ChatOpenAI from graph_retrieval_tool import get_graph_retrieval_tool import os from dotenv import load_dotenv load_dotenv() def create_bridge_qa_agent(): 创建并返回一个用于桥梁问答的智能体。 该智能体可以使用图检索工具和通用对话能力。 # 1. 初始化 LLM llm ChatOpenAI( modelgpt-3.5-turbo, temperature0, # 较低的 temperature 使回答更稳定 openai_api_keyos.getenv(OPENAI_API_KEY) ) # 2. 准备工具列表 tools [get_graph_retrieval_tool()] # 未来可以添加更多工具如计算器、网络搜索等 # from langchain.utilities import SerpAPIWrapper # tools.append(Tool(nameSearch, funcSerpAPIWrapper().run, description用于搜索最新信息)) # 3. 初始化智能体 # 使用 ZERO_SHOT_REACT_DESCRIPTION 代理类型它基于 ReAct 框架适合工具使用。 agent initialize_agent( toolstools, llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, # 打印 Agent 的思考过程便于调试 handle_parsing_errorsTrue, # 优雅地处理解析错误 max_iterations3, # 限制最大迭代次数防止死循环 early_stopping_methodgenerate # 提前停止策略 ) return agent def run_agent_interactive(): 以交互模式运行智能体。 agent create_bridge_qa_agent() print(桥梁规范与巡检报告智能问答系统已启动) print(输入 quit 或 exit 退出。) print(- * 50) while True: try: user_input input(\n您的问题: ).strip() if user_input.lower() in [quit, exit, q]: print(再见) break if not user_input: continue response agent.run(user_input) print(f\n系统回答: {response}) except KeyboardInterrupt: print(\n程序被中断。) break except Exception as e: print(f\n处理问题时发生错误: {e}) if __name__ __main__: run_agent_interactive()4.5 运行与验证现在让我们运行整个系统。在终端执行python bridge_qa_agent.py系统启动后尝试提出一些问题简单实体查询“新华大桥有哪些缺陷”预期Agent 会调用图检索工具工具生成类似MATCH (b:Bridge {name:新华大桥})-[:HAS_REPORT]-()-[:IDENTIFIES]-(d:Defect) RETURN d.description, d.severity的查询并返回结果。关系与规范查询“混凝土裂缝对应的规范要求是什么”预期工具会尝试匹配“混凝土裂缝”缺陷并找到与之关联的GOVERNED_BY关系返回规范条款内容。多跳推理查询“支座位移超限应该采取什么养护措施依据哪条规范”预期这是一个更复杂的问题。工具需要找到“支座位移超限”缺陷然后通过REQUIRES关系找到养护措施同时通过GOVERNED_BY关系找到规范并将两者整合进答案。非图谱问题“你好请介绍一下你自己。”预期Agent 发现这个问题不需要使用图检索工具会直接利用 LLM 的基础对话能力进行回答。观察控制台的verbose输出你可以看到 Agent 的思考过程Thought、决定使用的工具Action、工具输入Action Input、工具输出Observation以及最终答案Final Answer。这正是智能体工作流编排的直观体现。5. 常见问题与排查思路在构建和运行此类系统时你可能会遇到以下问题问题现象可能原因排查思路与解决方案连接 Neo4j 失败1. URI、用户名或密码错误。2. Neo4j 服务未启动。3. 网络问题特别是 AuraDB。4. 驱动版本与数据库不兼容。1. 检查.env文件中的NEO4J_URI格式bolt://或neo4js://。2. 运行neo4j status或查看 Neo4j Desktop 确认服务状态。3. 尝试用curl或 Neo4j Browser 连接排除网络问题。4. 确保neo4jPython 驱动版本与你的数据库版本兼容。GraphCypherQAChain 生成的 Cypher 查询错误1. LLM 对图谱模式理解不准确。2. 问题表述模糊难以映射到图谱。3. 生成的 Cypher 语法错误。1. 确保graph.refresh_schema()被正确调用模式信息是最新的。2. 在GraphCypherQAChain初始化时传入cypher_prompt进行定制提供更清晰的指令和示例。3. 开启verboseTrue查看生成的 Cypher 语句在 Neo4j Browser 中手动测试其正确性。4. 考虑使用GraphCypherQAChain的return_directTrue选项直接返回查询结果然后自己编写答案合成逻辑。Agent 不调用图检索工具1. 工具的描述description不够清晰Agent 无法判断何时使用。2. 问题与工具描述不匹配。3. Agent 类型选择不当。1. 优化工具的description明确列出工具能处理的问题类型和示例。2. 在用户问题中更明确地包含领域关键词如“桥梁”、“规范”、“缺陷”。3. 尝试使用AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION或AgentType.OPENAI_FUNCTIONS如果使用 GPT-4等不同的 Agent 类型。LLM 回答与图谱事实不符幻觉1. 图谱检索结果为空或无关。2. LLM 在合成答案时忽略了检索到的信息。3. 检索到的信息片段过多或过杂LLM 无法有效整合。1. 检查 Cypher 查询返回的结果是否正确。确保数据已正确导入且模型匹配。2. 在GraphCypherQAChain中可以调整llm的temperature为 0并优化合成答案的提示词qa_prompt。3. 对检索结果进行后处理如过滤、排序、截断只保留最相关的部分再交给 LLM。处理复杂、多部分问题效果差1. Agent 一次迭代可能无法解决复杂问题。2. 图检索工具可能只回答了问题的一部分。1. 适当增加max_iterations参数允许 Agent 进行多轮思考和工具调用。2. 设计更精细的工具。例如拆分成“查询桥梁信息”、“查询缺陷”、“查询规范”等多个专用工具让 Agent 组合使用。3. 考虑使用LangGraph来编排更复杂、有状态的多步骤工作流。6. 最佳实践与工程建议将原型系统投入生产环境或进行深度开发时请考虑以下建议图谱设计优化属性索引为高频查询的属性如Bridge.name,Defect.description,Specification.code创建索引大幅提升查询速度。CREATE INDEX bridge_name_index IF NOT EXISTS FOR (b:Bridge) ON (b.name); CREATE INDEX defect_desc_index IF NOT EXISTS FOR (d:Defect) ON (d.description);关系方向性精心设计关系的方向使其更符合业务语义这能使 Cypher 查询更直观。数据质量建立数据清洗和验证流程确保导入图谱的数据准确、一致。提示工程Prompt Engineering定制 Cypher 生成提示GraphCypherQAChain默认的提示可能不适合你的特定图谱。你应该提供一个包含详细图谱模式、关系示例和 Cypher 示例的提示模板引导 LLM 生成更准确的查询。定制答案合成提示同样可以定制合成最终答案的提示词要求 LLM 严格基于提供的上下文检索结果作答并注明信息来源减少幻觉。智能体工作流增强工具扩展除了图检索可以集成其他工具如向量数据库检索用于非结构化文档、专业计算器、外部 API如天气、材料价格等使 Agent 能力更全面。使用 LangGraph对于需要严格步骤控制、循环或复杂状态管理的场景LangGraph是比基础 Agent 更强大的选择。它可以让你以图的形式精确编排工作流。记忆Memory为 Agent 添加对话记忆使其能理解上下文处理如“上一座桥的养护措施是什么”这样的指代性问题。性能与安全查询超时与重试对 Neo4j 查询和 LLM API 调用设置超时和重试机制。限制 Cypher 权限生产环境中用于应用程序的数据库用户应只有读取MATCH权限避免误操作或注入攻击。allow_dangerous_requests应设为False。API 密钥管理使用环境变量或专业的密钥管理服务切勿将密钥提交到代码仓库。限流与缓存对 LLM API 调用进行限流并对常见查询的结果进行缓存以控制成本和提升响应速度。评估与迭代构建测试集准备一组涵盖不同问题类型简单查询、多跳推理、模糊查询的标准问题及其预期答案。定期评估运行测试集评估系统的准确率、召回率和答案质量。重点关注检索失败和幻觉案例。持续优化根据评估结果迭代优化图谱数据、提示词、工具描述和 Agent 配置。通过本文的实践你已经掌握了使用 LangChain、Neo4j 和 LLM 构建领域智能问答系统的核心流程。从环境搭建、数据建模、工具封装到智能体编排每一步都旨在将前沿的 GraphRAG 技术落地解决实际业务问题。这套架构具有很强的扩展性你可以轻松地将知识图谱的主题从“桥梁”替换为“医疗”、“金融”、“法律”等任何垂直领域只需重新设计图谱模型和导入领域数据即可。接下来你可以尝试集成更复杂的 Agent 逻辑、加入非结构化文档的向量检索实现混合检索、或者利用 LangGraph 构建更稳健的多步骤工作流进一步提升系统的智能水平和实用性。