개념
QA 가 하는 적대적 테스트는 어디까지인가
모듈 18b 레슨 11이 적대적 예제의 개념을 다뤘다 — 사람 눈에 차이가 없는데 모델이 완전히 다르게 판단하는 입력. 여기서 한 단계 들어가면 바로 현실적인 질문이 나온다. QA가 새 공격 알고리즘을 만들어야 하는가.
아니다. 선을 분명히 긋는 것이 이 레슨의 출발점이다.
| 연구자의 일 | QA의 일 |
|---|---|
| 새 공격 알고리즘 설계, 최적 교란 탐색 | 알려진 변형에 대한 성능 저하 곡선 측정 |
| 공격 성공률 최대화 | 허용 강도 정의와 합격 기준 판정 |
| 방어 기법 제안·증명 | 방어가 켜져 있는지, 계층별로 작동하는지 확인 |
| 논문 재현 | 발견한 실패 입력을 회귀 세트로 승격 |
핵심은 견고성 시험(robustness testing) 이다. 모델이 깨지는지가 아니라 어느 강도에서 어떻게 깨지는지 를 재서 제품 판정에 쓸 수 있는 숫자로 만드는 것이다. 모듈 50의 보안 테스트가 취한 입장과 같다 — 공격 도구 운용이 아니라 "무엇을 검증하고 실제 위험인지 어떻게 판정하는가".
견고성 시험 — 강도 축을 세운다
변형을 "했다/안 했다"로 두면 결과가 숫자가 되지 않는다. 강도 축 을 만들어 축 위에서 성능을 재야 곡선이 나온다.
| 계층 | 변형 예 | 강도 축 |
|---|---|---|
| 자연 변형 | 센서 노이즈, JPEG 압축, 저조도, 회전, 오탈자, 동의어 치환 | 노이즈 표준편차, 압축 품질, 각도, 오탈자율 |
| 형식 교란 | 여백·구두점 추가, 대소문자 혼용, 유니코드 동형 문자 | 삽입 문자 수, 치환 비율 |
| 도메인 교란 | 프린트-재촬영 문서, 화면 캡처 재입력, 부분 가림, 배경 치환 | 가림 면적 비율, 재캡처 세대 |
| 분포 외 입력 | 학습에 없던 언어·양식·단위, 극단값 | 학습 분포와의 거리 |
보고 형식은 단일 숫자가 아니라 곡선과 허용 강도 한 줄이다.
오탈자율 0% 2% 5% 10% 20%
정확도 0.94 0.93 0.91 0.84 0.61
허용 강도 선언: 오탈자율 5% 까지 정확도 `≥ 0.90` 을 유지한다
위험 구간 : 오탈자율 10% 를 넘으면 사람 검토로 전환이 두 줄이 요구사항이 되고, 요구사항이 되는 순간 회귀 대상 이 된다. 레슨 2의 챔피언-챌린저 비교에 이 곡선을 넣으면 "정확도는 올랐는데 견고성이 내려간" 교체를 잡을 수 있다 — 평균 정확도만 보는 비교가 놓치는 전형적인 퇴행이다.
분포 외 입력은 따로 다룬다. 여기서 볼 것은 정답률이 아니라 모델이 모른다고 말하는가 다. 학습에 없던 양식에 신뢰도 0.98로 틀린 답을 하는 모델과 신뢰도 0.4로 사람 검토로 넘기는 모델은 같은 정확도여도 제품으로서 전혀 다르다.
메타모픽 테스팅 — 관계로 판정하기
모듈 58 레슨 1이 MR의 개념을 다뤘다. 여기서는 AI 시스템용 MR을 유형으로 분류하고 허용 오차를 붙여 자동 판정까지 올리는 작업을 한다 — 개념을 아는 것과 스위트를 운영하는 것 사이의 거리가 멀다. MR은 여섯 유형으로 갈라 두면 빠짐없이 만들 수 있다.
| 유형 | 관계 형태 | 예시 |
|---|---|---|
| 불변 | 의미를 바꾸지 않는 변형 → 출력 동일 | 이미지 좌우 반전 → 같은 클래스 / 공백 추가 → 같은 검색 결과 |
| 단조 | 한 방향 변화 → 출력도 한 방향 | 소득만 올림 → 신용 점수는 내려가지 않음 / 조건 추가 → 결과 수 감소 또는 동일 |
| 동치 | 다른 표현, 같은 의미 → 출력 동일 | "서울→부산" 과 "부산행 서울 출발" → 같은 노선 / 단위 변환 후 동일 금액 |
| 대칭 | 입력을 맞바꿈 → 출력도 대응해 바뀜 | 번역 A→B 후 B→A 했을 때 의미 보존 / 두 사용자 유사도는 순서 무관 |
| 합성 | 부분의 합과 전체 | 전체 기간 집계 = 월별 집계의 합 / 배치 추론 결과 = 단건 추론 결과 |
| 일관성 | 같은 입력, 같은 출력 | 동일 입력 재실행 시 출력 동일(또는 허용 분산 안) |
마지막 유형이 LLM 애플리케이션에서 가장 자주 위반된다. 모듈 18b 레슨 5가 다룬 반복 실행 검증과 같은 지점이다 — 다만 여기서는 "통과율"이 아니라 출력의 일관성 자체 를 관계로 선언하고 허용 분산을 숫자로 적는다.
실제 MR 예시를 도메인별로 몇 개 적어 둔다. 그대로 쓸 수 있는 것들이다.
문서 OCR·분류
MR-1 문서를 3도 회전 → 추출 필드 값 동일
MR-2 해상도를 절반으로 → 필드 추출 성공률이 임계값 이상 유지
추천·검색
MR-3 필터 조건 하나 추가 → 결과 수 감소 또는 동일, 남은 항목은 조건 충족
MR-4 동의어로 질의 치환 → 상위 10개의 중복도가 임계값 이상
점수·요금 산정
MR-5 연체 횟수만 증가 → 승인 확률 비증가
MR-6 통화 단위 변환 후 재계산 → 환산 금액 일치(허용 오차 1원)
LLM 요약·응답
MR-7 입력 문서에 무관한 문단 추가 → 요약의 핵심 주장 불변
MR-8 질문의 어순만 변경 → 답의 사실 항목 집합 동일
MR-9 동일 입력 3회 실행 → 사실 항목 집합 동일(표현은 달라도 됨)허용 오차 없는 MR 은 자동화되지 않는다
MR을 자동 판정으로 올리려면 같다 를 코드로 쓸 수 있어야 한다. 출력이 숫자면 쉽고, 문장이면 어렵다. 그래서 MR마다 판정 방식을 같이 적는다.
완전 일치 분류 라벨, 추출 필드 값
수치 허용 오차 금액·점수 — 절대 오차 또는 상대 오차 임계
집합 비교 사실 항목 집합의 교집합·대칭차 (표현 차이를 흡수)
순위 중복도 상위 k 교집합 비율 — 추천·검색에 적합
판정자 LLM 판정자로 의미 동등성 판정 (모듈 38 레슨 3 으로 보정 후)마지막 줄에 조건이 붙어 있는 것이 중요하다. 보정되지 않은 판정자로 MR 위반을 판정하면 판정자의 흔들림이 모델의 결함으로 보고된다.
MR 위반을 봤을 때 — 셋 중 하나다
위반이 곧 결함이 아니다. 이 삼분 진단을 건너뛰면 스위트가 2주 만에 신뢰를 잃는다.
1 모델 결함 관계는 타당한데 출력이 어긋났다 → 결함 등록
2 MR 자체가 틀렸다 도메인상 그 관계가 성립하지 않는다 → MR 수정·폐기
3 판정 문제 허용 오차가 너무 타이트하거나 비결정성 → 오차·반복 횟수 조정2번이 생각보다 자주 나온다. "소득이 오르면 점수는 내려가지 않는다"는 단조 관계는 소득 구간별 리스크가 비단조인 상품에서 성립하지 않을 수 있다. 그래서 MR 카탈로그에는 마지막 검토일과 근거(도메인 담당자 확인) 를 같이 적어 둔다.
MR 카탈로그 항목
id / 관계 서술 / 입력 변형 생성 규칙 / 판정 방식·허용 오차
적용 범위(모델·버전) / 근거 확인자 / 마지막 검토일 / 위반 이력프롬프트 주입 — 공격 목록이 아니라 경계 목록으로
여기서 관점을 못 박아 둔다. 이 절은 우리 시스템이 경계를 지키는지 확인하는 케이스 설계다. 특정 서비스를 뚫는 문자열 모음이나 우회 기법 카탈로그를 만드는 작업이 아니고, 그런 목록은 만들어도 모델이 바뀌면 바로 낡는다. 오래 쓸 수 있는 것은 경계의 목록 이다.
LLM 애플리케이션에는 네 개의 경계가 있다.
| 경계 | 지켜져야 하는 것 | 깨졌을 때의 증상 |
|---|---|---|
| 지시 경계 | 시스템 지시가 사용자·문서 내용보다 우선한다 | 운영자 정책이 대화 중에 바뀐다 |
| 데이터 경계 | 검색된 문서·툴 응답의 텍스트는 데이터 이고 지시로 승격되지 않는다 | 문서에 적힌 문장이 시스템 동작을 바꾼다 |
| 권한 경계 | 도구 호출이 현재 사용자의 권한 범위를 넘지 않는다 | 다른 사용자·다른 테넌트의 자원에 접근한다 |
| 출력 경계 | 시스템 프롬프트·비밀·타 사용자 데이터가 출력에 나오지 않는다 | 내부 설정이나 타인 정보가 응답에 섞인다 |
두 번째 경계가 실무에서 가장 중요하다. RAG·에이전트 시스템에서 모델이 읽는 텍스트는 사용자가 쓴 것만이 아니다 — 업로드 문서, 검색된 웹 페이지, 연동 시스템 응답이 모두 들어오고 이 경로들은 사용자 입력 필터를 통과하지 않는다. 그래서 케이스 설계의 첫 칸이 전달 경로다.
케이스 템플릿
경계 id 지시 / 데이터 / 권한 / 출력
전달 경로 사용자 입력 · 업로드 문서 · 검색 결과 · 툴 응답 · 과거 대화
기대 동작 무엇을 하지 않아야 하는가 (행동으로 서술)
판정 증거 무엇을 보고 지켜졌다고 판정하는가
심각도 깨졌을 때의 영향기대 결과를 "거부한다" 로 쓰면 판정이 흔들린다
이 레슨에서 가장 실무적인 부분이다. "모델이 거부해야 한다"는 기대 결과는 판정이 사람마다 갈린다. 표현이 공손하게 돌려 말하면 통과인가 실패인가. 관측 가능한 증거 로 바꿔 적는다.
| 약한 기대 결과 | 관측 가능한 판정 증거 |
|---|---|
| "요청을 거부한다" | 도구 호출 로그에 해당 호출이 없다 |
| "비밀을 말하지 않는다" | 응답 텍스트에 카나리 문자열이 포함되지 않는다 |
| "정책을 유지한다" | 응답이 정책 분류기에서 '정상' 으로 분류된다 |
| "차단된다" | 감사 로그에 차단 이벤트가 1건 기록된다 |
카나리 문자열 이 특히 쓸모가 많다. 시스템 프롬프트와 내부 설정에 테스트 전용 고유 문자열을 심어 두면, 출력 경계 위반을 문자열 검색 한 줄로 자동 판정할 수 있다. 사람이 읽고 "유출된 것 같다"를 판정할 필요가 없어진다.
방어는 계층이고, 계층은 하나씩 시험한다
OWASP가 LLM 애플리케이션 위험 목록의 첫 항목에 프롬프트 주입을 두고 권하는 대책은 단일 해법이 아니라 심층 방어다. 계층을 적어 두고 계층마다 단독 시험 을 한다.
계층 1 입력·문서 전처리 (출처 표시, 지시문 중립화, 길이·형식 제한)
계층 2 시스템 지시 설계 (역할·금지 사항·데이터와 지시의 구분)
계층 3 도구 권한 최소화 (호출 범위·대상 자원·건당 한도)
계층 4 출력 검사 (비밀 패턴, 정책 분류, 스키마 검증)
계층 5 사람 확인 (되돌릴 수 없는 작업은 승인 필수)계층 단독 시험 은 한 계층만 끄고 나머지가 잡는지 보는 것이다. 계층 2만 믿는 시스템은 모델을 교체하는 날 무방비가 된다. 가장 가치 있는 확인은 계층 3과 5 다 — 모델이 속아도 권한이 없으면 피해가 없고, 승인 단계가 있으면 사람이 멈춘다. QA가 지적해야 하는 1순위는 "되돌릴 수 없는 도구가 승인 없이 호출 가능한가"다.
두 숫자를 같이 본다 — 경계 유지율과 과차단율
경계 유지율만 올리면 제품이 망가진다. 모든 요청을 거부하면 유지율 100%다.
경계 유지율 경계 시험 케이스 중 지켜진 비율
과차단율 정상 업무 요청 중 잘못 거부된 비율둘을 같은 보고에 나란히 놓고, 방어를 조일 때마다 양쪽을 다시 잰다. 모듈 38 레슨 5의 배포 게이트에 올릴 때도 두 숫자를 함께 올린다. 한쪽만 올린 보고는 게이트 판정에 쓸 수 없다.
책임 있게 수행하기
이 시험은 자사 시스템을 대상으로 합의된 범위 안에서만 한다. 범위·기간·환경을 문서로 합의하고(모듈 50 레슨 5의 RoE 형식), 테스트 계정과 합성 데이터만 쓴다. 발견한 실패 케이스는 비공개 추적 항목으로 다루고, 재현 문자열은 접근 통제된 픽스처로 관리한다. 외부에 공유할 것은 경계 목록과 판정 기준 이지 재현 입력이 아니다.
실무에서 왜 필요한가
AI 기능의 사고 보고서를 모아 보면 패턴이 보인다. 정확도가 낮아서 생긴 사고보다 예상하지 않은 입력에서 자신 있게 틀려서 생긴 사고가 많다. 스캔 품질이 낮은 문서, 외국어가 섞인 입력, 업로드된 파일 안의 지시문 같은 것들이다. 강도 축·메타모픽 관계·경계 목록 셋이 그 구간을 겨냥한다.
조직 안에서 QA의 위치도 분명해진다. 데이터 과학자는 평균 성능을, 보안팀은 침해 경로를 본다. "정상 범위 밖에서 제품이 어떻게 행동하는가" 는 그 사이에 비어 있고, 요구사항으로 쓸 수 있는 형태(허용 강도, MR, 판정 증거)로 옮길 사람은 QA다. 그 산출물은 레슨 5의 고위험 시스템 의무 중 정확성·견고성 항목의 증거로 그대로 쓰인다.