最近在做dialog policy相关的研究,实现就用了rasa的轮子,看源码顺便写篇文章。水平有限,还请指正。

先吹一波

rasa core的代码质量非常高非常高非常高!我知道有许多中国工程师参与了开发,牛逼!

整体思路

我们先从执行的角度来分析tracker的源码

  • 是什么?如何初始化
  • 输入是什么
  • 跟踪了什么内容
  • 如何更新状态
  • 状态如何表达

如何初始化 —— init

下面是init的全部代码,非常简单,我做了一些注释方便理解,其实源码里面的注释很多,原来的注释大家就直接看源码吧。多说一句,rasa的源码写得太漂亮了,注释详细,格式规范,读起来就是享受。

    def __init__(self, sender_id, slots,max_event_history=None):"""Initialize the tracker.A set of events can be stored externally, and we will run through allof them to get the current state. The tracker will represent all theinformation we captured while processing messages of the dialogue."""# 可以跟踪的最长历史,tracker记录状态是以event为单位的self._max_event_history = max_event_history# 历史事件列表self.events = self._create_events([])# 这个id和rasa的chenel特性有关系self.sender_id = sender_id# slot列表self.slots = {slot.name: copy.deepcopy(slot) for slot in slots}#### current state of the tracker - MUST be re-creatable by processing# all the events. This only defines the attributes, values are set in# `reset()`#### 暂停标志self._paused = None# 一些action记录self.followup_action = ACTION_LISTEN_NAMEself.latest_action_name = Noneself.latest_message = None# bot的上一个返回内容self.latest_bot_utterance = Noneself._reset()
复制代码

从init函数中我们可以知道些什么呢?

  • tracker是记录一个用户对话状态的对象
  • tracker基于Event对象跟踪对话状态

Event

既然tracker是基于Event的,我们就来看看Event是啥

简单来说,Event就是对bot一切行为的抽象,每一个具体的事件类都继承自Event基类

class Event(object):"""Events describe everything that occurs ina conversation and tell the :class:`DialogueStateTracker`how to update its state."""type_name = "event"def __init__(self, timestamp=None):self.timestamp = timestamp if timestamp else time.time()
复制代码

这种设计很优秀,使得tracker可以跟踪系统预定义以外的事件,只要你自己实现一个Event的子类就行。说起来这是应该是面向对象的基本设计思维,但是真正编码的时候很难考虑周全。

rasa-core内部实现了以下Event

名字一看就知道大概什么意思了

下面我们看一下Event核心的方法apply_to()

class UserUttered(Event):def apply_to(self, tracker):# type: (DialogueStateTracker) -> Nonetracker.latest_message = selftracker.clear_followup_action()
复制代码

看一个就行,这是在干嘛呢?就是给tracker改属性,把一些和自己有关的内容更新了。

