← Docs hub

A2A Follow-up Question Strategy

이 문서는 A2A Planner가 언제 사용자에게 follow-up을 물어야 하는지, 어떤 형태로 물어야 하는지, 그리고 그 결과를 어떻게 feedback으로 쌓아 서비스 개선에 활용할지 정리한다.

핵심 원칙은 아래다.

Follow-up은 “못 알아들어서 다시 묻는 것”이 아니라, 실행 위험을 줄이고 slot을 완성하며 context를 복구하기 위한 정책적 action이다.

따라서 A2A에서 follow-up은 route decision과 같은 수준의 planner action으로 취급해야 한다.

state:
  recognized_text, active_workflow, slot_state, device_context, memory_context

action:
  answer now / execute now / ask follow-up / ask confirmation / retry prompt

outcome:
  slot filled / user corrected / user cancelled / task success / repeated failure

1. Follow-up이 필요한 경우

Follow-up은 크게 6가지 경우에 필요하다.

유형 조건 예시 목표
Slot fill 실행 또는 workflow에 필요한 slot이 부족 “고정청정 예약해줘” 필요한 slot만 채우기
Scoped clarification 약한 target scope는 있으나 실행/응답은 위험 “거실” scope를 좁혀 복구
Confirmation 실행은 가능하지만 과실행 위험이 있음 “다 꺼줘” side effect 확인
Disambiguation 후보가 여러 개 “그거 삭제해줘” 대상 선택
Repair STT가 깨졌지만 일부 의미가 남음 “하이나무 침...” 안전한 재질문
Replan recovery TaskManager 실패/차단 후 사용자 결정 필요 PATH_BLOCKED 다음 행동 결정

Follow-up을 하지 않아야 하는 경우도 명확히 둔다.

하지 말아야 하는 경우 이유
첫 응답이 자연스러운 DEF 불필요한 재질문은 대화 품질을 낮춘다.
public lookup이 명확한 FRG 정보 답변을 바로 하면 된다.
target/action/slot이 완성된 safe ODL 불필요한 확인은 UX를 느리게 한다.
active workflow가 아닌 bare noise scoped 질문보다 generic retry가 낫다.
unsupported가 명확한 실행 요청 되묻지 말고 지원 불가를 설명한다.

2. 질문 우선순위

질문은 한 번에 하나의 blocking point만 해결해야 한다. 다만 자연스럽게 두 slot을 같이 물을 수 있으면 한 문장에 묶는다.

우선순위:

  1. 안전 확인이 필요한 side effect
  2. workflow를 계속할지 취소할지
  3. 실행 target
  4. 시간/반복 등 schedule semantics
  5. action/value parameter
  6. 표현/대화 의도 clarification

예:

나쁜 질문:
  어느 방에서, 몇 시에, 반복할지, 어떤 모드로, 정말 실행할지 알려주세요.

좋은 질문:
  무엇을 언제 예약할까요? 예: 고정청정 매일 밤 10시

3. Follow-up 타입별 정책

3.1 Slot Fill Prompt

사용처:

원칙:

예시:

상황 follow-up
target만 있음, time 없음 “언제 예약할까요? 예: 매일 밤 10시”
time만 있음, target 없음 “무엇을 예약할까요? 예: 고정청정”
target/time 모두 없음 “무엇을 언제 예약할까요? 예: 고정청정 매일 밤 10시”
value/time 필요 “언제, 그리고 몇 단계로 예약할까요? 예: 매일 밤 10시 풍량 3단계”

3.2 Scoped Clarification Prompt

사용처:

원칙:

예시:

surviving scope follow-up
device “기기 동작을 말씀하신 걸까요? 어떤 동작인지 한 번만 더 말씀해 주세요.”
room/device target “어느 공간에서 무엇을 할까요?”
schedule “스케줄로 등록하려는 내용과 시간을 다시 말씀해 주세요.”
public lookup “무엇에 대해 찾아볼까요?”
conversation “어떤 뜻으로 말씀하신 건지 조금만 더 알려주세요.”

3.3 Confirmation Prompt

사용처:

원칙:

예시:

전체 공간 청정을 중지할까요?
등록된 고정청정 스케줄을 삭제할까요?
거실과 안방 청정을 모두 시작할까요?

3.4 Disambiguation Prompt

사용처:

원칙:

예시:

어떤 스케줄을 삭제할까요? 고정청정, 웰컴, 나이트 모드 중에서 말씀해 주세요.
어느 공간을 말씀하신 걸까요? 거실인가요, 안방인가요?

3.5 Repair Prompt

사용처:

원칙:

예시:

잘 못 들었어요. 다시 한 번 말씀해 주세요.
요청하신 내용을 조금 더 구체적으로 말씀해 주세요.
기기 동작인지, 스케줄인지 다시 말씀해 주세요.

3.6 Replan Recovery Prompt

사용처:

원칙:

예시:

reason follow-up
PATH_BLOCKED “이동 경로가 막혀 있어요. 장애물을 치운 뒤 다시 시도할까요?”
LOW_BATTERY “배터리가 부족해요. 먼저 충전한 뒤 이어서 할까요?”
ROOM_NOT_FOUND “그 공간을 찾지 못했어요. 다른 공간 이름으로 다시 말씀해 주세요.”
DEVICE_BUSY “지금 다른 작업 중이에요. 끝난 뒤 이어서 할까요, 아니면 취소할까요?”

4. Family별 Follow-up 전략

