Vertex AI Gen AI Evaluation Service

vertex-eval機能は、adk-evalとVertex AI Gen AI Evaluation Serviceを連携します。モデルベースの判定はローカルの LLMではなく、サービスのautorater上で実行され、ツールの 軌跡はサービスの計算ベースの軌跡メトリクスによってスコアリングされます。各呼び出しは projects.locations:evaluateInstances(v1beta1)への単一のPOSTです。

セットアップ

[dependencies]
adk-eval = { version = "2.1.0", features = ["vertex-eval"] }

認証にはApplication Default Credentials (gcloud auth application-default login、またはデプロイされた コンテナのワークロードID)を使用します。呼び出し元には aiplatform.endpoints.predict権限(roles/aiplatform.user)が必要です。

環境変数目的
GOOGLE_CLOUD_PROJECTVertexEvalConfig::from_env 用の GCP プロジェクト
GOOGLE_CLOUD_LOCATIONリージョン(例:us-central1

サービスバックの判定器

VertexEvalJudgeLlmJudge の評価インターフェースをミラーリングします — 同じメソッド名、 同じ結果型 — そのため、ローカルの判定器を対象に書かれたコードにそのまま組み込めます。

use adk_eval::{VertexEvalClient, VertexEvalConfig, VertexEvalJudge};
use adk_eval::criteria::{Rubric, RubricConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = VertexEvalConfig::from_env()?;
    let judge = VertexEvalJudge::new(VertexEvalClient::new_with_adc(config)?);

    // Semantic equivalence (pointwiseMetricInput under the hood)
    let result = judge
        .semantic_match("The capital is Paris", "Paris is the capital of France", None)
        .await?;
    println!("score={} equivalent={}", result.score, result.equivalent);

    // Rubric-based quality, weight-normalized like LlmJudge
    let rubrics = RubricConfig {
        rubrics: vec![
            Rubric::new("Accuracy", "Response is factually correct").with_weight(2.0),
            Rubric::new("Clarity", "Response is easy to follow"),
        ],
    };
    let quality = judge.evaluate_rubrics("agent output", "task context", &rubrics).await?;
    println!("overall={}", quality.overall_score);

    // Safety and hallucination checks
    let safety = judge.evaluate_safety("agent output").await?;
    let hallucination = judge
        .detect_hallucinations("agent output", "provided context", Some("ground truth"))
        .await?;
    println!("safe={} grounded={}", safety.is_safe, hallucination.hallucination_free);
    Ok(())
}

LlmJudge との違いは、サービスが判定ごとに 1 つの {score, explanation} ペアを返すことによるものです。

  • ブール値の判定結果(equivalentis_safehallucination_free)はスコアから導出されます — 0.5 以上は合格として扱われます。
  • issues には、解析済みのリストではなく、サービスの説明が単一のエントリとして格納されます。

軌跡メトリクス

VertexEvalClient::evaluate_trajectory は adk-eval ToolUse の値を wire Trajectory の形式(nametoolNameargs → JSON-encoded toolInput)にマッピングし、スコアを返します:

TrajectoryMetric意味
ExactMatch軌跡が完全に一致する場合は 1、それ以外は 0
InOrderMatchすべての参照ツール呼び出しが順番どおりに現れる場合は 1、それ以外は 0
AnyOrderMatchすべての参照ツール呼び出しが順不同で現れる場合は 1、それ以外は 0
Precision予測されたツール呼び出しの平均適合率
Recall参照ツール呼び出しの平均再現率
use adk_eval::{TrajectoryMetric, VertexEvalClient, VertexEvalConfig};
use adk_eval::schema::ToolUse;
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = VertexEvalClient::new_with_adc(VertexEvalConfig::from_env()?)?;

    let predicted = vec![ToolUse::new("get_weather").with_args(json!({ "city": "Paris" }))];
    let reference = predicted.clone();

    let score = client
        .evaluate_trajectory(TrajectoryMetric::ExactMatch, &predicted, &reference)
        .await?;
    assert_eq!(score, 1.0);
    Ok(())
}

Judge モデルの設定

AutoraterConfigは、モデルベースのメトリクスに使用する Judge モデルとサンプリングを選択します。サーバーは、計算ベースのメトリクスではこの設定を無視します。

use adk_eval::{AutoraterConfig, VertexEvalClient, VertexEvalConfig};

fn build() -> adk_core::Result<VertexEvalClient> {
    let client = VertexEvalClient::new_with_adc(VertexEvalConfig::from_env()?)?
        .with_autorater_config(
            AutoraterConfig::new()
                .with_autorater_model(
                    "projects/p/locations/us-central1/publishers/google/models/gemini-3.7-flash",
                )
                .with_sampling_count(1),
        );
    Ok(client)
}

カスタムメトリクス

evaluate_pointwiseは任意の PointwiseMetricSpec を受け取ります。metricPromptTemplateには、インスタンスオブジェクトからサーバー側でレンダリングされる {placeholder} 変数が含まれます。

use adk_eval::{PointwiseMetricSpec, VertexEvalClient, VertexEvalConfig};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = VertexEvalClient::new_with_adc(VertexEvalConfig::from_env()?)?;

    let spec = PointwiseMetricSpec::new(
        "Rate the politeness of the response from 0.0 to 1.0.\n\nResponse:\n{response}",
    );
    let result = client
        .evaluate_pointwise(&spec, &json!({ "response": "Thanks for asking!" }))
        .await?;
    println!("score={:?} explanation={:?}", result.score, result.explanation);
    Ok(())
}

evaluate_instancesは、生のエスケープハッチです。任意の EvaluateInstancesRequest 本文を POST し、生のレスポンスを返すことで、サービスがサポートする他のすべてのメトリクス(BLEU、ROUGE、ペアワイズ、ツール呼び出しメトリクス)に到達できます。

エラー処理

エラーは、コンポーネント evaleval.vertex.* コード(eval.vertex.rate_limitedeval.vertex.unauthorizedeval.vertex.invalid_response、...)を持つ構造化された AdkError 値です。VertexEvalJudge メソッドは、LlmJudge と一致する、crate の EvalError::JudgeError を返します。

関連項目

Vertex AI Gen AI Evaluation Service - ADK-Rust ドキュメント | ADK-Rust