⚡ AI 인텔리전스 레이더
🧪 전문가반 · 코드로 만드는 AI 엔지니어

🧪 파트 7 · 평가·운영

22회차 · 평가 & 운영(LLMOps) — 품질 측정부터 서빙까지

백두산 (Doosan Baek) · 게시 2026-06-13 · 최종 수정 2026-07-10

이 회차에서 배우는 것

🎯 목표'좋아 보인다'를 '정답률 X%'로 바꾸기
⚖️ LLM-as-judgeAI로 AI 답을 채점
🔁 회귀 테스트셋프롬프트 바꿔도 품질 안 깨지게
🔭 트레이싱·관측성요청·토큰·비용·지연 추적
✅ 평가 완료 기준'프롬프트 바꿨더니 X%→Y%'를 숫자로
🚀 FastAPI 서빙RAG·에이전트를 API로 노출
🔁 추상화·폴백·캐싱프로바이더 전환·장애 대비·비용 절감
🖥️ 오픈모델 서빙vLLM으로 로컬 모델 1회 (선택)
🧱 플랫폼화README·SDK로 '남이 5분 내 재사용'

이 트랙의 ★ 파트입니다. 평가는 AI 시스템을 제대로 만드는 데 가장 중요하지만, 막상 많은 사람이 건너뛰는 영역이에요 — 그래서 '되는 것 같다'와 '진짜 좋아졌다'의 실력 차이가 가장 크게 벌어지는 곳입니다. 20회차의 '첫 평가'를 제대로 된 평가 체계로 키웁니다.

🧭 왜 평가가 핵심인가

AI는 그럴듯하게 틀립니다. '이렇게 바꿨더니 좋아진 것 같다'를 숫자로 증명하지 못하면, 개선이 운에 맡겨집니다. 평가에는 두 종류 — offline(미리 만든 테스트셋으로 측정)과 online(실사용 로그로 측정).

⚖️ LLM-as-judge — AI로 채점

정답 채점을 사람이 다 하긴 어려우니, '채점 기준'을 주고 LLM에게 채점시킵니다(정확성·근거 일치·형식). 단, judge도 틀리니 사람이 일부 표본을 검수해 신뢰도를 확인합니다.

# judge 프롬프트 (개념)
JUDGE = '''아래 [질문]에 대한 [답변]을 [기대답]과 비교해 0~5점으로 채점하라.
기준: 사실 정확성, 근거 일치, 요구 형식 충족. 점수와 한 줄 이유를 JSON으로.
출력: {"score": 0-5, "reason": "..."}

[질문] {q}
[기대답] {gold}
[답변] {answer}'''

🔁 회귀 테스트셋 — 품질이 깨지지 않게

질문+기대답 모음을 고정해두고, 프롬프트·모델·청킹을 바꿀 때마다 전체를 다시 돌립니다. 점수가 떨어지면 경고 — '코드 테스트'의 AI판입니다. 한 군데 고치다 다른 데가 망가지는 걸 막아줘요.

🔭 트레이싱·관측성 — 어디서 새는지 보기

각 요청의 입력·검색결과·토큰·비용·지연을 기록하면, 품질이나 돈이 어디서 새는지 보입니다. 도구는 LangSmith·Phoenix·Braintrust 중 하나만 골라 쓰면 됩니다(개념만 알고 1택).

🔧 만들 것 — eval 하니스

  1. 골든셋 확장(20회차 10개 → 30~50개 대표 질문)
  2. 파이프라인을 골든셋에 돌려 judge로 채점 → 점수 집계
  3. 모델·프롬프트별 비교 리포트를 자동 생성(표 한 장)

✅ 완료 기준

📌 평가 파트 핵심

여기까지가 '품질을 숫자로 보는' 평가 파트였습니다. 이제 그 평가까지 거친 기능을 '서비스'로 만들고, '남이 가져다 쓰는 도구'로 포장합니다 — 트랙의 마지막 단계입니다. 앞서 본 게이트웨이, 셀프호스팅 개념을 이제 코드로 잇습니다.

🚀 FastAPI로 서빙 — 함수를 API로

지금까지 만든 챗봇·에이전트는 '내 터미널에서 도는 함수'였습니다. FastAPI로 감싸면 'URL로 호출하는 API'가 돼, 웹·앱·남의 서비스가 가져다 쓸 수 있어요.

# serve.py — 챗봇을 API로 노출
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Ask(BaseModel):
    question: str

@app.post('/ask')
def ask_endpoint(body: Ask):
    answer, sources = rag_answer(body.question)   # 20회차 RAG 챗봇 재사용
    return {'answer': answer, 'sources': sources}
# 실행: uvicorn serve:app --reload

🔁 추상화·폴백·캐싱 (LLMOps)

🖥️ 오픈 모델 로컬 서빙 — vLLM (선택)

비용·프라이버시를 위해 오픈 모델을 직접 서빙할 수 있습니다. vLLM은 오픈 모델을 'OpenAI 호환 API'로 띄워줘요 — 17회차 로컬 GPU, 14회차 Ollama의 '본격 API 서버'판입니다. 한 번 띄워 ask()의 프로바이더로 꽂아보면 충분.

🧱 플랫폼화 — '내 도구'에서 '남의 도구'로

7번째 역량 — 남이 재사용하는 컴포넌트를 설계하는 일입니다. 기능을 깔끔한 함수/SDK로 정리하고, README로 '설치→실행 5분'을 만들고, '비정형 문제를 어떻게 구조화했나'를 회고 글 1편으로 남깁니다(내 결과물 기록용).

  1. 20~22 기능(RAG·에이전트·평가)을 하나의 패키지로 통합 + 환경변수로 3프로바이더 전환
  2. README 작성 — 무엇을·왜·어떻게·결과 숫자(설치→실행 5분)
  3. 회고 글 1편 — '내 자료로 답하는 비서를 어떻게 구조화했나'

✅ 완료 기준

🌉 다음 한 걸음 — '쓰는' 엔지니어에서 '만드는' 엔지니어로

여기까지가 '기성 모델을 코드로 제대로 쓰는' 전문가의 완성입니다 — RAG·에이전트·평가·서빙·플랫폼화. 솔직히 현업의 대부분은 여기까지로 충분해요. 하지만 한 걸음 더, 그 '남의 모델'을 우리말·우리 도메인에 맞춰 '직접 만드는' 쪽이 있습니다. 마지막 23회차는 그 지도 — 비싼 상용 모델을 우리만의 모델로 직접 대체하는 일이 실제로 어떻게 굴러가는지입니다.