You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 15:31:57