【问题标题】:Dialogflow CX | How to close/reset a conversation对话流 CX |如何关闭/重置对话
【发布时间】:2021-09-23 15:55:42
【问题描述】:

如何通过 Java 应用程序以编程方式关闭或重置对话?根据 Dialogflow CX 文档“会话保持活动状态,其数据在会话的最后一次请求发送后存储 30 分钟。

我想让会话保持活动的时间更短。例如,如果我希望会话处于活动状态 5 分钟,当用户在最后一条消息后 5 分钟或更长时间发送消息时,必须重新开始对话,并且必须关闭之前的流程并必须删除上下文参数。

Dialogflow ES 可以使用 ContextsClient,但是新版本不提供 ContextsClient 类。

【问题讨论】:

    标签: dialogflow-cx


    【解决方案1】:

    Dialogflow CX 使用 State Handlers 来控制对话路径,这与使用 Contexts 的 Dialogflow ES 不同。

    对于 Dialogflow CX,您可以使用 END_SESSION symbolic transition target 结束当前会话。一旦调用了 END_SESSION 转换目标,它就会清除当前会话,并且下一次用户输入将在 Default Start Flowstart page 处重新启动会话。

    要实现您想要的用例,您必须为其创建自己的实现。请注意,仅当您将 Dialogflow CX 代理集成到自定义前端时,以下解决方案才有效。

    首先,您应该将Event Handler 添加到您的所有Pages - 以便在对话流的任何部分都可以访问事件处理程序。在此事件处理程序中,定义一个自定义事件 - 例如:clearsession。然后,将其 Transition 设置为 End Session 页面。一旦调用了 clearsession 事件,它将结束当前会话。

    然后,使用您自己的业务逻辑,您可以创建一个自定义函数,作为每个用户查询的计时器。一旦计时器达到 5 分钟,您的自定义应用程序应以编程方式向您的 CX 代理发送detectIntent request。此 detectIntent 请求必须包含当前会话 ID 和自定义事件(来自先前创建的事件处理程序)。

    这是一个示例 detectIntent 请求,它使用 Java Client Library 调用自定义事件:

    // [START dialogflow_cx_detect_intent_event]
     
    import com.google.api.gax.rpc.ApiException;
    import com.google.cloud.dialogflow.cx.v3.*;
    import com.google.common.collect.Maps;
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
     
    public class DetectIntent {
     
        // DialogFlow API Detect Intent sample with event input.
        public static Map<String, QueryResult> detectIntentEvent(
                String projectId,
                String locationId,
                String agentId,
                String sessionId,
                String languageCode,
                String event)
                throws IOException, ApiException {
            SessionsSettings.Builder sessionsSettingsBuilder = SessionsSettings.newBuilder();
            if (locationId.equals("global")) {
                sessionsSettingsBuilder.setEndpoint("dialogflow.googleapis.com:443");
            } else {
                sessionsSettingsBuilder.setEndpoint(locationId + "-dialogflow.googleapis.com:443");
            }
            SessionsSettings sessionsSettings = sessionsSettingsBuilder.build();
     
            Map<String, QueryResult> queryResults = Maps.newHashMap();
            // Instantiates a client
            try (SessionsClient sessionsClient = SessionsClient.create(sessionsSettings)) {
                // Set the session name using the projectID (my-project-id), locationID (global), agentID
                // (UUID), and sessionId (UUID).
                SessionName session = SessionName.of(projectId, locationId, agentId, sessionId);
                System.out.println("Session Path: " + session.toString());
     
                EventInput.Builder eventInput = EventInput.newBuilder().setEvent(event);
     
                // Build the query with the EventInput and language code (en-US).
                QueryInput queryInput =
                        QueryInput.newBuilder().setEvent(eventInput).setLanguageCode(languageCode).build();
     
                // Build the DetectIntentRequest with the SessionName and QueryInput.
                DetectIntentRequest request =
                        DetectIntentRequest.newBuilder()
                                .setSession(session.toString())
                                .setQueryInput(queryInput)
                                .build();
     
                // Performs the detect intent request.
                DetectIntentResponse response = sessionsClient.detectIntent(request);
     
                // Display the query result.
                QueryResult queryResult = response.getQueryResult();
     
                System.out.println("====================");
                System.out.format(
                        "Detected Intent: %s (confidence: %f)\n",
                        queryResult.getIntent().getDisplayName(), queryResult.getIntentDetectionConfidence());
     
     
            }
            return queryResults;
        }
     
        public static void main(String[] args) {
            String projectId = "<project-id>";
            String locationId = "<location-id>";
            String agentId = "<agent-id>";
            String sessionId = "<current-session-id>";
            String languageCode = "<language-code>";
            String event = "clearsession";
            try{
                detectIntentEvent(projectId,locationId,agentId,sessionId, languageCode, event);
            } catch (IOException e){
                System.out.println(e.getMessage());
            }
        }
    }
    // [END dialogflow_cx_detect_intent_event]
    

    【讨论】:

    • 谢谢。这正是我需要的。
    猜你喜欢
    • 2022-06-17
    • 2020-06-20
    • 2023-02-03
    • 2019-08-13
    • 2011-02-25
    • 2011-01-31
    • 2018-01-04
    • 2012-12-13
    相关资源
    最近更新 更多