diff --git a/journey/research/260311_naverworks_briefing_insight_preamble_leak_closure_research.md b/journey/research/260311_naverworks_briefing_insight_preamble_leak_closure_research.md new file mode 100644 index 0000000..904be85 --- /dev/null +++ b/journey/research/260311_naverworks_briefing_insight_preamble_leak_closure_research.md @@ -0,0 +1,84 @@ +--- +tags: [research, naverworks, briefing, insight, llm, closure] +--- + +# NAVER WORKS 브리핑 인사이트 서두 누출 종료 리서치 + +## 관련 문서 +- [NAVER WORKS 브리핑 인사이트 서두 문구 누출](../troubleshooting/260311_naverworks_briefing_insight_preamble_leak.md) +- [자가수정 에이전트 프레임워크 및 Workspace CLI 검증 리서치](./260311_자가수정_에이전트_프레임워크_및_workspace_cli_검증_리서치.md) + +## 목적 +- `로빙입니다. 사용자님께서는... 요약해 드리겠습니다.` 같은 서두가 NAVER WORKS 브리핑 인사이트에 노출되는 문제를 어떤 수정으로 닫는 것이 맞는지 결정 가능한 근거를 남깁니다. +- 이 문서는 이번 문제를 닫기 위한 리서치에 한정합니다. + +## 조사 질문 +1. 현재 서두 문구는 어느 레이어에서 붙는가 +2. 직접 원인은 무엇인가 +3. 이번 문제를 닫는 최소 수정은 무엇인가 +4. 수정 후 어떤 테스트와 로그 기준이 있어야 닫혔다고 볼 수 있는가 + +## 확인된 사실 +1. `2026-03-11 09:00 KST` NAVER WORKS 브리핑 실행 로그에서 아래 순서가 확인됐다. + - `Running job: NAVER WORKS Daily Briefing` + - `Generated insight: 로빙입니다...` + - `Briefing sent successfully: 14 emails` +2. 인사이트 생성 프롬프트는 이미 `인사말, 서두 없이 바로 내용 시작`을 요구한다. + - [naverworks_briefing.py](/home/admin/robeing/rb8001/app/services/skills/naverworks_briefing.py#L191) +3. `_generate_insight()`는 현재 줄바꿈 제거만 수행하고, 금지 서두 제거/시작 패턴 검증은 하지 않는다. + - [naverworks_briefing.py](/home/admin/robeing/rb8001/app/services/skills/naverworks_briefing.py#L159) +4. Slack 포맷터는 전달받은 `insight`를 그대로 `*{insight}*`로 넣는다. + - [naverworks_briefing.py](/home/admin/robeing/rb8001/app/services/skills/naverworks_briefing.py#L278) +5. 현재 테스트는 정상 문장만 검증하고, `로빙입니다`, `요약해 드리겠습니다`, `사용자님께서는` 같은 금지 서두 누출 케이스는 다루지 않는다. + - [test_naverworks_briefing.py](/home/admin/robeing/rb8001/tests/test_naverworks_briefing.py#L37) + +## 해석 +- 이 문제는 Slack 포맷 문제나 스케줄 실패 문제가 아니다. +- 직접 원인은 LLM이 프롬프트를 어긴 출력값을 냈고, 애플리케이션이 그 값을 검증 없이 통과시킨 것이다. +- 즉 장애의 본질은 `프롬프트만 있고 출력 강제 규칙이 없는 상태`다. + +## 선택지 비교 + +### 선택지 A. 프롬프트만 더 강하게 수정 +- 장점: + - 변경 범위가 작다 + - 코드 후처리보다 자연스러운 출력 유도 가능 +- 단점: + - LLM 일탈이 다시 발생하면 같은 문제가 반복된다 + - 테스트 없이 프롬프트에만 의존하면 닫힌 문제로 보기 어렵다 + +### 선택지 B. 후처리만 추가 +- 장점: + - 출력 강제력이 생긴다 + - `로빙입니다`, `사용자님께서는` 같은 알려진 서두는 안정적으로 제거 가능 +- 단점: + - 분류 문장이 완전히 다른 형태로 나오면 여전히 누락 가능 + - 프롬프트가 약하면 후처리 규칙이 늘어날 수 있다 + +### 선택지 C. 프롬프트 강화 + 후처리 + 금지 케이스 테스트 추가 +- 장점: + - 생성 단계와 검증 단계 둘 다 보강된다 + - 이번 문제를 닫는 기준으로 가장 명확하다 + - 재발 방지까지 같이 확보된다 +- 단점: + - A/B보다 수정 범위가 조금 넓다 + +## 결론 +- 이번 문제를 닫는 최소 충분 조건은 `선택지 C`다. +- 이유: + 1. 프롬프트만으로는 이미 한 번 실패했다. + 2. 후처리만으로는 모델 출력 형태가 달라질 때 불안정하다. + 3. 테스트가 없으면 문제 재발 시 다시 눈으로만 확인해야 한다. + +## 닫힘 기준 +1. `_generate_insight()` 또는 인사이트 직후 경로에서 금지 서두 제거/검증이 추가돼야 한다. +2. 프롬프트는 `회신 필요`, `결제/청구`, `안내/공지` 같은 분류 표현으로 바로 시작하도록 더 강하게 제한돼야 한다. +3. 테스트에 아래 케이스가 추가돼야 한다. + - `로빙입니다... 회신 필요 1건` + - `사용자님께서는... 결제/청구 1건` + - `오늘 알아야 할 메일 핵심 내용을... 안내/공지 3건` +4. 실행 로그의 `Generated insight:`와 실제 Slack 노출값 모두에서 금지 서두가 0건이어야 한다. + +## 이번 문제를 닫는 실행 문장 +- 이 문제는 `LLM 출력 일탈을 허용한 검증 부재` 문제다. +- 따라서 닫는 방법은 `프롬프트 보강`만이 아니라 `출력 후처리와 금지 케이스 테스트`를 함께 넣는 것이다. diff --git a/journey/research/README.md b/journey/research/README.md index b078426..0ae22c7 100644 --- a/journey/research/README.md +++ b/journey/research/README.md @@ -11,6 +11,7 @@ - [51124 먹통 48시간 코드 차분 원인 확정 리서치 (260304)](./260304_51124_먹통_48시간_코드차분_원인확정_리서치.md) - [9시 네이버 이메일 분석 미전송 실패 은닉 리서치 (260309)](./260309_9시_네이버이메일분석_미전송_실패은닉_리서치.md) - [자가수정 에이전트 프레임워크 및 Workspace CLI 검증 리서치 (260311)](./260311_자가수정_에이전트_프레임워크_및_workspace_cli_검증_리서치.md) +- [NAVER WORKS 브리핑 인사이트 서두 누출 종료 리서치 (260311)](./260311_naverworks_briefing_insight_preamble_leak_closure_research.md) ### [기억(Memory)](./memory/README.md) - 장단기 기억 메커니즘