프롬프트를 시험으로 돌립니다 | DAKER 커뮤니티

세 번 좋아 보이는 답은 시험이 아닙니다. 같은 프롬프트를 같은 입력으로 다시 돌리고, 기대한 문자열이 나오는지 파일로 확인하는 일이 시험입니다. 오늘 노트는 Promptfoo의 첫 평가를 그 파일로 만드는 순서입니다.

프롬프트를 시험으로 돌립니다

참고 영상은 Jason의 Start with PromptFoo in under 10 min.입니다. 설치, promptfoo init, 설정 파일, promptfoo eval, HTML 결과까지를 한 번에 보여 줍니다. 명령의 기준은 영상이 아니라 공식 문서 Getting started입니다. 영상은 그 순서를 화면에 재현한 기록입니다. 이 글은 방송 대본이 아닙니다. 오늘 해커톤 제출 링크를 올리기 전에 돌릴 최소 평가입니다.

OpenAI는 2026년 3월 9일 Promptfoo 인수를 발표했습니다. 공식문은 OpenAI to acquire Promptfoo입니다. 닫힌 뒤에 기술을 OpenAI Frontier에 넣는다고 적혀 있습니다. 거래 금액은 그 글에 없습니다. 이 글도 금액을 만들지 않습니다. 오늘 할 일은 인수 뉴스를 다시 쓰는 일이 아닙니다. 로컬에서 평가 파일을 한 장 만드는 일입니다.

저장소는 promptfoo/promptfoo입니다. 이 글을 쓰는 시점에 GitHub 페이지가 보여 준 별 표시는 24,499개입니다. README는 OpenAI와 Anthropic이 쓴다고 적습니다. 그 문장은 저장소의 소개입니다. 우리 저장소에서 오늘 통과했다는 결과가 아닙니다.

영상이 실제로 한 일입니다

영상에서 Jason은 일본어 학습 앱 폴더에 Promptfoo를 넣습니다. 설치는 Homebrew입니다. 녹화 시점에 화면에 나온 버전은 0.108.0입니다. 그 숫자를 오늘 최신 버전으로 적지 않습니다. 오늘 설치 명령은 공식 문서의 npx promptfoo@latest를 따릅니다.

첫 명령은 promptfoo init입니다. 대화형 마법사가 나옵니다. 처음이면 Not sure yet를 고릅니다. 로컬 모델을 시험하려고 Ollama를 고릅니다. 이미 README가 있어서 덮어쓰지 않습니다. 폴더에 promptfooconfig.yaml이 생깁니다. 예제 프롬프트와 공급자와 테스트가 들어 있습니다.

그대로 promptfoo eval을 돌리면 API 키가 없어 실패합니다. 공급자를 Ollama로 바꿉니다. 영상에서 모델 이름 앞에 ollama:를 붙이지 않으면 실행이 안 됩니다. 접두어와 모델 이름을 붙인 뒤에야 평가가 돌아갑니다. 예제 설정은 성공 4건, 실패 2건입니다. 실패한 줄 가운데 하나는 뉴욕 트윗이 웃기는지를 다른 모델이 채점한 줄입니다. 웃기다를 파일로 적어 두지 않으면, 그 실패는 취향 논쟁으로 남습니다.

결과를 HTML로 받으려면 출력 파일을 지정합니다. 영상은 promptfoo eval에 HTML 출력을 붙여 브라우저에서 열었습니다. 터미널 표만 보면 어느 열이 어느 모델인지 잘리지 않습니다. 브라우저에서 열면 열이 모델입니다. 공식 문서의 같은 일은 npx promptfoo@latest view입니다. 웹 화면에서 출력을 비교합니다.

Jason은 예제를 번역 시험으로 바꿉니다. 언어 변수는 Japanese입니다. 입력은 Hello world, 가까운 화장실, My name is Jason입니다. 어서션 없이 돌리면 출력이 있기만 하면 통과입니다. 그다음 contains를 넣습니다. 이름 번역이 가타카나를 포함하는지 확인합니다. 자신의 일본어가 약하니 이 어서션은 약하다고 말합니다. 원어 화자가 정한 문자열이 있어야 시험이 단단해진다고 말합니다. 그 문장을 그대로 가져옵니다. 우리가 제출 페이지에 넣을 단어도 같은 방식으로 적습니다.

