19.comToMe A2A Workflow Example
이 문서는 /home/silogood/work/19.comToMe 폴더의 설계 자료를 A2A Wiki 관점으로 다시 정리한 것이다.
실제 폴더 내용은 command 하나가 아니라 ComeToMe 이동/추종 기능 설계다. 따라서 이 문서는 아래 기능을 A2A/TaskManager 구조에 어떻게 얹을지 설명한다.
"나에게와"사용자 방향 기반 ComeToMe"거실로와","주방으로와"같은 등록 장소 기반 이동- 1단계 이상에서 등록 화자 확인 gate
- DoA, Vision, AMR, FollowMe를 연결하는 장기 task lifecycle
- 2단계 이상에서 화자/공간 기반 후속 연속동작
- 3단계에서 후속 기능 제안
원본 근거:
/home/silogood/work/19.comToMe/docs/strategy/short-term/com-to-me-system-design.md
/home/silogood/work/19.comToMe/docs/strategy/short-term/com-to-me-speaker-recognition-service-scenario.md
/home/silogood/work/19.comToMe/docs/diagrams/com-to-me-flow.mmd
/home/silogood/work/19.comToMe/docs/diagrams/com-to-me-speaker-recognition-service.svg
1. 실제 19.comToMe 폴더 내용
현재 폴더는 코드 구현체보다 설계 문서와 다이어그램 중심이다.
| 파일 | 내용 |
|---|---|
com-to-me-system-design.md |
ComeToMe 전체 시스템 설계. 단계별 rollout, TaskManager lifecycle, DoA/Vision/AMR/FollowMe 연결, 실패 정책 포함 |
com-to-me-speaker-recognition-service-scenario.md |
Sherpa ONNX 기반 화자인식 PoC 분석과 ComeToMe 1단계 speaker gate 시나리오 |
com-to-me-flow.mmd |
Mermaid 기반 ComeToMe task lifecycle |
com-to-me-speaker-recognition-service.svg |
화자인식 서비스 시나리오 구조도 |
핵심은 ComeToMe를 단발 ODL 명령으로 보면 안 된다는 점이다. 이 기능은 호출어, 의도 분류, stage gate, 화자인식, DoA, Vision, AMR, FollowMe, 후속 task가 이어지는 장기 device workflow다.
2. 단계별 기능 범위
원본 설계는 ComeToMe를 0-1, 0-2, 1, 2, 3 단계로 확장한다.
| 단계 | 범위 | 포함 기능 | 제외/보류 |
|---|---|---|---|
| 0-1 | "나에게와" 단일 기능 |
호출어, ComeToMe 의도, DoA, 회전, Vision 사용자 감지, AMR 접근 좌표 생성, FollowMe 시작 | 화자인식, 등록 장소 이동, 공간인식, 후속 기능 |
| 0-2 | 등록 방 기반 공간 이동 | 0-1 + 사용자 등록 방 이름/좌표 매핑, "거실로와", "주방으로와" 등 장소명 기반 이동 |
화자인식 기반 권한/개인화, 공간인식, 후속 기능 |
| 1 | 화자인식 연동 | 0-2 + 음성 등록, 등록 화자 인식, 화자별 설정/장소 매핑 정책 | 공간인식 기반 후속 연속동작 |
| 2 | 화자구분 + 공간인식 + 후속 연속동작 | 화자별 ComeToMe, 공간/방 인식, 도착 후 다음 기능 수행 | 능동적 후속 기능 제안 |
| 3 | 후속 기능 제안 | 상황/위치/화자 기반 다음 기능 추천, 사용자 확인 후 실행 | 자동 실행은 별도 정책 필요 |
3. A2A에서의 해석
Cloud A2A Planner는 ComeToMe 내부의 DoA/Vision/AMR 세부 단계를 매번 LLM으로 재계획하면 안 된다. Cloud의 역할은 사용자의 발화를 다음처럼 큰 의도와 slot으로 정리하는 것이다.
예시 발화:
하이나무, 나에게와
Planner 관점:
{
"turn_mode": "singleton",
"selected_routes": ["ODL"],
"steps": [
{
"id": "step_1",
"route": "ODL",
"purpose": "사용자 방향 기반 ComeToMe 실행",
"execution_target": "device",
"device_intent": {
"method": "comeToMe",
"params": {
"commandType": "user_direction",
"utterance": "나에게와"
}
}
}
]
}
예시 발화:
하이나무, 거실로와
Planner 관점:
{
"turn_mode": "singleton",
"selected_routes": ["ODL"],
"steps": [
{
"id": "step_1",
"route": "ODL",
"purpose": "등록 장소 기반 ComeToMe 실행",
"execution_target": "device",
"device_intent": {
"method": "comeToMe",
"params": {
"commandType": "place_name",
"roomName": "거실",
"utterance": "거실로와"
}
}
}
]
}
4. DeviceAgent TaskManager로 내려가는 구조
온디바이스 Bridge는 Cloud step을 DeviceAgent TaskManager.submitTask 또는 submitWorkflow로 넘긴다.
단일 ComeToMe task 예:
{
"method": "submitTask",
"taskMethod": "comeToMe",
"source": "cloud_a2a",
"cloud_workflow_id": "wf_cometome_001",
"cloud_step_id": "step_1",
"cloud_output_key": "cometome_result",
"commandType": "place_name",
"roomName": "거실",
"rolloutStage": "0-2"
}
2단계 이상에서 후속 연속동작이 붙는 경우는 workflow가 된다.
{
"method": "submitWorkflow",
"workflowName": "come_to_me_followup_workflow",
"source": "cloud_a2a",
"cloud_workflow_id": "wf_cometome_002",
"subTasks": [
{
"taskMethod": "comeToMe",
"commandType": "place_name",
"roomName": "거실",
"rolloutStage": "2",
"cloud_step_id": "step_1",
"cloud_output_key": "cometome_arrival_context"
},
{
"taskMethod": "followUpDeviceAction",
"inputFrom": "cometome_arrival_context",
"cloud_step_id": "step_2",
"cloud_output_key": "followup_result"
}
]
}
중요한 점:
- Cloud는
DoA -> 회전 -> Vision -> target_pose -> AMR -> FollowMe를 세부 task로 쪼개서 매번 판단하지 않는다. - DeviceAgent의
ComeToMeTaskManager또는TaskManager내부 executor가 이 세부 lifecycle을 관리해야 한다. - Cloud가 개입하는 시점은 실패/차단/사용자 확인 필요처럼
requires_cloud_decision=true인 경우다.
5. ComeToMe TaskManager 내부 lifecycle
원본 설계의 lifecycle은 다음 구조다.
A1 대기
-> 호출어 "하이나무" 감지
-> ComeToMe 의도 분류
-> rollout stage 확인
-> stage >= 1이면 등록 화자 확인
-> 명령 타입 분기
- user_direction: DoA 각도 판별 -> 회전 -> Vision 사용자 감지 -> target_pose 생성
- place_name: 장소명 해석 -> 등록 장소 좌표 조회 -> target_pose 생성
-> AMR에 target_pose 전달
-> AMR 목적지 도착
-> Vision / Speaker 사용자 확인
-> FollowMe 대상 확인
-> FollowMe 수행
-> stage >= 2이면 후속 연속동작
-> stage >= 3이면 후속 기능 제안
이 lifecycle은 DeviceAgent/SoC 쪽에서 task state machine으로 구현되어야 한다.
6. 화자인식 gate
원본 com-to-me-speaker-recognition-service-scenario.md 기준:
- Sherpa ONNX
SpeakerEmbeddingExtractor를 사용한다. - PoC 기준 engine 기본 threshold는
0.45f, 서비스 수락 기준은0.50f후보로 기록되어 있다. - 등록은 3회 이상 발화를 기준으로 speaker profile을 만든다.
- 식별은 best speaker, score, 2위 후보와 margin, 다화자/겹침/잡음 stop 조건을 함께 본다.
- 1단계 이상에서만 ComeToMe/장소 이동 앞단에 등록 화자 확인 gate를 둔다.
판단 결과 예:
data class SpeakerVerificationResult(
val speakerId: String?,
val displayName: String?,
val score: Float,
val margin: Float?,
val threshold: Float,
val accepted: Boolean,
val reason: String
)
TaskManager 판단:
| 상황 | 판단 | 동작 |
|---|---|---|
| 0-1/0-2 stage | speaker gate bypass | 기존 단계 기능 수행 |
| 1단계 이상 + 등록 화자 accepted | 통과 | DoA 또는 장소 이동 진행 |
| 등록 profile 없음 | 실패 | 이동하지 않고 등록 안내 |
| score threshold 미달 | 실패 | 이동하지 않고 재시도 안내 |
| best/second margin 부족 | 불확실 | 이동하지 않고 재확인 |
| 다화자/겹침 발화 | 불확실 | 한 명씩 말하도록 안내 |
| 2단계 이상 + speaker_id 확정 | 통과 | 후속 연속동작 context에 speaker_id 전달 |
7. 실패 reason contract
ComeToMe는 물리 이동과 사용자 인식이 결합된 기능이므로 실패 reason이 중요하다.
| 실패 | DeviceAgent reason 후보 | Cloud 동작 |
|---|---|---|
| 의도 confidence 부족 | LOW_INTENT_CONFIDENCE |
재질문 또는 대기 |
| stage 밖 기능 요청 | FEATURE_STAGE_UNAVAILABLE |
현재 단계 미지원 안내 |
| 등록 화자 없음 | SPEAKER_PROFILE_NOT_FOUND |
등록 안내 |
| 화자 score/margin 부족 | SPEAKER_VERIFICATION_FAILED |
재시도/재확인 |
| 장소명 미등록 | ROOM_NOT_FOUND |
장소 재확인/등록 안내 |
| 장소 좌표 불일치 | LOCATION_POSE_INVALID |
재등록 안내 |
| DoA confidence 부족 | DOA_CONFIDENCE_LOW |
재시도 안내 |
| Vision 사용자 미감지 | PERSON_NOT_FOUND |
재호출 유도 |
| AMR 경로 실패 | PATH_BLOCKED 또는 NAVIGATION_FAILED |
대체/중단 replan |
| FollowMe 대상 소실 | FOLLOW_TARGET_LOST |
FollowMe 미시작 또는 재탐색 |
| stale event | STALE_EVENT |
무시/로그 |
예시 event:
{
"eventName": "FAILED",
"taskMethod": "comeToMe",
"cloud_workflow_id": "wf_cometome_001",
"cloud_step_id": "step_1",
"reason_code": "SPEAKER_VERIFICATION_FAILED",
"reason_params": {
"rolloutStage": "1",
"score": 0.42,
"threshold": 0.5,
"commandType": "user_direction"
},
"requires_cloud_decision": true,
"suggested_action": "ASK_USER_RETRY_OR_ENROLL"
}
8. A2A 통합 설계 판단
권장 구조:
- Cloud Planner는
comeToMe를 ODL device intent로 판단한다. - Cloud Runtime은
device_task_requests로 변환한다. - On-device Bridge는
TaskManager.submitTask또는submitWorkflow로 전달한다. - DeviceAgent는
ComeToMeTaskManager또는TaskManagerexecutor에서 stage gate와 세부 lifecycle을 관리한다. - DoA/Vision/AMR/FollowMe 정상 진행은 로컬에서 처리한다.
- Cloud replan은 structured reason과
requires_cloud_decision=true가 있는 경우만 연다.
피해야 할 구조:
- Cloud가 DoA/Vision/AMR 세부 이벤트마다 LLM을 호출한다.
- Cloud가
target_pose를 추측해서 직접 만든다. - 화자인식 실패에도 이동을 시작한다.
- 장소명 기반 이동에서 등록 좌표와 현재 map frame 일치성을 확인하지 않는다.
- Vision 120도/3m 범위를 벗어난 사용자를 억지로 target으로 만든다.
- FollowMe 전환 시 사용자 후보 연속성 검증을 하지 않는다.
9. 원본 설계의 주요 제약
원본 설계에서 명시된 중요한 제약:
- Vision은 전방 120도, 3m 이내에서 안정적으로 좌표 특정이 가능한 것으로 가정한다.
"일로와","따라와"처럼 의미/음향 패턴이 가까운 발화 간 의도 분류 혼동 가능성이 있다.- DoA 오차가 크면 회전 후 Vision 유효 범위에 사용자가 들어오지 않을 수 있다.
- 화자인식은 등록 음성 품질, 주변 소음, 발화 길이, 마이크 입력 품질에 따라 false accept/false reject가 발생할 수 있다.
- 음성 프로필은 생체 정보에 준해 동의/삭제/암호화 정책이 필요하다.
- 장소명 기반 이동은 방 이름과 좌표의 최신성, map frame 일치성, 중복/유사 장소명 처리에 영향을 받는다.
10. 검증 시나리오
| 시나리오 | 입력 | 기대 결과 |
|---|---|---|
| 0-1 정상 | A1 대기, "하이나무", "나에게와", 정면 2m 사용자 |
화자인식 없이 좌표 생성, AMR 이동, FollowMe 시작 |
| 0-1 범위 제한 | 0-1에서 "거실로와" |
장소명 이동 미지원 처리, AMR 이동 없음 |
| 0-2 장소명 이동 | "거실로와", 등록 좌표 있음 |
등록된 거실 좌표로 이동 후 사용자 확인 |
| 0-2 장소명 미등록 | "서재로와", 등록 없음 |
이동하지 않고 장소 등록/재확인 안내 |
| 1 화자 미등록 | 미등록 사용자가 ComeToMe 발화 | DoA/AMR 이동 전 실행 보류 |
| 1 화자 오거부 | 등록 사용자가 소음 환경에서 발화 | 낮은 confidence면 재시도 안내, 이동 보류 |
| 2 후속 연속동작 | 화자와 공간 확인 후 후속 task 연결 | ComeToMe 완료 후 다음 기능 수행 |
| 3 후속 기능 제안 | 도착 위치와 화자 기반 추천 후보 생성 | 사용자 확인 전 자동 실행하지 않음 |
| DoA 오차 | 실제 사용자 60도, DoA가 크게 벗어남 | Vision 미감지 또는 confidence 실패로 이동 중단 |
| Vision 거리 초과 | 사용자 4m | 좌표 생성하지 않고 실패 처리 |
| stale event | 이전 task의 AMR/Vision event가 늦게 도착 | task_id 불일치로 무시하고 stale event 기록 |