728x90
반응형
SMALL
LangServe API 배포 · LangSmith 모니터링 · 성능·보안·비용 튜닝 종합 가이드
‘LangChain 시리즈’ 마지막 글입니다. 지금까지 만든 FAQ 챗봇(문서 검색 + 수치 계산)을 프로덕션에 배포하고, 지속적 관측·성능 최적화·보안 체계까지 구축하는 모든 단계를 상세히 설명합니다. 이 글 한 편으로 개발 → CI/CD → 런타임 → SRE → 거버넌스 전 과정이 연결됩니다.
1. 프로젝트 목표 & 주요 지표
1‑1. 서비스 목표
카테고리 목표 값 비고
| 가용성 | 99.9 % / 월 | 지역 장애 시 > 99 % 유지 |
| 응답 레이턴시 | p95 < 2 초 | 네트워크 < 200 ms, LLM < 1500 ms |
| 월간 비용 상한 | USD 50 | 모델 요금 + 인프라 |
| 정확도(FAQ) | LangSmith Eval ≥ 0.85 | 50개 샘플 기준 |
| 보안 | PII zero‑leak | SOC 2 보조 지표 |
| 스케일 | 동시 200 RPS | 버스트 500 RPS 30 s |
1‑2. 핵심 리스크
- 토큰 폭주 — 무한 루프, 어뷰즈 공격
- 비용 초과 — GPT‑4o 긴 대화, 대량 임베딩
- PII 노출 — 로그·모니터링에 주민번호 유출
- 스케일 병목 — Embedding I/O, DuckDB 잠금
2. 인프라 아키텍처 (상세)
┌──────────────┐ Slack Alerts ┌──────────────┐
│ Alertmanager │◀───────────────▶│ On‑call │
└─────▲────────┘ └──────────────┘
│ HTTP
┌──────────┐ HTTPS │ ┌──────────────┐
│ Client │──────────▶│ Nginx │ Prometheus │
└──────────┘ │ └─────▲────────┘
│ scrape │ /metrics
▼ │
┌─────────────────────────┐
│ LangServe (API) │ ◄── WebSocket (SSE)
│ FastAPI + Gunicorn │
└──────────┬──────────────┘
embeddings│ traces, eval
┌──────────▼─────────┐ ┌──────────────┐
│ DuckDB Vector │ │ LangSmith │
└──────────┬─────────┘ └──────────────┘
Redis‑TTL │ cache ▲ token cost
┌──────────▼─────────┐ │
│ Redis Cache │──────┘
└────────────────────┘
- Nginx SSL: Let’s Encrypt + Mutual TLS(사내망).
- LangServe Metrics: /metrics → Prometheus pull every 15 s.
- Alert Rules: p95 > 2 s 3 분 지속 → Slack #ai‑ops.
3. LangServe 설정 & FastAPI 확장
3‑1. 라우터 고급 옵션
add_routes(
app,
workflow,
path="/chat",
enable_streaming=True,
cors_origins=["https://portal.company.com"],
cors_allow_headers=["Authorization", "Content-Type"],
auth_scheme="bearer", # JWT 검증
max_request_size=2_000_000, # 2 MB
)
- Auth: Azure AD JWT → Depends(validate_jwt) AuthMiddleware.
- RateLimit: slowapi / 60 per minute per IP.
3‑2. PII 마스킹 Hook
from langserve.utils import before_send
@before_send
def mask_pii(request, response):
import re
pattern = r"(\d{6}-\d{7})" # 주민번호
response["content"] = re.sub(pattern, "[REDACTED]", response["content"])
3‑3. OpenTelemetry Trace
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
FastAPIInstrumentor.instrument_app(app, tracer_provider=provider)
- Exporter: OTLP → Grafana Tempo.
- Sampling: ParentBased(TraceIDRatio 0.1).
4. Docker · Compose · IaC
4‑1. Dockerfile 베스트 프랙티스
- Multi‑stage: builder(install) → slim runtime.
- pip --no‑cache-dir: 이미지 300 MB → 150 MB.
- Non‑root: USER appuser.
- Healthcheck: /health → 30 s interval, 3 fails → restart.
4‑2. docker‑compose 추가 기능
항목 설정 이유
| restart | on-failure:5 | 자동 복구 |
| resources | cpus 0.8, mem 1 G | 과부하 방지 |
| sysctls | net.core.somaxconn=1024 | HIGH RPS |
| log‑opts | max‐size 10 m, max‑file 3 | 디스크 보호 |
4‑3. IaC 옵션
- 작은 팀: Terraform + Docker Machine.
- 대규모: Helm Chart + Kubernetes(KEDA Event).
- Storage Class: RWO PVC 5 GB for DuckDB.
5. CI/CD 파이프라인 구현
5‑1. 불릿 여부
- PyTest + Ruff → 스타일·테스트 통과.
- LangSmith Eval → 품질 게이트 0.85.
- Docker Buildx → multi‑arch(amd64 + arm64).
- Tagging → prod‑{git.sha}.
- Deploy Steps → SSH self‑hosted → docker compose pull && up ‑d.
- Blue‑Green → api_blue / api_green compose profiles 로직.
5‑2. Slack PR 알림 Bot
- name: Slack Notify
uses: rtCamp/action-slack-notify@v2
env:
SLACK_CHANNEL: ai-release
SLACK_COLOR: good
SLACK_TITLE: "⚙️ Deployed ${{ github.sha }}"
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
6. 모니터링 · 알림 · 자동 평가
6‑1. Prometheus Rule 예시
groups:
- name: faq-bot.rules
rules:
- alert: HighLatency
expr: histogram_quantile(0.95, sum(rate(app_request_duration_seconds_bucket{job="api"}[5m])) by (le)) > 2
for: 3m
labels:
severity: page
annotations:
summary: "FAQ Bot p95 latency > 2s"
runbook: "https://runbooks.company.com/faqbot_latency"
6‑2. Grafana Dashboard 패널
- Heatmap of token/sec by node.
- Bar Gauge monthly cost forecast.
- Alert Table open incidents.
6‑3. LangSmith Eval 주기
- Cron: 4 시간마다 20 랜덤 질문.
- Slack Report: pass %, worst cases 링크.
7. 성능·비용·보안 최적화 심화
7‑1. 모델 믹스 전략
기능 모델 비용 지연
| FAQ 답변 | GPT‑3.5‑turbo | $ 0.5 / 1k req | 800 ms |
| 계산 + 최종 종합 | GPT‑4o‑mini | $ 2 / 1k req | 1200 ms |
| 백업 | Claude‑3 Haiku | $ 1 / 1k req | 900 ms |
- 주 로직 실패 시 자동 백업 모델 호출.
7‑2. Embedding 효율
- text-embedding‑3‑small → 0.02 $/1k tokens.
- Chunk size 384, overlap 48 → F1 +10 %.
- Adaptive MMR : query > 200 글자 → k = 8.
7‑3. PII Zero‑Leak
- Pre‑send filter re.sub(r"\b\d{6}-\d{7}\b","[SSN]", text).
- LangSmith Trace 저장 → IP 제한 VPC.
- Access Log 30 일 후 S3 Glacier → GDPR.
8. 감사 · 컴플라이언스 & 운영 핸드북
8‑1. Change Log 정책
- 모든 PR → Issue 링크 + SemVer tag.
- GitHub Releases → Slack #changelog 자동 포스팅.
8‑2. Runbook 템플릿
# FAQ Bot Incident Runbook
## Detection
- Alert HighLatency triggers.
## Immediate Action
- Scale api replicas +1.
- Check Redis latency.
## RCA Checklist
- Prometheus `redis_connected_clients` spike?
- OpenAI API 500?
## Postmortem
- Impact, timeline, action items.
8‑3. Audit Trail
- Container image digest + commit SHA 로그.
- LangSmith Trace ID → Prometheus label join → Grafana drill‑down.
9. 마무리 & 커뮤니티 리소스
이번 완결편에서는 API 배포, CI/CD, 모니터링, 성능·보안·비용 최적화, 컴플라이언스까지 LLM 서비스 운영의 전 과정을 다루었습니다. 이제 여러분은 단순 프로토타입을 넘어, 엔터프라이즈급 챗봇을 설계·배포·유지보수할 준비가 되셨습니다.
추가 학습 자료
- LangServe Docs : https://github.com/langchain-ai/langserve
- LangSmith Guide : https://docs.smith.langchain.com
- Prompt Engineering Patterns (무료 e‑Book)
- OpenTelemetry Handbook
728x90
반응형
LIST
'인공지능 (AI) > LangChain&LangGraph' 카테고리의 다른 글
| 5 – 멀티 에이전트 챗봇 예제 프로젝트 (1) | 2025.06.18 |
|---|---|
| 4 – LangGraph로 멀티 에이전트 구성하기 (1) | 2025.06.18 |
| 3 – LangChain 핵심 모듈 심화 (1) | 2025.06.18 |
| 2 – LangGraph 소개 (0) | 2025.06.18 |
| 1 – LangChain 개요와 아키텍처 (0) | 2025.06.18 |