ConvLab
ConvLab简介
ConvLab是微软美国研究院和清华合作开发的一款开源的多领域端到端对话系统平台,它包括一系列的可复用组件,比如传统的管道系统(pipline systems:包括多个独立步骤的对话系统)或者端对端的神经元模型。
ConvLab和ConvLab2的论文传送
安装
下载ConvLab-2项目,并安装相关的依赖包:(这一步之前需要先安装下pytorch。)
git clone https://github.com/thu-coai/ConvLab-2.git && cd ConvLab-2 && pip install -e .
接着安装下en_core_web_sm来解决BERTNLU
出现的错误:
python -m spacy download en_core_web_sm
ConvLab的使用
在这里使用适用于数据集MultiWOZ
的模型。整个pipeline agent包括NLU
、DST
、Policy
和NLG
模块。(这些模块的含义可以参考:博客)
1 build an agent(创建智能体)
首先导入一些模型和包:
1 | from convlab2.nlu.jointBERT.multiwoz import BERTNLU |
接着,生成模型并创建agent:
1 | # go to README.md of each model for more information |
结束。
利用agent的response
(响应)函数尝试和刚刚创建的agent"聊天":
1 | sys_agent.response("I want to find a moderate hotel") |
1 | sys_agent.response("Which type of hotel is it ?") |
1 | sys_agent.response("OK , where is its address ?") |
1 | sys_agent.response("Thank you !") |
1 | sys_agent.response("Try to find me a Chinese restaurant in south area .") |
1 | sys_agent.response("Which kind of food it provides ?") |
1 | sys_agent.response("Book a table for 5 , this Sunday .") |
2 创建一个模拟器(simulator)和agent交流并评估
在很多一对一任务型对话系统中,模拟器对训练一个RL(强化学习) agent十分重要。在ConvLab框架里没有区分用户和系统,所有的说话人都是agents。模拟器(simulator)同样是一个agent,只是拥有为完成用户目标的特定策略。
在这里为模拟器(simulator)使用Agenda
策略,这个策略需要对话动作(dialog act)作为输入,这也就意味着需要将PipelineAgent
中的DST参数置空。(更多细节可以参考PipelineAgent
文档)
1 | # MILU |
到现在已经有了一个agent和一个simulator,接下来会用到BiSession
这个已有的简单一对一对话控制器。为了实现自己的特殊需要可以自己定义一个Session
类。同时为了评估性能,增加了MultiWozEvaluator
,它利用解析后的dialog act input和policy output dialog act来计算inform f1(是否提供合适的实体)、book rate(预定率)、success(是否成功)。 1
2evaluator = MultiWozEvaluator()
sess = BiSession(sys_agent=sys_agent, user_agent=user_agent, kb_query=None, evaluator=evaluator)BiSession
类中的next_turn
函数。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26def set_seed(r_seed):
random.seed(r_seed)
np.random.seed(r_seed)
torch.manual_seed(r_seed)
set_seed(20200131)
sys_response = ''
sess.init_session()
print('init goal:')
pprint(sess.evaluator.goal)
print('-'*50)
for i in range(20):
sys_response, user_response, session_over, reward = sess.next_turn(sys_response)
print('user:', user_response)
print('sys:', sys_response)
print()
if session_over is True:
break
print('task success:', sess.evaluator.task_success())
print('book rate:', sess.evaluator.book_rate())
print('inform precision/recall/f1:', sess.evaluator.inform_F1())
print('-'*50)
print('final goal:')
pprint(sess.evaluator.goal)
print('='*100)next_turn
是如何实现的?---找到了代码如下,并根据自己的理解作了相应的注释:
1 | def next_turn(self, last_observation): |
3 尝试不同的模型组合
流水线式的对话系统可以选择不同的模型进行组合,其中包含联合模型(joint model):Word-DST(包含NLU和DST)和Word-Policy(包含Policy和NLG)。可选模型如下:
- NLU: BERTNLU, MILU, SVMNLU
- DST: RuleDST
- Word-DST: SUMBT, TRADE (set sys_nlu to None)
- Policy: RulePolicy, Imitation, REINFORCE, PPO, GDPL
- Word-Policy: MDRG, HDSA, LaRL (set sys_nlg to None)
- NLG: Template, SCLSTM
除了流水线式的对话系统,还有一些端到端的模型(即一个模型来实现上面流水线式的多个模型组合):
- End2End: Sequicity, DAMD, RNN_rollout (directly used as sys_agent)
最后还有simulator的策略:
- Simulator policy: Agenda, VHUS (for user_policy)
代码示例:
首先导入相关的包:
1 | from convlab2.nlu.svm.multiwoz import SVMNLU |
自然语言理解(NLU)和对话状态追踪(DST)或者Word-DST:
1 | # NLU+RuleDST: |
策略(Policy)和自然语言生成(NLG)或者Word-Policy:
1 | # Policy+NLG: |
将上述模型集成为一个流水线式系统agent:
1 | sys_agent = PipelineAgent(sys_nlu, sys_dst, sys_policy, sys_nlg, 'sys') |
或者不用上述集成的方式,而是直接使用端到端模型:
1 | # sys_agent = Sequicity() |
用上面配置系统agent的方式类似地配置一个user agent:
1 | user_nlu = BERTNLU() |
4 使用分析工具检测系统
ConvLab2提供了分析工具对模拟对话中常见的错误进行丰富的统计和总结。
1 | from convlab2.util.analysis_tool.analyzer import analyzer |
比较多个模型:
1 | set_seed(20200131) |