Conectores de conocimiento

Los conectores de conocimiento complementan los intents definidos. Analizan documentos de conocimientos (por ejemplo, preguntas frecuentes o artículos) para encontrar respuestas automatizadas. Para configurarlos, debe definir una o varias bases de conocimientos, que son colecciones de documentos de conocimientos.

Puedes habilitar bases de conocimientos para tu agente, de modo que todas las solicitudes de detección de intención puedan encontrar respuestas automatizadas mediante tus bases de conocimientos. También puede especificar una o varias bases de conocimientos en sus solicitudes individuales de detección de intención.

Es habitual que un agente que usa conectores de conocimientos también use intents definidos. Los conectores de conocimientos ofrecen menos precisión y control en las respuestas que las intenciones. Debes definir tus intents para gestionar solicitudes de usuario complejas y dejar que los conectores de conocimientos gestionen las solicitudes sencillas.

Para ver una lista de los idiomas admitidos, consulta la columna Knowledge Connectors de la referencia de idiomas.

Limitaciones

La función de conectores de conocimientos solo está disponible en la global región.

Habilitar funciones beta

Asegúrate de que las funciones beta estén habilitadas:

  1. Ve a la consola de Dialogflow ES.
  2. Selecciona un agente.
  3. Haz clic en el botón de configuración situado junto al nombre del agente.
  4. En la pestaña General, desplázate hacia abajo y comprueba que la opción Funciones beta esté habilitada.
  5. Si has hecho algún cambio, haz clic en Guardar.

Crear una base de conocimientos y un documento

Sigue las instrucciones de la guía de bases de conocimientos para crear una base de conocimientos y un documento.

Ajustes de conectores de conocimiento

Puedes habilitar o inhabilitar bases de conocimientos para tu agente. Las bases de conocimientos habilitadas se tendrán en cuenta en todas las solicitudes de coincidencia de intents que no especifiquen bases de conocimientos. Para habilitar o inhabilitar bases de conocimientos, sigue estos pasos:

  1. Ve a la consola de Dialogflow ES.
  2. Selecciona un agente.
  3. En el menú de la barra lateral de la izquierda, haz clic en Conocimiento.
  4. Seleccione una o varias bases de conocimientos de la lista.
  5. Haz clic en Habilitar o Inhabilitar.

Cuando una expresión de usuario final también coincide con una intención, puedes especificar cuánto prefieres los resultados de conocimiento:

  1. Desplázate hacia abajo hasta la sección Ajustar preferencia de resultados de conocimientos.
  2. Ajusta el control deslizante de más débil (se da prioridad a la intención) a más fuerte (se da prioridad al conocimiento). Para obtener más información, consulta la sección Respuestas de detección de intención que se encuentra más abajo.

Configurar respuestas

De forma predeterminada, una base de conocimientos se configura con una sola respuesta de texto predeterminada que se rellena con la respuesta de la base de conocimientos que mejor se ajusta. Puedes cambiar esta respuesta y añadir mensajes de respuesta enriquecida. Las respuestas de la base de conocimientos pueden contener hasta tres respuestas por base de conocimientos, y puedes hacer referencia a estas respuestas en las respuestas configuradas. Para añadir respuestas:

  1. En la página Conocimientos, haz clic en el nombre de tu base de conocimientos.
  2. Desplázate hacia abajo hasta la sección Respuestas y añade las que quieras:
    1. Cuando definas la primera respuesta, usa $Knowledge.Question[1] y $Knowledge.Answer[1] donde quieras que se proporcionen la pregunta y la respuesta.
    2. El índice de $Knowledge.Question y $Knowledge.Answer empieza en 1, así que aumenta este índice cuando añadas más respuestas.
  3. Cuando haya terminado de editar, haga clic en Guardar.

Cuando definas respuestas, ten en cuenta estos aspectos:

  • Si el número de respuestas definidas es mayor que el número N de coincidencias de respuestas del conector de conocimientos, solo se devolverán N respuestas.
  • Dado que la precisión podría ser inferior a la de las intenciones definidas explícitamente, te recomendamos que devuelvas tres respuestas a tus usuarios siempre que sea posible.

