运行基于计算的评估流水线

您可以在 Vertex AI 上评估基础模型和经过调整的生成式 AI 模型的性能。系统会针对您提供的评估数据集,使用一组指标来评估模型。本页面介绍了通过评估流水线服务进行基于计算的模型评估的工作原理、如何创建评估数据集并设置其格式,以及如何使用 Google Cloud 控制台、Vertex AI API 或 Python 版 Vertex AI SDK 执行评估。

基于计算的模型评估的工作原理

如需评估模型的性能,请先创建包含提示和标准答案对的评估数据集。对于每个对,提示是要评估的输入,标准答案是该提示的理想回答。在评估过程中,评估数据集的每个对中的提示会传递给模型以生成输出。模型生成的输出和来自评估数据集的标准答案用于计算评估指标。

用于评估的指标类型取决于您所评估的任务。下表显示了支持的任务以及用于评估每种任务的指标:

任务 指标
分类 Micro-F1、Macro-F1、Per class F1
摘要 ROUGE-L
问题回答 完全匹配
文本生成 BLEU、ROUGE-L

支持的模型

以下模型支持模型评估:

  • text-bison:基础版本和经过调优的版本。

  • Gemini:除分类以外的所有任务。

准备评估数据集

用于模型评估的评估数据集包含与您要评估的任务相配的提示和标准答案对。数据集必须至少包含一个提示和标准答案对;为获得有意义的指标,至少包含 10 个对。您提供的样本越多,结果就越有意义。

数据集格式

您的评估数据集必须采用 JSON 行 (JSONL) 格式,其中每行包含分别在 input_textoutput_text 字段中指定的单个提示和标准答案对。input_text 字段包含您要评估的提示,output_text 字段包含该提示的理想回答。

input_text 的词元长度上限为 8,192,output_text 的词元长度上限为 1,024。

将评估数据集上传到 Cloud Storage

您可以创建新的 Cloud Storage 存储桶,也可以使用现有存储桶来存储数据集文件。存储桶必须与模型位于同一区域。

存储桶准备就绪后,将数据集文件上传到存储桶。

执行模型评估

您可以使用 REST API 或 Google Cloud 控制台评估模型。

如需执行此任务,您必须向以下各个服务账号授予 Identity and Access Management (IAM) 角色:

服务账号 默认主账号 说明 角色
Vertex AI Service Agent service-PROJECT_NUMBER@gcp-sa-aiplatform.iam.gserviceaccount.com 系统会自动为您的项目预配 Vertex AI Service Agent,并向其授予预定义角色。但是,如果组织政策修改了 Vertex AI Service Agent 的默认权限,则您必须手动向该服务代理授予相应角色。 Vertex AI Service Agent (roles/aiplatform.serviceAgent)
Vertex AI Pipelines 服务账号 PROJECT_NUMBER-compute@developer.gserviceaccount.com 运行流水线的服务账号。使用的默认服务账号是 Compute Engine 默认服务账号。(可选)您可以使用自定义服务账号,而不是默认服务账号。

根据输入和输出数据源,您可能还需要向 Vertex AI Pipelines 服务账号授予其他角色:

数据源 角色 在哪里授予角色
标准 BigQuery 表 BigQuery Data Editor 运行流水线的项目
BigQuery Data Viewer 表所属的项目
标准 BigQuery 表BigQuery 视图 BigQuery Data Editor 运行流水线的项目
BigQuery Data Viewer 视图所属的项目
BigQuery Data Viewer 表所属的项目
包含源 Cloud Storage 文件的 BigQuery 外部表 BigQuery Data Editor 运行流水线的项目
BigQuery Data Viewer 外部表所属的项目
Storage Object Viewer 源文件所属的项目
包含源 Cloud Storage 文件的 BigQuery 外部表BigQuery 视图 BigQuery Data Editor 运行流水线的项目
BigQuery Data Viewer 视图所属的项目
BigQuery Data Viewer 外部表所属的项目
Storage Object Viewer 源文件所属的项目
Cloud Storage 文件 BigQuery Data Viewer 运行流水线的项目

