什么是 intent?
intent 是搜索需求(搜索词)的正规化和结构化的 JSON 表示,在每个卡片的 intent 有其特定的结构。
例如,”景点门票
“卡片下,intent 的结构是 {"scenic_spot":""}
。那么,”故宫怎么买票
“这个搜索词表达成 intent 就是:
1 | {"scenic_spot":"故宫"} |
intent 有什么用?
用户在搜索框中输入的搜索词表达方式多种多样,需要经过复杂的语义分析才能确定用户的意图。例如同样是查故宫门票,有人搜”故宫门票
“,有人搜”故宫买票
“,可能还有人搜”故宫怎么买票
“。
如果我们将原始搜索词发送给开发者,那就意味着所有的开发者都需要实现复杂的语义分析,才能确定用户的意图。为了降低开发者的实现代价,我们将分析出来的正规化 intent 而不是原始搜索词发送给开发者服务。开发者只需要用 intent 中正规化的参数进行简单的 KV 或者数据库检索即可命中需求数据。
例如原始搜索词: “故宫门票
“ 、 “故宫买票
“和”故宫怎么买票
“,经过我们意图分析它都是景点门票类需求,对应到”景点门票
“卡片;通过语义分析出来的 intent
都是 “{"scenic_spot":"故宫"}
“。这样开发者收到的请求参数就很简单,对于这些搜索词都只需要用”故宫
“做数据库检索就好。
为什么要上传 intent?
我们希望开发者上传自己小程序覆盖的所有 intent
列表,主要有以下两个原因:
- 为了给语义分析提供基本语料成分。例如:开发者上传的景点名,会用于建设景点专名库,用来识别搜索词中哪些词组是景点的名字。
- 为了避免给开发者服务器无用的请求。例如:如果开发者仅覆盖海外的景点,只上传了海外的景点名,那么搜索后端会尽量避免把国内景点的搜索请求下发到开发者服务器。
怎么上传 intent?
由于每个卡片的 intent 结构不同,开发者在上传 intent 前需要首先阅读对应卡片的接入细则,确定该卡片 intent 的数据字段。
然后开发者需要根据小程序本身的资源覆盖情况,确定能够提供的所有 intent 字段组合。
txt 文件上传
如果使用 txt 文件上传,开发者需要将所有 intent 序列化后的 JSON 串写入 txt 文件中。为避免解析出错,我们对 txt 文件格式有以下要求:
- 编码采用 UTF-8 无 BOM 编码;
- 文件大小不得超过 4MB,超过 4MB 的请选择使用 API 上传;
- 换行符使用 Linux 风格,使用
\n
表示一行的结束; - 每行一个完整的 JSON 序列化串,JSON 串中不得有换行、TAB 等不可打印字符;
- 当 intent 要求多个 key 时,JSON 里必须含有所有 key,部分 value 内容可以为空;
- 内容不得有重复的行,除尾部外不得有空行;
例如:景点门票
卡片下的 intent 仅要求一个景点名字段,开发者需要将小程序覆盖的所有景点名都列入到上传的 txt 文件里,形如:
1 | {"scenic_spot":"故宫"} |
API 上传
即将开放