대화 상자에서 컨텍스트 데이터 액세스
컨텍스트는 대화 내내 지속되는 변수를 포함하고 있으며, 대화 상자와 클라이언트 응용 프로그램이 공유할 수 있는 객체입니다. 대화와 클라이언트 애플리케이션은 둘 다 컨텍스트 변수를 읽고 쓸 수 있습니다.
애플리케이션 또는 watsonx Assistant 서비스에서 컨텍스트를 유지보수할지 선택할 수 있습니다.
-
Stateful v2
messageAPI를 사용하는 경우 애플리케이션이 v2 API를 사용하는 경우에는 세션별로 어시스턴트에서 컨텍스트를 자동으로 관리합니다. 애플리케이션은 각 대화 시작 시 명시적으로 세션을 작성해야 합니다. 컨텍스트는 세션의 일부로 서비스에 의해 저장되며 사용자가 요청하지 않으면 메시지 응답에서 리턴되지 않습니다. 더 자세한 정보를 원하시면 v2 참조를 참고하세요. -
Stateless v2
messageAPI(또는 레거시 v1messageAPI)를 사용하는 경우 애플리케이션에서 각 대화 턴(turn) 다음에 컨텍스트를 저장하고 다음 메시지와 함께 서비스로 다시 전송해야 합니다. 복합 애플리케이션 또는 개인 식별 정보를 저장해야 하는 애플리케이션의 경우 데이터베이스에 컨텍스트를 저장하도록 선택할 수 있습니다.세션 ID는 대화의 시작 부분에서 자동으로 생성되지만 서비스에서 세션 데이터를 저장하지 않습니다. Stateless
messageAPI를 사용하면 컨텍스트가 항상 각 메시지 응답에 포함됩니다. 더 자세한 정보를 원하시면 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 세션이 만료되지 않더라도 이 상태 데이터를 사용하여 대화를 이전 상태로 재설정할 수 있습니다.