次の方法で共有


テキスト類似性エバリュエーター

このドキュメントでは、 Microsoft Foundry (クラシック) ポータルを参照します。

このドキュメントでは、 Microsoft Foundry (新しい) ポータルを参照します。

AI システムによって生成されたテキスト応答が予想される応答とどの程度一致するかを比較することが重要です。 予想される応答は 、地上の真理と呼ばれます。

生成された応答と地上の真理の間のセマンティック類似性に焦点を当てて、 類似性 のような LLM ジャッジ メトリックを使用します。 または、 F1 スコアBLEUGLEUROUGEMETEOR など、自然言語処理 (NLP) の分野のメトリックを使用し、2 つの間のトークンまたは n グラムの重複に焦点を当てます。

AI 支援エバリュエーターのモデル構成

次のコード スニペットで参照するために、AI 支援エバリュエーターは LLM ジャッジのモデル構成を使用します。

import os
from azure.ai.evaluation import AzureOpenAIModelConfiguration
from dotenv import load_dotenv
load_dotenv()

model_config = AzureOpenAIModelConfiguration(
    azure_endpoint=os.environ["AZURE_ENDPOINT"],
    api_key=os.environ.get("AZURE_API_KEY"),
    azure_deployment=os.environ.get("AZURE_DEPLOYMENT_NAME"),
    api_version=os.environ.get("AZURE_API_VERSION"),
)
endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]  # Sample : https://<account_name>.services.ai.azure.com/api/projects/<project_name>
model_deployment_name = os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "")  # Sample : gpt-4o-mini
dataset_name = os.environ.get("DATASET_NAME", "")
dataset_version = os.environ.get("DATASET_VERSION", "1")

エバリュエーター モデルのサポート

評価者に応じて、LLM ジャッジの AzureOpenAI または OpenAI 推論モデル と非推論モデルがサポートされます。

Evaluators ジャッジとしての推論モデル (例: Azure OpenAI/OpenAI からの o シリーズ モデル) ジャッジとしての非推論モデル (例: gpt-4.1、gpt-4o など) 有効にするには
IntentResolutionTaskAdherenceToolCallAccuracyResponseCompletenessCoherenceFluencySimilarityGroundednessRetrievalRelevance サポートされています サポートされています エバリュエーターの初期化に追加のパラメーター is_reasoning_model=True を設定する
その他のエバリュエーター サポートされていません サポートされています --

詳細な推論を必要とする複雑な評価では、推論のパフォーマンスとコスト効率のバランスを取った 4.1-mini のような強力な推論モデルをお勧めします。

相似

類似性は、生成されたテキストと、クエリに関するグラウンド トゥルースとの間のセマンティック類似性の度合いを測定します。 地上の真理を必要とする他のテキスト類似度メトリックと比較して、このメトリックは、トークンまたは n グラムの単純な重複ではなく、応答のセマンティクスに焦点を当てています。 また、クエリのより広範なコンテキストも考慮します。

類似性の例

from azure.ai.evaluation import SimilarityEvaluator

similarity = SimilarityEvaluator(model_config=model_config, threshold=3)
similarity(
    query="Is Marie Curie born in Paris?", 
    response="According to wikipedia, Marie Curie was not born in Paris but in Warsaw.",
    ground_truth="Marie Curie was born in Warsaw."
)

類似性の出力

出力は、likert スケールの数値スコア (整数 1 から 5) です。 スコアが高いほど、類似性が高いことを意味します。 数値のしきい値 (既定値は 3) を指定すると、この例ではスコアがしきい値= しきい値の場合は>も出力されます。それ以外の場合は失敗します。 理由フィールドを使用して、スコアが高いか低いかを理解します。

{
    "similarity": 4.0,
    "gpt_similarity": 4.0,
    "similarity_result": "pass",
    "similarity_threshold": 3
}

F1 スコア