공급자를 Mistral, Solar, Llama 3로 늘립니다. 다시 돌리면 성공 5건, 실패 4건입니다. 이 숫자는 그 영상, 그 설정, 그 로컬 모델의 결과입니다. Promptfoo 제품의 평균이 아닙니다. 오늘 여러분의 숫자로 바꿔야 합니다. 토큰을 아끼려고 로컬 모델을 쓴다는 설명은 영상에 있습니다. API 키가 없어도 첫 평가를 돌릴 수 있다는 뜻입니다. 로컬 모델이 제출 품질을 보증한다는 뜻은 아닙니다.

영상이 다루지 않은 것도 분명합니다. RAG 평가, 에이전트 궤적, 레드팀은 다음 편이라고 말합니다. 오늘 노트도 그 주제를 본문으로 확장하지 않습니다. 오늘 범위는 설정 파일 한 장, 평가 한 번, 실패 한 줄을 고치는 일입니다.

공식 문서가 시키는 첫 명령입니다

공식 Getting started는 예제로 시작하라고 적습니다. 명령은 아래입니다.

npx promptfoo@latest init --example getting-started
cd getting-started
npx promptfoo@latest eval
npx promptfoo@latest view

예제 폴더에는 promptfooconfig.yaml과 README가 생깁니다. 번역 프롬프트를 여러 모델에 넣는 기본 예입니다. 클라우드 공급자는 인증이 필요합니다. OpenAI라면 OPENAI_API_KEY를 환경 변수로 둡니다. 키 값을 이 글에 적지 않습니다. 키를 채팅에 붙여 넣지 마십시오. 로컬 환경 파일에만 두십시오.

처음부터 만들려면 npx promptfoo@latest init입니다. 화면으로 만들려면 npx promptfoo@latest eval setup입니다. Homebrew로 설치하는 방법도 문서가 적습니다. 오늘 재현의 기본은 npx입니다. 팀 기록이 같은 명령을 가리키게 합니다.

설정 파일의 세 덩어리는 프롬프트, 공급자, 테스트입니다. 프롬프트 자리 표시는 겹중괄호입니다. 문서 예는 영어 문장을 언어 변수로 번역하는 한 줄입니다. 공급자 예는 OpenAI, Anthropic, Google, 파일로 연결한 커스텀 공급자입니다. 로컬 Ollama도 들어갑니다. 테스트는 변수와 어서션입니다. 문서 예는 French 입력 Hello world에 contains 값 Bonjour le monde, Spanish 입력에 icontains입니다. 어서션은 선택입니다. 없어도 평가는 돕니다. 없으면 사람이 출력을 눈으로 읽습니다. 있으면 파일이 통과와 실패를 나눕니다.

같은 문서의 다음 예는 성격 형용사를 넣었을 때 답이 바뀌는지를 봅니다. init --example eval-self-grading입니다. 기본 어서션은 llm-rubric과 javascript 길이 점수입니다. 모델 비교 예는 init --example compare-openai-models입니다. 수수께끼 프롬프트에 비용 한도와 지연 한도를 겁니다. 명령줄에서 공급자를 덮어쓸 수 있습니다. 문서 예는 Google 모델 두 개로 바꿉니다. RAG 예는 init --example eval-rag입니다. 에이전트 예는 init --example openai-agents-basic입니다. 오늘 숙제는 getting-started입니다. 나머지 예는 링크만 남깁니다.

어서션 종류는 Assertions and Metrics에 있습니다. 문자열이 들어 있는지 보는 줄은 equals, contains, icontains, regex입니다. JSON이면 is-json, contains-json입니다. 모델이 거절했는지 보는 줄은 is-refusal입니다. 다른 모델이 채점하는 줄은 llm-rubric, similar입니다. RAG 쪽은 answer-relevance, context-faithfulness, context-recall, context-relevance입니다. 에이전트 궤적은 tool-used, tool-sequence, goal-success입니다. 앞에 not-를 붙이면 반대입니다. 오늘 첫 줄은 contains 하나입니다. 루브릭은 그다음입니다.

