DEV Community

Cover image for LLM 앱 테스트 방법: Promptfoo 완벽 가이드 (2026년)
Rihpig
Rihpig

Posted on • Originally published at apidog.com

LLM 앱 테스트 방법: Promptfoo 완벽 가이드 (2026년)

TL;DR

Promptfoo는 개발자가 AI 애플리케이션을 체계적으로 자동 테스트할 수 있게 해주는 오픈소스 LLM 평가 및 레드팀 프레임워크입니다. 90개 이상의 모델 제공업체와 67개 이상의 보안 공격 플러그인을 지원하며, 100% 로컬 실행으로 프라이버시를 보장합니다. npm 160만 다운로드, 1천만 명 이상 사용자 기업에서 프로덕션에 사용되고, LLM 테스트 표준으로 자리 잡았습니다.

설치:

npm install -g promptfoo
promptfoo init --example getting-started
Enter fullscreen mode Exit fullscreen mode

지금 Apidog를 사용해보세요

소개

몇 주간 AI 기반 고객 지원 챗봇을 개발하는 동안, 내부 테스트에서는 완벽하게 동작했지만 실제 사용자가 민감 정보 유출, 안전 가이드라인 우회, 일관성 문제를 유발하는 입력을 시도하기 시작했습니다.

이러한 문제는 흔하며, 많은 팀이 직감과 수동 테스트에 의존해 LLM 애플리케이션을 출시하다가 프로덕션에서 취약점과 품질 이슈를 발견하게 됩니다. 배포 이후 문제를 복구하는 비용은 개발 단계에서 미리 발견하는 것보다 훨씬 높게 듭니다.

Promptfoo는 LLM 애플리케이션에 자동화된 체계적 테스트를 도입합니다. 여러 모델에서 프롬프트를 평가하고, 보안 레드팀 공격을 실행하며, 사용자에게 도달하기 전 회귀를 잡아냅니다.

이 글에서는 promptfoo(버전 0.121.2)의 핵심 기능 분석, 평가 설정, 보안 검사, CI/CD 통합, 실전 팁을 제공합니다.

이 가이드로 LLM 애플리케이션을 위한 신뢰성 높은 테스트 스위트를 직접 구축할 수 있습니다.

💡 API 테스트나 LLM 평가와 함께 API 동작 검증이 필요하다면, Apidog는 API 설계, 테스트, 문서를 위한 통합 플랫폼입니다. LLM 평가는 promptfoo, API 계층 검증은 Apidog로 처리하세요.

Promptfoo는 무엇이며 왜 필요한가요?

Promptfoo는 LLM 애플리케이션 평가와 레드팀을 위한 CLI 도구이자 Node.js 라이브러리입니다. AI 개발을 위한 맞춤 테스트 프레임워크입니다.

Promptfoo 예시

LLM 테스트에서 기존 도구의 한계

LLM 출력은 비결정적이어서 기존 테스트 도구(정확한 문자열 일치 기반)는 실패합니다. Promptfoo는 다음과 같은 기능으로 이 문제를 해결합니다.

  • 의미론적 단언: 정확한 텍스트 대신 의미를 검증
  • LLM-평가: 한 모델이 다른 모델의 출력을 평가
  • 다중 모델 비교: 한 번에 여러 모델 평가
  • 보안 플러그인: 자동 취약점 공격

Promptfoo는 100% 로컬 실행을 지원해 민감 데이터 테스트에 적합합니다.

Promptfoo가 해결하는 문제

대부분 팀은 수동 테스트에 의존합니다. 이는 다음과 같은 문제를 유발합니다:

  1. 회귀 감지 불가 – 모델 업데이트 시 기존 기능 손상 여부 확인 불가
  2. 커버리지 부족 – 엣지 케이스, 적대적 입력 누락
  3. 메트릭 부재 – 개선/비교/모니터링 불가

Promptfoo는 자동화 테스트로 이를 대체, 합격률·비용·지연 시간 등 메트릭을 제공합니다.

