LLM 핸드북 3: 배포·운영·안전
LLM을 실제 서비스로 배포하고 유지하기 위한 운영·평가·보안 프레임을 정리합니다.
개요
실전 환경에서는 품질뿐 아니라 비용, 지연, 안전, 법적 요구사항이 동시에 고려되어야 합니다. 운영은 “모델”이 아니라 “시스템”을 다루는 일입니다.
LLM 서비스 운영 구성의 기본 흐름
배포 전략
- 관리형 API: 빠른 출시, 운영 부담 최소화
- 로컬/온프레미스: 데이터 통제, 지연 최소화
- 하이브리드: 고성능 모델은 클라우드, 민감 데이터는 로컬
팁: 서비스 초기에는 관리형 API로 시작해, 비용/보안 요구가 커지면 하이브리드로 이동하는 것이 일반적입니다.
서비스 아키텍처 패턴
- 모델 라우터: 요청 유형에 따라 모델 자동 선택
- 컨텍스트 서비스: 문서/지식베이스 관리 전담
- 도구 게이트웨이: 외부 API 호출을 통제/감사
실무 포인트: LLM을 단일 엔드포인트로 두지 말고, 주변 서비스로 분리하면 품질과 보안을 함께 개선할 수 있습니다.
신뢰성과 관찰성
LLM은 확률적 시스템입니다. 실패를 전제로 설계해야 합니다.
- 재시도 정책: 타임아웃/레이트리밋 대응
- 폴백 모델: 품질이 낮더라도 응답을 보장
- 로그/트레이싱: 프롬프트, 응답, 토큰 사용량 기록
async function callWithRetry(payload) {
for (let attempt = 1; attempt <= 3; attempt++) {
try {
return await fetch("/v1/messages", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
} catch (err) {
if (attempt === 3) throw err;
await new Promise(r => setTimeout(r, attempt * 400));
}
}
}
핵심 운영 지표
- 응답 품질: 사용자 만족도, 재질문 비율
- 지연: p50/p95 응답 시간, 스트리밍 첫 토큰 시간
- 비용: 요청당 평균 토큰, 캐시 히트율
- 안전: 정책 위반 비율, 차단율
훈련 지표와 운영 지표 연결
모델 훈련에서 좋아 보이는 지표가 운영 품질로 바로 이어지지는 않습니다. 배포 전에는 훈련 지표를 운영 지표로 변환해 검증해야 합니다.
| 훈련 단계 지표 | 운영 단계 대응 지표 | 해석 포인트 |
|---|---|---|
| Validation Loss | 사용자 만족도, 재질문율 | loss 개선이 실제 체감 품질로 이어지는지 확인 필요 |
| Perplexity | 도메인 태스크 정확도 | 일반 언어 예측력과 업무 정확도는 다를 수 있음 |
| 안전 평가셋 점수 | 정책 위반율, 차단율 | 오프라인 점수와 실사용 우회 시나리오를 함께 점검 |
| 학습 토큰 비용 | 요청당 비용, 월 총비용 | 훈련 효율보다 추론 비용이 전체 TCO를 더 크게 좌우 |
# 배포 게이트 예시 (의사 코드)
if (offlineScore < 0.82) return "배포 보류";
if (safetyViolationRate > 0.001) return "배포 보류";
if (p95Latency > 2.0) return "스케일링 후 재평가";
if (costPerRequest > targetCost) return "모델 라우팅/캐시 최적화";
return "점진 배포 시작";
훈련 점수는 출발점이며, 최종 판단은 운영 지표와 결합해 내려야 합니다.
주의: 배포 후 p95 지연, 정책 위반율, 요청당 비용이 임계값을 넘으면 자동 롤백 조건을 즉시 실행하도록 설계해야 합니다.
운영 체크리스트
- 모델 라우팅: 요청 유형별 모델 매핑
- 레이트리밋: 사용자/서비스 단위 제한
- 에러 핸들링: 폴백 응답 및 재시도 정책
- 로그 정책: 저장 범위와 보존 기간 명시
평가와 품질 관리
- 오프라인 평가: 테스트셋으로 모델 비교
- 온라인 평가: 사용자 피드백, A/B 테스트
- 가드레일: 금지 주제, 개인정보 노출 방지
가드레일과 정책 설계
- 프롬프트 인젝션 대응: 시스템 프롬프트 고정, 입력 필터
- 출력 검증: 금칙어/민감정보 탐지 후 마스킹
- 권한 경계: 도구 호출 범위 제한
주의: 프롬프트 인젝션은 “사용자 입력”이 아니라 “데이터 입력”에서도 발생할 수 있습니다.
가드레일 흐름 다이어그램
입력/정책/출력 단계별 가드레일 구조
보안과 컴플라이언스
- 데이터 최소화: 불필요한 개인정보 제거
- 권한 제어: 내부 도구 접근 제한
- 감사 로그: 입력/출력 보존 정책 설계
주의: 고객 데이터가 포함된 프롬프트는 저장/재학습 정책을 반드시 확인해야 합니다.
데이터 보존과 거버넌스
- 보존 기간: 로그/프롬프트 저장 기간 정의
- 마스킹: 개인정보 자동 제거 또는 토큰화
- 감사 대응: 규제 기관/내부 감사 요청 대비
비용 최적화
- 모델 라우팅: 고성능 모델은 필요한 경우에만 사용
- 프롬프트 압축: 불필요한 컨텍스트 제거
- 캐싱: 반복 질문/템플릿 응답 캐시
비용 모델링 템플릿
# 월간 비용 추정
요청수: 1,000,000건
평균 입력: 700 tokens
평균 출력: 300 tokens
모델 단가: $X / 1M tokens
캐시 히트율: 25%
예상 비용: (입력+출력) * 단가 * (1-캐시율)
비용 계산 시트 예시
| 항목 | 값 |
|---|---|
| 월간 요청 수 | 1,000,000 |
| 평균 입력/출력 | 700 / 300 tokens |
| 단가 | $X / 1M tokens |
| 캐시 히트율 | 25% |
| 예상 비용 | ≈ $Y |
장애 대응 시나리오
- 모델 응답 지연 또는 오류율 상승 감지
- 폴백 모델로 자동 전환
- 원인 분석 후 프롬프트/라우팅 정책 수정
도메인별 운영 포인트
- 코딩: 리포지토리 접근 권한과 비밀키 보호가 핵심
- 문서:
- 문서 버전 관리: 지식베이스와 LLM 컨텍스트 간 최신 정보 유지
- 자동 갱신: 문서 변경 시 임베딩 데이터베이스 자동 업데이트
- 출처 표기: LLM 응답에 참조 문서 링크 및 버전 정보 포함
- 지원: 민감 정보 마스킹과 이력 추적 강화
문서 동기화 구현 예시:
- Webhook으로 Notion/Confluence 변경 감지
- 변경된 문서를 자동으로 크롤링 및 청킹
- 벡터 DB (Pinecone, Qdrant)에 재인덱싱
- LLM 응답 시 최신 문서 참조 보장
제공자별 API 스니펫
실제 운영에서는 키 관리/레이트리밋/재시도 정책을 함께 적용하세요.
# Claude (예시)
const payload = {
"model": "MODEL_ID",
"max_tokens": 256,
"messages": [{ "role": "user", "content": "요약해줘" }]
};
# OpenAI (예시)
const payload = {
"model": "MODEL_ID",
"messages": [{ "role": "user", "content": "요약해줘" }],
"max_tokens": 256
};
# Gemini (예시)
const payload = {
"contents": [
{ "role": "user", "parts": [{ "text": "요약해줘" }] }
]
};
# Ollama (로컬 예시)
const payload = {
"model": "llama3.1",
"prompt": "요약해줘",
"stream": false
};
운영 로드맵
- 가장 단순한 API 호출로 프로덕트 가설 검증
- 프롬프트 템플릿과 평가셋 구축
- 관찰성/가드레일 적용 후 확장