Ejemplo:

Captura de pantalla de la integración de conectores de conocimiento

Detectar intents con una base de conocimientos

Cuando hagas una solicitud para detectar la intención, puedes especificar una o varias bases de conocimientos para obtener una posible respuesta. Si se proporcionan bases de conocimientos de forma explícita en una solicitud, se anulan los ajustes de las bases de conocimientos habilitadas e inhabilitadas.

En los ejemplos siguientes se muestra cómo usar la consola de Dialogflow, la API REST (incluida la línea de comandos) o las bibliotecas de cliente para detectar intenciones. Para usar la API, llama al método detectIntent en el tipo Sessions.

UI web

Puedes interactuar con el agente y recibir respuestas del conector de conocimientos a través del simulador de Dialogflow:

  1. Sigue los pasos anteriores para habilitar una base de conocimientos.
  2. Sigue los pasos anteriores para definir las respuestas.
  3. Escribe "¿Cómo me registro?" en el simulador.

REST

Llama al método detectIntent en el tipo Sessions y especifica la base de conocimientos en el campo queryParams.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto de GCP
  • KNOWLEDGE_BASE_ID: el ID de tu base de conocimientos

Método HTTP y URL:

POST https://dialogflow.googleapis.com/v2beta1/projects/PROJECT_ID/agent/sessions/123456789:detectIntent

Cuerpo JSON de la solicitud:

{
 "queryInput": {
   "text": {
     "text": "How do I sign up?",
     "languageCode": "en-US"
   }
 },
 "queryParams": {
   "knowledgeBaseNames": ["projects/PROJECT_ID/knowledgeBases/KNOWLEDGE_BASE_ID"]
 }
}

Para enviar tu solicitud, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

{
  ...
  "queryResult": {
    "queryText": "How do I sign up?",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentText": "Sign up for Cloud Storage by turning on the Cloud Storage service in the Google Cloud Platform Console.",
    "intent": {
      "name": "projects/my-gcp-project/agent/intents/487c7242-a769-408a-a339-47b95e10dac4",
      "displayName": "Knowledge.KnowledgeBase.MzkzNTAyMDE3NDQxNDk3MDg4MA"
    },
    "intentDetectionConfidence": 0.99371547,
    "languageCode": "en-us",
    "knowledgeAnswers": {
      "answers": [
        {
          "answer": "Sign up for Cloud Storage by turning on the Cloud Storage service in the Google Cloud Platform Console.",
          "matchConfidenceLevel": "HIGH",
          "matchConfidence": 0.99371547
        },
        {
          "answer": "Certain types of content are not allowed on this service; please refer to the Terms of Services and Platform Policies for details. If you believe a piece of content is in violation of our policies, report it here (select See more products, then Google Cloud Storage and Cloud Bigtable).",
          "matchConfidenceLevel": "LOW",
          "matchConfidence": 0.0012244871
        },
        {
          "answer": "From the Cloud Storage documentation click \"Send feedback\" near the top right of the page. This will open a feedback form. Your comments will be reviewed by the Cloud Storage team.",
          "matchConfidenceLevel": "LOW",
          "matchConfidence": 0.0011537358
        }
      ]
    }
  }
}

Java

Para autenticarte en Dialogflow, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.


import com.google.api.gax.rpc.ApiException;
import com.google.cloud.dialogflow.v2beta1.DetectIntentRequest;
import com.google.cloud.dialogflow.v2beta1.DetectIntentResponse;
import com.google.cloud.dialogflow.v2beta1.KnowledgeAnswers;
import com.google.cloud.dialogflow.v2beta1.KnowledgeAnswers.Answer;
import com.google.cloud.dialogflow.v2beta1.QueryInput;
import com.google.cloud.dialogflow.v2beta1.QueryParameters;
import com.google.cloud.dialogflow.v2beta1.QueryResult;
import com.google.cloud.dialogflow.v2beta1.SessionName;
import com.google.cloud.dialogflow.v2beta1.SessionsClient;
import com.google.cloud.dialogflow.v2beta1.TextInput;
import com.google.common.collect.Maps;
import java.io.IOException;
import java.util.List;
import java.util.Map;

