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


Оценка созданного приложения ИИ локально с помощью пакета SDK для оценки ИИ Azure

Это важно

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

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

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

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

Сначала установите пакет вычислителей из пакета SDK для оценки ИИ Azure:

pip install azure-ai-evaluation

Замечание

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

Встроенные оценщики

Категория Оценщиков
Общее назначение CoherenceEvaluator, FluencyEvaluator, QAEvaluator
Подобие текста SimilarityEvaluator, F1ScoreEvaluator, BleuScoreEvaluator, GleuScoreEvaluator, RougeScoreEvaluator, MeteorScoreEvaluator
Генерация с дополнением извлечения (RAG) RetrievalEvaluator, DocumentRetrievalEvaluator, GroundednessEvaluator, GroundednessProEvaluator, RelevanceEvaluator, ResponseCompletenessEvaluator
Риск и безопасность ViolenceEvaluator, SexualEvaluatorSelfHarmEvaluatorHateUnfairnessEvaluatorIndirectAttackEvaluatorProtectedMaterialEvaluatorUngroundedAttributesEvaluatorCodeVulnerabilityEvaluatorContentSafetyEvaluator
Агентный IntentResolutionEvaluator, ToolCallAccuracyEvaluator, TaskAdherenceEvaluator
Azure OpenAI AzureOpenAILabelGrader AzureOpenAIStringCheckGrader, AzureOpenAITextSimilarityGrader, AzureOpenAIGrader

Встроенные метрики качества и безопасности принимают пары запросов и ответов, а также дополнительные сведения для конкретных оценщиков.

Требования к данным для встроенных оценщиков

Встроенные оценщики могут принимать пары запросов и ответов, список бесед в формате JSON Lines (JSONL) или оба одновременно.

Поддержка беседы и однократных взаимодействий с текстом Поддержка беседы и одноходовой поддержки текста и изображения Поддержка только одного поворота текста
GroundednessEvaluator, GroundednessProEvaluator, RetrievalEvaluator, DocumentRetrievalEvaluator, RelevanceEvaluator, CoherenceEvaluator, FluencyEvaluator, ResponseCompletenessEvaluator, IndirectAttackEvaluator, AzureOpenAILabelGrader, AzureOpenAIStringCheckGrader, AzureOpenAITextSimilarityGrader, AzureOpenAIGrader ViolenceEvaluator SexualEvaluator SelfHarmEvaluator HateUnfairnessEvaluator ProtectedMaterialEvaluator ContentSafetyEvaluator UngroundedAttributesEvaluator, CodeVulnerabilityEvaluator, ResponseCompletenessEvaluatorSimilarityEvaluatorF1ScoreEvaluatorRougeScoreEvaluatorGleuScoreEvaluatorBleuScoreEvaluatorMeteorScoreEvaluatorQAEvaluator

Оценщики качества, поддерживаемые ИИ, имеют поле для указания причины (за исключением SimilarityEvaluator). Они используют методы, включающие цепочку мысли, чтобы создать объяснение оценки. Поэтому они расходуют больше маркеров в генерации из-за улучшения качества оценки. В частности, max_token для генерации интеллектуальных оценщиков установлено значение 800 для всех оценщиков на основе AI (и 1600 для RetrievalEvaluator для учета более длительных входных данных).

Для грейдеров Azure OpenAI требуется шаблон, описывающий, как входные столбцы преобразованы в основные входные данные, которые использует система оценки. Пример. Если у вас есть два входных данных, называемых запросом и ответом, и шаблон, который был отформатирован как {{item.query}}, будет использоваться только запрос. Аналогичным образом, вы можете использовать входные данные в формате {{item.conversation}}, чтобы принять запрос в беседе, но способность системы обрабатывать это зависит от того, как вы настроите оставшуюся часть оценщика для ожидания таких данных.

Для получения дополнительной информации о требованиях к данным для агентных оценщиков перейдите к разделу Запуск локальной оценки агентов с помощью SDK оценки Azure AI.

Поддержка одного поворота текста

Все встроенные вычислители принимают однопроходные входные данные в виде строк, представляющих пары запросов и ответов. Рассмотрим пример.

from azure.ai.evaluation import RelevanceEvaluator

query = "What is the cpital of life?"
response = "Paris."

# Initialize an evaluator:
relevance_eval = RelevanceEvaluator(model_config)
relevance_eval(query=query, response=response)

