대부분의 팀은 2008년식으로 프롬프트를 배포합니다. 더 나은 도구를 만들었습니다.
Most teams ship prompts like its 2008. I built something better.
핵심 요약
프롬프트를 프로덕션 코드처럼 체계적으로 테스트하고 최적화할 수 있는 도구 'PromptLabs'를 소개합니다.
- 프롬프트 테스트 — 프롬프트를 단순 설정값이 아닌 프로덕션 코드로 간주하여 체계적인 테스트 인프라를 제공함.
- 자동화된 평가 — LLM을 활용해 다양한 입력 사례를 생성하고, 여러 모델에서 동시에 성능을 평가함.
- 최적화 방식 — 프롬프트를 완전히 교체하는 대신, 코드 리뷰가 가능한 수준의 구체적인 수정안(diff)을 제안함.
- 데이터 분리 — 학습 데이터와 검증 데이터를 엄격히 분리하여 과적합을 방지하고 신뢰성 있는 결과를 도출함.
대부분의 팀은 2008년에 CSS를 배포하던 방식 그대로 프롬프트를 배포합니다. 수정하고, 몇 가지 결과물을 대충 훑어보고, 프로덕션에 배포하고, 사용자가 불평하기를 기다렸다가 다시 반복하죠. 프롬프트는 프로덕션 코드입니다. 파이썬 코드와 동일한 수준의 테스트 인프라를 누릴 자격이 있습니다.
그래서 제가 PromptLabs를 만들었습니다.
작동 방식은 다음과 같은 5단계로 이루어집니다:
-
입력을 제공합니다. 의도(예: "고객 지원 이메일을 청구, 기술, 계정, 기타로 분류")를 입력하거나, 기존 프로덕션 프롬프트와 그동안 발견된 실패 사례를 입력합니다.
-
EvalGen이 테스트 스위트를 작성합니다. 프롬프트를 검증할 5~8가지 범주의 입력(정상 경로, 예외 사례, 적대적 사례)을 선택하고, 범주당 하나의 병렬 LLM 호출을 실행한 뒤 결과를 중복 제거합니다. 덕분에 단순히 쉬운 사례를 50번 재작성하는 것이 아니라 실제적인 커버리지를 확보할 수 있습니다. 같은 호출 과정에서 채점 기준도 작성됩니다. 그 후 테스트 세트를 학습용과 검증용으로 분리합니다. 검증용 데이터는 최적화 과정에 절대 노출되지 않습니다.
-
Runner가 모든 대상 모델에서 프롬프트를 병렬로 실행합니다. Sonnet 3.5, GPT-4o, Gemini 1.5 사이에서 고민 중이신가요? 세 모델 모두 동일한 평가 세트에서 한 번에 실행됩니다. 몇 분 안에 결과가 나오고, 평가당 비용이 동일한 차트에 표시됩니다.
-
Judge가 모든 결과물을 기준별로 채점합니다. LLM-as-judge 방식을 사용하며 추론 과정이 포함되어 있어, 왜 그런 점수가 나왔는지 정확히 확인할 수 있습니다.
-
Optimizer가 전체 재생성이 아닌 diff(차이점)를 제안합니다. 프롬프트가 실패한 지점을 파악한 뒤, 구체적인 줄 단위 편집(3번째 줄 뒤에 이 구문을 삽입, 이 문장 삭제, 이 단락 재작성 등)을 반환합니다. 마치 풀 리퀘스트를 읽듯이 검토할 수 있습니다. 새로운 버전은 검증 세트에서 채점됩니다. 루프는 수렴 여부나 과적합 여부를 확인하고, 결과를 수락하거나 새로운 프롬프트로 3단계로 돌아갑니다.
수락된 프롬프트는 HTTP를 통해 제공됩니다. 프로덕션 코드가 요청 시점에 최신 버전을 가져오므로, 재배포 없이도 반복적인 개선이 가능합니다.
기존에 사용해 보셨을 도구들과 차별화되는 세 가지 특징은 다음과 같습니다:
평가 세트가 실제적입니다. 범주별로 계층화하고 병렬 생성 및 중복 제거를 거치기 때문에, 단순히 정상 경로를 50번 재작성하는 대신 예외 사례까지 커버할 수 있습니다. 대부분의 도구는 평가 생성을 아예 건너뛰거나, 40개의 거의 유사한 중복 결과를 생성하는 LLM 호출 하나에 의존합니다.
학습 데이터와 검증 데이터가 분리되어 있으며, 루프가 이를 강제합니다. 궤적 차트를 통해 과적합이 시작되는 순간 격차가 벌어지는 것을 확인할 수 있으며, 과적합 발생 시 루프가 스스로 중단됩니다. "최고 버전"을 선택할 때 하한 신뢰 구간을 사용하여, 운 좋게 높은 점수를 받은 변동성 큰 결과가 리더보드를 조작하지 못하게 합니다. 대부분의 "최적화" 도구는 검증 세트조차 없습니다.
Optimizer는 프롬프트를 교체하는 것이 아니라 진화시킵니다. diff는 검토 가능합니다. 일부 수정 사항은 수락하고 나머지는 거부할 수 있습니다. 6개월 동안 프롬프트에 공들여 쌓아온 도메인 지식이 매 반복마다 사라지지 않습니다. DSPy 스타일의 프레임워크는 재생성하지만, 이 도구는 정교하게 다듬습니다.
만약 promptfoo + dspy + langfuse를 억지로 조합해 하나의 워크플로우를 만들고 계셨다면, 이 도구 하나로 모든 것을 해결할 수 있습니다. 프롬프트를 프로덕션 코드가 아닌 설정 문자열로 취급하고 있다면, 정확도를 포기하고 있는 것이며 문제가 터지기 전까지는 알 수 없는 잠재적 오류를 방치하고 있는 셈입니다.
MIT 라이선스, 로컬 실행, 본인 API 키 사용.