public class DetectIntentKnowledge {

  // DialogFlow API Detect Intent sample with querying knowledge connector.
  public static Map<String, KnowledgeAnswers> detectIntentKnowledge(
      String projectId,
      String knowledgeBaseName,
      String sessionId,
      String languageCode,
      List<String> texts)
      throws IOException, ApiException {
    // Instantiates a client
    Map<String, KnowledgeAnswers> allKnowledgeAnswers = Maps.newHashMap();
    try (SessionsClient sessionsClient = SessionsClient.create()) {
      // Set the session name using the sessionId (UUID) and projectID (my-project-id)
      SessionName session = SessionName.of(projectId, sessionId);
      System.out.println("Session Path: " + session.toString());

      // Detect intents for each text input
      for (String text : texts) {
        // Set the text and language code (en-US) for the query
        TextInput.Builder textInput =
            TextInput.newBuilder().setText(text).setLanguageCode(languageCode);
        // Build the query with the TextInput
        QueryInput queryInput = QueryInput.newBuilder().setText(textInput).build();

        QueryParameters queryParameters =
            QueryParameters.newBuilder().addKnowledgeBaseNames(knowledgeBaseName).build();

        DetectIntentRequest detectIntentRequest =
            DetectIntentRequest.newBuilder()
                .setSession(session.toString())
                .setQueryInput(queryInput)
                .setQueryParams(queryParameters)
                .build();
        // Performs the detect intent request
        DetectIntentResponse response = sessionsClient.detectIntent(detectIntentRequest);

        // Display the query result
        QueryResult queryResult = response.getQueryResult();

        System.out.format("Knowledge results:\n");
        System.out.format("====================\n");
        System.out.format("Query Text: '%s'\n", queryResult.getQueryText());
        System.out.format(
            "Detected Intent: %s (confidence: %f)\n",
            queryResult.getIntent().getDisplayName(), queryResult.getIntentDetectionConfidence());
        System.out.format(
            "Fulfillment Text: '%s'\n",
            queryResult.getFulfillmentMessagesCount() > 0
                ? queryResult.getFulfillmentMessages(0).getText()
                : "Triggered Default Fallback Intent");
        KnowledgeAnswers knowledgeAnswers = queryResult.getKnowledgeAnswers();
        for (Answer answer : knowledgeAnswers.getAnswersList()) {
          System.out.format(" - Answer: '%s'\n", answer.getAnswer());
          System.out.format(" - Confidence: '%s'\n", answer.getMatchConfidence());
        }

        KnowledgeAnswers answers = queryResult.getKnowledgeAnswers();
        allKnowledgeAnswers.put(text, answers);
      }
    }
    return allKnowledgeAnswers;
  }
}

Node.js

Para autenticarte en Dialogflow, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

// Imports the Dialogflow client library
const dialogflow = require('@google-cloud/dialogflow').v2beta1;
// Instantiate a DialogFlow client.
const sessionClient = new dialogflow.SessionsClient();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = 'ID of GCP project associated with your Dialogflow agent';
// const sessionId = `user specific ID of session, e.g. 12345`;
// const languageCode = 'BCP-47 language code, e.g. en-US';
// const knowledgeBaseId = `the ID of your KnowledgeBase`;
// const query = `phrase(s) to pass to detect, e.g. I'd like to reserve a room for six people`;

// Define session path
const sessionPath = sessionClient.projectAgentSessionPath(
  projectId,
  sessionId
);
const knowledgeBasePath =
  'projects/' + projectId + '/knowledgeBases/' + knowledgeBaseId + '';

// The audio query request
const request = {
  session: sessionPath,
  queryInput: {
    text: {
      text: query,
      languageCode: languageCode,
    },
  },
  queryParams: {
    knowledgeBaseNames: [knowledgeBasePath],
  },
};

