← Docs hub
LLM 업무 역할·책임: A2A 제외 범위
이 문서는 지금까지 함께 진행한 LLM 제품 업무 중 A2A를 제외한 범위를
업무 패키지와 역할 단위로 정리한다. 단순한 작업 목록이 아니라 각 업무의
책임자, 협업 경계, 입력, 산출물, 완료 기준을 명시해 기획·개발·검증·운영
사이의 누락과 중복을 줄이는 기준 문서다.
실제 업무 항목과 담당을 먼저 확인하려면
LLM 업무 목록과 역할·책임에서
87개 업무를 순번 · 수행 책임 · 최종 책임 · 산출물 기준으로 본다. 현재 문서는 그 목록의
구조·시나리오·완료 기준을 설명하는 상세 해설서다.

1. 범위 선언
포함
음성 신호 수신
-> STT와 전처리
-> 온디바이스 dictionary / local LLM
-> Cloud LLM 일반 응답·rewrite·RAG
-> TTS와 음성 세션 상태
-> Android system app 배포
-> E2E 품질·장애·비용·운영
명시적 제외
| 제외 영역 |
이 문서에서 다루지 않는 책임 |
이어서 볼 문서 |
| A2A Router |
family, owner agent, skill 선택 |
A2A Category |
| Semantic Planner |
typed step, dependency, condition, replan |
A2A Knowledge Hub |
| Experience Goal |
상위 목표, effect, observation, bounded adaptation |
Experience Goal Category |
| TaskManager |
queue, workflow, executor, callback, scheduling |
DeviceAgent / SoC |
| On-device A2A Bridge |
Cloud plan을 device task/workflow로 변환 |
On-device Bridge |
Cloud LLM을 사용한다는 이유만으로 모든 업무가 A2A가 되는 것은 아니다. 이
문서는 사용자 음성을 안정적인 입력으로 만들고, 로컬·Cloud 모델에서 답변 또는
재진입 표현을 생성하고, TTS까지 안전하게 종료하는 제품 LLM 경로를 소유한다.
2. R&R을 나누는 원칙
| 원칙 |
적용 기준 |
| 사실 소유자가 책임진다 |
PCM은 Audio/STT, model lifecycle은 On-device Runtime, HTTP 결과는 Cloud LLM이 소유한다. |
| 의미 판단과 실행을 섞지 않는다 |
일반 응답·rewrite는 LLM 범위지만 기기 task의 순서·완료 판단은 제외한다. |
| 검증 수준을 구분한다 |
compile, unit, dry-run, connected device, 실음성 acceptance를 같은 성공으로 쓰지 않는다. |
| 장애를 한 단어로 묶지 않는다 |
LLM 실패 대신 Audio, STT, dictionary, local inference, Cloud, TTS, Android lifecycle로 분해한다. |
| 운영 산출물까지 완료 조건에 넣는다 |
코드뿐 아니라 로그, 테스트 결과, release APK 검증, runbook까지 닫혀야 한다. |
3. 업무 패키지 목록
WP-01 · Voice Ingress와 음성 세션
| 항목 |
내용 |
| 핵심 책임 |
F1/F2/F3, pre/main recording, end-of-speech, 취소, timeout, 다음 turn 진입을 일관되게 관리 |
| 주요 코드 |
ForegroundService, MyAccessibilityService, F123BroadcastReceiver, CancelableTimer |
| 입력 |
wake-up/F-key event, PCM callback, 사용자 취소, timeout |
| 출력 |
STT에 전달할 완결된 turn, recording 상태, 실패·취소 상태 |
| 협업 경계 |
Audio HAL/AFE는 PCM 품질을 보장하고, LLM Voice Runtime은 turn lifecycle과 buffer 소유권을 보장 |
| Done 기준 |
반복 F1/F2/F3에서 입력 종료, buffer 반환, timer 정리, PID 유지, 다음 turn 정상 시작 |
WP-02 · STT, 전처리와 발화 정규화
| 항목 |
내용 |
| 핵심 책임 |
SenseVoice STT 초기화·추론, 언어별 모델, raw/processed 음성 비교, 오인식 보정과 입력 품질 분석 |
| 주요 코드 |
SpeechRecognitionService, AudioRecordManager, SttPreprocessPipeline, AudioPreprocessor, STTSubstitutor |
| 입력 |
PCM, 언어 설정, preprocessing flag |
| 출력 |
recognized text, STT latency, raw/processed evidence, 실패 원인 |
| 협업 경계 |
SoundFlow/Kardome은 신호 품질, STT 담당은 decoder 결과와 전처리 손실을 책임 |
| Done 기준 |
WER/CER 또는 제품 발화 성공률, latency, dropout, raw 대비 processed 영향이 분리 측정됨 |
전처리 개선은 파형이나 dB proxy만으로 완료하지 않는다. 최종 제품 판정은 실제
decoder 결과 또는 제품 E2E 성공률로 닫는다.
WP-03 · Dictionary와 로컬 기능 문장 처리
| 항목 |
내용 |
| 핵심 책임 |
발화 normalization, contains/exact match, <sk_xx> token 생성, positive/negative collision 관리 |
| 주요 코드 |
PreDefinedCommandMatcher, CommandContainsMatcher, CommandContainsFinder, FunctionCallHandler, dictionary assets |
| 입력 |
recognized text, locale, device state 조회값 |
| 출력 |
local token, local answer, Cloud fallback 후보 |
| 협업 경계 |
token의 실제 기기 기능 의미는 DeviceAgent API와 합의하지만 task orchestration은 소유하지 않음 |
| Done 기준 |
positive fixture 통과, negative collision 차단, rewrite 재진입 호환, 미지원 입력의 안전한 fallback |
WP-04 · 온디바이스 LLM Runtime
| 항목 |
내용 |
| 핵심 책임 |
Genie/QaClient 초기화, infer, unload, restart, 모델 상태 전이, native 자원 해제 |
| 주요 코드 |
QaClient, ForegroundService.processLLAMA, initializeLLAMA, restartLLM, JNI main.cpp |
| 입력 |
prompt, conversation history, model lifecycle event |
| 출력 |
local model response, init/infer latency, restart 상태, native 오류 evidence |
| 협업 경계 |
Android service가 lifecycle을 호출하고, runtime 담당이 native context와 resource ownership을 닫음 |
| Done 기준 |
cold/warm init, 반복 infer, unload/reload, error/restart, destroy 중 callback을 포함한 stress 통과 |
빈 출력 뒤 재시작 가능한 오류와 JNI fatal crash는 다른 문제다. 전자는 app-level
recovery로 다루고, 후자는 tombstone·process death·LMKD evidence로 판정한다.
WP-05 · Cloud LLM 일반 응답, Rewrite와 RAG
| 항목 |
내용 |
| 핵심 책임 |
Cloud 인증·호출, 일반 답변, 제품 기능 재진입용 rewrite, 문서/Web RAG, timeout·retry·fallback |
| 주요 코드 |
ChatRepository, CloudApiService, AuthInterceptor, Cloud Lambda full_rag, Gemini client |
| 입력 |
STT text, locale, 필요한 제품·문서 context |
| 출력 |
case, response, rewrite_query, there_is_question_mark, 오류 코드 |
| 협업 경계 |
이 패키지는 A2A owner/plan을 생성하지 않고 일반 응답과 기존 local path 재진입 품질만 소유 |
| Done 기준 |
response/rewrite 계약 검증, credential·403·5xx·timeout 분리, retry 상한, 근거 없는 제품 기능 약속 차단 |
Cloud가 기기 기능을 직접 수행했다고 말하지 않는다. 기능 실행이 필요하면
온디바이스가 이해할 수 있는 안정적인 rewrite/token 후보를 반환하거나, 지원하지
않는 경우 명확한 사용자 응답으로 종료한다.
WP-06 · TTS와 사용자 응답 품질
| 항목 |
내용 |
| 핵심 책임 |
TTS normalization, queue, 중복 제거, 재생·중지·오류, 음성 세션 상태, 사용자-facing 문장 품질 |
| 주요 코드 |
TTSNormalizer, AudioPlayManager, TTSText, ForegroundService, DeviceCommunicator |
| 입력 |
local/Cloud response text, language, TTS lifecycle event |
| 출력 |
재생 가능한 문장, STATE_TTS_*, 완료·중지 상태 |
| 협업 경계 |
LLM은 말할 내용을, TTS Runtime은 재생과 terminal state를 책임 |
| Done 기준 |
내부 field·영문 debug 표현 미노출, 중복 발화 없음, cancel/error 후 idle 수렴, 다음 음성 turn 방해 없음 |
WP-07 · 화자 식별과 LLM Turn 결합
| 항목 |
내용 |
| 핵심 책임 |
CPU STT와 QNN speaker embedding 병렬 처리, turn hard join, dominant speaker, fallback, 등록 lifecycle |
| 주요 코드 |
SpeakerQnnIsolatedService, SpeakerQnnProcessClient, TurnInferenceCoordinator, DominantSpeakerResolver |
| 입력 |
같은 turn의 PCM/WAV, 등록 profile |
| 출력 |
recognized text + speaker result, confidence, fallback 상태 |
| 협업 경계 |
화자 결과를 개인화에 제공하지만 A2A owner selection이나 권한 정책은 이 문서의 범위 밖 |
| Done 기준 |
STT 비차단 fallback, Binder/PFD 전달, companion release, 실화자 FAR/FRR/EER와 장시간 메모리 gate |
WP-08 · 성능, 메모리와 비용 최적화
| 항목 |
내용 |
| 핵심 책임 |
end-to-end latency, local/Cloud call 비율, token, cache, PSS/RSS/CMA, thread·buffer retention 관리 |
| 입력 |
latency trace, token ledger, meminfo, LMKD, FastRPC, cold/warm run |
| 출력 |
baseline, 병목 분해, 예산, 최적화 전후 회귀 결과 |
| 협업 경계 |
비용 절감을 위해 의미 품질을 임의로 낮추지 않고 QA acceptance와 함께 변경 |
| Done 기준 |
STT·local LLM·Cloud·TTS 구간별 p50/p95, token/call, memory high-water와 품질 지표를 함께 비교 |
WP-09 · Android 통합, 시스템 앱 배포와 보안
| 항목 |
내용 |
| 핵심 책임 |
release build, platform signing, /system/priv-app 교체, 권한, process/service 상태, rollback 준비 |
| 입력 |
source revision, release APK, platform certificate, target device |
| 출력 |
검증된 system APK, backup, 설치·부팅·서비스 evidence |
| 협업 경계 |
Android/SoC 담당이 image·SELinux·privileged permission을 소유하고 LLM 담당이 앱 runtime을 검증 |
| Done 기준 |
cert·hash·owner·mode·SELinux 확인, debug cert 차단, reboot 후 package/PID/서비스/음성 E2E 확인 |
WP-10 · QA, 장애 분석, 문서와 운영
| 항목 |
내용 |
| 핵심 책임 |
test set, log correlation, tombstone/ANR/LMKD 분석, 회귀 기준선, release note, runbook, wiki 관리 |
| 입력 |
발화셋, logcat, Cloud log, tombstone, test report, source revision |
| 출력 |
재현 절차, 원인 계층, 수정 근거, acceptance 판정, 공개 가능한 기술 문서 |
| 협업 경계 |
QA는 증거와 판정을 독립적으로 유지하고 구현 담당은 결함 수정과 재검증을 수행 |
| Done 기준 |
문제→방법→측정→해석→영향이 연결되고, compile 결과와 실기기 evidence가 구분됨 |
4. 실제 세부 프로젝트 포트폴리오
아래 표는 업무 패키지를 실제 릴리즈 과업으로 내린 목록이다. 사용자가 제공한
LLM Release Note의
항목을 기준으로 git history, 현재 source, 기존 설계·검증 문서를 대조했다.
인증이 필요한 Notion 본문은 사용자가 전달한 업무 목록을 입력 기준으로 삼았으며,
구현 여부는 별도로 로컬 코드와 commit evidence에서 확인했다. 상태는 다음처럼
해석한다.
| 상태 |
의미 |
| 구현 근거 확인 |
current source 또는 특정 branch/commit에서 구현 흔적을 확인 |
| 설계·정책 필요 |
요구는 있지만 parameter, API, 기본값 또는 UX 합의가 먼저 필요 |
| 검증·운영 |
코딩보다 test set, SQE, release evidence가 핵심인 업무 |
| 이슈 분석 |
원인 분리와 타 계층 협의가 우선인 업무 |

