如何在Lambda代码中使用Amazon Lex v2的inputTranscript实现开放式插槽取值
Amazon Lex V2 任意文本插槽采集Lambda实现方案
前置配置确认
你需要先在Lex控制台完成以下预配置:
- 你已有的意图中,
description插槽设置为必填,槽类型选择自定义空槽类型(不需要添加任何枚举值,匹配规则设为宽松匹配即可) - 意图的「对话代码钩子」开启初始化和验证触发选项
- 你的Lex机器人别名已经关联了该Lambda函数,并且给Lex服务开通了调用Lambda的权限
完整可运行Lambda代码(Python 3.9+)
import json def lambda_handler(event, context): # 解析Lex V2传入的事件参数 session_attributes = event.get('sessionAttributes', {}) intent = event['sessionState']['intent'] slots = intent['slots'] input_transcript = event.get('inputTranscript', '') # 通用响应生成函数 def elicit_slot(slot_to_elicit, message_content): return { "sessionState": { "dialogAction": { "type": "ElicitSlot", "slotToElicit": slot_to_elicit }, "intent": intent, "sessionAttributes": session_attributes }, "messages": [ { "contentType": "PlainText", "content": message_content } ] } def delegate(): return { "sessionState": { "dialogAction": { "type": "Delegate" }, "intent": intent, "sessionAttributes": session_attributes } } # 1. 校验priority插槽取值是否在1-5范围内 if slots.get('priority') and slots['priority'] is not None: priority_val = int(slots['priority']['value']['interpretedValue']) if priority_val < 1 or priority_val >5: slots['priority'] = None return elicit_slot('priority', '优先级请输入1-5之间的数字,请重新输入:') # 2. 采集description任意文本的核心逻辑 if slots.get('description') is None: # 判断当前是否正在询问description插槽 if event['proposedNextState']['dialogAction'].get('slotToElicit') == 'description': # 直接把用户整段输入作为description的值 slots['description'] = { "value": { "originalValue": input_transcript, "interpretedValue": input_transcript, "resolvedValues": [input_transcript] } } # 填充完成后交回Lex继续后续流程 return delegate() # 如果还没到询问description的步骤,交回Lex正常推进 return delegate() # 所有插槽采集完成,交回Lex执行后续 fulfill 逻辑 return delegate()
功能验证步骤
- 部署上述Lambda代码后,进入Lex控制台测试窗口
- 触发你的意图后,按提示输入name、priority,当Lex询问description的内容时,你输入任意长度的文本都可以被完整捕获存入description插槽
- 你可以在测试窗口的「详细信息」中查看插槽的最终采集结果,确认inputTranscript的内容已经完整写入description字段
内容的提问来源于stack exchange,提问作者Jeet Bardapurkar
相关产品推荐
相关产品推荐

