如何获取对话状态中正在填充的槽位并实现槽位多选提示?
关于Alexa技能槽位填充的两个问题解答
嘿,我来帮你搞定这两个Alexa技能开发里的常见问题!
一、如何获取当前正在填充的具体槽位?
当this.event.request.dialogState返回IN_PROGRESS时,Alexa的请求对象里已经直接给出了当前需要填充的槽位——你可以通过this.event.request.dialogAction.slotToElicit字段拿到这个槽位的名称(比如你的例子里的age)。
举个简单的代码示例:
// 检查对话是否处于填充过程中 if (this.event.request.dialogState === 'IN_PROGRESS') { const currentSlotName = this.event.request.dialogAction.slotToElicit; console.log(`当前正在填充的槽位:${currentSlotName}`); // 这里可以根据槽位名称做不同的逻辑处理 }
如果使用的是ASK SDK v2/v3(更推荐的新版本),写法会稍有不同,你需要从handlerInput.requestEnvelope里获取:
const dialogState = handlerInput.requestEnvelope.request.dialogState; if (dialogState === 'IN_PROGRESS') { const currentSlotName = handlerInput.requestEnvelope.request.dialogAction.slotToElicit; // 后续逻辑... }
二、填充age槽位时,如何提供选项提示?
你有两种方式实现这个需求,一种是在开发者控制台配置静态提示,另一种是在代码里动态生成提示(更灵活):
方式1:控制台静态配置
- 打开Alexa开发者控制台,进入你的技能的「对话模型」页面
- 找到
age槽位,在「提示」(Prompts)区域添加类似这样的文本:请问你的年龄是多少呢?可以选择18以下、20-50或者50以上哦
- 保存并构建模型,之后当Alexa需要填充
age槽位时,就会自动播放这个提示
方式2:代码动态生成提示
如果需要根据上下文调整提示内容,或者做更复杂的逻辑,推荐用代码实现。比如当检测到当前要填充age槽位时,返回带选项的引导指令:
if (this.event.request.dialogState === 'IN_PROGRESS' && this.event.request.dialogAction.slotToElicit === 'age') { // 构建带选项的语音提示 const prompt = '请问你的年龄是多少呢?你可以选择18以下、20到50之间,或者50以上哦'; // 返回引导用户填充age槽位的响应 return this.response.speak(prompt) .listen('请告诉我你的年龄范围哦') .addElicitSlotDirective('age', this.event.request.intent) .getResponse(); }
如果是ASK SDK v2/v3版本:
const { responseBuilder } = handlerInput; const currentSlotName = handlerInput.requestEnvelope.request.dialogAction.slotToElicit; if (currentSlotName === 'age') { return responseBuilder .speak('请问你的年龄是多少呢?你可以选择18以下、20到50之间,或者50以上哦') .reprompt('请告诉我你的年龄范围哦') .addElicitSlotDirective('age') .getResponse(); }
另外,如果希望用户只能选择你指定的这几个选项,建议把age槽位设置为自定义槽位,并将这三个选项(比如under_18、20_to_50、over_50)添加为槽位值,这样Alexa能更准确地识别用户的回答。
内容的提问来源于stack exchange,提问作者user9315778
相关产品推荐
相关产品推荐

