AI原生应用中知识抽取的模型选择:从新手到专家的实战指南
关键词:知识抽取、AI原生应用、模型选择、信息抽取、大语言模型(LLM)、自然语言处理(NLP)、结构化知识
摘要:在AI原生应用(从设计之初就深度融合AI能力的应用)中,知识抽取是连接非结构化文本与结构化知识的"数字桥梁"。本文将用通俗易懂的语言,结合生活案例与代码实战,拆解知识抽取的核心模型类型、选择逻辑及实战技巧,帮助开发者快速掌握"如何为具体场景选对模型"的关键能力。
背景介绍
目的和范围
随着ChatGPT、文心一言等大语言模型(LLM)的普及,AI原生应用正从"能用"向"好用"跨越。但无论多智能的应用,都需要从文本(用户对话、文档、新闻等)中提取关键信息(如实体、关系、事件),这就是知识抽取的核心任务。本文聚焦"如何为AI原生应用选择合适的知识抽取模型",覆盖传统模型、深度学习模型、大语言模型的对比分析,以及实战中的选型决策树。
预期读者
- 刚入门NLP的开发者(想了解知识抽取模型的基本类型)
- AI原生应用的产品经理(想理解模型选择对功能的影响)
- 有一定经验的算法工程师(想掌握模型优化与选型的实战技巧)
文档结构概述
本文从"故事引入→核心概念→模型对比→实战选型→未来趋势"逐步展开,包含:
- 用"智能病历助手"的故事理解知识抽取的价值
- 解释知识抽取、AI原生应用、模型选择的核心概念
- 对比传统模型(CRF)、深度学习模型(BiLSTM+CRF)、预训练模型(BERT)、大语言模型(LLM)的优缺点
- 提供"任务需求-数据量-计算资源"三维度选型决策树
- 医疗问答系统的知识抽取实战(含Python代码)
术语表
核心术语定义
- 知识抽取(Knowledge Extraction):从非结构化文本(如聊天记录、文档)中提取结构化知识(如"实体-关系-属性"三元组)的过程,常见子任务:命名实体识别(NER)、关系抽取(RE)、事件抽取(EE)。
- AI原生应用(AI-Native Application):区别于"传统应用+AI模块",是从产品设计阶段就以AI能力(如自动决策、智能交互)为核心的应用,例如智能客服、医疗诊断助手。
- 大语言模型(LLM, Large Language Model):基于Transformer架构的超大规模预训练模型(如GPT-4、Llama 3),具备强大的上下文理解与生成能力。
相关概念解释
- 命名实体识别(NER):识别文本中的特定实体(如人名、地名、药品名),例如从"张三服用了阿司匹林"中提取"张三(人名)"“阿司匹林(药品名)”。
- 关系抽取(RE):确定实体间的语义关系,例如"张三→服用→阿司匹林"中的"服用"关系。
- 零样本学习(Zero-shot Learning):模型无需训练数据,仅通过提示(Prompt)完成新任务,LLM的典型能力。
核心概念与联系
故事引入:智能病历助手的"信息焦虑"
某医院开发了一款"智能病历助手",目标是自动从医生手写病历中提取关键信息(如患者姓名、诊断结果、用药记录),并生成结构化病历。开发团队最初用简单的正则表达式提取信息,但遇到了麻烦:
- 病历写法不规范(如"老张"和"张某某"指同一人)
- 隐含关系难捕捉(如"患者自述咳嗽3天,服用头孢后缓解"需提取"患者→症状→咳嗽"“患者→用药→头孢”)
- 新病种(如"诺如病毒")出现时,正则规则需要人工逐条添加
这时,团队意识到需要更智能的"知识抽取模型"——这就是我们今天要讨论的核心。
核心概念解释(像给小学生讲故事一样)
核心概念一:知识抽取——文本的"整理师"
想象你有一箱子散落的乐高零件(非结构化文本),知识抽取就像一位"乐高整理师",他会把零件分类(识别实体)、组装成小模型(提取关系),最终变成有序的乐高套装(结构化知识)。
例如,看到句子"小明昨天在人民医院接种了科兴新冠疫苗",整理师会:
- 分类零件:“小明(人名)”“人民医院(机构名)”“科兴新冠疫苗(药品名)”(NER任务)
- 组装模型:“小明→接种地点→人民医院”“小明→接种疫苗→科兴新冠疫苗”(RE任务)
核心概念二:AI原生应用——天生依赖"整理师"的"智能房子"
传统应用像普通房子,先建好框架(功能模块),再后期装修(加AI功能);AI原生应用像"智能房子",从设计图纸开始就考虑:“这里需要整理师(知识抽取)接收外部信息,那里需要决策引擎(模型推理)处理信息”。
例如,智能客服的对话流程设计中,第一步就是用知识抽取模型提取用户需求(如"我要退订单12345"中的"订单号:12345"“意图:退单”),后续才能触发退单流程。
核心概念三:模型选择——给"整理师"选趁手的工具
知识抽取模型就像整理师的工具包,不同工具有不同的适用场景:
- 小剪刀(传统模型):适合剪简单的纸条(短文本、固定模式),但遇到复杂图案(长文本、隐含关系)就吃力。
- 电动雕刻刀(深度学习模型):能处理复杂图案,但需要插电(大量标注数据),携带不便(计算资源需求高)。
- 智能机器人(大语言模型):能看懂说明书(提示词),自动完成复杂任务,但可能"用力过猛"(生成错误信息),且成本高(按调用次数收费)。
核心概念之间的关系(用小学生能理解的比喻)
知识抽取是AI原生应用的"信息入口",模型选择决定了这个入口的"宽度"和"精度":
- 知识抽取×AI原生应用:就像快递站和网购平台——网购平台(AI应用)需要快递站(知识抽取)准确接收包裹(文本信息),才能完成后续配送(功能实现)。
- 模型选择×知识抽取:就像选快递员——送文件(简单任务)用普通快递员(传统模型),送易碎品(复杂任务)用经验丰富的高级快递员(LLM)。
- AI原生应用×模型选择:就像盖房子选建材——建茅草屋(简单应用)用木头(轻量级模型),建摩天大楼(复杂应用)用钢筋(大模型)。
核心概念原理和架构的文本示意图
知识抽取在AI原生应用中的典型流程:
非结构化文本(如用户对话、文档)→ 知识抽取模型(NER/RE/EE)→ 结构化知识(实体-关系三元组)→ AI原生应用(如智能决策、对话生成)
Mermaid 流程图
核心算法原理 & 具体操作步骤
知识抽取模型主要分为四类,我们逐一拆解其原理、优缺点及适用场景:
1. 传统统计学习模型(以CRF为例)
原理:条件随机场(CRF)是一种概率图模型,通过标注数据学习"上下文特征"的权重(如"前一个词是’患者’,当前词可能是’姓名’“),最终输出概率最高的标注序列。
生活类比:像老编辑校对报纸——通过多年经验记住"看到’先生’前大概率是人名”,“看到’医院’前大概率是地名”。
Python代码示例(NER任务):
from sklearn_crfsuite import CRF
from sklearn_crfsuite.metrics import flat_f1_score
# 特征工程:为每个词提取上下文特征(如前一个词、后一个词、是否大写)
def word2features(sent, i):
word = sent[i][0]
features = {
'bias': 1.0,
'word.lower()': word.lower(),
'word[-3:]': word[-3:],
'word.isupper()': word.isupper(),
'word.istitle()': word.istitle(),
'word.isdigit()': word.isdigit(),
}
if i > 0:
features.update({'-1:word.lower()': sent[i-1][0].lower()})
return features
# 训练数据(样本:[(词,标签)])
train_sents = [
[("小明", "PER"), ("在", "O"), ("人民医院", "ORG"), ("接种", "O"), ("疫苗", "MED")],
[("张三", "PER"), ("服用", "O"), ("阿司匹林", "MED")]
]
X_train = [ [word2features(s, i) for i in range(len(s))] for s in train_sents ]
y_train = [ [word[1] for word in s] for s in train_sents ]
# 训练CRF模型
crf = CRF(algorithm='lbfgs', c1=0.1, c2=0.1, max_iterations=100)
crf.fit(X_train, y_train)
# 预测新句子
test_sent = [("小红", "O"), ("在", "O"), ("协和医院", "O"), ("注射", "O"), ("青霉素", "O")]
X_test = [word2features(test_sent, i) for i in range(len(test_sent))]
pred_labels = crf.predict([X_test])
print(pred_labels) # 输出:[['PER', 'O', 'ORG', 'O', 'MED']]
优缺点:
✅ 优点:模型简单,计算资源需求低,适合小数据场景(标注数据<1000条)。
❌ 缺点:依赖人工特征工程(需要手动设计"前一个词"等特征),对长距离依赖(如跨句实体)捕捉能力弱。
适用场景:垂类短文本(如发票信息抽取、固定格式表格解析)。
2. 深度学习模型(以BiLSTM+CRF为例)
原理:双向长短期记忆网络(BiLSTM)能捕捉上下文的长距离依赖(如"前10个词"对当前词的影响),再结合CRF的序列标注优势,是经典的"深度学习+传统模型"组合。
生活类比:像智能翻译机——不仅能记住当前词,还能"回忆"前面说过的内容(前向LSTM)和"预测"后面要说的内容(后向LSTM),最后用CRF调整整体流畅度。
Python代码示例(基于PyTorch):
import torch
import torch.nn as nn
from torchcrf import CRF # 需安装torchcrf库
class BiLSTM_CRF(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim, num_tags):
super(BiLSTM_CRF, self).__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2, bidirectional=True, batch_first=True)
self.hidden2tag = nn.Linear(hidden_dim, num_tags) # 映射到标签空间
self.crf = CRF(num_tags, batch_first=True) # CRF层
def forward(self, x, tags=None):
x = self.embedding(x) # 词嵌入 [batch, seq_len, embedding_dim]
x, _ = self.lstm(x) # BiLSTM输出 [batch, seq_len, hidden_dim]
emissions = self.hidden2tag(x) # 发射概率 [batch, seq_len, num_tags]
if tags is not None:
return -self.crf(emissions, tags) # 训练时返回负对数似然(损失函数)
else:
return self.crf.decode(emissions) # 推理时返回最优标签序列
# 示例参数
vocab_size = 1000 # 词汇表大小
embedding_dim = 128
hidden_dim = 256
num_tags = 5 # 标签数(如PER, ORG, MED, O等)
model = BiLSTM_CRF(vocab_size, embedding_dim, hidden_dim, num_tags)
优缺点:
✅ 优点:无需人工特征工程,能捕捉长距离依赖,在中等数据量(1000-10万条)下效果优于CRF。
❌ 缺点:需要标注数据训练,对低资源场景(如小语种、新领域)不友好;模型复杂度高于CRF,推理速度较慢。
适用场景:通用领域的长文本(如新闻、论文摘要)的实体识别。
3. 预训练模型(以BERT+CRF为例)
原理:BERT(基于Transformer的双向编码器)通过大规模无监督预训练(如预测句子中缺失的词)学习通用语言表征,再在具体任务(如NER)上微调,解决了传统模型"依赖标注数据"的痛点。
生活类比:像学霸转学——先在重点学校(预训练阶段)学通用知识,转学到新学校(微调阶段)后,快速适应新班级(具体任务)的学习要求。
Python代码示例(基于Hugging Face):
from transformers import BertTokenizer, BertForTokenClassification
import torch
# 加载预训练模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForTokenClassification.from_pretrained('bert-base-chinese', num_labels=5) # 5个标签
# 输入文本
text = "小明在人民医院接种了科兴新冠疫苗"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
# 推理
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits # 输出概率 [1, seq_len, num_tags]
predicted_tags = torch.argmax(logits, dim=2).squeeze().tolist()
# 映射标签ID到标签名(如0:O, 1:PER, 2:ORG, 3:MED)
id2tag = {0: 'O', 1: 'PER', 2: 'ORG', 3: 'MED'}
predicted_tags = [id2tag[tag_id] for tag_id in predicted_tags]
print(predicted_tags) # 输出:['PER', 'O', 'ORG', 'O', 'O', 'MED']
优缺点:
✅ 优点:利用大规模无监督数据预训练,对低资源场景友好;无需手动设计特征,泛化能力强。
❌ 缺点:模型参数量大(BERT-base约1.1亿参数),推理延迟高;微调需要一定计算资源(GPU)。
适用场景:跨领域知识抽取(如从新闻、医疗、法律文本中提取实体)。
4. 大语言模型(以GPT-4为例)
原理:LLM(如GPT-4)通过万亿级 tokens 的预训练,具备强大的上下文理解与生成能力。知识抽取可通过"提示词(Prompt)“实现,无需微调,例如:“请从以下文本中提取人名、机构名、药品名,格式为JSON:{文本}”。
生活类比:像万能翻译官——不需要提前培训,只需要告诉他"按这个格式翻译”,就能处理各种语言(领域)的文本。
Python代码示例(调用OpenAI API):
import openai
openai.api_key = "YOUR_API_KEY"
def llm_knowledge_extraction(text):
prompt = f"""
任务:从以下文本中提取人名、机构名、药品名,输出JSON格式。
示例:文本"小明在人民医院接种了科兴新冠疫苗" → 输出{{"人名":["小明"],"机构名":["人民医院"],"药品名":["科兴新冠疫苗"]}}
现在处理文本:"{text}",输出严格遵循示例格式。
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
# 测试
text = "张三在协和医院服用了阿司匹林和布洛芬"
print(llm_knowledge_extraction(text))
# 输出:{"人名":["张三"],"机构名":["协和医院"],"药品名":["阿司匹林","布洛芬"]}
优缺点:
✅ 优点:零样本/少样本学习(无需标注数据),支持复杂关系抽取(如事件、因果关系),跨领域泛化能力强。
❌ 缺点:成本高(按token计费),推理延迟受API调用限制;存在"幻觉问题"(生成错误信息),需要校验机制。
适用场景:需要快速迭代的新领域(如新兴科技报道)、复杂关系抽取(如法律文本中的责任主体)。
数学模型和公式 & 详细讲解 & 举例说明
1. CRF的概率模型
CRF的核心是计算给定输入序列 ( X = {x_1, x_2, …, x_n} ) 时,输出标签序列 ( Y = {y_1, y_2, …, y_n} ) 的条件概率:
P
(
Y
∣
X
)
=
1
Z
(
X
)
exp
(
∑
i
=
1
n
∑
k
λ
k
t
k
(
y
i
−
1
,
y
i
,
X
,
i
)
+
∑
i
=
1
n
∑
l
μ
l
s
l
(
y
i
,
X
,
i
)
)
P(Y|X) = \frac{1}{Z(X)} \exp\left( \sum_{i=1}^n \sum_k \lambda_k t_k(y_{i-1}, y_i, X, i) + \sum_{i=1}^n \sum_l \mu_l s_l(y_i, X, i) \right)
P(Y∣X)=Z(X)1exp(i=1∑nk∑λktk(yi−1,yi,X,i)+i=1∑nl∑μlsl(yi,X,i))
其中:
- ( t_k ) 是转移特征(如"前一个标签是PER,当前标签是ORG的概率")
- ( s_l ) 是状态特征(如"当前词是’医院’,标签是ORG的概率")
- ( Z(X) ) 是归一化因子(确保概率和为1)
举例:在"小明在人民医院"中,CRF会计算"前一个词是’在’(标签O),当前词是’人民医院’(标签ORG)"的转移特征权重,结合"人民医院"本身是机构名的状态特征权重,最终输出标签序列。
2. BiLSTM的隐藏状态计算
BiLSTM通过前向(( \overrightarrow{h} ))和后向(( \overleftarrow{h} ))LSTM分别计算上下文信息,最终隐藏状态 ( h_i ) 是两者的拼接:
h
→
i
=
LSTM
forward
(
x
i
,
h
→
i
−
1
)
\overrightarrow{h}_i = \text{LSTM}_{\text{forward}}(x_i, \overrightarrow{h}_{i-1})
hi=LSTMforward(xi,hi−1)
h
←
i
=
LSTM
backward
(
x
i
,
h
←
i
+
1
)
\overleftarrow{h}_i = \text{LSTM}_{\text{backward}}(x_i, \overleftarrow{h}_{i+1})
hi=LSTMbackward(xi,hi+1)
h
i
=
[
h
→
i
;
h
←
i
]
h_i = [\overrightarrow{h}_i; \overleftarrow{h}_i]
hi=[hi;hi]
举例:在处理句子"患者咳嗽3天,服用头孢"时,前向LSTM会记住"患者→咳嗽",后向LSTM会记住"头孢←服用",拼接后的隐藏状态能同时捕捉前后文信息,帮助判断"头孢"是药品名。
3. BERT的自注意力机制
BERT的核心是自注意力(Self-Attention),计算每个词与其他词的关联度(注意力分数),公式为:
Attention
(
Q
,
K
,
V
)
=
softmax
(
Q
K
T
d
k
)
V
\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right) V
Attention(Q,K,V)=softmax(dkQKT)V
其中:
- ( Q, K, V ) 是词嵌入的查询、键、值矩阵(通过线性变换得到)
- ( d_k ) 是键的维度(防止梯度消失)
举例:在句子"阿司匹林是一种常用的退烧药物"中,"阿司匹林"的查询向量会与"药物"的键向量计算高注意力分数,从而学习到"阿司匹林→药物"的关联。
4. LLM的自回归生成
LLM(如GPT)通过自回归方式生成下一个token,概率模型为:
P
(
y
t
∣
y
1
,
.
.
.
,
y
t
−
1
,
X
)
=
softmax
(
W
h
h
t
+
b
)
P(y_t | y_1, ..., y_{t-1}, X) = \text{softmax}(W_h h_t + b)
P(yt∣y1,...,yt−1,X)=softmax(Whht+b)
其中 ( h_t ) 是Transformer解码器的隐藏状态,( W_h ) 和 ( b ) 是线性层参数。
举例:当输入提示"提取药品名:张三服用了阿司匹林和布洛芬",LLM会逐词生成"阿司匹林"“布洛芬”,基于预训练中学习的"服用→药品名"模式。
项目实战:医疗问答系统的知识抽取
场景需求
某医疗科技公司要开发"智能用药助手",需要从用户对话中提取:
- 实体:患者姓名(PER)、药品名(MED)、症状(SYM)
- 关系:患者→服用→药品、患者→出现→症状
开发环境搭建
- 硬件:NVIDIA A100 GPU(用于BERT微调和LLM本地部署)
- 软件:Python 3.9、PyTorch 2.0、Hugging Face Transformers 4.35、OpenAI API(用于LLM测试)
- 数据:5000条标注的医疗对话数据(如"患者李红自述咳嗽,服用了阿莫西林")
源代码详细实现和代码解读
方案1:BERT微调(适合中高精度、中等数据量)
from transformers import BertTokenizer, BertForTokenClassification, TrainingArguments, Trainer
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据(示例数据格式:文本、标签序列)
data = pd.read_csv("medical_ner_data.csv")
texts = data["text"].tolist()
tags = data["tags"].apply(eval).tolist() # 标签序列如[1,0,2,3](对应PER,O,SYM,MED)
# 分词与编码
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
encoded_inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# 处理标签(对齐token与标签)
def align_tags(tags, word_ids):
aligned_tags = []
for word_id in word_ids:
if word_id is None: # 特殊token([CLS],[SEP])标签设为-100(忽略)
aligned_tags.append(-100)
else:
aligned_tags.append(tags[word_id])
return aligned_tags
labels = []
for i in range(len(texts)):
word_ids = encoded_inputs.word_ids(batch_index=i)
aligned = align_tags(tags[i], word_ids)
labels.append(aligned)
encoded_inputs["labels"] = torch.tensor(labels)
# 划分训练集和验证集
train_inputs, val_inputs, train_labels, val_labels = train_test_split(
encoded_inputs, labels, test_size=0.2
)
# 加载模型
model = BertForTokenClassification.from_pretrained('bert-base-chinese', num_labels=4) # 4个标签(O,PER,SYM,MED)
# 训练参数
training_args = TrainingArguments(
output_dir="./medical_ner",
evaluation_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=3,
weight_decay=0.01,
)
# 训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_inputs,
eval_dataset=val_inputs,
)
trainer.train()
# 推理示例
text = "患者王芳出现发热症状,服用了对乙酰氨基酚"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
pred_tags = torch.argmax(outputs.logits, dim=2).squeeze().tolist()
print("预测标签:", [id2tag[tag] for tag in pred_tags if tag != -100])
# 输出:预测标签: ['O', 'PER', 'O', 'SYM', 'O', 'O', 'MED']
方案2:GPT-4提示词(适合快速迭代、新症状/药品)
def medical_knowledge_extraction(text):
prompt = f"""
任务:从以下医疗对话中提取:
- 患者姓名(PER)
- 症状(SYM)
- 药品名(MED)
- 关系:患者→服用→药品,患者→出现→症状
输出格式:{{"PER": [...], "SYM": [...], "MED": [...], "关系": [{{"主体":"患者姓名","谓词":"服用","客体":"药品名"}}, ...]}}
示例:
输入:"患者李红自述咳嗽,服用了阿莫西林"
输出:{{"PER": ["李红"], "SYM": ["咳嗽"], "MED": ["阿莫西林"], "关系": [{{"主体":"李红","谓词":"服用","客体":"阿莫西林"}}, {{"主体":"李红","谓词":"出现","客体":"咳嗽"}}]}}
现在处理输入:"{text}",输出严格遵循示例格式。
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0 # 确保输出确定性
)
return response.choices[0].message.content
# 测试
text = "患者王芳出现发热症状,服用了对乙酰氨基酚"
print(medical_knowledge_extraction(text))
# 输出:{"PER": ["王芳"], "SYM": ["发热"], "MED": ["对乙酰氨基酚"], "关系": [{"主体":"王芳","谓词":"服用","客体":"对乙酰氨基酚"}, {"主体":"王芳","谓词":"出现","客体":"发热"}]}
代码解读与分析
- BERT微调:通过医疗数据微调预训练模型,适合需要高精度且已有一定标注数据的场景(如公司已有历史病历数据)。优点是推理成本低(本地部署),缺点是需要3-5天训练时间。
- GPT-4提示词:无需标注数据,适合快速验证新功能(如支持新冠相关症状"咽干""乏力"的抽取)。优点是开发周期短(1天内上线),缺点是长期使用成本高(假设每天处理1万条对话,月成本约$500)。
实际应用场景
场景 | 典型任务 | 推荐模型 | 原因 |
---|---|---|---|
智能客服(电商) | 提取订单号、退货原因 | 传统模型(CRF) | 短文本、固定模式,无需复杂推理 |
医疗诊断助手 | 提取症状、药品、手术名 | BERT微调 | 需要高精度,且医疗数据(如病历)已有一定标注 |
法律文书分析 | 提取责任主体、时间、条款 | LLM(如GPT-4) | 长文本、隐含关系多,LLM的上下文理解能力更优 |
新闻事件追踪 | 提取事件主体、时间、地点 | LLM(零样本) | 新闻领域变化快,LLM无需重新训练即可适应新事件类型 |
低资源语言(如斯瓦希里语) | 提取实体、关系 | 轻量级预训练模型(如XLM-RoBERTa) | 低资源语言标注数据少,预训练模型利用多语言数据提升泛化能力 |
工具和资源推荐
模型库
- Hugging Face Transformers:集成BERT、RoBERTa等预训练模型,支持快速微调(官网)。
- spaCy:工业级NLP库,内置高效的NER、RE模型(官网)。
- AllenNLP:提供CRF、BiLSTM+CRF等经典模型的实现(官网)。
LLM平台
- OpenAI API:GPT-3.5/4,适合快速实验(官网)。
- Anthropic Claude 3:支持长文本(10万token),适合法律、医疗等长文档抽取(官网)。
- 本地LLM:Llama 3、Baichuan 3(通过 llama.cpp 部署),适合对数据隐私要求高的场景。
数据标注工具
未来发展趋势与挑战
趋势1:多模态知识抽取
未来AI原生应用将不再局限于文本,还需从图片(如处方单)、语音(如医患对话录音)中提取知识。例如,结合OCR(图片转文本)和LLM(文本抽取),实现"拍照上传处方单→自动提取药品名、剂量"。
趋势2:小样本/零样本学习普及
随着LLM能力提升,“无需标注数据,仅通过提示词定义任务"将成为主流。例如,新上市的药品无需重新训练模型,只需在提示词中说明"新药名以’新冠’开头”,LLM即可自动识别。
挑战1:模型可靠性与可解释性
LLM的"幻觉问题"(生成错误知识)在医疗、法律等关键领域可能导致严重后果。未来需要研究"知识校验机制"(如通过知识库验证抽取结果)和"可解释性技术"(如展示模型决策的关键依据)。
挑战2:模型轻量化与实时性
AI原生应用(如智能车载助手)需要低延迟(<200ms)的知识抽取。如何将大模型压缩(如量化、蒸馏)为轻量级模型(如BERT-Tiny),同时保持精度,是重要研究方向。
总结:学到了什么?
核心概念回顾
- 知识抽取:从非结构化文本中提取结构化知识的过程,包括NER、RE、EE等子任务。
- AI原生应用:从设计之初就依赖AI能力的应用,知识抽取是其"信息入口"。
- 模型选择:需结合任务需求(精度/速度)、数据量(标注/无标注)、计算资源(本地/GPU/API)综合决策。
概念关系回顾
- 传统模型(CRF)→ 深度学习模型(BiLSTM+CRF)→ 预训练模型(BERT)→ 大语言模型(LLM):模型复杂度递增,对数据量的依赖递减,适用场景从"固定模式"到"复杂关系"。
- 模型选择是"需求-数据-资源"的平衡:小数据/固定模式选CRF,中等数据/通用场景选BERT,无数据/复杂关系选LLM。
思考题:动动小脑筋
- 如果你要开发一个"社交媒体舆情监控系统",需要从用户评论中提取品牌名(如"华为"“苹果”)和情感倾向(如"好评"“差评”),你会选择哪种知识抽取模型?为什么?
- 大语言模型在知识抽取中可能生成错误信息(如把"布洛芬"误标为"抗生素"),你有哪些方法可以验证抽取结果的正确性?
- 在低资源场景(如仅有100条标注的医疗对话数据),如何选择知识抽取模型?是否可以结合多种模型(如CRF+BERT)?
附录:常见问题与解答
Q:传统模型(如CRF)现在还能用吗?
A:能用!在垂类短文本(如快递单、发票)场景中,CRF的精度可能接近甚至超过深度学习模型,且推理速度快(CPU即可运行),适合资源受限的小型应用。
Q:LLM做知识抽取需要注意什么?
A:① 设计清晰的提示词(示例+格式要求),减少幻觉;② 对关键领域(如医疗)增加校验步骤(如通过药品知识库验证药品名);③ 计算成本(LLM按token计费,长文本需截断)。
Q:如何评估知识抽取模型的效果?
A:常用指标:
- 精确率(Precision):正确抽取的实体数 / 模型抽取的实体总数
- 召回率(Recall):正确抽取的实体数 / 实际存在的实体总数
- F1分数:2×(P×R)/(P+R)(综合P和R的指标)
扩展阅读 & 参考资料
- 论文:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》(BERT原论文)
- 书籍:《自然语言处理入门》(何晗 著,适合NLP新手)
- 博客:Hugging Face官方文档(https://huggingface.co/docs)
- 工具:LLM提示词工程指南(https://www.promptingguide.ai/)