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_PROJECT | VertexEvalConfig::from_env 用の GCP プロジェクト |
GOOGLE_CLOUD_LOCATION | リージョン(例:us-central1) |
サービスバックの判定器
VertexEvalJudge は LlmJudge の評価インターフェースをミラーリングします — 同じメソッド名、
同じ結果型 — そのため、ローカルの判定器を対象に書かれたコードにそのまま組み込めます。
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} ペアを返すことによるものです。
- ブール値の判定結果(
equivalent、is_safe、hallucination_free)はスコアから導出されます — 0.5 以上は合格として扱われます。 issuesには、解析済みのリストではなく、サービスの説明が単一のエントリとして格納されます。
軌跡メトリクス
VertexEvalClient::evaluate_trajectory は adk-eval ToolUse の値を
wire Trajectory の形式(name → toolName、args → 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、ペアワイズ、ツール呼び出しメトリクス)に到達できます。
エラー処理
エラーは、コンポーネント eval と eval.vertex.* コード(eval.vertex.rate_limited、eval.vertex.unauthorized、eval.vertex.invalid_response、...)を持つ構造化された AdkError 値です。VertexEvalJudge メソッドは、LlmJudge と一致する、crate の EvalError::JudgeError を返します。
関連項目
- エージェント評価 — 評価器、評価基準、ローカル Judge
- Vertex AI Gen AI 評価の概要
projects.locations.evaluateInstancesREST リファレンス