자유 대화 Dialog Act¶
dm/scenario/general_conversation.json과 현재 공통 runtime 기준입니다. 전체 enum은 Dialog act 정의를 참고합니다.
Scenario condition 사용 여부¶
현재 JSON의 condition은 nlu.intent만 사용합니다.
| 항목 | 현재 상태 |
|---|---|
| Dialog act를 사용하는 scenario condition | 없음 |
| 종료 condition | nlu.intent == user_wants_to_end |
| Closure 재개 condition | 없음 |
Dialog act는 scenario condition에 없더라도 Global policy, fallback, NLG domain rule에서 계속 사용됩니다.
전체 act별 현재 동작¶
| Act | 자유 대화에서의 역할 |
|---|---|
inform |
일반 정보·의견에 자연스럽게 응답 |
affirm |
앞선 질문이나 말에 대한 긍정으로 응답 |
confirm |
확인 발화로 응답 |
deny, negate |
부정 의사를 존중하고 종료 intent 모순 보정에 사용 |
correct |
앞선 정보의 정정을 우선 반영 |
question |
사용자의 질문에 직접 답함 |
request |
사용자 요청을 먼저 처리 |
request_alt |
다른 방법이나 대안을 제시 |
repeat |
직전 질문 또는 설명을 반복·재표현 |
help |
도움 요청에 직접 응답 |
greeting |
인사에 자연스럽게 응답 |
thank |
감사에 응답 |
goodbye |
작별 화법 적용; 현재 JSON에서는 intent가 다르면 closure 이동 미보장 |
silence |
FallbackPolicy의 무응답 처리 |
null |
FallbackPolicy의 이해 불가 처리 |
FallbackPolicy¶
| Act | Fallback 종류 | 동작 |
|---|---|---|
silence |
no_input |
사용자 탓 없이 짧게 반응하고 현재 node 유지 |
null |
not_understood |
아는 척하지 않고 짧게 확인 |
두 경우 모두 FallbackPolicy가 LLM을 먼저 호출합니다. 이 시나리오는 별도
no_input·not_understood 문구가 없으므로, 공통 문구는 LLM 호출 실패 때만 쓰는
안전망입니다.
conversation은 max_fallback_retries를 선언하지 않으므로 공통 기본값 3을
사용합니다. Scenario에 명시적인 fallback_exhausted 전이는 없지만 terminal node가
있으므로 runtime이 첫 terminal node를 대상으로 기본 종료 전이를 보충합니다.
Spoken input의 silence 보정¶
사용자가 실제 텍스트를 입력했는데 NLU가 silence를 반환하면 null로 보정합니다.
| 조건 | 결과 |
|---|---|
user_message가 비어 있지 않음 + dialogue_act=silence |
dialogue_act=null |
말한 사용자를 무응답으로 처리하는 것을 방지합니다.
NLG speech-act rules¶
자유 대화 화법은 시나리오 prompts.bot이 담당합니다. dialog act별 기본 대응은 그대로 붙습니다.
| Act 분류 | NLG 원칙 |
|---|---|
| 질문 | 화제를 돌리지 않고 먼저 직접 답함 |
| 요청 | 요청 내용을 무시하지 않음 |
| 정정 | 앞선 내용을 고집하지 않고 수정 |
| 감사 | 불필요한 새 질문보다 감사에 응답 |
| 부정 | 거부한 제안이나 진행을 계속 밀지 않음 |
| 작별 | 종료 의도를 존중하는 표현 사용 |
| 이해 불가 | 이해한 척하지 않음 |
Scenario의 prompts.bot은 직전 봇 말에 물음표가 있으면 이번은 평서문으로만 끝내라고 둡니다.
Closure에서의 dialog act¶
conversation_closure는 runtime end node이므로 NLG는 공통 closing acknowledgement 집합을 참고할 수 있습니다.
| 분류 | Act |
|---|---|
| 마무리 수긍 | affirm, goodbye, thank, silence |
| 그 외 | 대화를 이어가려는 발화로 해석 가능 |
그러나 현재 closure에는 outgoing transition이 없습니다. 따라서 NLG가 새 발화를 대화 재개로 해석하더라도 graph는 conversation으로 돌아가지 않고 terminal 판정으로 완료됩니다.
SeniMate처럼 closure 재개를 지원하려면 system.conversation_resuming을 조건으로 하는 node-local transition이 필요합니다.
종료 intent와 goodbye act¶
현재 종료 condition:
| Field | 값 |
|---|---|
nlu.intent |
user_wants_to_end |
현재 condition에 포함되지 않은 공통 종료 신호:
| Field | 값 | 현재 보장 |
|---|---|---|
nlu.dialogue_act |
goodbye |
단독으로 closure 이동 보장 안 됨 |
nlu.end_signal |
true |
단독으로 closure 이동 보장 안 됨 |
NLU가 작별 발화를 user_wants_to_end intent로 함께 분류하면 정상적으로 closure로 이동합니다.
Safety¶
SafetyPolicy는 자유 대화에서도 executor보다 먼저 실행됩니다.
| 신호 | 동작 |
|---|---|
| 강한 안전 신호 | short-circuit 안전 안내 |
| 약한 안전 신호 | safety_watch를 기록하고 node가 확인 |
안전 short-circuit 턴에는 일반 executor와 node routing을 실행하지 않습니다.