Наборы оценок (MLflow 2)

Important

Databricks рекомендует использовать MLflow 3 для оценки и мониторинга приложений ИИ. На этой странице описывается оценка агента MLflow 2.

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

Databricks рекомендует создать набор оценочных данных с человеческой разметкой, который состоит из репрезентативных вопросов и правильных ответов. Если приложение включает шаг извлечения, вы можете предоставить вспомогательные документы, на которых вы ожидаете, что ответ будет основан. Чтобы приступить к созданию оценочного набора, Databricks предоставляет пакет SDK для создания высококачественных искусственных вопросов и эталонных ответов, которые можно использовать непосредственно в оценке работы агентов или отправить экспертам в данной области для проверки. См. Синтез наборов оценки.

Хороший набор оценки имеет следующие характеристики:

  • Он должен точно отражать диапазон запросов, которые приложение встретит в рабочей среде.
  • Сложно. Это должно включать сложные и разнообразные случаи для эффективного тестирования полного спектра возможностей приложения.
  • Постоянно обновляемое: оно должно регулярно обновляться, чтобы отразить способ использования приложения и изменение шаблонов рабочего трафика.

Для требуемой схемы оценочного набора см. схему входных данных для оценки агента (MLflow 2).

Примеры наборов оценок

В этом разделе содержатся простые примеры наборов для оценки.

Пример оценочного набора, содержащего только request

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
    }
]

Пример оценочного набора с request и expected_response

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_response": "There's no significant difference.",
    }
]

Пример оценочного набора с request, expected_response, и expected_retrieved_content

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_retrieved_context": [
            {
                "doc_uri": "doc_uri_1",
            },
            {
                "doc_uri": "doc_uri_2",
            },
        ],
        "expected_response": "There's no significant difference.",
    }
]

Пример оценочного набора, состоящего из только request и response

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
    }
]

Пример оценочного набора с произвольным форматированием request и response

eval_set = [
    {
        "request": {"query": "Difference between", "item_a": "reduceByKey", "item_b": "groupByKey"},
        "response": {
            "differences": [
                "reduceByKey aggregates data before shuffling",
                "groupByKey shuffles all data",
                "reduceByKey is more efficient",
            ]
        }
    }
]

Пример оценочного набора с request, response, и guidelines

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        # You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
        "guidelines": {
            "english": ["The response must be in English"],
            "clarity": ["The response must be clear, coherent, and concise"],
        }
    }
]

пример оценочного набора с request, response, guidelinesи expected_facts

eval_set = [
    {
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "expected_facts": [
            "There's no significant difference.",
        ],
        # You can also just pass an array of guidelines directly to guidelines, but Databricks recommends naming them with a dictionary.
        "guidelines": {
            "english": ["The response must be in English"],
            "clarity": ["The response must be clear, coherent, and concise"],
        }
    }
]

Пример оценочного набора с request, response, и retrieved_context

eval_set = [
    {
        "request_id": "request-id", # optional, but useful for tracking
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "retrieved_context": [
            {
                # In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
                "content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
                "doc_uri": "doc_uri_2_1",
            },
            {
                "content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
                "doc_uri": "doc_uri_6_extra",
            },
        ],
    }
]

Пример оценочного набора с request, response, retrieved_context, и expected_facts

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_facts": [
            "There's no significant difference.",
        ],
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "retrieved_context": [
            {
                # In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
                "content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
                "doc_uri": "doc_uri_2_1",
            },
            {
                "content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
                "doc_uri": "doc_uri_6_extra",
            },
        ],
    }
]

Пример оценочного набора с request, response, retrieved_context, expected_factsи expected_retrieved_context

eval_set  = [
    {
        "request_id": "request-id",
        "request": "What is the difference between reduceByKey and groupByKey in Spark?",
        "expected_retrieved_context": [
            {
                "doc_uri": "doc_uri_2_1",
            },
            {
                "doc_uri": "doc_uri_2_2",
            },
        ],
        "expected_facts": [
            "There's no significant difference.",
        ],
        "response": "reduceByKey aggregates data before shuffling, whereas groupByKey shuffles all data, making reduceByKey more efficient.",
        "retrieved_context": [
            {
                # In `retrieved_context`, `content` is optional, but delivers additional functionality if provided (the Databricks Context Relevance LLM judge runs to check the relevance of the provided content to the request).
                "content": "reduceByKey reduces the amount of data shuffled by merging values before shuffling.",
                "doc_uri": "doc_uri_2_1",
            },
            {
                "content": "groupByKey may lead to inefficient data shuffling due to sending all values across the network.",
                "doc_uri": "doc_uri_6_extra",
            },
        ],
    }
]

рекомендации по разработке оценочного набора

  • Рассмотрим каждый пример или группу примеров в наборе оценивания в качестве модульного теста. То есть каждый пример должен соответствовать конкретному сценарию с явным ожидаемым результатом. Например, рассмотрим тестирование более длительных контекстов, многошаговое рассуждение и способность делать выводы и получать ответы из косвенных доказательств.
  • Рассмотрите возможность тестирования враждебных сценариев со стороны вредоносных пользователей.
  • Нет конкретного руководства по количеству вопросов, которые следует включить в набор оценки, но четкие сигналы от высококачественных данных обычно выполняют лучше, чем шумные сигналы от слабых данных.
  • Рассмотрите возможность включения примеров, которые очень сложны, даже для людей, на которые сложно ответить.
  • Независимо от того, создаете вы приложение общего назначения или нацелены на конкретную область, ваше приложение, скорее всего, столкнется с широким спектром вопросов. Оценочный набор должен отражать это. Например, если вы создаете приложение для определения конкретных вопросов о персонале, следует по-прежнему рассмотреть возможность тестирования других доменов (например, операций), чтобы убедиться, что приложение не галлюцинирует или не предоставляет вредоносные ответы.
  • Высококачественные и согласованные вручную метки — лучший способ убедиться, что значения эталона, предоставляемые вами для приложения, точно отражают требуемое поведение. Ниже приведены некоторые шаги по обеспечению высокого качества меток человека:
    • Объединённые ответы (метки), предоставленные несколькими разметчиками для одного и того же вопроса.
    • Убедитесь, что инструкции по маркировке понятны и что человеческие метки согласованы.
    • Убедитесь, что условия для процесса маркировки человека идентичны формату запросов, отправленных приложению RAG.
  • Метки человека по природе шумные и несогласованные, например из-за различных интерпретаций вопроса. Это важная часть процесса. Использование человеческой разметки может выявить интерпретации вопросов, о которых вы ранее не задумывались, и которые могут дать представление о наблюдаемом вами поведении в приложении.