From 8fc7f421e8325fadad8c454e8640f5d83daef867 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Thu, 19 Mar 2026 21:47:53 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20rb8001=20=EC=9D=91=EB=8B=B5=20=ED=92=88?= =?UTF-8?q?=EC=A7=88=20=EC=88=98=EC=A0=95=20=EA=B3=84=ED=9A=8D=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EB=AC=B8=EC=84=9C=20=EC=84=B8=ED=8A=B8?= =?UTF-8?q?=20=EB=A7=81=ED=81=AC=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 트러블슈팅-리서치-계획 3점 세트 완성, 4단계 구현 순서 확정 Co-Authored-By: Claude Opus 4.6 (1M context) --- ...질_톤과장_문맥유실_수정계획.md | 126 ++++++++++++++++++ ...장_문맥유실_전수조사_리서치.md | 3 + ...t_context_response_quality_문제오픈.md | 1 + 3 files changed, 130 insertions(+) create mode 100644 journey/plans/260319_rb8001_응답품질_톤과장_문맥유실_수정계획.md diff --git a/journey/plans/260319_rb8001_응답품질_톤과장_문맥유실_수정계획.md b/journey/plans/260319_rb8001_응답품질_톤과장_문맥유실_수정계획.md new file mode 100644 index 0000000..79d0799 --- /dev/null +++ b/journey/plans/260319_rb8001_응답품질_톤과장_문맥유실_수정계획.md @@ -0,0 +1,126 @@ +--- +tags: [rb8001, prompt, tone, context, quality, plan] +--- + +# rb8001 응답 품질 — 톤 과장·문맥 유실·과잉 제안 수정 계획 + +## 관련 문서 +- [트러블슈팅: rb8001 프롬프트·의도분석·문맥응답 품질 문제](../troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md) +- [리서치: 톤 과장·문맥 유실 전수 조사](../research/260319_rb8001_응답품질_톤과장_문맥유실_전수조사_리서치.md) +- [프롬프트 DB 폐루프 P1 구현 완료](../worklog/260319_프롬프트DB_폐루프_P1_구현_및_검증완료.md) + +### 상위 원칙 +- [0_VALUE Coding Principles](https://github.com/happybell80/0_VALUE/blob/main/02_Governance/coding-principles.md) — #1 원인 직접 수정, #4 폴백 절제, #9 질문별 특례 금지 + +## 목표 + +재현 질문셋에서 다음을 달성한다. +- 불필요한 과잉 제안·장황한 안내 제거 +- 직전 대화 맥락 유지 +- 간결한 작업형 응답 + +## 원인 → 조치 매핑 + +리서치 §2에서 확정된 원인 3건에 대한 조치. + +| 원인 | 근본 위치 | 조치 | 배포 필요 | +|------|----------|------|----------| +| 프롬프트가 과잉 서비스 유도 | `system_chat_openai` v1 내용 | DB에서 v2로 교체 | **아니오** | +| OpenAI handler에 대화 이력 미전달 | `llm_service.py` process_request() | `recent_conversations` → `previous_messages` 변환 추가 | 예 | +| neutral 감정에서도 constraints 무조건 주입 | `llm_service.py` 감정 분기 | neutral일 때 감정 constraints 생략 | 예 | + +## 비범위 + +- Company X RAG 실패 응답 개선 (23에서 작업 중) +- 의도 분류기 구조 변경 (별도 이슈) +- Pydantic JSON 강제 (1~3단계 효과 확인 후 필요 시 추가) + +## 구현 단계 + +### 1단계: 시스템 프롬프트 v2 교체 (DB만, 배포 없음) + +**v2 프롬프트 내용:** +``` +당신은 '로빙(Robeing)'이라는 이름의 AI 어시스턴트입니다. + +응답 원칙: +1. 짧고 직접적으로 답변한다. 2~3문장 이내. +2. 묻지 않은 것은 제안하지 않는다. +3. 단순 확인이나 사실 제공이면 1문장으로 끝낸다. +4. 사용자가 더 원하면 그때 확장한다. +5. 이모지 사용 금지. +6. 한국어로 응답. +``` + +**실행:** `seed_p1_prompts.py` 패턴으로 v2 생성 → 활성화. +**검증:** 재현 질문셋 E2E 실행, 응답 길이·톤 확인. +**롤백:** v1 재활성화 (즉시). + +### 2단계: OpenAI handler 대화 이력 전달 (코드 1곳 수정) + +**수정 위치:** `llm_service.py`의 `process_request()` chat 경로, 감정 분석 직전. + +**수정 내용:** +```python +# recent_conversations → previous_messages 변환 (OpenAI 호환) +if context.get("recent_conversations") and not context.get("previous_messages"): + prev_msgs = [] + for conv in context["recent_conversations"][:5]: + if conv.get("message"): + prev_msgs.append({"role": "user", "content": conv["message"]}) + if conv.get("response"): + prev_msgs.append({"role": "assistant", "content": conv["response"]}) + context["previous_messages"] = prev_msgs +``` + +**검증:** `서울이야` → `어디라고?` 순서로 E2E 실행, 직전 맥락 유지 확인. + +### 3단계: neutral 감정 constraints 생략 (코드 1곳 수정) + +**수정 위치:** `llm_service.py:245~268` 감정 분기. + +**수정 내용:** +- `emotion_labels`가 비어있거나 `['neutral']`만 있으면 `system_instruction`을 빈 문자열로 설정 +- 호칭 주입도 neutral에서는 생략 + +**검증:** 일반 질문에서 감정 constraints가 빠지고 응답이 짧아지는지 확인. + +### 4단계: 재현 질문셋 E2E 전수 검증 + +| 질문 | 기대 응답 | 판정 기준 | +|------|----------|----------| +| `로빙?` | 1문장 인사 | 2문장 이하 | +| `오늘 날씨는 어때?` | 조회 불가 안내 | 3문장 이하, 준비물 등 과잉 안내 없음 | +| `난 지금 서울이야` | 확인 응답 | 2문장 이하, 묻지 않은 제안 없음 | +| `내가 지금 어디라고?` | `서울이라고 하셨어요.` | 직전 맥락 유지, 2문장 이하 | + +**전수 통과 시 트러블슈팅 종결.** + +## 실행 순서와 의존성 + +``` +1단계 (DB만) ─→ E2E 검증 + │ + ├─ 톤 해소됨 → 2단계로 + └─ 톤 안 잡힘 → Pydantic JSON 강제 검토 (별도 계획) + +2단계 (코드) ─→ E2E 검증 + │ + └─ 문맥 유지됨 → 3단계로 + +3단계 (코드) ─→ 4단계 전수 검증 ─→ 워크로그 ─→ 트러블슈팅 종결 +``` + +## 롤백 계획 + +| 단계 | 롤백 방법 | 소요 시간 | +|------|----------|----------| +| 1단계 | DB에서 v1 재활성화 | 즉시 (캐시 TTL 60초 후 반영) | +| 2단계 | git revert + 컨테이너 재빌드 | 3분 | +| 3단계 | git revert + 컨테이너 재빌드 | 3분 | + +## 닫힘 기준 + +- 재현 질문셋 4건 전수 통과 +- 기존 RAG 경로 영향 없음 +- Slack 실사용 경로에서 톤 변화 확인 (선택) diff --git a/journey/research/260319_rb8001_응답품질_톤과장_문맥유실_전수조사_리서치.md b/journey/research/260319_rb8001_응답품질_톤과장_문맥유실_전수조사_리서치.md index 46c94c6..70cd5a4 100644 --- a/journey/research/260319_rb8001_응답품질_톤과장_문맥유실_전수조사_리서치.md +++ b/journey/research/260319_rb8001_응답품질_톤과장_문맥유실_전수조사_리서치.md @@ -9,6 +9,9 @@ tags: [rb8001, prompt, tone, context, quality, research] ### 트러블슈팅 (이 리서치가 닫아야 할 문제) - [rb8001 프롬프트·의도분석·문맥응답 품질 문제](../troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md) +### 계획 (구현 방향) +- [rb8001 응답 품질 수정 계획](../plans/260319_rb8001_응답품질_톤과장_문맥유실_수정계획.md) + ### 상위 원칙 - [0_VALUE Coding Principles](https://github.com/happybell80/0_VALUE/blob/main/02_Governance/coding-principles.md) — #4 폴백 절제, #9 질문별 특례 하드코딩 금지 diff --git a/journey/troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md b/journey/troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md index 3416fab..78c9b41 100644 --- a/journey/troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md +++ b/journey/troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md @@ -10,6 +10,7 @@ tags: [robeing, rb8001, prompt, intent, context, rag, troubleshooting] ## 관련 문서 - [rb8001 응답 품질 톤 과장·문맥 유실 전수 조사 리서치](../research/260319_rb8001_응답품질_톤과장_문맥유실_전수조사_리서치.md) +- [rb8001 응답 품질 수정 계획](../plans/260319_rb8001_응답품질_톤과장_문맥유실_수정계획.md) - [Company X RAG 답변 합성 회귀](./260312_companyx_rag_answer_composition_regression.md) - [rb8001 Slack Signing Secret 오값 복구 및 실유입 검증](../worklog/260317_rb8001_slack_signing_secret_오값복구_및_실유입검증.md) - [의도 파싱 greeting/context followup fix](./251122_intent_parsing_greeting_context_followup_fix.md)