F1 スコアは、生成されたテキストとグラウンド 真実の間の共有トークンによる類似性を測定します。 精度と再現率の両方に重点を置いています。 F-1 スコアはモデルの生成とグラウンド トゥルースの間で共有されている単語の数の割合を計算します。 この比率は、生成された応答の個々の単語に対して、地上の真理の答えの中のそれらの単語に対して計算されます。 生成と真実の間の共有単語の数は、F1 スコアの基礎です。

  • 有効桁数 は、世代内の単語の合計数に対する共有単語の数の比率です。
  • 再現率 は、地上の真理の単語の合計数に対する共有語の数の比率です。

F1 スコアの例

from azure.ai.evaluation import F1ScoreEvaluator

f1_score = F1ScoreEvaluator(threshold=0.5)
f1_score(
    response="According to wikipedia, Marie Curie was not born in Paris but in Warsaw.",
    ground_truth="Marie Curie was born in Warsaw."
)

F1 スコアの出力

数値スコアは 0 から 1 の浮動小数点数です。 スコアが高いほど良くなります。 数値のしきい値 (既定値は 0.5) を指定すると、スコアがしきい値場合は>、それ以外の場合は失敗も出力されます。

{
    "f1_score": 0.631578947368421,
    "f1_result": "pass",
    "f1_threshold": 0.5
}

BLEU スコア

Bleu スコアは、自然言語処理と機械翻訳で一般的に使用される 2 か国語評価アンダーストゥディ (BLEU) スコアを計算します。 生成されたテキストが参照テキストとどの程度一致するかを測定します。

BLEU の例

from azure.ai.evaluation import BleuScoreEvaluator

bleu_score = BleuScoreEvaluator(threshold=0.3)
bleu_score(
    response="According to wikipedia, Marie Curie was not born in Paris but in Warsaw.",
    ground_truth="Marie Curie was born in Warsaw."
)

BLEU の出力

数値スコアは 0 から 1 の浮動小数点数です。 スコアが高いほど良くなります。 数値のしきい値 (既定値は 0.5) を指定すると、スコアがしきい値場合は>、それ以外の場合は失敗も出力されます。

{
    "bleu_score": 0.1550967560878879,
    "bleu_result": "fail",
    "bleu_threshold": 0.3
}

GLEU スコア

Gleu スコアは、Google-BLEU (GLEU) スコアを計算します。 生成されたテキストと地上の真理の間の共有 n グラムによる類似性を測定します。 BLEU スコアと同様に、精度と再現率の両方に重点を置いています。 これは、文単位の報酬目標を使用して BLEU スコアの欠点に対処します。

GLEU スコアの例

from azure.ai.evaluation import GleuScoreEvaluator

gleu_score = GleuScoreEvaluator(threshold=0.2)
gleu_score(
    response="According to wikipedia, Marie Curie was not born in Paris but in Warsaw.",
    ground_truth="Marie Curie was born in Warsaw."
)

GLEU スコアの出力

数値スコアは 0 から 1 の浮動小数点数です。 スコアが高いほど良くなります。 数値のしきい値 (既定値は 0.5) を指定すると、スコアがしきい値場合は>、それ以外の場合は失敗も出力されます。

{
    "gleu_score": 0.25925925925925924,
    "gleu_result": "pass",
    "gleu_threshold": 0.2
}

ROUGE スコア

ルージュ スコアは、自動要約と機械翻訳の評価に使用される一連のメトリックである、gisting Evaluation (ROUGE) スコアの Recall-Oriented Understudy を計算します。 生成されたテキストと参照の要約の間の重複を測定します。 ROUGE は、生成されたテキストが参照テキストをどの程度カバーしているかを評価する、リコール指向の測定に重点を置いています。 ROUGE スコアは、精度、再現率、F1 スコアで構成されます。

ルージュ スコアの例

from azure.ai.evaluation import RougeScoreEvaluator, RougeType

