본문 바로가기
C.W.K.
Stream
Lesson 02 of 12 · published

프롬프트 회귀 테스트

~12 min · prompts, regression, drift

Level 0견습생
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

프롬프트는 조용히 썩어

프롬프트도 코드야. 버그가 있지. 밑에 있는 모델이 바뀌면 이탈이 생겨. 하나의 사용 사례를 위해 조금 고쳤는데 다른 곳이 깨지기도 해. 프롬프트 회귀 테스트는 프롬프트의 단위 테스트야.

프롬프트 회귀 테스트 묶음의 모양

각 테스트는 이렇게 생겼어:

  • 이미 아는 입력으로 실제 서비스 프롬프트를 호출해.
  • 출력값의 속성을 단언해. 예를 들어 '사용자 이름 포함', 'JSON 파싱 가능', '금지 문구 X 미포함', '소스 최소 하나 인용' 같은 거지.
  • 정확한 문구를 단언하지는 않아. LLM은 변동성이 있으니까. 대신 구조적이거나 의미적인 불변 조건을 단언해.

흔한 회귀 패턴

  1. JSON 스키마 — 프롬프트가 JSON을 반환해야 해. 테스트는 스키마에 맞는지 검증하지.
  2. 금지 문구 — 명시적으로 지원하는 주제에 대해서는 'I cannot help with that'이라고 답하면 안 돼.
  3. 인용 밀도 — 답변이 문맥에서 최소 N개의 소스를 참조해야 해.
  4. 톤 / 페르소나 — 답변이 합의된 목소리를 띠어야 해. 피파의 당당한 말투든, 브랜드의 전문적인 톤이든 말이야.
  5. 거부 정확성 — 진짜 주제를 벗어났거나 안전하지 않은 입력에는 모델이 거부해야 해.

Code

프롬프트 회귀 테스트 (Python)·python
# tests/test_prompt_regression.py
import pytest, json
from myapp.llm import answer

@pytest.mark.eval
def test_returns_valid_json_for_summary_prompt():
    out = answer(prompt='summarize-doc', input={'doc': SAMPLE_DOC})
    parsed = json.loads(out)  # raises if not valid JSON
    assert 'summary' in parsed
    assert isinstance(parsed['summary'], str)
    assert len(parsed['summary']) > 100

@pytest.mark.eval
def test_does_not_refuse_on_supported_topic():
    out = answer(prompt='biology-q', input={'q': 'How does photosynthesis work?'})
    assert 'cannot help' not in out.lower()
    assert 'sorry' not in out.lower()

@pytest.mark.eval
def test_cites_at_least_one_source():
    out = answer(prompt='rag-q', input={'q': 'When was X founded?'})
    # answer must include a citation pattern like [1] or (source: ...)
    assert any(p in out for p in ['[1]', '(source:', 'According to'])

External links

Exercise

서비스에서 트래픽이 가장 많은 프롬프트를 골라봐. 다음을 다루는 회귀 테스트 3개를 작성해: 형태(JSON / 형식), 내용(포함해야 할 것 / 하면 안 될 것), 거부 동작. @pytest.mark.eval 마커를 붙여서 CI에 추가해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.