自动模型方式 - 阅读理解任务
1 课程概览
本课讲解自动模型方式进行阅读理解。与之前类似,但加载模型时使用 AutoModelForQuestionAnswering。不同的模型加载方式可能不同。如果代码和模型都一样但报错,可以降版本改环境,或换一个模型。上下文不要写空格,会影响模型定位,可换成标点符号。使用 for 循环逐个问题进行问答推理。
2 核心概念与定义
- 阅读理解(Question Answering):抽取式问答,输入文本和问题,输出答案。
- AutoModelForQuestionAnswering:专门加载阅读理解模型的类。
- 逐个问题推理:使用 for 循环逐个问题进行问答。
3 模型与算法详解
模型加载
使用
AutoModelForQuestionAnswering加载模型。
my_model = AutoModelForQuestionAnswering.from_pretrained(model_name)
报错解决
代码和模型都一样但报错的两种解决方式。
| 方式 | 说明 |
|---|---|
| 降版本改环境 | 降低 transformers 或系统版本 |
| 换模型 | 在 HuggingFace 上找其他模型 |
上下文细节
上下文不要写空格,会影响模型定位。
- ❌
我叫张三 我是一个程序员(有空格) - ✅
我叫张三,我是一个程序员(用标点符号)
原因:空格会被删除,影响模型定位。
逐个问题推理
使用 for 循环逐个问题进行问答推理。
for question in questions:
# 处理每个问题
...
阅读理解流程
0. 定义变量记录模型名
1. 加载 Tokenizer(分词器)
2. 加载模型(AutoModelForQuestionAnswering)
3. 准备文本(context + questions)
4. 逐个问题进行问答推理(for 循环)
5. 输出结果
模型选择
使用 Chinese Pretrain MRC RoBERTa 模型。
| 任务 | 模型 |
|---|---|
| 阅读理解 | chinese-pretrain-mrc-roberta |
4 数学原理与推导
阅读理解
$$\text{start}, \text{end} = \text{model}(\text{context}, \text{question})$$
$$\text{answer} = \text{context}[\text{start}:\text{end}]$$
其中:
- $\text{context}$ 是上下文
- $\text{question}$ 是问题
- $\text{start}, \text{end}$ 是答案的起止位置
文本转张量
$$\text{input} = \text{tokenizer}.\text{encode_plus}(\text{question}, \text{context}, \text{return_tensors}='pt')$$
5 代码示例
import torch
from transformers import AutoModelForQuestionAnswering, AutoTokenizer
def dm04_question_answering():
"""自动模型方式:阅读理解"""
# 0. 定义变量记录模型名
model_name = "C:/software/softwallg/pretrained_model/chinese-pretrain-mrc-roberta"
# 1. 加载 Tokenizer(分词器)
my_tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. 加载模型(使用 AutoModelForQuestionAnswering)
my_model = AutoModelForQuestionAnswering.from_pretrained(model_name)
# 3. 准备文本(上下文不要写空格,用标点符号)
context = "我叫张三,我是一个程序员,我的喜好是乒乓球"
questions = [
"我是谁?",
"我是做什么的?",
"我的爱好是什么?"
]
# 4. 逐个问题进行问答推理(for 循环)
my_model.eval()
for question in questions:
# 4.1 将问题转成模型可接收的输入格式
inputs = my_tokenizer.encode_plus(
question, # 当前问题
context, # 包含答案的上下文文本
return_tensors='pt' # 返回二维张量
)
print(f"问题: {question}")
print(f"输入: {inputs}")
# 4.2 送给模型预测
with torch.no_grad():
output = my_model(**inputs)
# 4.3 获取答案
start_logits = output.start_logits
end_logits = output.end_logits
start_idx = torch.argmax(start_logits)
end_idx = torch.argmax(end_logits)
# 4.4 将 id 转成文本
input_ids = inputs['input_ids'][0]
answer = my_tokenizer.convert_ids_to_tokens(input_ids[start_idx:end_idx+1])
print(f"答案: {''.join(answer)}")
print("-" * 50)
return my_model
# 测试
if __name__ == "__main__":
print("=== 自动模型方式:阅读理解 ===")
model = dm04_question_answering()
代码说明
| 代码 | 说明 |
|---|---|
AutoModelForQuestionAnswering.from_pretrained() | 加载阅读理解模型 |
encode_plus(question, context, ...) | 问题+上下文转张量 |
my_model(**inputs) | 送给模型预测 |
output.start_logits | 起始位置 logits |
output.end_logits | 结束位置 logits |
torch.argmax() | 取最大值索引 |
convert_ids_to_tokens() | 将 id 转成文本 |
6 重难点与易错提醒
- ❗重点:使用
AutoModelForQuestionAnswering加载模型。 - ❗重点:上下文不要写空格,会影响模型定位,用标点符号。
- ❗重点:使用 for 循环逐个问题进行问答推理。
- ⚠️易错:代码和模型都一样但报错,可降版本改环境或换模型。
- 💡技巧:在 HuggingFace 网页上先测试模型,再下载到本地。
7 课堂问答精选
Q1:阅读理解使用什么类加载模型?
A:使用 AutoModelForQuestionAnswering 加载模型。
Q2:上下文为什么不能写空格?
A:空格会被删除,会影响模型定位。可换成标点符号。
Q3:如何处理多个问题?
A:使用 for 循环逐个问题进行问答推理,基于上下文回答每个问题。
Q4:代码和模型都一样但报错怎么办?
A:两种方式:①降版本改环境;②在 HuggingFace 上换一个模型。
8 本课小结
- 阅读理解:抽取式问答。
- 使用
AutoModelForQuestionAnswering加载模型。 - 上下文不要写空格,用标点符号。
- 使用 for 循环逐个问题进行问答推理。
- 报错解决:降版本改环境或换模型。
9 延伸思考
- 自动模型方式如何进行文本摘要?
- 文本摘要使用什么类加载模型?