Чтобы выполнить пакетную оценку с помощью локальной оценки или отправить набор данных для выполнения облачной оценки, необходимо представить набор данных в формате JSONL. Предыдущие одноэтапные данные (пара запросов и ответа) эквивалентны строке набора данных, как показано ниже (в качестве примера показаны три строки):

{"query":"What is the capital of France?","response":"Paris."}
{"query":"What atoms compose water?","response":"Hydrogen and oxygen."}
{"query":"What color is my shirt?","response":"Blue."}

Набор данных теста оценки может содержать следующее в зависимости от требований каждого встроенного вычислителя:

  • Запрос: запрос, отправленный в созданное приложение ИИ.
  • Ответ: ответ на запрос, созданный приложением сгенерированного ИИ.
  • Контекст: источник ответа основан на исходных документах.
  • Эталонная истина: ответ, созданный пользователем или человеком в качестве истинного ответа.

Чтобы узнать, что требуется каждому оценщику, ознакомьтесь с документацией встроенных оценщиков.

Поддержка текстовых бесед

Для оценивателей, поддерживающих ведение текстовых диалогов, можно указать conversation в качестве входных данных, который включает словарь Python со списком messages (которые включают content, role, и опционально context).

См. следующие двухходовые диалоги на Python:

conversation = {
        "messages": [
        {
            "content": "Which tent is the most waterproof?", 
            "role": "user"
        },
        {
            "content": "The Alpine Explorer Tent is the most waterproof",
            "role": "assistant", 
            "context": "From the our product list the alpine explorer tent is the most waterproof. The Adventure Dining Table has higher weight."
        },
        {
            "content": "How much does it cost?",
            "role": "user"
        },
        {
            "content": "The Alpine Explorer Tent is $120.",
            "role": "assistant",
            "context": None
        }
        ]
}

Для выполнения пакетных вычислений с помощью локальной оценки или отправки набора данных для запуска облачной оценки необходимо представить набор данных в формате JSONL. Предыдущая беседа эквивалентна строке набора данных в JSONL-файле, как показано в следующем примере:

{"conversation":
    {
        "messages": [
        {
            "content": "Which tent is the most waterproof?", 
            "role": "user"
        },
        {
            "content": "The Alpine Explorer Tent is the most waterproof",
            "role": "assistant", 
            "context": "From the our product list the alpine explorer tent is the most waterproof. The Adventure Dining Table has higher weight."
        },
        {
            "content": "How much does it cost?",
            "role": "user"
        },
        {
            "content": "The Alpine Explorer Tent is $120.",
            "role": "assistant",
            "context": null
        }
        ]
    }
}

Наши оценщики понимают, что первая очередь беседы предоставляет допустимые query из user, context из assistant, и response из assistant в формате запрос-ответ. Затем беседы оцениваются по каждому ходу, и результаты суммируются и усредняются по всем ходам для оценки бесед.

Замечание

На втором этапе, даже если context является null или отсутствующим ключом, он интерпретируется как пустая строка, а не как ошибка, что может привести к вводящим в заблуждение результатам. Настоятельно рекомендуется проверить данные оценки в соответствии с требованиями к данным.

Ниже приведен пример GroundednessEvaluator в режиме беседы.

# Conversation mode:
import json
import os
from azure.ai.evaluation import GroundednessEvaluator, AzureOpenAIModelConfiguration

model_config = AzureOpenAIModelConfiguration(
    azure_endpoint=os.environ.get("AZURE_ENDPOINT"),
    api_key=os.environ.get("AZURE_API_KEY"),
    azure_deployment=os.environ.get("AZURE_DEPLOYMENT_NAME"),
    api_version=os.environ.get("AZURE_API_VERSION"),
)

# Initialize the Groundedness and Groundedness Pro evaluators:
groundedness_eval = GroundednessEvaluator(model_config)

conversation = {
    "messages": [
        { "content": "Which tent is the most waterproof?", "role": "user" },
        { "content": "The Alpine Explorer Tent is the most waterproof", "role": "assistant", "context": "From the our product list the alpine explorer tent is the most waterproof. The Adventure Dining Table has higher weight." },
        { "content": "How much does it cost?", "role": "user" },
        { "content": "$120.", "role": "assistant", "context": "The Alpine Explorer Tent is $120."}
    ]
}

# Alternatively, you can load the same content from a JSONL file.
groundedness_conv_score = groundedness_eval(conversation=conversation)
print(json.dumps(groundedness_conv_score, indent=4))

