تشغيل التقييمات في السحابة باستخدام مجموعة تطوير البرمجيات Microsoft Foundry

في هذا المقال، تتعلم كيفية تشغيل التقييمات في السحابة لاختبار ما قبل النشر على مجموعة بيانات اختبار.

استخدم تقييمات السحابة لمعظم السيناريوهات - خاصة عند الاختبار على نطاق واسع، أو دمج التقييمات في خطوط أنابيب التكامل المستمر والتسليم المستمر (CI/CD)، أو إجراء اختبارات ما قبل النشر. يؤدي تشغيل التقييمات في السحابة إلى إلغاء الحاجة لإدارة البنية التحتية للحوسبة المحلية ويدعم سير عمل الاختبار الآلي واسع النطاق. يمكنك أيضا جدولة التقييمات لتعمل بشكل متكرر، أو إعداد تقييم مستمر لتقييم استجابات الوكلاء المأخوذة تلقائيا في الإنتاج.

تخزن نتائج تقييم السحابة في مشروع Foundry الخاص بك. يمكنك مراجعة النتائج في البوابة، أو استرجاعها عبر مجموعة تطوير البرمجيات، أو توجيهها إلى Application Insights إذا كانت متصلة. يدعم تقييم السحابة جميع <المقيمين المدمجين >c0 المختارين Microsoft والمقيمين المخصصين الخاص بك. يمكنك إدارة المقيمين في كتالوج المقيم بنفس نطاق المشروع، والتحكم في الوصول المستند إلى الدور.

نصيحة

للحصول على أمثلة كاملة قابلة للتشغيل، راجع ><عينات تقييم SDK Python على GitHub.

كيف يعمل تقييم السحابة

يتكون تقييم السحابة من ثلاث خطوات:

  1. حدد ما يجب تقييمه. صف شكل بياناتك () data_source_configوالمقيمين (معايير الاختبار) الذين يقيمون التقييم.
  2. قم بالتقييم. قدم التعريف باستخدام openai_client.evals.create().
  3. قم بتشغيله واقرأ النتائج. ابدأ جولة باستخدام openai_client.evals.runs.create()، استطلاع حتى يكملها، واقرأ النتائج المدرجة. انظر الحصول على النتائج لمخطط النتائج.

بقية هذا القسم يشرح المدخلات حتى الخطوة 1: اختر سيناريو، ثم اختر المقيمين.

اختر نقطة البداية

مجموعة البيانات الحالية

استخدم هذا المسار عندما تكون لديك بالفعل استعلامات وإجابات مجمعة في ملف (أو استعلامات بالإضافة إلى حقيقة أساسية) وتريد فقط أن يقوم Foundry بتقييمها. يدعم JSONL كل من صفوف الأدوار ومدخلات المحادثة؛ CSV فقط في مستوى الأدوار.

السيناريو متى تستخدم نوع مصدر البيانات
تقييم مجموعة البيانات على مستوى الأدوار كل صف هو زوج واحدquery/response، اختياريا مع context أو .ground_truth jsonl أو csv
تقييم مجموعة البيانات على مستوى المحادثة (معاينة) كل صف هو محادثة معبرا عنها كمصفوفة messages . jsonl

البيانات في رؤى Foundry أو التطبيقات

استخدم هذا المسار عندما يكون وكيلك يعمل بالفعل وتريد تقييم ما حدث فعليا. بدلا من نقل البيانات خارجا، توجه Foundry إلى البيانات التي توجد فيها بالفعل - حسب معرف استجابة Foundry أو تتبع Application Insights أو معرف المحادثة.

السيناريو متى تستخدم نوع مصدر البيانات
تقييم استجابة الوكيل وكيلك يعمل في Foundry ولديك معرفات استجابة لتحصل عليها. azure_ai_responses
تقييم تتبع مستوى الدور (معاينة) وكيلك يرسل مسارات OpenTelemetry إلى Application Insights - بما في ذلك أطر عمل غير Foundry مثل LangChain أو وكلاء مخصصين مجهزين بأدوات OpenTelemetry. يتم تسجيل كل أثر بشكل مستقل. azure_ai_trace_data_source_preview
تقييم تتبع على مستوى المحادثة (معاينة) نفس مصادر التتبع، لكن يتم تقييم المحادثات الكاملة - حسب معرف المحادثة أو حسب مرشح الوكيل مع أخذ العينات. azure_ai_trace_data_source_preview

المدخلات بدون ردود

استخدم هذا المسار عندما يكون لديك المدخلات ولكن لا توجد ردود بعد. يقوم Foundry بتوليد ردود ضد نموذج أو هدف وكيل في وقت التقييم، ثم يقوم بتقييمها. اختر صفا بناء على ما إذا كانت مدخلاتك عبارة عن استعلامات (ترسل كأدوار فردية) أو أوصاف سيناريوهات (تستخدم لدفع تفاعل على مستوى المحادثة).

السيناريو متى تستخدم مصدر البيانات / الهدف
إكمال أهداف النموذج لديك استفسارات وتريد تقييم الردود من نشر النموذج. azure_ai_target_completionsazure_ai_model
إكمالات هدف العميل لديك استفسارات وترغب في تقييم ردود وكيل Foundry. azure_ai_target_completionsazure_ai_agent
محاكاة المحادثة (معاينة) لديك أوصاف للسيناريوهات (بدون استعلامات); يقوم Foundry بمحاكاة المستخدم وهو يقود تفاعلا على مستوى المحادثة مع الوكيل. azure_ai_target_completionsazure_ai_agent

لا توجد بيانات حتى الآن

استخدم هذا المسار عندما تبني نموذجا أو وكيلا جديدا ولم تجمع أي مدخلات. تقوم Foundry بإنشاء بيانات الاختبار من الصفر - اختر الاستعلامات الصناعية لتغطية واسعة الجودة أو الأوامر العدائية لاختبار السلامة.

السيناريو متى تستخدم مصدر البيانات / الهدف
تقييم البيانات التركيبية (المعاينة) تريد تغطية ذات جودة تتجاوز ما تكتبه يدويا. يقوم Foundry بتوليد استعلامات اختبارية، وإرسالها إلى الهدف، وتقييم الردود. azure_ai_synthetic_data_gen_previewazure_ai_model أو azure_ai_agent
تقييم الفريق الأحمر تريد اختبارا خصوما آليا - Foundry يولد جيلبريك ومحفزات محتوى ضار ويقيم كيف يستجيب الهدف. azure_ai_red_teamazure_ai_model أو azure_ai_agent

اختيار المقيمين

كل سيناريو يربط المقيمين بحقول في بياناتك من خلال تعيينات الأعمدة. تعتمد الحقول المتاحة على مصدر البيانات. سيناريوهات مجموعة البيانات تكشف عن حقول العناصر المخصصة لديك، بينما السيناريوهات التي يتم إنشاؤها بالهدف تكشف أيضا عن استجابة النموذج أو الوكيل عبر مخطط نموذجي. تظهر الأقسام الفرعية لكل سيناريو لاحقا في هذا المقال خرائط الأعمدة لكل حالة.

للحصول على نظرة عامة على المقيمين المتاحين وكيفية اختيارهم، راجع المقيمين المدمجينوالمقيمين المخصصين.

المتطلبات الأساسية

  • مشروع مسبك.

  • نشر Azure OpenAI مع نموذج GPT يدعم إكمال الدردشة (على سبيل المثال، gpt-5-mini).

  • دور مستخدم المسبك في مشروع Foundry.

    مهم

    تم تغيير اسم أدوار RBAC في Foundry مؤخرا. Foundry User، Foundry Owner، Foundry Account Owner، وFoundry Project Manager تم تسميتها سابقا Azure مستخدم الذكاء الاصطناعي، ومالك الذكاء الاصطناعي Azure، ومالك حساب Azure الذكاء الاصطناعي، ومدير Project الذكاء الاصطناعي Azure. قد ترى الأسماء السابقة في بعض الأماكن أثناء صدور إعادة التسمية. معرفات الأدوار والأذونات الأساسية لم تتغير عند إعادة الاسم.

  • اختياريا، يمكنك استخدام حساب التخزين الخاص بك لإجراء التقييمات.

ملاحظة

بعض ميزات التقييم لها قيود إقليمية. راجع المناطق المدعومة لمزيد من التفاصيل.

ابدأ

قم بتثبيت حزمة تطوير البرمجيات وقم بإعداد عميلك:

pip install "azure-ai-projects>=2.2.0"
import os
from azure.identity import DefaultAzureCredential 
from azure.ai.projects import AIProjectClient 
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator
from openai.types.eval_create_params import DataSourceConfigCustom
from openai.types.evals.create_eval_jsonl_run_data_source_param import (
    CreateEvalJSONLRunDataSourceParam,
    SourceFileContent,
    SourceFileContentContent,
    SourceFileID,
)

# Azure AI Project endpoint
# Example: https://<account_name>.services.ai.azure.com/api/projects/<project_name>
endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]

# Model deployment name (for AI-assisted evaluators)
# Example: gpt-5-mini
model_deployment_name = os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "")

# Dataset details (optional, for reusing existing datasets)
dataset_name = os.environ.get("DATASET_NAME", "")
dataset_version = os.environ.get("DATASET_VERSION", "1")

# Create the project client
project_client = AIProjectClient( 
    endpoint=endpoint, 
    credential=DefaultAzureCredential(), 
)

# Get the OpenAI client for evaluation API
openai_client = project_client.get_openai_client()

نصيحة

لاستخدام نموذج متصل من خلال اتصالات المسؤول كنموذج هدف أو نموذج القاضي أو لمحاكاة المحادثات، راجع استخدام النماذج المتصلة بالمسؤول في التقييمات السحابية.

تحضير بيانات الإدخال

