Amazon Lex Bot 仅适用于使用 AWS Mobile Hub 制作的示例应用程序中的语音到语音演示

Amazon Lex Bot only works in Speech to Speech Demo in Sample App Made with AWS Mobile Hub

我在 AWS Mobile Hub 中创建了一个项目,并尝试将 Lex 对话机器人部署到该应用程序中。我正在使用 Android Studio。我遇到了其中一个机器人的问题。该机器人是一个简单的 FAQ 聊天机器人,它使用 Lambda 代码挂钩实现 post 回答用户问题。

该机器人在 Lex 控制台和 Slack 频道中完美运行。然而,在示例应用程序中,它 仅适用于语音到语音演示 当我尝试文本到文本演示时,机器人从不响应用户输入并且应用经常崩溃。

我下载并测试了几个集成了不同机器人的示例应用程序。所有没有 lambda 代码挂钩的机器人在文本和语音演示中都能完美运行。但是,具有 lambda 代码挂钩的机器人只能在语音演示中使用。

编辑:我再次尝试并发现带有 lambda 代码挂钩的机器人会响应,但前提是响应委托给 Lex 并且来自控制台中设置的配置,或者响应来自 Lambda 输入验证代码钩。当预期响应来自 Lambda fulfillment 代码挂钩(使用 PostContent 运行时 API 操作)时,它不会响应。

我想我的 Lambda 函数可能写错了,所以我还使用示例 OrderFlowers 机器人及其示例代码挂钩进行了测试,并得到了相同的结果。

注意 Lambda 函数没有抛出调用错误,所有调用都已成功处理,但没有出现响应。

关于如何成功地使文本履行响应起作用有什么想法吗?

尝试将 ConversationalBotTextFragment.java 中的 promptUserToRespond 更新为以下内容:

public void promptUserToRespond(Response response, LexServiceContinuation continuation) {

    if(!DialogState.ReadyForFulfillment.toString().equals(response.getDialogState()) && !DialogState.Fulfilled.toString().equals(response.getDialogState())) {
        addMessage(new TextMessage(response.getTextResponse(), "rx", getCurrentTimeStamp()));

        readUserText(continuation);
    }
    else if(DialogState.Fulfilled.toString().equals(response.getDialogState())) {
        addMessage(new TextMessage(response.getTextResponse(), "rx", getCurrentTimeStamp()));

        inConversation = false;
    }
}

崩溃可能是因为 inConversation 未设置为 false,并且此方法未针对 "Fulfilled" 状态打印任何内容。我们正在讨论在 SDK 中执行此操作的更好方法,但目前应该可行。

凯文

通过执行以下操作,我能够让我的 FAQ 机器人在示例应用程序的文本部分工作:

我听从了 KevinR 的建议,将 ConversationBotTextFragment.java 中的 promptUserToRespond 更新为以下内容(重写,以便将完整的答案放在一个地方):

    public void promptUserToRespond(Response response,
                                    LexServiceContinuation continuation) {

        if(!DialogState.ReadyForFulfillment.toString().equals(response.getDialogState())
                && !DialogState.Fulfilled.toString().equals(response.getDialogState())) {
            addMessage(new TextMessage(response.getTextResponse(), "rx", getCurrentTimeStamp()));

            readUserText(continuation);
        }
        else if(DialogState.Fulfilled.toString().equals(response.getDialogState())) {
            addMessage(new TextMessage(response.getTextResponse(), "rx", getCurrentTimeStamp()));

            inConversation = false;
        }
    }

这样做之后,我成功地从我的机器人那里得到了回复,但是每次输入一个新的用户问题时,之前的文本都会消失。我认为我遇到此问题的原因是我的常见问题解答机器人会通过 Lambda 执行挂钩向用户发布关闭消息来为用户提供答案。发布关闭消息时,对话结束并调用 startNewConversation() 方法,清除之前对话的所有消息。

为了解决这个问题,我做了以下事情:

我在 ConversationBotTextFragment.java 中创建了一个新方法(该方法与 startNewConversation() 方法相同,只是它不清除对话)。这是说方法:

private void ContinueConversationAfterFulfillment() {
    Log.d(TAG, "Starting new conversation");
    inConversation = false;
    clearTextInput();
}

并将 textEntered() 中的 startNewConversation() 调用替换为 ContinueConversationAfterFulfillment() 的调用。