LLM Guard - LLM 보안 도구 키트 치트시트
LLM Guard (Protect AI 작성)는 LLM 애플리케이션을 위한 오픈소스 보안 도구 키트다. 입력 스캐너 (사용자의 프롬프트가 모델에 도달하기 전에 적용) 및 출력 스캐너 (모델의 응답이 사용자에 도달하기 전에 적용)의 라이브러리를 제공하여 프롬프트 주입, 탈옥, 독성, PII 누출, 비밀, 금지된 주제 등을 감지하고 완화한다. 스캐너는 콘텐츠를 살균하고, 위험을 점수화하며, 불안전한 요청을 차단할 수 있으므로 프로덕션 LLM 앱을 위한 실용적인 가드레일 계층이 된다.
설치
| 방법 | 명령어 |
|---|
| pip | pip install llm-guard |
| ONNX (더 빠름) 포함 | pip install "llm-guard[onnxruntime]" |
| API 서버 (Docker) | 공식 llm-guard-api 이미지 실행 |
| 첫 실행 | 스캐너 모델 다운로드 (transformers) |
| 확인 | python -c "import llm_guard; print('ok')" |
두 가지 스캔 단계
| 단계 | 적용 대상 | 목적 |
|---|
| Input 스캐너 | 사용자 프롬프트 | 악의적/불안전한 입력이 모델에 도달하는 것 중지 |
| Output 스캐너 | 모델 응답 | 불안전/누출 출력이 사용자에 도달하는 것 중지 |
입력 스캔
from llm_guard import scan_prompt
from llm_guard.input_scanners import PromptInjection, Toxicity, Secrets
scanners = [PromptInjection(), Toxicity(), Secrets()]
sanitized, results, risk = scan_prompt(scanners, user_prompt)
if any(not ok for ok in results.values()):
raise ValueError("Unsafe prompt blocked")
| 반환 | 의미 |
|---|
sanitized | (가능하게 수정된) 프롬프트 |
results | 스캐너별 통과/실패 |
risk | 스캐너별 위험 점수 (0–1) |
입력 스캐너
| 스캐너 | 감지 |
|---|
PromptInjection | 주입/탈옥 시도 |
Toxicity | 독성/모욕적 언어 |
Secrets | API 키, 프롬프트의 토큰 |
Anonymize | PII (나중에 익명화 해제하는 기능 포함 수정) |
BanTopics | 금지된 주제 |
BanSubstrings / BanCompetitors | 금지 목록 |
Code | 코드 / 특정 언어의 존재 |
TokenLimit | 과도하게 큰 프롬프트 |
Language | 예상치 못한 언어 |
출력 스캔
from llm_guard import scan_output
from llm_guard.output_scanners import NoRefusal, Sensitive, Relevance
scanners = [NoRefusal(), Sensitive(), Relevance()]
sanitized_resp, results, risk = scan_output(scanners, prompt, model_response)
출력 스캐너
| 스캐너 | 확인 |
|---|
Sensitive | 응답에서 누출되는 PII/비밀 |
NoRefusal | 거부 감지 (품질/가드레일 신호) |
Relevance | 응답이 실제로 프롬프트에 답변 |
Toxicity | 독성 출력 |
Bias | 편향된 콘텐츠 |
MaliciousURLs | 출력의 위험한 링크 |
Deanonymize | 신뢰할 수 있는 표시를 위해 수정된 PII 복원 |
FactualConsistency | 응답이 컨텍스트와 일치 |
PII 익명화 / 익명화 해제 흐름
from llm_guard.input_scanners import Anonymize
from llm_guard.output_scanners import Deanonymize
from llm_guard.vault import Vault
vault = Vault()
safe_prompt, _, _ = scan_prompt([Anonymize(vault)], user_prompt)
# ... safe_prompt로 모델 호출 ...
final, _, _ = scan_output([Deanonymize(vault)], safe_prompt, model_response)
Vault는 최종 답변에서 수정된 엔티티를 복원할 수 있도록 매핑을 저장한다.
배포
| 옵션 | 참고 |
|---|
| 프로세스 내 라이브러리 | scan_prompt/scan_output 임포트 및 호출 |
| API 서버 | 언어 불가지론적 게이트웨이용 llm-guard-api |
| ONNX 런타임 | 스캐너 모델의 더 빠른 CPU 추론 |
| 설정 | 스캐너별 빠른 실패, 임계값, 매치 전략 |
일반적인 워크플로우
# 모든 LLM 호출 주위 가드레일 래퍼
def guarded_chat(user_input):
prompt, r_in, _ = scan_prompt(input_scanners, user_input)
if not all(r_in.values()):
return "Request blocked by safety policy."
resp = call_llm(prompt)
out, r_out, _ = scan_output(output_scanners, prompt, resp)
return out if all(r_out.values()) else "Response withheld by safety policy."
LLM Guard vs 관련 도구
| 측면 | LLM Guard | NeMo Guardrails | Garak |
|---|
| 역할 | 입력/출력 스캐너 (런타임) | 프로그래밍 가능한 대화 레일 | LLM 취약점 스캐너 (테스팅) |
| 포커스 | 주입, PII, 독성, 비밀 | 대화 흐름 제어 | 레드 팀/프로빙 |
| 시기 | 요청 경로에 | 요청 경로에 | 배포 전 테스팅 |
| 최고 | 드롭인 가드레일 | 복잡한 규칙 기반 흐름 | 약점 찾기 |
자료