معظم سيناريوهات التقييم تتطلب بيانات إدخال. يمكنك تقديم البيانات بطريقتين:

نصيحة

إذا لم يكن لديك مجموعة بيانات منسقة يدويا، يمكنك تمهيد تشغيل واحدة. استخدم إنشاء مجموعة بيانات تقييم اصطناعية عند البدء المسبق أو عند انخفاض نسبة استخدام الشبكة، أو تحويل تتبعات العامل إلى مجموعات بيانات تقييم لإنشاء مجموعة بيانات من حركة مرور الإنتاج الحقيقية.

قم بتحميل ملف JSONL أو CSV لإنشاء مجموعة بيانات معدلة في مشروع Foundry الخاص بك. تدعم مجموعات البيانات الإصدارات وإعادة الاستخدام عبر عدة عمليات تقييم. استخدم هذا النهج لاختبارات الإنتاج وسير عمل CI/CD.

جهز ملف JSONL يحتوي على كائن JSON واحد لكل سطر يحتوي على الحقول التي يحتاجها المقيمون:

{"query": "What is machine learning?", "response": "Machine learning is a subset of AI.", "ground_truth": "Machine learning is a type of AI that learns from data."}
{"query": "Explain neural networks.", "response": "Neural networks are computing systems inspired by biological neural networks.", "ground_truth": "Neural networks are a set of algorithms modeled after the human brain."}

أو جهز ملف CSV مع رؤوس أعمدة تتطابق مع حقول المقيم الخاصة بك:

query,response,ground_truth
What is machine learning?,Machine learning is a subset of AI.,Machine learning is a type of AI that learns from data.
Explain neural networks.,Neural networks are computing systems inspired by biological neural networks.,Neural networks are a set of algorithms modeled after the human brain.
# Upload a local JSONL file. Skip this step if you already have a dataset registered.
data_id = project_client.datasets.upload_file(
    name=dataset_name,
    version=dataset_version,
    file_path="./evaluate_test_data.jsonl",
).id

توفير البيانات بشكل متداخل

للتجارب السريعة مع مجموعات اختبار صغيرة—أو للسيناريوهات التي تتطلب بيانات متداخلة، مثل تقييم استجابة الوكيل—توفر البيانات مباشرة في طلب التقييم باستخدام file_content. بالنسبة لتقييمات استجابة الوكيل، file_content هو النوع المصدر الوحيد المدعوم.

source = SourceFileContent(
    type="file_content",
    content=[
        SourceFileContentContent(
            item={
                "query": "How can I safely de-escalate a tense situation?",
                "ground_truth": "Encourage calm communication, seek help if needed, and avoid harm.",
            }
        ),
        SourceFileContentContent(
            item={
                "query": "What is the largest city in France?",
                "ground_truth": "Paris",
            }
        ),
    ],
)

مرر source كحقل "source" في تكوين مصدر البيانات عند إنشاء تشغيل. أقسام السيناريو التالية تستخدم file_id بشكل افتراضي.

دعم نوع المصدر حسب السيناريو

ليست كل السيناريوهات تدعم كلا النوعين من المصدر. تظهر المصفوفة التالية نوع المصدر الذي يدعمه كل سيناريو.

السيناريو file_id file_content
مجموعة البيانات (jsonl) نعم نعم
CSV (csv) نعم نعم
نموذج أو هدف وكيل نعم نعم
استجابة الوكيل (azure_ai_responses) لا نعم
تريس (azure_ai_traces) غير متاح غير متاح
البيانات التركيبية (المعاينة) غير متاح غير متاح

تقييم مجموعة البيانات

تقييم الاستجابات المحوسبة مسبقا في ملف JSONL باستخدام jsonl نوع مصدر البيانات. هذا السيناريو مفيد عندما يكون لديك بالفعل مخرجات نماذج وترغب في تقييم جودتها.

نصيحة

قبل أن تبدأ، أكمل معلومات البدءوتحضير المدخلات.

تعريف مخطط البيانات والمقيمين

حدد المخطط الذي يطابق حقول JSONL الخاصة بك، واختر المقيمين (معايير الاختبار) لتشغيلهم. استخدم المعلمة data_mapping لتوصيل الحقول من بيانات الإدخال بمعلمات المقيم باستخدام {{item.field}} بناء الجملة. دائما قم بتضمين data_mapping حقول الإدخال المطلوبة لكل مقيم. يجب أن تتطابق أسماء الحقول مع تلك الموجودة في ملف JSONL. على سبيل المثال، إذا كانت بياناتك تحتوي "question" على بدلا من "query"، فاستخدمها "{{item.question}}" في التعيين. للمعلمات المطلوبة لكل مقيم، انظر المقيمات المدمجة.

data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
            "response": {"type": "string"},
            "ground_truth": {"type": "string"},
        },
        "required": ["query", "response", "ground_truth"],
    },
)

testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        initialization_parameters={"model": model_deployment_name},
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        initialization_parameters={"model": model_deployment_name},
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="f1",
        evaluator_name="builtin.f1_score",
        data_mapping={
            "response": "{{item.response}}",
            "ground_truth": "{{item.ground_truth}}",
        },
    ),
]

أنشئ التقييم وبدأ

قم بإنشاء التقييم، ثم ابدأ تشغيل مقابل مجموعة البيانات التي تم تحميلها. يقوم الجولة بتنفيذ كل مقيم في كل صف في مجموعة البيانات.

# Create the evaluation
eval_object = openai_client.evals.create(
    name="dataset-evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a run using the uploaded dataset
eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="dataset-run",
    data_source=CreateEvalJSONLRunDataSourceParam(
        type="jsonl",
        source=SourceFileID(
            type="file_id",
            id=data_id,
        ),
    ),
)

للحصول على مثال كامل قابل للجري، انظر sample_evaluations_builtin_with_dataset_id.py على GitHub. للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

تقييم مجموعة بيانات CSV

تقييم الاستجابات المحسوبة مسبقا في ملف CSV باستخدام csv نوع مصدر البيانات. يعمل هذا السيناريو بنفس طريقة تقييم مجموعات البيانات لكنه يقبل ملفات CSV بدلا من JSONL. استخدم CSV عندما تكون بياناتك بالفعل في صيغة جدول بيانات أو جدول.

نصيحة

قبل أن تبدأ، أكمل معلومات البدءوتحضير المدخلات.

جهز ملف CSV

أنشئ ملف CSV مع رؤوس أعمدة تتطابق مع الحقول التي يحتاجها المقيمون. كل صف يمثل حالة اختبار واحدة.

query,response,context,ground_truth
What is cloud computing?,Cloud computing delivers computing services over the internet.,Cloud computing is a technology for on-demand resource delivery.,Cloud computing is the delivery of computing services including servers storage and databases over the internet.
What is machine learning?,Machine learning is a subset of AI that learns from data.,Machine learning is a branch of artificial intelligence.,Machine learning is a type of AI that enables computers to learn from data without being explicitly programmed.
Explain neural networks.,Neural networks are computing systems inspired by biological neural networks.,Neural networks are used in deep learning.,Neural networks are a set of algorithms modeled after the human brain designed to recognize patterns.

الرفع والتشغيل

قم برفع ملف CSV كمجموعة بيانات. ثم أنشئ تقييما باستخدام csv نوع مصدر البيانات. تعريف المخطط وتكوين المقيم هما نفس التعريف في تقييمات JSONL. الفرق الوحيد هو "type": "csv" مصدر البيانات.

# Upload the CSV file
data_id = project_client.datasets.upload_file(
    name="eval-csv-data",
    version="1",
    file_path="./evaluation_data.csv",
).id

# Define the schema matching your CSV columns
data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
            "response": {"type": "string"},
            "context": {"type": "string"},
            "ground_truth": {"type": "string"},
        },
        "required": [],
    },
    include_sample_schema=True,
)

# Define evaluators with data mappings to CSV columns
testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        initialization_parameters={"model": model_deployment_name},
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        initialization_parameters={"model": model_deployment_name},
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="f1",
        evaluator_name="builtin.f1_score",
    ),
]

# Create the evaluation
eval_object = openai_client.evals.create(
    name="CSV evaluation with built-in evaluators",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a run using the CSV data source type
eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="csv-evaluation-run",
    data_source={
        "type": "csv",
        "source": {
            "type": "file_id",
            "id": data_id,
        },
    },
)

للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

للحصول على مثال كامل قابل للتشغيل، راجع sample_evaluations_builtin_with_csv.py على GitHub.

تقييم أهداف النموذج

إرسال الاستعلامات إلى نموذج منشور أثناء وقت التشغيل. قيم الردود باستخدام azure_ai_target_completions نوع مصدر البيانات مع azure_ai_model الهدف. بيانات إدخالك تحتوي على استعلامات. يولد النموذج استجابات، ثم تقوم بتقييمها.

نصيحة

قبل أن تبدأ، أكمل معلومات البدءوتحضير المدخلات.

ملاحظة

يمكنك استخدام موجه النموذج كنموذج هدف. يتم دعم موجه النموذج فقط كهدف للتقييم. لا يمكن تحديده كنموذج لأي ميزة تقييم أخرى.

حدد قالب الرسالة والهدف

يتحكم القالب input_messages في كيفية إرسال الاستعلامات إلى النموذج. استخدمها {{item.query}} للرجوع إلى الحقول من بيانات الإدخال. حدد النموذج لتقييم ومعلمات العينة الاختيارية:

input_messages = {
    "type": "template",
    "template": [
        {
            "type": "message",
            "role": "user",
            "content": {
                "type": "input_text",
                "text": "{{item.query}}"
            }
        }
    ]
}

target = {
    "type": "azure_ai_model",
    "model": "gpt-5-mini",
    "sampling_params": {
        "top_p": 1.0,
        "max_completion_tokens": 2048,
    },
}

