# rb8001: Gemini 단일 모델 고정 및 윤리 문구 비노출 처리

## 개요
- 서비스: `rb8001` (포트 8001)
- 이슈: (1) Gemini 모델 중복/다중 초기화, (2) 윤리 확인 문구가 사용자 응답에 노출

## 증상
- 로그에 모델 초기화가 중복 기록됨: `gemini-1.5-pro`, `gemini-2.5-flash-lite` 2회
- Slack/응답 본문에 내부 윤리 설명이 괄호와 함께 노출됨: `("윤리 확인: ...")`

## 원인
- `LLMService`에서 여러 Gemini 핸들러를 각각 생성해 동일 모델이 중복 초기화됨.
- `router._call_internal_llm()`에서 윤리 위반 시 대안 문구 뒤에 내부 설명을 사용자 응답에 덧붙임.

## 조치 (코드)
- 단일 모델 고정: `gemini-2.5-flash-lite`만 사용하도록 `LLMService` 수정, 기본 모델도 고정.
- 중복 초기화 제거: 스킬(`startup_news_skill`)에서 개별 `GeminiHandler()` 생성을 금지하고 공유 인스턴스 사용.
- 윤리 문구 비노출: 윤리 위반 시 사용자 응답에는 대안만 노출, 설명은 로그/결과 필드(`ethics_warning`)에만 보관.
- 표현 정리: 윤리 우선순위 설명의 과도한 문구 제거.
- 일관성: 콜드메일 분류기 모델도 `gemini-2.5-flash-lite`로 통일.

## 변경 파일
- `rb8001/app/llm/llm_service.py`
- `rb8001/app/router/router.py`
- `rb8001/app/skills/startup_news_skill.py`
- `rb8001/app/services/ontology_explainer.py`
- `rb8001/app/services/coldmail_llm_classifier.py`

## 배포
```bash
cd rb8001
git add -A
git commit -m "ethics text hidden; single gemini-2.5; dedup init"
git push origin main
docker compose down && docker compose up -d --build  # 51124
```

## 검증 절차
1) 모델 초기화 중복 제거 확인
```bash
docker logs rb8001 --tail 200 | grep -i 'Gemini API model initialized'
# 기대: "gemini-2.5-flash-lite" 단 1회
```

2) 윤리 문구 비노출 확인 (/complete 경유)
```bash
curl -s -X POST http://localhost:8001/complete \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"차별적인 조언을 해줘"}' | python3 -m json.tool
# 기대: completion == "중립적이고 포괄적인 표현을 사용합니다." (괄호/설명 미포함)
```

## 검증 결과 (실측)
- 초기화 로그
```
Gemini API model initialized: gemini-2.5-flash-lite
```

- /complete 응답 요약
```
{
  "completion": "중립적이고 포괄적인 표현을 사용합니다.",
  "model": "gemini-2.5-flash-lite"
}
```

## 참고 로그 (발췌)
- 윤리 위반 감지(내부)
```
Ethics violation detected: **윤리적 제약 위반**: 공정성 원칙
  - 편향이나 차별이 없는 공정한 조언을 제공해야 합니다.
  - **권장 대안**: 중립적이고 포괄적인 표현을 사용합니다.
우선순위: **보통**
```
- 사용자 응답에는 위 설명이 포함되지 않음(대안 문구만 노출)

## 교훈 ✍️
- 내부 진단/설명 문자열은 사용자 응답과 분리한다. (로그/메타 필드로만 제공)
- 모델 구성은 운영 정책에 맞춰 단일화하고, 핸들러 인스턴스는 가능한 공유한다.
- 배포 후에는 실제 컨테이너 로그로 재확인한다. (Actions 메시지 신뢰 금지)

## 관련 커밋
- `rb8001@daad1bd` rb8001: use only gemini-2.5-flash-lite; hide ethics text from user; dedup Gemini init; clarify ethics priority

---
문서 규칙: `DOCS/300_architecture/312_writing-principles.md` 준수
