대규모 언어 모델(LLM)은 자연어 요청에 유연하게 답하지만, 그 유연성 자체가 운영 위험이 되기도 한다. 사용자가 금지된 주제를 물을 수 있고, 검색 문서에 프롬프트 인젝션이 섞일 수 있으며, 모델이 허용되지 않은 도구를 호출하거나 응답에 민감 정보를 포함할 수도 있다.
NVIDIA NeMo Guardrails는 이런 문제를 모델 하나의 성격에 맡기지 않고 애플리케이션과 LLM 사이에 프로그래밍 가능한 제어 흐름을 두는 오픈소스 툴킷이다. 단순한 욕설 필터가 아니라 입력, 대화, 검색 결과, 도구 실행과 최종 출력에 서로 다른 정책을 적용하고 그 순서를 조정한다.
이 글에서는 NeMo Guardrails가 무엇인지, 다섯 종류의 Rail이 어떻게 동작하는지, 왜 일반적인 시스템 프롬프트만으로 충분하지 않은지, 그리고 어느 책임까지 맡겨야 하는지를 집중적으로 살펴본다. 공식 저장소의 최신 개발 브랜치는 빠르게 바뀔 수 있으므로 실제 도입 시에는 릴리스 버전과 문서를 함께 확인해야 한다.

