/AI & 자동화/LLM 프롬프트 엔지니어링 마스터 3편: 버전 관리와 A/B 테스트 운영
AI & 자동화프롬프트엔지니어링버전관리

LLM 프롬프트 엔지니어링 마스터 3편: 버전 관리와 A/B 테스트 운영

프롬프트는 코드다 많은 팀이 프롬프트를 하드코딩합니다. 누가 언제 왜 바꿨는지 추적이 안 되고, 성능이 나빠져도 원인을 찾기 어렵습니다. Git 기반 프롬프트 레지스트리 A/B 테스트: 트래픽 분할 LLM-as-Judge 자동 평가 통계적 유의성 검정 CI/CD 통합 이 3편 시리즈로 프롬프트 엔지니어링의 전 과정(기법 습득→고급 패턴→체계적 운영…

LLM 프롬프트 엔지니어링 마스터 3편: 버전 관리와 A/B 테스트 운영

프롬프트는 코드다

많은 팀이 프롬프트를 하드코딩합니다. 누가 언제 왜 바꿨는지 추적이 안 되고, 성능이 나빠져도 원인을 찾기 어렵습니다.

Git 기반 프롬프트 레지스트리

CODE
prompts/
├── customer_service/
│   ├── refund_handler.v1.yaml
│   ├── refund_handler.v2.yaml  ← 현재 프로덕션
│   └── refund_handler.v3.yaml  ← 실험 중
└── content_generation/
    └── blog_writer.v4.yaml
YAML
# refund_handler.v2.yaml
version: "2.0.1"
model: "claude-sonnet-4-6"
temperature: 0.1
system: |
  당신은 {{company_name}}의 CS 전문가입니다.
  환불 정책: {{refund_policy}}
metadata:
  author: "team-cx"
  eval_score: 0.87
  changelog: "공감 표현 강화, 거절 문구 부드럽게"
Python
class PromptRegistry:
    def __init__(self, dir: str = "prompts"):
        self.dir = Path(dir)

    def get(self, name: str, version: str = "latest") -> dict:
        if version == "latest":
            files = sorted(self.dir.glob(f"**/{name}.v*.yaml"))
            return yaml.safe_load(files[-1].read_text())
        return yaml.safe_load((self.dir / f"{name}.{version}.yaml").read_text())

A/B 테스트: 트래픽 분할

Python
import hashlib

class PromptABTest:
    def __init__(self, control: str, experiment: str, split: float = 0.1):
        self.control = control
        self.experiment = experiment
        self.split = split

    def get_version(self, user_id: str) -> str:
        # 동일 user_id는 항상 같은 그룹 (일관된 UX)
        h = int(hashlib.md5(user_id.encode()).hexdigest(), 16)
        return self.experiment if (h % 100) < (self.split * 100) else self.control

LLM-as-Judge 자동 평가

Python
JUDGE = """
고객 문의: {msg}
에이전트 응답: {resp}

1~5점 채점 후 JSON만 반환:
- empathy: 고객 감정 공감도
- accuracy: 정보 정확도
- resolution: 문제 해결도
- overall: 종합

{"empathy": N, "accuracy": N, "resolution": N, "overall": N}
"""

async def llm_judge(msg: str, resp: str) -> dict:
    result = await llm.generate(JUDGE.format(msg=msg, resp=resp), temperature=0)
    return json.loads(result)

통계적 유의성 검정

Python
from scipy import stats

def analyze_ab(ctrl_scores: list, exp_scores: list) -> dict:
    _, p = stats.ttest_ind(ctrl_scores, exp_scores)
    ctrl_m = sum(ctrl_scores) / len(ctrl_scores)
    exp_m = sum(exp_scores) / len(exp_scores)
    return {
        "control_mean": ctrl_m,
        "experiment_mean": exp_m,
        "improvement": f"{(exp_m - ctrl_m) / ctrl_m * 100:+.1f}%",
        "p_value": p,
        "significant": p < 0.05,
        "winner": "experiment" if exp_m > ctrl_m and p < 0.05 else "control"
    }

CI/CD 통합

YAML
# .github/workflows/prompt-eval.yml
on:
  push:
    paths: ["prompts/**/*.yaml"]
jobs:
  eval:
    steps:
      - run: python scripts/validate_prompts.py
      - run: python scripts/run_evals.py --dataset golden --threshold 0.82
      - run: python scripts/register_ab_test.py --version ${{ github.sha }}

이 3편 시리즈로 프롬프트 엔지니어링의 전 과정(기법 습득→고급 패턴→체계적 운영)이 완성됩니다.

✦ ✦ ✦
편집 검토 · Editorial Review

이 글은 AI 에이전트가 자료 조사와 1차 초안 작성을 담당하고, 사람 편집자가 사실관계·출처·톤과 맥락을 검토한 뒤 발행했습니다. 환경(OS·버전)에 따라 결과가 다를 수 있으니 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요 — 확인 후 신속히 정정합니다.

초안 · AI (Content Reviewer)·검토 · Nodelog 편집자·발행 ·

댓글

첫 번째 댓글을 남겨보세요.