4.1 Schedule, Interaction과 Night Mode
| Project |
사용자 시나리오 |
LLM·On-device 책임 |
협업 경계 |
상태·근거 |
| A1 스케줄 유형별 UI 문구 |
등록·조회·중복·실패마다 TTS와 화면 문구가 달라짐 |
schedule type, 성공·중복·일반 실패를 동일 문구 계약으로 정리 |
Launcher UI, Schedule API, SQE |
구현·운영 혼합. strings.xml, SK_48 flow |
| 인터랙션 스케줄 |
“웨이크업 스케줄 멈춰줘”, “릴렉스 다시 시작해줘” |
웰컴·웨이크업·릴렉스의 pause/resume/stop과 지원 불가 start를 구분 |
Device 상태의 interSchedule, 콘텐츠 재생 |
구현 근거 확인. prompt와 DeviceActionStatusStore |
| 스케줄 backlog |
조회·삭제·중복·온디바이스 전용·Cloud 등록의 미완성 구간 관리 |
token/action과 실제 API coverage gap을 backlog로 유지 |
Schedule backend, DeviceAgent |
설계·정책 필요. SK48_SCHEDULE_FLOW_STATUS_2026-06-01.md |
| Phase 3 스케줄 설계 |
요일·시간·공간·청정 방식이 결합된 예약 |
time/day/place/mode slot과 payload, 질문 순서를 확정 |
제품 사양, backend schema, UI |
설계·정책 필요 |
| 고정 청정 스케줄 |
“평일 오후 5시에 고정 청정해줘” |
<sk_48>(action=1), 시간·요일, duplicate 처리, 성공 TTS |
local/server schedule 저장소 |
구현 근거 확인. b8a4aca1, 039aaf5d |
| 전체·선택 청정 스케줄 |
“내일 8시에 거실과 안방 청정해줘” |
map/space 확인, 선택 공간 payload와 순서, 누락 slot 질문 |
map/place API, CLMD0003 계약 |
전체 청정 skeleton 확인, 선택 청정 계약은 보강 필요 |
| 나이트모드 실행 |
“나이트 모드 켜줘”, “항상 켜둬”, “예약 모드 해제해줘” |
상시·시간지정·상태조회·중복·해제 상태를 분리 |
Ghost mode, Night mode time API |
MR8 구현 근거 확인. 8b29e91c, bbc4043c |
| 나이트모드 시작 시간만 발화 |
“밤 10시부터 나이트 모드 켜줘” |
종료 시간 누락 시 질문할지 default를 적용할지 결정 |
제품 UX 정책 |
정책 필요. MR8 ref는 20:00~07:00 default 사용 |
| Night Mode Rewrite Query |
Cloud가 “예약 나이트 모드 설정”처럼 local path가 이해할 문장을 반환 |
Case 2 rewrite의 type·enable·시간 보존, 재진입 collision 방지 |
Cloud prompt, local dictionary |
구현·회귀 업무. 0bf5ea81, bbc4043c |
현재 MR8 reference의 NightModeDecisionResolver에는 예약 기본값
20_00~07_00, 상시/시간지정 전환, 상태조회와 중복 분기가 있다. 다만 현재
작업 checkout과 MR8 reference가 다를 수 있으므로 브랜치 존재를 제품 반영
완료로 간주하지 않는다. 대상 release branch에서 다시 정합·검증해야 한다.
4.2 Product Function, UI와 응답 시나리오
| Project |
대표 발화·상황 |
담당 작업 |
핵심 검증 |
상태·근거 |
<sk_39> 대기화면 커스텀 공기질 |
“대기화면을 커스텀 공기질로 바꿔줘” |
theme parameter, 현재 theme, custom image 존재, TTS와 API를 함께 변경 |
기존 theme=2 상세 공기질과 신규 custom 충돌 |
설계 필요. docs/sk39_custom_air_quality_theme_design.md |
| 날씨 응답 |
“오늘 날씨 어때”, “내일 쿠알라룸푸르 날씨 알려줘” |
timeframe·location·단위·최저/최고·습도와 오류 문구 |
location 없음, network 실패, 7일 범위, TTS 발음 |
구현 근거 확인 |
scattered_clouds 의미 수정 |
날씨 API가 scattered clouds를 반환 |
내부 enum과 한국어 표시를 “대체적으로 맑음” 정책으로 정렬 |
icon/code와 번역·TTS 일치 |
commit d2b0e421; current branch 재확인 필요 |
| 알림함 설명 |
“What’s the advantage of a notification box?” |
지원 기능 설명과 음성 제어 미지원 안내를 구분 |
설명 질의를 삭제·제어 요청으로 오분류하지 않음 |
prompt/dictionary 검증 항목 |
| 올타임 모드 설명 |
“What is the all time mode?” |
prepared answer 또는 local/Cloud 일반 답변의 제품 사양 grounding |
<sk_49> 제어와 <sk_107> 설명 구분 |
영문 dictionary 근거 확인 |
| B2B 모드 답변 변경 |
B2B 제품에서 소비자용 안내가 노출되는 상황 |
product mode에 따른 답변·지원 범위·브랜드 문구 분리 |
NXSP-419 기대문구, B2C 회귀 |
정책·검증 업무 |
| 커스텀 공기질 딕셔너리 한·영 |
“상세 공기질”, “custom air quality screen” 등 |
mapping/contains/3-keyword와 negative phrase를 함께 관리 |
광범위 air quality가 조회·테마를 혼동하지 않음 |
dictionary 설계·회귀 업무 |
4.3 Cloud, Prompt와 입력 계약
| Project |
문제 |
책임 범위 |
Acceptance |
| Cloud 원문 발화 전달 |
normalization 이후 문장만 보내면 Cloud가 원래 의미를 잃을 수 있음 |
originalSttResult와 local filtered text를 분리하고 request·로그에 provenance 유지 |
같은 turn의 raw, processed, Cloud input을 log ID로 대조 |
| Rewrite Query 품질 |
Case 2가 맞아도 local dictionary가 rewrite를 이해하지 못하면 실행 실패 |
rewrite가 제품 용어, action, slot을 보존하고 local pipeline에 재진입하도록 prompt·dictionary 동시 관리 |
기대 Case, rewrite, token, API, TTS를 한 행에서 검증 |
| 일반 응답·FAQ |
notification box, all-time mode, 제품 장점 질문 |
제품 사양에 근거한 짧은 응답, 내부 field와 미지원 기능 약속 차단 |
한국어·영어 answer set과 TTS 자연스러움 |
| 날씨·공기질 context |
최신 외부 값과 제품 내부 상태를 답변에 사용 |
값의 source·freshness·missing/error를 prompt에 전달 |
stale/missing 상태에서 값을 추정하지 않음 |
| 말레이시아 지원 |
현지 영어 표현, 지명, haze, 서비스·보증 질문 |
영어 dictionary, place substitution, Malaysia RAG와 제품 기능 범위 분리 |
한국어 회귀 + 말레이시아 표현 negative/positive set |
| B2B/B2C 답변 분기 |
동일 질문의 제품·계약별 답변 차이 |
device/product mode를 bounded context로 사용 |
mode 없음, 잘못된 mode, mode 전환 후 cache 오염까지 검증 |
원문 전달은 구현 history f9e1851a와 현재 originalSttResult 경로에서 근거가
확인된다. 판정할 때는 “Cloud에 문자열이 보였다”로 끝내지 않고 STT raw,
processed, request body, Cloud response, rewrite 재진입을 같은 turn으로 묶어야 한다.
4.4 Quality, Release와 Field Operation
| Project |
실제 업무 |
필수 산출물 |
완료 Gate |
| 1차 EVAL set 보강 |
단순 인사부터 Case 2/3/4, 기능별 positive/negative 확장 |
발화, expected case/token/function/action/TTS, 모델 raw 결과 |
기능·언어·경계별 coverage와 재현 가능한 runner |
| Prompt Auto Evaluation |
기존 prompt와 후보 prompt를 model/judge로 비교 |
results.jsonl, results.csv, winner·confidence·case 비교 |
자동 judge와 수동 제품 판정 불일치 검수 |
| SQE 릴리즈 전 협의 |
릴리즈 후보, 기기·언어·기능 범위와 알려진 이슈 합의 |
acceptance matrix, blocker, waiver, 재시험 항목 |
SQE와 동일 APK/model/dictionary/prompt 기준선 확인 |
| 에러 리팩토링 |
error code가 이동·청정·LLM 중 어디를 막는지 재분류 |
ErrorGroup, 사용자 TTS, 상태 reset, 회귀표 |
E09, S02, management-only code 등 오그룹 차단 |
| 저전력 이동 중 emergency 분석 |
이동 중 battery/emergency 값 변화가 기능 차단·TTS에 미치는 영향 |
시간순 DeviceAgent/Quber/LLM log와 source owner |
SQEA1DEF1-1185/1004 재현, false block/unsafe continue 구분 |
| 날씨 field 이슈 |
위치·네트워크·단위·condition mapping·발음 문제 |
API raw, enum mapping, TTS/subtitle, locale 비교 |
data 문제와 LLM 표현 문제 분리 |
| 말레이시아 현지 검증 |
지명·기능 영어·RAG·미지원 표현 필드 테스트 |
local phrase set, Cloud 결과, token/API/TTS, vendor feedback |
현지 positive/negative 회귀와 국내 기능 회귀 동시 통과 |
| STT 모델 릴리즈 |
model artifact, 언어, decoder 성능과 앱 패키징 |
model hash/version, WER/CER, latency, APK asset 확인 |
cold/warm 실기기, noisy/clean, rollback 가능한 artifact |
| LLM 모델 릴리즈 |
local model/config/prompt/dictionary 호환성 검증 |
model hash, prompt version, token set, latency·memory |
기능 회귀, 빈 응답·restart, native lifecycle stress |
| MR8 브랜치 운영 |
schedule/night mode/dictionary/model 변경을 release line에 통합 |
기준 commit, 포함 목록, conflict, test report |
branch 생성 자체가 아니라 release APK 실기기 통과 |
5. 대표 시나리오와 E2E 판정
S-01 · 고정 청정 스케줄 등록
사용자: "평일 오후 5시에 고정 청정해줘"
STT raw/original
-> dictionary 또는 local LLM
-> <sk_48>(action=1, day=weekday, start=17:00)
-> on-device only / Cloud schedule 경로 판정
-> 동일 시간 중복 조회
-> 등록
-> 성공·중복·실패 TTS와 화면 반영
| 확인점 |
기대 결과 |
| 의미 |
일반 “스케줄”이 아니라 고정 청정 schedule로 확정 |
| slot |
요일과 시작 시간 보존, 임의 sample 값 사용 금지 |
| 저장 경로 |
on-device/server 기준과 network fallback 명확화 |
| 중복 |
메시지 문자열이 아니라 확정 error code 우선 |
| UX |
등록 결과와 실제 저장 결과가 일치 |
S-02 · 선택 공간 청정 스케줄
사용자: "내일 아침 8시에 거실하고 안방 청정해줘"
이 시나리오는 시간만 해석해서는 완료되지 않는다. 내일, 08:00, 거실,
안방, 선택공간청정 mode와 공간 순서를 보존해야 한다. 등록 공간이 없거나 이름이
불일치하면 임의 공간으로 대체하지 않고 구체적으로 되묻는다. 최종 Gate는
CLMD0003 payload와 backend·Device API 계약이 동일한지다.
S-03 · 인터랙션 스케줄 제어
| 발화 |
기대 처리 |
| “웨이크업 스케줄 시작해줘” |
음성 start 미지원 정책이면 앱/기기화면 안내 |
| “웨이크업 잠깐 멈춰줘” |
현재 interaction schedule 실행 중일 때 pause |
| “릴렉스 다시 시작해줘” |
paused 상태에서만 resume, 아니면 상태 기반 안내 |
| “스케줄 끝내줘” |
active interaction schedule을 stop하고 관련 상태 정리 |
여기서 웨이크업·릴렉스는 설명 질문과 실행 제어가 다르다. “웨이크업 기능이
뭐야”는 설명이고 “웨이크업 멈춰줘”는 현재 상태를 확인하는 제어다.
S-04 · 나이트모드 상시·시간지정 전환
| 발화 |
의미 |
기대 동작 |
| “나이트 모드 켜줘” |
generic ON |
현재 예약 대기·실행 상태를 보존해 적절한 안내 |
| “나이트 모드 항상 켜둬” |
always ON |
예약 mode를 해제하고 상시 mode로 전환 |
| “매일 밤 10시에 나이트 모드 켜줘” |
scheduled ON |
시작·종료 정책을 확정해 time mode 등록 |
| “나이트 모드 꺼줘” |
OFF |
현재 실행만 끌지 예약 자체도 삭제할지 사양대로 구분 |
| “나이트 모드 켜져 있어?” |
GET |
command 없이 현재 상시/예약대기/예약실행 상태 응답 |
시작 시간만 말한 경우 07:00 종료를 자동 적용할지 질문할지는 제품 정책이다.
LLM이 임의 종료 시간을 창작하지 않도록 prompt와 resolver가 같은 정책 상수를
사용해야 한다.
S-05 · 대기화면 커스텀 공기질
사용자: "대기화면을 커스텀 공기질로 바꿔줘"
-> SK_39 theme 의미 확정
-> 현재 theme 조회
-> custom image 존재 확인
-> 존재하면 setPuiWaitingScreenTheme
-> 없으면 앱에서 이미지 등록 안내
가장 큰 리스크는 기존 <sk_39>(theme=2)가 상세 공기질을 의미한다는 점이다.
따라서 dictionary만 추가하면 안 되고 parameter migration, enum, DB mapping,
multiturn 문구, API 값, 한국어·영어 regression을 함께 변경해야 한다.
S-06 · 날씨 상태와 번역
사용자: "내일 쿠알라룸푸르 날씨 알려줘"
-> STT 지명 보존
-> location/timeframe 전달
-> Weather API condition code
-> locale mapping
-> 온도 단위·최저·최고·습도
-> 자연스러운 TTS
scattered_clouds 변경은 단순 문구 수정이 아니다. API code, WeatherCondition,
한국어·영어 resource, icon과 prompt context가 같은 의미를 사용해야 한다.
S-07 · Cloud Rewrite 재진입
사용자: "밤 열 시부터 조용하게 나이트 모드 해줘"
-> originalSttResult를 Cloud에 전달
-> Case 2 + rewrite_query
-> local dictionary / local LLM 재진입
-> 기대 <sk_28> parameter 생성
-> 사전 검증과 Device API
-> TTS
Cloud Case가 맞아도 rewrite가 action·type·시간을 잃으면 실패다. 이 시나리오는
Case -> rewrite -> token -> API -> TTS 다섯 결과를 모두 평가한다.
S-08 · 말레이시아 제품 질의와 기능 실행 분리
| 입력 |
기대 경로 |
| “What is all-time mode used for?” |
제품 설명 answer |
| “Turn on all-time mode.” |
<sk_49> 제어 |
| “What’s the advantage of a notification box?” |
제품 설명 answer |
| “Delete all notifications.” |
음성 미지원이면 Case 4 안내 |
| “How is the haze in Kuala Lumpur?” |
현지 location·환경 Cloud/RAG |
같은 명사를 포함해도 설명, 상태조회, 실행, 미지원 기능이 다르다. Malaysia set은
영문 positive만 늘리지 않고 서로 충돌하는 negative pair까지 관리한다.
S-09 · STT·LLM 모델 릴리즈
모델 릴리즈는 파일 교체가 아니라 아래 compatibility bundle을 함께 고정하는
프로젝트다.
STT model + language config + preprocessing + substitution
Local LLM model + runtime config + prompt + dictionary/token schema
Cloud prompt/model + response contract + rewrite compatibility
TTS resource + Android release APK
release report에는 model hash, source commit, prompt/dictionary version, APK cert,
기기, latency·memory, 발화셋 결과와 rollback artifact가 함께 있어야 한다.
6. 프로젝트 단위 업무 카드 표준
앞으로 릴리즈 노트의 한 줄 업무는 다음 필드를 가진 카드로 관리한다.
| 필드 |
작성 기준 |
| 업무 번호 / 제목 |
SQE, 개발 대기목록, 릴리즈 노트 번호와 연결 |
| 사용자 시나리오 |
실제 사용 발화와 현재 기기 상태 포함 |
| 기대 의미 |
설명·조회·실행·예약·미지원 중 무엇인지 |
| 기대 계약 |
Case, 재질의, 토큰, 입력값, API, TTS |
| 1차 원인 책임 |
STT, 사전, 로컬 LLM, 클라우드, TTS, 기기 API 중 1차 책임 |
| 의존 대상 |
Launcher, Quber, DeviceAgent, 백엔드, SQE 등 |
| 인수 기준 |
정상·오류·중복·누락 입력·지역별 시험 기준 |
| 검증 근거 |
브랜치·커밋, APK·모델 해시, 로그, 시험 결과 |
| 미확정 정책 |
기본 시간, 지원 범위, 사용자 추가 질문 여부 |
| 출시 상태 |
설계, 구현, 통합, 실기기 검증, SQE 승인 |
이 형식이면 “나이트모드 개발”, “말레이시아 검증”처럼 범위가 큰 한 줄을 실제
실행 가능한 개발·검증 단위로 나눌 수 있다.
7. 역할별 세부 R&R
| 역할 |
Accountable |
Responsible |
Consulted / 협업 |
대표 산출물 |
| LLM Product / Technical Owner |
제품 목표, 우선순위, 지원 범위, 최종 acceptance |
요구사항·정답 정책 승인 |
모든 기술 역할 |
요구사항, 우선순위, Go/No-Go |
| Speech / STT Engineer |
음성 입력부터 recognized text 품질 |
AudioRecord, preprocessing, STT, substitution |
Audio/AFE, QA |
WER/CER, latency, raw/processed 비교 |
| On-device LLM Engineer |
local LLM과 voice runtime 안정성 |
dictionary, Genie, lifecycle, TTS 연결 |
Speech, Android, Cloud |
APK, unit/instrumentation, memory trace |
| Cloud LLM Engineer |
일반 응답·rewrite·RAG 계약과 가용성 |
prompt, API, credential, retry, error mapping |
On-device, QA, 문서 owner |
Lambda revision, contract tests, token report |
| Speaker / Personalization Engineer |
speaker inference 품질과 lifecycle |
enrollment, embedding, hard join, fallback |
Speech, UX, privacy |
FAR/FRR/EER, profile lifecycle evidence |
| Android / SoC Engineer |
system app 실행 환경과 platform 정합 |
signing, priv-app, permission, process, rollback |
On-device, QA |
signed APK 검증, device install evidence |
| QA / SQA |
독립된 release 판정과 회귀 기준선 |
test design, E2E, stress, evidence 분류 |
모든 구현 역할 |
baseline, defect report, acceptance matrix |
| Documentation / Operations |
재현 가능한 지식과 배포 |
runbook, architecture, release note, llmwiki |
Owner, 개발, QA |
wiki page, source map, 운영 절차 |
8. 현재 협업 기준 책임 분담
이 표는 조직 직책이 아니라 현재 사용자와 구현·검증 지원 사이의 의사결정
경계다.
| 구분 |
제품·기술 오너 |
구현·검증 지원 |
| 목표 |
제품 우선순위, 사용자 경험, 허용 가능한 동작 결정 |
목표를 코드·계약·테스트 단위로 분해 |
| 범위 |
포함·제외, 정답 정책, 배포 시점 승인 |
저장소와 실제 구현을 조사해 변경 범위 제안 |
| 구현 |
위험·정책상 승인 필요한 변경 결정 |
코드 수정, 충돌 정합, 빌드와 자동 테스트 |
| 실기기 |
기기 제공, 물리 동작·음성 체감 acceptance |
release signing 확인, push, logcat, 반복 검증 |
| 품질 |
애매한 정답과 사용자-facing 기준 최종 판단 |
실패 분류, 원인 분석, 회귀 결과와 위험 보고 |
| 릴리즈 |
commit/push/제품 반영 최종 통제 |
변경 목록, 민감정보 검사, wiki 배포와 증거 정리 |
원칙적으로 구현·검증 지원이 사용자 정책을 임의로 확정하지 않으며, 제품·기술
오너가 코드 근거 없이 구현 성공을 선언하지 않는다.
9. RACI 매트릭스
A는 최종 책임, R은 수행, C는 협의, I는 결과 공유다.
| 업무 |
Product Owner |
Speech |
On-device LLM |
Cloud LLM |
Android/SoC |
QA |
Docs/Ops |
| 음성 turn과 F1/F2/F3 |
C |
A/R |
R |
I |
C |
C |
I |
| STT·전처리 |
C |
A/R |
C |
I |
C |
R |
I |
| dictionary·local token |
A |
C |
R |
C |
I |
R |
I |
| local LLM lifecycle |
C |
I |
A/R |
I |
C |
R |
I |
| Cloud response·rewrite·RAG |
A |
I |
C |
R |
I |
R |
I |
| TTS·응답 UX |
A |
C |
R |
C |
C |
R |
I |
| 화자 inference |
A |
R |
R |
I |
C |
R |
I |
| latency·token·memory |
A |
R |
R |
R |
C |
R |
I |
| system APK release |
C |
I |
R |
I |
A/R |
R |
I |
| 장애 분석·release gate |
A |
C |
C |
C |
C |
R |
R |
10. 장애 분류와 인계 기준
| 관찰 증상 |
1차 소유 |
먼저 볼 증거 |
다음 인계 조건 |
| 말이 중간에 잘리거나 입력이 끝나지 않음 |
Voice/STT |
F1/F2/F3, AudioRecord, timer, buffer log |
PCM 자체가 끊기면 Audio/AFE로 인계 |
| recognized text가 틀림 |
STT |
raw/processed WAV, decoder result |
텍스트는 맞고 token만 틀리면 Dictionary로 인계 |
| local token이 잘못 매칭됨 |
On-device LLM |
normalized text, matched entry, negative fixture |
Cloud rewrite가 원인이면 Cloud LLM으로 인계 |
| Cloud 응답이 없거나 권한 오류 |
Cloud LLM |
HTTP status, credential, retry, Lambda log |
기기 네트워크 자체 문제면 Android/Network로 인계 |
| LLM 응답 후 앱이 죽음 |
On-device Runtime |
PID, tombstone, native backtrace, LMKD, PSS |
image/SELinux/permission이면 Android/SoC로 인계 |
| TTS가 중복·중단되거나 idle로 안 감 |
TTS/Voice Runtime |
queue, playback callback, LLM/TTS status |
audio output 경로 문제면 Audio로 인계 |
| APK 교체 뒤 부팅 또는 앱 시작 실패 |
Android/SoC |
cert, hash, package path, logcat, SELinux |
앱 native init이면 On-device Runtime으로 인계 |
11. 공통 완료 정의
업무 패키지는 아래 다섯 단계가 모두 충족되어야 완료로 본다.
- 계약: 입력, 출력, 오류, lifecycle이 문서와 코드에서 일치한다.
- 자동 검증: unit 또는 instrumentation이 핵심 회귀를 막는다.
- 통합 검증: 실제 local/Cloud/TTS 경로가 한 turn으로 연결된다.
- 실기기 증거: release/platform-signed APK에서 로그와 물리 음성 결과를 확인한다.
- 운영 전달: 변경 목록, 알려진 한계, rollback, runbook과 wiki가 남는다.
| 증거 수준 |
주장 가능한 것 |
주장할 수 없는 것 |
| Compile |
소스가 빌드됨 |
기기에서 기능이 동작함 |
| Unit |
함수 계약이 fixture에서 맞음 |
Android lifecycle과 native runtime이 안정적임 |
| Integration |
모듈 간 payload가 연결됨 |
실음성·실기기 품질이 합격함 |
| Connected device |
특정 보드와 APK에서 경로가 동작함 |
장시간·다사용자 제품 acceptance가 끝남 |
| Product acceptance |
정해진 반복·품질·복구 Gate 통과 |
다른 모델·보드·국가에서도 자동 보장됨 |
12. 주요 저장소와 산출물
| 저장소 / 문서 |
Non-A2A LLM 책임 |
skmagic_ondeviceai_agent |
Voice ingress, STT, dictionary, local LLM, Cloud client, TTS, Android lifecycle |
backend-cloud-llm-lambda |
일반 Cloud response, rewrite, RAG, API/error contract. A2A 모듈은 본 문서 제외 |
| QNN/Sherpa integration workspace |
CPU STT, QNN speaker companion, model/runtime artifact와 HTP resource 검증 |
| Speech Recognition Module |
비-A2A Speech/LLM 문서 허브 |
| Voice Agent Refactoring Release |
buffer, F1/F2/F3, memory, release 실증 |
| Vendor LLM Training |
E2E, dictionary, Cloud, 로그 분석, 운영 교육 |
| Validation and Quality |
증거 수준과 release gate |
13. 우선순위 백로그
| 우선순위 |
과업 |
완료 신호 |
| P0 |
Voice session 종료·취소·다음 turn 안정화 |
F1/F2/F3·TTS 반복에서 PID와 state 정상 수렴 |
| P0 |
local LLM native death와 restartable error 구분 |
dedicated health/error contract와 tombstone correlation |
| P0 |
Cloud credential·timeout·5xx 복구 표준화 |
사용자 오류, retry 상한, 운영 로그가 일치 |
| P1 |
STT 전처리 decoder 기준 검증 |
raw/processed WER/CER와 제품 발화 성공률 확보 |
| P1 |
응답·rewrite 품질셋과 negative collision 확대 |
기능 약속·내부 field 노출·오매칭 회귀 차단 |
| P1 |
token·latency·memory 통합 ledger |
call당 비용과 p95, PSS/CMA를 release마다 비교 |
| P1 |
QNN speaker 실사용 acceptance |
등록·다화자 FAR/FRR/EER와 장시간 반복 통과 |
| P2 |
운영 자동화 |
release APK 검증, evidence 수집, wiki publish를 재현 가능하게 표준화 |
결론
비-A2A LLM 업무의 핵심은 모델 prompt 하나가 아니다. 음성 turn을 잃지 않고,
STT와 local/Cloud 판단을 안정적으로 연결하고, TTS와 Android lifecycle까지
종료하며, 그 품질·비용·장애를 재현 가능한 증거로 관리하는 제품 실행 체계다.
A2A는 이 입력과 응답 위에서 owner와 plan을 결정하는 별도 계층이다. 따라서 이
R&R을 먼저 명확히 해야 A2A 문제와 음성·LLM runtime 문제를 서로 떠넘기지 않고
각 계층의 성능을 독립적으로 개선할 수 있다.