가중치와 임계값도 문서에 있습니다. 어서션마다 weight를 줄 수 있습니다. 기본은 1입니다. 테스트에 threshold를 두면 가중 평균이 그 값 이상일 때만 통과입니다. 문서 예는 equals 가중 2, contains 가중 1입니다. 출력이 Goodbye world이면 equals는 실패, contains는 통과, 점수는 0.33입니다. threshold가 0.5면 테스트는 실패입니다. 0.2면 통과입니다. 이 숫자는 문서의 산식 예입니다. 오늘 우리 점수가 아닙니다.

CI는 Testing Prompts with GitHub Actions입니다. 풀 리퀘스트가 프롬프트 파일을 바꾸면 이전과 이후를 비교합니다. 액션 이름은 promptfoo/promptfoo-action@v1입니다. 러너 Node는 22.22.0 이상입니다. 문서는 Node 24 LTS를 권합니다. 시크릿 이름은 OPENAI_API_KEYGITHUB_TOKEN입니다. 캐시 경로는 ~/.cache/promptfoo입니다. 오늘 숙제는 로컬 한 번입니다. 액션은 그 파일이 저장소에 들어간 뒤에 붙입니다. 로컬에서 실패하는 평가를 CI에 먼저 올리지 마십시오.

이 글이 아닌 것입니다

Promptfoo가 모든 프롬프트 품질을 대신 보증하지 않습니다. 어서션이 없으면 평가는 출력 모음입니다. 어서션이 약하면 통과는 통과가 아닙니다. contains에 쉬운 단어만 넣으면 아무 문장이나 통과합니다. llm-rubric의 채점 문장이 느슨하면 실패해야 할 답이 통과합니다. 파일이 초록이라고 제출이 끝난 것이 아닙니다. 다른 사람이 링크를 열어 한 번 성공해야 제출입니다.

인수 발표를 보안 제품 완성으로 읽지 않습니다. 공식문은 닫힌 뒤에 Frontier에 넣는다고 적습니다. 오늘 로컬 평가 파일이 Frontier가 된 것이 아닙니다. Fortune 500 사용 비율, 사용자 수, 거래 금액을 이 글에서 만들지 않습니다. 저장소 별 숫자도 이 글을 쓰는 시점의 화면입니다. 내일 같은 숫자가 아닐 수 있습니다.

영상 속 성공 4, 실패 2를 벤치마크로 인용하지 않습니다. 그 숫자는 예제 설정과 그 순간 Ollama 모델의 결과입니다. 우리 랜딩 카피의 점수가 아닙니다. 일본어 번역 예제를 우리 제출 문장으로 바꿔야 합니다. 예제를 그대로 올리면 평가는 돌아갑니다. 제출은 나아지지 않습니다.

유튜브 화면을 이 글에 넣지 않습니다. 주소만 둡니다. iframe은 쓰지 않습니다. 설치 광고, 조회수 자랑, 썸네일만 자극적인 영상은 고르지 않았습니다. 이 영상은 설치와 설정과 실패 줄을 보여 줍니다. 그 세 가지가 오늘 필요한 이유입니다.

오늘 할 일입니다

해커톤 제출은 올린 링크입니다. 배포가 제출입니다. 그 링크의 문장이 어제와 같은지, 금지 문장을 다시 넣지 않았는지를 채팅 기억으로 확인하지 마십시오. 파일로 확인하십시오. 오늘 범위는 제출 페이지 카피 한 덩어리입니다. 모델 전체를 바꾸지 않습니다. 카피 한 덩어리를 평가 파일 한 장에 고정합니다.

팀으로 내는 대회라면 이 파일을 저장소에 같이 둡니다. 프롬프트를 바꾸는 풀 리퀘스트에 GitHub Action을 붙이는 일은 그다음입니다. 로컬에서 실패하는 파일을 CI에 올리지 마십시오. CI는 같은 시험을 반복하는 자리입니다. 첫 시험은 로컬입니다.

한 줄로 줄이면 이렇습니다. 좋아하는 답을 세 번 본 것은 시험이 아닙니다. Promptfoo 설정 파일에 입력과 어서션을 적고, 실패하는 줄을 고친 뒤에 링크를 올립니다. 배포가 제출입니다. 올린 링크가 제출입니다. 그 링크의 문장이 파일과 같아야 합니다.

원문: Start with PromptFoo in under 10 min. — Jason · Promptfoo Getting started · Assertions and Metrics · GitHub Action · promptfoo/promptfoo · OpenAI to acquire Promptfoo, 2026년 3월 9일