rouge = RougeScoreEvaluator(rouge_type=RougeType.ROUGE_L, precision_threshold=0.6, recall_threshold=0.5, f1_score_threshold=0.55) 
rouge(
    response="According to wikipedia, Marie Curie was not born in Paris but in Warsaw.",
    ground_truth="Marie Curie was born in Warsaw."
)

ROUGE スコアの出力

数値スコアは 0 から 1 の浮動小数点数です。 スコアが高いほど良くなります。 数値のしきい値 (既定値は 0.5) を指定すると、スコアがしきい値場合は>、それ以外の場合は失敗も出力されます。

{
    "rouge_precision": 0.46153846153846156,
    "rouge_recall": 1.0,
    "rouge_f1_score": 0.631578947368421,
    "rouge_precision_result": "fail",
    "rouge_recall_result": "pass",
    "rouge_f1_score_result": "pass",
    "rouge_precision_threshold": 0.6,
    "rouge_recall_threshold": 0.5,
    "rouge_f1_score_threshold": 0.55
}

METEOR スコア

流星スコアは、生成されたテキストと地上の真理値の間の共有 n グラムによって類似性を測定します。 BLEU スコアと同様に、精度と再現率に重点を置いています。 これは、コンテンツの配置のシノニム、ステミング、言い換えを考慮することで、BLEU スコアなどの他のメトリックの制限に対処します。

METEOR スコアの例

from azure.ai.evaluation import MeteorScoreEvaluator

meteor_score = MeteorScoreEvaluator(threshold=0.9)
meteor_score(
    response="According to wikipedia, Marie Curie was not born in Paris but in Warsaw.",
    ground_truth="Marie Curie was born in Warsaw."
)

流星スコアの出力

数値スコアは 0 から 1 の浮動小数点数です。 スコアが高いほど良くなります。 数値のしきい値 (既定値は 0.5) を指定すると、スコアがしきい値場合は>、それ以外の場合は失敗も出力されます。

{
    "meteor_score": 0.8621140763997908,
    "meteor_result": "fail",
    "meteor_threshold": 0.9
}

テキスト類似性エバリュエーターの使用例


from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    DatasetVersion,
)
import json
import time
from pprint import pprint
from openai.types.evals.create_eval_jsonl_run_data_source_param import CreateEvalJSONLRunDataSourceParam, SourceFileID
from dotenv import load_dotenv
from datetime import datetime


load_dotenv()

endpoint = os.environ[
    "AZURE_AI_PROJECT_ENDPOINT"
]  # Sample : https://<account_name>.services.ai.azure.com/api/projects/<project_name>

connection_name = os.environ.get("CONNECTION_NAME", "")
model_endpoint = os.environ.get("MODEL_ENDPOINT", "")  # Sample: https://<account_name>.openai.azure.com.
model_api_key = os.environ.get("MODEL_API_KEY", "")
model_deployment_name = os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "")  # Sample : gpt-4o-mini
dataset_name = os.environ.get("DATASET_NAME", "")
dataset_version = os.environ.get("DATASET_VERSION", "1")

# Construct the paths to the data folder and data file used in this sample
script_dir = os.path.dirname(os.path.abspath(__file__))
data_folder = os.environ.get("DATA_FOLDER", os.path.join(script_dir, "data_folder"))
data_file = os.path.join(data_folder, "sample_data_evaluation.jsonl")

