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 v1messagelegada), 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.