通过加载配置文件进行启动,进入整个项目的根文件,pydial.py文件,加载的是这个文件中的chat_command的根文件,其中调用了整个项目的
initialise(configId, configfile, seed, "chat", trainerrorrate=trainerrorrate)
来进行预加载的初始化,在初始化的函数中,从整个配置文件中读取出,当前是否是单个领域,领域是什么.最多限制的会话代理个数是多少。 如下便是从general模块中读取出来的一些参数。
isSingleDomain = getOptionalConfigBool("singledomain", isSingleDomain, "GENERAL")
isSingleModel = getOptionalConfigBool("singlemodel", False, "policycommittee")
traceDialog = getOptionalConfigInt("tracedialog", tracedialog, "GENERAL")
domain = getOptionalConfigVar("domains", '', "GENERAL")
可看出读取的是
[GENERAL]
domains = CamRestaurants,CamHotels
isSingleDomain=False
tracedialog = 1
随后通过section的匹配,例如policy_CamRestaurants来加载对应领域的训练政策,开始对话是否用hello等。
[policy_CamRestaurants]
belieftype = focus
useconfreq = False
learning = False
policytype = hdc
startwithhello = False
加载配置完成以后,开始调用TextHub模块中的consoleHub函数。
在consoleHub中开启代理用户会话。即其中的
sys_act = self.agent.start_call(session_id='texthub_dialog').模块。
start_call表示开始的是第一次会话,因此没有用户的输入,在call函数中,进行当前领域的加载,置信度状态的分析和最终用户动作的返回。
随后的持续会话一直调用的是continue_call函数,
整个函数的调用使用了如下的流程。
Works through topictracking > semi belief > policy > semo > evaluation -- for turns > 0
在该函数中,便有用户对话的输入,和start_call函数相同,第一步首先进行验证,随后判断若是达到了最大用户代理数,则返回bye. 随后进行用户输入话语置信的分析:
state = self.semi_belief_manager.update_belief_state(ASR_obs=asr_info, sys_act=prev_sys_act,
dstring=currentDomain, turn=self.currentTurn,hub_id = self.hub_id, sim_lvl=self.sim_level)
根据对话决策,将当前分析的置信度输入,输出用户的动作。
sys_act = self.policy_manager.act_on(dstring=currentDomain,
state=state)
进行验证
# Check ending the call:
sys_act = self._check_ENDING_CALL(state, sys_act) # NB: this may change the self.prompt_str
系统产生的话语值也是一个槽值对,
根据决策后的用户动作,从semo中输出对应话语。
# SEMO:
self.prompt_str = self._agents_semo(sys_act)
sys_act.prompt = self.prompt_str
semo根据系统产生的槽值对,填充话语,产生相应的输出。下一句用户的输入也是根据如上的情况。接下来的重点便是分析系统输入时,是如何产生用户的动作的,随后根据用户的动作和系统的决策函数,来产生相应的系统动作,根据系统的动作,组织成相应的话语进行输出。