with DefaultAzureCredential() as credential:

    with AIProjectClient(endpoint=endpoint, credential=credential) as project_client:

        print("Upload a single file and create a new Dataset to reference the file.")
        dataset: DatasetVersion = project_client.datasets.upload_file(
            name=dataset_name or f"eval-data-{datetime.utcnow().strftime('%Y-%m-%d_%H%M%S_UTC')}",
            version=dataset_version,
            file_path=data_file,
        )
        pprint(dataset)

        print("Creating an OpenAI client from the AI Project client")

        client = project_client.get_openai_client()

        data_source_config = {
            "type": "custom",
            "item_schema": {
                "type": "object",
                "properties": {
                    "response": {"type": "string"},
                    "ground_truth": {"type": "string"},
                },
                "required": [],
            },
            "include_sample_schema": False,
        }

        testing_criteria = [
            {
                "type": "azure_ai_evaluator",
                "name": "Similarity",
                "evaluator_name": "builtin.similarity",
                "data_mapping": {
                    "response": "{{item.answer}}",
                    "ground_truth": "{{item.ground_truth}}"
                },
                "initialization_parameters": {
                    "deployment_name": f"{model_deployment_name}",
                    "threshold": 3
                }
            },
            {
                "type": "azure_ai_evaluator",
                "name": "ROUGEScore",
                "evaluator_name": "builtin.rouge_score",
                "data_mapping": {
                    "response": "{{item.answer}}",
                    "ground_truth": "{{item.ground_truth}}"
                },
                "initialization_parameters": {
                    "rouge_type": "rouge1",
                    "f1_score_threshold": 0.5,
                    "precision_threshold": 0.5,
                    "recall_threshold": 0.5
                }
            },
            {
                "type": "azure_ai_evaluator",
                "name": "METEORScore",
                "evaluator_name": "builtin.meteor_score",
                "data_mapping": {
                    "response": "{{item.answer}}",
                    "ground_truth": "{{item.ground_truth}}"
                },
                "initialization_parameters": {
                    "threshold": 0.5
                }
            },
            {
                "type": "azure_ai_evaluator",
                "name": "GLEUScore",
                "evaluator_name": "builtin.gleu_score",
                "data_mapping": {
                    "response": "{{item.answer}}",
                    "ground_truth": "{{item.ground_truth}}"
                },
                "initialization_parameters": {
                    "threshold": 0.5
                }
            },
            {
                "type": "azure_ai_evaluator",
                "name": "F1Score",
                "evaluator_name": "builtin.f1_score",
                "data_mapping": {
                    "response": "{{item.answer}}",
                    "ground_truth": "{{item.ground_truth}}"
                },
                "initialization_parameters": {
                    "threshold": 0.5
                }
            },
            {
                "type": "azure_ai_evaluator",
                "name": "BLEUScore",
                "evaluator_name": "builtin.bleu_score",
                "data_mapping": {
                    "response": "{{item.answer}}",
                    "ground_truth": "{{item.ground_truth}}"
                },
                "initialization_parameters": {
                    "threshold": 0.5
                }
            }
        ]

        print("Creating Eval Group")
        eval_object = client.evals.create(
            name="ai assisted evaluators test",
            data_source_config=data_source_config,
            testing_criteria=testing_criteria,
        )
        print(f"Eval Group created")

        print("Get Eval Group by Id")
        eval_object_response = client.evals.retrieve(eval_object.id)
        print("Eval Run Response:")
        pprint(eval_object_response)

        print("Creating Eval Run")
        eval_run_object = client.evals.runs.create(
            eval_id=eval_object.id,
            name="dataset",
            metadata={"team": "eval-exp", "scenario": "notifications-v1"},
            data_source=CreateEvalJSONLRunDataSourceParam(
                source=SourceFileID(id=dataset.id or "", type="file_id"), type="jsonl"
            ),
        )
        print(f"Eval Run created")
        pprint(eval_run_object)

        print("Get Eval Run by Id")
        eval_run_response = client.evals.runs.retrieve(run_id=eval_run_object.id, eval_id=eval_object.id)
        print("Eval Run Response:")
        pprint(eval_run_response)

        while True:
            run = client.evals.runs.retrieve(run_id=eval_run_response.id, eval_id=eval_object.id)
            if run.status == "completed" or run.status == "failed":
                output_items = list(client.evals.runs.output_items.list(run_id=run.id, eval_id=eval_object.id))
                pprint(output_items)
                print(f"Eval Run Report URL: {run.report_url}")

                break
            time.sleep(5)
            print("Waiting for eval run to complete...")