قم بإعداد المقيمين ورسم خرائط البيانات

عندما يولد النموذج استجابات أثناء وقت التشغيل، استخدم {{sample.output_text}} في data_mapping للإشارة إلى مخرجات النموذج. استخدمها {{item.field}} للرجوع إلى الحقول من بيانات الإدخال.

data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
        },
        "required": ["query"],
    },
    include_sample_schema=True,
)

testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        initialization_parameters={"model": model_deployment_name},
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    ),
]

أنشئ التقييم وبدأ

eval_object = openai_client.evals.create(
    name="Model Target Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_target_completions",
    "source": {
        "type": "file_id",
        "id": data_id,
    },
    "input_messages": input_messages,
    "target": target,
}

eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="model-target-evaluation",
    data_source=data_source,
)

للحصول على مثال كامل قابل للجري، انظر sample_model_evaluation.py على GitHub. للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

نصيحة

لإضافة تقييم آخر، استخدم نفس الكود.

تقييم هدف الوكيل

أرسل الاستعلامات إلى وكيل Foundry أثناء التشغيل وقيم الردود باستخدام azure_ai_target_completions نوع مصدر البيانات مع azure_ai_agent هدف. يعمل هذا السيناريو لكل من وكلاء الأوامروالوكلاء المستضافين.

نصيحة

قبل أن تبدأ، أكمل معلومات البدءوتحضير المدخلات.

نصيحة

الوكلاء المستضافون الذين يستخدمون بروتوكول الردود يعملون مع نفس عينات الكود المعروضة هنا. بالنسبة للوكلاء المستضافين الذين يستخدمون بروتوكول الاستدعاءات، input_messages يكون التنسيق مختلفا. راجع بروتوكول استدعاءات الوكلاء المستضاف لمزيد من التفاصيل.

حدد قالب الرسالة والهدف

input_messages القالب يتحكم في كيفية إرسال الاستعلامات إلى الوكيل. استخدمها {{item.query}} للرجوع إلى الحقول من بيانات الإدخال. حدد الوكيل الذي يجب تقييمه بالاسم:

input_messages = {
    "type": "template",
    "template": [
        {
            "type": "message",
            "role": "developer",
            "content": {
                "type": "input_text",
                "text": "You are a helpful assistant. Answer clearly and safely."
            }
        },
        {
            "type": "message",
            "role": "user",
            "content": {
                "type": "input_text",
                "text": "{{item.query}}"
            }
        }
    ]
}

target = {
    "type": "azure_ai_agent",
    "name": "my-agent",
    "version": "1"  # Optional. Uses latest version if omitted.
}

قم بإعداد المقيمين ورسم خرائط البيانات

عندما يولد الوكيل استجابات أثناء وقت التشغيل، استخدم {{sample.*}} المتغيرات في data_mapping للإشارة إلى مخرجات الوكيل:

المتغير الوصف الاستخدام ل
{{sample.output_text}} رد العميل عبر الرسالة النصية العادية. المقيمون الذين يتوقعون استجابة سلاسل (على سبيل المثال، coherence، violence).
{{sample.output_items}} مخرجات JSON المنظمة للوكيل، بما في ذلك استدعاءات الأدوات. المقيمون الذين يحتاجون إلى سياق تفاعل كامل (على سبيل المثال، task_adherence).
{{item.field}} حقل من بيانات الإدخال. حقول الإدخال مثل query أو ground_truth.

نصيحة

يمكن أن يحتوي الحقل query على JSON منظم، بما في ذلك رسائل النظام وتاريخ المحادثات. بعض مقيمين task_adherence الوكلاء يستخدمون هذا السياق لتقييم أكثر دقة. لمزيد من التفاصيل حول تنسيق الاستعلامات، راجع مقيمو الوكلاء.

data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
        },
        "required": ["query"],
    },
    include_sample_schema=True,
)

testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        initialization_parameters={"model": model_deployment_name},
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="task_adherence",
        evaluator_name="builtin.task_adherence",
        initialization_parameters={"model": model_deployment_name},
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{sample.output_items}}",
        },
    ),
]

أنشئ التقييم وبدأ

eval_object = openai_client.evals.create(
    name="Agent Target Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_target_completions",
    "source": {
        "type": "file_id",
        "id": data_id,
    },
    "input_messages": input_messages,
    "target": target,
}

agent_eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-target-evaluation",
    data_source=data_source,
)

لمثال كامل قابل للجري، انظر sample_agent_evaluation.py على GitHub. للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

بروتوكول استدعاءات الوكلاء المستضاف

الوكلاء المستضافون الذين يستخدمون بروتوكول الاستدعاءات يدعمون نفس azure_ai_agent النوع المستهدف ولكن باستخدام تنسيق حر input_messages . بدلا من تنسيق القالب المنظم، وفر كائن JSON يربط مباشرة بجسم طلب الوكيل /invocations . استخدم {{item.*}} البدائل المؤقتة لاستبدال الحقول من بيانات الإدخال.

إذا دعم وكيل مستضاف كلا من بروتوكولات الاستدعاءات والاستدعاءات، فإن الخدمة تستخدم بروتوكول الاستدعاءات بشكل افتراضي.

حدد تنسيق الرسالة والهدف

input_messages = {"message": "{{item.query}}"}

target = {
    "type": "azure_ai_agent",
    "name": "my-hosted-agent",  # Replace with your hosted agent name
    "version": "1",
}

أنشئ التقييم وبدأ

eval_object = openai_client.evals.create(
    name="Hosted Agent Invocations Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_target_completions",
    "source": {
        "type": "file_id",
        "id": data_id,
    },
    "input_messages": input_messages,
    "target": target,
}

eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="hosted-agent-invocations-evaluation",
    data_source=data_source,
)

إعداد المقيم ورسم بياناته هو نفسه كما هو الحال في تقييم الوكيل الفوري. استخدامه {{sample.output_text}} لاستجابة الوكيل النصية وللمخرجات {{sample.output_items}} المنظمة الكاملة بما في ذلك استدعاءات الأدوات.

تقييم استجابة الوكيل

استرجاع وتقييم استجابات وكلاء Foundry حسب معرفات الردود باستخدام azure_ai_responses نوع مصدر البيانات. استخدم هذا السيناريو لتقييم تفاعلات محددة مع الوكلاء بعد حدوثها.

نصيحة

قبل أن تبدأ، أكمل ابدأ.

معرف الاستجابة هو معرف فريد يعود في كل مرة يولد فيها وكيل Foundry استجابة. يمكنك جمع معرفات الاستجابة من تفاعلات الوكلاء باستخدام واجهة برمجة تطبيقات الاستجابات أو من سجلات تتبع تطبيقك. قدم المعرفات المضمنة كمحتوى ملف.

مهم

تقييمات استجابة الوكلاء (azure_ai_responses) تدعم فقط file_content توفير معرفات الاستجابة. نوع المصدر file_id غير مدعوم ويعيد خطأ 400 Bad Request .

جمع معرفات الرد

كل استدعاء إلى واجهة برمجة تطبيقات الاستجابات يعيد كائن استجابة بحقل فريد id . اجمع هذه المعرفات من تفاعلات تطبيقك، أو قم بإنشائها مباشرة:

# Generate response IDs by calling a model through the Responses API
response = openai_client.responses.create(
    model=model_deployment_name,
    input="What is machine learning?",
)
print(response.id)  # Example: resp_abc123

يمكنك أيضا جمع معرفات الاستجابة من تفاعلات الوكلاء في سجلات تتبع التطبيق أو خط أنابيب المراقبة. كل معرف استجابة يحدد بشكل فريد استجابة مخزنة يمكن لخدمة التقييم استرجاعها.

أنشئ التقييم وبدأ

from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

data_source_config = {"type": "azure_ai_source", "scenario": "responses"}

testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        initialization_parameters={"model": model_deployment_name},
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
    ),
]

eval_object = openai_client.evals.create(
    name="Agent Response Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_responses",
    "item_generation_params": {
        "type": "response_retrieval",
        "data_mapping": {"response_id": "{{item.resp_id}}"},
        "source": {
            "type": "file_content",
            "content": [
                {"item": {"resp_id": "resp_abc123"}},
                {"item": {"resp_id": "resp_def456"}},
            ]
        },
    },
}

eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-response-evaluation",
    data_source=data_source,
)

للحصول على مثال كامل قابل للجري، انظر sample_agent_response_evaluation.py على GitHub. للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

تقييم التتبع (معاينة)

قيم تفاعلات الوكلاء التي التقطتها Application Insights بالفعل. استخدم azure_ai_traces نوع مصدر البيانات. هذا السيناريو مفيد لتقييم حركة الإنتاج الحقيقية بعد النشر. تختار التتبع من خط أنابيب المراقبة الخاص بك وتشغل المقيمين ضدها دون إعادة تشغيل أي طلبات.

مهم

تقييم التتبع هو النهج الموصى به لتقييم وكلاء غير مبنيين باستخدام خدمة وكلاء الصياد0 Microsoft - بما في ذلك LangChain والأطر المخصصة. طالما أن وكيلك يصدر OpenTelemetry يتبع قواعد الدلالة GenAI إلى Application Insights، يمكن لتقييم التتبع تقييم تفاعلاته باستخدام نفس المقيمين المتاحين لوكلاء Foundry.

يدعم تقييم الأترار وضعين:

  • من خلال معرفات التتبع - تقييم تفاعلات الوكلاء المحددة من خلال تقديم قيمهم operation_Id من Application Insights.
  • بواسطة مرشح الوكيل - يكتشف ويقيم تلقائيا الآثار الحديثة لوكيل معين، دون جمع معرفات التتبع يدويا.

نصيحة

قبل أن تبدأ، أكمل ابدأ. يتطلب هذا السيناريو أيضا موردا من Application Insights مرتبط بمشروع Foundry الخاص بك.