Promptfoo 사용 사례

  • 고객 지원 챗봇(일관/정확한 응답)
  • 브랜드 보이스 콘텐츠 생성
  • 규제 준수가 필요한 헬스케어·핀테크
  • 보안 민감 시스템

2026년 3월 Promptfoo는 OpenAI에 인수, MIT 오픈소스 유지 중입니다.

시작하기: 첫 평가 설치 및 실행

설치

# 전역 설치(권장)
npm install -g promptfoo

# 설치 없이 실행
npx promptfoo@latest

# macOS: Homebrew
brew install promptfoo

# Python
pip install promptfoo
Enter fullscreen mode Exit fullscreen mode

API 키 환경 변수 설정:

export OPENAI_API_KEY=sk-abc123
export ANTHROPIC_API_KEY=sk-ant-xxx
Enter fullscreen mode Exit fullscreen mode

첫 평가 생성

promptfoo init --example getting-started
cd getting-started
Enter fullscreen mode Exit fullscreen mode

promptfooconfig.yaml에 샘플 프롬프트, 모델, 테스트 케이스가 생성됨.

promptfoo eval           # 평가 실행
promptfoo view           # 웹 UI(결과 시각화)
Enter fullscreen mode Exit fullscreen mode

UI는 localhost:3000에서 각 모델별 출력과 합격/불합격 상태를 나란히 보여줍니다.

구성 파일 구조

promptfooconfig.yaml 예시:

description: "My First Eval Suite"
prompts:
  - prompts/greeting.txt
  - prompts/farewell.txt
providers:
  - openai:gpt-4o
  - anthropic:claude-sonnet-4-5
tests:
  - vars:
      input: "Hello"
    assert:
      - type: contains
        value: "Hi"
      - type: latency
        threshold: 3000
Enter fullscreen mode Exit fullscreen mode
  • prompts: 테스트 프롬프트 파일/텍스트
  • providers: 평가 모델
  • tests: 변수 및 단언

테스트 스위트는 버전 관리에 두고, CI에서 자동 실행할 수 있습니다.

핵심 기능: Promptfoo가 할 수 있는 것

1. 자동화된 평가

테스트 케이스를 정의하면 선택한 모델에서 자동으로 실행합니다.

단언 유형

Promptfoo는 30+ 내장 단언을 제공:

단언 목적
contains 부분 문자열 포함
equals 정확한 문자열 일치
regex 정규식 일치
json-schema JSON 구조 유효성
javascript 사용자 JS 함수 (합격/불합격 반환)
python 사용자 Python 함수
llm-rubric LLM이 출력 등급 지정
similar 의미론적 유사성 점수
latency 응답 시간 임계값
cost 요청당 비용 임계값

복합 단언 예시:

tests:
  - vars:
      question: "프랑스의 수도는 어디인가요?"
    assert:
      - type: contains
        value: "파리"
      - type: javascript
        value: output.length < 100
      - type: latency
        threshold: 2000
      - type: cost
        threshold: 0.001
Enter fullscreen mode Exit fullscreen mode

LLM-평가 단언

llm-rubric 단언을 활용해 한 LLM이 다른 LLM 출력을 평가:

assert:
  - type: llm-rubric
    value: "응답은 도움이 되고, 무해하며, 정직해야 합니다."
Enter fullscreen mode Exit fullscreen mode

비용 최적화를 위해 평가자 LLM 모델을 저렴한 것으로 지정 가능.

2. 레드팀 및 보안 테스트

67+ 플러그인 기반의 레드팀 시스템으로 다양한 공격 벡터 자동 테스트.

레드팀 예시

카테고리 테스트 내용
프롬프트 주입 직접/간접/컨텍스트 주입
탈옥 DAN, 페르소나 전환, 역할극 우회
데이터 유출 SSRF, 시스템 프롬프트/프롬프트 유출
유해 콘텐츠 혐오 발언, 위험행위, 자해 요청
규정 준수 PII 유출, HIPAA/금융 데이터 노출
오디오/비주얼 오디오/이미지 주입 공격

