Alexa与Lex机器人集成时,如何配置意图以无载体短语直接捕获用户自由输入?
Alexa与Lex机器人集成时,如何配置意图以无载体短语直接捕获用户自由输入?
嘿,我刚好之前处理过几乎一模一样的需求,给你几个亲测有效的方案,应该能完美解决你的问题:
方案一:用AMAZON.FallbackIntent(最推荐,配置最简单)
Alexa内置的AMAZON.FallbackIntent就是专门用来兜底处理“无法匹配到其他意图”的输入,我们刚好可以利用它来捕获所有无载体短语的自由输入:
- 先在Alexa开发者控制台的「交互模型」→「意图」列表里,找到并启用
AMAZON.FallbackIntent(默认可能是禁用状态,需要手动开启) - 不需要给这个意图添加任何样本话术(Utterances),它的核心逻辑就是:只要用户的输入匹配不上你技能里的其他意图,就会触发它
- 重点来了——在你的 orchestrator Lambda 里,不管这个意图有没有返回槽值,直接读取请求里的
inputTranscript字段,这就是用户说的原始完整输入文本,把它直接传给Lex bot的PostText接口就行
这个方案的优势是绝对可靠,不管用户说什么(哪怕是完全无意义的内容),只要技能处于激活状态,都会被这个意图捕获,完美满足你“传原始查询给Lex”的需求。
方案二:自定义意图+极简话术配置(适合不想用兜底意图的场景)
如果你更倾向于用自己的自定义意图,比如叫PassToLexIntent,可以这么配置:
- 给这个意图添加唯一的样本话术:
{UserQuery}——就是直接把你的AMAZON.SearchQuery槽作为整个话术 - 进入槽的设置页面,把
AMAZON.SearchQuery的「槽解析(Slot Resolution)」设置为「None」,这样Alexa不会尝试解析槽的内容,直接把所有输入塞进这个槽里 - 可以把这个意图设置为技能的“默认意图”(在控制台的「技能设置」里配置),提升它的匹配优先级
不过要注意:如果你的技能里还有其他内置意图(比如AMAZON.SearchIntent),可能会抢匹配权,所以最好暂时禁用其他无关的内置意图,确保这个自定义意图能优先捕获输入。
额外的Lambda处理小技巧
不管用哪个方案,在你的 orchestrator Lambda 里,记得直接取inputTranscript字段而不是槽值——因为槽值可能会被Alexa做过解析截断,而inputTranscript是100%原始的用户输入文本,完全符合你“直接传原始查询给Lex”的要求。
举个Lambda里的伪代码片段(方便你理解):
def lambda_handler(event, context): # 拿到用户的原始输入 raw_user_input = event['request']['inputTranscript'] # 调用Lex的PostText API,把raw_user_input传进去 lex_response = lex_client.post_text( botName='YourLexBotName', botAlias='YourLexBotAlias', userId=event['session']['user']['userId'], inputText=raw_user_input ) # 把Lex的结果转成Alexa能识别的格式返回 return { 'version': '1.0', 'response': { 'outputSpeech': { 'type': 'PlainText', 'text': lex_response['message'] }, 'shouldEndSession': False } }
备注:内容来源于stack exchange,提问作者Sriram Chebrolu