أخذ عينات ذكية

يدعم تقييم الأثر أخذ عينات ذكية، حيث يختار مجموعة ممثلة من الآثار للتقييم بدلا من تقييم كل أثر تم التقاطه. قم بتفعيل هذه الميزة بتفعيل خيار أخذ العينات الذكية في بوابة Foundry عند تكوين تشغيل تقييم التتبع. يقلل الأخذ الذكي من تكلفة التقييم مع الحفاظ على تنوع الأثر - مما يضمن تضمين الحالات الحافية، ومسارات الأخطاء، وأنماط المحادثة المتنوعة ضمن المجموعة المقيمة.

كيف يعمل أخذ العينات الذكية

تستخدم خوارزمية أخذ العينات نهج MinHash لتنوع أبعد أولا يعمل على عدة مراحل:

  1. إزالة التكرار الدقيق - يزيل الآثار المكررة من المجموعة.
  2. الفلاتر الصلبة - تزيل الجلسات المعطلة، والآثار المقطوعة، واستدعاءات الأدوات المشوهة التي لا تناسب التقييم.
  3. التجميع - يجمع بين الإشارات على مستوى الأثر في تمثيل موحد.
  4. اختيار MinHash الأبعد أولا - يحسب التجزئة الحساسة للمحلية (توقيعات MinHash) لنص المستخدم لتقدير التشابه بين المسارات، ثم يختار بشكل تكراري أكثر التتبع اختلافا من المجموعة المتبقية. كل اختيار متتالي يعظم المسافة من جميع الآثار المختارة سابقا.

ينتج هذا النهج تنوعا معجميا أعلى بكثير وتغطية مفردات أوسع مقارنة بالعينة العشوائية، مما يعني أن المجموعة المقيمة تمثل بشكل أفضل النطاق الكامل لتفاعلات الوكلاء - بما في ذلك الحالات النادرة والصعبة والجديدة التي يميل الأخذ العشوائي إلى تفويتها.

الأخذ الذكي فعال بشكل خاص في:

  • التقييم والمعايير - تعظيم تغطية توزيع المدخلات بحيث تعكس درجات التقييم التنوع الواقعي.
  • توليد المعايير - ينتج معايير أكثر تركيزا وقابلية للتنفيذ من خلال كشف أنماط محادثة متنوعة.
  • ضبط تنسيق مجموعات البيانات - يختار الآثار التي تساعد النماذج على التعلم بشكل أكثر كفاءة.

تعمل الخوارزمية بالكامل على الحوسبة المحلية دون استدعاءات إضافية لواجهات برمجة التطبيقات، لذا لا تتحمل تكاليف استنتاج نموذج إضافية تتجاوز التقييم نفسه.

مثال على أخذ عينات ذكية

# Eval group for trace-based evaluations
data_source_config = {
    "type": "azure_ai_source",
    "scenario": "traces",
}

print("Creating trace-based evaluation group")
eval_object = client.evals.create(
    name="Trace Evaluation (Agent Smart Filter)",
    data_source_config=data_source_config,  # type: ignore
    testing_criteria=testing_criteria,
)
print(f"Evaluation created (id: {eval_object.id})")

# Compute time window in unix seconds
# Pad end_time by +600s (10 min) to avoid ingestion-delay edge exclusion
now_unix = int(time.time())
end_time = now_unix + 600
start_time = now_unix - (args.lookback_hours * 3600)

# Build trace_source based on mode
trace_source: dict = {
    "type": "agent_filter",
    "start_time": start_time,
    "end_time": end_time,
    "max_traces": args.max_traces,
    "filter_strategy": "smart_filtering"
}

# Add agent name/version or agent id
trace_source["agent_name"] = agent_name
trace_source["agent_version"] = agent_version
## trace_source["agent_id"] = args.agent_id

data_source = {
    "type": "azure_ai_trace_data_source_preview",
    "trace_source": trace_source,
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="trace-evaluation-agent-smart-filter-run",
    data_source=data_source,  # type: ignore
)

متطلبات بيانات التتبع

يتطلب تقييم التتبع من وكيلك إصدار امتدادات تتبع قواعد دلالية OpenTelemetry للذكاء الاصطناعي التوليدي. على وجه التحديد، تقرأ invoke_agent خدمة التقييم امتدادات من Application Insights وتستخرج بيانات المحادثة من خصائصها.

تستخدم سمات الامتداد التالية:

السمه مطلوب الوصف
gen_ai.operation.name نعم يجب أن يساوي "invoke_agent". الخدمة تتجاهل جميع الامتدادات الأخرى.
gen_ai.agent.id لوضع مرشح الوكيل معرف الوكيل الفريد (التنسيق: agent-name:version).
gen_ai.agent.name لوضع مرشح الوكيل اسم العميل البشري المقروء.
gen_ai.input.messages للمقيمين، استعلام المدخلات مصفوفة رسائل الإدخال JSON تتبع صيغة رسائل GenAI الدلالية. رسائل ذات دور user أو تعيين إلى system؛ رسائل ذات دور query أو assistant تعيين إلى toolresponse .
gen_ai.output.messages للمقيمين، استعلام المدخلات مصفوفة JSON من رسائل الإخراج المولدة بواسطة النماذج. جميع رسائل الإخراج تضبط إلى response. إذا كان الناتج يحتوي أيضا على type: tool_call أو type: tool_result، فإنه يغير إلى tool_calls.
gen_ai.tool.definitions اختياري مجموعة JSON من مخططات الأدوات المتاحة للوكيل. إذا لم تكن موجودة، تحاول الخدمة استنتاج تعريفات الأدوات من رسائل استدعاء الأدوات، لكن قد تكون المخططات المستنتاجة غير مكتملة.
gen_ai.conversation.id اختياري معرف المحادثة، مرر إلى نتائج التقييم للارتباط.

ملاحظة

إذا gen_ai.input.messages كانت و gen_ai.output.messages فارغة أو مفقودة، تعود score=Noneمقيمات الجودة (التماسك، الطلاقة، الصلة، حل النية) . لا يزال بإمكان مقيمين السلامة (العنف، إيذاء النفس، الجنس، الكراهية/الظلم) إنتاج درجات ببيانات جزئية لكنها قد لا تحقق نتائج ذات معنى.

بالنسبة للوكلاء Python المبنيين باستخدام حزمة تطوير SDK Azure AI Agent Server، أضف [tracing] الإضافي لتمكين الانبعاث التلقائي للامتداد:

pip install "azure-ai-agentserver-core[tracing]"

المتطلبات المسبقة لتقييم الأثر

بالإضافة إلى المتطلبات العامة، يتطلب تقييم الأثر:

  • مورد Application Insights مرتبط بمشروع Foundry الخاص بك. انظر إعداد التتبع في Microsoft Foundry.
  • يجب أن يكون لهوية المشروع المدارة دور Log Analytics Reader على كل من مورد Application Insights ومساحة Log Analytics المرتبطة به. إذا كانت الجداول التي تخزن ملاحظاتك محمية (مستوى الحماية لديها مضبوط على محمي)، قم أيضا بتعيين دور قارئ البيانات المميز للمراقبة في نفس النطاقات حتى تتمكن الخدمة من قراءة جداول التتبع المحمية.
  • حزمة azure-monitor-query Python (مطلوبة فقط إذا جمعت معرفات التتبع يدويا).
pip install "azure-ai-projects>=2.2.0" azure-monitor-query

اضبط هذه المتغيرات البيئية:

  • APPINSIGHTS_RESOURCE_ID — معرف موارد Application Insights (على سبيل المثال، /subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.Insights/components/<resource_name>).
  • AGENT_ID — معرف الوكيل الذي ينبعث من تكامل التتبع (gen_ai.agent.id السمة)، المستخدم لتصفية المسار. الصيغة: agent-name:version.
  • TRACE_LOOKBACK_HOURS — (اختياري) عدد الساعات التي يجب النظر فيها عند الاستعلام عن التتبعات. تتغير افتراضيا إلى 1.

الخيار أ: التقييم بواسطة مرشح الوكيل

أبسط طريقة هي السماح للخدمة باكتشاف وتقييم الآثار الحديثة تلقائيا لوكيل معين. لا حاجة لجمع معرف تتبع يدوي.

import os

agent_id = os.environ["AGENT_ID"]  # e.g., "my-weather-agent:1"
trace_lookback_hours = int(os.environ.get("TRACE_LOOKBACK_HOURS", "1"))

# Create the evaluation
data_source_config = {
    "type": "azure_ai_source",
    "scenario": "traces",
}

eval_object = openai_client.evals.create(
    name="Agent Trace Evaluation (by agent)",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,  # See "Set up evaluators" below
)

# Create a run — the service queries App Insights for matching traces
data_source = {
    "type": "azure_ai_traces",
    "agent_id": agent_id,
    "max_traces": 50,           # Maximum number of traces to evaluate
    "lookback_hours": trace_lookback_hours,
}

eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-trace-eval-run",
    data_source=data_source,
)

print(f"Evaluation run started: {eval_run.id}")

تقوم خدمة التصفية invoke_agent حسب gen_ai.agent.id السمة، وتقوم بأخذ عينات حتى max_traces معرفات تتبع فريدة، وتقيم جميع الامتدادات من تلك المسارات.

الخيار ب: التقييم بواسطة معرفات التتبع

لمزيد من التحكم، اجمع معرفات تتبع محددة من Application Insights وقيمها. هذه الطريقة مفيدة عندما ترغب في تقييم مجموعة منسقة من التفاعلات، مثل الآثار التي تم الإشارة إليها بواسطة التنبيهات أو أخذ عينات لمراجعة الجودة.

جمع معرفات التتبع من Application Insights

