NeMo Guardrailsを試してみた
今回はNVIDIAが提供するNeMo Guardrailsを利用してみました。NeMo Guardrailsを利用することでプログラムを用いてガードレール機能を導入することができます。
NeMo Guardrailsとは?
こちらの解説によると、
NeMo Guardrails はプログラム可能なガードレールを LLM ベースの対話システムに簡単に追加するための OSS です。NeMo Guardrails を使用する事で、簡単なコンフィグレーションの作成と Python によるコーディングのみで、信頼性のある、安全でセキュアな LLM 対話システムの構築を簡単に行う事ができます。2024 年 10 月時点で、v0.10.1 として github 上に公開されています。wheel パッケージからもインストールが可能で、今後はコンテナー形式での提供も予定されています。
とのことです。ガードレールとはLLMを利用したサービスの文脈では、LLMの挙動を制御し安全なサービスを構築するための仕組みになります。昨今LLMを利用した様々なサービスがローンチされていますが、それらを安全に運用するためにはガードレールの導入は必要不可欠だと考えており、その方法論の中でNeMo Guardrailsはとても有益なものだと思います。OSSとして提供されており、LangChainなどとの連携もできると言うことで、既存のエコシステムにも組み込めることが特徴です。
早速使ってみる
今回は以下で提供されているチュートリアルを元に、挨拶をした時の返答を制御してみます。
環境構築
uvを利用して環境構築しました。
uv init nemo_guardrails_tutorial -p 3.12
cd nemo_guardrails_tutorial
uv add nemoguardrails==0.10.0 langchain-nvidia-ai-endpoints==0.2.2 python-dotenv
また、今回の利用ではAPIキーを用意する必要があります。APIキーについてはbuild.nvidia.com上で検証用のキーであれば発行してもらえるので準備して、.envに設定してください。
NVIDIA_API_KEY=...
設定ファイルの作成
今回はチュートリアルに乗っ取り、hello_worldフォルダ以下に以下の二つのファイルを定義します。
-
hello_world/config.yaml: 利用するモデルやパラメータの設定 -
hello_world/rails.co: ガードレールの内容を記載したファイル
特に特徴的なのがガードレールの設定を記載したrails.coファイルになります。これはColangというNVIDIAが開発した言語を用いて実装します。LLMをベースとしたアプリケーションなどの実装をコンセプトとして新たに作成されたものになります。今回の記事では詳細は省略しますが、近日中に解説できればしようと思います!
まずはhello_world/config.yamlをみてみましょう。
models:
- type: main
engine: nvidia_ai_endpoints
model: meta/llama3-8b-instruct
parameters:
temperature: 0.5
top_p: 1
max_tokens: 1024
modelsにてモデルを定義します。今回はnvidia_ai_endpointsをエンジンとして利用するのでそのように設定し、利用するモデルはmeta/llama3-8b-instructを利用するように設定しています。また、温度パラメータやTop-pパラメータなどもparametersで設定しています。
次にhello_world/rails.coをみてみましょう。
※ チュートリアルとフローを一部修正しています。
define user express greeting
"こんにちは"
"はい"
define bot express greeting
"こんにちは世界!"
define bot ask how are you
"ごきげん如何でしょうか"
"調子はどうですか"
"今日はどんな感じ?"
define flow
user express greeting
bot express greeting
bot ask how are you
初めてみるような記述ですが、内容は結構シンプルです。今回の例ではユーザからの挨拶に対してLLMのbotが挨拶を返すような内容になっています。ロールはuserとbotの二つがあり、まずはそれぞれの入力を想定した項目を作成します。例えば最初のdefine user express greetingでは、userロールがexpress greetingと言う動作をしたとする場合はこんにちはまたははいと発言した時という定義をしています。
define user express greeting
"こんにちは"
"はい"
もう一つ実装をみてみると、define bot ask how are youでは、botがhow are youという項目についてuserに話しかける(ask)動作を定義できます。
define bot ask how are you
"ごきげん如何でしょうか"
"調子はどうですか"
"今日はどんな感じ?"
Colangではまずこのようにしてユーザとのやりとりの中で起こりうるメッセージを列挙することで動作を定義できます。動作を定義したら、それらを組み合わせてフローを定義できます。
define flow
user express greeting
bot express greeting
bot ask how are you
例えばこの例だと以下のようなフローを組んでいます。
-
userが挨拶(express greeting)に該当するメッセージを投げる -
botが挨拶(express greeting)し返す -
botが調子を聞く(ask how are you)
Pythonコードの実装
それでは先ほど実装した設定を読み込んで利用できるチャットシステムを書いてみましょう。
from dotenv import load_dotenv
load_dotenv()
from nemoguardrails import RailsConfig
from nemoguardrails import LLMRails
config_hw = RailsConfig.from_path("./hello_world")
rails_hw = LLMRails(config_hw)
response_hw = rails_hw.generate(messages=[{
"role": "user",
"content": "こんにちは"
}])
print(response_hw)
今回重要なのはnemoguardrails.RailsConfigとnemoguardrails.LLMRailsになります。前者はhello_world/config.yamlを読み込んでモデルの設定を構築し、後者はhello_world/rails.coを読み込んでガードレールを考慮したチャットシステムを初期化します。
config_hw = RailsConfig.from_path("./hello_world")
rails_hw = LLMRails(config_hw)
そのあとはrails_hw.generateを利用することでチャットを開始できます。
response_hw = rails_hw.generate(messages=[{
"role": "user",
"content": "こんにちは"
}])
このコードを早速実行しましょう。ユーザからの入力はこんにちはなので、ガードレールで設定したuser express greetingに該当するため、定義したフローwが呼び出されます。順番としてはユーザが挨拶した後にbot express greetingとbow ask how are youが実行されるので、それら二つの組み合わせが結果として帰ってきます。
uv run greeting.py
# 結果1
{'role': 'assistant', 'content': 'こんにちは世界!\n今日はどんな感じ?'}
# 結果2
{'role': 'assistant', 'content': 'こんにちは世界!\nごきげん如何でしょうか'}
bot express greetingは一つしかメッセージを定義してないので固定ですが、後者は複数登録されているので実行ごとに結果が変わっています。試しに以下のようにしてbot express greetingに種類を定義してみました。
define bot express greeting
"こんにちは世界!"
"いい天気ですね!"
"お久しぶりです"
それではこちらの設定で実行してみましょう。
uv run greeting.py
# 結果1
{'role': 'assistant', 'content': 'いい天気ですね!\n調子はどうですか'}
# 結果2
{'role': 'assistant', 'content': 'こんにちは世界!\n今日はどんな感じ?'}
# 結果3
{'role': 'assistant', 'content': 'お久しぶりです\n今日はどんな感じ?'}
みた通り、bot express greeting二種類を与えることができました。
まとめ
今回はNeMo Guardrailsについてチュートリアルの内容をベースに簡単に使ってみました。今回はあいさつの制御でしたが、実際に利用する際はもっと複雑なルールを実装することになると思います。Colangをもちいて様々なルールを儲けることができるので次回以降で色々と試してみようと思います。
Discussion