A2A Router Axis Tuning Roadmap
이 문서는 A2A Planner의 family routing 성능을 높이기 위해 우리가 실제로 반복한 “축 튜닝” 작업을 로드맵 형태로 정리한다.
핵심은 정답 문자열을 외우게 만드는 것이 아니라, 발화가 어느 의미 경계에 걸리는지 검증셋으로 확인하고, 그 결과를 cue, prompt, system contract, benchmark artifact에 다시 반영하는 closed-loop를 만드는 것이다.
1. 전체 사이클
테스트셋 확정
-> full-run / holdout 실행
-> family별 성능과 오분류 transition 추출
-> 실제 오분류 행 검수
-> 정답지 오류와 router 오류 분리
-> 의미축 재정의
-> cue / prompt / system contract 반영
-> focused set 재검증
-> full-run / holdout 재검증
-> 문서와 artifact 고정
이 사이클은 한 번에 끝나지 않는다. DEF <> STT_NULL, ODL <> SCH, DQR <> FRG, UNS, STM/ETR처럼 경계가 다른 family마다 실패 비용이 다르기 때문에, 전체 정확도만 보지 않고 transition 단위로 반복해야 한다.
2. 1단계: 테스트셋과 정답지 기준 고정
먼저 “무엇을 맞췄다고 볼 것인가”를 고정했다.
| 항목 | 운영 기준 |
|---|---|
| 기준 정답셋 | 현재 정책을 반영한 expected_family 또는 별도 version column |
| 보정 정답셋 | 사용자/리뷰어 검수 결과를 반영한 v11/v12/v13 계열 answer set |
| full-run | 전체 분포와 family별 성공률 확인 |
| focused set | 특정 transition만 빠르게 확인 |
| holdout | 현재 test set 과적합 여부 확인 |
중요한 점은 라우터 성능이 낮게 보일 때, 바로 prompt를 고치지 않았다는 것이다. 먼저 정답지가 최신 정책과 맞는지 확인했다.
예를 들어 최신 기준에서는 알람 켜줘/꺼줘는 단순 즉시 제어이면 ODL이고, 내일 7시에 알람 맞춰줘처럼 등록/수정/삭제/조회 workflow이면 SCH다. 과거 holdout 정답셋이 알람 단어만 보고 SCH로 라벨링되어 있으면, 현재 라우터가 틀린 것이 아니라 정답셋 정책이 오래된 것이다.
3. 2단계: 결과를 transition으로 본다
full-run 결과는 전체 accuracy보다 먼저 아래 형태로 본다.
| 관점 | 보는 이유 |
|---|---|
expected -> predicted transition |
어떤 의미 경계가 흔들리는지 바로 보인다. |
| family별 성공률 | 특정 family가 좋아졌지만 다른 family가 무너졌는지 확인한다. |
| source/reason | main planner, second pass, ranked fallback 중 어디서 틀렸는지 본다. |
| callback/result artifact | 실제 실행 가능한 plan이 나왔는지 확인한다. |
대표적으로 크게 보던 transition은 아래와 같다.
| Transition | 의미 |
|---|---|
DEF -> STT_NULL |
즉답 가능한 짧은 대화나 반응을 과차단 |
STT_NULL -> DEF |
긴 STT 붕괴/잔여 서술을 대화로 과복구 |
DEF -> ODL |
일상 동사를 기기 실행으로 과승격 |
ODL -> STT_NULL |
minor repair 가능한 기기 명령을 과차단 |
ODL -> SCH |
시간/알람/스케줄 단어 때문에 즉시 제어를 workflow로 오판 |
SCH -> ODL |
schedule 등록/수정/삭제/조회 의도를 단순 제어로 흡수 |
DQR -> FRG |
제품/기기 Q&A를 외부 public lookup으로 보냄 |
FRG -> DQR |
외부 제품/공개 지식을 기기 Q&A로 오판 |
4. 3단계: 실제 행을 보고 정답지 오류와 router 오류를 분리
오분류 transition만 보면 부족하다. 실제 발화를 한 건씩 보면서 아래 네 가지로 나눴다.
| 분류 | 처리 |
|---|---|
| 정답지 오류 | answer set version에 반영한다. |
| 중복정답 가능 | primary/secondary 또는 검수 메모로 남긴다. |
| router 오류 | cue/prompt/system contract 조정 대상으로 보낸다. |
| 정책 미확정 | 임의 튜닝하지 않고 open issue로 남긴다. |
예시:
| 발화 | 기존 충돌 | 결론 |
|---|---|---|
알람 꺼줘 |
SCH와 ODL 충돌 |
단순 제어이므로 ODL |
저녁 여덟시 반부터 아침 일곱 시까지 아이들 방만 공기청정해줘 |
ODL과 SCH 충돌 |
시간 범위가 있는 schedule 설정이므로 SCH |
갤럭시 어디까지 나왔어 |
DQR과 FRG 충돌 |
외부 제품 정보이므로 FRG |
하무 업그레이드 어떻게요 |
DEF/STT_NULL과 DQR 충돌 |
기기/제품 사용법이므로 DQR |
하이나무 하이나무 |
DEF와 STT_NULL 충돌 |
호출/응답 가능성이 있으면 DEF 또는 soft probe |
이 단계가 없으면 “성능 개선”이 실제로는 “오래된 정답지에 맞춘 과적합”이 될 수 있다.
5. 4단계: 의미축을 재정의한다
우리가 말한 “축 이동”은 특정 단어를 추가하는 것이 아니라, 판단 질문의 우선순위를 바꾸는 작업이다.
5.1 DEF <> STT_NULL
핵심 질문:
첫 응답이 자연스럽게 가능한가,
아니면 전체 의도를 다시 물어야 하는가?
조정 방향:
| 축 | 변경 방향 |
|---|---|
| reply shape | 인사, 반응, 감정, 간단한 메타 대화는 짧아도 DEF로 살린다. |
| recoverability | minor repair 가능하면 DEF, whole-intent repair 필요하면 STT_NULL이다. |
| over-inference risk | 긴 잔여 서술은 단어가 많아도 direct answer target이 없으면 STT_NULL이다. |
5.2 ODL <> SCH
핵심 질문:
지금 바로 실행할 제어인가,
미래/반복/시간 slot이 있는 workflow인가?
조정 방향:
| 축 | 변경 방향 |
|---|---|
| immediate control | 켜기/끄기/복귀/이동/청정/체크는 기기 capability와 결합되면 ODL이다. |
| schedule workflow | 등록/수정/삭제/조회/반복/시간 범위가 있으면 SCH이다. |
| schedule word | 알람/예약/스케줄 단어만으로는 SCH를 확정하지 않는다. |
5.3 DQR <> FRG
핵심 질문:
기기/제품 지식인가,
외부 public 정보인가?
조정 방향:
| 축 | 변경 방향 |
|---|---|
| device/product grounding | 하이나무, 정수기, 공기청정기, 연결, 시리얼, 업데이트, 사용법은 DQR 후보를 유지한다. |
| public target | 외부 제품, 인물, 지역, 사회 이슈, 수학/과학, 번역/단어 뜻은 FRG로 보낸다. |
| target ambiguity | 대상이 지시어뿐이면 문맥 없이 DQR로 invent하지 않는다. |
5.4 ODL <> STT_NULL
핵심 질문:
LLM이 복구해도 안전한 기기 명령인가,
실행하면 과추론 위험이 큰가?
조정 방향:
| 축 | 변경 방향 |
|---|---|
| minor repair | 전화시켜줘가 정화시켜줘처럼 capability와 자연스럽게 복구되면 ODL 후보를 열 수 있다. |
| room/device anchor | 공간명과 호출어가 함께 있으면 약한 기기 target으로 본다. |
| narration guard | 긴 서술 속 공기, 날씨, 설정은 실행 cue로 과승격하지 않는다. |
6. 5단계: cue는 의미 evidence로만 조정한다
cue는 family를 직접 고르는 rule이 아니다. cue는 Planner에게 줄 evidence를 만든다.
좋은 cue 조정:
| 조정 | 이유 |
|---|---|
device_weak_anchor와 device_action_hint 분리 |
방 이름/기기명 단독으로 실행하지 않게 한다. |
schedule_word와 schedule_workflow_intent 분리 |
알람 단어만으로 SCH가 되는 것을 막는다. |
conversation_reply_shape 세분화 |
짧은 대화와 긴 STT 잔여물을 분리한다. |
public_target과 public_lookup_request 분리 |
외부 단어가 narration에 묻힌 경우 FRG 과승격을 막는다. |
| catalog 기반 device domain anchor | 테스트 row가 아니라 실제 지원 기능 범위로 ODL/DQR 후보를 만든다. |
피한 작업:
| 피한 작업 | 이유 |
|---|---|
| 특정 row 오타 문자열 추가 | test set 암기라서 holdout에서 깨질 가능성이 높다. |
| 단어 하나로 family 확정 | 설정, 알람, 날씨, 영어처럼 다의적인 단어가 많다. |
| prompt 없이 cue만 확장 | cue가 많아질수록 LLM이 evidence를 잘못 해석할 수 있다. |
| full-run 없이 focused set만 통과 | 한 family 개선이 다른 family 하락을 만들 수 있다. |
7. 6단계: prompt와 system contract에 반영한다
cue만 바꾸면 안 된다. LLM Planner가 cue를 어떻게 써야 하는지도 같이 고정해야 한다.
| 반영 위치 | 반영 내용 |
|---|---|
| system prompt | family별 책임, 회색지대 원칙, over-inference 금지 |
| route prompt | DEF/STT_NULL, ODL/SCH, DQR/FRG 경계 설명 |
| response schema | selected family, owner agent, step plan, metadata 일관성 |
| capability catalog | 실제 실행 가능한 기능/slot/visibility/source |
| benchmark artifact | 변경 전후 수치, mismatch list, 적용/미적용 이유 |
예시 prompt 방향:
짧은 발화라도 인사/반응/감정/메타 응답이 가능하면 STT_NULL로 닫지 말라.
하지만 긴 STT 잔여물에서 단어 몇 개만 보고 target/action을 새로 만들지 말라.
기기 실행은 capability/catalog와 안전하게 연결될 때만 선택하라.
알람/예약/스케줄은 단어가 아니라 생성/수정/삭제/조회 workflow인지 판단하라.
8. 7단계: focused set -> full-run -> holdout 순서로 검증한다
검증은 작은 것부터 큰 것으로 간다.
| 단계 | 목적 |
|---|---|
| focused set | 방금 수정한 transition이 실제로 움직였는지 빠르게 확인 |
| full-run | 전체 family별 성능과 새 회귀 확인 |
| holdout | 현재 정답셋에 과적합했는지 확인 |
| relabeled holdout | 오래된 정책 라벨을 최신 축 기준으로 보정한 뒤 재해석 |
중요한 운영 원칙:
DEF가 좋아졌는데STT_NULL이 무너지면 실패다.ODL이 좋아졌는데SCH/UNS과실행이 늘면 실패다.FRG가 좋아졌는데 긴 노이즈를 public lookup으로 과승격하면 실패다.- 기존 정답셋 정책이 낡았으면 라우터를 억지로 맞추지 말고 정답셋 version을 올린다.
9. 8단계: 릴리즈 기준
축 튜닝 결과는 아래가 있어야 release candidate로 본다.
| Gate | 기준 |
|---|---|
| answer set fixed | 어떤 정답 정책으로 측정했는지 명확하다. |
| transition report | 큰 오분류 전이가 줄었는지 확인된다. |
| focused regression | 수정 대상 transition은 개선됐다. |
| full-run regression | 다른 family가 과하게 무너지지 않았다. |
| holdout sanity | holdout에서도 같은 방향성이 유지된다. |
| docs updated | cue/axis/prompt 변경 이유가 문서에 남아 있다. |
10. 운영 로드맵
Phase 0. Baseline 고정
목표:
- 현재 branch, prompt snapshot, answer set version, full-run artifact를 고정한다.
expected_family,selected_family,source,response,reason을 같은 결과 파일에서 볼 수 있게 한다.
산출물:
- baseline CSV/XLSX
- family별 성능표
- mismatch transition table
Phase 1. 정답지 검수
목표:
- 최신 정책과 충돌하는 라벨을 보정한다.
- “정답 변경”과 “라우터 수정”을 섞지 않는다.
검수 축:
- 알람 단순 제어는
ODL, schedule 등록/수정/삭제/조회는SCH - 외부 날씨/지역 날씨는 현재 정책상
ODL로 유지 - 외부 제품/공개 지식/번역/수학은
FRG - 제품/기기 기능/사용법/업데이트/연결은
DQR - 첫 응답 가능 대화는
DEF, 전체 의도 복구 필요는STT_NULL
Phase 2. 큰 transition부터 튜닝
목표:
- 건수가 큰
DEF <> STT_NULL을 먼저 본다. - 그 다음
ODL <> SCH,DQR <> FRG,ODL <> STT_NULL,UNS를 본다.
주의:
- 특정 예시를 맞추기 위한 row-level rule을 만들지 않는다.
- cue는 반복 가능한 semantic pattern일 때만 추가한다.
- prompt는 cue를 해석하는 경계 설명으로 보강한다.
Phase 3. Prompt/Cue/System 동시 정렬
목표:
- deterministic cue와 LLM prompt가 서로 다른 기준을 말하지 않게 한다.
main_router.response_schema.json, capability registry, skill registry, planner prompt의 책임을 맞춘다.
예:
cue는 "스케줄 단어가 있음"을 evidence로만 제공한다.
prompt는 "생성/수정/삭제/조회 workflow일 때 SCH"라고 판단 기준을 제공한다.
schema는 planner가 그 판단을 steps/slots로 표현하게 한다.
Phase 4. 회귀 검증
목표:
- focused set에서 좋아진 수정이 full-run과 holdout에서도 유지되는지 본다.
- family별 이득/손실을 같이 본다.
판단:
- 개선 family만 보지 않는다.
- 실패 비용이 큰
ODL과실행과UNS누락은 별도 gate로 본다. DEF/STT_NULL은 중복정답 가능성을 따로 기록한다.
Phase 5. 운영 지식화
목표:
- 축 조정 결과를 다음 사람이 재현할 수 있게 남긴다.
- 왜 적용했고 왜 적용하지 않았는지를 같이 기록한다.
남길 것:
- cue inventory
- 적용/미적용 판단표
- answer set change log
- benchmark result
- mismatch sample
- prompt snapshot
11. 다음 고도화 과제
| 과제 | 목적 |
|---|---|
| cue inventory 자동 추출 | 실제 코드의 cue 항목과 설명을 문서와 동기화 |
| answer set diff viewer | 정답지 version별 정책 이동을 시각화 |
| transition dashboard | expected -> predicted 전이를 family별로 실시간 확인 |
| duplicate-answer policy | DEF/STT_NULL, FRG/DEF 같은 회색지대의 secondary label 관리 |
| prompt snapshot registry | full-run 결과가 어떤 prompt/cue 버전에서 나왔는지 재현 |
| holdout relabel protocol | 오래된 holdout과 최신 정책 충돌을 정량 보정 |