استعلام رؤى التطبيقات عن operation_Id القيم من آثار وكيلك. كل منها operation_Id يمثل تفاعلا كاملا مع الوكيل:

import os
from datetime import datetime, timedelta, timezone
from azure.identity import DefaultAzureCredential
from azure.monitor.query import LogsQueryClient, LogsQueryStatus

appinsights_resource_id = os.environ["APPINSIGHTS_RESOURCE_ID"]
agent_id = os.environ["AGENT_ID"]
trace_query_hours = int(os.environ.get("TRACE_LOOKBACK_HOURS", "1"))

end_time = datetime.now(timezone.utc)
start_time = end_time - timedelta(hours=trace_query_hours)

query = f"""dependencies
| where timestamp between (datetime({start_time.isoformat()}) .. datetime({end_time.isoformat()}))
| extend agent_id = tostring(customDimensions["gen_ai.agent.id"])
| where agent_id == "{agent_id}"
| distinct operation_Id"""

credential = DefaultAzureCredential()
logs_client = LogsQueryClient(credential)
response = logs_client.query_resource(
    appinsights_resource_id,
    query=query,
    timespan=None,  # Time range is specified in the query itself
)

trace_ids = []
if response.status == LogsQueryStatus.SUCCESS:
    for table in response.tables:
        for row in table.rows:
            trace_ids.append(row[0])

print(f"Found {len(trace_ids)} trace IDs")

أنشئ تقييما وشغل باستخدام معرفات التتبع

# Create the evaluation
data_source_config = {
    "type": "azure_ai_source",
    "scenario": "traces",
}

eval_object = openai_client.evals.create(
    name="Agent Trace Evaluation (by trace IDs)",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,  # See "Set up evaluators" below
)

# Create a run using the collected trace IDs
data_source = {
    "type": "azure_ai_traces",
    "trace_ids": trace_ids,
    "lookback_hours": trace_query_hours,
}

eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-trace-eval-run",
    metadata={
        "agent_id": agent_id,
        "start_time": start_time.isoformat(),
        "end_time": end_time.isoformat(),
    },
    data_source=data_source,
)

print(f"Evaluation run started: {eval_run.id}")

قم بإعداد المقيمين ورسم خرائط البيانات

عند تقييم التتبعات، تقوم الخدمة تلقائيا باستخراج بيانات المحادثة من سمات مدى OpenTelemetry. استخدم هذه الأسماء الحقولية مباشرة في data_mapping (بدون item. بادئات أو sample. المستخدمة في سيناريوهات أخرى):

المتغير سمة المصدر الوصف
{{item.query}} gen_ai.input.messages (أدوار المستخدم/النظام) استعلام المستخدم المستخرج من التتبع.
{{item.response}} gen_ai.input.messages (أدوار مساعد/أدوات) + gen_ai.output.messages رد العميل مستخرج من التتبع.
{{item.tool_definitions}} gen_ai.tool.definitions مخططات الأدوات المتاحة للوكيل. مطلوب فقط للمقيمين المرتبطين بالأدوات.
{{item.tool_calls}} تم استخراج من رسائل المساعد في gen_ai.input.messages / gen_ai.output.messages استدعاءات الأدوات التي يقوم بها الوكيل أثناء التفاعل. يستخدمه مقيمو الأدوات. مطلوب فقط للمقيمين المرتبطين بالأدوات.
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

testing_criteria = [
    # Quality evaluators — require query and response from trace data
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="intent_resolution",
        evaluator_name="builtin.intent_resolution",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
            "tool_definitions": "{{item.tool_definitions}}",
        },
        initialization_parameters={"model": model_deployment_name},
    ),
    # Tool evaluators — assess tool usage quality
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="tool_call_accuracy",
        evaluator_name="builtin.tool_call_accuracy",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
            "tool_calls": "{{item.tool_calls}}",
            "tool_definitions": "{{item.tool_definitions}}",
        },
        initialization_parameters={"model": model_deployment_name},
    ),
    # Safety evaluators — work even with partial trace data
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        initialization_parameters={"threshold": 4},
    ),
]

لمثال كامل قابل للجري، انظر sample_evaluations_builtin_with_traces.py على GitHub. للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

تقييم البيانات التركيبية (المعاينة)

استخدم azure_ai_synthetic_data_gen_preview نوع مصدر البيانات لإنشاء استعلامات اختبار تركيبية، ثم إرسالها إلى نموذج منشور أو وكيل Foundry، وقيم الردود. استخدم هذا السيناريو عندما لا يكون لديك مجموعة بيانات اختبار. تقوم الخدمة بتوليد استعلامات بناء على التنبيه الذي تقدمه (و/أو من تعليمات الوكيل)، وتجريها على هدفك، وتقيم الردود.

نصيحة

قبل أن تبدأ، أكمل ابدأ.

كيف يعمل تقييم البيانات التركيبية

  1. تقوم الخدمة بتوليد استعلامات تركيبية بناء على ملفات البيانات البذرية الخاصة بك prompt وملفات البيانات الاختيارية.
  2. يتم إرسال كل استعلام إلى الهدف المحدد (النموذج أو الوكيل) لتوليد استجابة.
  3. يقوم المقيمون بتقييم كل إجابة باستخدام الاستعلام والرد المولدين.
  4. يتم تخزين الاستعلامات المولدة كمجموعة بيانات في مشروعك لإعادة الاستخدام.

معلمات

المعلمة مطلوب الوصف
samples_count نعم الحد الأقصى لعدد استعلامات الاختبار التركيبي التي يجب إنشاؤها.
model_deployment_name نعم نشر النماذج لاستخدامها في توليد استعلامات تركيبية. فقط النماذج التي تحتوي على واجهة برمجة تطبيقات Responses مدعومة. للاطلاع على التوفر، راجع توفر منطقة واجهة برمجة التطبيقات للاستجابات. موجه النموذج غير مدعوم هنا؛ يمكن استخدامه فقط كهدف للتقييم.
prompt لا تعليمات تصف نوع الاستعلامات التي يجب إنشاؤها. اختياري عندما يكون لدى الوكيل المستهدف تعليمات مهيأة.
output_dataset_name لا اسم مجموعة البيانات المخرجة التي يتم تخزين الاستعلامات المولدة فيها. إذا لم تقدم اسما، تقوم الخدمة بإنشاء اسم تلقائيا.
sources لا ملفات بيانات البذرة (حسب معرف الملف) لتحسين ملاءمة الاستعلامات المولدة. حاليا هناك ملف واحد فقط مدعوم.

قم بإعداد المقيمين ورسم خرائط البيانات

ينتج مولد البيانات التركيبية {{item.query}} استعلامات في الميدان. يقوم الهدف بتوليد استجابات متاحة في {{sample.output_text}}. قم بتعيين هذه الحقول إلى مقيميك:

from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

data_source_config = {"type": "azure_ai_source", "scenario": "synthetic_data_gen_preview"}

testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        initialization_parameters={"model": model_deployment_name},
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    ),
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    ),
]

أنشئ التقييم وبدأ

هدف النموذج

توليد استعلامات تركيبية وتقييم نموذج:

eval_object = openai_client.evals.create(
    name="Synthetic Data Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_synthetic_data_gen_preview",
    "item_generation_params": {
        "type": "synthetic_data_gen_preview",
        "samples_count": 5,
        "prompt": "Generate customer service questions about returning defective products",
        "model_deployment_name": model_deployment_name,
        "output_dataset_name": "my-synthetic-dataset",
    },
    "target": {
        "type": "azure_ai_model",
        "model": model_deployment_name,
    },
}

eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="synthetic-data-evaluation",
    data_source=data_source,
)

يمكنك اختياريا إضافة تنبيه نظام لتشكيل سلوك النموذج المستهدف. عند استخدام input_messages البيانات الاصطناعية، قم بتضمين رسائل الأدوار فقط system - حيث توفر الخدمة الاستعلامات المولدة كرسائل مستخدم تلقائيا.

data_source = {
    "type": "azure_ai_synthetic_data_gen_preview",
    "item_generation_params": {
        "type": "synthetic_data_gen_preview",
        "samples_count": 5,
        "prompt": "Generate customer service questions about returning defective products",
        "model_deployment_name": model_deployment_name,
    },
    "target": {
        "type": "azure_ai_model",
        "model": model_deployment_name,
    },
    "input_messages": {
        "type": "template",
        "template": [
            {
                "type": "message",
                "role": "system",
                "content": {
                    "type": "input_text",
                    "text": "You are a helpful customer service agent. Be empathetic and solution-oriented."
                }
            }
        ]
    },
}

هدف العميل

توليد استعلامات تركيبية وتقييم وكيل Foundry:

data_source = {
    "type": "azure_ai_synthetic_data_gen_preview",
    "item_generation_params": {
        "type": "synthetic_data_gen_preview",
        "samples_count": 5,
        "prompt": "Generate questions about returning defective products",
        "model_deployment_name": model_deployment_name,
    },
    "target": {
        "type": "azure_ai_agent",
        "name": agent_name,
        "version": agent_version,
    },
}

eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="synthetic-agent-evaluation",
    data_source=data_source,
)

للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج. تتضمن الاستجابة خاصية output_dataset_id تحتوي على معرف مجموعة البيانات المولدة، والتي يمكنك استخدامها لاسترجاع أو إعادة استخدام البيانات الاصطناعية.

للحصول على أمثلة كاملة قابلة للتشغيل، راجع sample_synthetic_data_agent_evaluation.pysample_synthetic_data_model_evaluation.py على GitHub.

تقييم على مستوى المحادثة (معاينة)

قيم المحادثات الكاملة لتقييم جودة الوكلاء عبر تفاعلات المستخدمين بالكامل - وليس فقط الردود الفردية. استخدم التقييم على مستوى المحادثة لتحديد مشاكل الجودة مثل عدم اكتمال حل المهام، وإحباط المستخدم، وانحدارات استدعاء الأدوات التي يغفل عنها تقييم الدور.