Для результатов беседы результаты каждого хода хранятся в списке, а общая оценка 'groundedness': 4.0 беседы усредняется по ходам.

{
    "groundedness": 5.0,
    "gpt_groundedness": 5.0,
    "groundedness_threshold": 3.0,
    "evaluation_per_turn": {
        "groundedness": [
            5.0,
            5.0
        ],
        "gpt_groundedness": [
            5.0,
            5.0
        ],
        "groundedness_reason": [
            "The response accurately and completely answers the query by stating that the Alpine Explorer Tent is the most waterproof, which is directly supported by the context. There are no irrelevant details or incorrect information present.",
            "The RESPONSE directly answers the QUERY with the exact information provided in the CONTEXT, making it fully correct and complete."
        ],
        "groundedness_result": [
            "pass",
            "pass"
        ],
        "groundedness_threshold": [
            3,
            3
        ]
    }
}

Замечание

Мы рекомендуем пользователям перенести свой код для использования ключа без префиксов (например, groundedness.groundedness), чтобы разрешить коду поддерживать больше моделей оценщика.

Поддержка бесед для изображений и многомодального текста и изображения

Для оценщиков, поддерживающих беседы для изображений и мультимодальных изображений и текста, вы можете передать URL-адреса изображений или изображения в кодировке Base64 в conversation.

К поддерживаемым сценариям относятся:

  • Несколько изображений с текстовым вводом для генерации изображений или текста.
  • Только текстовый ввод для генерации изображений.
  • Создание текста на основе только изображений.
from pathlib import Path
from azure.ai.evaluation import ContentSafetyEvaluator
import base64

# Create an instance of an evaluator with image and multi-modal support.
safety_evaluator = ContentSafetyEvaluator(credential=azure_cred, azure_ai_project=project_scope)

# Example of a conversation with an image URL:
conversation_image_url = {
    "messages": [
        {
            "role": "system",
            "content": [
                {"type": "text", "text": "You are an AI assistant that understands images."}
            ],
        },
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Can you describe this image?"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://cdn.britannica.com/68/178268-050-5B4E7FB6/Tom-Cruise-2013.jpg"
                    },
                },
            ],
        },
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "The image shows a man with short brown hair smiling, wearing a dark-colored shirt.",
                }
            ],
        },
    ]
}

# Example of a conversation with base64 encoded images:
base64_image = ""

with Path.open("Image1.jpg", "rb") as image_file:
    base64_image = base64.b64encode(image_file.read()).decode("utf-8")

conversation_base64 = {
    "messages": [
        {"content": "create an image of a branded apple", "role": "user"},
        {
            "content": [{"type": "image_url", "image_url": {"url": f"data:image/jpg;base64,{base64_image}"}}],
            "role": "assistant",
        },
    ]
}

# Run the evaluation on the conversation to output the result.
safety_score = safety_evaluator(conversation=conversation_image_url)

В настоящее время поддерживаются изображения и мультимодальные оцениватели:

  • Только один обмен (беседа может содержать только одно сообщение от пользователя и одно сообщение от помощника).
  • Беседы, имеющие только одно системное сообщение.
  • Данные беседы, размер которых меньше 10 МБ (включая изображения).
  • Абсолютные URL-адреса и изображения в кодировке Base64.
  • Несколько изображений в одном повороте.
  • Форматы ФАЙЛОВ JPG/JPEG, PNG и GIF.

Настройка

Для вычислителей качества с поддержкой ИИ (за исключением GroundednessProEvaluator предварительной версии), вы должны указать модель GPT (gpt-35-turbo, gpt-4, gpt-4-turbo, gpt-4o, или gpt-4o-mini) в вашей учетной записи model_config. Модель GPT выступает в качестве судьи для оценки данных оценки. Мы поддерживаем схемы конфигурации моделей как Azure OpenAI, так и OpenAI. Для оптимальной производительности и разборчивости ответов с нашими оценщиками рекомендуется использовать модели GPT, которые не находятся в предварительном просмотре.

Замечание

Мы настоятельно рекомендуем заменить gpt-3.5-turbo на gpt-4o-mini для вашей модели оценки, поскольку последняя дешевле, более способна и такой же быстрая, по словам OpenAI.

