你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
注释
本文档指 Microsoft Foundry (新) 门户。
请务必比较 AI 系统生成的文本响应与预期响应的接近程度。 预期的反应被称为 地面真相。
使用 LLM 判断指标(如 相似性 ),重点介绍生成的响应与基本真相之间的语义相似性。 或者,使用自然语言处理(NLP)字段中的指标,包括 F1 分数、 BLEU、 GLEU、 ROUGE 和 METEOR ,重点是两者之间令牌或 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 等) | 若要为 |
|---|---|---|---|
IntentResolution、TaskAdherence、ToolCallAccuracy、ResponseCompleteness、Coherence、Fluency、Similarity、Groundedness、Retrieval、Relevance |
已支持 | 已支持 | 在初始化计算器时设置其他参数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."
)
相似性输出
输出是类似比例的数字分数,整数 1 到 5。 更高的分数意味着更高的相似性。 给定数值阈值(默认值为 3),本示例还会输出分数 = 阈值时>,否则也会失败。 使用原因字段了解分数高或低的原因。
{
"similarity": 4.0,
"gpt_similarity": 4.0,
"similarity_result": "pass",
"similarity_threshold": 3
}
F1 分数
F1 分数通过生成的文本和地面真相之间的共享令牌来衡量相似性。 它侧重于精度和召回率。 F1 分数计算模型生成与基准真值之间的共用字词数的比率。 该比率根据生成的响应中针对基本真理答案中的单词的单个单词计算。 这一代和真相之间的共享单词数是 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 分数计算在自然语言处理和机器翻译中常用的双语评估不足(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 分数
Rouge 分数计算吉斯廷评估(ROUGE)分数的 Recall-Oriented 欠学,这是一组用于评估自动汇总和机器翻译的指标。 它度量生成的文本与参考摘要之间的重叠。 ROUGE 注重使用以召回为导向的措施,来评估生成的文本与参考文本之间的覆盖程度。 ROUGE 分数包括精准率、召回率和 F1 分数。
ROUGE 分数示例
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评分)的限制。
流星分数示例
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...")