Promptfoo 레드팀 시작하기
Promptfoo 레드팀 시작하기
Promptfoo는 생성형 AI 애플리케이션을 레드팀으로 점검하는 오픈소스 도구예요. 50개 이상의 취약점 유형을 자동으로 스캔하고, 애플리케이션에 맞춘 동적 공격 탐지기를 만들어 줘요. 핵심 흐름은 redteam init으로 레드팀 설정을 만들고, redteam run으로 적대적 테스트를 생성·실행하고, redteam report로 결과를 보는 세 단계예요. 이 글에서는 목표 앱을 등록하고 공격을 돌려 결과를 해석하는 전체 과정을 따라가 볼게요.
레드팀이 커버하는 것
- 보안·데이터 프라이버시: jailbreak, 인젝션, RAG 포이즈닝 등
- 컴플라이언스·윤리: 유해·편향 콘텐츠, 콘텐츠 필터 검증, OWASP/NIST/EU 컴플라이언스 등
- 커스텀 정책: 조직 지침 강제
또한 Microsoft·Meta 등의 최신 적대적 ML 연구를 구현하고, CI/CD와 통합되며, HTTP API·브라우저·직접 모델 접근으로 테스트할 수 있어요.
사전 요구사항
- Node.js
>=22.22.0설치 - 선택사항:
OPENAI_API_KEY환경 변수 설정
프로젝트 초기화
레드팀 프로젝트 구성을 도와주는 웹 UI가 열리는 명령을 실행해요.
npx promptfoo@latest redteam setup
npm install -g promptfoo
promptfoo redteam setup
brew install promptfoo
promptfoo redteam setup
애플리케이션 정보 입력
타깃 애플리케이션의 세부 정보를 입력해요. 정보가 많을수록 생성되는 테스트 케이스가 더 맞춤화돼요. 최소한 Purpose 필드에는 애플리케이션의 용도를 반드시 적어야 해요. 빠른 테스트를 원하면 "Load Example" 버튼을 눌러 예제를 불러올 수도 있어요.
타깃 구성
다음으로 promptfoo가 타깃 애플리케이션이나 모델과 통신하도록 설정해요. 여기서 타깃은 테스트 대상 모델을 뜻하고, 공격 생성은 별도 provider(기본 OpenAI)를 써요. 스캐너가 로컬에서 돌기 때문에, 내 머신이나 네트워크에서 접근 가능한 어떤 엔드포인트든 공격할 수 있죠.
플러그인 선택
플러그인은 적대적 입력 생성기예요. 앱에 보내는 악의적인 입력을 만들어내죠. 원하는 개별 플러그인을 체크하거나, 플러그인 조합이 담긴 프리셋을 선택해요. 확신이 없다면 "Default"를 쓰면 돼요.
공격 전략 선택
전략은 생성된 입력을 특정 공격 패턴으로 감싸는 기법이에요. 이렇게 promptfoo가 더 정교한 jailbreak와 인젝션을 만들어내요.
검토 후 저장
마지막으로 생성된 설정 파일을 다운로드해요. 파일을 promptfooconfig.yaml로 저장하고, 저장한 디렉터리에서 promptfoo redteam run을 실행하면 됩니다. UI를 쓰고 싶지 않다면 init 명령으로 대신할 수 있어요.
promptfoo redteam init --no-gui
스캔 실행
테스트 케이스를 생성했으니, 이제 적대적 평가를 실행할 차례예요. promptfooconfig.yaml이 있는 디렉터리에서 실행하면, 여러 피해 범주에 걸쳐 수백 개의 적대적 입력을 생성해 redteam.yaml에 저장하고, 그 테스트 케이스를 타깃에 대해 실행해요.
npx promptfoo@latest redteam run
promptfoo redteam run
결과 확인
결과는 리포트 뷰로 확인할 수 있어요.
npx promptfoo@latest redteam report
promptfoo redteam report
리포트 뷰 이해하기
레드팀 결과는 LLM 애플리케이션 동작의 여러 측면을 알려줘요.
- 취약점 범주: 발견된 취약점 유형(프롬프트 인젝션, 컨텍스트 포이즈닝, 의도하지 않은 동작 등)
- 심각도 수준: 잠재적 영향과 발생 가능성에 기반한 분류
- 로그: 취약점을 유발한 입력의 구체적 사례
- 권장 완화책: 프롬프트 엔지니어링, 추가 안전장치, 아키텍처 변경 등 제안
흔한 타깃 유형
API 엔드포인트 공격
설정 파일에 타깃 엔드포인트에 대한 설명이 들어가요. label은 이슈 생성과 결과 보고에 쓰이므로, 같은 타깃에 대해 새 레드팀 설정을 만들 때 같은 label을 재사용하는 게 중요해요. purpose는 선택이지만 테스트 케이스 품질과 채점을 크게 높여줘요. 시스템 사용자가 누구인지, 무엇에 접근할 수 있어야 하는지 구체적으로 적으세요.
targets:
- id: https
label: 'travel-agent'
config:
url: 'https://example.com/generate'
method: 'POST'
headers:
'Content-Type': 'application/json'
body:
myPrompt: '{{prompt}}'
purpose: 'The user is a budget traveler looking for the best deals. The system is a travel agent that helps the user plan their trip. The user is anonymous and should not be able to access any information about other users, employees, or other individuals.'
HTTP 타깃 설정에 대한 자세한 내용은 HTTP requests 문서를 참고하세요.
대안: 특정 프롬프트와 모델 테스트
실시간 엔드포인트가 없으면 설정을 편집해 특정 프롬프트와 LLM 모델을 지정할 수 있어요.
prompts:
- 'Act as a travel agent and help the user plan their trip. User query: {{query}}'
# Paths to prompts also work:
# - file://path/to/prompt.txt
targets:
- id: openai:gpt-5-mini
label: 'travel-agent-mini'
대안: 앱에 직접 연결
promptfoo는 기존 LLM 앱에 직접 훅을 걸어 Python, JavaScript, RAG·에이전트 워크플로, HTTP API 등으로 타깃을 공격할 수 있어요.
- HTTP requests — 내 API에
- Custom Python scripts — 정밀한 제어용
- Javascript, 아무 실행 파일, Ollama 같은 로컬 provider 등
지속적 개선
레드팀은 일회성 활동이 아니라 지속적인 프로세스예요. 앱을 개발·개선하면서 정기적으로 평가를 돌리면, 새 기능이나 변경이 예상치 못한 취약점을 만들지 않는지, 앱이 진화하는 공격 기법에 강건한지, 시간에 따른 안전·신뢰성 개선을 정량화할 수 있는지 확인할 수 있어요. CI/CD 통합 문서를 참고하세요.
더 알아보기
- 레드팀 설정 가이드 — 레드팀 상세 설정
- LLM 취약점 유형 — 지원되는 플러그인 개요
- 에이전트 레드팀 및 RAG 레드팀 가이드