Acessando dados de contexto no diálogo

O contexto é um objeto que contém variáveis que persistem durante uma conversa e podem ser compartilhadas pela caixa de diálogo e pelo aplicativo cliente. Tanto o diálogo quanto o aplicativo cliente podem ler e gravar variáveis de contexto.

É possível se o contexto deve ser mantido pelo aplicativo ou pelo serviço watsonx Assistant:

  • Se você usar a API stateful v2 message, o contexto será mantido automaticamente pelo assistente por sessão. Seu aplicativo deve criar explicitamente uma sessão no início de cada conversa. O contexto é armazenado pelo serviço como parte da sessão e não é retornado nas respostas da mensagem, a menos que você o solicite Para obter mais informações, consulte o v2 API Reference.

  • Se você usar a API stateless v2 message (ou a API v1 message legada), o aplicativo será responsável por armazenar o contexto após cada turno da conversa e enviá-lo de volta para o serviço com a próxima mensagem. Para um aplicativo complexo, ou um aplicativo que precisa armazenar informações pessoalmente identificáveis, é possível optar por armazenar o contexto em um banco de dados.

    Um ID de sessão é gerado automaticamente no início da conversa, mas nenhum dado de sessão é armazenado pelo serviço. Com a API stateless message, o contexto é sempre incluído com cada resposta de mensagem. Para obter mais informações, consulte o v2 API Reference.

Importante: Um dos usos do contexto é especificar um ID de usuário exclusivo para cada usuário que interage com o assistente. Para planos baseados no usuário, esse ID é usado para propósitos de faturamento. Para obter mais informações, consulte Planos baseados em usuário explicados.

Há dois tipos de contexto:

  • Contexto global: variáveis de contexto que são compartilhadas por todas as habilidades usadas por um assistente, incluindo variáveis internas do sistema usadas para gerenciar o fluxo da conversa. O contexto global inclui o ID do usuário e outros valores globais, como o fuso horário e o idioma do assistente.

  • Contexto específico da qualificação: variáveis de contexto específicas para uma determinada qualificação, incluindo quaisquer variáveis definidas pelo usuário necessárias para seu aplicativo. Atualmente, somente uma qualificação (denominada main skill) é suportada.

As variáveis de contexto definidas pelo usuário que você especifica em um nó de diálogo fazem parte do objeto user_defined no contexto de habilidade quando acessadas usando a API. Essa estrutura é diferente da estrutura context que aparece no editor JSON na interface do usuário watsonx Assistant. Por exemplo, você pode especificar o seguinte código no editor JSON:

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

Na API v2, você acessaria essa variável definida pelo usuário da seguinte forma:

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

Para obter mais informações sobre como acessar variáveis de contexto usando a API, consulte a Referência da API v2.

Exemplo

O exemplo a seguir mostra uma solicitação /message com estado que inclui variáveis de contexto globais e específicas da habilidade; ela também usa a propriedade options.return_context para solicitar que o contexto seja retornado com a resposta. Essa opção é aplicável somente se você estiver usando o método message com estado, pois o método message sem estado sempre retorna o 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);

Neste exemplo de solicitação, o aplicativo especifica um valor para user_id como parte do contexto global. Além disso, ele configura uma variável de contexto definida pelo usuário (account_number) como parte do contexto específico da qualificação. Essa variável de contexto pode ser acessada por nós de diálogo como $account_number.

É possível especificar qualquer nome de variável que se queira usar para uma variável de contexto definida pelo usuário. Se a variável especificada existir, ela será substituída pelo novo valor; caso contrário, uma nova variável será adicionada ao contexto.

A saída dessa solicitação inclui não somente a saída comum, mas também o contexto, mostrando que os valores especificados foram incluídos. Se você estiver usando o método stateless message, esses dados de contexto deverão ser armazenados localmente e enviados de volta para o serviço watsonx Assistant como parte da próxima mensagem. Se você estiver usando o método stateful message, esse contexto será armazenado automaticamente e persistirá durante toda a sessão.

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

Restaurando o estado da conversa

Em algumas situações, talvez você queira ter capacidade para restaurar uma conversa para um estado anterior.

É possível usar a opção export em solicitações stateful message para especificar que você quer que o objeto de contexto na resposta inclua dados completos do estado da sessão. Se você especificar true para essa opção, o contexto de habilidade retornado incluirá uma propriedade state codificada que representa o estado da conversa atual.

Se estiver usando a API message stateful, o serviço armazenará dados do estado da conversa apenas enquanto durar a sessão. No entanto, se você salvar esses dados de contexto (inclusive state ) e enviá-los de volta ao serviço com uma solicitação de mensagem subsequente, poderá restaurar a conversa para o mesmo estado, mesmo que a sessão original tenha expirado ou sido excluída.

Se você estiver usando a API stateless message, a propriedade state será sempre incluída em respostas (juntamente com o restante de context). Embora as sessões stateless não expirem, ainda é possível usar esses dados de estado para reconfigurar uma conversa para um estado anterior.