对话流客户体验 |如何 close/reset 对话

Dialogflow CX | How to close/reset a conversation

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

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

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

Dialogflow CX 使用 State Handlers to control conversation paths, unlike Dialogflow ES which uses Contexts

对于 Dialogflow CX,您可以使用 END_SESSION symbolic transition target. Once the END_SESSION transition target is invoked, it clears the current session and the next user input will restart the session at the start page of the Default Start Flow.

结束当前会话

要实现您想要的用例,您必须为其创建自己的实现。请注意,以下解决方案仅在您将 Dialogflow CX 代理集成到自定义 front-end.

时才有效

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

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

这是一个示例 detectIntent request that invokes a custom event using the 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]