프롬프트에 자동화된 테스트를 도입했습니다. 이제 프롬프트 변경 시 평가를 통과하지 못하면 CI가 실패합니다(모델 교체 시에도 적용). 작동 방식은 다음과 같습니다.
I added automated testing to my prompts. Now prompt changes fail CI if they break evaluation — including across model switches. Here's how it works.
핵심 요약
프롬프트 변경 시 CI에서 자동화된 테스트를 통해 품질 저하와 모델 간 호환성 문제를 사전에 방지하는 시스템을 소개합니다.
- 자동화된 테스트 — 프롬프트 변경 시 CI를 통해 구조적 검증을 수행하여 품질 저하를 방지함
- 모델 호환성 검사 — 모델 공급자 변경 시 발생할 수 있는 잠재적 성능 저하를 사전에 탐지함
- 결정론적 검증 — 정규식, JSON 스키마, 길이 제한 등을 활용해 빠르고 비용 없이 테스트함
- 컨텍스트 인식 — 프롬프트의 의도를 자동 감지하여 최적의 무료 모델로 평가를 수행함
소프트웨어 엔지니어들은 테스트 없이는 코드를 배포하지 않아. 근데 대부분의 AI 팀은 프롬프트 수정할 때 체계적인 검증도 없이 그냥 배포해버리지.
흔히 하는 변명이 "프롬프트는 테스트하기 어렵다"는 건데, 반은 맞고 반은 틀려. LLM 기반 평가는 변동성이 좀 있거든. 하지만 프롬프트 구조에 대한 결정론적(deterministic) 단언(assertion)은 간단하고, 빠르고, 완전히 공짜야. 코드 프롬프트에 함수 정의가 포함되어 있는지, 구조화된 출력 프롬프트가 150단어 미만인지 확인하려고 굳이 AI 판사까지 쓸 필요는 없다는 거지.
우리가 쓰는 테스트 설정이 어떻게 생겼는지, 그리고 이게 사용자들한테 어떤 엿 같은 상황을 막아주는지 보여줄게.
이게 엔지니어링을 넘어 왜 중요한가:
회사에서 AI 툴 써본 사람들은 알 거야. 출력 품질이 은근슬쩍 맛탱이 가는 거. 저번 달엔 잘 되던 프롬프트가 갑자기 병신 같아지는데, 왜 그런지 아무도 모르는 상황 말이야. 이 시스템이 그걸 해결해. 프롬프트가 바뀔 때마다 배포 전에 자동화된 검사를 거치거든. 사용자들은 항상 검증된 프롬프트를 받게 되는 거지, 누군가의 망가진 실험 결과물을 받는 게 아니라.
그리고 덜 눈에 띄는 두 번째 문제가 있어. 한 모델에선 기가 막히게 잘 돌아가던 AI 툴이, 제공업체가 백엔드를 바꾸면 조용히 박살 나는 경우야. 사용자들은 왜 결과물이 구려졌는지 몰라. 그냥 그 툴을 안 쓰게 되는 거지.
이 시스템은 이 두 가지를 다 잡아내.
빠른 평가 엔드포인트:
POST /api/v1/evaluations/quick-evaluate
{
"prompt": "Generate a Python function to reverse a linked list",
"threshold": 0.8,
"assertions": [
{"type": "regex", "value": "def ", "weight": 0.5},
{"type": "length-min", "value": "10", "weight": 0.15},
{"type": "length-max", "value": "200", "weight": 0.15},
{"type": "llm-rubric", "value": "Does this prompt clearly specify the input format, return type, and any edge cases?", "weight": 0.2}
]
}
결정론적 단언만 수행하면 2초 안에 결과가 나와:
{
"passed": true,
"overall_score": 0.87,
"context_detected": "CODE_GENERATION",
"actionable_feedback": ["Consider specifying the return type", "Add edge case handling for empty list"],
"assertion_results": [...],
"failure_reasons": [],
"evaluator_model": "deterministic",
"evaluation_time_ms": 43
}
상태 비저장(Stateless) 방식이야. DB에 기록도 안 남고, 데이터셋 설정도 필요 없어.
두 가지만 기억해. 이 시스템은 프롬프트에서 컨텍스트를 자동으로 감지해. 네가 일일이 라벨링 할 필요가 없다는 소리야. 그리고 threshold(기본값 0.7)로 통과/실패 기준을 정할 수 있어. 운영 환경에 올릴 거면 0.9로 높이고, 개발 초기 단계면 낮추면 돼.
CI에서 무엇을 걸러낼 것인가:
모든 커밋마다 프롬프트를 빡세게 평가할 필요는 없어. 이렇게 하는 게 효율적이야:
- 구조적 단언만 수행 (빠르고, 공짜고, 결정론적임) — 정규식 패턴, JSON 스키마, 길이 제한 같은 거. 모든 PR마다 돌려.

