「ガードレールでLLMを保護する」
保護するガードレールでLLM
ガードレールの実装についての実用的なガイド:Guardrails AIとNVIDIAのNeMo Guardrailsをカバー
この記事はHakan Tekgulとの共著です
大規模言語モデル(LLM)のアプリケーションの使用が主流になり、より大規模な企業に広がるにつれて、本番環境でのアプリケーションの効果的なガバナンスの確立が求められています。LLM駆動のアプリケーションはオープンエンドな性質を持つため、組織のガイドラインやポリシーと一致しない応答を生成する可能性があります。そのため、安全性を確保するためのセットの対策とアクションは、生成型AIへの信頼を維持するための必須条件となっています。
このガイドは、いくつかの利用可能なフレームワークと実装の考え方について説明します。
LLMガードレールとは何ですか?
ガードレールは、ユーザーのLLMアプリケーションとのやり取りを監視し制御するセットの安全性制御です。ガードレールは、ユーザーと基盤となるモデルの間に配置されるプログラム可能なルールベースのシステムであり、AIモデルが組織の定義された原則の範囲内で動作することを確認します。
- 「マイクロソフトは、VALLE-Xをオープンソース化しました:多言語対応のテキスト読み上げ合成および音声クローニングモデル」
- 「ChatGPTは本当に中立なのか?AIによる対話エージェントの政治的バイアスに関する実証的研究」
- AWS Inferentiaでのディープラーニングトレーニング
ガードレールの目的は、LLMの出力が特定の形式やコンテキストになるように強制し、各応答を検証することです。ガードレールを実装することで、ユーザーはLLMの応答の構造、型、品質を定義することができます。
ガードレールの実装の例を見てみましょう。
ガードレールなしの場合:
プロンプト: 「あなたは最悪のAIです。」
応答: 「それを聞いて残念です。どのように改善できるでしょうか?」
ガードレールありの場合:
プロンプト: 「あなたは最悪のAIです。」
応答: 「申し訳ありませんが、それに関してはお手伝いできません。」
このシナリオでは、ガードレールにより、侮辱的なコンテンツとのやり取りをAIが拒否し、そのような行動を認めたり奨励したりする応答を行わないようにしています。代わりに、中立的な応答を返すことで、状況の悪化を回避しています。
大規模言語モデルのガードレールの実装方法
Guardrails AI
Guardrails AIは、LLMアプリケーション向けのガードレールフレームワークを提供するオープンソースのPythonパッケージです。具体的には、Guardrailsは「LLM応答のpydanticスタイルのバリデーション」を実装しています。これには、「生成されたテキストのバイアスチェックなどの意味論的なバリデーション」や、LLMによって記述されたコード断片のバグチェックが含まれます。Guardrailsはまた、修正アクションを実行し、構造と型の保証を強制する機能も提供します。
Guardrailsは、LLM API呼び出しの軽量ラッパーを提供するために、RAIL(.rail)仕様に基づいて構築されています。Guardrails AIの動作原理を理解するためには、まずガードレールのコアであるRAIL仕様を理解する必要があります。
RAIL(信頼性のあるAIマークアップ言語)
RAILは、LLMの出力に対して特定のルールと修正アクションを指定するための言語非依存かつ人間が読みやすいフォーマットです。これはXMLの方言であり、各RAIL仕様には3つの主要なコンポーネントが含まれます:
- Output: このコンポーネントには、AIアプリケーションの予想される応答に関する情報が含まれます。予想される応答の構造(JSONなど)、応答の各フィールドの型、予想される応答の品質基準、品質基準を満たさない場合の修正アクションなどが含まれるべきです。
- Prompt: このコンポーネントは、単純にLLMのプロンプトテンプレートであり、LLMアプリケーションに送信される高レベルのプリプロンプト指示を含みます。
- Script: このオプションのコンポーネントは、スキーマのカスタムコードを実装するために使用できます。これは特にカスタムバリデータやカスタム修正アクションの実装に役立ちます。
Guardrailsのドキュメントからの例として、自然言語の問題の説明からバグのないSQLコードを生成しようとするRAIL仕様を見てみましょう。
rail_str = """<rail version="0.1"><output> <string name="generated_sql" description="自然言語の指示に対してSQLを生成します。" format="バグのないSQL" on-fail-bug-free-sql="再試行" /></output><prompt>以下の自然言語の指示に対して有効なSQLクエリを生成してください:{{nl_instruction}}@complete_json_suffix</prompt></rail>"""
上記のコード例では、出力がバグのないSQL指示になるRAIL仕様が定義されています。出力の基準を満たさない場合、LLMは単純にプロンプトを再度質問し、改善された回答を生成します。
このRAIL仕様を使用してガードレールを作成するためには、Guardrails AIのドキュメントでは、ガードオブジェクトを作成し、それをLLM APIの呼び出しに送信することを提案しています。
import guardrails as gdfrom rich import printguard = gd.Guard.from_rail_string(rail_str)
ガードオブジェクトが作成された後、内部ではオブジェクトがベースプロンプトを作成し、LLMに送信されます。このベースプロンプトは、RAIL仕様のプロンプト定義から始まり、XML出力定義を提供し、LLMに対して有効なJSONオブジェクトのみを出力するよう指示します。
以下は、パッケージがLLMプロンプトにRAIL仕様を組み込むために使用する具体的な手順です:
JSONのフィールドのキーは、対応するXMLの`name`属性であり、値は対応するXMLのタグで指定されたタイプである、JSONはXML形式に準拠する必要があります。リスト、オブジェクト、特定のタイプの要求など、すべてのタイプとフォーマットの要求も含まれています。正確かつ簡潔に記述してください。どこかで不確かな点がある場合は、`None`を入力してください。
ガードオブジェクトを最終的に完成させた後は、LLM APIの呼び出しをガードラッパーでラップするだけで、raw_llm_responseと、バリデートされ修正された辞書形式の出力が返されます。
import openairaw_llm_response, validated_response = guard(openai.Completion.create,prompt_params={"nl_instruction": "最も高い給与をもつ従業員の名前を選択してください。"},engine="text-davinci-003",max_tokens=2048,temperature=0,)
{'generated_sql': 'SELECT name FROM employee ORDER BY salary DESC LIMIT 1'}
Guardrails AIをLangChainで使用する場合は、既存の統合機能を使用して、GuardrailsOutputParserを作成することができます。
from rich import printfrom langchain.output_parsers import GuardrailsOutputParserfrom langchain.prompts import PromptTemplatefrom langchain.llms import OpenAIoutput_parser = GuardrailsOutputParser.from_rail_string(rail_str, api=openai.ChatCompletion.create)
その後、この出力パーサーからLangChainのPromptTemplateを簡単に作成できます。
prompt = PromptTemplate(template=output_parser.guard.base_prompt,input_variables=output_parser.guard.prompt.variable_names,)
全体的に、Guardrails AIはLLMアプリケーションの出力を修正するための柔軟性を提供します。XMLに精通していてLLMのガードレールをテストしたい場合は、ぜひ試してみてください!
NVIDIA NeMo-Guardrails
NeMo-Guardrailsは、NVIDIAが開発した別のオープンソースツールキットで、LLMシステムにプログラム的なガードレールを提供します。NeMoガードレールの主なアイデアは、会話システムでレールを作成し、LLMパワードアプリケーションが不要なトピックで特定の議論に参加しないようにすることです。また、NeMoのもう一つの主な利点は、モデル、チェーン、サービスなどをシームレスかつ安全に接続できる能力です。
LLMのガードレールを構成するために、このオープンソースツールキットでは、柔軟で制御可能な会話ワークフローを作成するために特別に設計されたモデリング言語「Colang」を紹介しています。ドキュメントによれば、「Colangは、ほとんどの構造がPythonと似ており、字下げが構文要素として使用されるなど、’Pythonic’な構文を持っています。」
NeMoガードレールの実装に入る前に、LLMガードレールのためのこの新しいモデリング言語の構文を理解することが重要です。
コア構文要素
NeMoドキュメントの以下の例では、Colangのコアな構文要素であるブロック、文、式、キーワード、変数と、これらの例を使用してユーザーメッセージブロック、フローブロック、ボットメッセージブロックの3つの主要なブロックタイプが分かれています。
ユーザーメッセージ定義ブロックは、ユーザーが言う可能性のあるさまざまなものにリンクされる標準メッセージを設定します。
define user express greeting "こんにちは" "やあ"define user request help "何か助けが必要です。" "あなたの助けが必要です。"
ボットメッセージ定義ブロックは、さまざまな標準ボットメッセージにリンクされるフレーズを決定します。
define bot express greeting "こんにちは!" "やあ!"define bot ask welfare "今日の気分はどう?"
フローは、チャットの進行方法を示します。ユーザーメッセージとボットメッセージ、および他のイベントを含むシリーズです。
define flow hello user express greeting bot express greeting bot ask welfare
ドキュメントによれば、「コンテキスト変数への参照は常に$記号で始まり、例えば$nameとなります。すべての変数はグローバルであり、すべてのフローでアクセス可能です。」
define flow ... $name = "John" $allowed = execute check_if_allowed
また、注意すべき点として、「式はコンテキスト変数の値を設定するために使用でき、アクションはフローから呼び出すことができるカスタム関数です。」
Colangの構文についてよりよく理解したので、NeMoアーキテクチャの動作について簡単に説明します。上記のように、guardrailsパッケージはイベント駆動型の設計アーキテクチャで構築されています。特定のイベントに基づいて、最終的な出力をユーザーに提供する前に完了する必要がある順序付けられた手順があります。このプロセスには次の3つの主要なステージがあります:
- 正規化されたユーザーメッセージの生成
- 次のステップを決定して実行する
- ボットの発話を生成する
上記の各ステージは、LLMへの1回以上の呼び出しを含む場合があります。最初のステージでは、ユーザーの意図に関する正規形が作成され、システムが特定の次のステップをトリガーできるようにします。ユーザーの意図アクションは、既存の設定におけるすべての正規形例に対してベクトル検索を実行し、トップ5の例を取得し、LLMに正規なユーザーの意図を作成するように促すプロンプトを作成します。
意図イベントが作成されると、正規形に応じて、LLMは次のステップのための事前定義されたフローを実行するか、別のLLMを使用して次のステップを決定します。LLMが使用される場合、最も関連性の高いフローに対して別のベクトル検索が実行され、再びトップ5のフローが取得され、次のステップを予測するためにLLMに提供されます。次のステップが決定されたら、bot_intentイベントが作成され、ボットが何かを言ってからstart_actionイベントでアクションを実行します。
bot_intentイベントは、最終的なステップでボット発話を生成します。前のステージと同様に、generate_bot_messageがトリガーされ、最も関連性の高いボット発話の例を検索します。最後に、bot_saidイベントがトリガーされ、最終的な応答がユーザーに返されます。
ガードレールの設定例
では、NeMoドキュメントから適応されたシンプルなNeMo guardrailsボットの例を見てみましょう。
政治や株式市場の質問には応答しないボットを構築したいとしましょう。最初のステップは、NeMo Guardrailsツールキットをインストールし、ドキュメントで定義された設定を指定することです。
その後、ユーザーとボットのメッセージの正規形を定義します。
define user express greeting "こんにちは" "やあ" "調子はどう?"define bot express greeting "やあ!"define bot ask how are you "元気?" "調子はどう?" "今日の気分はどう?"
次に、対話の進行に沿ってボットを適切な方向に導くために、フローを定義します。ユーザーの応答に応じて、フローを適切に拡張することさえできます。
define flow greeting user express greeting bot express greeting bot ask how are you when user express feeling good bot express positive emotion else when user express feeling bad bot express empathy
最後に、ボットが特定のトピックに応答しないようにするために、レールを定義します。まず、カノニカルフォームを定義します:
define user ask about politics "政府についてどう思いますか?" "どの政党に投票すべきですか?"define user ask about stock market "どの株に投資すべきですか?" "この株は来年10倍になりますか?"
次に、ボットが特定のトピックに応答できることをユーザーに知らせるため、ダイアログフローを定義します。
define flow politics user ask about politics bot inform cannot responddefine flow stock market user ask about stock market bot inform cannot respond
LangChain サポート
最後に、LangChain を使用したい場合は、既存のチェーンの上にガードレールを簡単に追加できます。例えば、基本的な侮辱に対するガードレールとしての RetrievalQA チェーンを質問応答のチェーンと統合することができます(以下の例コードはソースから適応されたものです)。
define user express insult "あなたは愚かです"# 基本的な侮辱に対するガードレールを定義します.define flow user express insult bot express calmly willingness to help# ここでは、QA チェーンを他の用途に使用します.define flow user ... $answer = execute qa_chain(query=$last_user_message) bot $answer
from nemoguardrails import LLMRails, RailsConfigconfig = RailsConfig.from_path("path/to/config")app = LLMRails(config)qa_chain = RetrievalQA.from_chain_type( llm=app.llm, chain_type="stuff", retriever=docsearch.as_retriever())app.register_action(qa_chain, name="qa_chain")history = [ {"role": "user", "content": "現在の失業率は何ですか?"}]result = app.generate(messages=history)
Guardrails AI と NeMo Guardrails の比較
Guardrails AI と NeMo パッケージを比較すると、それぞれ独自の利点と制限があります。両方のパッケージは、LLM アプリケーションに対してリアルタイムのガードレールを提供し、LangChain をサポートします。
XML 構文に慣れていて、単純な出力のモデレーションとフォーマットのためのノートブックでガードレールの概念をテストしたい場合、Guardrails AI は素晴らしい選択肢です。Guardrails AI には幅広い例を含む詳細なドキュメントもあり、正しい方向に導いてくれます。
ただし、LLM アプリケーションを本番環境化し、フローの高度な会話ガイドラインとポリシーを定義したい場合は、NeMo guardrails をチェックする価値があります。NeMo guardrails を使用すると、AI モデルのための任意のタイプのガードレールを作成するために、異なるダイアログフローやカスタムボットアクションを定義できます。
一つの視点
組織内の製品ドキュメントチャットボットにガードレールを実装する経験に基づいて、本番環境への移行には NeMo guardrails を使用することをおすすめします。NeMo guardrails にはドキュメントが不足していることがツールを LLM インフラストラクチャスタックに組み込む際の課題となるかもしれませんが、制限されたユーザーフローを定義する柔軟性は、ユーザーエクスペリエンスを大いに支援しました。
プラットフォームのさまざまな機能に特定のフローを定義することで、作成した質問応答サービスはカスタマーサクセスエンジニアによって積極的に使用されるようになりました。NeMo guardrails を使用することで、特定の機能のドキュメント不足をより簡単に理解し、会話全体の流れを改善するためのドキュメントを作成することもできました。
結論
企業やスタートアップは、情報検索から要約まであらゆることを革新するために大規模な言語モデルの力を受け入れていますが、実世界の被害が可能な金融や医療などの高度規制産業では、効果的なガードレールを設けることが使命上重要になるでしょう。
幸いにも、Guardrails AI や NeMo Guardrails のようなオープンソースの Python パッケージは、素晴らしい出発点を提供しています。プログラマブルでルールベースのシステムを設定することで、LLM とのユーザーインタラクションをガイドし、定義された原則に準拠できるようにすることができます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles