library_name: transformers
base_model: bert-base-chinese
tags:
- generated_from_trainer
datasets:
- real-jiakai/chinese-squadv2
model-index:
- name: chinese_squadv2
results: []
基于bert-base-chinese的SQuADv2微调模型
该模型是在中文版SQuAD v2.0数据集上对bert-base-chinese进行微调的版本。
模型描述
本模型专为中文问答任务设计,特别适用于需要从给定上下文段落中提取答案的场景。遵循SQuAD v2.0格式,可同时处理可回答与不可回答问题。
核心特性:
- 基于BERT-base中文架构
- 支持可回答与不可回答问题
- 使用中文问答对训练
- 针对抽取式问答优化
使用场景与限制
适用场景
- 中文抽取式问答系统
- 阅读理解任务
- 中文文本信息提取
- 自动化问答系统
已知局限
- 不可回答问题准确率(76.65%)显著高于可回答问题(36.41%)
- 仅限抽取式问答(无法生成新答案)
- 对训练数据外的专业领域问题表现欠佳
- 针对现代汉语设计,对文言文或方言变体效果有限
训练与评估数据
使用中文SQuAD v2.0数据集训练,包含:
训练集:
- 总样本:90,027条
- 可回答问题:46,529条
- 不可回答问题:43,498条
验证集:
- 总样本:9,936条
- 可回答问题:3,991条
- 不可回答问题:5,945条
训练过程
超参数设置
- 学习率:3e-05
- 批大小:12
- 评估批大小:8
- 训练轮次:5
- 优化器:AdamW (β1=0.9, β2=0.999, ε=1e-08)
- 学习率调度器:线性衰减
- 最大序列长度:384
- 文档滑动步长:128
- 训练设备:支持CUDA的GPU
训练结果
最终评估指标:
- 整体精确匹配率:60.49%
- 整体F1分数:60.54%
- 可回答问题:
- 不可回答问题:
框架版本
- Transformers: 4.47.0.dev0
- PyTorch: 2.5.1+cu124
- Datasets: 3.1.0
- Tokenizers: 0.20.3
使用示例
from transformers import AutoModelForQuestionAnswering, AutoTokenizer
import torch
model_name = "real-jiakai/bert-base-chinese-finetuned-squadv2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForQuestionAnswering.from_pretrained(model_name)
def get_answer(question, context, threshold=0.0):
inputs = tokenizer(
question,
context,
return_tensors="pt",
max_length=384,
truncation=True
)
with torch.no_grad():
outputs = model(**inputs)
start_logits = outputs.start_logits[0]
end_logits = outputs.end_logits[0]
null_score = start_logits[0].item() + end_logits[0].item()
start_logits[0] = float('-inf')
end_logits[0] = float('-inf')
start_idx = torch.argmax(start_logits)
end_idx = torch.argmax(end_logits)
if end_idx < start_idx:
end_idx = start_idx
answer_score = start_logits[start_idx].item() + end_logits[end_idx].item()
if null_score - answer_score > threshold:
return "根据给定上下文无法回答问题"
tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
answer = tokenizer.convert_tokens_to_string(tokens[start_idx:end_idx+1])
if not answer.strip() or answer.strip() in ['[CLS]', '[SEP]']:
return "根据给定上下文无法回答问题"
return answer.strip()
questions = [
"本届第十五届珠海航展的亮点和主要展示内容是什么?",
"珠海杀人案发生地点?"
]
context = '第十五届中国国际航空航天博览会(珠海航展)于2024年11月12日至17日在珠海国际航展中心举行。本届航展吸引了来自47个国家和地区的超过890家企业参展,展示了涵盖"陆、海、空、天、电、网"全领域的高精尖展品。其中,备受瞩目的中国空军"八一"飞行表演队和"红鹰"飞行表演队,以及俄罗斯"勇士"飞行表演队同台献技,为观众呈现了精彩的飞行表演。此外,本届航展还首次开辟了无人机、无人船演示区,展示了多款前沿科技产品。'
for question in questions:
answer = get_answer(question, context)
print(f"问题: {question}")
print(f"答案: {answer}")
print("-" * 50)
局限性与偏差
模型在可回答与不可回答问题上表现差异显著,可能反映:
- 数据集质量问题
- 中文版SQuAD潜在的翻译瑕疵
- 对两类问题的处理不平衡
伦理与负责任AI
使用者应注意:
- 模型可能反映训练数据中的偏见
- 不同问题类型表现差异显著
- 关键应用场景需验证结果
- 不应作为关键系统的唯一决策依据