如需创建模型评估作业,请使用 pipelineJobs 方法发送 POST 请求。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:运行流水线组件的 Google Cloud 项目。
  • PIPELINEJOB_DISPLAYNAME:pipelineJob 的显示名称。
  • LOCATION:需要在其中运行流水线组件的区域。目前只支持 us-central1
  • DATASET_URI:参考数据集的 Cloud Storage URI。您可以指定一个或多个 URI。此参数支持通配符。如需详细了解此参数,请参阅 InputConfig
  • OUTPUT_DIR:用于存储评估输出的 Cloud Storage URI。
  • MODEL_NAME:指定发布方模型或经过调整的模型资源,如下所示:
    • 发布方模型publishers/google/models/MODEL@MODEL_VERSION

      示例:publishers/google/models/text-bison@002

    • 经调整的模型projects/PROJECT_NUMBER/locations/LOCATION/models/ENDPOINT_ID

      示例:projects/123456789012/locations/us-central1/models/1234567890123456789

    评估作业不会影响模型或其资源的任何现有部署。

  • EVALUATION_TASK:要评估模型的任务。评估作业会计算一组与该特定任务相关的指标。可接受的值包括:
    • summarization
    • question-answering
    • text-generation
    • classification
  • INSTANCES_FORMAT:数据集的格式。目前只支持 jsonl。如需详细了解此参数,请参阅 InputConfig
  • PREDICTIONS_FORMAT:评估输出的格式。目前只支持 jsonl。如需详细了解此参数,请参阅 InputConfig
  • MACHINE_TYPE:(可选)用于运行评估作业的机器类型。默认值为 e2-highmem-16。如需查看支持的机器类型的列表,请参阅机器类型
  • SERVICE_ACCOUNT:(可选)用于运行评估作业的服务账号。如需了解如何创建自定义服务账号,请参阅配置具有精细权限的服务账号。如果未指定,系统会使用 Vertex AI Custom Code Service Agent
  • NETWORK:(可选)要与评估作业对等互连的 Compute Engine 网络的完全限定名称。网络名称的格式为 projects/PROJECT_NUMBER/global/networks/NETWORK_NAME。如果指定此字段,则需要拥有适用于 Vertex AI 的 VPC 网络对等互连。如果未指定,则评估作业不与任何网络对等互连。
  • KEY_NAME:(可选)客户管理的加密密钥 (CMEK) 的名称。如果已配置,则使用提供的加密密钥对评估作业创建的资源进行加密。密钥名称的格式为 projects/PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY。密钥需要与评估作业处于同一区域。

HTTP 方法和网址:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/pipelineJobs

请求 JSON 正文:

{
  "displayName": "PIPELINEJOB_DISPLAYNAME",
  "runtimeConfig": {
    "gcsOutputDirectory": "gs://OUTPUT_DIR",
    "parameterValues": {
      "project": "PROJECT_ID",
      "location": "LOCATION",
      "batch_predict_gcs_source_uris": ["gs://DATASET_URI"],
      "batch_predict_gcs_destination_output_uri": "gs://OUTPUT_DIR",
      "model_name": "MODEL_NAME",
      "evaluation_task": "EVALUATION_TASK",
      "batch_predict_instances_format": "INSTANCES_FORMAT",
      "batch_predict_predictions_format: "PREDICTIONS_FORMAT",
      "machine_type": "MACHINE_TYPE",
      "service_account": "SERVICE_ACCOUNT",
      "network": "NETWORK",
      "encryption_spec_key_name": "KEY_NAME"
    }
  },
  "templateUri": "https://us-kfp.pkg.dev/vertex-evaluation/pipeline-templates/evaluation-llm-text-generation-pipeline/1.0.1"
}

如需发送请求,请选择以下方式之一:

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/pipelineJobs"

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/pipelineJobs" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应。请注意,为节省空间,系统截断了 pipelineSpec

......
.....
 "state": "PIPELINE_STATE_PENDING",
  "labels": {
    "vertex-ai-pipelines-run-billing-id": "1234567890123456789"
  },
  "runtimeConfig": {
    "gcsOutputDirectory": "gs://my-evaluation-bucket/output",
    "parameterValues": {
      "project": "my-project",
      "location": "us-central1",
      "batch_predict_gcs_source_uris": [
        "gs://my-evaluation-bucket/reference-datasets/eval_data.jsonl"
      ],
      "batch_predict_gcs_destination_output_uri": "gs://my-evaluation-bucket/output",
      "model_name": "publishers/google/models/text-bison@002"
    }
  },
  "serviceAccount": "123456789012-compute@developer.gserviceaccount.com",
  "templateUri": "https://us-kfp.pkg.dev/vertex-evaluation/pipeline-templates/evaluation-llm-text-generation-pipeline/1.0.1",
  "templateMetadata": {
    "version": "sha256:d4c0d665533f6b360eb474111aa5e00f000fb8eac298d367e831f3520b21cb1a"
  }
}

