使用 LangChain + Ollama + Neo4j 构建中文知识图谱完整教程(含 Docker 部署)

使用 LangChain + Ollama + Neo4j 构建中文知识图谱完整教程(含 Docker 部署)

在本教程中,我们将从零开始,使用 Ollama 本地大模型(Qwen2.5:7B) + LangChain + Neo4j 图数据库,构建一个完整的中文知识图谱系统。整个流程包括:

  • 本地部署 Ollama 和 Neo4j(通过 Docker)
  • 编写自定义 Prompt 提取结构化三元组
  • 将结果写入 Neo4j 并可视化

所有组件均运行在本地,无需联网调用 API,适合隐私敏感或离线场景。


🔧 一、环境准备

1. 安装 Docker(如未安装)

# Ubuntu / Debiansudoapt update &&sudoaptinstall docker.io -y sudo systemctl start dockersudousermod -aG docker$USER# 将当前用户加入 docker 组(需重新登录)# macOS / Windows:请安装 Docker Desktop

2. 启动 Ollama(使用 Docker)

docker run -d \ --gpus=all \# 如有 NVIDIA GPU 可加速(非必需) -p 11434:11434 \ --name ollama \ -v ollama:/root/.ollama \ ollama/ollama 
⚠️ 若无 GPU,去掉 --gpus=all 即可。

然后拉取 Qwen2.5:7B 模型(首次运行会自动下载):

dockerexec -it ollama ollama pull qwen2.5:7b 

验证是否成功:

curl http://localhost:11434/api/generate -d '{ "model": "qwen2.5:7b", "prompt": "你好" }'

3. 启动 Neo4j(使用 Docker)

docker run -d \ --name neo4j \ -p 7474:7474 \ -p 7687:7687 \ -v neo4j_data:/data \ -v neo4j_logs:/logs \ -e NEO4J_AUTH=neo4j/your_password \ neo4j:5.18 
✅ 请将 your_password 替换为你自己的密码(例如 neo4j123),后续代码中需保持一致。

访问 http://localhost:7474(或你的服务器 IP),用用户名 neo4j 和设置的密码登录。


📦 二、Python 环境依赖

创建虚拟环境并安装依赖:

python -m venv kg-env source kg-env/bin/activate # Windows: kg-env\Scripts\activate pip install langchain-ollama \ langchain-experimental \ langchain-core \ neo4j \ graphviz 
💡 注意:graphviz 是 Python 包,还需安装系统级 Graphviz:Ubuntu: sudo apt install graphvizmacOS: brew install graphvizWindows: 从 https://graphviz.org/download/ 安装并加入 PATH

🧩 三、完整 Python 脚本:构建中文知识图谱

将以下代码保存为 build_kg.py

