Service dâĂ©valuation Gen AI de Vertex AI
La fonctionnalitĂ© vertex-eval relie adk-eval au service dâĂ©valuation Gen AI de Vertex AI. Les jugements fondĂ©s sur des modĂšles sont exĂ©cutĂ©s par lâautorater du service plutĂŽt que par un LLM local, et les trajectoires des outils sont Ă©valuĂ©es par les mĂ©triques de trajectoire basĂ©es sur le calcul du service. Chaque appel est un POST unique vers projects.locations:evaluateInstances (v1beta1).
Configuration
[dependencies]
adk-eval = { version = "2.1.0", features = ["vertex-eval"] }
Lâauthentification utilise les identifiants par dĂ©faut de lâapplication
(gcloud auth application-default login ou lâidentitĂ© de charge de travail dâun
conteneur dĂ©ployĂ©). Lâappelant a besoin de lâautorisation aiplatform.endpoints.predict
(roles/aiplatform.user).
| Variable dâenvironnement | Objet |
|---|---|
GOOGLE_CLOUD_PROJECT | Projet GCP pour VertexEvalConfig::from_env |
GOOGLE_CLOUD_LOCATION | Région, par ex. us-central1 |
Juge adossé à un service
VertexEvalJudge reproduit l'interface d'Ă©valuation de LlmJudge â mĂȘmes noms de mĂ©thodes,
mĂȘmes types de rĂ©sultats â et s'intĂšgre donc au code Ă©crit pour le juge local :
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(())
}
Différences par rapport à LlmJudge, toutes deux dues au fait que le service renvoie une
paire {score, explanation} par jugement :
- Les verdicts booléens (
equivalent,is_safe,hallucination_free) sont dĂ©rivĂ©s du score â une valeur supĂ©rieure ou Ă©gale Ă 0.5 est considĂ©rĂ©e comme une rĂ©ussite. issuescontient l'explication du service sous la forme d'une seule entrĂ©e au lieu d'une liste analysĂ©e.
Métriques de trajectoire
VertexEvalClient::evaluate_trajectory mappe les valeurs adk-eval ToolUse sur
la structure Trajectory du format filaire (name â toolName, args â JSON-encodĂ©
toolInput) et renvoie le score :
TrajectoryMetric | Signification |
|---|---|
ExactMatch | 1 si les trajectoires correspondent exactement, sinon 0 |
InOrderMatch | 1 si tous les appels dâoutils de rĂ©fĂ©rence apparaissent dans lâordre, sinon 0 |
AnyOrderMatch | 1 si tous les appels dâoutils de rĂ©fĂ©rence apparaissent dans nâimporte quel ordre, sinon 0 |
Precision | PrĂ©cision moyenne des appels dâoutils prĂ©dits |
Recall | Rappel moyen des appels dâoutils de rĂ©fĂ©rence |
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(())
}
Configuration du modĂšle juge
AutoraterConfig sĂ©lectionne le modĂšle juge et lâĂ©chantillonnage pour les
mĂ©triques fondĂ©es sur un modĂšle ; le serveur lâignore pour les mĂ©triques
fondées sur le calcul :
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)
}
Métriques personnalisées
evaluate_pointwise accepte nâimporte quel PointwiseMetricSpec â le
metricPromptTemplate contient des variables {placeholder} rendues
cĂŽtĂ© serveur Ă partir de lâobjet dâinstance :
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 constitue le mĂ©canisme de dernier recours brut : il envoie une requĂȘte POST avec nâimporte quel
corps EvaluateInstancesRequest et renvoie la réponse brute, donnant accÚs à toutes les
autres mĂ©triques prises en charge par le service (BLEU, ROUGE, par paires, mĂ©triques dâappels dâoutils).
Gestion des erreurs
Les erreurs sont des valeurs structurées AdkError avec le composant eval et des
codes eval.vertex.* (eval.vertex.rate_limited, eval.vertex.unauthorized,
eval.vertex.invalid_response, ...). Les méthodes VertexEvalJudge renvoient le
EvalError::JudgeError du crate, conformément à LlmJudge.
Voir aussi
- Ăvaluation des agents â lâĂ©valuateur, les critĂšres et les juges locaux
- PrĂ©sentation de lâĂ©valuation Vertex AI Gen AI
- Référence
projects.locations.evaluateInstancesREST