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


Оценочные наборы

Внимание

Эта функция предоставляется в режиме общедоступной предварительной версии.

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

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

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

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

Для требуемой схемы оценочного набора см . схему входных данных агента.

Примеры наборов вычислений

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

Пример оценочного набора с только 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и 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, retrieved_contextresponseи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.",
        "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, , expected_responseresponseretrieved_contextиexpected_retrieved_context

level_4_data  = [
    {
        "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_response": "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.
  • Метки человека по природе шумные и несогласованные, например из-за различных интерпретаций вопроса. Это важная часть процесса. Использование меток человека может выявить интерпретации вопросов, которые вы не рассмотрели, и которые могут дать представление о поведении, которое вы наблюдаете в приложении.