레드팀 스캔 실행

promptfoo redteam init
promptfoo redteam run
promptfoo redteam report [directory]
Enter fullscreen mode Exit fullscreen mode

redteam run은 동적 공격 프로브 생성 → 자동 평가 → 심각도별 보고서 출력.

예시 출력:

취약점 요약:
- Critical: 2 (PII 유출, 프롬프트 추출)
- High: 5 (탈옥, 주입 공격)
- Medium: 12 (편향, 불안정 응답)
- Low: 23 (경미한 정책 위반)
Enter fullscreen mode Exit fullscreen mode

배포 전 반드시 주요 이슈 수정 후 재스캔 하세요.

3. 풀 리퀘스트 코드 스캔

GitHub Actions 통합으로 코드 변경(PR)에 LLM 취약점 자동 스캔:

# .github/workflows/promptfoo-scan.yml
name: Promptfoo 코드 스캔
on: [pull_request]
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: promptfoo/promptfoo/code-scan-action@main
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
Enter fullscreen mode Exit fullscreen mode
  • 하드코딩 API 키, 비안전 프롬프트, 입력 검증 누락, 주입 벡터 탐지

4. 모델 비교

여러 모델 출력을 나란히 비교해 최적 선택:

promptfoo eval           # 다중 모델 평가
promptfoo view           # UI에서 비교
Enter fullscreen mode Exit fullscreen mode

웹 UI에서 합격률, 비용, 지연 시간, 출력 차이 등 확인.

지원되는 제공업체: 90+ LLM 통합

Promptfoo는 90개 이상의 LLM 제공업체를 지원, 코드를 변경하지 않고 다양한 모델을 비교할 수 있습니다.

제공업체 모델 예시
OpenAI GPT-4, GPT-4o, GPT-4o-mini, o1, o3
Anthropic Claude 3.5/3.7/4.5/4.6, Thinking models
Google Gemini 1.5/2.0, Vertex AI
Microsoft Azure OpenAI, Phi
Amazon Bedrock (Claude, Llama, Titan)
Meta Llama 3/3.1/3.2 (여러 제공업체 경유)
Ollama 로컬 모델(Llama, Mistral, Phi)

사용자 정의 제공업체 작성

지원되지 않는 모델은 Python/JS로 provider 작성:

Python 예시

# custom_provider.py
from typing import Any

class CustomProvider:
    async def call_api(self, prompt: str, options: dict, context: dict) -> dict:
        response = await my_async_api.generate(prompt)
        return {
            "output": response.text,
            "tokenUsage": {
                "total": response.usage.total_tokens,
                "prompt": response.usage.prompt_tokens,
                "completion": response.usage.completion_tokens
            }
        }
Enter fullscreen mode Exit fullscreen mode

JavaScript 예시

// customProvider.js
export default class CustomProvider {
  async callApi(prompt) {
    return {
      output: await myApi.generate(prompt),
      tokenUsage: { total: 50, prompt: 20, completion: 30 }
    };
  }
}
Enter fullscreen mode Exit fullscreen mode

구성 등록:

providers:
  - id: file://custom_provider.py
    config:
      api_key: ${MY_API_KEY}
Enter fullscreen mode Exit fullscreen mode

명령줄 인터페이스: 필수 명령

핵심 명령

promptfoo eval -c promptfooconfig.yaml     # 평가 실행
promptfoo view                            # 웹 UI 실행
promptfoo share                           # 결과 공유
promptfoo redteam init                    # 레드팀 설정
promptfoo redteam run                     # 레드팀 실행
promptfoo init                            # 구성 초기화
promptfoo validate [config]               # 구성 검증
promptfoo list                            # 결과 목록
promptfoo show                            # 결과 보기
promptfoo delete                          # 결과 삭제
promptfoo export                          # 결과 내보내기
promptfoo cache clear                     # 캐시 삭제
promptfoo retry                           # 실패 재시도
Enter fullscreen mode Exit fullscreen mode

유용한 플래그