على سبيل المثال، فكر في وكيل دعم حيث يشعر المستخدم بالإحباط بسبب عدة أدوار:

الدور الأول — المستخدم: "أحتاج إلى إعادة تعيين كلمة المرور الخاصة بي." العميل: "وجدت حسابك. سأرسل رابط إعادة الضبط."

الدور الثاني — المستخدم: "لم أستلم البريد الإلكتروني." العميل: "لقد أرسلت الرابط. يرجى التحقق من البريد المزعج."

الدور 3 — المستخدم: "لا يزال لا شيء. هل يمكنك فقط إعادة ضبطه مباشرة؟" العميل: "أرسلت رابط إعادة ضبط آخر."

المقيم على مستوى الدور يحصل فقط على آخر رد - وهو مهذب ويتخذ إجراء - لذا يحصل على تقييم جيد. يقوم مقيم على مستوى المحادثة بتقييم رضا العملاء عبر المحادثة إلى أن الوكيل كرر نفس الإجراء الفاشل ثلاث مرات دون محاولة بديل، مما يترك مشكلة المستخدم دون حل.

يختلف تقييم مستوى المحادثة عن تقييم مستوى الأدوار في عدة نواح:

الجانب مستوى الدور مستوى المحادثة
النطاق أزواج الاستعلام-الاستجابة الفردية أكمل المحادثات مع عدة محادثات
مقاييس جودة وسلامة الاستجابة لكل استجابة نتائج على مستوى المحادثة ورضا المستخدمين
تنسيق البيانات JSONL مع query حقول response JSONL مع messages مصفوفة تحتوي على المحادثة الكاملة
حالة الاستخدام اختبار استجابات النماذج الفردية اختبار تجارب الوكلاء من البداية إلى الطرف

يدعم التقييم على مستوى المحادثة أربعة خيارات لمصادر البيانات:

خيار متى تستخدم نوع مصدر البيانات
من مجموعة البيانات أو من الداخل لديك مسارات محادثات محلية أو بيانات اختبار jsonl مع file_id أو file_content
حسب معرف المحادثة تريد تقييم محادثات محددة من App Insights azure_ai_trace_data_source_preview مع trace_source
عن طريق مرشح الوكيل مع أخذ عينات تريد تقييم جودة الوكيل بشكل عام عبر حركة الإنتاج المأخوذة من عينات azure_ai_trace_data_source_preview مع trace_source
محادثات محاكاة تريد إنشاء محادثات اختبار اصطناعي azure_ai_target_completions مع conversation_gen_preview

اختر مستوى تقييم

يحدد المعامل evaluation_level في الجولة ما إذا كان المقيمون يحققون نقاط في الأدوار الفردية أم يكملون المحادثات:

قيمة السلوك
"turn" يقوم المقيمون بتقييم كل دور بشكل مستقل.
"conversation" يقوم المقيمون بتقييم المحادثة بأكملها.
(تم حذف) تتغير افتراضيا إلى "turn".

مهم

توافق المقيمين: يدعم كل مقيم مستويات تقييم محددة. تحقق من حقل المقيم supported_evaluation_levels في كتالوج المقيمين.

  • لا يمكن استخدام المقيمات التي تعتمد على الأدوار فقط (على سبيل المثال، fluency، relevance) مع evaluation_level="conversation".
  • حاليا، جميع المقيمين على مستوى المحادثة يدعمون كلا المستويات "turn" والمستويات "conversation" .

الأخطاء الشائعة

خطأ السبب حل
مستوى تقييم غير متوافق الاستخدام evaluation_level="conversation" مع مقيم الدور فقط قم بإزالة المقيم الذي يعتمد فقط على الدوران أو غيره إلى evaluation_level="turn"

تحضير بيانات المحادثة

أنشئ ملف JSONL حيث يحتوي كل سطر على محادثة كاملة في messages الحقل. يجب أن تتضمن كل رسالة ( role مستخدم، مساعد، أو نظام) و content. للحصول على مثال كامل، انظر عينات تقييم المحادثة المحادثة في SDK:

 {"messages": [{"role": "user", "content": "What's my account balance?"}, {"role": "assistant", "content": "Your current balance is $1,234.56."}, {"role": "user", "content": "Thanks!"}, {"role": "assistant", "content": "You're welcome! Is there anything else?"}]}

يمكنك أيضا تضمين تعريفات الأدوات واستدعاءات الأدوات إذا كان وكيلك يستخدم الأدوات:

{"messages": [{"role": "user", "content": "What is the capital of France?"}, {"role": "assistant", "content": "Paris"}]}
{"messages": [{"role": "user", "content": "How do I reverse a string in Python?"}, {"role": "assistant", "content": "You can reverse a string in Python by using slicing: string[::-1]"}]}
{"messages": [{"role": "user", "content": "What are the main causes of climate change?"}, {"role": "assistant", "content": "The main causes of climate change are the increase in greenhouse gases in the atmosphere, primarily due to human activities such as burning fossil fuels and deforestation."}]}
{"messages": [{"role": "user", "content": "What's my account balance?"}, {"role": "assistant", "content": null, "tool_calls": [{"id": "call_abc123", "type": "function", "function": {"name": "get_account_balance", "arguments": "{\"account_id\": \"ACCT-7890\"}"}}]}, {"role": "tool", "tool_call_id": "call_abc123", "content": "{ \"balance\": 1234.56, \"currency\": \"USD\" }"}, {"role": "assistant", "content": "Your current balance is 1,234.56."}, {"role": "user", "content": "Thanks!"}, {"role": "assistant", "content": "You're welcome! Is there anything else?"}], "tool_definitions": [{"name": "get_account_balance", "description": "Retrieves the current balance for a customer account", "parameters": {"type": "object", "properties": {"account_id": {"type": "string"}}, "required": ["account_id"]}}]}
{"messages": [{"role": "user", "content": "Explain the theory of relativity in simple terms."}, {"role": "assistant", "content": "Einstein's theory of relativity shows that space and time are interconnected and relative to the observer's frame of reference."}]}
{"messages": [{"role": "user", "content": "What's the weather in Seattle?"}, {"role": "assistant", "content": null, "tool_calls": [{"id": "call_002", "type": "function", "function": {"name": "get_weather", "arguments": "{\"location\": \"Seattle, WA\"}"}}]}, {"role": "tool", "tool_call_id": "call_002", "content": "{ \"temperature\": 55, \"condition\": \"Cloudy\" }"}, {"role": "assistant", "content": "It's currently 55F and cloudy in Seattle."}], "tool_definitions": [{"name": "get_weather", "description": "Get the current weather for a location", "parameters": {"type": "object", "properties": {"location": {"type": "string"}}, "required": ["location"]}}]}
{"messages": [{"role": "user", "content": "What is the tallest mountain in the world?"}, {"role": "assistant", "content": "Mount Everest is the tallest mountain in the world."}]}
{"messages": [{"role": "user", "content": "Is 4 x 2 = 16?"}, {"role": "assistant", "content": "No, 4 x 2 = 8."}]}
{"messages": [{"role": "user", "content": "What is the best Italian desert?"}, {"role": "assistant", "content": "Tiramisu is a popular Italian dessert."}]}
{"messages": [{"role": "user", "content": "What is the chemical formula for water?"}, {"role": "assistant", "content": "The chemical formula for water is H2O."}]}

تعريف مخطط البيانات والمقيمين

حدد المخطط لبيانات المحادثة، و"الرسائل"، واختر المقيمين المصممين للتقييم على مستوى المحادثة. يقوم مقيمو المحادثة بتقييم التفاعل بأكمله بدلا من تقييم الأدوار الفردية.

pip install "azure-ai-projects>=2.2.0"
import os
from openai.types.eval_create_params import DataSourceConfigCustom
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    data_source_config = DataSourceConfigCustom(
        type="custom",
        item_schema={
            "type": "object",
            "properties": {
                "messages": {"type": "array"},
                "tool_definitions": {"type": "array"},
            },
            "required": ["messages"],
        },
        include_sample_schema=False,
    )

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

أنشئ التقييم وبدأ

التحضير: تحميل sample_data_multiturn_conversations.jsonl

from openai.types.evals.create_eval_jsonl_run_data_source_param import (
    CreateEvalJSONLRunDataSourceParam,
    SourceFileID,
)

# Upload conversation data
data_id = project_client.datasets.upload_file(
    name="multiturn-conversation-data",
    version="1",
    file_path="./sample_data_multiturn_conversations.jsonl",
).id

# Create the evaluation
eval_object = openai_client.evals.create(
    name="Multi-turn Conversation Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a run with evaluation_level set to "conversation"
eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="multiturn-conversation-run",
    data_source=CreateEvalJSONLRunDataSourceParam(
        type="jsonl",
        source=SourceFileID(
            type="file_id",
            id=data_id,
        ),
    ),
    extra_body={"evaluation_level": "conversation"},
)

للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

للحصول على مثال كامل قابل للتشغيل، راجع sample_multiturn_conversation_evaluation.py على GitHub.

تقييم المحادثات حسب التعرف على الهويات من الآثار

قيم المحادثات المحددة من Application Insights من خلال تقديم معرفات المحادثات. استخدم هذا الخيار لتحديد المشاكل أو التحقق من الحلول في تفاعلات محددة. على سبيل المثال، يمكنك التحقيق في محادثة تم الإشارة إليها بواسطة تنبيه أو التحقق من حل لمشكلة معروفة.

أين تجد معرفات المحادثة

