Accesso ai dati di contesto nella finestra di dialogo

Il contesto è un oggetto che contiene variabili che persistono durante la conversazione e che possono essere condivise dalla finestra di dialogo e dall'applicazione client. Sia il dialogo che l'applicazione client possono leggere e scrivere variabili di contesto.

Puoi decidere se vuoi che il contesto venga gestito dalla tua applicazione o dal servizio watsonx Assistant:

  • Se utilizzi l'API v2 message con stato, il contesto viene automaticamente gestito dall'assistente in base alla sessione. L'applicazione deve creare esplicitamente una sessione all'inizio di ogni conversazione. Il contesto viene memorizzato dal servizio come parte della sessione e non viene restituito nelle risposte del messaggio a meno che non venga richiesto. Per ulteriori informazioni, vedi la Guida di riferimento APIv2.

  • Se utilizzi l'API v2 message senza stato (o l'API v1 message legacy), la tua applicazione è responsabile dell'archiviazione del contesto dopo ogni turno di conversazione e del suo invio al servizio con il messaggio successivo. Per un'applicazione complessa o un'applicazione che deve memorizzare informazioni personali, è possibile scegliere di memorizzare il contesto in un database.

    Un ID sessione viene generato automaticamente all'inizio della conversazione, ma nessun dato di sessione viene memorizzato dal servizio. Con l'API message senza stato, il contesto è sempre incluso in ogni risposta del messaggio. Per ulteriori informazioni, vedi la Guida di riferimento APIv2.

Importante: Un uso del contesto è quello di specificare un ID utente unico per ogni utente che interagisce con l'assistente. Per i piani basati sull'utente, questo ID viene utilizzato a scopo di fatturazione. Per ulteriori informazioni, vedi Spiegazione dei piani basati sull'utente.

Esistono due tipi di contesto:

  • Contesto globale: variabili di contesto condivise da tutte le competenze utilizzate da un assistente, comprese le variabili di sistema interne utilizzate per gestire il flusso di conversazione. Il contesto globale include l'ID utente e altri valori globali come il fuso orario e la lingua dell'assistente.

  • Contesto specifico della capacità: le variabili di contesto specifiche per una particolare capacità, incluse le variabili definite dall'utente di cui necessita la tua applicazione. Attualmente, è supportata solo una capacità (denominata main skill).

Le variabili di contesto definite dall'utente che specifichi in un nodo di dialogo fanno parte dell'oggetto user_defined all'interno del contesto della capacità quando si accede utilizzando l'API. Questa struttura differisce dalla struttura context che appare nell'editor JSON nell'interfaccia utente watsonx Assistant. Ad esempio, è possibile specificare il seguente codice nell'editor JSON:

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

Nell'API v2, accedi a questa variabile definita dall'utente come segue:

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

Per ulteriori informazioni su come accedere alle variabili di contesto utilizzando l'API, consultare il Riferimento API v2.

Esempio

L'esempio seguente mostra una richiesta stateful /message che include variabili di contesto globali e specifiche per le abilità; utilizza anche la proprietà options.return_context per richiedere che il contesto venga restituito con la risposta. Questa opzione è applicabile solo se si sta utilizzando il metodo message con stato perché il metodo message senza stato restituisce sempre il contesto.

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

In questa richiesta di esempio, l'applicazione specifica un valore per user_id come parte del contesto globale. Inoltre, imposta una variabile di contesto definita dall'utente (account_number) come parte del contesto specifico della capacità. Puoi accedere a questa variabile di contesto dai nodi del dialogo come $account_number.

È possibile specificare qualsiasi nome di variabile da utilizzare per una variabile di contesto definita dall'utente. Se la variabile specificata esiste, viene sovrascritta con il nuovo valore; in caso contrario, viene aggiunta una nuova variabile al contesto.

L'output di questa richiesta include non solo il normale output, ma anche il contesto, mostrando che sono stati aggiunti i valori specificati. Se stai utilizzando il metodo message senza stato, questi dati di contesto devono essere archiviati localmente e inviati nuovamente al servizio watsonx Assistant come parte del messaggio successivo. Se si utilizza il metodo message con stato, questo contesto viene memorizzato automaticamente e persiste per la durata della sessione.

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

Ripristino dello stato della conversazione

In alcune situazioni, si potrebbe desiderare la possibilità di ripristinare una conversazione ad uno stato precedente.

È possibile utilizzare l'opzione export sulle richieste stateful message per specificare che si desidera che l'oggetto di contesto nella risposta includa dati di stato della sessione completi. Se specifichi true per questa opzione, il contesto della capacità restituito include una proprietà state codificata che rappresenta lo stato della conversazione corrente.

Se si utilizza l'API message con stato, il servizio memorizza i dati di stato della conversazione solo per la durata della sessione. Tuttavia, se si salvano questi dati di contesto (incluso state) e li si rimanda al servizio con una richiesta di messaggio successiva, è possibile ripristinare la conversazione allo stesso stato, anche se la sessione originale è scaduta o è stata eliminata.

Se si sta utilizzando l'API message senza stato, la proprietà state viene sempre inclusa nelle risposte (insieme al resto di context). Sebbene le sessioni stateless non scadano, è comunque possibile utilizzare questi dati di stato per reimpostare una conversazione su uno stato precedente.