大模型应用:关系抽取的分析和实践
1 前言
关系抽取是自然语言处理中知识图谱构建的核心任务,目标是从非结构化文本中识别实体以及实体之间的语义关系,输出(头实体,关系,尾实体)结构化三元组,广泛用于知识库构建、舆情分析、智能问答、文档信息挖掘等场景。
传统关系抽取依赖复杂的特征工程,泛化能力有限;大模型凭借强大的语义理解能力,可以通过指令微调、提示词工程快速适配关系抽取任务。本文基于昇思 MindSpore 框架 + 昇腾 NPU 算力,完整讲解大模型做关系抽取的落地实践,包含任务介绍、环境准备、数据集处理、模型微调、推理验证、部署落地全流程,帮助开发者快速复现业务场景下的关系抽取能力。
2 任务背景与应用价值
2.1 什么是关系抽取
给定一段自然语句,模型识别出文本中的实体,并判断两两实体之间的关系类型。
示例输入:华为总部坐落于广东省深圳市
输出三元组:(华为,总部所在地,广东省深圳市)
分为两大技术路线:
1. 流水线方案:先实体识别,再做关系分类;
2. 联合抽取方案:实体、关系同步预测,减少误差传递,是大模型主流实践方案。
2.2 业务价值
● 知识图谱:从海量网页、文档、财报、病历文本自动构建知识三元组;
● RAG 知识库:把文档抽取结构化关系,增强检索问答的准确性;
● 行业场景:法律文书要素抽取、医疗实体关系挖掘、金融公告事件关系解析。
2.3 昇思 MindSpore 优势
昇思 MindSpore 具备自动并行、动静统一、全场景部署能力,深度适配昇腾 AI 处理器,支持大模型 LoRA 微调、全参数微调,训练阶段充分发挥 NPU 算力;训练完成后可以导出 MindIR,完成端边云多端推理部署,降低关系抽取大模型落地门槛。
3 实验环境准备
本次实践基于昇腾 910 NPU,完整软硬件环境配置如下:
|
组件 |
版本 |
|
硬件 |
Ascend 910 NPU(32GB) |
|
CANN |
7.0.RC1 |
|
MindSpore |
2.5.0 |
|
Python | 3.9 |
|
依赖库 |
datasets、transformers、peft、gradio |
环境快速安装参考:
# 安装昇思MindSpore NPU版本
pip install mindspore==2.5.0 -f https://www.mindspore.cn/whl
pip install datasets transformers peft gradio
4 数据集构建与处理
4.1 数据集选择
选用中文公开关系抽取数据集,也可以替换为企业自有领域数据。
● 通用领域:DuIE2.0(中文关系抽取标准数据集,包含 50 种关系类型)
● 领域场景:可构造自定义指令数据集,格式为指令微调格式。
4.2 大模型指令样本格式
采用指令微调范式,每一条样本构造如下:
{
"instruction": "请从文本中抽取实体关系三元组,输出(头实体,关系,尾实体)",
"input": "华为总部坐落于广东省深圳市",
"output": "(华为,总部所在地,广东省深圳市)"
}
4.3 数据预处理核心逻辑
1. 读取原始数据集,转换为指令微调样本;
2. 使用 tokenizer 对instruction+input做文本编码;
3. 对 output 标签做编码,设置 loss mask,只计算输出部分损失;
4. 划分训练集、验证集,封装 MindSpore Dataset 迭代器。
提示:私有业务数据,需要做好数据清洗,过滤噪声文本,保证关系标签统一。
5 基于昇思实现大模型 LoRA 微调
直接全参数微调大模型占用显存高,实践中优先采用 LoRA 低秩微调,仅训练少量适配器参数,在昇腾 NPU 上即可完成训练。
5.1 模型加载
加载支持 MindSpore 后端的开源中文大模型基座(如 Qwen 系列),开启梯度检查点降低显存占用。
from mindformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained("qwen-7b")
tokenizer = AutoTokenizer.from_pretrained("qwen-7b")
5.2 LoRA 配置
配置 LoRA 参数,仅对 Attention 层增加低秩矩阵,冻结基座主干权重。
from peft import LoraConfig
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj","v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
5.3 训练流程
● 优化器:AdamWeightDecay;学习率设置2e-4;
● 训练轮次 epoch=3,设置梯度累积,适配单卡显存;
● 每轮结束在验证集评估 F1 指标(关系抽取核心评价指标:精确率 P、召回率 R、F1);
● 训练结束保存 LoRA 权重。
昇思 MindSpore 可以开启 NPU 混合精度,进一步加速训练。
6 推理测试
训练完成后,合并 LoRA 权重,执行关系抽取推理。
示例推理代码片段:
prompt = """请从文本中抽取实体关系三元组,输出(头实体,关系,尾实体)
输入文本:阿里巴巴成立于1999年,总部位于杭州。
输出:"""
inputs = tokenizer(prompt, return_tensors="ms")
output = model.generate(**inputs, max_length=128)
print(tokenizer.decode(output[0], skip_special_tokens=True))
输出示例结果:
(阿里巴巴,成立时间,1999年)、(阿里巴巴,总部所在地,杭州)
效果调优小技巧
1. 如果抽取结果存在幻觉,可以增加 Few‑shot 示例到 prompt;
2. 领域数据不足,优先做提示词工程,再做微调;
3. 评估重点关注:关系类型漏检、实体边界错误、生成虚假三元组。
7 Gradio 可视化演示
基于 gradio 快速搭建简易 web 界面,输入文本直接输出关系三元组,方便业务人员快速测试效果。
import gradio as gr
def predict(text):
prompt = f"请从文本中抽取实体关系三元组,输出(头实体,关系,尾实体)\n输入文本:{text}\n输出:"
inputs = tokenizer(prompt, return_tensors="ms")
out = model.generate(**inputs,max_length=200)
return tokenizer.decode(out[0],skip_special_tokens=True)
demo = gr.Interface(fn=predict,inputs="text",outputs="text")
demo.launch()
8 模型导出与部署
训练完成后,导出 MindIR 格式模型,使用 MindIE 推理服务,实现高并发线上关系抽取服务:
1. 将微调后模型导出 MindIR;
2. 通过 MindIE 拉起推理服务,对外提供 HTTP 接口;
3. 业务系统调用接口,传入待抽取文本,获取结构化三元组结果,对接知识图谱数据库。
9 总结与拓展
本篇实践完整演示了基于昇思 MindSpore 与昇腾算力,使用大模型完成关系抽取任务,从数据集准备、LoRA 微调、推理验证,到 Web 演示和线上部署完整链路。
拓展方向:
1. 支持文档长文本关系抽取,结合滑动窗口解决超长文本;
2. 支持重叠实体、嵌套实体的复杂联合关系抽取;
3. 结合 RAG 系统,将抽取出来的三元组存入图数据库,构建行业知识库。
更多推荐




所有评论(0)