# 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_문서_작성_원칙.md` 준수