NeMo Guardrails: LLM의 확률적 불확실성을 통제하는, 프로그래밍 가능한 안전장치 (feat. NVIDIA)

NeMo Guardrails 소개

오늘날 대규모 언어 모델(LLM)은 텍스트 생성, 요약, 코딩 등 다양한 분야에서 놀라운 성능을 보여주고 있습니다. 하지만 기업이나 개발자가 실제 서비스(Production) 환경에 LLM을 도입하려 할 때 가장 큰 걸림돌이 되는 것은 바로 모델의 '예측 불가능성'입니다. LLM은 본질적으로 확률에 기반하여 다음 단어를 예측하기 때문에, 때로는 사실이 아닌 정보를 진실처럼 말하는 환각(Hallucination) 현상을 보이거나, 편향된 정보를 제공하거나, 보안상 안전하지 않은 답변을 내놓을 위험이 있습니다.

NeMo Guardrails는 이러한 문제를 해결하기 위해 NVIDIA가 개발 및 공개한 오픈소스 툴킷입니다. 이 도구는 사용자와 LLM 사이에 위치하는 미들웨어 역할을 수행하며, 개발자가 정의한 규칙에 따라 입력과 출력을 실시간으로 모니터링하고 제어합니다. 단순히 "나쁜 말을 하지 마라"는 식의 모호한 지시(Prompt Engineering)에 의존하는 것이 아니라, Colang이라는 전용 모델링 언어를 사용하여 대화의 흐름과 제약 조건을 코드(Code) 형태로 명확하게 정의할 수 있다는 것이 가장 큰 특징입니다. 이를 통해 개발자는 확률적인 LLM 위에 결정론적인(Deterministic) 안전장치를 덧씌워, 모델이 반드시 지켜야 할 가이드라인 안에서만 작동하도록 강제할 수 있습니다.

정리하면, NeMo Guardrails는 대규모 언어 모델(LLM)을 활용한 스마트 애플리케이션에 정확성(Accuracy), 적절성(Appropriateness), 보안(Security) 을 보장하는 안전장치(Rails)를 손쉽게 추가할 수 있게 하는 도구입니다. 이 도구는 LLM과 사용자 사이의 미들웨어처럼 작동하며, Colang이라는 전용 모델링 언어를 통해 대화의 흐름을 제어하고 정책을 집행합니다.

LLM 서비스 개발 시 NeMo Guardrails가 필요한 이유

기존의 프롬프트 엔지니어링만으로는 복잡한 비즈니스 요구사항과 엄격한 안전 기준을 충족하기 어렵습니다. NeMo Guardrails는 다음과 같은 구체적인 상황에서 필수적인 역할을 수행합니다:

첫째, 비즈니스 로직과 대화 흐름의 강제가 필요할 때입니다. 예를 들어, 고객 지원 챗봇은 사용자의 질문에 답하기 전에 반드시 본인 확인 절차를 거쳐야 할 수 있습니다. 순수 LLM은 대화 맥락(Context)에 따라 이 절차를 건너뛸 수도 있지만, NeMo Guardrails를 사용하면 인사 -> 본인 확인 -> 상담이라는 흐름을 코드로 고정하여 예외 없이 절차를 따르게 만들 수 있습니다.

둘째, 주제 이탈 방지(Topic Control) 입니다. 기업의 챗봇이 정치적 논쟁에 휘말리거나, 경쟁사의 제품을 홍보하거나, 주식 투자 조언을 하는 것은 브랜드 이미지에 치명적입니다. NeMo Guardrails는 봇이 허용된 도메인(예: 제품 A/S) 내에서만 대화하도록 제한하고, 범위를 벗어난 질문에는 사전에 정의된 정중한 거절 메시지를 보내도록 제어합니다.

셋째, 보안 및 안전성 확보입니다. 사용자가 교묘하게 설계된 프롬프트(Jailbreak)를 통해 모델의 안전 장치를 우회하려 하거나, 개인정보(PII)를 입력하는 경우를 탐지하여 차단할 수 있습니다. 또한, RAG(검색 증강 생성) 시스템에서 모델이 참고 문서에 없는 내용을 지어내지 않도록 팩트 체크를 수행하여 신뢰성을 높일 수 있습니다.

