Cloud Rewrite Query Quality Guide
이 문서는 Cloud LLM의 rewrite_query를 어떻게 설계하고 검증해야 하는지 정리합니다. 핵심은 Case 2가 나왔다는 사실만으로 성공이 아니라는 점입니다. rewrite_query가 다시 온디바이스 로컬 파이프라인에 들어가 기대 <sk_xx> 토큰으로 매칭되어야 최종 성공입니다.
1. 소스 근거
| 영역 | 파일/위치 | 역할 |
|---|---|---|
| On-device Case 2 처리 | ForegroundService.kt:2699 |
Cloud response에서 rewrite_query 추출 |
| 로컬 재진입 | ForegroundService.kt:2718 |
runCloudResolvedQueryThroughLocalPipeline(rewrite_query) 호출 |
| 재진입 함수 | ForegroundService.kt:2039 |
Cloud가 만든 query를 processLLAMA()로 전달 |
| Cloud request 생성 | ForegroundService.kt:2420 |
originalSttResult, system prompt, environment를 Cloud로 전송 |
| Prompt 정책 | app/src/main/assets/LLM_PROMPT_kr.text:79 |
Case 2 JSON과 rewrite pipeline 정의 |
| Prompt 정책 | app/src/main/assets/LLM_PROMPT_en.text:78 |
영어 Case 2 JSON과 rewrite pipeline 정의 |
| Cloud Lambda 진입 | backend-cloud-llm-lambda/lambda_function.py:30 |
request body parse 및 full_rag() 호출 |
| Cloud RAG 조합 | gemini/gemini_full_rag_api.py:35 |
default/File RAG/Web Search 후보 조합 |
| File RAG | gemini/gemini_file_rag_api.py:36 |
내부 문서 기반 답변 후보 |
| Web Search RAG | gemini/gemini_gsearch_rag_api.py:10 |
검색 기반 최신 정보 후보 |
| 검색어 생성 | gemini/search_keyword_generator.py:28 |
Web Search용 keyword 생성 |
2. Rewrite 성공 정의
Cloud rewrite 성공은 아래 조건을 모두 만족해야 합니다.
| 단계 | 성공 조건 | 실패 예 |
|---|---|---|
| Case 분류 | 제품 기능이면 Case 2 | 제품 기능인데 Case 1 설명으로 답변 |
| function | 제품 기능명과 일치 | Air quality map 요청을 일반 air quality 설명으로 분류 |
| available_function | 지원 가능한 action으로 제한 | 미지원 action을 실행 가능처럼 표기 |
| rewrite_query | 사용자가 말할 법한 명령형 문장 | “I will execute...” 같은 수행 완료 문장 |
| 로컬 재진입 | processLLAMA(rewrite_query) 호출 |
Cloud TTS만 하고 기능 경로 종료 |
| token | 기대 <sk_xx>로 매칭 |
error_answer 또는 다른 token |
| 실행 검증 | Validator/API/TTS까지 기대와 일치 | token은 맞지만 error/API/TTS가 다름 |
3. Rewrite 문장 작성 규칙
한국어
좋은 rewrite_query:
- 공기질 맵 히스토리 보여줘
- 배터리 확인해줘
- 온도 단위 섭씨로 바꿔줘
- 모든 동작 멈춰줘
나쁜 rewrite_query:
- 공기질 맵 히스토리를 확인하겠습니다
- 배터리 정보를 알려드릴게요
- 사용자가 공기질 맵을 보고 싶어 합니다
영어
Good rewrite_query:
- Check the air quality map history, please
- Check the battery, please
- Set the temperature unit to celsius, please
- Stop all actions, please
Bad rewrite_query:
- I will check the air quality map history
- The user wants to see the air quality map
- Air quality map history information
4. 온디바이스 딕셔너리 적합성 기준
rewrite_query는 사람이 보기 자연스러운 것만으로 부족합니다. 온디바이스 dictionary에 재매칭 가능한 형태여야 합니다.
| 기준 | 설명 |
|---|---|
| 기능명 명시 | air quality map, battery, temperature unit처럼 기능명이 빠지면 안 됨 |
| action 명시 | check, show, set, stop 등 실제 action이 있어야 함 |
| 상태조회/설정 구분 | status/check와 turn on/set을 섞지 않음 |
| 대상 slot 보존 | 공간명, 단위, 모드 같은 필수 slot을 제거하지 않음 |
| 일반 동사 단독 금지 | show me, tell me만 남기면 오매칭 위험 |
| 말레이시아 표현 확인 | 현지 지명/건물명은 제품 공간명으로 오해하지 않게 분리 |
5. 실패 패턴과 수정 방향
| 실패 패턴 | 관찰 로그 | 수정 방향 |
|---|---|---|
| Case 2가 아니라 Case 1 | API Response case=1 |
Cloud prompt/router에 제품 기능 예시 추가 |
| rewrite가 너무 일반적 | rewrite_query=show me please |
기능명 + action + slot을 명시 |
| rewrite가 실행 완료 문장 | rewrite_query=I will... |
사용자 명령형으로 변경 |
| 로컬 token 미매칭 | Cloud rewrite_query enters local routing pipeline 이후 error_answer |
온디바이스 dictionary positive case 추가 또는 rewrite 표현 제한 |
| 다른 token 매칭 | [DICTIONARY_MATCH] key=<wrong> |
negative case 추가, dictionary 조건 강화 |
| 말레이시아 RAG가 기능을 답변으로 처리 | Case 1 또는 RAG 답변 | 기능 실행 요청은 RAG가 아니라 Case 2로 라우팅 |
5-1. Cloud prompt/router 강화 판단 기준
Cloud 쪽을 고쳐야 하는 경우와 온디바이스 dictionary를 고쳐야 하는 경우를 분리해야 합니다.
| 증상 | Cloud 수정 대상 | On-device 수정 대상 |
|---|---|---|
| 제품 기능 발화를 Case 1 일반 답변으로 처리 | Case Router 예시/우선순위 | 해당 없음 |
| 미지원 기능을 Case 2로 처리 | Unsupported feature list, Case 4 규칙 | 해당 없음 |
Case 2지만 rewrite_query가 설명문/완료문 |
rewrite rule, bad example 추가 | 해당 없음 |
| Case 2 + 좋은 rewrite인데 로컬 token 미매칭 | rewrite 표현을 dictionary 친화적으로 제한 | dictionary positive case 추가 |
| 로컬 token은 맞지만 파라미터가 빠짐 | slot 보존 규칙 강화 | parser/FunctionCallHandler 파라미터 처리 |
| 말레이시아 지명/건물명이 공간명으로 오해됨 | Malaysia RAG/지역명 분리 규칙 | 공간명 dictionary negative case |
Cloud prompt에 추가해야 하는 rewrite rule은 아래처럼 운영합니다.
1. 제품 기능 요청은 Case 2로 보낸다.
2. rewrite_query는 사용자가 다시 말할 법한 명령형 문장으로 작성한다.
3. rewrite_query에는 기능명, action, 필수 slot을 포함한다.
4. "I will", "I'll", "하겠습니다", "알려드릴게요" 같은 수행 완료 문장은 금지한다.
5. Malaysia RAG 문서가 있어도 제품 기능 실행 요청은 RAG 답변으로 끝내지 않는다.
6. rewrite_query 예시는 온디바이스 dictionary test positive case와 같이 관리한다.
변경 요청서에는 Cloud prompt 수정안만 쓰지 말고, 반드시 아래 근거를 같이 넣습니다.
원문 발화
originalSttResult
Cloud response case/function/available_function/rewrite_query
rewrite_query 로컬 재진입 결과
기대 token / 실제 token
Cloud 수정 필요 여부
Dictionary 수정 필요 여부
6. 테스트 매트릭스
| 입력 발화 | 기대 Cloud | 기대 온디바이스 |
|---|---|---|
Please show me the air quality map history |
Case 2 또는 로컬 직접 처리 | <sk_29>(get=True) |
Check the battery |
Case 2 | 배터리 상태 token |
Set temperature unit to Celsius |
Case 2 | 온도 단위 설정 token |
Open YouTube |
Case 4 | 기능 실행 없음 |
What is the Malaysia service center number? |
Case 1 + Malaysia RAG | 기능 실행 없음 |
Turn on security mode |
Case 2 또는 로컬 직접 처리 | <sk_46> |
7. 리포트 필수 필드
원문 발화:
originalSttResult:
Cloud request user content:
Cloud response raw:
case:
function:
available_function:
rewrite_query:
로컬 재진입 로그:
dictionary match 로그:
기대 token:
실제 token:
최종 TTS/API:
판정:
수정 대상:
8. 말레이시아 Custom RAG와의 경계
말레이시아 Custom RAG는 현지 고객센터, 보증, 앱 사용법, 국가별 제한 기능 같은 문서 기반 답변을 강화하는 경로입니다. 제품 기능 실행 요청을 RAG 답변으로 끝내면 안 됩니다.
| 질문 유형 | 처리 |
|---|---|
| 현지 서비스/보증/앱 사용법 | Case 1 + Malaysia Custom RAG |
| 제품 기능 실행 | Case 2 + rewrite_query + On-device 재진입 |
| 미지원 앱/외부 서비스 실행 | Case 4 |
| 현지 날씨/공기질 최신 정보 | Web Search 필요 여부 판단 |
수정 대상 분리 기준:
| 관찰 결과 | 1차 수정 대상 | 같이 확인할 대상 |
|---|---|---|
| 현지 서비스 질문에 제품 기능 token이 나옴 | dictionary negative | Cloud router/RAG |
| 제품 기능 요청이 RAG 답변으로 끝남 | Cloud Case Router | rewrite rule |
| Case 2 rewrite가 로컬에서 실패 | dictionary positive 또는 rewrite 제한 | function/action/slot 보존 |
| 현지 정책 답변 근거가 없음 | Malaysia RAG 문서 | Web Search 필요성 |
| 지역명/건물명이 공간명으로 오해됨 | 공간명 dictionary 규칙 | 현지 표현 regression |