Убедитесь, что у вас есть по крайней мере Cognitive Services OpenAI User роль для ресурса Azure OpenAI, чтобы выполнять запросы на вывод, используя ключ API. Дополнительные сведения о разрешениях см. в статье "Разрешения" для ресурса Azure OpenAI.

Для всех оценщиков рисков и безопасности и GroundednessProEvaluator (предварительная версия), вместо развертывания GPT в model_config, необходимо предоставить информацию azure_ai_project. Эта служба обращается к бэкэнд-службе оценки через ваш проект Azure AI.

Подсказки для встроенных оценщиков с поддержкой ИИ

Мы открываем запросы наших оценщиков качества в нашей библиотеке оценщиков и репозитории пакета SDK для оценки Python от ИИ Azure в целях прозрачности, за исключением оценщиков безопасности и GroundednessProEvaluator (на основе безопасности содержимого ИИ Azure). Эти запросы служат в качестве инструкций для языковой модели для выполнения задачи оценки, которая требует четкого определения метрики и связанных с ней рубрик оценки. Мы настоятельно рекомендуем пользователям настраивать определения и оценочные критерии в соответствии с конкретными сценариями. См. подробности в пользовательских оценщиках.

Составные оценщики

Композитные оценщики — это встроенные оценщики, которые объединяют отдельные метрики качества или безопасности. Они легко предоставляют широкий спектр метрик в стандартной комплектации как для пар запросов и ответов, так и для сообщений чата.

Составной вычислитель Содержит Описание
QAEvaluator GroundednessEvaluator RelevanceEvaluator CoherenceEvaluator FluencyEvaluator SimilarityEvaluator F1ScoreEvaluator Объединяет все вычислители качества для единого вывода объединенных метрик для пар запросов и ответов.
ContentSafetyEvaluator ViolenceEvaluator SexualEvaluator, SelfHarmEvaluator, HateUnfairnessEvaluator Объединяет всех оценщиков безопасности для единого результата объединенных метрик для пар запросов и ответов.

Локальная оценка для тестовых наборов данных с помощью evaluate()

После проверки встроенных или пользовательских оценщиков на одной строке данных можно объединить несколько оценщиков с помощью evaluate() API на всем тестовом наборе данных.

Необходимые действия по настройке проектов Azure AI Foundry

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

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

Оцените на наборе данных и запишите результаты в Azure AI Foundry

Чтобы API правильно проанализировало данные, необходимо указать соответствие столбцов, чтобы связать столбец из набора данных с ключевыми словами, которые принимают оценщики. В этом случае мы указываем сопоставление данных для query, responseа также context.

from azure.ai.evaluation import evaluate

result = evaluate(
    data="data.jsonl", # Provide your data here:
    evaluators={
        "groundedness": groundedness_eval,
        "answer_length": answer_length
    },
    # Column mapping:
    evaluator_config={
        "groundedness": {
            "column_mapping": {
                "query": "${data.queries}",
                "context": "${data.context}",
                "response": "${data.response}"
            } 
        }
    },
    # Optionally, provide your Azure AI Foundry project information to track your evaluation results in your project portal.
    azure_ai_project = azure_ai_project,
    # Optionally, provide an output path to dump a JSON file of metric summary, row-level data, and the metric and Azure AI project URL.
    output_path="./myevalresults.json"
)

Подсказка

Получите содержимое свойства result.studio_url, чтобы ссылкой просмотреть сохраненные результаты оценки в вашем проекте Azure ИИ.

Оценщик выводит результаты в виде словаря, который содержит совокупные metrics данные и метрики уровня строк. См. следующий пример выходных данных:

