diff --git a/journey/troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md b/journey/troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md new file mode 100644 index 0000000..52e7ac8 --- /dev/null +++ b/journey/troubleshooting/260317_rb8001_prompt_intent_context_response_quality_문제오픈.md @@ -0,0 +1,77 @@ +--- +tags: [robeing, rb8001, prompt, intent, context, rag, troubleshooting] +--- + +# rb8001 프롬프트·의도분석·문맥응답 품질 문제 오픈 + +**상태**: 오픈 +**관측일**: 2026-03-17 +**범위**: Slack 실사용 경로의 일반 대화, Company X RAG 질문, 후속질문 응답 품질 + +## 관련 문서 +- [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) + +## 문제 + +- Slack 연동 자체는 복구되어 `로빙?` 멘션에 응답은 다시 시작했지만, 응답 품질은 여전히 실사용 기준에 못 미칩니다. +- `컴퍼니엑스 인원수를 알려줘. rag 이용해서` 질문에 대해 내부 문서 근거 부족 실패 응답으로 끝납니다. +- `지금 컴액의 mou는 올해 어디랑 했어` 질문도 같은 실패 응답으로 끝납니다. +- `오늘 날씨는 어때?` 질문에는 실시간 조회 불가 안내까진 가능했지만, 사용자가 `난 지금 서울이야`라고 말한 뒤에도 날씨를 이어서 설명하지 못하고 일반 도움말로 빠집니다. +- 이어서 `내가 지금 어디라고?`라는 후속 질문에는 직전 발화 `서울`을 유지하지 못하고 위치 공유 안내로 되돌아갑니다. + +## 왜 문제인가 + +- 사용자는 이미 필요한 맥락을 제공했는데, 로빙이 이를 유지하지 못하면 기본 대화 어시스턴트 기대를 충족하지 못합니다. +- Company X 질의는 검색 실패 자체보다, 실패 응답이 과도하게 고정되어 있어 사용자가 "찾고 있는지", "정말 없는지", "질문이 잘못 분류됐는지"를 구분할 수 없습니다. +- 말투도 실제 사용자 기대보다 과하게 장황하고 의전형으로 흐르며, 작업형 어시스턴트보다 홍보형 어시스턴트처럼 보입니다. + +## 확인된 사실 + +1. 현재 응답 모델은 `gpt-5-mini`입니다. +2. 메인 의도분석은 `DecisionEngine`의 규칙 기반 패턴 매칭입니다. +3. 스킬 선택도 의도별 하드코딩된 시퀀스 매핑이 중심이며, LLM이 자유롭게 스킬을 선택하는 구조가 아닙니다. +4. LLM은 주로 최종 응답 생성, 짧은 질문 확장, 대명사 해소, clarify 해석, Company X grounding 같은 보조 단계에 사용됩니다. +5. OpenAI 기본 시스템 프롬프트는 `스타트업 대표 전용 AI 어시스턴트`, `전문적이면서도 친근한 톤`, `한국어`, `이모지 금지` 수준으로 정의돼 있습니다. +6. 실제 응답 톤은 기본 시스템 프롬프트보다 감정 분석, 호칭(`이사님`), task별 `system_instruction` 누적의 영향을 크게 받습니다. +7. Company X 질문은 `try_companyx_grounding()`이 먼저 가로채며, 근거 부족 시 실패 응답으로 조기 종료될 수 있습니다. + +## 원인 가설 + +1. 일반 대화와 RAG 질문이 지나치게 보수적인 실패 경로로 수렴합니다. +2. 짧은 후속 질문 컨텍스트 유지 로직이 실제 Slack 실사용 문장(`난 지금 서울이야` → `내가 지금 어디라고?`)에 안정적으로 작동하지 않습니다. +3. 호칭/감정 주입 프롬프트가 기본 답변 스타일보다 앞서 작동해 과한 의전형 문체를 만듭니다. +4. `weather`, `location`, `followup` 같은 생활형 질의를 별도 정책 없이 `general_chat` 또는 fallback 대화로 흘려보냅니다. +5. `companyx_rag` 경로는 근거 부족 시 실패 응답 보호는 되지만, 질문 적합도 재시도나 대체 응답 전략이 약합니다. + +## 코드 기준 구조 요약 + +- 기본 시스템 프롬프트: `app/services/llm/openai_handler.py` +- 메인 의도분석: `app/services/brain/decision_engine.py` +- 메시지 라우팅/질문 확장/grounding 선처리: `app/services/message_service.py` +- 감정 분석 및 호칭 주입: `app/services/llm/internal_llm_service.py`, `app/services/addressing_service.py` +- Company X grounding: `app/services/companyx_grounding_service.py` + +## 필요한 조치 + +1. 일반 대화 프롬프트에서 홍보형 소개 문장과 과한 의전형 톤을 줄입니다. +2. `weather`, `location`, `context_followup` 질문을 실사용 예시 기준으로 다시 분류합니다. +3. `서울`처럼 직전 사용자 제공 사실을 짧은 후속 질문에서 우선 회수하도록 문맥 유지 규칙을 보강합니다. +4. Company X RAG 실패 응답을 단일 고정 문구에서 벗어나, 질문 유형별 실패 이유를 분리합니다. +5. `gpt-5-mini` 유지 여부는 위 구조를 정리한 뒤 다시 평가합니다. 현재 문제는 모델 자체보다 라우팅/프롬프트 구조 영향이 큽니다. + +## 재현 질문셋 + +1. `로빙?` +2. `컴퍼니엑스 인원수를 알려줘. rag 이용해서` +3. `지금 컴액의 mou는 올해 어디랑 했어` +4. `오늘 날씨는 어때?` +5. `난 지금 서울이야` +6. `내가 지금 어디라고?` + +## 닫힘 조건 + +- 위 질문셋에서 Company X 질문은 실패하더라도 질문 유형에 맞는 실패 이유를 반환해야 합니다. +- `서울` 제공 후 후속 질문에서 직전 위치 맥락을 유지해야 합니다. +- 불필요한 자기소개/과장된 안내문 없이 짧고 작업형 응답으로 정리돼야 합니다.