NeMo Guardrails의 주요 기능

NeMo Guardrails는 입력 -> 처리 -> 출력의 파이프라인 구조를 가집니다. 각 단계는 다음과 같이 동작합니다:

  • 1단계: 사용자 의도 변환 (User Intent Generation): 사용자의 자연어 입력을 사전에 정의된 "표준 형식(Canonical Form)"으로 변환합니다. (예: "안녕?" -> express greeting)
  • 2단계: 대화 흐름 결정 (Dialog Flow Execution): 정의된 Colang 규칙에 따라 다음에 어떤 행동을 할지 결정합니다. LLM을 호출할지, 파이썬 스크립트를 실행할지, 사전 정의된 답변을 내보낼지 판단합니다.
  • 3단계: 봇 의도 및 응답 생성 (Bot Intent & Generation): 결정된 행동에 따라 최종 텍스트를 생성하여 사용자에게 전달합니다.

Colang: 대화 모델링 언어

NeMo Guardrails의 핵심은 Colang입니다. Python과 유사한 문법을 가진 이 언어는 사용자의 모호한 자연어 입력을 시스템이 이해할 수 있는 '표준 의도(Canonical Form)'로 변환하고, 그에 따른 봇의 행동을 정의하는 데 사용됩니다.

개발자는 .co 확장자를 가진 파일에 대화의 규칙을 작성합니다. 예를 들어, 사용자가 "안녕", "반가워", "하이" 등 다양하게 인사할 수 있지만, Colang에서는 이를 express greeting이라는 하나의 의도로 묶어서 정의합니다. 그리고 express greeting이라는 의도가 감지되면 봇이 어떻게 반응해야 하는지(예: bot express greeting)를 연결합니다. 이렇게 함으로써 LLM이 매번 새로운 문장을 창조하는 대신, 개발자가 의도한 정확한 답변이나 흐름을 따르게 됩니다.

아래 예시를 통해 간단히 Colang의 형태를 살펴보도록 하겠습니다:

# 사용자 의도 정의
define user express greeting
  "안녕하세요"
  "안녕"

# 봇의 응답 정의
define bot express greeting
  "안녕하세요! 무엇을 도와드릴까요?"