Family 기본 전략 follow-up 기준
ODL 완성된 실행은 바로 실행, target/action 불명확하면 scoped clarification 잘못 실행 penalty가 크므로 target/action이 불안정하면 묻는다.
SCH slot filling 우선 target, action, time/repeat, update/delete 대상이 부족하면 묻는다.
DQR 질문 target이 모호하면 clarification 제품/기능 target이 없으면 묻고, 외부/public이면 FRG로 넘긴다.
FRG lookup target이 명확하면 바로 답변 대상이 모호하거나 범위가 너무 넓으면 좁힌다.
DEF 즉답 가능한 대화는 답변 대화 목적이 모호하지만 conversation scope가 있으면 gentle follow-up
UNS 지원 불가 설명 가능한 대체 기능이 있으면 대체 제안 질문
STT_NULL subtype별 repair HARD=retry, GENERIC=구체화 요청, SOFT=scoped clarification

5. Follow-up 문구 원칙

5.1 좋은 follow-up

좋은 follow-up은 아래 조건을 만족한다.

예:

언제 예약할까요? 예: 매일 밤 10시
어느 공간을 청정할까요?
전체 공간 청정을 중지할까요?

5.2 나쁜 follow-up

나쁜 follow-up은 아래와 같다.

예:

정확한 작업 대상과 시간과 반복 여부와 모드 값을 모두 알려주세요.
거실 청정을 예약하시는 게 맞나요? 몇 시에 할까요? 매일인가요?

6. Follow-up Feedback Metric

Follow-up 전략은 감으로 정하면 안 된다. 아래 지표를 남겨야 한다.

지표 의미
slot_fill_success_next_turn 다음 turn에서 missing slot이 채워졌는가
clarification_resolved clarification 후 family/target이 확정됐는가
user_correction_after_followup follow-up 가정이 틀려 사용자가 정정했는가
user_cancel_after_followup 질문 후 사용자가 취소했는가
repeat_stt_null_count 같은 session에서 STT_NULL이 반복됐는가
turns_to_completion workflow 완료까지 몇 turn이 걸렸는가
wrong_execution_prevented follow-up으로 과실행을 막았는가
unnecessary_followup_rate 바로 답/실행 가능했는데 물었는가

6.1 Outcome trace 예시

{
  "trace_id": "a2a-followup-001",
  "follow_up": {
    "type": "slot_fill",
    "family": "SCH",
    "asked_slot": ["time"],
    "prompt": "언제 예약할까요? 예: 매일 밤 10시"
  },
  "next_turn_outcome": {
    "user_text": "매일 밤 10시",
    "slot_filled": ["repeat", "time"],
    "workflow_completed": true,
    "user_corrected": false,
    "user_cancelled": false
  },
  "score": {
    "slot_fill_success": 1.0,
    "turn_cost": -0.1,
    "overall": 0.9
  }
}

7. Follow-up Policy State Machine

START
  -> current utterance self-sufficient?
       yes -> answer/execute
       no
  -> active workflow exists?
       yes -> continuation/correction/cancel/topic-shift 판단
       no
  -> missing slot exists?
       yes -> slot fill prompt
       no
  -> weak scope survives?
       yes -> scoped clarification
       no
  -> STT collapse?
       hard -> retry prompt
       generic -> generic clarification
  -> unsupported?
       yes -> unsupported explanation or alternative

8. 적용 우선순위

우선 작업 이유
1 follow_up.type enum 정의 feedback과 benchmark 분석의 기준이 된다.
2 SCH slot fill prompt 표준화 schedule workflow가 가장 명확한 멀티턴 영역이다.
3 STT_NULL subtype별 prompt 고정 반복 재질문 UX를 줄인다.
4 ODL confirmation/scoped clarification 정책 과실행 방지에 직접 영향이 있다.
5 TaskManager reason별 recovery prompt 실제 실행 실패 후 복구 품질을 높인다.
6 Follow-up outcome metric dashboard 어떤 질문이 좋은지 데이터로 본다.

9. 현재 소스와 연결되는 지점

영역 현재 근거
Planner output ask_follow_up, missing_slots, stt_null_subtype
Schedule agent next_voice_prompt, result.tts_response, needs_user_input
Runtime session pending_follow_up_text, slot_state, active_workflow
STT_NULL policy STT_NULL_HARD, STT_NULL_GENERIC, STT_NULL_SOFT
RL-like loop A2A RL-Like Feedback Improvement Opportunities
Speech context Speech-LLM Context-Aware A2A Architecture

10. 결론

Follow-up 전략의 목표는 질문을 많이 하는 것이 아니다.

필요한 순간에,
가장 좁은 질문으로,
다음 turn에서 slot이나 intent가 확정되게 만들고,
잘못된 device execution을 막는 것

이 전략을 feedback trace와 연결하면 follow-up 자체가 서비스 개선 대상이 된다. 즉, 어떤 질문이 slot을 잘 채우는지, 어떤 질문이 사용자를 취소하게 만드는지, 어떤 질문이 과실행을 막았는지를 데이터로 볼 수 있다.

Keyboard shortcuts

⌘K / Ctrl+KOpen command palette
/Focus search
g hGo to home
g pGo to projects
g sGo to sessions
j / kNext / prev row (tables)
?Show this help
EscClose dialogs

Structured queries

Mix key:value filters with free text in the palette:

type:sessionOnly session pages
project:llm-wikiFilter by project name (substring)
model:claudeFilter by model name (substring)
date:>2026-03-01Sessions after a date
date:<2026-04-01Sessions before a date
tags:rustPages mentioning a tag/topic
sort:dateSort results by date (newest first)

Example: type:session project:llm-wiki date:>2026-04 sort:date