在 Alexa 技能中使用 sessionAttributes
Using sessionAttributes in Alexa Skill
我正在构建 Alexa 技能,但不太确定我是否正确使用 sessionAtrributes
。我知道 sessionAttributes
用于 carry-forward 一个 session 的数据到下一次调用。
所以我有这两个意图
1) ListToDoItem
- 在这个意图中,我的技能将查看数据库并列出
to-do 项目存储在数据库中。列出项目后,Alexa
会继续说“你想让我列出这些的详细信息吗
to-do 项?”,为了处理这个问题,我将传递在
之前 session 为
sessionAttributes
。当被要求列出详细信息时
关于物品的信息,我会提取之前转发的
sessionAtrributes
并撰写详细的语音回复。
- 所以为了这个目的,我必须对话语进行采样
- 列出我的 to-do 项
- 是
将使用话语 'yes',以便提取 sessionAttributes
以创建详细的语音响应。
2) ListDoneItems
此意图将用于列出已完成的项目。与之前的intent类似,唯一不同的是,这个intent会列出已完成的项目。
为此意图将有 2 个示例话语
- 列出我完成的项目
- 是
就像之前一样,它有一个 'yes' 来根据 session 属性生成详细的语音响应。
但我遇到的问题是,当我回复 'yes' 到 ListDoneItems
意图的 'Do you want me to list the completed items'? 时,生成的下一个意图请求是类型 ListToDoItems
而不是ListDoneItems
,虽然我在技能回复里设置了shouldEndSession
到false
。发生这种情况是因为我的意图之间的样本话语之间存在交叉。那么在不同的意图中有相似的意图是错误的吗?如何设计交互模型以创建 multi-turn 对话框以便在 sessionAttributes
?
中使用
我认为这对寻找答案的人有用。
基本上,在示例话语中,您不应包含用于重新提示的短语;也就是说,在我的例子中,我不应该添加 'yes' 作为话语。相反,我应该使用 Amazon.YesIntent
。
使用 Amazon.YesIntent
时,您应该在 SessionAttributes
中维护一个状态机,指向最后调用的意图。例如,如果您的两个或多个意图有可能出现用户响应调用 YesIntent
的情况,您应该将最后调用的意图名称和关联的会话数据存储在 SessionAttributes
中。因此,在处理 YesIntent
的函数中,您应该检查之前调用的状态并将控制委托给相应的意图处理程序。
在我的例子中,我会将之前调用的意图名称存储为键,并将其关联数据存储为 session.attributes
;
中的值
"session": {
"new":"false",
"sessionId": "sessionId",
"application": {
"applicationId": "applicationId"
},
"attributes": {
"PreviousIntent": {
"PreviousIntentData"
}
}
在处理 YesIntent
的函数中,检查之前的状态 (session.attributes.PreviousIntent
) 并将控制委托给处理该意图的函数。
我正在构建 Alexa 技能,但不太确定我是否正确使用 sessionAtrributes
。我知道 sessionAttributes
用于 carry-forward 一个 session 的数据到下一次调用。
所以我有这两个意图
1) ListToDoItem
- 在这个意图中,我的技能将查看数据库并列出
to-do 项目存储在数据库中。列出项目后,Alexa
会继续说“你想让我列出这些的详细信息吗
to-do 项?”,为了处理这个问题,我将传递在
之前 session 为
sessionAttributes
。当被要求列出详细信息时 关于物品的信息,我会提取之前转发的sessionAtrributes
并撰写详细的语音回复。 - 所以为了这个目的,我必须对话语进行采样
- 列出我的 to-do 项
- 是
将使用话语 'yes',以便提取 sessionAttributes
以创建详细的语音响应。
2) ListDoneItems
此意图将用于列出已完成的项目。与之前的intent类似,唯一不同的是,这个intent会列出已完成的项目。
为此意图将有 2 个示例话语
- 列出我完成的项目
- 是
就像之前一样,它有一个 'yes' 来根据 session 属性生成详细的语音响应。
但我遇到的问题是,当我回复 'yes' 到 ListDoneItems
意图的 'Do you want me to list the completed items'? 时,生成的下一个意图请求是类型 ListToDoItems
而不是ListDoneItems
,虽然我在技能回复里设置了shouldEndSession
到false
。发生这种情况是因为我的意图之间的样本话语之间存在交叉。那么在不同的意图中有相似的意图是错误的吗?如何设计交互模型以创建 multi-turn 对话框以便在 sessionAttributes
?
我认为这对寻找答案的人有用。
基本上,在示例话语中,您不应包含用于重新提示的短语;也就是说,在我的例子中,我不应该添加 'yes' 作为话语。相反,我应该使用 Amazon.YesIntent
。
使用 Amazon.YesIntent
时,您应该在 SessionAttributes
中维护一个状态机,指向最后调用的意图。例如,如果您的两个或多个意图有可能出现用户响应调用 YesIntent
的情况,您应该将最后调用的意图名称和关联的会话数据存储在 SessionAttributes
中。因此,在处理 YesIntent
的函数中,您应该检查之前调用的状态并将控制委托给相应的意图处理程序。
在我的例子中,我会将之前调用的意图名称存储为键,并将其关联数据存储为 session.attributes
;
"session": {
"new":"false",
"sessionId": "sessionId",
"application": {
"applicationId": "applicationId"
},
"attributes": {
"PreviousIntent": {
"PreviousIntentData"
}
}
在处理 YesIntent
的函数中,检查之前的状态 (session.attributes.PreviousIntent
) 并将控制委托给处理该意图的函数。