pydial启动流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31214097/article/details/85112342

通过加载配置文件进行启动,进入整个项目的根文件,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根据系统产生的槽值对,填充话语,产生相应的输出。下一句用户的输入也是根据如上的情况。接下来的重点便是分析系统输入时,是如何产生用户的动作的,随后根据用户的动作和系统的决策函数,来产生相应的系统动作,根据系统的动作,组织成相应的话语进行输出。

猜你喜欢

转载自blog.csdn.net/qq_31214097/article/details/85112342