from langchain_ollama import ChatOllama from langchain_experimental.graph_transformers import LLMGraphTransformer from langchain_core.documents import Document from langchain_core.prompts import ChatPromptTemplate from neo4j import GraphDatabase import time from graphviz import Digraph # 1. LLM 配置(指向本地 Ollama) llm = ChatOllama( model="qwen2.5:7b", temperature=0, base_url="http://192.168.31.161:11434"# ← 改为你的服务器 IP 或 localhost)# 2. 自定义中文 Prompt(严格约束实体与关系类型) custom_prompt = ChatPromptTemplate.from_messages([("system","""你是一名专业的中文知识图谱构建专家,请严格根据以下文本内容提取结构化的实体与关系。 【提取规则】 1. 实体类型仅限以下四类: - Person:人物(如 马化腾、张一鸣) - Organization:组织或公司(如 腾讯、字节跳动、中国科学院) - Location:地理位置(如 北京、广东省深圳市、长三角) - Product:产品或技术(如 微信、抖音、鸿蒙系统) 2. 关系类型仅限以下六种: - FOUNDED:A 创立了 B(例:马化腾 --FOUNDED--> 腾讯) - BORN_IN:A 出生于 B(例:雷军 --BORN_IN--> 湖北仙桃) - HEADQUARTERED_IN:A 总部位于 B(例:阿里巴巴 --HEADQUARTERED_IN--> 杭州市) - DEVELOPED:A 开发了 B(例:张小龙 --DEVELOPED--> 微信) - CEO_OF:A 担任 B 的 CEO(仅当明确提及“CEO”、“首席执行官”等职务时使用) - COMMITTED_TO:A 致力于 B(如企业使命、战略方向,需原文明确表述) 3. 重要原则: - 所有实体名称必须使用原文中的完整表述,不得缩写或改写(如“腾讯公司”不能简化为“腾讯”除非原文如此)。 - 仅提取文本中**明确陈述**的事实,禁止推理、联想或补充常识。 - 若文本未提及某类信息(如出生地、CEO),则不生成对应关系。 - 不输出任何解释、说明或额外文本,仅返回符合格式的三元组。 请基于以下输入文本进行提取: """),("human","{input}")])# 3. 图转换器 llm_transformer = LLMGraphTransformer( llm=llm, prompt=custom_prompt, allowed_nodes=["Person","Organization","Location","Product"], allowed_relationships=["CEO_OF","BORN_IN","FOUNDED","HEADQUARTERED_IN","COMMITTED_TO","DEVELOPED"])# 4. 输入文档(中文示例) documents =[ Document(page_content=""" 马化腾(Pony Ma)是腾讯公司(Tencent)的创始人兼董事会主席,他出生于中国广东省汕头市。 腾讯是一家全球领先的互联网科技公司,总部位于中国广东省深圳市。 马化腾还主导了微信(WeChat)的开发,微信是中国最流行的即时通讯与社交平台。 """),]print("🚀 开始提取知识图谱...") graph_documents =[]for i, doc inenumerate(documents):print(f"\n📄 正在处理第 {i+1}/{len(documents)} 个文档...") start_time = time.time() graph_doc = llm_transformer.convert_to_graph_documents([doc]) graph_documents.extend(graph_doc)print(f"✅ 处理完成,耗时 {time.time()- start_time:.2f} 秒")print("🔍 提取的节点:")for node in graph_doc[0].nodes:print(f"- {node.id} ({node.type})")print("\n🔗 提取的关系:")for rel in graph_doc[0].relationships:print(f"- {rel.source.id} --[{rel.type}]--> {rel.target.id}")# 5. 连接 Neo4j(替换为你的实际密码) URI ="bolt://192.168.31.161:7687"# ← 改为你的 Neo4j 地址 USERNAME ="neo4j" PASSWORD ="your_password"# ← 必须与 Docker 启动时一致 driver = GraphDatabase.driver(URI, auth=(USERNAME, PASSWORD))defcreate_graph(tx, graph_doc):# 清空旧数据(可选) tx.run("MATCH (n) DETACH DELETE n")# 创建节点for node in graph_doc.nodes: tx.run("MERGE (n:`%s` {id: $id})"% node.type,id=node.id)# 创建关系for rel in graph_doc.relationships: tx.run(""" MATCH (source {id: $source_id}) MATCH (target {id: $target_id}) MERGE (source)-[r:%s]->(target) """% rel.type, source_id=rel.source.id, target_id=rel.target.id)print("\n💾 正在写入 Neo4j...")try:with driver.session()as session:for graph_doc in graph_documents: session.execute_write(create_graph, graph_doc)print("✅ 写入成功!打开浏览器查看图谱:http://192.168.31.161:7474")except Exception as e:print(f"❌ 写入失败:{e}")print("请检查:Neo4j 是否运行?密码是否正确?网络是否通?")# 6. 从 Neo4j 读取并导出为图片deffetch_graph_from_neo4j(tx): result = tx.run(""" MATCH (a)-[r]->(b) RETURN a.id AS a, labels(a)[0] AS a_type, type(r) AS rel, b.id AS b, labels(b)[0] AS b_type """)returnlist(result)defsave_neo4j_graph_as_image(records, filename="knowledge_graph"): dot = Digraph(format="png", graph_attr={"rankdir":"LR"})for r in records: dot.node(r["a"],f"{r['a']}\n({r['a_type']})") dot.node(r["b"],f"{r['b']}\n({r['b_type']})") dot.edge(r["a"], r["b"], label=r["rel"]) path = dot.render(filename, cleanup=True)print(f"🖼️ 图谱已保存为:{path}.png")# 导出图片with driver.session()as session: records = session.execute_read(fetch_graph_from_neo4j)if records: save_neo4j_graph_as_image(records)else:print("⚠️ Neo4j 中无数据,跳过图片导出") driver.close()print("\n🎉 全部完成!")print("👉 在 Neo4j 浏览器中运行以下 Cypher 查询查看图形:")print("MATCH (n)-[r]->(m) RETURN n, r, m")

▶️ 四、运行脚本

python build_kg.py 

预期输出:

开始提取知识图谱... 正在处理第 1/1 个文档... 处理完成,耗时 62.47 秒 提取的节点: - 马化腾 (Person) - 腾讯公司 (Organization) - 中国广东省汕头市 (Location) - 中国广东省深圳市 (Location) - 微信 (Product) 提取的关系: - 马化腾 --[FOUNDED]--> 腾讯公司 - 马化腾 --[BORN_IN]--> 中国广东省汕头市 - 腾讯公司 --[HEADQUARTERED_IN]--> 中国广东省深圳市 - 马化腾 --[DEVELOPED]--> 微信 正在手动写入 Neo4j(无APOC问题)... 写入成功!现在浏览器里一定能看到完整图谱了 全部完成!去浏览器 http://192.168.31.161:7474 运行以下查询查看图形: MATCH (n)-[r]->(m) RETURN n,r,m 
在这里插入图片描述

同时,在 Neo4j 浏览器中执行:

MATCH (n)-[r]->(m) RETURN n, r, m 

即可看到交互式图谱!


✅ 五、常见问题排查

问题解决方案
Connection refused检查 Ollama/Neo4j 是否在运行:docker ps
Authentication failed确认 NEO4J_AUTH 密码与代码中一致
提取结果为空检查 Prompt 是否适配中文;尝试 temperature=0.1
Graphviz 报错安装系统级 Graphviz(非仅 pip 包)
IP 地址不对192.168.31.161 改为 localhost(本地测试)

