SPACE预训练对话模型
SPACE 统一了对话理解,对话策略和对话生成,并在50余个有标和无标对话相关数据集上进行半监督预训练,最终在下游对话任务8个数据集中都取得了SOTA的结果。该模型通过5种损失函数对于对话理解和对话策略加以建模,并且结合了最新的动态prompt技术,对于对话输入和回复的语意都做到了精准的把握。
ModelScope使用
MdoelScope作为一个Maas平台,有着和Huggingface类似的功能和界面,还提供了在线开发的环境,能够轻松体验和复现SOTA的结果。详细的信息可以查看ModelScope使用简介。可以用以下的两种方法来使用ModelScope:
(1)使用ModelScope提供的远程环境,在Notebook中进行开发:
在ModelScope中注册后进入个人中心,在我的Notebook中使用GPU环境打开Notebook
(2)下载modelscope工具包,在本地环境开发:
安装modelscope(python>=3.7): pip install modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
(注:如需节省空间,可在modelscop后加入[NLP],只下载自然语言处理相关工具)
在下游任务中利用SPACE复现SOTA结果
任务一:对话状态跟踪(DST)
- 任务和模型概况:
DST任务为:给定对话上下文,追踪截止到当前轮为止的用户状态。
使用的模型为SPACE3.0在MultiWOZ2.2上finetune的结果,最终在该数据集上取得了Joint Goal Accuracy 57.50的结果,详情的信息在modelcard中都有,以下是一些调用的过程。
- 代码调用方法:
(1)加载模型:
#模型加载frommodelscope.modelsimportModelmodel_id='damo/nlp_space_dialog-state-tracking'model=Model.from_pretrained(model_id) #创建pipelinefrommodelscope.pipelinesimportpipelinefrommodelscope.preprocessorsimportDialogStateTrackingPreprocessorfrommodelscope.utils.constantimportTaskspreprocessor=DialogStateTrackingPreprocessor(model_dir=model.model_dir) my_pipeline=pipeline(task=Tasks.dialog_state_tracking, model=model, preprocessor=preprocessor)
(2)组织输入数据,格式见下图:
如果要进行完整的测试,可以从MultiWOZ2.2上下载相应的数据并处理成相应的格式。
注意:数据格式需要严格按照以下格式进行组织,并且每轮对话的System需要包含ground-truth(或者模型预测的Dialog-Act)
test_case= [ { "User-1": "Hi, I\'m looking for a train that is going to cambridge and arriving there by 20:45, is there anything like that?" }, { "System-1": "There are over 1,000 trains like that. Where will you be departing from?", "Dialog_Act-1": { "Train-Inform": [["Choice", "over 1"], ["Choice", "000"]],"Train-Request": [["Depart", "?"]] }, "User-2": "I am departing from birmingham new street."}, { "System-2": "Can you confirm your desired travel day?", "Dialog_Act-2": { "Train-Request": [["Day", "?"]] }, "User-3": "I would like to leave on wednesday" } ]
(3)最终测试及输出结果:
history_states= [{}] utter= {} forstep, iteminenumerate(test_case): utter.update(item) result=my_pipeline({ 'utter': utter, 'history_states': history_states }) print({k: vfork, vinresult['dialog_states'].items() ifv!='none'}) # 输出对话状态,值='none'的 slot 代表当前未提及,默认不显示history_states.extend([result['dialog_states'], {}])
结果显示:
任务二:对话意图识别(NLU)
- 任务和模型概况:
NLU任务为:给定对话上下文,识别当轮用户的意图。
使用的模型为SPACE3.0在Banking77数据集(可从DialoGLUE中获得)上finetune的结果,最终在该数据集上取得了94.94的 Accuracy,模型详情见modelcard。
- 代码调用方法:
(1)加载模型:
#模型加载frommodelscope.modelsimportModelmodel_id='damo/nlp_space_dialog-intent-prediction'model=Model.from_pretrained(model_id) #创建pipelinefrommodelscope.pipelinesimportpipelinefrommodelscope.preprocessorsimportDialogIntentPredictionPreprocessorfrommodelscope.utils.constantimportTaskspreprocessor=DialogIntentPredictionPreprocessor(model_dir=model.model_dir) my_pipeline=pipeline(task=Tasks.dialog_intent_prediction, model=model, preprocessor=preprocessor)
(2)数据组织及测试:
#输入result=my_pipeline("I cannot find my card now.") # 输入单轮的 user query 即可print(result['label']) #输出结果:lost_or_stolen_card
附:该模型仅使用于银行领域
任务三:对话回复生成(NLG)
- 任务和模型概况:
NLG任务为:给定对话上下文,预测系统的回复话术。
使用的模型为SPACE3.0在MultiWOZ2.2上finetune的结果,最终在该数据集上取得了Combined Score 110.95的结果,模型详情见modelcard。
- 代码调用方法:
(1)加载模型:
#模型加载frommodelscope.modelsimportModelmodel_id='damo/nlp_space_dialog-modeling'model=Model.from_pretrained(model_id) #创建pipelinefrommodelscope.pipelinesimportpipelinefrommodelscope.preprocessorsimportDialogModelingPreprocessorfrommodelscope.utils.constantimportTaskspreprocessor=DialogModelingPreprocessor(model_dir=model.model_dir) my_pipeline=pipeline(task=Tasks.task_oriented_conversation, model=model, preprocessor=preprocessor)
(2)数据组织及测试:
#输入test_case= [ { "user": "i would like a taxi from saint john 's college to pizza hut fen ditton ."}, # 第一轮输入 { "user": "i want to leave after 17:15 ."} # 第二轮输入] result= {} foritemintest_case: user=item['user'] print('user: {}'.format(user)) result=my_pipeline({ 'user_input': user, 'history': result }) print('response : {}'.format(' '.join(result['response']))) # 批量输出每一轮的系统回复#输出结果:response : i can help with that . what time would you like to leave and arrive by ?#输出结果:user: i want to leave after 17:15 .#输出结果:response : booking completed ! booked car type : [value_car] contact number : [value_phone]
注:该模型的输出为去词汇化的结果,如果需要得到自然语言回复,需要通过查询数据库进行回填。
最后
就这么简单,半小时不到,只需要几十行代码,我们就在ModelScope复现了SPACE三个下游任务效果,ModelScope的整体使用体验还是挺不错的~