示例 curl 命令

PROJECT_ID=myproject
REGION=us-central1
MODEL_NAME=publishers/google/models/text-bison@002
TEST_DATASET_URI=gs://my-gcs-bucket-uri/dataset.jsonl
OUTPUT_DIR=gs://my-gcs-bucket-uri/output

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/pipelineJobs" -d \
$'{
  "displayName": "evaluation-llm-text-generation-pipeline",
  "runtimeConfig": {
    "gcsOutputDirectory": "'${OUTPUT_DIR}'",
    "parameterValues": {
      "project": "'${PROJECT_ID}'",
      "location": "'${REGION}'",
      "batch_predict_gcs_source_uris": ["'${TEST_DATASET_URI}'"],
      "batch_predict_gcs_destination_output_uri": "'${OUTPUT_DIR}'",
      "model_name": "'${MODEL_NAME}'",
    }
  },
  "templateUri": "https://us-kfp.pkg.dev/vertex-evaluation/pipeline-templates/evaluation-llm-text-generation-pipeline/1.0.1"
}'

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。 如需了解详情,请参阅 Python API 参考文档

import os

from google.auth import default

import vertexai
from vertexai.preview.language_models import (
    EvaluationTextClassificationSpec,
    TextGenerationModel,
)

PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")


def evaluate_model() -> object:
    """Evaluate the performance of a generative AI model."""

    # Set credentials for the pipeline components used in the evaluation task
    credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])

    vertexai.init(project=PROJECT_ID, location="us-central1", credentials=credentials)

    # Create a reference to a generative AI model
    model = TextGenerationModel.from_pretrained("text-bison@002")

    # Define the evaluation specification for a text classification task
    task_spec = EvaluationTextClassificationSpec(
        ground_truth_data=[
            "gs://cloud-samples-data/ai-platform/generative_ai/llm_classification_bp_input_prompts_with_ground_truth.jsonl"
        ],
        class_names=["nature", "news", "sports", "health", "startups"],
        target_column_name="ground_truth",
    )

    # Evaluate the model
    eval_metrics = model.evaluate(task_spec=task_spec)
    print(eval_metrics)
    # Example response:
    # ...
    # PipelineJob run completed.
    # Resource name: projects/123456789/locations/us-central1/pipelineJobs/evaluation-llm-classification-...
    # EvaluationClassificationMetric(label_name=None, auPrc=0.53833705, auRoc=0.8...

    return eval_metrics

如需使用 Google Cloud 控制台创建模型评估作业,请执行以下步骤:

  1. 在 Google Cloud 控制台中,进入 Vertex AI Model Registry 页面。

    转到 Vertex AI Model Registry

  2. 点击要评估的模型的名称。
  3. 评估标签页中,点击创建评估,然后按如下方式进行配置:
    • 目标:选择要评估的任务。
    • 目标列或字段:(仅限分类)输入进行预测的目标列。示例:ground_truth
    • 来源路径:输入或选择评估数据集的 URI。
    • 输出格式:输入评估输出的格式。目前只支持 jsonl
    • Cloud Storage 路径:输入或选择用于存储评估输出的 URI。
    • 类别名称:(仅限分类)输入可能的类别名称的列表。
    • 计算节点数:输入要用于运行评估作业的计算节点数。
    • 机器类型:选择要用于运行评估作业的机器类型。
  4. 点击开始评估

查看评估结果

您可以在创建评估作业时指定的 Cloud Storage 输出目录中找到评估结果。该文件的名称为 evaluation_metrics.json

对于经过调优的模型,您还可以在 Google Cloud 控制台中查看评估结果:

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,进入 Vertex AI Model Registry 页面。

    转到 Vertex AI Model Registry

  2. 点击模型的名称可查看其评估指标。

  3. 评估标签页中,点击要查看的评估运行的名称。

后续步骤