メルマガ登録
このたびブレインパッドは、LLM/Generative AIに関する研究プロジェクトを立ち上げ、この「Platinum Data Blog」を通じてLLM/Generative AIに関するさまざまな情報を発信をしています。
今回は、LLMを制御する方法のうちNVIDIAが開発しているOSSライブラリーのNemo Guardrailsを中心にLLMのガードレール適用方法をご紹介します。
こんにちは、アナリティクスサービス部の辻です。
前回はLLMを制御するための仕組みについて概要を説明させていただきましたが、今回はNemo Guardrailsというライブラリーを用いて実際にLLMの挙動をどのようにコントロールするかについてお話をさせていただきます。
LLM(Large Language Models,大規模言語モデル)は、広範なコンテキストと情報を理解し、自然なテキストを生成する能力を持っています。そのため、ビジネスにおける様々なシナリオ、例えばカスタマーサポート、広告や商品パッケージなどのクリエイティブ生成、戦略シナリオ策定や状況分析などの意思決定支援などに役立つことが期待されています。
しかし、LLMを実際のビジネスで運用する場合には、自社・社会・ユーザーなどに好ましくない影響が及ばないように慎重な検討が必要な観点が複数存在していると考えます。今回紹介するNeMo Guardrailsのようなガードレールシステムが必要とされる主な理由としては、以下のような観点が考えられます。
コンテンツの適切性
コンテンツの一貫性
法的・規制上の遵守
ユーザーの安全性
ユーザーの利益保護
ビジネスのブランドへの影響
このように、LLMが出力する内容によってはユーザーや社会に大きな影響を及ぼす可能性があるため、LLMを用いたAIシステムを提供する際にはそのリスクを抑制するための仕組み(ガードレール)を検討する必要があります。
NVIDIAが発表したNeMo Guardrailsは、LLMを搭載した対話システムに設計者の設計意図に沿った対応をするためのガードレールを追加するオープンソースのライブラリーです。
ガードレールとは、LLMの出力を制御する特定の方法のことで、例えば、政治に関する話題を避ける、特定のユーザーの要求に特定の方法で応答する、事前に定義されたダイアログのパスに従う、特定の言語スタイルを使用する、構造化されたデータを抽出するなどがあります。
NeMo Guardrailsはオープンソース(Apache-2.0
のライセンス)で提供されており、LangChainやZapierなどの幅広いLLM対応アプリケーションと連携できるように設計されています。LangChainはオープンソースのライブラリーであり、開発者がサードパーティのアプリケーションをLLMにプラグインすることができます。Zapierはワークフローの自動化アプリケーションを提供しています。
NeMo Guardrailsの日本語の応答に対する挙動は不安定(質問に答えられないケースが多い)なため、今回のご紹介では英語での記述を前提にさせていただきます。OSSライブラリーであるため、どのタイミングで挙動が安定するかも不明なため、ガードレールの機能を商用でサポートするサービスが今後需要として出てくるようにも思います。
ちなみにガードレールの機能を持つライブラリーとしては、gurdrails-aiといったオープンソースライブラリーもありますが今回は割愛させていただきます。
LLM対話システムの信頼性、安全性、セキュリティを確保
NeMo GuardrailsをLLMを用いたアプリケーションに組み込むことで、開発者はLLMが搭載されたチャットボットの振る舞いを特定の話題や領域について定義することができます。これにより、対象の話題に関するユーザーのリクエストに応えつつ安全で適切な対話を実現できます。
LLMと外部サービスやデータソースに接続可能
NeMo Guardrailsは、自身の持つナレッジベースやサービスをチャットボットに安全に接続する機能を有しているため*1、応答に際してLLMが正確な情報を獲得していなくても外部リソースから正確な応答が可能となります。
3種類のガードレールで多様な制御ニーズに対応
NeMo Guardrailsは安全にLLMを用いる際に、特に制御する必要性が高いと思われる3種類の要素(話題の限定、ユーザーの安全の確保、セキュリティの確保)をカバーした実装になっています。
TOPICALガードレール
SAFETYガードレール
SECURITYガードレール
次にNeMo Guardrailsのアーキテクチャについて簡潔にご紹介します。詳細については公式リファレンスをご参照ください。
NeMo Guardrailsのアーキテクチャは、ユーザからの発話を受け取り、それを応答するまでのプロセスを中心に構築されています。3つの主要なプロセスから構成されています。
ユーザーのメッセージを後続処理に直接渡さずに、標準形をわざわざ生成し直しているのはユーザーのリクエストの趣旨を理解しやすくするためです。例えば、「商品を説明して」と「商品解説お願い」はメッセージとしては別ですがボットにやってほしいことの趣旨は同じとみなすことができます。
このように、厳密にやってほしいこと・やってほしくないことを定義しなくても大まかな趣旨に沿ってガードレールを適用するかしないかを判断してくれるため、単語のブラックリスト登録のようなフィルタリング手法よりも柔軟にボットの出力を制御できるようになります。
Nemo GuardrailsはYAMLファイルを用いてチャットボットの動作を制御します。Colangと呼ばれる言語を用いて禁止されている言動や行動をスクリプト化し、それを利用してチャットボットの応答を制御します。
Nemo Guradrailsはconfig.yml
と具体的な制御規則をColangで記述した.co
ファイルがあればガードレールを適用できます。制御規則は管理しやすいように複数に分けても問題ありません。今回、Colangについては深く触れませんが、規則を記述する上で前提の言語となっているため公式リファレンスを確認いただき、理解を深めていただければ幸いです。
また、kb
というフォルダ*2をきってそこに独自の情報ソースを格納することで、Nemo Guardrailsがそこを参照するようになるためドメインに特化した情報を適切に取得するために活用することができます。
あくまで一例ですが、以下のようにナレッジベースと一般的な規則を記したファイルと限定したい話題を記したファイル、明示的に回答させたくない話題を記したファイルなどを作成してガードレールを設定できます。
sample_rail
├── kb
│ └── knowledgebase.md
├── config.yml
├── general.co
├── on-topic.co
└── off-topic.co
ガードレールを設定する上で最も重要なconfig.yml
に記述すべきことは以下の3点です。
一般的な指示(instructions)
使用モデルの指定(models)
会話例(sample_conversation)
実際のconfig.yml
がどのような中身になっているかの例を以下に示しておきます。
instructions:
- type: general
content: |
Below is a conversation between a bot and a user about product descriptions.
The bot is factual and concise. If the bot does not know the answer to a question, it truthfully says it does not know.
models:
- type: main
engine: openai
model: text-davinci-003
sample_conversation: |
user "Hello there!"
express greeting
bot express greeting
"Hello! How can I assist you today?"
user "What can you do for me?"
ask about capabilities
具体的な入力規則を記述する.co
ファイルの中身についてはビジネスでガードレールを設定する際によく発生しそうなユースケースを示す中でご紹介させていただきます。
LLMを搭載したチャットボットを顧客に提供する際に、避けたい状況というのはどういう状況でしょうか?色々と考えられると思いますが、素朴に思いつく状況は「サービスと無関係な対話」が発生することでしょう。
これまでのチャットボットであれば、あり得ないことでしたが、何も考えずにLLM搭載チャットボットを導入したら、お肌のケアの相談をしていたのに政治的主張をチャットボットがし始めるといったことも起こり得ます。(可能性としては低いでしょうが)
特定の話題以外の回答をしないガードレールは以下のように設定できます。off-topic.co
という名称でファイルを作成しておくと管理が容易になるかと思われます。
define user ask off topic
"Who should be Prime Minister?"
"Which stocks will go up tomorrow?"
"Tell me about world affairs"
...
define bot explain cant help with off topic
"I cannot comment on anything which is not relevant to skin care consultation"
define flow
user ask off topic
bot explain cant help with off topic
上記のようにユーザーが訪ねてくる様々な質問(off topic)を定義し、その質問に対してチャットボットが応答できないことを定義します。最後にそれらの質問が投げられたときには、応答できないとチャットボットが応えるというフローを定義することで、ガードレールを設定できます。
公式リファレンスにも特定の話題に沿ったガードレールを設定するExampleが紹介されているためご参照ください。
無関係な話題をベラベラとチャットボットに話されるのも歓迎し難い事態ですが、話題に沿っていたとしても失礼な言い方や社会的に問題のある発言をチャットボットがおこなっているとしたら顧客の信頼を損ない、ビジネスに大きなリスクを生じさせることになります。
チャットボットが自身の発言を監視し、必要に応じて発言の取り消しを行うような機能が必要になってきます。
下記のコードは公式リファレンスのExampleの記述そのままとなりますが、LLM自身に発言が有害なものでないか判定させたり、ブロックリストに該当する記述がないかを調べた上で、不適切な出力がないかを確認し、必要に応じて発言を削除する機能を示しています。
define bot remove last message
"(remove last message)"
define bot inform cannot answer question
"I cannot answer the question"
define flow check bot response
bot ...
$allowed = execute output_moderation
$is_blocked = execute block_list(file_name=block_list.txt)
if not $allowed
bot remove last message
bot inform cannot answer question
if $is_blocked
bot remove last message
bot inform cannot answer question
定義されている処理を順に説明すると、チャットボットが自身の発言を取り消す処理と取り消した後に回答できない旨を伝える関数を定義しています。そしてそれらの関数を用いて、チャットボットの発言を確認するフローを定義し、LLM自身とブロックリストの2つの確認を通じて問題がある場合には発言を取り消す処理を実装しています。
今回は、NeMo GuardrailsというOSSライブラリーを用いて、LLMの出力にガードレールを設定しビジネス適用時のリスクを抑制する方法についてご紹介させていただきました。現在は、LLMのガードレールのフレームワークやライブラリーは数えるほどしか存在しませんが、LLMの社会実装を考える上では根幹となる技術と想定されるため、今後も最新の情報をキャッチアップしていければと思います。
ここまで読んでいただきありがとうございました。
あなたにオススメの記事
2023.12.01
生成AI(ジェネレーティブAI)とは?ChatGPTとの違いや仕組み・種類・活用事例
2023.09.21
DX(デジタルトランスフォーメーション)とは?今さら聞けない意味・定義を分かりやすく解説【2024年最新】
2023.11.24
【現役社員が解説】データサイエンティストとは?仕事内容やAI・DX時代に必要なスキル
2023.09.08
DX事例26選:6つの業界別に紹介~有名企業はどんなDXをやっている?~【2024年最新版】
2023.08.23
LLM(大規模言語モデル)とは?生成AIとの違いや活用事例・課題
2024.03.22
生成AIの評価指標・ベンチマークとそれらに関連する問題点や限界を解説