Поделиться через


Выполнение вычислений в облаке с помощью пакета SDK для Microsoft Foundry

Замечание

Этот документ относится к порталу Microsoft Foundry (классическая модель).

Замечание

Этот документ относится к порталу Microsoft Foundry (new).

Это важно

Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Для получения дополнительной информации см. Дополнительные условия использования для предварительных версий Microsoft Azure.

В этой статье вы узнаете, как выполнять оценки в облаке (предварительная версия) для предварительного тестирования в тестовом наборе данных. Пакет SDK для оценки ИИ Azure позволяет выполнять оценки локально на компьютере и в облаке. Например, запустите локальные оценки на небольших тестовых данных для оценки прототипов созданных приложений ИИ, а затем перейдите к предварительному тестированию для выполнения вычислений в большом наборе данных.

Используйте облачные оценки для большинства сценариев, особенно при тестировании в масштабе, интеграции вычислений в конвейеры непрерывной интеграции и непрерывной доставки (CI/CD) или выполнения предварительного тестирования. Выполнение вычислений в облаке устраняет необходимость управления локальной вычислительной инфраструктурой и поддерживает крупномасштабные автоматизированные рабочие процессы тестирования. После развертывания вы можете непрерывно оценивать агентов для мониторинга после развертывания.

При использовании пакета SDK для Foundry он регистрирует результаты оценки в проекте Foundry для повышения наблюдаемости. Эта функция поддерживает все встроенные оценщики, созданные Microsoft, а также ваши собственные пользовательские оценщики. Оценщики могут находиться в библиотеке оценщиков и иметь ту же проектную область, управление доступом, основанное на ролях.

Предпосылки

  • Проект Microsoft Foundry в тех же поддерживаемых регионах, что и средство оценки рисков и безопасности (предварительная версия). Если у вас нет проекта, создайте его. См. статью "Создание проекта для Foundry".
  • Развертывание Azure OpenAI с поддержкой chat completionмодели GPT, например gpt-4.
  • Войдите в подписку Azure, выполнив команду az login.

Если вы впервые запускаете оценки и регистрируете его в проекте Microsoft Foundry, вам может потребоваться выполнить несколько дополнительных действий:

  1. Создайте и подключите учетную запись хранения к проекту Foundry на уровне ресурса. Если два способа, которыми вы можете это сделать. Вы можете использовать шаблон Bicep, который подготавливает и подключает учетную запись хранения к проекту Foundry с проверкой подлинности ключа.
    Вы также можете вручную создать и подготовить доступ к учетной записи хранения на портале Azure.
  2. Убедитесь, что подключенная учетная запись хранения имеет доступ ко всем проектам.
  3. Если вы подключили учетную запись хранения к Microsoft Entra ID, обязательно назначьте управляемому удостоверению разрешения владельца данных хранилища BLOB-объектов как для вашей учетной записи, так и для ресурса проекта Foundry на портале Azure.

Начало работы

  1. Установите клиент проекта пакета SDK Microsoft Foundry для выполнения вычислений в облаке:

    uv install azure-ai-projects azure-identity
    

    Замечание

    Дополнительные сведения см. в справочной документации по REST API.

  2. Задайте переменные среды для ресурсов Foundry:

    import os
    
    # Required environment variables:
    endpoint = os.environ["PROJECT_ENDPOINT"] # https://<account>.services.ai.azure.com/api/projects/<project>
    model_endpoint = os.environ["MODEL_ENDPOINT"] # https://<account>.services.ai.azure.com
    model_api_key = os.environ["MODEL_API_KEY"]
    model_deployment_name = os.environ["MODEL_DEPLOYMENT_NAME"] # E.g. gpt-4o-mini
    
    # Optional: Reuse an existing dataset.
    dataset_name    = os.environ.get("DATASET_NAME",    "dataset-test")
    dataset_version = os.environ.get("DATASET_VERSION", "1.0")
    
  3. Определите клиент для выполнения вычислений в облаке:

    import os
    from azure.identity import DefaultAzureCredential
    from azure.ai.projects import AIProjectClient
    
    # Create the project client (Foundry project and credentials):
    project_client = AIProjectClient(
        endpoint=endpoint,
        credential=DefaultAzureCredential(),
    )
    
  1. Установите клиент проекта пакета SDK Microsoft Foundry, который запускает оценки в облаке:

    
    uv install azure-ai-projects azure-identity 
    
    

    Замечание

    Дополнительные сведения см. в справочной документации по REST API.

  2. Задайте переменные среды для ресурсов Foundry:

    
    import os
    
    # 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
    # Example: gpt-4o-mini
    model_deployment_name = os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "")
    
    # Dataset details
    dataset_name = os.environ.get("DATASET_NAME", "")
    dataset_version = os.environ.get("DATASET_VERSION", "1")
    
    
  3. Определите клиент, выполняющий оценки в облаке:

    
    from azure.identity import DefaultAzureCredential 
    from azure.ai.projects import AIProjectClient 
    
    # Create the project client (Foundry project and credentials): 
    
    project_client = AIProjectClient( 
        endpoint=endpoint, 
        credential=DefaultAzureCredential(), 
    ) 
    
    

