← 돌아가기

10. 컨텍스트(context)


내가 만든 스토리에 컨텍스트(Context)의 변수 "reprompt"를 활용하여

보다 챗봇을 다양하게 스토리를 구성할 수 있습니다. 

 

1 . reprompt 사용법 (노드의 상태관리)


  • 언제 reprompt를 사용하는가
  • reprompt 사용 시 챗봇엔진의 검색방법
 
 
1) 언제 repromt를 사용하는가
 
 
 
사용자와의 대화에서 
"(구체적인)무엇을 해주세요" 가 아닌 개체 없이 "해달하고"만 할 때가 있습니다.
 
예를 들면,
 
A: 저걸로 주세요
B: 커피, 오렌지 중 무슨 메뉴를 드릴까요?
 
A: 커피
B: 커피를 선택하였습니다. 2,000원 입니다 
 
 
 
이때 챗봇엔진의 관점에서 보면 다음과 같습니다.
 
 
A: 저걸로 주세요 :
    (#주문 --> #주문 노드가 실행됨)
 
   커피, 오렌지중 무슨 메뉴를 드릴까요 : B
   ( #주문 또는 #주문의 자식노드 중 true인 대화표시를 실행)
 
A: 커피
   ( #주문-->@메뉴: 커피 노드 true )
 
  커피를 선택하였습니다. 2,000원 입니다 : B
   (#주문 --->@메뉴:커피 노드가 실행된 경우)
 
 
대화 중 , 사용자의 질문에 의도만 있고 개체가 없는 경우, 챗봇은 질문의 범위 축소를 위해 개체를 선택하게끔 다시 질문을 하고 대답을 받아서 결국 사용자의 정확한 "의도+개체"에 부합하는 응답을 할 수 있습니다. 
 
 
여기서 주목할 것은, 
사용자와의 대화에서 재질문 후,
"커피 " 라고만 했는데
챗봇은 "커피를 선택하였습니다. 2,000원 입니다" 라고 대답할 수 있습니다.
 
 
이럴때 매 대화마다 챗봇에서는 대화의 시작 시점인 노드를 컨텍스트(Context)의 변수 reprompt를 통해서 관리해 주어야 합니다.(설정하지 않으면 루트노드부터 시작합니다.)
 
 
 
 
 

2 . reprompt 설정 방법

 


대화 진행 중 필요한 노드에 "reprompt": true 설정해 주어야

다시 대화가 실행될 때, 루트노드부터 시작하지 않습니다.

만약 이전 대화의 노드가 "reprompt": true로 설정되어 있으면 챗봇엔진이 다음 대화 시 루트노드가 아닌 해당 노드부터 시작하게 됩니다. 

[ reprompt 변수 설정방법]

노드 선택 후 오른쪽 "</> 컨텍스트"를 클릭→ 중간 "컨텍스트 context" 부분에서 아래 reprompt를 클릭합니다. → 아래 [reprompt] 버튼을 누르면 "reprompt": true 로 설정된 것을 알 수 있습니다.                   → [저장] 버튼을 누르면 설정이 완료됩니다.

(주의: 전체저장을 누르면 변수 설정이 저장되지 않습니다)

 
 
이를 챗봇관점의 코드적으로 확인해보면
아래의 코드에서(Run 창의 <> 아이콘 클릭)
conversation_stack의 conversation_node_name : true 인 곳에서 대화가 다시 시작합니다.
 
 
User Input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "story_id": "58e8811665d4404cca9a8760",
  "context": {
    "information": {
      "conversation_stack": [
        {
          "conversation_node": "f7af511c-8700-7152-8868-8cca4e06a1da",
          "conversation_node_name": "true"
        }
      ],
      "user_request_counter": 3,
      "conversation_counter": 3
    },
    "variables": null,
    "reprompt": true,
    "conversation_id": "07bd402b-e329-4ac8-85bf-eef4d1a1732f",
    "input_field": null,
    "retrieve_field": false,
    "visit_counter": 0
  },
  "input": {
    "text": "커피"
  }
}
 
 즉, #주문 -- true 에서 사용자가 "커피"라고 입력 했을때,
 
 "conversation_node_name": "@메뉴:커피" 가 실행되었습니다.
 
 
 
 
 
MIND Understanding
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
  "intents": [],
  "channel": {
    "user_id": null,
    "channel_id": "mrmind_client"
  },
  "input": {
    "text": "커피"
  },
  "_id": "58ea49e665d440613be875ab",
  "entities": [
    {
      "value": "커피",
      "entity": "메뉴",
      "keyword": "커피"
    }
  ],
  "timeutc": "2017-04-09T14:49:10.577",
  "story_id": "58e8811665d4404cca9a8760",
  "context": {
    "information": {
      "conversation_stack": [
        {
          "conversation_node": "fb05fb56-4e98-719c-9d3b-5dc6170d4d33",
          "conversation_node_name": "@메뉴:커피"
        }
      ],
      "user_request_counter": 4,
      "conversation_counter": 4
    },
    "variables": null,
    "reprompt": false,
    "conversation_id": "07bd402b-e329-4ac8-85bf-eef4d1a1732f",
    "input_field": null,
    "retrieve_field": false,
    "visit_counter": 0
  },
  "time": "2017-04-09T23:49:10.577",
  "output": {
    "visit_nodes_text": [
      "@메뉴:커피 를 선택하셨습니다.<br>(#주문 -- true -- @메뉴 :커피 노드가 실행)<br> (이제 다시 \"커피~\" 그리고 \"커피 메뉴선택 해줘~\" 두개의 질문을 던져서 차이점을 이해해 보세요^^)"
    ],
    "text": [
      "커피 를 선택하셨습니다.<br>(#주문 -- true -- @메뉴 :커피 노드가 실행)<br> (이제 다시 \"커피~\" 그리고 \"커피 메뉴선택 해줘~\" 두개의 질문을 던져서 차이점을 이해해 보세요^^)"
    ],
    "visit_nodes_name": [
      "@메뉴:커피"
    ],
    "visit_nodes": [
      "fb05fb56-4e98-719c-9d3b-5dc6170d4d33"
    ]
  }
}
 
 
 
따라서 각 대화에서 내가 어떤 노드부터 대화가 시작했는지 확인하려면
위의  context 내의 conversation_stack 정보에서 알 수 있습니다.
 
  "context": {
    "information": {
      "conversation_stack": [
        {
          "conversation_node": "fb05fb56-4e98-719c-9d3b-5dc6170d4d33",
          "conversation_node_name": "@메뉴:커피"
        }
      ],
 
 
이를 참고하여, 스토리를 테스트할 때 코드의 conversation_stack 정보를 잘 살펴보면,
대화가 어디서부터 시작되고, 현재 스토리상의 어디에 있는지 정확하게 알 수 있습니다.