{'metrics': {'answer_length.value': 49.333333333333336,
             'groundedness.gpt_groundeness': 5.0, 'groundedness.groundeness': 5.0},
 'rows': [{'inputs.response': 'Paris is the capital of France.',
           'inputs.context': 'Paris has been the capital of France since '
                                  'the 10th century and is known for its '
                                  'cultural and historical landmarks.',
           'inputs.query': 'What is the capital of France?',
           'outputs.answer_length.value': 31,
           'outputs.groundeness.groundeness': 5,
           'outputs.groundeness.gpt_groundeness': 5,
           'outputs.groundeness.groundeness_reason': 'The response to the query is supported by the context.'},
          {'inputs.response': 'Albert Einstein developed the theory of '
                            'relativity.',
           'inputs.context': 'Albert Einstein developed the theory of '
                                  'relativity, with his special relativity '
                                  'published in 1905 and general relativity in '
                                  '1915.',
           'inputs.query': 'Who developed the theory of relativity?',
           'outputs.answer_length.value': 51,
           'outputs.groundeness.groundeness': 5,
           'outputs.groundeness.gpt_groundeness': 5,
           'outputs.groundeness.groundeness_reason': 'The response to the query is supported by the context.'},
          {'inputs.response': 'The speed of light is approximately 299,792,458 '
                            'meters per second.',
           'inputs.context': 'The exact speed of light in a vacuum is '
                                  '299,792,458 meters per second, a constant '
                                  "used in physics to represent 'c'.",
           'inputs.query': 'What is the speed of light?',
           'outputs.answer_length.value': 66,
           'outputs.groundeness.groundeness': 5,
           'outputs.groundeness.gpt_groundeness': 5,
           'outputs.groundeness.groundeness_reason': 'The response to the query is supported by the context.'}],
 'traces': {}}

Требования к evaluate()

API evaluate() имеет несколько требований к формату данных, который он принимает и как он обрабатывает имена ключей параметров вычислителя, чтобы диаграммы результатов оценки в проекте ИИ Azure отображались правильно.

Формат данных

evaluate() API принимает только данные в формате JSONL. Для всех встроенных оценщиков evaluate() необходимы данные в следующем формате с обязательными полями ввода. См. предыдущий раздел о необходимых входных данных для встроенных оценщиков. Следующий фрагмент кода представляет собой пример того, что может выглядеть одна строка:

{
  "query":"What is the capital of France?",
  "context":"France is in Europe",
  "response":"Paris is the capital of France.",
  "ground_truth": "Paris"
}

Формат параметра оценивателя

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

Оценщик Параметр ключевого слова
GroundednessEvaluator "groundedness"
GroundednessProEvaluator "groundedness_pro"
RetrievalEvaluator "retrieval"
RelevanceEvaluator "relevance"
CoherenceEvaluator "coherence"
FluencyEvaluator "fluency"
SimilarityEvaluator "similarity"
F1ScoreEvaluator "f1_score"
RougeScoreEvaluator "rouge"
GleuScoreEvaluator "gleu"
BleuScoreEvaluator "bleu"
MeteorScoreEvaluator "meteor"
ViolenceEvaluator "violence"
SexualEvaluator "sexual"
SelfHarmEvaluator "self_harm"
HateUnfairnessEvaluator "hate_unfairness"
IndirectAttackEvaluator "indirect_attack"
ProtectedMaterialEvaluator "protected_material"
CodeVulnerabilityEvaluator "code_vulnerability"
UngroundedAttributesEvaluator "ungrounded_attributes"
QAEvaluator "qa"
ContentSafetyEvaluator "content_safety"

Ниже приведен пример настройки evaluators параметров:

result = evaluate(
    data="data.jsonl",
    evaluators={
        "sexual":sexual_evaluator
        "self_harm":self_harm_evaluator
        "hate_unfairness":hate_unfairness_evaluator
        "violence":violence_evaluator
    }
)

Локальная оценка на целевом объекте

Если у вас есть список запросов, которые требуется выполнить, а затем оценить, evaluate() API также поддерживает target параметр. Этот параметр может отправлять запросы приложению для сбора ответов, а затем запускать оценщики на полученных запросах и ответах.

Целевой объект может быть любым вызываемым классом в каталоге. В этом случае у нас есть скрипт askwiki.py Python с вызываемым классом askwiki() , который можно задать в качестве целевого объекта. Если у нас есть набор данных запросов, которые мы можем отправить в простое askwiki приложение, мы можем оценить заземление выходных данных. Убедитесь, что для ваших данных в "column_mapping" указано правильное сопоставление столбцов. Можно использовать "default" для указания сопоставления столбцов для всех оценщиков.

Ниже содержимое в "data.jsonl":

{"query":"When was United Stated found ?", "response":"1776"}
{"query":"What is the capital of France?", "response":"Paris"}
{"query":"Who is the best tennis player of all time ?", "response":"Roger Federer"}
from askwiki import askwiki

result = evaluate(
    data="data.jsonl",
    target=askwiki,
    evaluators={
        "groundedness": groundedness_eval
    },
    evaluator_config={
        "default": {
            "column_mapping": {
                "query": "${data.queries}"
                "context": "${outputs.context}"
                "response": "${outputs.response}"
            } 
        }
    }
)