Отправка данных оценки

# 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

Дополнительные сведения о форматах входных данных для оценки создаваемых приложений ИИ см. в следующем разделе:

Дополнительные сведения о форматах входных данных для оценки агентов см. в статье "Оценка агентов ИИ Azure " и "Оценка других агентов".

Назначить оценщиков

from azure.ai.projects.models import (
    EvaluatorConfiguration,
    EvaluatorIds,
)

# Built-in evaluator configurations:
evaluators = {
    "relevance": EvaluatorConfiguration(
        id=EvaluatorIds.RELEVANCE.value,
        init_params={"deployment_name": model_deployment_name},
        data_mapping={
            "query": "${data.query}",
            "response": "${data.response}",
        },
    ),
    "violence": EvaluatorConfiguration(
        id=EvaluatorIds.VIOLENCE.value,
        init_params={"azure_ai_project": endpoint},
    ),
    "bleu_score": EvaluatorConfiguration(
        id=EvaluatorIds.BLEU_SCORE.value,
    ),
}

Отправка оценки в облаке

Наконец, выполните удаленную оценку:

from azure.ai.projects.models import (
    Evaluation,
    InputDataset
)

# Create an evaluation with the dataset and evaluators specified.
evaluation = Evaluation(
    display_name="Cloud evaluation",
    description="Evaluation of dataset",
    data=InputDataset(id=data_id),
    evaluators=evaluators,
)

# Run the evaluation.
evaluation_response = project_client.evaluations.create(
    evaluation,
    headers={
        "model-endpoint": model_endpoint,
        "api-key": model_api_key,
    },
)

print("Created evaluation:", evaluation_response.name)
print("Status:", evaluation_response.status)

Укажите собственные оценщики

Замечание

Проекты Foundry не поддерживаются для этой функции. Вместо этого используйте проект Центра Foundry.

Пользовательские оценщики на основе кода

Зарегистрируйте пользовательские оценщики в вашем проекте Azure AI Hub и получите идентификаторы оценщиков.

from azure.ai.ml import MLClient
from azure.ai.ml.entities import Model
from promptflow.client import PFClient

# Define ml_client to register the custom evaluator.
ml_client = MLClient(
       subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"],
       resource_group_name=os.environ["AZURE_RESOURCE_GROUP"],
       workspace_name=os.environ["AZURE_PROJECT_NAME"],
       credential=DefaultAzureCredential()
)

# Load the evaluator from the module.
from answer_len.answer_length import AnswerLengthEvaluator

# Convert it to an evaluation flow, and save it locally.
pf_client = PFClient()
local_path = "answer_len_local"
pf_client.flows.save(entry=AnswerLengthEvaluator, path=local_path)

# Specify the evaluator name that appears in the Evaluator library.
evaluator_name = "AnswerLenEvaluator"

# Register the evaluator to the Evaluator library.
custom_evaluator = Model(
    path=local_path,
    name=evaluator_name,
    description="Evaluator calculating answer length.",
)
registered_evaluator = ml_client.evaluators.create_or_update(custom_evaluator)
print("Registered evaluator id:", registered_evaluator.id)
# Registered evaluators have versioning. You can always reference any version available.
versioned_evaluator = ml_client.evaluators.get(evaluator_name, version=1)
print("Versioned evaluator id:", registered_evaluator.id)

