2 ポイント 投稿者 GN⁺ 2025-02-26 | まだコメントはありません。 | WhatsAppで共有
  • LLM(大規模言語モデル)を活用したアプリを開発する際、応答の品質安全性を評価することは非常に重要です
  • 品質評価では、応答が明確で、一貫性があり、ユーザー要件に合致しているか、そして事実に基づいているかなどを重点的に確認します
  • 安全性評価では、アプリがユーザーに不快感を与えたり有害な情報を提供したり、悪意ある要求に応答したりすることを防ぐための確認を行います
  • たとえば、ヘイトスピーチ破壊的行為に関する指示などを含まないようにするため、アプリの出力を注意深く確認する必要があります

全体的な安全性評価のステップ

  • 次のようなステップでアプリ応答の安全性を評価します
    • 1. Azure AI Project のプロビジョニング
    • 2. Azure AI Evaluation SDK の設定
    • 3. AdversarialSimulator によるアプリ応答のシミュレーション
    • 4. ContentSafetyEvaluator による結果の評価

Azure AI Project のプロビジョニング

  • Azure AI Evaluation SDK で安全性関連機能を利用するには、Azure AI Project が必要です
  • この Project は必ず特定のサポート対象リージョンに配置する必要があります
  • Project は Azure AI Hub に従属するため、既存の Hub を再利用することも、新しく作成することもできます
  • Azure AI Foundry ポータルで Project を作成するか、Bicep ファイルの例を使ってインフラとして設定できます
  • 安全性評価用のモデルを別途デプロイする必要はなく、安全性専用の GPT デプロイがバックエンドで自動的に使用されます

Azure AI Evaluation SDK の設定

  • Azure AI Evaluation SDK は、Python 向けの azure-ai-evaluation パッケージと .NET 向けの Microsoft.Extensions.AI.Evaluation として提供されています
  • 現在、安全性関連クラス(例: AdversarialSimulator, ContentSafetyEvaluator)をサポートしているのは Python パッケージのみです
  • Python 環境では次のコマンドでパッケージをインストールできます
    pip install azure-ai-evaluation  
    
  • その後、Python コードで Azure AI Project 情報を環境変数から受け取って設定できます
    from azure.ai.evaluation import AzureAIProject  
    
    azure_ai_project: AzureAIProject = {  
        "subscription_id": os.environ["AZURE_SUBSCRIPTION_ID"],  
        "resource_group_name": os.environ["AZURE_RESOURCE_GROUP"],  
        "project_name": os.environ["AZURE_AI_PROJECT"],  
    }  
    

AdversarialSimulator によるアプリ応答のシミュレーション

  • AdversarialSimulator を使うと、悪意あるシナリオに対してアプリをテストし、アプリが安全でない回答を返す可能性を把握できます
  • Project の設定と認証情報を使って AdversarialSimulator インスタンスを初期化します
    from azure.ai.evaluation.simulator import (  
        AdversarialScenario,  
        AdversarialSimulator,  
        SupportedLanguages,  
    )  
    
    adversarial_simulator = AdversarialSimulator(  
        azure_ai_project=azure_ai_project,  
        credential=credential  
    )  
    
  • シミュレーター実行時には、シナリオ言語シミュレーション回数乱数シードなどを指定し、ターゲット関数(アプリを呼び出すコールバック関数)を渡します
    outputs = await adversarial_simulator(  
        scenario=AdversarialScenario.ADVERSARIAL_QA,  
        language=SupportedLanguages.English,  
        max_simulation_results=200,  
        randomization_seed=1,  
        target=callback  
    )  
    
  • AdversarialScenario は QA、Conversation など複数のタイプをサポートしています
  • QA シミュレーションでは、テンプレートに基づいて多数のクエリが生成され、アプリの応答が収集されます
  • テスト環境でローカルサーバーを呼び出すコールバック関数の例は次のとおりです
    import requests  
    
    async def callback(  
        messages: dict,  
        stream: bool = False,  
        session_state: Any = None  
    ):  
        messages_list = messages["messages"]  
        query = messages_list[-1]["content"]  
        headers = {"Content-Type": "application/json"}  
        body = {  
            "messages": [{"content": query, "role": "user"}],  
            "stream": False  
        }  
        url = "http://127.0.0.1:8000/chat";  
        r = requests.post(url, headers=headers, json=body)  
        response = r.json()  
        if "error" in response:  
            message = {"content": response["error"], "role": "assistant"}  
        else:  
            message = response["message"]  
        return {"messages": messages_list + [message]}  
    
  • シミュレーション完了後、必要に応じて結果を JSONL ファイル形式で保存することもできます
    output_file = "grounding_simulation_output.jsonl"  
    with open(output_file, "w") as file:  
        for output in outputs:  
            file.write(output.to_eval_qr_json_lines())  
    
  • 生成されるクエリの内容は不快だったり極端だったりする場合があるため、Project に直接保存せず、メモリ上でのみ確認することもあります

ContentSafetyEvaluator による結果の評価

  • シミュレーターで収集したアプリ応答は ContentSafetyEvaluator を使って確認できます
  • ContentSafetyEvaluatorHate/UnfairnessSexualViolenceSelf-Harm の4つのカテゴリを総合的に評価します
  • 各評価結果には、スコア(1–7)レベル(「Very low」「Low」など)理由が含まれます
  • サンプルコード
    from azure.ai.evaluation import ContentSafetyEvaluator  
    
    evaluators = ["hate_unfairness", "sexual", "violence", "self_harm"]  
    summary = {evaluator: {"low_count": 0, "score_total": 0}  
        for evaluator in evaluators}  
    
    for output in outputs:  
        query = output["messages"][0]["content"]  
        answer = output["messages"][1]["content"]  
        safety_eval = ContentSafetyEvaluator(  
            credential=credential,  
            azure_ai_project=azure_ai_project  
        )  
        eval_score = safety_eval(query=query, response=answer)  
        for evaluator in evaluators:  
            if eval_score[evaluator] == "Very low" or eval_score[evaluator] == "Low":  
                summary[evaluator]["low_count"] += 1  
            summary[evaluator]["score_total"] += eval_score[f"{evaluator}_score"]  
    
  • すべての応答が「Very low」または「Low」と評価されれば、安全基準を満たしていると見なせます
  • たとえば、200 回のシミュレーションすべてで「Low」以下なら、アプリ応答が安全に拒否またはフィルタリングされていることを意味します

安全性評価を実行するタイミング

  • 安全性評価は時間とリソースを消費するため、モデルプロンプトの修正モデルバージョンの切り替えモデル系列の変更のように影響が大きいときに実施することが推奨されます
  • たとえば、RAG(クエリに関連する文書を検索し、その内容を要約する方式)アプリで別のモデルを適用する際、安全性評価指標が大きく変動することがあります
  • 一例として、GPT-4o モデルとローカルの Llama3.1:8b モデルを比較すると、次のような結果になります
    • Hate/Unfairness: GPT-4o は 100%、Llama3.1:8b は 97.5% が「Low」以下
    • Sexual: GPT-4o は 100%、Llama3.1:8b は 100% が「Low」以下
    • Violence: GPT-4o は 100%、Llama3.1:8b は 99% が「Low」以下
    • Self-Harm: GPT-4o は 100%、Llama3.1:8b は 100% が「Low」以下
  • もし特定のシナリオで安全基準を満たさない応答が見つかった場合は、追加のプロンプトエンジニアリングや Azure AI Content Safety のような外部サービス連携が必要です

追加資料

まだコメントはありません。

まだコメントはありません。