如何用DeepPavlov搭建自定义上下文SQuAD问答模型及配置问题
DeepPavlov自定义SQuAD问答模型搭建问题解答
基础问题答疑
- 数据集格式要求与拆分规则
数据集必须严格对齐SQuAD 1.1或2.0的标准JSON格式,结构如下:外层为data数组,每个元素包含title与paragraphs字段;每个paragraphs元素包含context(上下文文本)与qas(问答对)数组;每个qas元素包含id、question、answers数组;每个answer元素包含answer_start(答案在上下文中的起始下标)与text(答案文本)。
拆分比例推荐训练集80%、验证集10%、测试集10%,拆分时需保证同一上下文对应的所有问答对划分到同一数据集,避免数据泄露。拆分后三个文件命名建议和你使用的SQuAD版本匹配,比如train-v1.1.json、dev-v1.1.json、test-v1.1.json。 - 数据集存放位置
可存放在任意本地可读写路径,你使用的/home/ec2-user/SageMaker/squad/data/完全符合要求,只需将拆分好的三个数据集文件全部放到该目录下即可。 - 数据集读取器路径配置修改
除了修改data_path参数,还需要同步配置三个数据集对应的文件名,避免读取器找不到对应文件触发兜底逻辑。 - 自定义模型保存目录配置
你修改的my_config['metadata']['variables']['MODELS_PATH']参数是正确的,训练完成后所有模型相关文件都会自动保存到该路径下的对应任务子目录。 - 训练完成后模型的使用方法
直接在代码中调用build_model接口加载训练后的配置文件即可,示例代码:from deeppavlov import build_model # 注意将路径替换为你保存的训练后配置文件路径,download=False禁止下载官方权重 qa_model = build_model('/home/ec2-user/SageMaker/squad/model/your_model/config.json', download=False) # 推理时传入上下文列表和问题列表即可 context = "此处输入你的上下文文本" question = "此处输入你的问题" answer = qa_model([context], [question])
自定义数据集不生效问题解决方案
你修改路径后仍然自动下载官方数据集的核心原因是默认配置中dataset字段绑定了官方SQuAD的自动下载逻辑,仅修改dataset_reader的路径不会影响该逻辑,需补充以下配置修改:
- 先确认数据集读取器的文件名参数和你的本地文件名完全匹配:
my_config['dataset_reader']['train'] = 'train-v1.1.json' my_config['dataset_reader']['dev'] = 'dev-v1.1.json' my_config['dataset_reader']['test'] = 'test-v1.1.json'
- 覆盖
dataset字段配置,关闭自动下载逻辑:
my_config['dataset'] = { 'class_name': 'squad_dataset', 'data_path': my_config['dataset_reader']['data_path'], 'train': my_config['dataset_reader']['train'], 'dev': my_config['dataset_reader']['dev'], 'test': my_config['dataset_reader']['test'], 'download': False }
- 训练前手动检查目标路径下的三个数据集文件是否存在、读取权限是否正常,避免读取失败触发官方下载兜底。
内容的提问来源于stack exchange,提问作者Sayak Ghanta
相关产品推荐
相关产品推荐

