Accès aux données contextuelles dans la boîte de dialogue

Le contexte est un objet qui contient des variables qui persistent tout au long d'une conversation et qui peuvent être partagées par le dialogue et l'application client. Le dialogue et l'application client peuvent lire et écrire des variables contextuelles.

Vous pouvez choisir si vous souhaitez que le contexte soit géré par votre application ou par le service watsonx Assistant :

  • Si vous utilisez l'API message v2 avec état, le contexte est automatiquement géré par l'assistant session par session. Votre application doit explicitement créer une session au début de chaque conversation. Le contexte est stocké par le service dans le cadre de la session et n'est pas renvoyé dans les réponses aux messages sauf si vous le demandez. Pour plus d'informations, voir la référence API v2.

  • Si vous utilisez l'API message v2 sans état (ou l'API message v1 existante), votre application est chargée du stockage du contexte après chaque échange de conversation et le renvoie au service avec le message suivant. Pour une application complexe, ou une application ayant besoin de stocker des informations identifiant la personne, vous pouvez choisir de stocker le contexte dans une base de données.

    Un ID session est automatiquement généré au début de la conversation, mais aucune donnée de session n'est stockée par le service. Avec l'API message sans état, le contexte est toujours inclus avec chaque réponse de message. Pour plus d'informations, voir la référence API v2.

Important : Le contexte permet notamment de spécifier un identifiant unique pour chaque utilisateur qui interagit avec l'assistant. Pour les plans basés sur l'utilisateur, cet identifiant est utilisé à des fins de facturation. Pour plus d'informations, voir Plans basés sur l'utilisateur : explication.

Il existe deux types de contexte :

  • Contexte global: variables de contexte partagées par toutes les compétences utilisées par un assistant, y compris les variables internes du système utilisées pour gérer le flux de la conversation. Le contexte global comprend l'identifiant de l'utilisateur et d'autres valeurs globales telles que le fuseau horaire et la langue de l'assistant.

  • Contexte spécifique à une compétence : variables contextuelles spécifiques à une compétence particulière, y compris les variables définies par l'utilisateur nécessaires à votre application. Actuellement, une seule compétence (nommée main skill) est prise en charge.

Les variables de contexte définies par l'utilisateur que vous spécifiez dans un nœud de dialogue font partie de l'objet user_defined dans le contexte de compétences lorsqu'on y accède à l'aide de l'API. Cette structure diffère de la structure context qui apparaît dans l'éditeur JSON de l'interface utilisateur watsonx Assistant Par exemple, vous pouvez spécifier le code suivant dans l'éditeur JSON :

"context": {
  "my_context_var": "this is the value"
}

Dans l'API v2, vous pouvez accéder à cette variable définie par l'utilisateur comme suit :

"context": {
  "skills": {
    "main skill": {
      "user_defined": {
        "my_context_var": "this is the value"
      }
    }
  }
}

Pour plus d'informations sur l'accès aux variables de contexte à l'aide de l'API, voir la référence de l'API v2.

Example

L'exemple suivant montre une requête /message avec état qui inclut des variables de contexte globales et spécifiques à la compétence ; il utilise également la propriété options.return_context pour demander que le contexte soit renvoyé avec la réponse. Cette option n'est applicable que si vous utilisez la méthode stateful message, car la méthode stateless message renvoie toujours le contexte.

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);

Dans cet exemple de demande, l'application spécifie une valeur pour user_id dans le cadre du contexte global. En outre, elle définit une variable contextuelle définie par l'utilisateur (account_number) dans le cadre du contexte spécifique à la compétence. Les noeuds de dialogue peuvent accéder à cette variable contextuelle sous la forme $account_number.

Vous pouvez spécifier n'importe quel nom de variable que vous souhaitez utiliser pour une variable contextuelle définie par l'utilisateur. Si la variable spécifiée existe, elle est remplacée par la nouvelle valeur ; sinon, une nouvelle variable est ajoutée au contexte.

La sortie de cette requête inclut non seulement la sortie habituelle, mais également le contexte, indiquant que les valeurs spécifiées ont été ajoutées. Si vous utilisez la méthode message sans état, ces données contextuelles doivent être stockées localement et renvoyées au service watsonx Assistant dans le message suivant. Si vous utilisez la méthode stateful message, ce contexte est stocké automatiquement et persiste pendant toute la durée de la session.

{
  "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"
        }
      }
    }
  }
}

Restauration de l'état de conversation

Dans certaines situations, vous souhaiterez avoir la possibilité de restaurer une conversation à un état antérieur.

Vous pouvez utiliser l'option export sur des demandes message avec état pour indiquer que vous souhaitez que l'objet contextuel de la réponse inclut des données d'état de session complètes. Si vous spécifiez true pour cette option, le contexte de compétence renvoyé inclut une propriété state codée qui représente l'état actuel de la conversation.

Si vous utilisez l'API message avec état, le service stocke les données d'état de conversation uniquement pour la durée de vie de la session. Toutefois, si vous sauvegardez ces données de contexte (y compris state ) et les renvoyez au service avec une demande de message ultérieure, vous pouvez restaurer la conversation dans le même état, même si la session originale a expiré ou a été supprimée.

Si vous utilisez l'API message sans état, la propriété state est toujours incluse dans les réponses (avec le reste de context). Bien que les sessions sans état n'expirent pas, vous pouvez toujours utiliser ces données d'état pour réinitialiser une conversation à un état antérieur.