728x90
원문 맥락: Chip Huyen, 『AI Engineering』를 기반으로 실무 관점에서 재구성했습니다.
대상: 보안 관점이 강한 서비스 프로바이더(웹호스팅/클라우드/대고객 SaaS) 조직
AI 엔지니어링 3계층 한눈에 보기
1. 애플리케이션 개발 (Application Dev)
- 핵심: 프롬프트 설계, UX/UI, 피드백 루프, 평가 자동화
- 산출물: 대화 시나리오, 안전 정책, 평가 대시보드, 로그·메트릭
- 빠른 시작 코드 (FastAPI + 스트리밍 응답 예시)
# pip install fastapi uvicorn httpx from fastapi import FastAPI from fastapi.responses import StreamingResponse import httpx, json app = FastAPI() SYSTEM = "You are a helpful assistant. Follow company safety rules. Answer in Korean." async def gen(prompt: str): async with httpx.AsyncClient(timeout=30) as c: # 사내 프록시/게이트웨이 또는 vLLM/OpenAI 호환 엔드포인트 async with c.stream("POST", "http://llm-gw/v1/chat/completions", json={"model":"gpt-4o-mini", "messages":[{"role":"system","content":SYSTEM}, {"role":"user","content":prompt}], "stream":True}) as r: async for line in r.aiter_lines(): if line and line.startswith("data: "): chunk = line.replace("data: ","") if chunk != "[DONE]": yield json.loads(chunk)["choices"][0]["delta"].get("content","") @app.get("/chat") async def chat(q: str): return StreamingResponse(gen(q), media_type="text/plain; charset=utf-8")
- 프롬프트 템플릿 팁
[역할] 보안 정책을 준수하는 사내 도우미 [목표] 사용자의 질문에 간결·정확·근거 제시 [제약] 내부 비밀/PII 금지, 불확실 시 명확히 밝히기 [출력형식] 번호 매김, 한국어, 코드 시 예시 포함
2. 모델 개발 (Model Dev)
- 핵심: 파인튜닝, 추론 최적화, 데이터셋 엔지니어링
- 전술: LoRA/QLoRA, 양자화(AWQ/GPTQ), Speculative/Medusa, Batching
- SFT(지도학습) 간단 예시 (TRL)
pip install transformers datasets peft trl accelerate bitsandbytes
from trl import SFTTrainer from datasets import load_dataset from transformers import AutoModelForCausalLM, AutoTokenizer base="meta-llama/Llama-3-8b-Instruct" tok = AutoTokenizer.from_pretrained(base, use_fast=True) model = AutoModelForCausalLM.from_pretrained(base, load_in_4bit=True, device_map="auto") ds = load_dataset("json", data_files="sft.jsonl") # {"prompt":..,"response":..} trainer = SFTTrainer(model=model, tokenizer=tok, train_dataset=ds["train"], dataset_text_field=None, max_seq_length=2048, packing=True) trainer.train() trainer.model.save_pretrained("./ckpt")
- 서빙 최적화(vLLM) 예시
pip install vllm python -m vllm.entrypoints.openai.api_server \ --model ./ckpt --tensor-parallel-size 2 --gpu-memory-utilization 0.9 \ --max-num-batched-tokens 65536 --enforce-eager
3. 인프라 (Infra)
- 구성: API 게이트웨이(레이트리밋·A/B), 모델 서버(vLLM/TensorRT-LLM), 벡터DB, 피처스토어, 모니터링(Prometheus/Grafana), 로깅(PII 마스킹)
- K8s 배치 예시 (요지)
apiVersion: apps/v1 kind: Deployment metadata: {name: vllm} spec: replicas: 2 template: spec: containers: - name: vllm image: vllm/vllm-openai:latest args: ["--model","/models/ckpt","--max-num-batched-tokens","65536"] resources: {limits: {nvidia.com/gpu: "1"}} --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: {name: vllm-hpa} spec: scaleTargetRef: {apiVersion: apps/v1, kind: Deployment, name: vllm} minReplicas: 2 maxReplicas: 8 metrics: - type: Resource resource: {name: cpu, target: {type: Utilization, averageUtilization: 70}}
AI 엔지니어링 vs ML 엔지니어링 (그리고 풀스택) 핵심 차이
1. 모델 활용 방식
- 과거 ML: 모델을 직접 학습(특화된 피처·알고리즘)
- 현재 AI: 사전학습 대형모델 호출/RAG/경량 미세조정이 주류
→ 평가·데이터 품질이 경쟁력의 중심으로 이동
2. 자원·스킬
- 수백~수천 GPU 클러스터·스케일링·비용 최적화 역량 중요
- 제품화: 지연·성능·안정성·비용/요금제를 함께 설계
3. 평가 트랜지션
- 닫힌 정답 → 오픈형 출력 품질(사실성·안전성·형식성)
- 자동·반자동 평가 파이프라인(LLM-judge, Ragas/DeepEval, 휴먼 라벨 루프)
4. 풀스택과의 경계 해체
- 프론트/모바일/웹 풀스택 개발자가 AI 인터페이스+도구 연결로 제품 빠르게 론칭
- 서버 없는(서버리스/게이트웨이) + 플러그인/MCP/함수 콜로 백엔드 간소화
모델 맞춤화: 프롬프트 vs 파인튜닝 선택 기준
- 먼저 프롬프트+컨텍스트(RAG) → 요구 품질·규모 증가 시 파인튜닝 병행
- 의사결정 체크리스트
- 데이터가 사내에 충분? (수만~수십만 고품질 페어) → 파인튜닝 유리
- 응답 형식 일관성·속도·비용이 중요? → 파인튜닝
- 도메인 지식이 사내 문서에 분산? → RAG 우선
- 보안·비식별화가 필수? → RAG+권한 필터, 필요 시 도메인 SFT
“학습”의 세분화 (용어 정리)
- 사전학습(Pre-training): 초대형 코퍼스 기반, 일부 대형 기관만 가능
- 파인튜닝(Fine-tuning): 도메인/업무 맞춤 가중치 조정(SFT→DPO/RLHF)
- 후속학습(Post-training): 광의로 SFT·지속적 업데이트·안전 강화를 포함
300x250
데이터셋 엔지니어링 (라벨·윤리·품질)
1. 스키마(권장 JSONL)
{"prompt":"고객 A의 환불 규정은?","context":["문서링크1", "FAQ#12"],"response":"...","metadata":{"pii":false,"policy":"refund_v3"}}
2. 품질 파이프라인
- 수집→정제(중복/노이즈 제거)→PII 마스킹→라벨 가이드→다중 검수→골든셋 분리
- 간단 PII 마스킹 예시 (Python)
import re def mask_pii(text): text = re.sub(r'\b\d{3}-\d{4}-\d{4}\b', '[PHONE]', text) text = re.sub(r'[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}', '[EMAIL]', text) return text
3. 윤리·프라이버시
- 최소 수집·목적 제한·보관 기간·접근권한(ACL)·감사로그
- 라벨 지침 문서화: 허용/금지 응답, 레퍼런스 근거 표기, 사례·엣지케이스 포함
AI 앱 개발 트렌드 & 패턴
1. Product-first
- “빨리 만들고(프로토타입) → 자동평가/로그로 개선 → 필요시 데이터/모델 투자”
- UX 포인트: 즉답성(LLM 캐시·스니펫 답변), 출처표시, 편집/피드백 버튼
2. 경량화/엣지
llama.cpp
기반 온디바이스 체험# gguf 양자화 & 실행 예시 ./quantize ./llama-f16.gguf ./llama-q4.gguf Q4_K_M ./server -m ./llama-q4.gguf --port 8000 --n-gpu-layers 20 --mlock
AI vs 풀스택 엔지니어링 협업 모델
- FE/모바일: 스트리밍·토큰 단위 UI, 대화 기록·편집·재평가 UX
- BE: 게이트웨이(감사·요금·레이트리밋), RAG 권한 필터, 모델 셀렉터(비용/품질 라우팅)
- 예시: Next.js API Route
// /api/chat/route.ts export async function POST(req: Request) { const {messages} = await req.json(); const r = await fetch(process.env.LLM_GW!, { method:"POST", headers:{"content-type":"application/json","authorization":`Bearer ${process.env.TOKEN}`}, body: JSON.stringify({model:"auto", messages, stream:true}) }); return new Response(r.body, { headers: { "Content-Type":"text/event-stream" }}); }
보안·컴플라이언스 체크리스트 (서비스 프로바이더 관점)
- 데이터 거버넌스
- 분류/등급: 고객콘텐츠·계정·결제·내부문서 구분, 벡터DB에 ACL 반영
- 로깅·샘플링 시 PII 마스킹(위 예시), 정책 기반 보존/삭제
- 프롬프트 보안
- 시스템 프롬프트 고정(서버 보관), 사용자 프롬프트 정제(HTML/SQL/명령 차단)
- 프롬프트 인젝션 테스트(“무시하고 비밀 출력”류 패턴/리그)
- 툴 사용 제한
- 함수 호출/플러그인은 허용 목록만, 출력 검증(스키마·레귤라)
{"tool":"sql_query","args":{"query":"SELECT ... WHERE tenant_id = :uid"}}
- 서빙·공급망
- 모델/컨테이너 해시 고정, SBOM, 이미지 스캔
trivy image registry/llm-gw:1.2.3 cosign verify registry/llm-gw@sha256:...
- 비밀 관리
- Prompt/로그에 토큰 금지, HashiCorp Vault/KMS 사용, 단기 토큰·스코프 최소화
- 네트워크·격리
- 사설망/프록시, egress 제한, 멀티테넌트 격리(네임스페이스·RLS)
- 레이틀리밋/청구
- 사용자/테넌트별 토큰·QPS 제한, 코스트 대시보드
- 안전 평가/레드팀
- 욕설/증오/자해/민감주제/저작권 시나리오 테스트셋 운영
- 인시던트 대응 플로우: 차단→경보→샘플 수집→모델/프롬프트 패치
평가(Automatic/Hybrid) 플레이북
1. 지표 설계
- 오픈형: 사실성(Fact), 근거성(Groundedness), 유용성(Helpfulness), 형식성(Structure), 안전성(Safety)
- 운영 지표: 응답시간, 토큰/원가, 수정율, 재질의율, NPS
2. 예시 코드 (RAG 품질: Ragas)
pip install ragas datasets evaluate
from ragas import evaluate
from ragas.metrics import answer_relevancy, faithfulness
result = evaluate(
dataset=rag_dataset, # question, contexts, answer, ground_truth
metrics=[answer_relevancy, faithfulness]
)
print(result)
3. 페어와이즈/LLM-judge (DeepEval 스타일)
pip install deepeval
from deepeval import assert_test
from deepeval.metrics import PairwiseMetric
metric = PairwiseMetric(criteria="정확성/간결성/안전성 각 1~5점", judge_model="gpt-4o-mini")
assert_test(candidate_a=resp_a, candidate_b=resp_b, metric=metric)
참조 아키텍처 & 활용 사례
1. 사내 지식 어시스턴트 (RAG)
- 파이프라인: 문서 수집 → PII 마스킹 → 임베딩(테넌트별 인덱스) → 검색 → 권한 필터 → 답변
- 벡터 검색 쿼리 예시
query = f"{user_query} [tenant:{tenant_id}]" results = vectordb.search(query, filter={"tenant_id": tenant_id, "doc_acl":{"$in":[user_id, "public"]}})
2. 보안 이벤트 트리아지
- 입력: EDR/IDS 로그 → 요약/우선순위/추천 액션 → 티켓 시스템 연동
- 가드레일: IOC·명령 제안은 근거 출처 필수, 차단·삭제 명령은 사람 승인
3. 호스팅 고객지원 자동화
- 결제/환불/도메인/SSL/DB/FTP 등 FAQ → 스니펫/양식 자동 생성
- 정책 변경 시 골든셋 업데이트 → 야간 자동 재평가 → 회귀 감지 시 롤백
성능·비용 최적화 팁
- Batching + KV 캐시(vLLM), 요청 길이 제한, 함수 호출로 짧은 답변 설계
- 모델 라우팅(쉬운 질문=소형, 어려운 질문=중형, 법적/결제=대형)
- 캐시: 프롬프트·검색결과 캐시, 템플릿화로 토큰 절약
도입 로드맵(4단계)
- PoC: RAG+평가 대시보드, 보안·PII 마스킹 포함
- Pilot: 테넌트·권한 모델, 레이트리밋·코스트 모니터
- Scale: 파인튜닝 병행, A/B, 자동 회귀테스트
- 운영 고도화: 안전 레드팀, 모델 라우팅, SLO/SLA 체계
핵심요약
- 스택은 3계층(앱·모델·인프라), 경쟁력은 평가 자동화와 데이터 품질
- 프롬프트/RAG 먼저, 임계점에서 파인튜닝으로 속도·일관성·비용 개선
- 보안은 기본 설계요소: PII 마스킹, 권한 필터, 툴 허용목록, 공급망 검증, 레이트리밋
- 풀스택 협업으로 빠른 론칭 → 자동평가/로그 기반 반복 개선
728x90
그리드형(광고전용)
댓글