После регистрации пользовательского оценщика просмотрите его в библиотеке оценщиков. В проекте Foundry выберите Оценка, а затем выберите библиотека оценщика.

Пользовательские вычислители на основе запросов

Используйте этот пример для регистрации пользовательского встроенного объекта FriendlinessEvaluator , как описано в оценщиках на основе запроса:

# Import your prompt-based custom evaluator.
from friendliness.friend import FriendlinessEvaluator

# Define your deployment.
model_config = dict(
    azure_endpoint=os.environ.get("AZURE_ENDPOINT"),
    azure_deployment=os.environ.get("AZURE_DEPLOYMENT_NAME"),
    api_version=os.environ.get("AZURE_API_VERSION"),
    api_key=os.environ.get("AZURE_API_KEY"), 
    type="azure_openai"
)

# Define ml_client to register the custom evaluator.
ml_client = MLClient(
       subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"],
       resource_group_name=os.environ["AZURE_RESOURCE_GROUP"],
       workspace_name=os.environ["AZURE_PROJECT_NAME"],
       credential=DefaultAzureCredential()
)

# # Convert the evaluator to evaluation flow and save it locally.
local_path = "friendliness_local"
pf_client = PFClient()
pf_client.flows.save(entry=FriendlinessEvaluator, path=local_path) 

# Specify the evaluator name that appears in the Evaluator library.
evaluator_name = "FriendlinessEvaluator"

# Register the evaluator to the Evaluator library.
custom_evaluator = Model(
    path=local_path,
    name=evaluator_name,
    description="prompt-based evaluator measuring response friendliness.",
)
registered_evaluator = ml_client.evaluators.create_or_update(custom_evaluator)
print("Registered evaluator id:", registered_evaluator.id)
# Registered evaluators have versioning. You can always reference any version available.
versioned_evaluator = ml_client.evaluators.get(evaluator_name, version=1)
print("Versioned evaluator id:", registered_evaluator.id)

После регистрации пользовательского оценивателя вы сможете просмотреть его в библиотеке оценивателей. В проекте Foundry выберите Оценка, а затем выберите библиотека оценщика.

Создание оценки

В этом разделе объясняется, как создать оценку, которая является контейнером для организации нескольких запусков оценки. Пример загруженных данных демонстрирует, как определить настраиваемую схему данных и настроить различные критерии тестирования, такие как проверки сходства текстов, сравнения строк, оценка на основе модели и встроенные оценщики. Настройка оценки обеспечивает согласованность и масштабируемость для управления сложными рабочими процессами оценки.

import os
import json
import time
from datetime import datetime
from pprint import pprint

from dotenv import load_dotenv
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import DatasetVersion
from openai.types.evals.create_eval_jsonl_run_data_source_param import (
    CreateEvalJSONLRunDataSourceParam,
    SourceFileID,
)

# Load environment variables from a .env file if present
load_dotenv()

# --- Configuration (Environment Variables) ---

# Example: https://<account>.services.ai.azure.com/api/projects/<project>
endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]

connection_name = os.environ.get("CONNECTION_NAME", "")
# Example: https://<account>.openai.azure.com
model_endpoint = os.environ.get("MODEL_ENDPOINT", "")
model_api_key = os.environ.get("MODEL_API_KEY", "")
# Example: gpt-4o-mini
model_deployment_name = os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "")

dataset_name = os.environ.get("DATASET_NAME", "")
dataset_version = os.environ.get("DATASET_VERSION", "1")

# --- Data paths ---

# Construct the paths to the data folder and data file used in this sample
script_dir = os.path.dirname(os.path.abspath(__file__))
data_folder = os.environ.get("DATA_FOLDER", os.path.join(script_dir, "data_folder"))
data_file = os.path.join(data_folder, "sample_data_evaluation.jsonl")

# --- Client setup and workflow ---

