0

我在 AWS Mobile Hub 中创建了一个项目,并尝试将 Lex 对话机器人部署到应用程序中。我正在使用安卓工作室。我遇到了其中一个机器人的问题。这个机器人是一个简单的常见问题聊天机器人,它使用 Lambda 代码钩子实现来发布用户问题的答案。

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

我下载并测试了几个集成了不同机器人的示例应用程序。所有没有 lambda 代码挂钩的机器人都可以在文本和语音演示中完美运行。然而,具有 lambda 代码挂钩的机器人仅在语音演示中工作。

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

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

请注意,Lambda 函数不会引发调用错误,所有调用都已成功处理,但未出现响应。

关于如何成功获得文本履行响应的任何想法?

4

2 回答 2

1

通过执行以下操作,我能够让我的 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() 的调用。

于 2017-08-16T22:09:17.087 回答
0

尝试将 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,并且此方法没有为“已完成”状态打印任何内容。我们正在讨论在 SDK 中执行此操作的更好方法,但现在应该可以使用。

凯文

于 2017-08-16T16:43:59.177 回答