خدمة تقييم الذكاء الاصطناعي التوليدي في Vertex AI
تربط ميزة vertex-eval adk-eval بخدمة تقييم الذكاء الاصطناعي التوليدي في Vertex AI. تُجرى الأحكام المستندة إلى النماذج على أداة التقييم الآلي للخدمة بدلًا من LLM محلية، كما تُقيَّم مسارات الأدوات بواسطة مقاييس المسارات المعتمدة على الحوسبة في الخدمة. كل استدعاء هو طلب POST واحد إلى projects.locations:evaluateInstances (v1beta1).
الإعداد
[dependencies]
adk-eval = { version = "2.1.0", features = ["vertex-eval"] }
تستخدم المصادقة بيانات اعتماد التطبيقات الافتراضية
(gcloud auth application-default login، أو هوية حمل العمل لحاوية منشورة). يحتاج المستدعي إلى إذن aiplatform.endpoints.predict
(roles/aiplatform.user).
| متغير البيئة | الغرض |
|---|---|
GOOGLE_CLOUD_PROJECT | مشروع GCP الخاص بـ VertexEvalConfig::from_env |
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، وكلاهما ناتج عن إعادة الخدمة زوجًا واحدًا من
{score, explanation} لكل حكم:
- تُشتق الأحكام المنطقية (
equivalentوis_safeوhallucination_free) من الدرجة — وتُعدّ القيمة التي تساوي 0.5 أو تتجاوزها نجاحًا. - يحتوي
issuesعلى تفسير الخدمة كإدخال واحد بدلًا من قائمة محللة.
مقاييس المسار
يحوّل VertexEvalClient::evaluate_trajectory قيم adk-eval ToolUse إلى بنية
Trajectory السلكية (name → toolName، args → JSON-المشفّر
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(())
}
إعدادات نموذج التحكيم
يحدد AutoraterConfig نموذج التحكيم وأخذ العينات
للمقاييس المستندة إلى النموذج؛ ويتجاهله الخادم عند حساب المقاييس المستندة إلى الحساب:
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 منفذ التجاوز الخام: إذ يرسل طلب POST بأي
جسم EvaluateInstancesRequest ويُرجع الاستجابة الخام، مما يتيح الوصول إلى كل
مقياس آخر تدعمه الخدمة (BLEU وROUGE والمقاييس الزوجية ومقاييس استدعاء الأدوات).
معالجة الأخطاء
الأخطاء هي قيم AdkError مهيكلة تحتوي على المكوّن eval
ورموز eval.vertex.* (eval.vertex.rate_limited وeval.vertex.unauthorized
وeval.vertex.invalid_response ...). تُرجع أساليب VertexEvalJudge
EvalError::JudgeError الخاصة بالحزمة، بما يتوافق مع LlmJudge.
انظر أيضًا
- تقييم الوكيل — المُقيِّم والمعايير والمحكّمون المحليون
- نظرة عامة على تقييم Vertex AI Gen AI
- مرجع
projects.locations.evaluateInstancesREST