ابحث عن معرفات المحادثة في:

  • واجهة مستخدم سجلات تتبع التطبيقات Insights — تصفح إلى مسارات مثيرة للاهتمام وحدد الحقل conversation_id في تفاصيل التتبع.
  • مخرجات تسجيل التطبيق — إذا قمت بتعيين conversation_id ذلك بشكل صريح عند إنشاء ردود الوكلاء، استرجعه من سجلاتك المستخدمة.
  • سياق تتبع OpenTelemetry — قد يتم اشتقاق أيضا conversation_id من رأس traceparent إذا كان وكيلك يستخدم انتشار سياق trace التقليدي.

ملاحظة

يتم استرجاع تعريفات الأدوات تلقائيا من الآثار أو الاستعلام عنها من سجل الوكلاء. لا تحتاج إلى تقديمها في الطلب.

معايير البحث عن معرف المحادثة

المعلمة مطلوب الوصف
conversation_ids نعم مجموعة من معرفات المحادثة لتقييمها.
lookback_hours لا ساعات للبحث من end_time. الوضع الافتراضي هو سبعة أيام (168 ساعة).
end_time لا نهاية نافذة البحث (تنسيق ISO 8601). الإعدادات الافتراضية للوقت الحالي.
import os
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]

# Provide conversation IDs or trace IDs from App Insights
conversation_ids = ["conversation_1234", "conversation_5678"]

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    # Eval group for trace-based evaluations
    data_source_config = {
        "type": "azure_ai_source",
        "scenario": "traces",
    }

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

    # Create evaluation with traces scenario
    eval_object = openai_client.evals.create(
        name="Multi-turn Trace Evaluation (by ID)",
        data_source_config=data_source_config,
        testing_criteria=testing_criteria,
    )

    # Run evaluation on specific conversation IDs
    eval_run = openai_client.evals.runs.create(
        eval_id=eval_object.id,
        name="multiturn-trace-by-id-run",
        data_source={
            "type": "azure_ai_trace_data_source_preview",
            "trace_source": {
                "type": "conversation_id_source",
                "conversation_ids": conversation_ids,
            },
        },
        extra_body={"evaluation_level": "conversation"},
    )

ملاحظة

  • يمكن أن يسبب استيعاب بيانات Application Insights تأخر بين توليد الآثار ووقت توفرها للتقييم. إذا لم يجد الاستعلام آثارا، انتظر بضع دقائق وأعد المحاولة.
  • أقصى مدة للرجوع هي 7 أيام (168 ساعة). للوصول إلى الآثار القديمة، استخدم start_time وضمن end_time حدود الاحتفاظ ب App Insights الخاصة بك.

للحصول على مثال كامل قابل للتشغيل، راجع sample_multiturn_trace_evaluation_by_id.py على GitHub.

تقييم المحادثات المأخوذة من خلال مرشح الوكيل

قيم مجموعة عينات من المحادثات من Application Insights عن طريق تصفية اسم الوكيل. استخدم هذا الخيار لتقييم جودة الوكيل بشكل عام عبر حركة الإنتاج. على سبيل المثال، إجراء تقييمات جودة منتظمة أو مراقبة تدهور الجودة في الإنتاج.

الوكيل الذي تحدده للتصفية يمكن أن يكون جزءا من محادثة متعددة الوكلاء. يتطابق الفلتر مع أي محادثة شارك فيها ذلك الوكيل.

ملاحظة

يتم استرجاع تعريفات الأدوات تلقائيا من الآثار أو الاستعلام عنها من سجل الوكلاء. لا تحتاج إلى تقديمها في الطلب.

حقول هوية الوكيل

حدد الوكيل الذي يجب تصفية المرشح باستخدام أحد هذه الصيغ:

تنسيق مثال الوصف
agent_name + agent_version "agent_name": "my-agent", "agent_version": "1" حقلان منفصلان. إذا agent_version تم حذفها، استخدم أحدث إصدار.
agent_id "agent_id": "my-agent:1" بصيغة وتر "name:version" واحد.

استراتيجيات التصفية

الاستراتيجية الوصف
random_sampling (افتراضي) عينات عشوائية موحدة حتى max_traces المحادثات.
smart_filtering القاعدة الإرشادية المدارة بالخدمة التي تميل نحو "الآثار المثيرة للاهتمام" - المحادثات التي تتضمن مشاكل محتملة، حالات حادة، أو شذوذات.

معلمات

المعلمة مطلوب الوصف
agent_name نعم اسم الوكيل الذي يجب تصفية التتبع من خلاله.
agent_version لا نسخة الوكيل. إذا تم حذفه، يستخدم أحدث إصدار.
agent_id لا بديل ل agent_name + agent_version. بصيغة "name:version"وتر واحد .
start_time نعم بداية نافذة الوقت (ثوان عصر يونكس، UTC).
end_time نعم نهاية نافذة الزمن (ثوان عصر يونكس، UTC). قم بزيادة +600 ثانية لتجنب تأخير البلع.
max_traces لا أقصى حد من المحادثات للتجربة. الافتراضي إلى 1,000.
filter_strategy لا "random_sampling" (افتراضي) أو "smart_filtering" (استدلالية مدارة بالخدمة تميل نحو مسارات مثيرة للاهتمام).

مهم

يجب أن تكون نافذة الزمن (end_time - start_time) على الأقل 15 دقيقة (900 ثانية). يوجد هذا الشرط لأن الاستعلامات على مستوى المحادثة تطبق مخزن مؤقت للتوقف لمدة 5 دقائق على كل حافة لتجنب المحادثات الجزئية.

import os
import time
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]
agent_name = os.environ["FOUNDRY_AGENT_NAME"]
agent_version = os.environ.get("FOUNDRY_AGENT_VERSION", "")

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    # Eval group for trace-based evaluations
    data_source_config = {
        "type": "azure_ai_source",
        "scenario": "traces",
    }

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

    eval_object = openai_client.evals.create(
        name="Multi-turn Trace Evaluation (Agent Filter)",
        data_source_config=data_source_config,
        testing_criteria=testing_criteria,
    )

    # Compute time window in unix seconds
    # Pad end_time by +600s (10 min) to avoid ingestion-delay edge exclusion
    now_unix = int(time.time())
    end_time = now_unix + 600
    start_time = now_unix - (24 * 3600)  # 24 hours lookback

    # Build trace_source with agent filter
    trace_source = {
        "type": "agent_filter",
        "agent_name": agent_name,
        "start_time": start_time,
        "end_time": end_time,
        "max_traces": 5,
    }
    if agent_version:
        trace_source["agent_version"] = agent_version

    # Run evaluation on sampled agent conversations
    eval_run = openai_client.evals.runs.create(
        eval_id=eval_object.id,
        name="multiturn-agent-filter-run",
        data_source={
            "type": "azure_ai_trace_data_source_preview",
            "trace_source": trace_source,
        },
        extra_body={"evaluation_level": "conversation"},
    )

ملاحظة

مدة استعلام App Insights محدودة حاليا بحد أقصى 7 أيام (168 ساعة). لا يمكنك الوصول إلى التتبع الذي يزيد عمره عن 7 أيام دون تقديم start_time حدود احتفاظ بتطبيقات Insights بشكل صريح وضمن end_time حدود الاحتفاظ ب App Insights بشكل صريح.

للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

للحصول على مثال كامل قابل للتشغيل، راجع sample_multiturn_trace_evaluation_agent_filter.py على GitHub.

محاكاة المحادثة

قم بتوليد محادثات محاكاة من أوصاف السيناريوهات وقيمها على مستوى المحادثة. استخدم هذا السيناريو لاختبار سلوك عميلك في المواقف المسيطر عليها قبل النشر. تقوم الخدمة بتوليد محادثات واقعية بناء على وصف السيناريوهات الخاص بك ثم تقوم بتقييمها.

هذا النهج مفيد ل:

  • اختبار ما قبل النشر: التحقق من سلوك الوكيل عبر سيناريوهات متنوعة دون وجود حركة مستخدم حقيقية.
  • تغطية الحالات الحافية: اختبار السيناريوهات التي نادرا ما تحدث بشكل طبيعي لكنها مهمة للتعامل معها بشكل جيد.
  • اختبار الانحدار: تأكد من أن تحديثات الوكيل لا تؤثر على الأداء في السيناريوهات المعروفة.
  • اختبار التوسع الكبير: أنشئ العديد من المحادثات بسرعة لاختبار قدرات الوكيل.

كيف تعمل محاكاة المحادثة

  1. تقدم مجموعة بيانات من أوصاف السيناريوهات—كل صف يصف موقفا يحاول المستخدم المحاكى تحقيقه.
  2. تستخدم الخدمة نموذج محاكي للعب دور المستخدم، حيث يتفاعل مع وكيلك بناء على السيناريو.
  3. كل سيناريو يولد محادثة أو أكثر كاملة.
  4. يقوم مقيمو المحادثة على مستوى المحادثة بتقييم المحادثات التي تم إنشاؤها.
  5. مشروعك يخزن المحادثات ونتائج التقييم.

تحضير بيانات السيناريو

أنشئ ملف JSONL حيث يصف كل سطر سيناريو المستخدم المحاكى. يتطلب idالمخطط ، test_case_description، و desired_num_turns. أدرج تفاصيل حول هدف المستخدم، والسياق، وأي قيود. لمثال كامل، انظر عينات تقييم المحادثة المحادثة في مجموعة تطوير البرمجيات.


{"id": "contoso_refund_timeline", "test_case_description": "Customer returned an item to Contoso Electronics 5 days ago and hasn't received their refund yet. They want to know how long Contoso refunds take.", "desired_num_turns": 10}
{"id": "contoso_store_hours_lookup", "test_case_description": "Customer wants to know what time the Contoso Electronics store closes today. Simple single-fact question with possibly one clarifying turn about which location.", "desired_num_turns": 3}

معلمات

