---
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 브리핑 인사이트 서두 누출 수정 계획](../plans/260311_naverworks_briefing_insight_preamble_leak_fix_plan.md)
- [NAVER WORKS 브리핑 인사이트 서두 누출 수정 및 수동 배포 검증](../worklog/260311_naverworks_briefing_insight_preamble_leak_fix_and_manual_deploy.md)

## 목적
- `로빙입니다. 사용자님께서는... 요약해 드리겠습니다.` 같은 서두가 NAVER WORKS 브리핑 인사이트에 노출되는 문제를 어떤 수정으로 닫는 것이 맞는지 결정 가능한 근거를 남깁니다.
- 이 문서는 이번 문제를 닫기 위한 리서치에 한정합니다.
- 일반적인 프롬프트 운영 전략이나 Prompt DB 전면화 결정은 이 문서 범위에서 제외합니다.

## 조사 질문
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이 프롬프트를 어긴 출력값을 냈고, 애플리케이션이 그 값을 검증 없이 통과시킨 것이다.
- 즉 장애의 본질은 `프롬프트만 있고 출력 강제 규칙이 없는 상태`다.

## 문제를 닫는 범위
- 이번 문서는 `NAVER WORKS 브리핑 insight 1줄` 품질 계약만 다룬다.
- Prompt DB 미적용, 다른 브리핑 skill 전수 점검, 공통 LLM 출력 정책 정리는 별도 문제로 남긴다.
- 이번 종료 조건은 `이 경로에서 금지 서두가 다시 노출되지 않게 만드는 것`이다.

## 선택지 비교

### 선택지 A. 프롬프트만 더 강하게 수정
- 장점:
  - 변경 범위가 작다
  - 코드 후처리보다 자연스러운 출력 유도 가능
- 단점:
  - LLM 일탈이 다시 발생하면 같은 문제가 반복된다
  - 테스트 없이 프롬프트에만 의존하면 닫힌 문제로 보기 어렵다

### 선택지 B. 후처리만 추가
- 장점:
  - 출력 강제력이 생긴다
  - `로빙입니다`, `사용자님께서는` 같은 알려진 서두는 안정적으로 제거 가능
- 단점:
  - 분류 문장이 완전히 다른 형태로 나오면 여전히 누락 가능
  - 프롬프트가 약하면 후처리 규칙이 늘어날 수 있다

### 선택지 C. 프롬프트 강화 + 후처리 + 금지 케이스 테스트 추가
- 장점:
  - 생성 단계와 검증 단계 둘 다 보강된다
  - 이번 문제를 닫는 기준으로 가장 명확하다
  - 재발 방지까지 같이 확보된다
- 단점:
  - A/B보다 수정 범위가 조금 넓다

## 결론
- 이번 문제를 닫는 최소 충분 조건은 `선택지 C`다.
- 이유:
  1. 프롬프트만으로는 이미 한 번 실패했다.
  2. 후처리만으로는 모델 출력 형태가 달라질 때 불안정하다.
  3. 테스트가 없으면 문제 재발 시 다시 눈으로만 확인해야 한다.

## 권장 종료 전략
- 이번 문제는 `generate -> validate -> regenerate 1회 -> normalize failure -> format -> send` 계약으로 닫는 것이 맞다.
- 의미:
  1. 첫 생성 결과가 허용 패턴이면 그대로 사용한다.
  2. 금지 서두가 있거나 허용 시작 패턴을 어기면 1회만 재생성한다.
  3. 재생성도 실패하면 침묵 통과시키지 않고, 정규화 가능한 범위만 제거한 뒤 기준 미달이면 실패로 남긴다.
- 핵심은 `어떤 출력이든 성공처럼 보내지 않는다`는 것이다.

## 판정 규칙
- 금지 서두 예시:
  - `로빙입니다`
  - `사용자님께서는`
  - `요약해 드리겠습니다`
  - `오늘 알아야 할 메일 핵심 내용을`
- 허용 시작 패턴:
  - `회신 필요`
  - `결제/청구`
  - `안내/공지`
- 실패 판정:
  - 금지 서두 제거 후에도 허용 시작 패턴으로 시작하지 않으면 실패다.
  - 1줄 요약이 아닌 서술형 인사/설명이 남으면 실패다.

## 닫힘 기준
1. `_generate_insight()` 또는 인사이트 직후 경로에서 금지 서두 제거/검증이 추가돼야 한다.
2. 프롬프트는 `회신 필요`, `결제/청구`, `안내/공지` 같은 분류 표현으로 바로 시작하도록 더 강하게 제한돼야 한다.
3. 테스트에 아래 케이스가 추가돼야 한다.
   - `로빙입니다... 회신 필요 1건`
   - `사용자님께서는... 결제/청구 1건`
   - `오늘 알아야 할 메일 핵심 내용을... 안내/공지 3건`
4. 실행 로그의 `Generated insight:`와 실제 Slack 노출값 모두에서 금지 서두가 0건이어야 한다.

## 이번 문제를 닫는 실행 문장
- 이 문제는 `LLM 출력 일탈을 허용한 검증 부재` 문제다.
- 따라서 닫는 방법은 `프롬프트 보강`만이 아니라 `출력 검증 분기, 실패 가시성, 금지 케이스 테스트`를 함께 넣는 것이다.