한 문장으로 이해하는 NeMo Guardrails
NeMo Guardrails는 LLM 앞뒤에 여러 보안 검사를 덧붙이는 라이브러리이면서, 어떤 검사를 어느 시점에 실행할지 결정하는 LLM 처리 파이프라인 런타임이다.
애플리케이션이 모델을 직접 호출하는 대신 LLMRails.generate() 또는 Guardrails Server를 호출한다. NeMo Runtime은 설정과 Colang 흐름에 따라 입력을 검사하고, 필요한 검색과 동작을 수행하고, LLM을 호출한 뒤 출력까지 다시 검사한다.
Application
→ NeMo Guardrails Runtime
→ Input Rail
→ Dialog Rail
→ Retrieval Rail
→ Execution Rail
→ LLM
→ Output Rail
→ Application
여기서 중요한 점은 Rail이 특정 모델을 뜻하지 않는다는 것이다. Rail은 “이 단계에서 실행할 정책과 흐름”이며, 내부에서는 규칙, 별도의 안전 모델, 외부 API, Python Custom Action 또는 다른 LLM을 조합할 수 있다.
왜 시스템 프롬프트만으로는 부족한가
시스템 프롬프트에 “개인정보를 출력하지 마라”, “관리자 기능을 실행하지 마라”고 적는 것은 필요하지만 강제력 있는 접근통제는 아니다. 모델은 확률적으로 문장을 생성하고, 긴 대화나 상충하는 지시, 검색 문서 안의 공격 문구에 영향을 받을 수 있다.
NeMo Guardrails를 사용하는 이유는 정책을 프롬프트 한 문장에 숨기지 않고 실행 가능한 단계로 분리하기 위해서다.
- 요청을 LLM에 보내기 전에 명백한 공격과 금지 주제를 차단한다.
- RAG가 반환한 원문 청크를 프롬프트에 넣기 전에 검사한다.
- 대화 상태에 따라 허용된 다음 동작만 선택한다.
- 도구 호출 전후의 인수와 결과를 검증한다.
- 모델 응답이 사용자에게 전달되기 전에 민감 정보와 정책 위반을 검사한다.
이 구조는 완벽한 방어를 보장하지 않는다. 대신 실패 지점을 분리하고 정책 실행 기록을 남기기 쉬워진다.
다섯 종류의 Rail
NVIDIA 공식 저장소는 Input, Dialog, Retrieval, Execution, Output의 다섯 Rail을 설명한다.
| Rail | 적용 시점 | 대표 역할 | 차단 시 결과 |
| Input Rail | 사용자 입력 직후 | 탈옥·프롬프트 인젝션·민감 정보 검사 | LLM 호출 전 종료 또는 입력 변환 |
| Dialog Rail | 대화 흐름 결정 시 | 의도·상태·표준 절차에 따른 다음 동작 결정 | 사전 정의 응답 또는 허용 흐름 선택 |
| Retrieval Rail | RAG 검색 후 | 검색 청크의 오염·민감 정보·관련성 검사 | 위험 청크 제거 또는 마스킹 |
| Execution Rail | Tool·Custom Action 전후 | 인수와 실행 결과 검증 | 도구 호출 거부 또는 결과 정제 |
| Output Rail | LLM 생성 후 | 유해 콘텐츠·정보 노출·사실성 검사 | 응답 차단, 수정 또는 재생성 |
Input Rail
Input Rail은 가장 바깥쪽 관문이다. 사용자의 원문이 모델 컨텍스트로 들어가기 전에 실행되므로 명백한 공격 문자열, 금지 주제, 개인정보를 차단하거나 마스킹할 수 있다. 하지만 입력 필터 하나로 모든 우회 표현을 잡을 수 있다고 가정하면 안 된다.
Dialog Rail
Dialog Rail은 NeMo를 단순 필터와 구분하는 핵심이다. 사용자의 발화를 정규화된 의도로 해석하고, 현재 대화 상태에서 어떤 응답이나 동작이 허용되는지를 흐름으로 표현한다. 고객지원 챗봇이라면 본인확인 전에 계정 변경 단계로 넘어가지 못하도록 대화 순서를 제한하는 식이다.
다만 실제 인증 성공 여부는 애플리케이션이나 인증 서비스가 판단해야 한다. Dialog Rail은 확인 절차의 흐름을 조정할 수 있지만, 최종 사용자 권한을 스스로 부여하는 보안 경계가 아니다.
Retrieval Rail
Retrieval Rail은 RAG에서 검색된 원문 청크와 LLM 프롬프트 사이에 위치한다. 외부 문서에 숨은 지시문, 불필요한 개인정보, 관련성이 낮은 청크를 제거하거나 변환할 수 있다.
벡터 검색 전에 임베딩 자체를 검사하는 것이 아니라, 일반적으로 검색 후 반환된 읽을 수 있는 원문 청크를 검사한다. Tenant Filter와 문서 접근 권한은 검색 API나 데이터 계층에서 먼저 강제하고, Retrieval Rail은 그 결과의 콘텐츠 안전성을 추가 검사하는 역할이 적절하다.
Execution Rail
Execution Rail은 LLM이 호출하는 Custom Action이나 외부 도구의 입력과 출력을 감싼다. 예를 들어 송금 도구에 음수 금액이나 허용 범위를 넘는 값이 들어가는 것을 차단하고, 내부 API 결과에 포함된 비밀값을 모델에 돌려주기 전에 제거할 수 있다.
도구가 실제로 실행 가능한지는 다운스트림 API가 다시 인증·인가해야 한다. “모델이 이 도구를 골랐다”는 사실은 권한 증명이 아니다.
Output Rail
Output Rail은 모델 응답이 사용자에게 전달되기 직전에 실행된다. 유해 콘텐츠, 금지 주제, 개인정보, 근거 없는 답변 등을 검사하고 차단·수정·재생성을 선택할 수 있다. 스트리밍 응답에서는 검사 시점과 지연시간, 이미 전송된 토큰의 회수 불가능성을 별도로 고려해야 한다.
Colang과 설정 파일은 무엇을 하는가
NeMo Guardrails는 config.yml, Colang 파일, Python Action으로 정책을 구성한다. config.yml에는 사용할 모델과 활성 Rail을 선언하고, .co 파일에는 대화와 정책 흐름을 표현하며, actions.py에는 외부 서비스 호출 같은 사용자 정의 동작을 구현한다.
models:
- type: main
engine: openai
model: your-model
rails:
input:
flows:
- check jailbreak
output:
flows:
- self check output
Colang은 대화 흐름을 모델링하기 위한 언어다. 모든 정책을 Python 조건문으로 흩뜨리는 대신 “사용자가 이런 의도를 보이면 이 흐름을 실행한다”는 구조를 별도 파일로 관리할 수 있다. 반면 복잡한 정책이 늘어나면 Colang과 애플리케이션 코드 사이의 책임 중복을 관리해야 한다.
Python 라이브러리와 서버 방식
가장 단순한 사용법은 애플리케이션 프로세스 안에서 Python 라이브러리를 호출하는 것이다.
from nemoguardrails import LLMRails, RailsConfig
config = RailsConfig.from_path("./config")
rails = LLMRails(config)
response = rails.generate(
messages=[{"role": "user", "content": "질문 내용"}]
)
print(response)
여러 애플리케이션이 공통 정책을 사용한다면 Guardrails Server를 별도 서비스로 배치할 수 있다. 공식 저장소는 /v1/chat/completions 형태의 HTTP API와 컨테이너 실행 방식을 제공한다. 라이브러리 방식은 배포가 단순하고 호출 지연이 적은 반면, 서버 방식은 정책 중앙화와 언어 독립성이 좋지만 네트워크 장애와 병목을 고려해야 한다.
NeMo가 잘하는 것과 맡기면 안 되는 것
| NeMo에 적합한 책임 | 애플리케이션·신뢰 계층의 책임 |
| 입력·검색·출력 콘텐츠 검사 | 사용자 인증과 세션 검증 |
| 대화와 LLM 처리 흐름 조정 | Tenant 확정과 데이터 접근 권한 |
| Custom Action 호출 전후 검사 | 도구·API의 최종 인가 |
| 안전 모델·규칙·외부 검사 연계 | 금전·삭제·권한변경의 최종 승인 |
| Rail 실행 추적 | 법적 감사 기록과 업무 원장 |
NeMo가 LLM 파이프라인의 중심이 될 수는 있지만 업무 권한의 최종 판단자가 되어서는 안 된다. 가장 실용적인 책임 분리는 “Application은 보안·업무 제어의 중심, NeMo는 LLM 처리 파이프라인의 중심”이다.
도입 전에 알아야 할 한계
가드레일은 오탐과 미탐을 가진다. 여러 Rail에서 LLM 기반 검사를 반복하면 토큰 비용과 지연시간도 증가한다. 입력과 출력에 같은 정책을 중복 적용하거나, 애플리케이션 정책과 Colang 흐름이 서로 다른 결정을 내리면 운영자가 원인을 추적하기 어려워진다.
또한 공식 저장소는 내장 가드레일이 모든 운영 환경에 그대로 적합하다고 보장하지 않으며, 조직의 요구사항과 예상하지 못한 오용을 자체적으로 검토해야 한다고 안내한다. 테스트 세트에는 정상 요청, 우회 표현, 다국어, 긴 컨텍스트, 검색 문서 오염, 도구 오류와 스트리밍을 포함해야 한다.
최신 저장소 문서에는 익명 사용 통계 텔레메트리와 비활성화 방법도 설명되어 있다. 폐쇄망이나 엄격한 개인정보 환경에서는 사용 중인 버전의 텔레메트리 항목과 외부 추론 엔드포인트의 약관을 배포 전에 확인해야 한다.
언제 NeMo Guardrails를 써야 하는가
다음 조건이라면 도입 가치가 크다.
- 한 서비스에서 입력·RAG·도구·출력 정책을 일관되게 실행해야 한다.
- 단순 필터를 넘어 대화 상태와 표준 절차를 모델링해야 한다.
- 여러 안전 모델과 외부 검사기를 하나의 Rail 흐름으로 연결해야 한다.
- 정책 실행 위치와 결과를 관측하고 평가해야 한다.
반대로 단일 모델에 금지어 몇 개만 검사하는 작은 내부 도구라면 자체 미들웨어가 더 단순할 수 있다. NeMo의 가치는 필터 개수보다 LLM 처리 흐름 전체를 정책으로 조정할 필요가 있는가에서 결정된다.
결론
NeMo Guardrails는 안전한 모델을 만들어 주는 마법 상자가 아니다. 모델 호출 전후에 흩어진 검사를 Input, Dialog, Retrieval, Execution, Output Rail로 구조화하고, 대화와 도구 실행의 흐름을 프로그래밍할 수 있게 하는 런타임이다.
이를 사용해야 하는 가장 큰 이유는 “모델이 알아서 지키길 기대하는 정책”을 “실제로 실행되고 관측되는 파이프라인”으로 바꾸기 위해서다. 다만 인증·인가, Tenant 경계, 최종 업무 승인까지 NeMo에 넘기지 말아야 한다. 그 경계를 지킬 때 NeMo는 LLM 애플리케이션의 안전성과 운영 가능성을 함께 높이는 유용한 계층이 된다.
공식 참고 자료
'일반IT > AI' 카테고리의 다른 글
| 첫 번째 방어선: NeMo Guardrails와 Colang (0) | 2026.09.03 |
|---|---|
| 두 겹의 안전 분류: Nova Lite Safety와 Self-check (0) | 2026.09.03 |
| AWS Bedrock은 직접 LLM API보다 비쌀까? Claude·Mistral·OpenAI 계열 가격 비교 (0) | 2026.09.02 |
| ChatGPT 월 125달러 요금제의 정체: Business Premium (0) | 2026.08.29 |
| HITL은 이제 필수인가? AI 에이전트 시대의 Human-in-the-Loop 설계 원칙 (0) | 2026.08.29 |