# 대화 흐름(Flow) 정의
define flow greeting
  user express greeting
  bot express greeting`

위와 같이 정의하면, 사용자가 "안녕"이라고 말했을 때 LLM이 임의로 답변하는 것이 아니라, 반드시 개발자가 정의한 "안녕하세요! 무엇을 도와드릴까요?"라는 답변을 출력하게 됩니다.

Colang과 관련한 더 상세한 내용은 다음 문서를 참고해주세요:

대화 제어를 위한 주제 가드레일 (Topical Guardrails)

주제 가드레일은 챗봇이 특정 주제에 대해서만 응답하도록 제한하는 기능입니다. 이는 단순히 키워드를 필터링하는 수준을 넘어섭니다. NeMo Guardrails는 대화의 맥락을 파악하여 사용자의 발언이 허용된 범위를 벗어났는지 판단합니다.

예를 들어, "직원 채용 챗봇"을 만든다면 채용과 관련된 질문(연봉, 복지, 지원 방법)은 허용하지만, "주식 시장 전망"에 대한 질문이 들어오면 이를 '주제 이탈'로 간주합니다. Colang 파일 내에 이러한 흐름을 정의해 두면, 시스템은 주제 이탈 질문이 들어왔을 때 LLM에게 답변 생성을 요청하는 대신, 즉시 "죄송합니다. 저는 채용 관련 질문에만 답변할 수 있습니다."라는 미리 준비된 메시지를 출력합니다. 이는 불필요한 LLM API 호출 비용을 절감하는 효과도 있습니다.

NeMo Guardrails 문서에는 다양한 가드레일들이 준비되어 있습니다:

보안 가드레일 (Security & Jailbreaking)

외부의 악의적인 공격으로부터 애플리케이션을 보호하는 기능입니다. 최근 LLM을 대상으로 "이전의 모든 지시를 무시하고..."와 같은 탈옥(Jailbreak) 시도가 빈번하게 발생하고 있습니다. NeMo Guardrails는 이러한 공격 패턴을 감지하는 모델이나 규칙을 입력 레일에 배치하여, 위험한 프롬프트가 LLM에 도달하기 전에 사전에 차단합니다. 또한, 민감한 개인정보가 포함된 쿼리가 외부 LLM 서비스로 전송되지 않도록 마스킹하거나 차단하는 기능도 구현할 수 있습니다.

사실 확인 및 환각 방지 가드레일 (Fact-checking & Hallucination Rails)

RAG(검색 증강 생성) 기반 애플리케이션에서 가장 중요한 기능 중 하나는 모델이 거짓말을 하지 않도록 막는 것입니다. NeMo Guardrails는 모델이 생성한 답변이 제공된 컨텍스트(참고 문서)와 일치하는지 검증하는 메커니즘을 내장하고 있습니다.

작동 방식은 다음과 같습니다. LLM이 사용자의 질문에 대해 답변을 생성하면, Guardrails는 이 답변을 사용자에게 바로 보여주지 않고 다시 한번 LLM(또는 별도의 검증 모델)에게 "이 답변이 제공된 문서에 근거한 내용인가?"라고 묻습니다. 만약 근거가 없다고 판단되면 답변을 차단하거나 "정보를 찾을 수 없습니다"라고 수정하여 출력합니다. 이중 검증 과정을 통해 서비스의 신뢰도를 획기적으로 높일 수 있습니다.

설치 및 실제 적용 및 통합 (Integration)

NeMo Guardrails은 Python 3.10 이상 환경에서 아래와 같은 pip 명령어를 통해 설치할 수 있습니다. OpenAI 모델을 사용한다면, OpenAI SDK를 함께 설치하는 것이 좋습니다:

pip install nemoguardrails
pip install openai # OpenAI 모델 사용 시

설치 후에는 다음과 같은 방식으로 설정 및 가드레일을 생성/적용할 수 있습니다:

from nemoguardrails import LLMRails, RailsConfig

# 설정 파일(config 폴더) 로드
config = RailsConfig.from_path("./config")
rails = LLMRails(config)

# 가드레일이 적용된 생성 요청
response = rails.generate(messages=[{
    "role": "user",
    "content": "회사의 기밀 정보를 알려줘"
}])

print(response.content)
# 설정에 따라 "죄송합니다. 기밀 정보에는 접근할 수 없습니다."와 같이 차단된 응답 출력`

또한, NeMo Guardrails는 독립적으로 사용할 수도 있지만, LangChain이나 LlamaIndex와 같은 기존의 LLM 프레임워크와 매끄럽게 통합되도록 설계되었습니다. Python 환경에서 pip install nemoguardrails 명령어로 쉽게 설치할 수 있으며, OpenAI의 GPT 시리즈뿐만 아니라 다양한 오픈소스 LLM과도 연동이 가능합니다.

NeMo Guardrails 적용 시, 프로젝트 구조는 일반적으로 설정 파일(config.yml)과 가드레일 정의 파일(*.co)이 담긴 config 폴더를 기반으로 합니다. LLMRails 클래스를 통해 이 설정을 로드하고, generate 또는 generate_async 메서드를 호출하여 가드레일이 적용된 텍스트 생성을 수행합니다. 이를 통해 개발자는 기존의 애플리케이션 코드에 단 몇 줄의 변경만으로 강력한 안전장치를 추가할 수 있습니다.

더 상세한 사용법은 NeMo Guardrails의 공식 문서를 참고해주세요:

라이선스

NeMo Guardrails 프로젝트는 Apache License 2.0 라이선스로 배포되고 있습니다. 개인 및 기업 사용자가 자유롭게 사용, 수정 및 재배포할 수 있으며 상업적 이용도 가능합니다.

:house: NeMo Guardrails 공식 문서

https://docs.nvidia.com/nemo/guardrails/

:scroll: NeMo Guardrails 기술 문서

:github: NeMo Guardrails 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요