如何在AWS Lex中访问原始输入文本与完整对话?
关于AWS Lex获取原始输入与完整对话的解决方案
我来帮你梳理下更简洁的实现方式,不用绕API Gateway和额外Lambda的弯路:
1. 获取触发意图的原始输入文本
其实根本不用额外做前置捕获——Lex在调用意图处理Lambda的时候,已经把用户的原始输入直接传给你了:
- 对于Lex V1,你可以直接从Lambda事件的
inputTranscript字段拿到用户的原始输入,不管Lex有没有解析出槽位或者匹配到意图,这个值都是用户实际输入的内容:def lambda_handler(event, context): original_user_input = event['inputTranscript'] # 这里可以直接记录或者使用原始输入 - 如果是Lex V2,结构略有调整,但顶层同样有
inputTranscript字段,用法完全一致:def lambda_handler(event, context): original_user_input = event['inputTranscript'] # 后续处理逻辑
2. 获取包含用户输入和Lex响应的完整对话
你可以利用Lex的**会话属性(sessionAttributes)**来维护对话历史,不用额外搭建服务:
- 每次处理意图时,先从Lambda事件里取出已有的会话属性(如果是首次会话就初始化一个空的对话列表);
- 把当前用户的输入追加到对话历史,处理完业务逻辑生成Lex响应后,再把响应内容也追加进去;
- 最后把更新后的对话历史存回会话属性,这样后续的会话就能拿到完整的对话记录。
举个Python的示例:
def lambda_handler(event, context): # 1. 获取当前用户的原始输入 user_input = event['inputTranscript'] # 2. 取出已有的对话历史,没有则初始化空列表 session_attrs = event.get('sessionAttributes', {}) conversation_history = session_attrs.get('conversation', []) # 3. 追加用户输入到历史 conversation_history.append({"role": "user", "content": user_input}) # 4. 处理业务逻辑,生成Lex响应内容 response_content = "这是Lex返回给用户的响应消息" # 5. 追加Lex响应到历史 conversation_history.append({"role": "lex", "content": response_content}) # 6. 把更新后的对话历史存回会话属性 session_attrs['conversation'] = conversation_history # 7. 返回标准的Lex响应 return { "sessionAttributes": session_attrs, "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": response_content } } }
- 如果需要持久化对话记录(比如长期保存),可以在同一个Lambda里直接对接DynamoDB,每次处理时把对话历史写入数据库,这样即使会话结束也能留存完整记录。
对比你之前考虑的前置API Gateway方案,这种方式更直接,完全利用Lex本身的能力就能实现需求,不用额外的服务链路。
内容的提问来源于stack exchange,提问作者Shachaf.Gortler
相关产品推荐
相关产品推荐