为什么要有这个方法呢?因为每个Event需要修改的属性不一样,把这部分逻辑放到子类自己实现,调用逻辑在tracker实现,最大化复用代码。这同样应该属于基础思维,那么自己做到了么(逃

状态更新 —— update

    def update(self, event):# type: (Event) -> None"""Modify the state of the tracker according to an ``Event``. """if not isinstance(event, Event):  # pragma: no coverraise ValueError("event to log must be an instance ""of a subclass of Event.")self.events.append(event)event.apply_to(self)
复制代码

就是这么简单

输出

上面说的内容就是tracker的核心部分了,抽象非常优美。题外话,推荐大家读一读Flask的源码,我读了一部分,说赏心悦目不为过,那种架构设计的严谨优雅看着是真tm舒服。

tracker记录了整个交流的过程,提供了生成Story的接口和生成Dialog的接口

    def export_stories(self):# type: () -> Text"""Dump the tracker as a story in the Rasa Core story format.Returns the dumped tracker as a string."""from dqn_policy.training.structures import Storystory = Story.from_events(self.applied_events())return story.as_story_string(flat=True)def as_dialogue(self):# type: () -> Dialogue"""Return a ``Dialogue`` object containing all of the turns.This can be serialised and later used to recover the stateof this tracker exactly."""return Dialogue(self.sender_id, list(self.events))
复制代码

其他接口

tracker还实现了很多接口,涉及到了rasa的各个部分,就不一一细说了。里面很多是用来featurize的辅助接口,我也还没把这部分研究透,后面会再写一篇聊featurize,这是rasa core的核心组件

总结一哈

tracker是rasa core中承上启下的一环,它记录来自前端输入的数据,又为模型训练的featurize提供基础。从tracker出发基本能摸清楚整个rasa core的框架结构。rasa core抽象做得非常好,代码质量贼高,必须吹一波。这部分源码相对比较简单,注释非常详细,读起来很舒服,推荐大家都读一读。

转载于:https://juejin.im/post/5cd4f352f265da036706c507

【Rasa-Core源码阅读】Tracker相关推荐

  1. ASP.NET Core 源码阅读笔记(5) ---Microsoft.AspNetCore.Routing路由

    这篇随笔讲讲路由功能,主要内容在项目Microsoft.AspNetCore.Routing中,可以在GitHub上找到,Routing项目地址. 路由功能是大家都很熟悉的功能,使用起来也十分简单,从 ...

  2. [转载]ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection

    这篇随笔主要记录一下ASP.NET Core团队实现默认的依赖注入容器的过程,我的理解可能并不是正确的. DependencyInjection这个项目不大,但却是整个ASP.NET Core的基础, ...

  3. ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection

    这篇随笔主要记录一下ASP.NET Core团队实现默认的依赖注入容器的过程,我的理解可能并不是正确的. DependencyInjection这个项目不大,但却是整个ASP.NET Core的基础, ...

  4. TiDB 源码阅读系列文章(十五)Sort Merge Join

    2019独角兽企业重金招聘Python工程师标准>>> 什么是 Sort Merge Join 在开始阅读源码之前, 我们来看看什么是 Sort Merge Join (SMJ),定 ...

  5. SpringMVC源码阅读系列汇总

    1.前言 1.1 导入 SpringMVC是基于Servlet和Spring框架设计的Web框架,做JavaWeb的同学应该都知道 本文基于Spring4.3.7源码分析,(不要被图片欺骗了,手动滑稽 ...

  6. CI框架源码阅读笔记8 控制器Controller.php

    最近时间有些紧,源码阅读系列更新有些慢.鉴于Controller中代码比较少,本次Blog先更新该文件的源码分析. 在经过路由分发之后,实际的应用Controller接管用户的所有请求,并负责与用户数 ...

  7. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...

  8. datax源码阅读一:python文件

    一.前面主要是怎么使用datax和datax的插件编写,后面主要说明源码阅读部分,python相关文件 二.datax关键代码(python datax.py test.json) 1.datax.p ...

  9. surefire 拉起 junit 单元测试类 源码阅读(一)

    根据surefire 拉起Junit单元测试类 输出的报错日志 跟踪执行过程: 日志1: java.lang.reflect.InvocationTargetExceptionat sun.refle ...

最新文章

  1. 计算机视觉常用图像数据集标记平台
  2. Vmware ESXi 应用之还原备份的虚拟机
  3. 引用外部jQuery地址
  4. python redis订阅_python实现 redis订阅与发布
  5. Java Web系列:Spring MVC基础
  6. Mybatis的第三章动态sql总结
  7. tracert和traceroute使用
  8. 原创-WINDOWS SERVER 2008 WEB服务器安装配置
  9. 手动抛出异常_Java异常处理最佳实践及陷阱防范
  10. uitextfield 键盘类型_以编程方式更改UITextField键盘类型
  11. Android qemu pipe高速管道(九)
  12. SurfaceFlinger draw/render/display流程(fps)
  13. 长沙理工计算机安全基础试题,长沙理工大学数字电子技术基础试卷数电试卷题库参考答案(01-10)...
  14. 正态分布某一点的概率怎么算_正态分布的抽卡概率算法
  15. [人物]USTC十大IT精英
  16. 基于证据理论的多源数据融合仿真实验matlab代码(源码)
  17. 腾讯校招难度升级,笔试刷人超80%,最“简单”的试题把网友看哭了
  18. 用DEV-C++写一个走迷宫小游戏1.2最终版(完结,撒花)
  19. 计算机的硬盘u盘属于什么,移动硬盘和机械硬盘有什么区别?
  20. 1+3+5+....+99的和为

热门文章

  1. 这些短视频博主都在用的网站,你一定要知道
  2. Kali更新源签名无效问题
  3. 安装CUDA之后打开bandwidthTest.exe和deviceQuery.exe显示错误,打不开NVIDIA控制面板
  4. (兔C残篇)第一章:Java 简介
  5. 我使用python的进程池技术下载企业工商数据,速度1000万条/天,超快!
  6. 南邮通达计科软件工程考试2022.1
  7. win11 defender关闭以及恢复
  8. 出主机框图,分别以存储指令“STA M”和加法指令“ADD M”(M均为主存地址)为例,在图中按序标出完成该指令(包括取指阶段)的信息流程。假设主存容量为256M×32位,在指令字长、存储字长、机器字
  9. How to Be a Successful PhD Student
  10. FAT16文件系统之目录项分析(四)