游乐游手机版
首页/AI热点日报/热点详情

0基础实战本地大模型LangChain知识图谱节点识别匹配

类型:热点整理2026-05-31
基于本地大模型与Langchain,从文本中识别并匹配概念语义关系,构建知识图谱。以医疗数据为例,纯本地运行,无需云服务。通过miniconda、jupyter及zephyr模型实现数据处理与关系提取,最终输出可视化的交互式网页。
```html

用本地LLM构建知识图谱与高级RAG:从数据到概念关系,全流程实战拆解

新年好。

我们先聊聊数据这件事。数据是一切工作的起点——这句话听起来有些老生常谈,但在AI落地场景中,它依然是最朴素的真理。无论是HR筛选简历、业务部门处理合同、电商平台分析客户评价,还是个人整理学习笔记,数据只有在被结构化、可检索之后,才能真正发挥价值。

上一篇文章中,我们完成了私有文档的预处理与文本提取分块。今天继续推进:利用本地LLM,从文本中识别、匹配概念及其语义关系,从而构建知识图谱。整个系列覆盖从数据预处理到高级RAG应用的全部流程,本篇是第四步。

考虑到企业对数据安全与隐私保护的要求,本次所有操作均在本地完成,不依赖任何云服务。整个项目以医疗数据为例,相关资料已整理完毕,可随时查阅。

人的专注力只有十分钟,咱们抓紧聊干货。

第一部分:全局性思考,真正给你“渔”

庄子说:纵横不出方圆,万变不离其宗。做知识图谱也是如此——先搞清楚要解决什么问题,目标明确了,事情就能事半功倍。

先来看一个常见的需求统计表:

有了目标,接下来就需要做好技术工程计划与资源分配。知识图谱的构建是一项综合性工程,不仅需要开发人员,还需要数据分析师、领域专家。此外,还需要一个项目中控,确保资源分配合理、各环节协同推进。

1.1 技术工程计划的制定

技术选型:选择合适的技术栈是成功的前提。包括数据存储(如 Neo4j、JanusGraph)、数据处理(如 Apache Spark、Kafka)、前端展示(如 D3.js、Sigma.js)。本文第二部分会详细说明本次项目所使用的工具。

数据源确定:根据目标确定需要整合的数据源——公开数据集、内部数据库、爬虫数据等。这一步还要评估数据质量、可用性以及相关合规要求。

架构设计:设计完整的系统架构,覆盖数据采集、处理、存储、查询和展示。确保可扩展性、稳定性和安全性。

开发计划:制定分阶段的目标、时间节点和人员分工。推荐采用迭代式开发,灵活应对变化。

1.2 资源分配策略

手上有哪些资源——人员、时间、预算、技术积累,必须做到心中有数。

团队建设:组建跨学科团队,除了技术人员,还要有领域专家支持。每个成员需要清楚自己的职责与协作方式。

时间管理:合理分配时间,确保关键里程碑按时达成。采用敏捷开发方法(Scrum、Kanban)可以提高效率。

资金投入:明确预算,重点投入到技术研发、数据获取和人才培养上。

知识共享:团队内部定期进行技术分享、工作坊、培训,持续提升整体水平。

第二部分:实现方案详解——用什么工具?怎么用?

整个项目分为四步,接下来逐一详解。

① 文本分块:将语料库切分成多个块,每个块分配一个块ID。这一步之前已经完成,尚未完成的可以回看历史内容。

工具:LangChain、LlamaIndex、Unstructured等

② 关系提取:对每个文本块,使用LLM提取概念及其语义关系,并为每个关系分配一个权重W1。同一对概念之间可以存在多个关系,每个关系作为一条边。

工具:Ollama、Zephyr、df2Graph、graph2Df等

③ 相关性计算:同一文本块中的概念,通过上下文邻近性产生关联,分配权重W2。同一对概念可能出现在多个块中。

工具:Pandas、NumPy

④ 可视化呈现:将相似的概念对分组,并对权重求和,最后连接起来。最终每个不同概念对之间只有一条边,带有权重和关系名称,形成可视化概念图,以网页形式输出。

工具:Seaborn、Pandas、NetworkX、Pyvis等

第三部分:跑一个实例——边跑边聊细节

说实话,你是不是直接跳到这里了?建议先回看前面的“心法”,磨刀不误砍柴工。

今天主要完成数据处理和关系提取,下一篇再完成连线与可视化。现在开始动手!

主要分为两块内容:
#A 创建AI实操环境:Miniconda + Jupyter Notebook
#B 实跑知识图谱,输出HTML网页文件

3.1 创建实操AI环境

首先在Ollama中部署一个Zephyr大模型,也可以替换为其他LLM。尚未学习部署的,可以查看之前的部署指南。

打开WSL,输入指令回车启动。如果是首次部署,会自动下载模型,占用显存约6GB。

ollama run zephyr

先将窗口挂在后台,后续代码会接入它。LLM的作用是根据文本块生成概念关系,效果如下图所示:

打开Miniconda,创建一个新环境,在该环境中完成数据处理与概念图生成。尚未搭建环境的,请参考之前的环境搭建指南。

创建新环境,在Miniconda的命令窗口中输入:

conda create --name kg python=3.10

环境名称为“kg”,指定Python 3.10。务必重新创建环境,不要沿用旧环境,养成良好习惯。

激活环境:

conda activate kg

安装依赖:

pip install pandas numpy networkx seaborn langchain pypdf2 pyvis tqdm yachalk unstructured "unstructured[pdf]"

安装Jupyter:

pip install jupyter

启动Jupyter:

jupyter-notebook

处理下载的文件

将会员盘中的文件下载后,放到一个纯英文路径下,使用cd进入该路径,然后双击打开名为“yiyiai-kg”的notebook。

简单介绍一下Jupyter的使用方法:右上角圆圈表示运行内核,如果是空白状态,重新进入即可。运行过程中圆圈会变灰色。选中代码块后,按Ctrl+Enter即可运行,也可以点击上方的三角形按钮。按顺序依次运行即可。每个模块的核心操作都已标注清楚,仔细阅读就能理解。

至此,环境就创建完成了。

3.2 实跑知识图谱,输出HTML网页文件

一边运行一边讲解核心代码。

设置默认输入与输出目录

数据统一存放在“F:/data/03”路径下,直接使用绝对路径即可。输出目录在同一文件夹内,系统会自动创建“output”文件夹。

## 定义输入数据的路径
data_dir = "F:/data/03"
inputdirectory = Path(f"./data_input/{data_dir}")
## 定义数据输出路径
out_dir = data_dir
outputdirectory = Path(f"./data_output/{out_dir}")

加载数据与拆分文本块

使用PDF加载器,并结合LangChain的递归拆分方法,将文件夹下所有PDF拆分为文本块。每个块大小设为1500,重叠部分为150。

loader = PyPDFDirectoryLoader(r"F:/data/03")
documents = loader.load()

splitter = RecursiveCharacterTextSplitter(
chunk_size=1500,
chunk_overlap=150,
length_function=len,
is_separator_regex=False,
)

pages = splitter.split_documents(documents)
print("Number of chunks = ", len(pages))
print(pages[3].page_content)

运行后返回拆分总数。示例中拆出了8个块,数据量越多,块数越多,处理时间也会相应增加。

创建数据框,分配块ID

from helpers.df_helpers import documents2Dataframe
df = documents2Dataframe(pages)
print(df.shape)
df.head()

传给LLM,提取主体关系

将8个文本块保存为“chunks.csv”,传给LLM处理后返回“graph.csv”。

if regenerate:
concepts_list = df2Graph(df, model='zephyr:latest')
dfg1 = graph2Df(concepts_list)
if not os.path.exists(outputdirectory):
os.makedirs(outputdirectory)
dfg1.to_csv(outputdirectory/"graph.csv", sep="|", index=False)
df.to_csv(outputdirectory/"chunks.csv", sep="|", index=False)
else:
dfg1 = pd.read_csv(outputdirectory/"graph.csv", sep="|")

dfg1.replace("", np.nan, inplace=True)
dfg1.dropna(subset=["node_1", "node_2", 'edge'], inplace=True)
dfg1['count'] = 4
print(dfg1.shape)
dfg1.head()

提示词文件用于告诉LLM如何提取以及返回什么格式。如果效果不理想,可以修改提示词,或者更换模型。

计算相似度并合并数据框

同一份数据中可能包含含义相近的关系,需要先计算相似度再合并,才能准确呈现关系。

dfg = pd.concat([dfg1, dfg2], axis=0)
dfg = (dfg.groupby(["node_1", "node_2"]).agg({"chunk_id": ",".join, "edge": ','.join, 'count': 'sum'}).reset_index())
dfg

关键内容到这里就完成了。但知识图谱最重要的还是可视化——“图”本身至关重要。下一篇,我们会将这些数据转换为HTML格式,可视化为交互式网络图,并可以部署到公司内网,供所有员工使用。

```
来源:https://www.53ai.com/news/LargeLanguageModel/762.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。