自然语言处理¶
问答系统¶
最近在做一个基于抽取式阅读理解的问答系统。简单来说,就是给一个文档,然后询问跟文档中有关的问题,AI需要从文档中抽取相关句子作为答案。由于不能使用大模型(因为大模型太NB),而且计算资源又有限(租显卡费钱),所以直接从huggingface上找别人训练好的模型。目前选中了chinese_pretrain_mrc_roberta_wwm_ext_large模型,测试了一下效果一般般,于是拿测试集做微调(bushi)。但是微调的时候需要注意一些数据处理的细节(也可以不注意,但是最好注意),这里记录一下SQuAD数据处理的流程。
首先,得先清楚Squad是一个抽取式阅读理解的数据集,有三个基本元素:问题、答案、情景,其他还有些杂七杂八的元素就不说了。然后transformer库里实现了Squad的数据处理工具,是通用的,所以可以用在其他阅读理解数据集上。
Squad数据预处理分两步:构建SquadExample-->将SquadExample转为SquadFeature。具体大概做了删除空格、提取answer对应的token区间、context分块等方面的处理,细节也没看太懂就不说了,反正如果后续要推理的话,就要调用相关函数进行预处理,不然推理结果肯定是不好的。
Pipeline封装,QuestionAnsweringPipeline将Squad的预处理和后处理封装好了,直接调用就可以得到好的答案,但是如果后需要微调(比如在测试集过拟合。。),就得自己做相同的预处理。如果不做预处理也行,但是这个时候就不能使用QuestionAnsweringPipeline进行推理了,因为输入数据的分布会跟Pipeline预处理后的分布有差异。直接使用未预处理的输入进行推理即可(不过泛化性能肯定就没有之前好了)。