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 系统,将抽取出来的三元组存入图数据库,构建行业知识库。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