Acceso a los datos de contexto en el diálogo
El contexto es un objeto que contiene variables que persisten a lo largo de una conversación y pueden ser compartidas por el diálogo y la aplicación cliente. Tanto el diálogo como la aplicación cliente pueden leer y escribir variables de contexto.
Puede elegir si desea que su aplicación pueda mantener el contexto o el servicio watsonx Assistant:
-
Si utiliza la API v2
messagecon estado, el asistente mantiene automáticamente el contexto para cada sesión. La aplicación debe crear explícitamente una sesión al principio de cada conversación. El servicio almacena el contexto como parte de la sesión y no se devuelve en las respuestas de mensaje a menos que lo solicite. Para más información, consulte la Referencia de la API v2. -
Si utiliza la API v2
messagesin estado (o la API v1messageheredada), la aplicación es responsable de almacenar el contexto después de cada turno de conversación y de enviarlo de nuevo al servicio con el siguiente mensaje. En el caso de una aplicación compleja o una aplicación que necesita almacenar información de identificación personal, puede elegir almacenar el contexto en una base de datos.Al principio de la conversación, se genera automáticamente un ID de sesión, pero el servicio no almacena datos de sesión. Con la API
messagesin estado, el contexto siempre se incluye con cada respuesta de mensaje. Para más información, consulte la Referencia de la API v2.
Importante: Un uso del contexto es especificar un ID de usuario único para cada usuario que interactúa con el asistente. Para planes basados en usuario, este ID se utiliza para la facturación. Para obtener más información, consulte Explicación sobre los planes basados en usuarios.
Hay dos tipos de contexto:
-
Contexto global: variables de contexto que comparten todas las habilidades que utiliza un asistente, incluidas las variables internas del sistema que se utilizan para gestionar el flujo de la conversación. El contexto global incluye el ID de usuario y otros valores globales como la zona horaria y el idioma del asistente.
-
Contexto específico de conocimiento: variables de contexto específicas de un conocimiento en particular, incluidas las variables definidas por el usuario que necesita la aplicación. Actualmente solo se da soporte a un conocimiento (denominada
main skill).
Las variables de contexto definidas por el usuario que se especifican en un nodo de diálogo forman parte del objeto user_defined dentro del contexto de habilidad cuando se accede a él utilizando la API. Esta estructura difiere de
la estructura context que aparece en el editor JSON de la interfaz de usuario watsonx Assistant. Por ejemplo, puede especificar el siguiente código en el editor JSON:
"context": {
"my_context_var": "this is the value"
}
En la API v2, puede acceder a esta variable definida por el usuario de la forma siguiente:
"context": {
"skills": {
"main skill": {
"user_defined": {
"my_context_var": "this is the value"
}
}
}
}
Para obtener más información sobre cómo acceder a las variables de contexto mediante la API, consulte la Referencia de la API v2.
Ejemplo
El siguiente ejemplo muestra una solicitud con estado /message que incluye variables de contexto globales y específicas de la habilidad; también utiliza la propiedad options.return_context para solicitar que el contexto
se devuelva con la respuesta. Esta opción sólo es aplicable si se utiliza el método con estado message, ya que el método sin estado message siempre devuelve el contexto.
service
.message({
assistant_id: '{assistant_id}',
session_id: '{session_id}',
input: {
message_type: 'text',
text: 'Hello',
options: {
'return_context': true
}
},
context: {
'global': {
'system': {
'user_id': 'my_user_id'
}
},
'skills': {
'main skill': {
'user_defined': {
'account_number': '123456'
}
}
}
}
})
.then(res => {
console.log(JSON.stringify(res, null, 2));
})
.catch(err => {
console.log(err);
});
response=service.message(
assistant_id='{assistant_id}',
session_id='{session_id}',
input={
'message_type': 'text',
'text': 'Hello',
'options': {
'return_context': True
}
},
context={
'global': {
'system': {
'user_id': 'my_user_id'
}
},
'skills': {
'main skill': {
'user_defined': {
'account_number': '123456'
}
}
}
}
).get_result()
print(json.dumps(response, indent=2))
MessageInputOptions inputOptions = new MessageInputOptions.Builder()
.returnContext(true)
.build();
MessageInput input = new MessageInput.Builder()
.messageType("text")
.text("Hello")
.options(inputOptions)
.build();
// create global context with user ID
MessageContextGlobalSystem system = new MessageContextGlobalSystem.Builder()
.userId("my_user_id")
.build();
MessageContextGlobal globalContext = new MessageContextGlobal.Builder()
.system(system)
.build();
// build user-defined context variables, put in skill-specific context for main skill
Map<String, Object> userDefinedContext = new HashMap<>();
userDefinedContext.put("account_number","123456");
MessageContextSkill mainSkillContext = new MessageContextSkill.Builder()
.userDefined(userDefinedContext)
.build();
Map<String, MessageContextSkill> skillsContext = new HashMap<>();
skillsContext.put("main skill", mainSkillContext);
MessageContext context = new MessageContext.Builder()
.global(globalContext)
.skills(skillsContext)
.build();
MessageOptions options = new MessageOptions.Builder()
.assistantId("{assistant_id}")
.sessionId("{session_id}")
.input(input)
.context(context)
.build();
MessageResponse response = service.message(options).execute().getResult();
System.out.println(response);
En esta solicitud de ejemplo, la aplicación especifica un valor para user_id como parte del contexto global. Además, establece una variable de contexto definida por el usuario (account_number) como parte del contexto
específico del conocimiento. Los nodos del diálogo pueden acceder a esta variable de contexto como $account_number.
Puede especificar cualquier nombre de variable que desee utilizar para una variable de contexto definida por el usuario. Si la variable especificada existe, se sobrescribe con el nuevo valor; si no, se añade una nueva variable al contexto.
La salida de esta solicitud incluye no solo la salida habitual, sino también el contexto, que muestra que se han añadido los valores especificados. Si utiliza el método message sin estado, estos datos de contexto se deben almacenar
localmente y se deben volver a enviar al servicio watsonx Assistant como parte del siguiente mensaje. Si se utiliza el método stateful message, este contexto se almacena automáticamente y persiste durante toda la sesión.
{
"output": {
"generic": [
{
"response_type": "text",
"text": "Welcome to the watsonx Assistant example!"
}
],
"intents": [
{
"intent": "hello",
"confidence": 1
}
],
"entities": []
},
"user_id": "my_user_id",
"context": {
"global": {
"system": {
"turn_count": 1,
"user_id": "my_user_id"
}
},
"skills": {
"main skill": {
"user_defined": {
"account_number": "123456"
}
}
}
}
}
Restauración del estado de la conversación
En algunos casos, tal vez sea conveniente restaurar una conversación a un estado anterior.
Puede utilizar la opción export en las solicitudes message con estado para especificar que desea que el objeto de contexto en la respuesta incluya datos de estado de sesión completos. Si especifica true para esta opción, el contexto de conocimiento devuelto incluye una propiedad state codificada que representa el estado de conversación actual.
Si utiliza la API message con estado, el servicio almacena datos de estado de la conversación solamente durante el tiempo de duración de la sesión. Sin embargo, si guardas estos datos de contexto (incluyendo state )
y los envías de vuelta al servicio con una petición de mensaje posterior, puedes restaurar la conversación al mismo estado, incluso si la sesión original expiró o fue borrada.
Si utiliza la API message sin estado, la propiedad state siempre se incluye en las respuestas (junto con el resto de context). Aunque las sesiones sin estado no caducan, puede seguir utilizando estos datos
de estado para restablecer una conversación a un estado anterior.