콘텐츠로 이동

SeniMate Dialog Act

dm/scenario/senimate_weather.json과 현재 공통 runtime 기준입니다. 전체 enum 정의는 Dialog act 정의를 참고합니다.

사용 위치

SeniMate는 dialog act를 다음 계층에서 사용합니다.

  1. global_transitions의 연속 무응답 조건
  2. system.conversation_resuming 계산
  3. Global/Task policy
  4. NLG domain rules

이전처럼 runtime policy만 소비하는 구조가 아닙니다.

Scenario condition에서 사용하는 act

연속 무응답 종료

nlu.dialogue_act == silence
AND system.no_input_count > 2
→ conversation_closure

마무리 node 재개

conversation_closure에서 다음 act는 대화를 이어가려는 신호로 보지 않습니다.

affirm
goodbye
thank
silence

Runtime은 공통 CLOSING_ACK_DIALOG_ACTS를 사용해 system.conversation_resuming을 계산합니다. 그 외 act라면 closure의 next_nodes가 아직 수집하지 않은 단계 또는 자유 대화로 돌려보냅니다.

전체 act별 현재 동작

Act SeniMate에서의 역할
inform 일반 정보 제공, slot entity 수집
affirm 짧은 긍정, implicit slot 추론 후보, closure 수긍
confirm implicit 긍정 추론 후보. 현재 closure에서는 재개 신호
deny, negate 짧은 부정, implicit slot 추론 후보, 종료 intent 모순 보정
correct 사용자 정정을 우선 처리
question slot 질문을 밀어붙이기 전에 사용자 질문에 응답
request 사용자 요청을 먼저 처리
request_alt 다른 방법·대안 요청
repeat 직전 질문 반복
help 도움 요청 처리
greeting 인사 화법 적용
thank 감사 화법, closure에서는 종료 수긍
goodbye 작별 화법, closure에서는 종료 수긍
silence FallbackPolicy와 연속 무응답 routing
null 이해 불가 fallback, closure에서는 재개 가능

FallbackPolicy

Act 종류 기준 문장
silence no_input node 선언 또는 공통 기본값
null not_understood node 선언 또는 공통 기본값

현재 SeniMate Weather는 각 node에 주제에 맞는 no_input을 선언하고 not_understood는 선언하지 않습니다. 두 경우 모두 FallbackPolicy가 먼저 LLM 응답을 생성하며, 선언 문구나 공통 기본 문구는 LLM 호출 실패 때만 쓰는 안전망입니다.

재시도:

  • 일반 node: max_fallback_retries 기본값 3
  • greeting_introduction: 명시적으로 2
  • conversation_closure: 명시적으로 0

사용자가 정상적으로 말하면 no-input/not-understood counter를 0으로 초기화합니다. 인사와 일반 대화는 재시도 한도가 2이고 closure는 0입니다. 연속 무응답이 3회가 되면 silent_close 전역 조건이 conversation_closure로 이동시킵니다.

Spoken input의 silence 보정

사용자가 실제 텍스트를 말했는데 LLM이 dialogue_act=silence를 반환하면 null로 보정합니다.

user_message가 비어 있지 않음
AND dialogue_act = silence
→ dialogue_act = null

마무리 node에서 “아 잠깐만요” 같은 발화를 침묵으로 오인해 종료하는 것을 방지합니다.

ImplicitAnswerPolicy

Entity가 없을 때 다음 act로 첫 미수집 slot 값을 추론할 수 있습니다.

affirm / confirm → 긍정값
deny / negate    → 부정값
Node 첫 대상 현재 기본 추론의 정합성
daily_life_check daily_life adequate/skipped가 의미상 부자연스러움
meal_check meal_status enum과 일치
health_check health_status skipped는 enum 밖 값

NLU prompt가 짧은 응답을 직접 entity로 변환하는 것이 더 안전합니다.

Task DialogActRouter

사용자 요구 outcome:

question
request
request_alt
repeat
help
correct

이번 턴에 slot update가 없으면 optional-only node에서도 우선 처리됩니다.

다음 act는 required slot이 남은 경우에만 Task router outcome이 됩니다.

greeting
thank
silence
null

SeniMate는 모든 slot이 optional이므로 이 경로는 일반적으로 활성화되지 않습니다.

  • silence/null: 앞선 FallbackPolicy가 처리
  • greeting/thank: 공통 NLG speech-act rule이 처리
  • goodbye: 별도 Task handler가 없으며 routing과 NLG rule이 처리

NLG speech-act rules

Dialog act별 화법 규칙은 executor routing 여부와 관계없이 NLG prompt에 적용됩니다.

예:

  • 질문이면 먼저 답함
  • 요청이면 요청을 무시하지 않음
  • 정정이면 앞선 정보를 바로잡음
  • 감사면 새 질문보다 감사에 응답
  • goodbye면 작별 의도를 존중
  • null이면 아는 척하지 않고 짧게 확인

SeniMate의 prompts.bot은 persona·공감·의료 안전만 유지하고 공통 speech-act 규칙을 반복하지 않습니다.

Closure의 act 해석

Runtime은 현재 node가 end node인지 _is_end_node로 NLG에 알려줍니다.

Closing acknowledgement:

affirm, goodbye, thank, silence

이 경우 마무리를 받아들인 것으로 보고 새 질문을 만들지 않습니다.

그 외 act:

  • 사용자가 아직 이야기를 이어가려는 것으로 해석
  • closure 기준 문장을 prompt에서 제외
  • CLOSING_NODE_RESUME rule 적용
  • closure의 node-local transition이 적절한 node로 이동

null은 closing acknowledgement가 아닙니다. 사용자가 실제로 말했으나 이해하지 못한 상황에서 봇이 일방적으로 닫지 않기 위해서입니다.

종료 intent와 act

EndIntentPolicy는 제거되었습니다. 종료는 routing이 담당합니다.

Runtime이 자동 생성하는 기본 종료 전이는 다음을 모두 봅니다.

intent = user_wants_to_end
dialogue_act = goodbye
nlu.end_signal = true

SeniMate는 자체 종료 전이를 선언하므로 현재 JSON에서는 intent 조건 하나가 직접 사용됩니다. goodbye act만으로도 반드시 closure로 보내려면 scenario condition을 확장해야 합니다.

Safety와 act

SafetyPolicy는 dialog act보다 keyword 강도 분류를 먼저 봅니다.

  • 강한 신호: short-circuit 안전 안내
  • 약한 신호: safety_watch만 기록하고 node가 확인

안전 응답이 short-circuit되면 executor와 일반 routing은 실행되지 않습니다.

현재 주의점

  • Act 오분류는 fallback·implicit slot·closure 종료/재개에 동시에 영향을 줍니다.
  • RepeatGuard와 repeat outcome의 metadata 계약이 완전히 일치하지 않아 prefix가 붙을 수 있습니다.
  • Closure 재개 판단과 NLG는 공통 CLOSING_ACK_DIALOG_ACTS 집합을 함께 사용합니다.
  • goodbye act가 scenario의 명시적 종료 condition에 포함되지 않습니다.
  • Implicit slot 기본값이 일부 SeniMate slot과 맞지 않습니다.

관련 문서