# 基础概念

技能的交互逻辑可以通过创建语言交互模型实现。 用户的请求在交互模型中通过一个或多个意图来表示。意图是技能实现用户请求的基本单元,意图中包括槽位、问法等概念。与用户交互过程中的多轮对话在交互模型中通过对话模型来体现,包括必填槽位的追问、槽位意图的确认、上下文等。本文阐述技能配置环节相关基础名词解释。

# 意图 Intent

意图就是用户在说每个指令的时候,想要做的事情。例如用户说“嗨小微,今天天气怎么样?”时,他的意图就是查询天气。同时查询天气这个意图包含的不仅仅是代表刚刚那一句话,而是所有【问法】相关句式的合集。

Skill、意图和槽位

一个技能里可以包含多个意图,一个意图可以包含多个关键字。这些关键字称为槽位,这部分会在后续的槽位章节说明。例如在音乐这个技能里,可以包含点播、询问歌名、收藏歌曲、分享歌曲这4个意图。而在天气技能里可以包含普通询问、下雨查询、空气质量查询这3个意图。意图的数量完全有技能的开发者定义。

Skill、意图和槽位分析

在音乐技能里,用户说“我要听周杰伦的歌”就会被匹配到点播意图中。“这是什么歌”则会被匹配到询问歌曲名称这个意图。这意图和用户说的话中间的对应关系由各个意图里填写的句式定义,这部分会在后续的问法句式章节说明。

# 问法句式

技能的可用性完全依赖句式和意图的匹配。如果开发者能够提供更多更口语化的句式,系统将会更准确得匹配意图。开发者最好能提供不同的用户说法,覆盖用户的不同语法形式。

开发者需要预设好用户在对话中,可能会使用各种语法类型,例如:

问句式:

今天有什么体育新闻?

有没有体育新闻?

命令式:

播放体育新闻。

我要听体育新闻。

名词式:

体育新闻。

今天的体育新闻。

但是不需要填写所有的槽位值,例如:

我想查询北京的天气;

我想查询上海的天气。

以上两句可以使用槽位合并为:"我想查询{城市}的天气 "。但是:“我想查询{城市}的天气”和“{城市}天气怎么样”,是两个不同的句式,需要分开填写。

# 正则规范

为了方便开发者快速编写句式相同的用户问法,平台支持在问法中使用正则规范:“()”、“|”、“&&”三种规则符号。

"()"=条件分隔:
将用户问法分割为多个条件,必选符号,必须成对出现,不允许嵌套;

”{}“=槽位
可通过大括号来描述槽位

“|” =或:
定义条件可选,仅出现在括号内;

“&&”=无序:
调试条件之间可以相互替换位置;

注:以上正则符号均必须为英文符号。

例如:

(打开|想看|)&&(视频)({节目名称})

  • 表示当前规则有三个条件:(打开|想看|)、(视频)、({节目名称})

  • 其中(打开|想看|)条件最后的“|”表示的是可选条件,“想看”和“打开”出现一个即可; (视频)({节目名称})是必选条件,即用户问法中“视频”和“{节目名称}”必须都出现才能命中。

  • &&表示前后两个条件是无序的,即“想看视频…”、“视频打开…”均可以命中;

  • (视频)({节目名称})表示这两个条件是有序的,必须连续出现才能命中,即“视频xxx”可命中,“xxx视频”不可命中。

# 槽位 Slot

某些意图里会包含和意图强相关的关键字,这些关键字称为槽位,例如点播意图可以包含歌手名槽位。

Skill、意图和槽位分析

一个意图里可以包含多个槽位,例如查询天气的意图必须包含时间和地点两个关键字才能完成,也就是包含了时间和地点这两个槽位。当然时间我们可以默认是当前时间,地点我们可以根据设备的位置获得,所以这两个槽位是非必须的槽位,用户可以不提供。

每个槽位必须关联词典,一个槽位可以同时关联多个词典。

# 槽位追问

但是如果用户要发送微信消息,发送的对象会是一个必须的槽位,如果用户不提供发送的对象,这个任务将无法完成。您可以在小微技能平台上设置某个意图是否必须,被设置成必须的槽位如果用户没有提供,机器人会自动反问用户槽位内容(可配置多条,追问时随机选取)。

例如:

在查询星座幸运数字时,如果用户问法是“我要查星座幸运数字”,而没有提供星座类型,该任务也就无法执行。若开发者配置追问话术后,系统就会向用户发送追问语句以获取该语义槽值。

# 词典

词典是一个规范的自然语言短语集合,通常定义为应用所在领域的术语的集合,可用于用户说法中的关键信息提取和语义槽调用。例如“刮风”、“降雨”属于“天气”这个词典,“跑步”、“游泳”属于“运动”这个词典。每个词典均可在多个技能中重复使用。

# 系统词典

系统词典以" sys."为标识,是平台为开发者预置的词典(如:时间、数字、国家、城市等)。可直接使用,但不支持编辑。每个系统词典内已包含丰富的词条,平台提供了词条示例,便于开发者理解系统词典含义。

例如:

“商场8点开门吗”和“商场9点开门吗”,这两句用户问法中,时间点就是可以不断变化的关键词,我们就可以用一个系统词典 {sys.具体时间点} 来代替用户可能询问的所有时间点。即可写成:“商场 {sys.具体时间点} 开门吗”,这样用户再问 商场任一时间点开门吗 都能匹配到。

# 自定义词典

如果系统词典不能满足技能开发需要,开发者还可以创建自定义词典,自定义词典以 user.为标识,开发者可根据需要,增删改词典和词条。

例如星座建议的技能需要一个槽位类型是星座名。这时候开发者可以新建一个自定义的词典,名字由开发者自定义,比如“constellation”,同时需要在平台上配置该“词典”对应的“词条”内容。

constellation的值
白羊座
金牛座
双子座
巨蟹座
狮子座
处女座
天秤座
天蝎座
射手座
摩羯座
水瓶座
双鱼座

注意:新建自定义词典时,一定要把这个类型所有可能的值都填写全,避免意图识别的错误。

# 同义词

一些词典中的词条值包含多种同义词,可以在词条中里添加上同义词。更全的同义词覆盖可以保证意图的更好的命中。例如:”中央一台“的同义词可以包含:”中央一套“、”中央电视台“、”中央一台“、”中央广播电视台“、”央视一套“、”央视一台“,等等。