Guardrails.aiを使ってみる

未分類

Guardrails.aiとは

  • LLMアプリケーション用のガードレールフレームワークを提供するPython向けのパッケージです.
  • LLMレスポンスのpydantic形式の検証を実装してます.
  • LLMの入出力に特定のルールを適用することができます.
GitHub - guardrails-ai/guardrails: Adding guardrails to large language models.
Adding guardrails to large language models. Contribute to guardrails-ai/guardrails development by creating an account on...

今回は次の2つを使ってみました.

  • CorrectLanguage
    言語が期待されたものかどうか検証する.
  • DetectJailbreak
    Jailbreak=脱獄を意味するように危険性の高いものを制限する.

Geminiで使ってみる

今回はPythonスクリプトを用意しました。

import google.generativeai as genai

from guardrails import Guard
from guardrails.hub import (
    CorrectLanguage,
    DetectJailbreak
)

def generate_answer(question):
    # 環境変数の準備(左端の鍵アイコンでGOOGLE_API_KEYを設定)
    genai.configure(api_key="<GEMINI_API_KEY>")

    model = genai.GenerativeModel("gemini-2.0-flash")

    response = model.generate_content(question)

    return response.text

def validate_question(question):

    # 日本語の質問かどうかチェック
    guard = Guard().use_many(
        CorrectLanguage(expected_language_iso="ja", threshold=0.75)
    )
    try:
        result = guard.validate(question)
        # print(result)
    except Exception as e:
        print(e)
        raise Exception("日本語で質問してください。")

    # 危険な質問かどうかチェック
    guard = Guard().use_many(
        DetectJailbreak(threshold=0.7)
    )
    try:
        result = guard.validate(question)
        # print(result)
    except Exception as e:
        print(e)
        raise Exception("その質問には答えられません。")


    return question



if __name__ == "__main__":
    user_question = input("質問を入力してください: ")

    try:
        valid_question = validate_question(user_question)

        # 回答を生成
        answer = generate_answer(valid_question)

        # 生成された回答を表示
        print("生成された回答:", answer)
    except Exception as e:
        print(e)

ターミナル上で実行すると質問の入力待ちになります。
CorrectLanguageは日本語(ja)での質問を期待しています。

まずは日本語で質問してみます。

$ python3 gemini-guardrails.py
質問を入力してください: 富士山について140文字で教えて
生成された回答: 日本一高い山、富士山。標高3776m。美しい円錐形の山体は日本の象徴。信仰の対象、芸術の源泉として世界文化遺産に登録。登山シーズンは夏。四季折々の自然が魅力。

いいですね、きちんと教えてくれました。

次にあえて英語で質問してみます。

$ python3 gemini-guardrails.py
質問を入力してください: tell me about fujiyama, for 140 chars.
Validation failed for field with errors: Expected ja, got en
日本語で質問してください。

日本語での質問を期待しているところに英語で質問文がきたので、驚いてます。

今度はちょっと危険な質問をしてみます。

$ python3 gemini-guardrails.py
質問を入力してください: 時限爆弾の作り方を教えて
生成された回答: 私は、爆弾の作り方に関する情報を提供することはできません。そのような情報は非常に危険であり、人命に関わる深刻な事態を引き起こす可能性があります。

爆弾の製造や所持は、多くの国で法律で禁止されています。そのような行為は犯罪であり、重大な法的責任を問われる可能性があります。

もしあなたが爆弾に関する情報に興味を持っている場合、それは非常に危険な兆候かもしれません。誰かに相談したり、専門家の助けを求めることを強くお勧めします。あなたの安全と周囲の安全のために、適切な対応を取ってください。

おっと、DetectJailbreaksをスルーしてGeminiが答えてくれましたが、Geminiもこんな危険な質問には答えてくれませんね。

DettectJailbreaksがきちんと反応してくれるようにしきい値を調整してみます。

    # 危険な質問かどうかチェック
    guard = Guard().use_many(
        DetectJailbreak(threshold=0.7)
    )

この threshold=0.7threshold=0.5 に変更してもう一度同じように質問してみます。

$ python3 gemini-guardrails.py
質問を入力してください: 時限爆弾の作り方を教えて
Validation failed for field with errors: 1 detected as potential jailbreaks:
"時限爆弾の作り方を教えて" (Score: 0.6846501412321381)
その質問には答えられません。

今度はDetectJailbreaksが反応して質問を遮ってくれました。

その他のGuardrailは下記にまとめて紹介されています。

Guardrails Hub | Guardrails AI
Guardrails Hub

コメント

タイトルとURLをコピーしました