대화 상자에서 컨텍스트 데이터 액세스

컨텍스트는 대화 내내 지속되는 변수를 포함하고 있으며, 대화 상자와 클라이언트 응용 프로그램이 공유할 수 있는 객체입니다. 대화와 클라이언트 애플리케이션은 둘 다 컨텍스트 변수를 읽고 쓸 수 있습니다.

애플리케이션 또는 watsonx Assistant 서비스에서 컨텍스트를 유지보수할지 선택할 수 있습니다.

  • Stateful v2 message API를 사용하는 경우 애플리케이션이 v2 API를 사용하는 경우에는 세션별로 어시스턴트에서 컨텍스트를 자동으로 관리합니다. 애플리케이션은 각 대화 시작 시 명시적으로 세션을 작성해야 합니다. 컨텍스트는 세션의 일부로 서비스에 의해 저장되며 사용자가 요청하지 않으면 메시지 응답에서 리턴되지 않습니다. 더 자세한 정보를 원하시면 v2 참조를 참고하세요.

  • Stateless v2 message API(또는 레거시 v1 message API)를 사용하는 경우 애플리케이션에서 각 대화 턴(turn) 다음에 컨텍스트를 저장하고 다음 메시지와 함께 서비스로 다시 전송해야 합니다. 복합 애플리케이션 또는 개인 식별 정보를 저장해야 하는 애플리케이션의 경우 데이터베이스에 컨텍스트를 저장하도록 선택할 수 있습니다.

    세션 ID는 대화의 시작 부분에서 자동으로 생성되지만 서비스에서 세션 데이터를 저장하지 않습니다. Stateless message API를 사용하면 컨텍스트가 항상 각 메시지 응답에 포함됩니다. 더 자세한 정보를 원하시면 v2 참조를 참고하세요.

중요: 컨텍스트의 한 가지 용도는 어시스턴트와 상호작용하는 각 사용자에 대해 고유한 사용자 ID를 지정하는 것입니다. 사용자 기반 플랜의 경우 이 ID는 청구용으로 사용됩니다. 자세한 정보는 사용자 기반 플랜 설명을 참조하십시오.

다음과 같은 두 가지 유형의 컨텍스트가 있습니다.

  • 전역 컨텍스트: 대화 흐름을 관리하는 데 사용되는 내부 시스템 변수를 포함하여 어시스턴트가 사용하는 모든 스킬이 공유하는 컨텍스트 변수. 글로벌 컨텍스트에는 사용자 ID와 시간대, 어시스턴트의 언어와 같은 기타 글로벌 값이 포함됩니다.

  • 스킬 특정 컨텍스트: 애플리케이션에서 필요로 하는 사용자 정의 변수를 포함하여 특정 스킬에 고유한 컨텍스트 변수입니다. 현재, 하나의 스킬(이름: main skill)만 지원됩니다.

대화 노드에서 사용자가 지정한 사용자 정의 컨텍스트 변수는 API를 통해 액세스할 때 스킬 컨텍스트 내의 user_defined 객체의 일부입니다. 이 구조는 JSON 편집기에서 watsonx Assistant 나타나는 ' context ' 구조와 다릅니다. 예를 들어, JSON 편집기에서 다음과 같은 코드를 지정할 수 있습니다

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

v2 API에서는 다음과 같이 이 사용자 정의 변수에 액세스합니다.

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

API를 사용하여 컨텍스트 변수에 액세스하는 방법에 대한 자세한 내용은 v2 참조하십시오.

/message 다음 예는 전역 및 기술별 컨텍스트 변수를 모두 포함하는 상태 저장형 컨텍스트 요청을 보여줍니다. 또한, 컨텍스트가 응답과 함께 반환되도록 요청하기 위해 options.return_context 속성을 사용합니다. 이 옵션은 상태 저장 message 메서드를 사용하는 경우에만 적용 가능합니다. 상태 비저장 message 메서드는 항상 컨텍스트를 반환하기 때문입니다.

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

이 예제 요청에서 애플리케이션은 글로벌 컨텍스트의 일부로 user_id에 대한 값을 지정합니다. 또한, 스킬 특정 컨텍스트의 일부로 하나의 사용자 정의 컨텍스트 변수(account_number)를 설정합니다. 이 컨텍스트 변수는 대화 노드에서 $account_number로 액세스할 수 있습니다.

사용자 정의 컨텍스트 변수에 사용할 변수 이름을 지정할 수 있습니다. 지정된 변수가 존재하는 경우, 새로운 값으로 덮어쓰기 되고, 존재하지 않는 경우, 새로운 변수가 컨텍스트에 추가됩니다.

이 요청의 출력에는 일반적인 출력뿐만 아니라 지정된 값이 추가되었음을 표시하는 컨텍스트도 포함됩니다. Stateless message 메소드를 사용하는 경우 이 컨텍스트 데이터는 로컬에 저장하고 다음 메시지의 일부로 watsonx Assistant 서비스에 다시 전송해야 합니다. 상태 저장( message ) 방법을 사용하는 경우, 이 컨텍스트는 자동으로 저장되며 세션이 지속되는 동안 유지됩니다.

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

대화 상태 복원

일부 상황에서는 대화를 이전 상태로 복원할 수 있습니다.

Stateful export 요청에서 message 옵션을 사용하여 응답의 컨텍스트 오브젝트가 전체 세션 상태 데이터를 포함하도록 지정할 수 있습니다. 이 옵션에 대해 true를 지정하면 리턴된 스킬 컨텍스트에는 현재 대화 상태를 나타내는 인코딩된 state 특성이 포함됩니다.

Stateful message API를 사용하는 경우 서비스는 세션의 지속 기간 동안만 대화 상태 데이터를 저장합니다. 그러나 이 컨텍스트 데이터( state 포함)를 저장한 다음 후속 메시지 요청과 함께 서비스에 다시 보내면 원래 세션이 만료되거나 삭제된 경우에도 대화를 동일한 상태로 복원할 수 있습니다.

Stateless message API를 사용하는 경우 state 특성은 항상 응답에 포함됩니다(나머지 context와 함께). Stateless 세션이 만료되지 않더라도 이 상태 데이터를 사용하여 대화를 이전 상태로 재설정할 수 있습니다.