🌟 六、扩展建议

  • 增加更多文档批量处理
  • 添加实体消歧(如“马化腾” vs “Pony Ma”)
  • 使用 unstructured 库解析 PDF/Word
  • 部署为 FastAPI 服务提供 KG 查询接口

📚 结语

通过本教程,你已经掌握了如何利用 开源大模型 + 图数据库 构建端到端的中文知识图谱系统。整个流程完全本地化,安全可控,适合企业内网或科研场景。

Read more

50 行代码搞定 SLAM+AI Agent!机器人自主导航最小原型,看完就能跑

你想快速搞懂「SLAM+AI Agent」到底怎么让机器人变 “智能” 吗?不用堆公式、不用装复杂环境,纯 Python 实现极简可运行 Demo,看完就能复现,还能直接迁移到真实机器人开发! 一、一句话讲透核心逻辑 * SLAM = 机器人的眼睛 + 定位:回答 “我在哪?周围环境什么样?” * AI Agent = 机器人的大脑 + 决策:回答 “我该去哪?怎么走?避障怎么搞?” * SLAM+AI Agent = 能自主走路的智能机器人:眼睛感知→大脑决策→身体执行,形成闭环。 二、极简 Demo 目标(10×10 网格场景) 机器人从 (0,0) 出发,

Sharpa Robotics量产视觉基触觉手SharpaWave!0.005N超敏感知+模块化设计,攻克通用机器人操纵痛点

Sharpa Robotics量产视觉基触觉手SharpaWave!0.005N超敏感知+模块化设计,攻克通用机器人操纵痛点

摘要:新加坡 Sharpa Robotics 宣布旗舰灵巧手 SharpaWave 量产,采用创新 “动态触觉阵列” 视觉基感知方案,实现 0.005N 压力灵敏度,搭配 22 主动自由度与 6 维力传感,可完成敲蛋、操作工业工具等复杂任务。产品支持模块化换指(降低维修成本),配套开源软件栈适配主流仿真环境,瞄准通用机器人市场,即将亮相 2026 CES 创新奖。 引言:通用机器人的 “触觉短板” 终破局,视觉基灵巧手量产来袭 通用机器人要实现 “类人操纵”,核心瓶颈在于 “触觉感知”:传统机器人手要么触觉灵敏度低(无法完成敲蛋、持握轻薄物体等精细任务),要么结构复杂维修难(单部件故障需整机更换, downtime 长、成本高),难以适配科研与工业的多样化需求。 Sharpa Robotics 宣布

用Sambert-HifiGan为AR/VR体验添加沉浸式语音

用Sambert-HifiGan为AR/VR体验添加沉浸式语音 引言:让虚拟世界“开口说话”——中文多情感语音合成的必要性 在增强现实(AR)与虚拟现实(VR)系统中,沉浸感是用户体验的核心指标。视觉渲染、空间交互固然重要,但真正能“打动人心”的,往往是自然流畅的语音反馈。传统预录音频缺乏灵活性,而机械单调的TTS(Text-to-Speech)系统又难以传递情绪,容易破坏沉浸氛围。 为此,高质量、多情感的中文语音合成技术成为AR/VR内容升级的关键突破口。用户期望听到的不仅是“正确发音”,更是带有喜怒哀乐、语调起伏的“有温度的声音”。ModelScope推出的 Sambert-HifiGan 中文多情感语音合成模型 正是为此类场景量身打造——它不仅能准确还原汉字发音,还能根据上下文或控制信号生成不同情感色彩的语音输出,极大提升了人机交互的真实感。 本文将深入解析如何基于该模型构建一个稳定、易用、可集成的语音服务系统,并探讨其在AR/VR应用中的工程落地路径。 技术架构解析:Sambert-HifiGan 模型核心机制 1. Sambert:高保真声学建模的基石

YOLOv8n机器人场景目标检测实战|第一周工作笔记1

核心完成项:基于Conda搭建Ultralytics8.0+PyTorch2.1专属环境,完成COCO2017机器人场景子集筛选(8000张,7000训+1000验),跑通YOLOv8n基础训练(epoch=50),小障碍物mAP≥65%,模型可正常输出推理结果,满足周验收全部目标。 环境说明:全程使用Conda进行包管理与环境隔离,无pip命令使用,规避版本兼容问题;模型选用YOLOv8n(轻量化版本,适配机器人端算力限制),替代原计划YOLOv9n,核心实操逻辑一致。 一、本周核心目标与执行思路 1. 核心目标 1. 掌握YOLO系列核心创新与轻量化模型适配逻辑,聚焦机器人室内小场景(室内小障碍物/桌椅/行人/台阶)检测需求; 2. 搭建稳定可复现的Ultralytics+PyTorch训练环境,规避版本冲突; 3. 筛选并整理符合YOLO格式的机器人场景自定义数据集,完成基础标注与训练集/验证集划分; 4. 跑通YOLOv8n基础训练流程,验证数据集与模型兼容性,获取基础精度、参数量、