const responses = await sessionClient.detectIntent(request);
const result = responses[0].queryResult;
console.log(`Query text: ${result.queryText}`);
console.log(`Detected Intent: ${result.intent.displayName}`);
console.log(`Confidence: ${result.intentDetectionConfidence}`);
console.log(`Query Result: ${result.fulfillmentText}`);
if (result.knowledgeAnswers && result.knowledgeAnswers.answers) {
  const answers = result.knowledgeAnswers.answers;
  console.log(`There are ${answers.length} answer(s);`);
  answers.forEach(a => {
    console.log(`   answer: ${a.answer}`);
    console.log(`   confidence: ${a.matchConfidence}`);
    console.log(`   match confidence level: ${a.matchConfidenceLevel}`);
  });
}

Python

Para autenticarte en Dialogflow, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

def detect_intent_knowledge(
    project_id, session_id, language_code, knowledge_base_id, texts
):
    """Returns the result of detect intent with querying Knowledge Connector.

    Args:
    project_id: The GCP project linked with the agent you are going to query.
    session_id: Id of the session, using the same `session_id` between requests
              allows continuation of the conversation.
    language_code: Language of the queries.
    knowledge_base_id: The Knowledge base's id to query against.
    texts: A list of text queries to send.
    """
    from google.cloud import dialogflow_v2beta1 as dialogflow

    session_client = dialogflow.SessionsClient()

    session_path = session_client.session_path(project_id, session_id)
    print("Session path: {}\n".format(session_path))

    for text in texts:
        text_input = dialogflow.TextInput(text=text, language_code=language_code)

        query_input = dialogflow.QueryInput(text=text_input)

        knowledge_base_path = dialogflow.KnowledgeBasesClient.knowledge_base_path(
            project_id, knowledge_base_id
        )

        query_params = dialogflow.QueryParameters(
            knowledge_base_names=[knowledge_base_path]
        )

        request = dialogflow.DetectIntentRequest(
            session=session_path, query_input=query_input, query_params=query_params
        )
        response = session_client.detect_intent(request=request)

        print("=" * 20)
        print("Query text: {}".format(response.query_result.query_text))
        print(
            "Detected intent: {} (confidence: {})\n".format(
                response.query_result.intent.display_name,
                response.query_result.intent_detection_confidence,
            )
        )
        print("Fulfillment text: {}\n".format(response.query_result.fulfillment_text))
        print("Knowledge results:")
        knowledge_answers = response.query_result.knowledge_answers
        for answers in knowledge_answers.answers:
            print(" - Answer: {}".format(answers.answer))
            print(" - Confidence: {}".format(answers.match_confidence))

Detectar respuestas de intents

La respuesta del método detectIntent del tipo Sessions es un DetectIntentResponse. Hay varios factores que influyen en cómo se rellenan los campos de respuesta.

Si tanto una intención definida como una base de conocimientos son posibles coincidencias, se utiliza la confianza de la coincidencia de cada una y la preferencia de resultados de conocimientos (consulta Configuración de conectores de conocimientos) para determinar cuál es la coincidencia seleccionada. La coincidencia seleccionada se rellena en el campo DetectIntentResponse.queryResult y otras posibles coincidencias se rellenan en el campo DetectIntentResponse.alternativeQueryResults. Ambos campos contienen mensajes QueryResult.

Si una base de conocimientos proporciona una coincidencia potencial:

  • QueryResult.knowledgeAnswers se rellena con una lista de posibles respuestas de conocimientos, ordenadas de mayor a menor confianza de coincidencia.
  • Si se han definido respuestas enriquecidas para la base de conocimientos, se rellenará con mensajes de respuesta enriquecidos.QueryResult.fulfillmentMessages

Al realizar una solicitud de detección de intención, es posible que la consulta de conocimientos falle. Cuando esto ocurre, se seleccionan las intenciones definidas, por lo que la solicitud de detección de intenciones general no falla. Puede encontrar información sobre los errores de las consultas de conocimientos en el campo DetectIntentResponse.alternativeQueryResults[i].diagnosticInfo.

Gestionar bases de conocimientos

Para obtener más información sobre cómo gestionar bases de conocimientos, consulta el artículo Gestionar bases de conocimientos.