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


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

Применяется только к:Портал Foundry (классический). Эта статья недоступна для нового портала Foundry. Дополнительные сведения о новом портале.

Замечание

Ссылки в этой статье могут открывать содержимое в новой документации Майкрософт Foundry вместо классической документации Foundry, которую вы просматриваете в данный момент.

Это важно

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

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

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

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

Начать

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

pip install azure-ai-evaluation

Замечание

Для получения дополнительной информации см. клиентскую библиотеку для оценки AI Azure на Python.

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

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

Категория Оценщиков
Общее назначение 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) или оба одновременно.

Оценщик Поддержка беседы и одиночного текстового взаимодействия Поддержка беседы и однократного взаимодействия для текста и изображения Поддержка только одного поворота текста Требует ground_truth Поддерживает входные данные агента
Оценщики качества
IntentResolutionEvaluator
ToolCallAccuracyEvaluator
TaskAdherenceEvaluator
GroundednessEvaluator
GroundednessProEvaluator
RetrievalEvaluator
DocumentRetrievalEvaluator
RelevanceEvaluator
CoherenceEvaluator
FluencyEvaluator
ResponseCompletenessEvaluator
QAEvaluator
Оценщики обработки естественного языка (NLP)
SimilarityEvaluator
F1ScoreEvaluator
RougeScoreEvaluator
GleuScoreEvaluator
BleuScoreEvaluator
MeteorScoreEvaluator
Оценщики безопасности
ViolenceEvaluator
SexualEvaluator
SelfHarmEvaluator
HateUnfairnessEvaluator
ProtectedMaterialEvaluator
ContentSafetyEvaluator
UngroundedAttributesEvaluator
CodeVulnerabilityEvaluator
IndirectAttackEvaluator
Azure OpenAI Graders
AzureOpenAILabelGrader
AzureOpenAIStringCheckGrader
AzureOpenAITextSimilarityGrader
AzureOpenAIGrader

Замечание

Оценщики качества с поддержкой ИИ, кроме SimilarityEvaluator, включают поле для указания причины. Они используют такие методы, как цепочка мышления, чтобы создать объяснение оценки.

Они расходуют больше токенов при генерации в результате улучшенного качества оценки. В частности, max_token для создания оценочных модулей установлено значение 800 для большинства оценочных модулей с поддержкой ИИ. Он имеет значение 1600 для RetrievalEvaluator и 3000 для ToolCallAccuracyEvaluator, чтобы учитывать более длительные входные данные.

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

Дополнительные сведения о требованиях к данным для агентических вычислителей см. в разделе "Оценка агентов ИИ".

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

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

from azure.ai.evaluation import RelevanceEvaluator

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

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

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

{"query":"What is the capital/major city 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 evaluator:
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-4gpt-4-turbogpt-4oилиgpt-4o-mini) в вашей учетной записи.model_config Модель GPT выступает в качестве судьи для оценки данных оценки. Мы поддерживаем как конфигурации моделей Azure OpenAI, так и OpenAI. Для оптимальной производительности и разборчивости ответов с нашими оценщиками рекомендуется использовать модели GPT, которые не находятся в предварительном просмотре.

Замечание

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

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

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

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

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

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

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

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

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

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

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

Если этот сеанс является вашим первым запуском оценок и логгирования в проект Foundry, возможно, потребуется выполнить следующие шаги по настройке.

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

Оцените на наборе данных и записывайте результаты в 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 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 Foundry project URL.
    output_path="./myevalresults.json"
)

Подсказка

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

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

{'metrics': {'answer_length.value': 49.333333333333336,
             'groundedness.gpt_groundeness': 5.0, 'groundedness.groundeness': 5.0},
 'rows': [{'inputs.response': 'Paris is the capital/major city of France.',
           'inputs.context': 'Paris has been the capital/major city of France since '
                                  'the 10th century and is known for its '
                                  'cultural and historical landmarks.',
           'inputs.query': 'What is the capital/major city 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() требует определенного формата данных и имен ключей параметров для корректного отображения диаграмм результатов оценки в вашем проекте Foundry.

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

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

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

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

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

Оценщик Параметр ключевого слова
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 параметр. Этот параметр отправляет запросы приложению для сбора ответов, а затем запускает ваши инструменты оценки для обработки полученных запросов и ответов.

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

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

{"query":"When was United States found ?", "response":"1776"}
{"query":"What is the capital/major city 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}"
            } 
        }
    }
)