NeMo Guardrailsとは、NVIDIAが開発したオープンソースのLLMガードレールフレームワークである。独自のドメイン固有言語「Colang」を用いて対話フローを宣言的に定義し、入力レール・出力レール・対話レール・検索レールの4種類のレールでLLMの動作を包括的に制御する。モデルに依存せず、OpenAI、Anthropic、ローカルLLMなど任意のLLMバックエンドと統合でき、ナレッジベース連携によるRAGベースの事実性検証もサポートする。
NeMo Guardrails(正式名称: NVIDIA NeMo Guardrails)は、NVIDIAが2023年にApache 2.0ライセンスで公開したLLMガードレールフレームワークである。LLMアプリケーションに「レール(Rails)」と呼ばれる制約を追加し、モデルの振る舞いを安全かつ制御可能な範囲に限定するためのツールキットとして設計されている。
NeMo Guardrailsのアーキテクチャは3つの主要コンポーネントで構成される。
処理の流れは以下のようになる。ユーザーの入力がまず入力レールで検査され、通過した場合にColangランタイムが対話フローに基づいてLLMへのプロンプトを構築する。LLMの応答が返ると出力レールで検証が行われ、問題がなければユーザーに返される。いずれかのレールで問題が検出された場合は、Colangフロー定義に従って代替応答の生成、リトライ、またはエラー応答が返される。
Colang(COlang / Conversational Language)は、NeMo Guardrails専用に設計された宣言的DSLである。自然言語に近い構文で対話のフローとルールを定義できることが最大の特徴である。Colang 2.0(2024年リリース)では、イベント駆動アーキテクチャ、並行フロー実行、マルチモーダル対応が追加された。
Colangの基本構成要素は以下の通りである。
Colangのフロー定義例として、金融相談ボットでの株価予測質問のブロックは以下のような宣言的記述で実現される。ユーザーが株価予測を要求するパターンを定義し、そのパターンにマッチした場合にボットが「投資助言は提供できません」と応答するフローを記述する。この宣言的アプローチにより、ドメインエキスパート(非エンジニア)でもルールの追加・修正が可能となる。
NeMo Guardrailsでは、4種類のレールを用途に応じて組み合わせて使用する。
| レール種別 | 適用タイミング | 主な用途 | 実装方式 |
|---|---|---|---|
| Input Rails | LLM呼び出し前 | プロンプトインジェクション検出、トピック分類、PII除去 | Colangフロー + Pythonアクション |
| Output Rails | LLM応答後 |
| 有害コンテンツ検出、事実性検証、フォーマット検証 |
| Colangフロー + Pythonアクション |
| Dialog Rails | 対話フロー全体 | 会話の方向制御、禁止トピック回避、エスカレーション | Colangフロー定義 |
| Retrieval Rails | RAG検索後 | 検索結果の関連性検証、機密文書フィルタリング | Colangフロー + Pythonアクション |
各レールはPythonアクションと連携することで、外部APIの呼び出し、データベース検索、分類モデルの推論など任意の処理を実行できる。アクションは非同期(async)実行に対応しており、複数のレールを並列に評価することでレイテンシを最小化できる。
Input Railsはユーザー入力がLLMに到達する前に適用される防御層である。代表的な入力レールには以下がある。
Output Railsはモデルの応答品質を保証する最終防御層である。
NeMo Guardrailsは組み込みのナレッジベース(KB)機能を持ち、マークダウン形式のドキュメントを直接読み込んでRAG(Retrieval-Augmented Generation)パイプラインを構築できる。KBファイルをkb/ディレクトリに配置するだけで自動的にチャンク分割・ベクトル化され、ユーザーの質問に対して関連チャンクが検索・注入される。
KB連携のアーキテクチャは以下の通りである。
外部のRAGパイプライン(LangChain、LlamaIndex等)との統合も可能である。NeMo GuardrailsをLangChainのチェーン内にミドルウェアとして組み込むRunnableRailsアダプタが提供されており、既存のLangChainアプリケーションに最小限の変更でガードレールを追加できる。
NeMo Guardrailsのプロジェクトは以下のディレクトリ構造で管理される。
config.yml: LLMプロバイダ、モデル名、レール設定、KB設定などの全体構成を定義config.co(Colangファイル): 対話フロー、ユーザー意図、ボット応答を定義actions.py: カスタムPythonアクションを実装kb/: ナレッジベースのマークダウンファイルを格納prompts.yml: LLMに送信するプロンプトテンプレートをカスタマイズデプロイメント方式は3つある。Pythonライブラリとしてアプリケーションに直接組み込む方式、FastAPIベースのガードレールサーバーとして独立デプロイする方式、そしてDockerコンテナとしてKubernetesクラスタにデプロイする方式である。本番環境ではガードレールサーバーをLLMプロキシとして配置し、すべてのLLMリクエストをガードレールサーバー経由でルーティングするリバースプロキシ構成が推奨される。
NeMo Guardrailsは対話フロー全体の制御に強みがあり、Colang言語によってユーザーとの複数ターンの対話シナリオを宣言的に定義できる。トピック制御、対話の方向制御、エスカレーションルールなどの「対話品質」の管理に適している。一方、Guardrails AIは出力の構造化バリデーションに特化しており、RAIL仕様やPydanticモデルによるJSON出力の型チェック・値域検証に優れる。ユースケースに応じて、対話型アプリケーション(チャットボット、カスタマーサポート)にはNeMo Guardrails、API出力の品質保証にはGuardrails AIを選択するのが一般的である。両者を併用することも可能で、NeMo Guardrailsの出力レール内でGuardrails AIのバリデータを呼び出す構成も実装できる。
Colang 1.0はパターンマッチングベースのシンプルなフロー定義言語であり、ユーザー意図のカノニカルフォーム定義と線形的なフロー記述が中心であった。Colang 2.0は2024年にリリースされた大幅な拡張であり、イベント駆動アーキテクチャ、並行フロー実行(concurrent flows)、メタプログラミング(when句による条件付きフロー活性化)、改善されたアクション呼び出し構文が導入された。Colang 2.0では複数のフローが同時に活性化され、イベント(ユーザー発話、タイマー、外部トリガー等)に応じて動的にフローが選択・実行される。これにより、割り込み対話、タイムアウト処理、複合条件による分岐など、実運用で必要な複雑な対話パターンを自然に表現できるようになった。
NeMo Guardrailsのレイテンシオーバーヘッドは設定するレールの数と種類に依存する。self_check_input(LLMベースの入力検証)を有効にした場合、追加のLLM呼び出しが1回発生するため100〜500msの追加レイテンシが発生する。self_check_output(LLMベースの出力検証)も同様である。一方、パターンマッチングベースのレール(正規表現によるPIIマスキング、キーワードフィルタリング等)は1〜10msの追加で済む。レイテンシを最小化するには、LLMベースのレールを必要最小限に絞り、パターンマッチングベースのレールで前段フィルタリングを行う。また、LLM呼び出しのキャッシュ(同一入力パターンに対する判定結果のキャッシュ)を有効にすることで、繰り返しリクエストのレイテンシを大幅に削減できる。