
LLM 채팅 앱을 위한 프로그래밍 가능한 가드레일: 입력/출력 레일을 적용하고, 탈옥(jailbreak)과 프롬프트 인젝션을 차단하며, 환각을 감지하고, 민감한 데이터를 마스킹합니다.
최신 릴리스 / 개발 버전: develop 브랜치는 최신 개발 버전을 추적합니다. 최신 릴리스 버전은 0.24.1입니다.
✨✨✨
📌 공식 NeMo Guardrails 라이브러리 문서는 docs.nvidia.com/nemo/guardrails에서 확인할 수 있습니다.
✨✨✨
NVIDIA NeMo Guardrails 라이브러리는 LLM 기반 대화형 애플리케이션에 프로그래밍 가능한 가드레일을 손쉽게 추가할 수 있는 오픈소스 툴킷입니다. 가드레일(줄여서 "레일")은 대규모 언어 모델의 출력을 제어하는 특정 방식으로, 예를 들어 정치에 대해 이야기하지 않기, 특정 사용자 요청에 특정 방식으로 응답하기, 미리 정의된 대화 경로 따르기, 특정 언어 스타일 사용하기, 구조화된 데이터 추출하기 등이 있습니다.
이 논문은 NeMo Guardrails 라이브러리를 소개하고 시스템의 기술적 개요와 현재 평가를 담고 있습니다.
Python 3.10, 3.11, 3.12 또는 3.13.
pip를 사용하여 설치하려면:```bash
pip install nemoguardrails
자세한 지침은 [설치 가이드](https://docs.nvidia.com/nemo/guardrails/get-started/installation-guide)를 참조하세요.
## 개요
<!-- start-documentation-reuse -->
NeMo Guardrails 라이브러리를 사용하면 LLM 기반 애플리케이션을 개발하는 개발자가 애플리케이션 코드와 LLM 사이에 **프로그래밍 가능한 가드레일**을 추가할 수 있습니다.
<div align="center">
<img src="https://raw.githubusercontent.com/NVIDIA-NeMo/Guardrails/develop/docs/_static/images/programmable_guardrails.png" width="75%" alt="Programmable Guardrails">
</div>
*프로그래밍 가능한 가드레일*을 추가할 때 얻을 수 있는 주요 이점은 다음과 같습니다:
- **신뢰할 수 있고 안전하며 보안이 강화된 LLM 기반 애플리케이션 구축:** 대화를 안내하고 보호하기 위한 레일을 정의할 수 있으며, 특정 주제에 대한 LLM 기반 애플리케이션의 동작을 정의하고 원치 않는 주제에 대한 논의에 참여하지 않도록 방지할 수 있습니다.
- **모델, 체인 및 기타 서비스를 안전하게 연결:** LLM을 다른 서비스(일명 도구)에 원활하고 안전하게 연결할 수 있습니다.
- **제어 가능한 대화**: 미리 정의된 대화 경로를 따르도록 LLM을 조종할 수 있어, 대화 설계 모범 사례에 따라 상호작용을 설계하고 표준 운영 절차(예: 인증, 지원)를 시행할 수 있습니다.
<!-- end-documentation-reuse -->
### LLM 취약점으로부터 보호
NeMo Guardrails 라이브러리는 탈옥(jailbreak) 및 프롬프트 인젝션과 같은 일반적인 LLM 취약점으로부터 LLM 기반 채팅 애플리케이션을 보호하기 위한 여러 메커니즘을 제공합니다. 아래는 이 저장소에 포함된 예제 [ABC Bot](https://github.com/nvidia-nemo/guardrails/blob/develop/examples/bots/abc)에 대해 다양한 가드레일 구성이 제공하는 보호 기능에 대한 샘플 개요입니다. 자세한 내용은 [LLM 취약점 스캐닝](https://docs.nvidia.com/nemo/guardrails/evaluation/llm-vulnerability-scanning.html) 페이지를 참조하세요.
<div align="center">
<img src="https://raw.githubusercontent.com/NVIDIA-NeMo/Guardrails/develop/docs/_static/images/abc-llm-vulnerability-scan-results.png" width="500">
</div>
### 사용 사례
프로그래밍 가능한 가드레일은 다양한 유형의 사용 사례에서 사용할 수 있습니다:
1. 문서 집합에 대한 **질의응답**(일명 검색 증강 생성): 사실 확인 및 출력 조정을 시행합니다.
2. **도메인 특화 어시스턴트**(일명 챗봇): 어시스턴트가 주제를 벗어나지 않고 설계된 대화 흐름을 따르도록 보장합니다.
3. **LLM 엔드포인트**: 더 안전한 고객 상호작용을 위해 사용자 정의 LLM에 가드레일을 추가합니다.
4. **LangChain 체인**(선택 사항): 어떤 사용 사례에서든 LangChain을 사용하는 경우, 체인 주위에 가드레일 계층을 추가할 수 있습니다. 이 통합을 활성화하려면 `NEMOGUARDRAILS_LLM_FRAMEWORK=langchain` 환경 변수를 설정하거나 `set_default_framework("langchain")`을 호출하세요.
### 사용법
애플리케이션에 프로그래밍 가능한 가드레일을 추가하려면 Python API 또는 가드레일 서버를 사용할 수 있습니다(자세한 내용은 [서버 가이드](https://docs.nvidia.com/nemo/guardrails/get-started/integrate-into-application) 참조). Python API 사용은 LLM을 직접 사용하는 것과 유사합니다. LLM 대신 가드레일 계층을 호출하려면 코드베이스를 최소한으로만 변경하면 되며, 다음 두 가지 간단한 단계로 이루어집니다:
1. 가드레일 구성을 로드하고 `LLMRails` 인스턴스를 생성합니다.
2. `generate`/`generate_async` 메서드를 사용하여 LLM을 호출합니다.```python
from nemoguardrails import LLMRails, RailsConfig
# Load a guardrails configuration from the specified path.
config = RailsConfig.from_path("PATH/TO/CONFIG")
rails = LLMRails(config)
completion = rails.generate(
messages=[{"role": "user", "content": "Hello world!"}]
)
샘플 출력:```json {"role": "assistant", "content": "Hi! How can I help you?"}
`generate` 메서드의 입력 및 출력 형식은 OpenAI의 [Chat Completions API](https://platform.openai.com/docs/guides/gpt/chat-completions-api)와 유사합니다.
#### 비동기 API
NeMo Guardrails 라이브러리는 핵심 메커니즘이 Python 비동기 모델을 사용하여 구현된 비동기 우선 툴킷입니다. 공개 메서드는 동기 버전과 비동기 버전을 모두 제공합니다. 예를 들어 `LLMRails.generate`와 `LLMRails.generate_async`가 있습니다.
### 지원되는 LLM
NeMo Guardrails는 OpenAI GPT-3.5, GPT-4, LLaMa-2, Falcon, Vicuna, Mosaic 등 여러 LLM과 함께 사용할 수 있습니다. 자세한 내용은 구성 가이드의 [지원되는 LLM 모델](https://docs.nvidia.com/nemo/guardrails/about-nemo-guardrails-library/supported-llms) 섹션을 참고하세요.
### 가드레일의 유형
NeMo Guardrails 라이브러리는 다섯 가지 주요 가드레일 유형을 지원합니다:
<div align="center">
<img src="https://raw.githubusercontent.com/NVIDIA-NeMo/Guardrails/develop/docs/_static/images/programmable_guardrails_flow.png" width="75%" alt="Programmable Guardrails Flow">
</div>
1. **입력 레일**: 사용자의 입력에 적용됩니다. 입력 레일은 입력을 거부하여 추가 처리를 중단하거나, 입력을 변경할 수 있습니다(예: 잠재적으로 민감한 데이터를 마스킹하거나 표현을 바꾸는 경우).
2. **대화 레일**: LLM이 어떻게 프롬프트되는지에 영향을 줍니다. 대화 레일은 정규 형식 메시지에 대해 동작하며(자세한 내용은 [Colang 가이드](https://docs.nvidia.com/nemo/guardrails/configure-guardrails/colang) 참고), 액션을 실행해야 하는지, 다음 단계나 응답을 생성하기 위해 LLM을 호출해야 하는지, 미리 정의된 응답을 대신 사용해야 하는지 등을 결정합니다.
3. **검색 레일**: RAG(검색 증강 생성) 시나리오에서 검색된 청크에 적용됩니다. 검색 레일은 청크를 거부하여 LLM 프롬프트에 사용되지 않도록 하거나, 관련 청크를 변경할 수 있습니다(예: 잠재적으로 민감한 데이터를 마스킹하는 경우).
4. **실행 레일**: LLM이 호출해야 하는 사용자 정의 액션(일명 도구)의 입력/출력에 적용됩니다.
5. **출력 레일**: LLM이 생성한 출력에 적용됩니다. 출력 레일은 출력을 거부하여 사용자에게 반환되지 않도록 하거나, 출력을 변경할 수 있습니다(예: 민감한 데이터 제거).
### 가드레일 구성
가드레일 구성은 사용할 **LLM**과 **하나 이상의 가드레일**을 정의합니다. 가드레일 구성에는 원하는 수의 입력/대화/출력/검색/실행 레일을 포함할 수 있습니다. 구성된 레일이 없는 구성은 기본적으로 요청을 LLM으로 전달합니다.
가드레일 구성 폴더의 표준 구조는 다음과 같습니다:```
.
├── config
│ ├── actions.py
│ ├── config.py
│ ├── config.yml
│ ├── rails.co
│ ├── ...
config.yml에는 LLM 모델, 활성 레일, 사용자 정의 구성 데이터와 같은 모든 일반 구성 옵션이 포함되어 있습니다. config.py 파일에는 사용자 정의 초기화 코드가 포함되어 있고, actions.py에는 사용자 정의 Python 액션이 포함되어 있습니다. 전체 개요는 구성 가이드를 참조하세요.
다음은 config.yml의 예시입니다:```yaml
models:
rails:
input: flows: - check jailbreak - mask sensitive data on input
output: flows: - self check facts - self check hallucination - activefence moderation on input