--no-cache           # 캐싱 비활성화
--max-concurrency N  # 병렬 API 호출 제한
--output file.json   # 결과를 JSON 파일로 저장
--verbose            # 디버그 로깅
--env-file .env      # 환경 변수 파일 사용
--filter ...         # 특정 테스트만 실행
Enter fullscreen mode Exit fullscreen mode

예시: 커스텀 설정 평가 실행

promptfoo eval \
  -c promptfooconfig.yaml \
  --no-cache \
  --max-concurrency 3 \
  --output results.json \
  --env-file .env
Enter fullscreen mode Exit fullscreen mode

CI/CD 통합: LLM 테스트 자동화

GitHub Actions 예시

name: LLM 테스트
on: [push, pull_request]
jobs:
  eval:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
      - run: npm install -g promptfoo
      - run: promptfoo eval -c promptfooconfig.yaml
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Enter fullscreen mode Exit fullscreen mode

품질 게이트

구성에서 합격률 임계값 지정:

commandLineOptions:
  threshold: 0.8   # 80% 이상 합격률 요구
Enter fullscreen mode Exit fullscreen mode

임계값 미달 시 CI 실패.

CI에서 캐싱 활용

- uses: actions/cache@v4
  with:
    path: ~/.cache/promptfoo
    key: ${{ runner.os }}-promptfoo-${{ hashFiles('promptfooconfig.yaml') }}
Enter fullscreen mode Exit fullscreen mode

캐시로 API 호출 비용/시간 절감.

웹 UI: 결과 시각화 및 공유

promptfoo view로 실행:

  • 평가 매트릭스: 모델별 출력 비교
  • 필터링: 상태/모델별로 조회
  • 차이 보기: 실행 간 변경점 추적
  • 공유: 팀 리뷰용 공유 링크 생성
  • 실시간 업데이트: 평가 실시간 반영

기본 localhost:3000에서 동작, CSRF 보호 내장. 외부 노출 금지, 자체 호스팅은 인증 필수.

데이터베이스 및 캐싱

캐시 위치

  • macOS/Linux: ~/.cache/promptfoo
  • Windows: %LOCALAPPDATA%\promptfoo

반복 실행 속도 향상. 새로운 결과 필요시 --no-cache 사용.

데이터베이스 위치

  • 모든 플랫폼: ~/.promptfoo/promptfoo.db (SQLite)

과거 평가 기록 저장. 삭제 시 과거 데이터 손실.

보안 모델: 무엇을 신뢰할 수 있는가

Promptfoo는 구성 기반 신뢰 모델로 동작.

신뢰할 수 있는 입력(코드 실행)

  • 구성 파일(promptfooconfig.yaml)
  • 사용자 JS/Python/Ruby 단언
  • provider 구성
  • 변환 함수

신뢰할 수 없는 입력(데이터)

  • 프롬프트 텍스트
  • 테스트 변수
  • 모델 출력
  • 원격 데이터

보안 강화 팁

  1. 최소 권한 컨테이너/VM 실행
  2. 전용 API 키 사용
  3. 프롬프트/구성에 비밀 정보 금지
  4. 네트워크 이그레스 제한
  5. 웹 서버 외부 노출 금지

성능: 평가 최적화

최적화 팁

  1. 캐싱: 반복 실행 속도 ↑
  2. 동시성: --max-concurrency로 API 제한 조정
  3. 테스트 필터링: --filter로 부분 실행
  4. 데이터셋 샘플링: 대규모 실행 전 소규모 반복

대규모 확장

  • 분산 실행: src/scheduler/
  • 원격 생성 활용
  • Google 스프레드시트 등 결과 내보내기

확장성: 사용자 정의 기능 구축

사용자 정의 단언

도메인별 검증 로직 추가 가능.

// assertions/customCheck.js
export default function customCheck(output, context) {
  const pass = output.includes('expected');
  return {
    pass,
    score: pass ? 1 : 0,
    reason: pass ? 'Output matched' : 'Missing expected content'
  };
}
Enter fullscreen mode Exit fullscreen mode

구성에서 사용:

assert:
  - type: file://assertions/customCheck.js
Enter fullscreen mode Exit fullscreen mode

MCP 서버

Claude Code 등 AI 비서와 통합을 위한 Model Context Protocol(MCP) 서버 내장:

promptfoo mcp
Enter fullscreen mode Exit fullscreen mode

AI 에이전트가 직접 평가 실행, 레드팀 액세스, 결과 쿼리, 테스트 생성 가능.

실제 사용 사례

고객 지원 챗봇

  • 500개 FAQ 테스트 케이스, GPT-4·Claude 비교
  • PII 유출/탈옥 레드팀 스캔
  • CI 연동(실패 시 배포 차단)
  • 도입 후 고객 이슈 90% 감소

콘텐츠 생성 파이프라인

  • LLM 평가로 어조·스타일 검증
  • 지연/비용 임계값 적용
  • 모델 비교로 최적 제공업체 선택
  • 브랜드 일관성 유지, API 비용 40% 절감

헬스케어 애플리케이션

  • HIPAA 위반 레드팀 스캔
  • 사용자 정의 단언으로 의학적 정확성 검증
  • 모든 평가 로컬 실행, 감사 추적 보관
  • SOC 2 감사 통과

결론

Promptfoo는 LLM 애플리케이션의 테스트 자동화를 표준화합니다.

수동/비체계적 QA에서 자동 회귀·보안·품질 평가로 전환해, 출시 전 문제를 사전에 탐지하세요.

실행 요약

  • npm install -g promptfoo 설치, promptfoo init으로 시작
  • 의미론적·맞춤 단언으로 정밀 검증
  • 레드팀 스캔으로 보안 취약점 탐지
  • CI/CD에 통합해 회귀 방지
  • 여러 모델 평가로 성능·비용 최적화
  • 사용자 정의 provider/단언으로 확장

데이터 기반 AI 개발의 미래, promptfoo와 함께 시작하세요!

API 관련 작업도 있다면 promptfoo와 Apidog를 함께 활용하세요. Apidog는 API 설계/테스트/문서, promptfoo는 LLM 평가에 특화되어 전체 테스트 스택을 완성합니다.

FAQ

promptfoo는 무엇에 사용되나요?

LLM 애플리케이션 테스트 및 평가. 프롬프트 자동 테스트, 다중 모델 결과 비교, 보안 레드팀 평가에 사용합니다.

promptfoo는 무료인가요?

예, 오픈소스(MIT)로 개인/상업 모두 무료. 일부 클라우드/엔터프라이즈 기능은 유료일 수 있습니다.

promptfoo는 어떻게 설치하나요?

npm install -g promptfoo
Enter fullscreen mode Exit fullscreen mode

설치 없이 npx promptfoo@latest, macOS는 brew install promptfoo, Python은 pip install promptfoo 지원.

어떤 모델을 지원하나요?

OpenAI(GPT-4/4o/o1), Anthropic(Claude 3.5/4/4.5), Google(Gemini), Microsoft(Azure OpenAI), Amazon Bedrock, Ollama 등 90+ LLM 제공업체 지원.

레드팀 스캔은 어떻게 실행하나요?

promptfoo redteam init    # 구성 생성
promptfoo redteam run     # 스캔 실행
promptfoo redteam report  # 결과 확인
Enter fullscreen mode Exit fullscreen mode

CI/CD에서 promptfoo를 쓸 수 있나요?

예. CI에 설치 후 구성 파일로 promptfoo eval 실행, threshold로 품질 게이트 적용 가능.

내 데이터가 외부로 전송되나요?

아니요, 기본은 100% 로컬 실행. 클라우드 기능 미사용 시 데이터는 로컬에만 저장됩니다.

모델 비교는 어떻게 하나요?

구성에 여러 provider 추가 후 promptfoo eval 실행, promptfoo view로 웹 UI에서 합격률/비용/지연 시간 등 비교.


지금 promptfoo로 LLM 테스트 자동화와 품질 확보를 시작하세요!

Top comments (0)