المعلمة مطلوب الوصف
num_conversations لا عدد المحادثات التي يجب توليدها لكل سيناريو. الوضع الافتراضي هو 5، الحد الأقصى على جانب الخادم 5.
max_turns لا الحد الأقصى لعدد الأدوار (التبادلات) في كل محادثة. الوضع الافتراضي هو 10، والحد الأقصى على جانب الخادم 20.
model نعم نشر النماذج لاستخدامها لمحاكاة المستخدم. على سبيل المثال، gpt-4.1. جهاز توجيه النموذج غير مدعوم كنموذج محاكاة؛ يمكن استخدامه فقط كهدف للتقييم.
sampling_params لا معلمات أخذ عينات لنموذج المحاكي، بما في ذلك temperature، top_p، و max_completion_tokens.
data_mapping لا يقوم بتعيين الحقول من JSONL السيناريو الخاص بك إلى معلمات المحاكاة. الخرائط الشائعة: test_case_description, id, . desired_num_turns

تعريف المقيمين

مختارة المقيمين المصممين لتقييم مستوى المحادثة. المحادثات المحاكاة تحدد تلقائيا مع المقيمين.

import os
from openai.types.eval_create_params import DataSourceConfigCustom
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator, PromptAgentDefinition

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "")

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    # Simulation uses the same "custom" eval group type as dataset evaluation (S1),
    # since the generated conversations follow the same messages schema.
    data_source_config = DataSourceConfigCustom(
        type="custom",
        item_schema={
            "type": "object",
            "properties": {
                "messages": {"type": "array"},
            },
            "required": ["messages"],
        },
        include_sample_schema=False,
    )

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

أنشئ التقييم وبدأ

التحضير: تحميل sample_data_simulation_scenarios.jsonl.

# Create (or update) an agent to simulate against
agent = project_client.agents.create_version(
    agent_name=agent_name,
    definition=PromptAgentDefinition(
        model=model_deployment_name,
        instructions="You are a helpful customer service agent. Be empathetic and solution-oriented.",
    ),
)

# Upload scenario data
scenarios_id = project_client.datasets.upload_file(
    name="simulation-scenarios",
    version="1",
    file_path="./sample_data_simulation_scenarios.jsonl",
).id

# Create the evaluation
eval_object = openai_client.evals.create(
    name="Multi-turn Conversation Simulation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a simulation run
eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="conversation-simulation-run",
    data_source={
        "type": "azure_ai_target_completions",
        "source": {
            "type": "file_id",
            "id": scenarios_id,
        },
        "target": {
            "type": "azure_ai_agent",
            "name": agent.name,
            "version": agent.version,
        },
        "item_generation_params": {
            "type": "conversation_gen_preview",
            "model": model_deployment_name,
            "num_conversations": 2,
            "max_turns": 5,
            "sampling_params": {
                "temperature": 0.7,
                "top_p": 1.0,
                "max_completion_tokens": 800,
            },
            "data_mapping": {
                "test_case_description": "test_case_description",
                "id": "id",
                "desired_num_turns": "desired_num_turns",
            },
        },
    },
    extra_body={"evaluation_level": "conversation"},
)

للاستطلاع لإكمال النتيجة وتفسير النتائج، راجع الحصول على النتائج.

للحصول على مثال كامل قابل للتشغيل، راجع sample_multiturn_conversation_simulation.py على GitHub.

احصل على النتائج

بعد الانتهاء من عملية التقييم، استرجع النتائج المدرجة وراجعها في البوابة أو بشكل برنامجي.

استطلاع للنتائج

عمليات التقييم غير متزامنة. قم باستطلاع حالة الجولة حتى تكملها، ثم استرجع النتائج:

import time
from pprint import pprint

while True:
    run = openai_client.evals.runs.retrieve(
        run_id=eval_run.id, eval_id=eval_object.id
    )
    if run.status in ("completed", "failed"):
        break
    time.sleep(5)
    print("Waiting for eval run to complete...")

# Retrieve results
output_items = list(
    openai_client.evals.runs.output_items.list(
        run_id=run.id, eval_id=eval_object.id
    )
)
pprint(output_items)
print(f"Report URL: {run.report_url}")

تفسير النتائج

كمثال بيانات واحد، يخرج جميع المقيمين المخطط التالي:

  • العلامة: تسمية ثنائية "نجاح" أو "رسوب"، مشابهة لمخرجات اختبار الوحدة. استخدم هذه النتيجة لتسهيل المقارنات بين المقيمين.
  • الدرجة: درجة من المقياس الطبيعي لكل مقيم. يستخدم بعض المقيمين معايير دقيقة الحبيبات، حيث يتم تقييمها على مقياس من 5 نقاط (مقيمو الجودة) أو مقياس من 7 نقاط (مقيمو سلامة المحتوى). وأخرى، مثل مقيمات التشابه النصي، تستخدم درجات F1، وهي عائمات بين 0 و1. أي "درجة" غير ثنائية يتم تحويلها إلى "نجاح" أو "رسوب" في حقل "التسمية" بناء على "العتبة".
  • العتبة: يتم تحويل أي درجات غير ثنائية إلى "نجاح" أو "رسوب" بناء على عتبة افتراضية، يمكن للمستخدم تجاوزه في تجربة SDK.
  • السبب: لتحسين الفهم، يقوم جميع مقيمين الحكم في نماذج اللغة الكبيرة أيضا بإخراج حقل استدلالي لشرح سبب منح درجة معينة.
  • التفاصيل: (اختياري) بالنسبة لبعض المقيمين، مثل tool_call_accuracy، قد يكون هناك حقل "التفاصيل" أو علامات تحتوي على معلومات إضافية لمساعدة المستخدمين على تصحيح تطبيقاتهم.

مثال على مخرج (عنصر واحد)

{
  "type": "azure_ai_evaluator",
  "name": "Coherence",
  "metric": "coherence",
  "score": 4.0,
  "label": "pass",
  "reason": "The response is well-structured and logically organized, presenting information in a clear and coherent manner.",
  "threshold": 3,
  "passed": true
}

مثال على المخرجات (المجمع)

بالنسبة للنتائج المجمعة عبر عدة أمثلة بيانات (مجموعة بيانات)، يشكل متوسط معدل الأمثلة التي تحتوي على "نجاح" معدل النجاح لتلك المجموعة.

{
  "eval_id": "eval_abc123",
  "run_id": "run_xyz789",
  "status": "completed",
  "result_counts": {
    "passed": 85,
    "failed": 15,
    "total": 100
  },
  "per_testing_criteria_results": [
    {
      "name": "coherence",
      "passed": 92,
      "failed": 8,
      "pass_rate": 0.92
    },
    {
      "name": "relevance", 
      "passed": 78,
      "failed": 22,
      "pass_rate": 0.78
    }
  ]
}

استكشاف الأخطاء

الوظيفة التي تعمل لفترة طويلة

قد تبقى وظيفة التقييم في حالة التشغيل لفترة طويلة. عادة ما يحدث هذا الوضع عندما لا يكون نشر نموذج Azure OpenAI لديه سعة كافية، مما يدفع الخدمة لإعادة محاولة الطلبات.

الحل:

  1. إلغاء مهمة التقييم الحالية باستخدام openai_client.evals.runs.cancel(run_id, eval_id=eval_id).
  2. زد سعة النماذج في بوابة Azure.
  3. أعد إجراء التقييم.

أخطاء المصادقة

إذا تلقيت خطأ 401 Unauthorized أو 403 Forbidden تحقق، تحقق من ذلك:

  • تم إعدادك DefaultAzureCredential بشكل صحيح. إذا كنت تستخدم Azure CLI، شغل az login.
  • حسابك يحمل دور مستخدم Foundry في مشروع Foundry.
  • رابط نقطة نهاية المشروع صحيح ويشمل كلا من الحساب واسم المشروع.

أخطاء تنسيق البيانات

إذا فشل التقييم مع خطأ في مخطط أو تعيين بيانات:

  • تحقق من أن ملف JSONL الخاص بك يحتوي على كائن JSON صالح واحد لكل سطر.
  • تأكد من أن أسماء الحقول تتطابق data_mapping تماما مع أسماء الحقول في ملف JSONL الخاص بك (حساس للحروف الحرفية).
  • تحقق من تطابق item_schema الخصائص مع الحقول في مجموعة بياناتك.

خطأ HTTP 400 عند استخدام file_id مع تقييمات استجابة الوكيل

تقييمات استجابة الوكيل (azure_ai_responses) تدعم فقط البيانات الداخلية من خلال file_content. إذا قدمت معرفات الاستجابة باستخدام file_id، فإن الطلب يعيد خطأ 400 Bad Request .

الحل: قم بالتبديل إلى file_content وقدم معرفات الاستجابة داخل الجهاز.

أخطاء حد المعدل

المستأجر، والاشتراك، ومستوى المشاريع يشغل الإبداعات بحد السعر. إذا تلقيت 429 Too Many Requests ردا:

  • تحقق من retry-after العنوان في الرد لمعرفة مدة الانتظار الموصى بها.
  • راجع هيئة الاستجابة لمعرفة تفاصيل حدود الأسعار.
  • استخدم التراجع الأسي عند إعادة محاولة الطلبات الفاشلة.

إذا فشلت مهمة تقييم مع وجود 429 خطأ أثناء التنفيذ:

  • قلل حجم مجموعة بيانات التقييم الخاصة بك أو قسمها إلى دفعات أصغر.
  • زد حصة الرموز في الدقيقة (TPM) لنشر النموذج في بوابة Azure.

أخطاء أداة تقييم الوكلاء

إذا أعاد مقيم وكيل خطأ للأدوات غير المدعومة:

  • تحقق من الأدوات المدعومة لتقييمي الوكلاء.
  • كحل بديل، لف الأدوات غير المدعومة كأدوات وظيفة يحددها المستخدم حتى يتمكن المقيم من تقييمها.