DOCS/journey/plans/260319_rb8001_응답품질_톤과장_문맥유실_수정계획.md
happybell80 60a892e5ab fix: DOCS 내 0_VALUE 참조를 GitHub URL → 로컬 상대경로로 전환, 02_Governance → 20_Governance 수정 #33 #34
SSOT는 로컬 0_VALUE/. GitHub URL은 복사본 참조로 SSOT 원칙 위반.
02_Governance는 존재하지 않는 구 경로로 전부 깨진 링크.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 14:00:21 +09:00

5.6 KiB

tags
tags
rb8001
prompt
tone
context
quality
plan

rb8001 응답 품질 — 톤 과장·문맥 유실·과잉 제안 수정 계획

관련 문서

레퍼런스

  • OpenClaw 소스: /home/admin/robeing/reference/openclaw — Context Engine 패턴, compaction 알고리즘 참고
  • 이번 계획에서 가져오는 것: OpenClaw assemble()provider별 형식 변환 패턴만
  • 향후 별도 추적: compaction, session-memory, MEMORY.md → OpenClaw compaction 아이디어

상위 원칙

목표

재현 질문셋에서 다음을 달성한다.

  • 불필요한 과잉 제안·장황한 안내 제거
  • 직전 대화 맥락 유지
  • 간결한 작업형 응답

원인 → 조치 매핑

리서치 §2에서 확정된 원인 3건에 대한 조치.

원인 근본 위치 조치 배포 필요
프롬프트가 과잉 서비스 유도 system_chat_openai v1 내용 DB에서 v2로 교체 아니오
OpenAI handler에 대화 이력 미전달 llm_service.py process_request() recent_conversationsprevious_messages 변환 추가
neutral 감정에서도 constraints 무조건 주입 llm_service.py 감정 분기 neutral일 때 감정 constraints 생략

비범위

  • Company X RAG 실패 응답 개선 (23에서 작업 중)
  • 의도 분류기 구조 변경 (별도 이슈)
  • Pydantic JSON 강제 (1~3단계 효과 확인 후 필요 시 추가)
  • Context Engine 중간 계층 도입 (리서치 §7-5, 향후 과제)
  • Compaction 도입 (아이디어 문서에서 별도 추적)
  • Session Memory / MEMORY.md 도입 (향후 과제)

구현 단계

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.pyprocess_request() chat 경로, 감정 분석 직전.

수정 내용:

# 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 실사용 경로에서 톤 변화 확인 (선택)