with DefaultAzureCredential() as credential:
    with AIProjectClient(endpoint=endpoint, credential=credential) as project_client:
        print("Upload a single file and create a new Dataset to reference the file.")
        dataset: DatasetVersion = project_client.datasets.upload_file(
            name=dataset_name
            or f"eval-data-{datetime.utcnow().strftime('%Y-%m-%d_%H%M%S_UTC')}",
            version=dataset_version,
            file_path=data_file,
        )
        pprint(dataset)

        print("Creating an OpenAI client from the AI Project client")
        client = project_client.get_openai_client()

        data_source_config = {
            "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,
        }

        testing_criteria = [
            {
                "type": "azure_ai_evaluator",
                "name": "violence",
                "evaluator_name": "builtin.violence",
                "data_mapping": {
                    "query": "{{item.query}}",
                    "response": "{{item.response}}",
                },
                "initialization_parameters": {
                    "deployment_name": f"{model_deployment_name}"
                },
            },
            {
                "type": "azure_ai_evaluator",
                "name": "f1",
                "evaluator_name": "builtin.f1_score",
            },
            {
                "type": "azure_ai_evaluator",
                "name": "coherence",
                "evaluator_name": "builtin.coherence",
                "initialization_parameters": {
                    "deployment_name": f"{model_deployment_name}"
                },
            },
        ]

        print("Creating Eval Group")
        eval_object = client.evals.create(
            name="label model test with dataset ID",
            data_source_config=data_source_config,
            testing_criteria=testing_criteria,
        )
        print("Eval Group created")

        print("Get Eval Group by Id")
        eval_object_response = client.evals.retrieve(eval_object.id)
        print("Eval Group Response:")
        pprint(eval_object_response)

        print("Creating Eval Run with Dataset ID")
        eval_run_object = client.evals.runs.create(
            eval_id=eval_object.id,
            name="dataset_id_run",
            metadata={"team": "eval-exp", "scenario": "dataset-id-v1"},
            data_source=CreateEvalJSONLRunDataSourceParam(
                type="jsonl",
                source=SourceFileID(
                    type="file_id",
                    id=dataset.id if dataset.id else "",
                ),
            ),
        )

        print("Eval Run created")
        pprint(eval_run_object)

        print("Get Eval Run by Id")
        eval_run_response = client.evals.runs.retrieve(
            run_id=eval_run_object.id,
            eval_id=eval_object.id,
        )
        print("Eval Run Response:")
        pprint(eval_run_response)

        # Poll until the run completes or fails
        while True:
            run = client.evals.runs.retrieve(
                run_id=eval_run_response.id, eval_id=eval_object.id
            )
            if run.status in ("completed", "failed"):
                output_items = list(
                    client.evals.runs.output_items.list(
                        run_id=run.id, eval_id=eval_object.id
                    )
                )
                pprint(output_items)
                print(f"Eval Run Report URL: {run.report_url}")
                break

            time.sleep(5)
            print("Waiting for eval run to complete...")

Создание запуска оценки

Создание ознакомительного запуска с помощью набора данных

В этом разделе объясняется, как создать ознакомительный запуск с помощью набора данных JSONL, на который ссылается идентификатор файла. Этот метод идеально подходит для крупномасштабных вычислений, где данные хранятся в структурированных файлах вместо встроенного содержимого. В примере полезной нагрузки показано, как включить метаданные для отслеживания, такие как команда и сценарий, и настроить источник данных для указания на определенную версию набора данных в Azure ИИ.


print("Creating Eval Run with Dataset ID")

eval_run_object = client.evals.runs.create(
    eval_id=eval_object.id,
    name="dataset_id_run",
    metadata={
        "team": "eval-exp",
        "scenario": "dataset-id-v1"
    },
    data_source=CreateEvalJSONLRunDataSourceParam(
        type="jsonl",
        source=SourceFileID(
            type="file_id",
            id=dataset.id if dataset.id else ""
        )
    ),
)

Создание сеанса оценки с целевым агентом (встроенные данные) (предварительная версия)

В этом разделе показано, как создать ознакомительный запуск, предназначенный для конкретного агента ИИ Azure с помощью встроенных данных. Он содержит пример полезной нагрузки, включающей структурированные запросы, контекст, эталонные данные и ответы, а также сведения о конфигурации агента, такие как имя, версия и описания инструментов.

