Как выполнять оценки в Интернете с помощью пакета SDK для Azure AI Foundry
Внимание
Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования Предварительных версий Microsoft Azure.
Из этой статьи вы узнаете, как выполнять оценки в Сети непрерывно с помощью пакета SDK для Azure AI Foundry. Оценки в предпроизводствующих средах важны для обеспечения безопасности, производительности приложения и получения высококачественных результатов. Однако оценка не останавливается после развертывания приложения. В рабочей среде различные вещи могут измениться, например типы запросов, которые пользователи отправляют в приложение, что может повлиять на производительность вашего приложения. Чтобы обеспечить высокую степень наблюдаемости в рабочем приложении для создания искусственного интеллекта, важно отслеживать и непрерывно оценивать данные приложения. Таким образом, вы можете обеспечить уверенность в безопасности, качестве и производительности приложения.
Как работает онлайн-оценка
В этом разделе вы узнаете, как работает онлайн-оценка, как она интегрируется с Azure Monitor Application Insights и как ее можно использовать для выполнения непрерывных вычислений по данным трассировки из созданных приложений ИИ.
После инструментирования приложения для отправки данных трассировки в Application Insights настройте расписание онлайн-оценки для непрерывной оценки этих данных. Онлайн-оценка — это служба, использующая вычисления ИИ Azure для непрерывного запуска настраиваемого набора оценщиков. После настройки расписания онлайн-оценки с помощью пакета SDK для Azure AI Foundry он выполняется по настраиваемому расписанию. Каждый раз при выполнении запланированного задания он выполняет следующие действия:
- Запрос данных трассировки приложения из подключенного ресурса Application Insights с помощью предоставленного запроса Kusto (KQL).
- Запустите каждый вычислитель по данным трассировки и вычислите каждую метрику (например, заземленность: 3).
- Записывает оценки оценки обратно в каждую трассировку с помощью стандартных семантических соглашений.
Примечание.
Онлайн-оценка поддерживает те же метрики, что и оценка ИИ Azure. Дополнительные сведения о том, как работает оценка и какие метрики оценки поддерживаются, см. в статье "Оценка приложения для создания искусственного интеллекта" с помощью пакета SDK для оценки ИИ Azure.
Например, предположим, что у вас развернутое приложение чата, которое ежедневно получает множество вопросов о клиентах. Вы хотите непрерывно оценить качество ответов из приложения. Вы настраиваете расписание оценки по сети с ежедневным повторением. Вы настраиваете вычислители: заземление, согласованность и флуентность. Каждый день служба вычисляет оценки для этих метрик и записывает данные обратно в Application Insights для каждой трассировки, которая была собрана в течение периода времени повторения (в этом примере за последние 24 часа). Затем данные можно запрашивать из каждой трассировки и сделать доступными в Azure AI Foundry и Azure Monitor Application Insights.
Результаты оценки, записанные обратно в каждую трассировку в Application Insights, соответствуют следующим соглашениям. Уникальный диапазон добавляется в каждую трассировку для каждой метрики оценки:
Свойство | Таблица Application Insights | Поля для заданного operation_ID | Пример значения |
---|---|---|---|
Метрика оценки | трассировки, AppTraces | customDimensions[“event.name”] |
gen_ai.evaluation.relevance |
Оценка метрик оценки | трассировки, AppTraces | customDimensions[“gen_ai.evaluation.score”] |
3 |
Комментарий метрики оценки (если применимо) | трассировки, AppTraces | message |
{“comment”: “I like the response”} |
Теперь, когда вы узнаете, как работает онлайн-оценка и как она подключается к Azure Monitor Application Insights, следующим шагом является настройка службы.
Настройка онлайн-оценки
В этом разделе вы узнаете, как настроить расписание оценки по сети для непрерывного мониторинга развернутого созданного приложения искусственного интеллекта. Пакет SDK для Azure AI Foundry предоставляет такие возможности. API Python и поддерживает все функции, доступные в локальных оценках. Выполните следующие действия, чтобы отправить расписание оценки по сети для данных с помощью встроенных или пользовательских вычислителей.
Примечание.
Оценки поддерживаются только в том же регионе , что и метрики рисков, поддерживаемых ИИ.
Необходимые компоненты
Выполните следующие действия, необходимые для настройки среды и проверки подлинности в необходимых ресурсах:
- подписка Azure;
- Группа ресурсов в поддерживаемом для оценки регионе.
- Новое управляемое удостоверение , назначаемое пользователем, в одной группе ресурсов и регионе. Запишите
clientId
его позже. - Центр искусственного интеллекта Azure в одной группе ресурсов и регионе.
- Проект Azure AI в этом центре см. в статье "Создание проекта на портале Azure AI Foundry".
- Ресурс Azure Monitor Application Insights.
- Перейдите на центральную страницу в портал Azure и добавьте ресурс Application Insights, см. статью Update приложение Azure Insights и Реестр контейнеров Azure.
- Развертывание Azure OpenAI с поддержкой
chat completion
модели GPT, напримерgpt-4
. -
Connection String
для проекта ИИ Azure для упрощения созданияAIProjectClient
объекта. Вы можете получить строка подключения project в разделе "Сведения о проекте" на странице обзора проекта. - Перейдите к ресурсу Application Insights в портал Azure и перейдите на вкладку управления доступом (IAM), чтобы добавить
Log Analytics Contributor
роль в созданное ранее управляемое удостоверение, назначаемое пользователем. - Присоединение управляемого удостоверения , назначаемого пользователем, к проекту.
- Перейдите к службам ИИ Azure в портал Azure и перейдите на вкладку управления доступом (IAM), чтобы добавить
Cognitive Services OpenAI Contributor
роль в созданное ранее управляемое удостоверение, назначаемое пользователем.
Инструкции по установке
Установка Azure CLI и вход
Вы устанавливаете Azure CLI и войдите из локальной среды разработки, чтобы использовать учетные данные пользователя для вызова службы Azure OpenAI.
В большинстве случаев azure CLI можно установить из терминала с помощью следующей команды:
Инструкции по установке Azure CLI можно выполнить, если эти команды не работают для конкретной операционной системы или установки.
После установки Azure CLI выполните вход с помощью az login
команды и входа с помощью браузера:
az login
Кроме того, вы можете войти вручную через браузер с помощью кода устройства.
az login --use-device-code
Создание новой среды Python.
Сначала необходимо создать новую среду Python для установки пакета, необходимого для работы с этим руководством. Не устанавливайте пакеты в глобальную установку Python. При установке пакетов Python всегда следует использовать виртуальную или конда-среду, в противном случае можно разорвать глобальную установку Python.
При необходимости установите Python
Рекомендуется использовать Python 3.10 или более поздней версии, но требуется по крайней мере Python 3.8. Если у вас нет подходящей версии Python, вы можете следовать инструкциям в руководстве по Python VS Code для простого способа установки Python в операционной системе.
Создание виртуальной среды
Если у вас уже установлен Python 3.10 или более поздней версии, можно создать виртуальную среду с помощью следующих команд:
Активация среды Python означает, что при запуске python
или pip
из командной строки используется интерпретатор Python, содержащийся в .venv
папке приложения.
Примечание.
Вы можете использовать deactivate
команду для выхода из виртуальной среды Python, а затем повторно активировать ее при необходимости.
Вы также можете создать новую среду Python с помощью conda
:
conda create -n online-evaluation
conda activate online-evaluation
Установите необходимые пакеты.
pip install azure-identity azure-ai-projects azure-ai-ml
Совет
Кроме того, можно использовать pip install azure-ai-evaluation
, если требуется код-первый интерфейс для получения идентификатора вычислителя для встроенных вычислителей в коде. Сведения о том, как это сделать, см. в разделе "Указание оценщиков" из библиотеки оценщиков.
Настройка трассировки для создаваемого приложения ИИ
Перед настройкой онлайн-оценки убедитесь, что вы сначала настроили трассировку для создаваемого приложения ИИ.
Использование имени службы в данных трассировки
Чтобы определить приложение с помощью уникального идентификатора в Application Insights, можно использовать свойство службы OpenTelemetry в данных трассировки. Это особенно полезно, если вы регистрируете данные из нескольких приложений в один ресурс Application Insights и хотите различать их. Например, можно сказать, что у вас есть два приложения: App-1 и App-2, с трассировкой, настроенной для записи данных в один ресурс Application Insights. Возможно, вы хотите настроить App-1 для непрерывной оценки релевантности и App-2 для непрерывной оценки по заземленности. Имя службы можно использовать для различения приложений в конфигурациях оценки в сети.
Чтобы настроить свойство имени службы, вы можете сделать это непосредственно в коде приложения, выполнив действия, описанные в разделе "Использование нескольких поставщиков трассировки с разными ресурсами". Кроме того, можно задать переменную OTEL_SERVICE_NAME
среды перед развертыванием приложения. Дополнительные сведения о работе с именем службы см. в статье OTEL Environment Variables and Service Resource Semantic Conventions.
Дополнительные сведения об использовании имени службы для различия между созданными приложениями ИИ см. в разделе трассировки.
Запрос сохраненных данных трассировки в Application Insights
Используя язык запросов Kusto (KQL), вы можете запрашивать данные трассировки созданного приложения ИИ из Application Insights, чтобы использовать для непрерывной онлайн-оценки. Если вы используете пакет трассировки ИИ Azure для трассировки создаваемого приложения ИИ, можно использовать следующий запрос Kusto:
Внимание
Запрос KQL, используемый веб-службой оценки, должен выводить следующие столбцы: operation_Id
, operation_ParentId
и gen_ai_response_id
. Кроме того, каждый вычислитель имеет собственные требования к входным данным. Запрос KQL должен выводить эти столбцы, которые будут использоваться в качестве входных данных для самих вычислителей. Список требований к данным для оценщиков см. в разделе о требованиях к данным для встроенных оценщиков.
let gen_ai_spans = (
dependencies
| where isnotnull(customDimensions["gen_ai.system"])
| extend response_id = tostring(customDimensions["gen_ai.response.id"])
| project id, operation_Id, operation_ParentId, timestamp, response_id
);
let gen_ai_events = (
traces
| where message in ("gen_ai.choice", "gen_ai.user.message", "gen_ai.system.message")
or tostring(customDimensions["event.name"]) in ("gen_ai.choice", "gen_ai.user.message", "gen_ai.system.message")
| project
id = operation_ParentId,
operation_Id,
operation_ParentId,
user_input = iff(
message == "gen_ai.user.message" or tostring(customDimensions["event.name"]) == "gen_ai.user.message",
parse_json(iff(message == "gen_ai.user.message", tostring(customDimensions["gen_ai.event.content"]), message)).content,
""
),
system = iff(
message == "gen_ai.system.message" or tostring(customDimensions["event.name"]) == "gen_ai.system.message",
parse_json(iff(message == "gen_ai.system.message", tostring(customDimensions["gen_ai.event.content"]), message)).content,
""
),
llm_response = iff(
message == "gen_ai.choice",
parse_json(tostring(parse_json(tostring(customDimensions["gen_ai.event.content"])).message)).content,
iff(tostring(customDimensions["event.name"]) == "gen_ai.choice", parse_json(parse_json(message).message).content, "")
)
| summarize
operation_ParentId = any(operation_ParentId),
Input = maxif(user_input, user_input != ""),
System = maxif(system, system != ""),
Output = maxif(llm_response, llm_response != "")
by operation_Id, id
);
gen_ai_spans
| join kind=inner (gen_ai_events) on id, operation_Id
| project Input, System, Output, operation_Id, operation_ParentId, gen_ai_response_id = response_id
Если вы используете OTEL_SERVICE_NAME
переменную среды в созданном приложении ИИ для задания имени службы, вы можете запросить cloud_RoleName
в расписании оценки по сети, добавив следующую строку в запрос Kusto (KQL):
| where cloud_RoleName == "service_name"
При необходимости можно использовать пример оператора или принять оператор в запросе Kusto, чтобы он возвращал только подмножество трассировок. Так как оценки с поддержкой искусственного интеллекта могут быть дорогостоящими, этот подход может помочь вам управлять затратами, только оценивая случайный выборку (или n
трассировки) данных.
Настройка онлайн-оценки с помощью пакета SDK для Azure AI Project
Вы можете отправить запланированное задание онлайн-оценки с помощью пакета SDK для проектов искусственного интеллекта Azure с помощью API Python. См. приведенный ниже сценарий, чтобы узнать, как настроить онлайн-оценку с помощью оценщиков производительности и качества (СИ). Чтобы просмотреть полный список поддерживаемых вычислителей, ознакомьтесь с пакетом SDK для оценки ИИ Azure. Чтобы узнать, как использовать пользовательские вычислители, ознакомьтесь с настраиваемыми вычислителями.
Начните с импорта необходимых пакетов и настройки необходимых переменных:
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.ai.projects.models import (
ApplicationInsightsConfiguration,
EvaluatorConfiguration,
EvaluationSchedule,
RecurrenceTrigger,
)
from azure.ai.evaluation import CoherenceEvaluator
# This sample includes the setup for an online evaluation schedule using the Azure AI Project SDK and Azure AI Evaluation SDK
# The schedule is configured to run daily over the collected trace data while running two evaluators: CoherenceEvaluator and RelevanceEvaluator
# This sample can be modified to fit your application's requirements
# Name of your online evaluation schedule
SAMPLE_NAME = "online_eval_name"
# Connection string to your Azure AI Foundry project
# Currently, it should be in the format "<HostName>;<AzureSubscriptionId>;<ResourceGroup>;<HubName>"
PROJECT_CONNECTION_STRING = "<HostName>;<AzureSubscriptionId>;<ResourceGroup>;<HubName>"
# Your Application Insights resource ID
APPLICATION_INSIGHTS_RESOURCE_ID = "appinsights_resource_id"
# Kusto Query Language (KQL) query to query data from Application Insights resource
# This query is compatible with data logged by the Azure AI Inferencing Tracing SDK (linked in documentation)
# You can modify it depending on your data schema
# The KQL query must output these required columns: operation_ID, operation_ParentID, and gen_ai_response_id
# You can choose which other columns to output as required by the evaluators you are using
KUSTO_QUERY = "let gen_ai_spans=(dependencies | where isnotnull(customDimensions[\"gen_ai.system\"]) | extend response_id = tostring(customDimensions[\"gen_ai.response.id\"]) | project id, operation_Id, operation_ParentId, timestamp, response_id); let gen_ai_events=(traces | where message in (\"gen_ai.choice\", \"gen_ai.user.message\", \"gen_ai.system.message\") or tostring(customDimensions[\"event.name\"]) in (\"gen_ai.choice\", \"gen_ai.user.message\", \"gen_ai.system.message\") | project id= operation_ParentId, operation_Id, operation_ParentId, user_input = iff(message == \"gen_ai.user.message\" or tostring(customDimensions[\"event.name\"]) == \"gen_ai.user.message\", parse_json(iff(message == \"gen_ai.user.message\", tostring(customDimensions[\"gen_ai.event.content\"]), message)).content, \"\"), system = iff(message == \"gen_ai.system.message\" or tostring(customDimensions[\"event.name\"]) == \"gen_ai.system.message\", parse_json(iff(message == \"gen_ai.system.message\", tostring(customDimensions[\"gen_ai.event.content\"]), message)).content, \"\"), llm_response = iff(message == \"gen_ai.choice\", parse_json(tostring(parse_json(tostring(customDimensions[\"gen_ai.event.content\"])).message)).content, iff(tostring(customDimensions[\"event.name\"]) == \"gen_ai.choice\", parse_json(parse_json(message).message).content, \"\")) | summarize operation_ParentId = any(operation_ParentId), Input = maxif(user_input, user_input != \"\"), System = maxif(system, system != \"\"), Output = maxif(llm_response, llm_response != \"\") by operation_Id, id); gen_ai_spans | join kind=inner (gen_ai_events) on id, operation_Id | project Input, System, Output, operation_Id, operation_ParentId, gen_ai_response_id = response_id"
Затем определите клиент и развертывание GPT Azure OpenAI (например GPT-4
), которое будет использоваться для запуска расписания оценки в Интернете. Кроме того, подключитесь к ресурсу Application Insights:
# Connect to your Azure AI Foundry Project
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=PROJECT_CONNECTION_STRING
)
# Connect to your Application Insights resource
app_insights_config = ApplicationInsightsConfiguration(
resource_id=APPLICATION_INSIGHTS_RESOURCE_ID,
query=KUSTO_QUERY
)
# Connect to your Azure OpenAI Service resource. You must use a GPT model deployment for this example.
deployment_name = "gpt-4"
api_version = "2024-08-01-preview"
# This is your Azure OpenAI Service connection name, which can be found in your Azure AI Foundry project under the 'Models + Endpoints' tab.
default_connection = project_client.connections._get_connection(
"aoai_connection_name"
)
model_config = {
"azure_deployment": deployment_name,
"api_version": api_version,
"type": "azure_openai",
"azure_endpoint": default_connection.properties["target"]
}
Затем настройте вычислители, которые вы хотите использовать:
# RelevanceEvaluator
# id for each evaluator can be found in your Azure AI Foundry registry - please see documentation for more information
# init_params is the configuration for the model to use to perform the evaluation
# data_mapping is used to map the output columns of your query to the names required by the evaluator
relevance_evaluator_config = EvaluatorConfiguration(
id="azureml://registries/azureml-staging/models/Relevance-Evaluator/versions/4",
init_params={"model_config": model_config},
data_mapping={"query": "${data.Input}", "response": "${data.Output}"}
)
# CoherenceEvaluator
coherence_evaluator_config = EvaluatorConfiguration(
id=CoherenceEvaluator.id,
init_params={"model_config": model_config},
data_mapping={"query": "${data.Input}", "response": "${data.Output}"}
)
Наконец, определите повторение и создайте расписание:
Примечание. На этапах предварительных требований вы создали управляемое удостоверение, назначаемое пользователем, для проверки подлинности расписания оценки в Сети в ресурсе Application Insights. В AzureMSIClientId
параметре properties
EvaluationSchedule
класса используется clientId
это удостоверение.
# Frequency to run the schedule
recurrence_trigger = RecurrenceTrigger(frequency="day", interval=1)
# Dictionary of evaluators
evaluators = {
"relevance": relevance_evaluator_config,
"coherence" : coherence_evaluator_config
}
name = SAMPLE_NAME
description = f"{SAMPLE_NAME} description"
# AzureMSIClientId is the clientID of the User-assigned managed identity created during set-up - see documentation for how to find it
properties = {"AzureMSIClientId": "your_client_id"}
# Configure the online evaluation schedule
evaluation_schedule = EvaluationSchedule(
data=app_insights_config,
evaluators=evaluators,
trigger=recurrence_trigger,
description=description,
properties=properties)
# Create the online evaluation schedule
created_evaluation_schedule = project_client.evaluations.create_or_replace_schedule(name, evaluation_schedule)
print(f"Successfully submitted the online evaluation schedule creation request - {created_evaluation_schedule.name}, currently in {created_evaluation_schedule.provisioning_state} state.")
Выполнение операций с расписанием оценки по сети
Вы можете получить, перечислить и отключить расписания онлайн-оценки, добавив следующий код в скрипт конфигурации онлайн-оценки:
Предупреждение. Подождите небольшое время (около 30 секунд) между созданием расписания оценки по сети и запуском get_schedule()
API.
Получите расписание оценки по сети:
name = "<my-online-evaluation-name>"
get_evaluation_schedule = project_client.evaluations.get_schedule(name)
Список всех расписаний оценки по сети:
count = 0
for evaluation_schedule in project_client.evaluations.list_schedule():
count += 1
print(f"{count}. {evaluation_schedule.name} "
f"[IsEnabled: {evaluation_schedule.is_enabled}]")
print(f"Total evaluation schedules: {count}")
Отключите (обратимое удаление) расписание оценки по сети:
name = "<my-online-evaluation-name>"
project_client.evaluations.disable_schedule(name)