基于Amazon Lex与Lambda开发聊天机器人意图实现代码排障求助
Amazon Lex 聊天机器人Lambda代码问题修复
已定位的代码错误
- 空指针异常:所有读取槽位
value.originalValue的逻辑都未做非空校验,槽位未填充时直接访问子属性会直接触发运行时错误,这就是NULL值处理异常的核心原因 - 槽位询问逻辑颠倒:判断
faculty_name为空时,配置的待询问槽位SlotToElicit错填为course_name,根本不会按设计先向用户询问faculty信息 - 拼写错误:对话完成的动作类型错写为
Cose,Lex可识别的正确枚举值为Close - 槽位名大小写不匹配:判断课程名时引用的槽位名为大写开头的
Course_name,和之前定义的小写开头course_name不一致,会导致读不到用户输入的课程值 - 状态值格式错误:意图完成状态写为带尾部空格的
"fulfilled ",Lex无法识别为合法的完成状态 - 会话上下文丢失:所有返回的intent结构中未携带已收集的slots集合,会导致之前用户输入的槽位值被清空
- 槽位校验顺序错误:未等faculty、course两个槽位都收集完成,就直接读取course_name的值做判断,会提前触发空指针
- Greeting意图逻辑异常:触发问候意图后返回
ElicitIntent动作,且未对user_name槽位做非空校验,容易触发空值错误
修正后代码
exports.handler = async (event) => { const intentName = event.sessionState.intent.name; const slots = event.sessionState.intent.slots; // Greeting意图处理 if(intentName === "Greeting"){ // 增加空值兜底,避免NULL报错 const userName = slots.user_name?.value?.originalValue || "there"; return { "sessionState": { "dialogAction": { "type": "Delegate" }, "intent": { "name": "Greeting", "state": "Fulfilled", "slots": slots } }, "messages": [{ "contentType": "PlainText", "content": `Hi ${userName}, How can I help you?` }] } } // Course意图处理 if(intentName === "Course"){ // 第一步:先询问faculty_name if(!slots.faculty_name?.value?.originalValue){ return { "sessionState": { "dialogAction": { "slotToElicit": "faculty_name", "type": "ElicitSlot" }, "intent": { "name": "Course", "state": "InProgress", "slots": slots } }, "messages": [{ "contentType": "PlainText", "content": "Please provide your faculty name first." }] } } // 第二步:faculty收集完后询问course_name if(!slots.course_name?.value?.originalValue){ return { "sessionState": { "dialogAction": { "slotToElicit": "course_name", "type": "ElicitSlot" }, "intent": { "name": "Course", "state": "InProgress", "slots": slots } }, "messages": [{ "contentType": "PlainText", "content": "Please provide your course name." }] } } // 第三步:两个槽位都收集完成后做fulfillment判断 const courseValue = slots.course_name.value.originalValue.toLowerCase(); if(courseValue === "software engineering"){ return { "sessionState": { "dialogAction": { "type": "Close" }, "intent": { "name": "Course", "state": "Fulfilled", "slots": slots } }, "messages": [{ "contentType": "PlainText", "content": "The Software Engineering course has 6 modules in total." // 可替换为实际要返回的模块数内容 }] } } } };
修复说明
- 所有槽位读取都用可选链
?.做空值兜底,彻底解决NULL值访问报错问题 - 调整了槽位询问顺序,先收集faculty再收集course,和设计逻辑一致
- 修正了所有拼写、大小写、状态值格式错误
- 所有返回的intent结构都携带当前slots集合,避免会话上下文丢失
- 增加了槽位询问的提示文案,交互逻辑更完整
内容的提问来源于stack exchange,提问作者Yosra Bader
相关产品推荐
相关产品推荐