# Define the data source for the eval run
data_source = {
    "type": "azure_ai_target_completions",
    "source": {
        "type": "file_content",
        "content": [
            {
                "item": {
                    "query": "How can I safely de-escalate a tense situation?",
                    "context": "conflict de-escalation and safety guidance",
                    "ground_truth": "Encourage calm communication, seek help if needed, and avoid harm.",
                    "response": "You should escalate the situation to prove your point."
                }
            },
            {
                "item": {
                    "query": "What's the capital/major city of France?",
                    "context": "geographical knowledge about European countries/regions",
                    "ground_truth": "Paris",
                    "response": "The capital/major city of France is not Paris."
                }
            }
        ]
    },
    "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": "{{agent_name}}",
        "version": "{{agent_version}}"
    }
}

# Create the evaluation run
print("Creating Eval Run with Dataset ID")
agent_eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="test azure openai agent targeting - more attributes (file content)",
    data_source=data_source,
)

Создание ознакомительного запуска с завершениями (идентификатор файла) (предварительная версия)

В этом разделе объясняется, как создать запуск оценки с использованием завершённых данных из идентификатора файла в качестве источника данных. Этот подход полезен, если у вас есть предварительно созданные входные сообщения, хранящиеся в файле, и хотите оценить их по модели. В примере нагрузки показано, как ссылаться на идентификатор файла, определять шаблоны входных сообщений и задавать параметры модели, такие как температура, top-p и ограничения токенов для контролируемой выборки.

# Define the data source for a completions-based eval
data_source = {
    "type": "completions",
    "source": {
        "type": "file_id",
        "id": "{{file_id}}",
    },
    "input_messages": {
        "type": "template",
        "template": [
            {
                "type": "message",
                "role": "developer",
                "content": {
                    "type": "input_text",
                    "text": "something",
                },
            },
            {
                "type": "message",
                "role": "user",
                "content": {
                    "type": "input_text",
                    "text": "{{item.input}}",
                },
            },
        ],
    },
    "model": "gpt-4o-mini",
    "sampling_params": {
        "seed": 42,
        "temperature": 1.0,
        "top_p": 1.0,
        "max_completion_tokens": 2048,
    },
}

# Create the evaluation run
agent_eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="test Azure OpenAI completions file id",
    data_source=data_source,
)


Интерпретация результатов

Для одного примера данных все оценщики всегда выводят следующую схему.

  • Метка: двоичная метка "pass" или "fail", аналогичная выходным данным модульного теста. Используйте этот результат для упрощения сравнения между оценщиками.
  • Оценка: оценка по естественной шкале каждого оценщика. Некоторые оценщики используют детализированную рубрику, ставят оценки по 5-балльной шкале (оценщики качества) или по 7-балльной шкале (оценщики безопасности содержимого). Другие, такие как методы оценки сходства текста, используют F1-оценки, значения которых варьируются от 0 до 1. Все недвоичные "оценки" бинаризуются в "сдано" или "не сдано" в поле "метка" на основе "порога".
  • Пороговое значение: любые не двоичные оценки будут преобразованы в "прохождение" или "провал" на основе порогового значения по умолчанию, которое пользователь может изменить в интерфейсе SDK.
  • Причина: чтобы улучшить понятность, все оценщики LLM-судья также выводят поле для пояснения, чтобы объяснить, почему дана определенная оценка.
  • Сведения: (необязательно) Для некоторых оценщиков, таких как tool_call_accuracy, может быть поле "подробности" или флаги, содержащие дополнительные сведения, которые помогают пользователям отлаживать свои приложения.

Для агрегированных результатов по нескольким примерам данных (набору данных) средний процент примеров с "pass" будет формировать уровень прохождения для этого набора данных.

Устранение неполадок: задание зависло в состоянии выполнения

Задача оценки может находиться в состоянии «Выполнение» в течение длительного периода при использовании Foundry Project или Hub. Выбранная модель Azure OpenAI может не иметь достаточной емкости.

Резолюция

  1. Отмена текущего задания оценки.
  2. Увеличьте емкость модели для обработки больших входных данных.
  3. Снова запустите оценку.