Speech-LLM Context-Aware A2A Architecture
이 문서는 Speech 기반 사용자 발화가 Cloud A2A Planner, Agent/Skill, 복합제어, 온디바이스 Bridge, DeviceAgent TaskManager, Memory로 이어지는 전체 판단 구조를 한 번에 연결한다.
기존 문서들이 개별 축을 설명한다면, 이 문서는 “실제 음성 명령 한 턴이 어떤 context를 읽고, 어떤 agent/skill plan으로 바뀌고, 어떤 기준으로 기기 복합제어까지 내려가는가”를 설명하는 상위 운영 가이드다.
1. 목적
Speech-LLM 환경에서 A2A가 해결해야 하는 핵심은 단순 classification이 아니다.
필요한 것은 아래 네 가지를 동시에 만족하는 turn supervisor다.
| 축 | 목표 |
|---|---|
| Speech/STT | 깨진 발화와 살아 있는 의도를 구분한다. |
| Context-aware | 현재 발화를 우선하되, 세션/메모리/기기 상태를 보조 증거로 사용한다. |
| Planner | route family 하나를 고르는 데서 끝나지 않고, agent step과 의존성을 만든다. |
| Composite control | Cloud step, device step, memory update, event/replan을 안전하게 연결한다. |
2. 전체 판단 루프
매 turn에서 동일한 구조를 반복한다.
Speech Input
-> STT recognized_text
-> STT_NULL / recoverability guard
-> Context Assembly
-> Context-aware Planner
-> Agent & Skill Step Plan
-> Runtime Execution
-> On-device / DeviceAgent TaskManager
-> Event / Memory / Replan Feedback
중요한 점은 STT_NULL 검사가 선행되지만, 복합명령 후보가 명확한 발화를 노이즈라는 이유로 통째로 버리면 안 된다는 것이다. STT가 일부 불완전해도 자연스러운 첫 응답 방향과 실행 가능한 step이 살아 있으면 planner로 넘긴다.
3. Context Assembly
Planner는 아래 입력을 함께 본다.
| 입력 | 역할 | 우선순위 |
|---|---|---|
recognized_text |
현재 STT 결과. 모든 판단의 기준점 | 최상 |
voice_context |
최근 턴, active workflow, pending follow-up, last route | 높음 |
device_context |
배터리, 현재 위치/방, 지도, cleaning/movement 상태, task queue, capability | 높음 |
memory_snapshot |
단기/중기/장기 사용자 맥락과 선호 | 보조 |
preclassifier_hints |
family 판단용 evidence flag | 보조 |
capability_registry |
가능한 device action/state/settings 및 미지원 범위 | 보조 |
ranked_top_flows |
legacy flow/catalog 후보 | 보조 |
기준은 명확하다.
- 현재 발화가 항상 1순위다.
- memory와 history는 현재 발화를 덮어쓰지 않는다.
- device_context는 불가능한 plan을 사전에 줄이는 데 사용한다.
- preclassifier/capability/ranked hint는 evidence이지 최종 결정자가 아니다.
4. Planner 산출물
Planner는 selector가 아니라 plan generator다.
최소 출력은 아래 형태여야 한다.
{
"turn_mode": "singleton|multi_turn|parallel",
"selected_routes": ["ODL|FRG|DEF|SCH|DQR|UNS|STT_NULL|STM|ETR"],
"steps": [
{
"id": "step_1",
"route": "FRG",
"execution_target": "cloud",
"purpose": "검색할 후보 지역 찾기",
"depends_on": [],
"input_from": [],
"wait_policy": "completed",
"output_key": "candidate_places"
}
],
"missing_slots": [],
"ask_follow_up": false
}
복합명령에서 특히 중요한 필드는 아래 네 가지다.
| 필드 | 의미 |
|---|---|
depends_on |
물리적/순차적 완료 대기 |
input_from |
이전 step의 결과를 다음 step의 입력으로 사용 |
execution_target |
cloud, device, mixed, local_bridge 중 어디서 실행할지 |
wait_policy |
submitted/completed/event/needs_user_input 중 무엇을 기다릴지 |
5. Agent & Skills 책임
A2A의 route family는 실제 실행 책임과 연결되어야 한다.
| Family | Agent/Skill 관점 | 주요 책임 |
|---|---|---|
STT_NULL |
STT repair guard | 입력이 깨졌을 때 복구 가능성, scoped probe, hard retry 판단 |
DEF |
default conversation skill | 일반 대화, wording/style/meta help, 생활 조언, 최종 응답 합성 |
FRG |
search/public lookup skill | 외부 정보, freshness-aware lookup, 추천, public entity 정보 |
SCH |
schedule expert skill | 알람, 타이머, 리마인더, 예약 workflow |
DQR |
device Q&A/RAG skill | 기기/제품/assistant 설명, 사용법, troubleshooting |
ODL |
on-device local/device control skill | 기기 실행, live state query, device task request 생성 |
UNS |
unsupported skill | 실행 의도는 있으나 현재 제품/권한/기능 범위 밖임을 안내 |
STM |
story mode skill | story realtime mode 진입/유지/종료 |
ETR |
English tutor skill | English tutor realtime mode 진입/유지/종료 |
Planner가 ODL step을 만든다고 해서 Cloud가 직접 네이티브 함수를 호출하는 것은 아니다. Cloud는 device-consumable intent/task request를 만들고, 온디바이스 Bridge와 DeviceAgent TaskManager가 실제 조건 판단과 실행을 담당한다.
6. 복합제어 원칙
복합제어는 “한 번에 여러 명령을 보낸다”가 아니라 “의존성을 가진 workflow를 안전하게 실행한다”는 뜻이다.
예시 발화:
거실로 갔다가 안방으로 이동해서 청정해줘
Planner step:
step_1 ODL device: 거실로 이동
step_2 ODL device: 안방으로 이동, depends_on=step_1
step_3 ODL device: 안방 청정 시작, depends_on=step_2
온디바이스/DeviceAgent 관점:
step_1 -> movement task
step_1 COMPLETED -> step_2 unlock
step_2 -> movement task
step_2 COMPLETED -> step_3 unlock
step_3 -> cleaning task
WORKFLOW_COMPLETED -> 종료
정상 이벤트는 Cloud LLM 재판단 대상이 아니다.
| 이벤트 | 기본 처리 |
|---|---|
QUEUED |
상태 표시, audit 기록 |
RUNNING |
진행 상태 표시 |
PROGRESS |
progress UI/notification 갱신 |
COMPLETED |
다음 local step unlock |
WORKFLOW_COMPLETED |
workflow 종료 및 short-term memory 기록 |
FAILED, BLOCKED, PAUSED, NEEDS_USER_INPUT |
구조화 reason과 함께 Cloud replan 후보 |
7. Cloud-only 복합 계획
복합 계획이 항상 기기 제어를 포함하는 것은 아니다.
예시 발화:
보통 교통상황이 안 좋은 곳을 알아보고 오늘 그곳 정보를 줘
가능한 plan:
step_1 FRG cloud: 상습 정체 지역 후보 검색
step_2 FRG cloud: step_1 결과 지역의 오늘 정보 조회, input_from=step_1
step_3 DEF cloud: 사용자에게 결과 요약, input_from=step_2
이 경우 depends_on도 필요하지만 핵심은 input_from이다. step_2가 step_1의 결과를 의미적으로 사용해야 하기 때문이다.
8. Mixed Cloud + Device 계획
Cloud-only 판단과 device 실행이 섞이는 경우도 있다.
예시 발화:
오늘 미세먼지 심하면 거실 청정해줘
가능한 plan:
step_1 FRG/ODL cloud-or-device: 오늘 미세먼지 또는 현재 공기질 확인
step_2 DEF cloud: 기준 초과 여부 판단
step_3 ODL device: 조건 충족 시 거실 청정 시작, input_from=step_1, depends_on=step_2
이 구조에서는 Planner가 조건과 순서를 표현하고, 실제 device 실행 가능성은 device_context와 온디바이스/DeviceAgent 계약이 보장해야 한다.
9. Speech-LLM 운영 규칙
Speech 환경에서는 텍스트 챗보다 아래 리스크가 크다.
| 리스크 | 운영 규칙 |
|---|---|
| STT fragment | STT_NULL로 닫기 전에 살아 있는 target/reply shape/agent direction을 확인한다. |
| 발화 중 주제 전환 | active workflow보다 현재 발화를 우선하고 continuation/cancel/topic_shift를 판별한다. |
| 짧은 슬롯 응답 | active workflow가 있으면 내일, 7시, 거실 같은 fragment도 workflow slot으로 해석한다. |
| 복합명령 일부 누락 | 실행 가능한 prefix와 missing slot을 분리하고, 필요한 경우 가장 좁은 follow-up만 묻는다. |
| mode 진입 중 interruption | story/tutor mode는 session owner지만, 중단/전환/부가 요청은 main router가 감독한다. |
10. Memory 연결
메모리는 context-aware 판단의 보조 계층이다.
| 계층 | 단위 | 주요 내용 |
|---|---|---|
| Short-term | user-assistant pair, active session | 최근 발화, active workflow, pending task, unresolved slot |
| Mid-term | day/week summary | 반복되는 의도, 이어지는 task, session-level preference |
| Long-term | user/device profile | 명시 확인된 안정 선호, 저장 루틴, 장기 device fact |
메모리 승격 기준:
- short-term은 매 turn 기록한다.
- mid-term은 session/day 단위 요약과 반복 맥락을 보존한다.
- long-term은 명시 확인 또는 반복 증거가 있는 안정 정보만 저장한다.
11. 현재 위키에서 보강된/보강해야 할 부분
| 항목 | 현재 상태 | 보강 필요성 |
|---|---|---|
| A2A 전체 구조 | system-overview, visual-map에 존재 |
Speech-LLM context 흐름을 본 문서로 보강 |
| Planner 판단 | planner-routing에 존재 |
Agent/Skill 책임과 연결을 더 명확히 해야 함 |
| 복합제어 | device-task-flow, scenario-walkthroughs에 존재 |
Cloud-only, device-only, mixed 예시를 회귀 테스트로 고정 필요 |
| Agent & Skills | 일부 family 설명만 존재 | route family와 실제 agent/skill 책임 매핑을 별도 기준으로 유지 필요 |
| Context-aware | memory, device_context 문서가 분리됨 |
context priority와 conflict rule을 공통 기준으로 유지 필요 |
| Speech 환경 | 명시 문서 부족 | STT_NULL, slot fragment, interruption, mode handling 기준 필요 |
| 검증 | validation, requirements-traceability에 존재 |
Speech-noisy fixture, mixed multi-step fixture, event replay fixture 추가 필요 |
12. 구현/검증 체크리스트
| 체크 | 완료 기준 |
|---|---|
| Planner prompt | recognized_text, voice_context, device_context, memory_snapshot의 우선순위가 명시되어 있다. |
| Response schema | steps[].depends_on, steps[].input_from, steps[].execution_target, steps[].wait_policy가 보존된다. |
| Agent catalog | family별 실행 agent/skill과 제외 범위가 문서/테스트 fixture에 연결된다. |
| Cloud runtime | Cloud-only step, device step, mixed step 변환 테스트가 있다. |
| On-device bridge | device_intent_step 순차 실행과 local unlock 테스트가 있다. |
| DeviceAgent TaskManager | submitWorkflow, onTaskEvent, reason_code, requires_cloud_decision 계약이 검증된다. |
| Memory | short/mid/long memory read/write 정책과 DB schema가 분리 검증된다. |
| Speech regression | STT_NULL, noisy DEF/FRG/ODL/SCH, slot fragment, mode interruption fixture가 있다. |