Как выполнить оценку и просмотреть результаты
Внимание
Эта функция предоставляется в режиме общедоступной предварительной версии.
В этой статье описывается, как выполнить оценку и просмотреть результаты при разработке приложения ИИ. Сведения о том, как отслеживать качество развернутых агентов на рабочем трафике, см. в статье "Мониторинг качества агента на рабочем трафике".
Чтобы использовать оценку агента во время разработки приложений, необходимо указать набор оценки. Оценочный набор — это набор типичных запросов, которые пользователь будет выполнять в приложении. Набор оценки также может включать ожидаемый ответ (земная истина) для каждого входного запроса. Если указан ожидаемый ответ, оценка агента может вычислить дополнительные метрики качества, такие как правильность и достаточность контекста. Цель оценочного набора — помочь вам измерить и прогнозировать производительность агентного приложения, проверив его на репрезентативных вопросов.
Дополнительные сведения об оценочных наборах см. в разделе "Оценки наборов". Для требуемой схемы см . схему входных данных для оценки агента.
Чтобы начать оценку, используйте mlflow.evaluate()
метод из API MLflow. mlflow.evaluate()
вычисляет оценки качества вместе с метриками задержки и затрат для каждого входного набора, а также агрегирует эти результаты во всех входных данных. Эти результаты также называются результатами оценки. В следующем коде показан пример вызова mlflow.evaluate()
:
%pip install databricks-agents
dbutils.library.restartPython()
import mlflow
import pandas as pd
eval_df = pd.DataFrame(...)
# Puts the evaluation results in the current Run, alongside the logged model parameters
with mlflow.start_run():
logged_model_info = mlflow.langchain.log_model(...)
mlflow.evaluate(data=eval_df, model=logged_model_info.model_uri,
model_type="databricks-agent")
В этом примере mlflow.evaluate()
регистрируется результат оценки в заключив запуск MLflow, а также сведения, зарегистрированные другими командами (например, параметры модели). При вызове mlflow.evaluate()
за пределами запуска MLflow запускается новая оценка выполнения и журналов в результате выполнения. Дополнительные сведения о mlflow.evaluate()
результатах оценки, зарегистрированных в ходе выполнения, см . в документации по MLflow.
Требования
Вспомогательные функции ИИ на основе ИИ Azure должны быть включены для рабочей области.
Как предоставить входные данные для выполнения оценки
Существует два способа предоставления входных данных для выполнения оценки:
Укажите ранее созданные выходные данные для сравнения с набором оценки. Этот параметр рекомендуется, если вы хотите оценить выходные данные из приложения, которое уже развернуто в рабочей среде, или если вы хотите сравнить результаты оценки между конфигурациями оценки.
С помощью этого параметра можно указать набор оценки, как показано в следующем коде. Оценочный набор должен содержать ранее созданные выходные данные. Более подробные примеры см. в разделе "Пример: передача ранее созданных выходных данных в оценку агента".
evaluation_results = mlflow.evaluate( data=eval_set_with_chain_outputs_df, # pandas DataFrame with the evaluation set and application outputs model_type="databricks-agent", )
Передайте приложение в качестве входного аргумента.
mlflow.evaluate()
вызывает приложение для каждого входного значения в наборе вычислений и сообщает оценки качества и другие метрики для каждого созданного выходных данных. Этот параметр рекомендуется использовать, если приложение зарегистрировано с помощью MLflow с включенной трассировкой MLflow или если приложение реализовано как функция Python в записной книжке. Этот параметр не рекомендуется, если приложение было разработано за пределами Databricks или развернуто за пределами Databricks.С помощью этого параметра можно указать набор вычислений и приложение в вызове функции, как показано в следующем коде. Более подробные примеры см. в разделе "Пример. Передача приложения в оценку агента".
evaluation_results = mlflow.evaluate( data=eval_set_df, # pandas DataFrame containing just the evaluation set model=model, # Reference to the MLflow model that represents the application model_type="databricks-agent", )
Дополнительные сведения о схеме набора вычислений см. в схеме входных данных агента.
Выходные данные оценки
Оценка агента возвращает выходные данные из mlflow.evaluate()
кадров данных, а также записывает эти выходные данные в выполнение MLflow. Вы можете проверить выходные данные в записной книжке или на странице соответствующего запуска MLflow.
Просмотр выходных данных в записной книжке
В следующем коде показаны некоторые примеры того, как проверить результаты выполнения оценки из записной книжки.
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
###
# Run evaluation
###
evaluation_results = mlflow.evaluate(..., model_type="databricks-agent")
###
# Access aggregated evaluation results across the entire evaluation set
###
results_as_dict = evaluation_results.metrics
results_as_pd_df = pd.DataFrame([evaluation_results.metrics])
# Sample usage
print(f"The percentage of generated responses that are grounded: {results_as_dict['response/llm_judged/groundedness/percentage']}")
###
# Access data about each question in the evaluation set
###
per_question_results_df = evaluation_results.tables['eval_results']
# Show information about responses that are not grounded
per_question_results_df[per_question_results_df["response/llm_judged/groundedness/rating"] == "no"].display()
Кадр per_question_results_df
данных включает все столбцы входной схемы и все результаты оценки, относящиеся к каждому запросу. Дополнительные сведения о вычисляемых результатах см. в статье о том, как оценивается качество, стоимость и задержка с помощью оценки агента.
Просмотр выходных данных с помощью пользовательского интерфейса MLflow
Результаты оценки также доступны в пользовательском интерфейсе MLflow. Чтобы получить доступ к пользовательскому интерфейсу MLflow, щелкните значок "Эксперимент" в правой боковой панели записной книжки, а затем на соответствующем запуске или щелкните ссылки, отображаемые в результатах ячейки записной книжки, в которой вы выполнили.mlflow.evaluate()
Проверка результатов оценки для одного запуска
В этом разделе описывается, как просмотреть результаты оценки для отдельного запуска. Сведения о сравнении результатов между запусками см. в статье "Сравнение результатов оценки между запусками".
Обзор оценки качества судьями LLM
Оценки судьи по запросу доступны в databricks-agents
версии 0.3.0 и выше.
Чтобы просмотреть обзор качества каждого запроса в наборе вычислений, щелкните вкладку "Результаты оценки" на странице запуска MLflow. На этой странице показана сводная таблица каждого запуска оценки. Дополнительные сведения см. в идентификаторе оценки выполнения.
В этом обзоре показаны оценки разных судей для каждого запроса, состояние качества и сбоя каждого запроса на основе этих оценок и первопричина неудачных запросов. Щелкнув строку в таблице, вы перейдете на страницу сведений для этого запроса, включающую следующее:
- Выходные данные модели: созданный ответ от агентического приложения и его трассировки, если они включены.
- Ожидаемые выходные данные: ожидаемый ответ для каждого запроса.
- Подробные оценки: оценки судей LLM по этим данным. Нажмите кнопку "Просмотреть сведения" , чтобы отобразить обоснование, предоставленное судьями.
Агрегированные результаты по полному набору вычислений
Чтобы просмотреть агрегированные результаты в полном наборе вычислений, перейдите на вкладку "Обзор " (для числовых значений) или вкладку "Метрики модели" (для диаграмм).
Сравнение результатов оценки между запусками
Важно сравнить результаты оценки между запусками, чтобы узнать, как агентическое приложение реагирует на изменения. Сравнение результатов поможет вам понять, положительно влияют ли изменения на качество или помогут вам устранить неполадки в изменении поведения.
Сравнение результатов на запрос между запусками
Чтобы сравнить данные для каждого отдельного запроса во время выполнения, щелкните вкладку "Оценка " на странице "Эксперимент". В таблице показан каждый вопрос в наборе вычислений. Используйте раскрывающееся меню, чтобы выбрать столбцы для просмотра.
Сравнение агрегированных результатов между запусками
Вы можете получить доступ к тем же агрегированным результатам на странице "Эксперимент", что также позволяет сравнивать результаты в разных запусках. Чтобы получить доступ к странице "Эксперимент", щелкните значок "Эксперимент" на правой боковой панели записной книжки или щелкните ссылки, отображаемые в результатах ячейки записной книжки, в которой вы запустили mlflow.evaluate()
.
На странице "Эксперимент" щелкните . Это позволяет визуализировать агрегированные результаты для выбранного выполнения и сравнить их с прошлыми.
Какие судьи выполняются
По умолчанию для каждой записи оценки оценка агента ИИ Мозаики применяет подмножество судей, которые лучше всего соответствуют информации, присутствующих в записи. В частности:
- Если запись содержит ответ на истину, оценка агента применяет
context_sufficiency
,groundedness
correctness
иsafety
судьи. - Если запись не включает ответ на истину, оценка агента применяет
chunk_relevance
,groundedness
relevance_to_query
иsafety
судьи.
Вы также можете явно указать судей, которые будут применяться к каждому запросу, используя evaluator_config
следующий аргумент mlflow.evaluate()
:
# Complete list of built-in LLM judges
# "chunk_relevance", "context_sufficiency", "correctness", "groundedness", "relevance_to_query", "safety"
evaluation_results = mlflow.evaluate(
data=eval_df,
model_type="databricks-agent",
evaluator_config={
"databricks-agent": {
# Run only LLM judges that don't require ground-truth. Use an empty list to not run any built-in judge.
"metrics": ["groundedness", "relevance_to_query", "chunk_relevance", "safety"]
}
}
)
Примечание.
Вы не можете отключить метрики, отличные от LLM, для получения фрагментов, количества маркеров цепочки или задержки.
Помимо встроенных судей, вы можете определить пользовательского судью LLM для оценки критериев, относящихся к вашему варианту использования. См. статью "Настройка судей LLM".
См . сведения о моделях, которые могут использовать судьи LLM для доверия и безопасности LLM.
Дополнительные сведения о результатах оценки и метриках см. в разделе о том, как оценивается качество, стоимость и задержка по оценке агента.
Пример. Передача приложения в оценку агента
Чтобы передать приложение mlflow_evaluate()
, используйте model
аргумент. Существует 5 вариантов передачи приложения в аргументе model
.
- Модель, зарегистрированная в каталоге Unity.
- Модель MLflow, зарегистрированная в текущем эксперименте MLflow.
- Модель PyFunc, загруженная в записную книжку.
- Локальная функция в записной книжке.
- Развернутая конечная точка агента.
В следующих разделах приведены примеры кода, иллюстрирующие каждый параметр.
Вариант 1. Модель, зарегистрированная в каталоге Unity
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
evaluation_results = mlflow.evaluate(
data=eval_set_df, # pandas DataFrame with just the evaluation set
model = "models:/catalog.schema.model_name/1" # 1 is the version number
model_type="databricks-agent",
)
Вариант 2. Модель MLflow, зарегистрированная в текущем эксперименте MLflow
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
# In the following lines, `6b69501828264f9s9a64eff825371711` is the run_id, and `chain` is the artifact_path that was
# passed with mlflow.xxx.log_model(...).
# If you called model_info = mlflow.langchain.log_model() or mlflow.pyfunc.log_model(), you can access this value using `model_info.model_uri`.
evaluation_results = mlflow.evaluate(
data=eval_set_df, # pandas DataFrame with just the evaluation set
model = "runs:/6b69501828264f9s9a64eff825371711/chain"
model_type="databricks-agent",
)
Вариант 3. Модель PyFunc, загруженная в записную книжку
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
evaluation_results = mlflow.evaluate(
data=eval_set_df, # pandas DataFrame with just the evaluation set
model = mlflow.pyfunc.load_model(...)
model_type="databricks-agent",
)
Вариант 4. Локальная функция в записной книжке
Функция получает входной формат следующим образом:
{
"messages": [
{
"role": "user",
"content": "What is MLflow?",
}
],
...
}
Функция должна возвращать значение в одном из следующих трех поддерживаемых форматов:
Обычная строка, содержащая ответ модели.
Словарь в
ChatCompletionResponse
формате. Например:{ "choices": [ { "message": { "role": "assistant", "content": "MLflow is a machine learning toolkit.", }, ... } ], ..., }
Словарь в
StringResponse
формате, например{ "content": "MLflow is a machine learning toolkit.", ... }
.
В следующем примере используется локальная функция для упаковки конечной точки базовой модели и ее оценки:
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
def model(model_input):
client = mlflow.deployments.get_deploy_client("databricks")
return client.predict(endpoint="endpoints:/databricks-meta-llama-3-1-405b-instruct", inputs={"messages": model_input["messages"]})
evaluation_results = mlflow.evaluate(
data=eval_set_df, # pandas DataFrame with just the evaluation set
model = model
model_type="databricks-agent",
)
Вариант 5. Развернутая конечная точка агента
Этот параметр работает только при использовании конечных точек агента, развернутых с помощью databricks.agents.deploy
версии пакета SDK или databricks-agents
более поздней версии 0.8.0
. Для базовых моделей или более старых версий пакета SDK используйте вариант 4, чтобы упаковать модель в локальную функцию.
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
# In the following lines, `endpoint-name-of-your-agent` is the name of the agent endpoint.
evaluation_results = mlflow.evaluate(
data=eval_set_df, # pandas DataFrame with just the evaluation set
model = "endpoints:/endpoint-name-of-your-agent"
model_type="databricks-agent",
)
Передача набора оценки при включении приложения в mlflow_evaluate()
вызов
В следующем коде data
используется кадр данных pandas с набором оценки. Это простые примеры. Дополнительные сведения см. в схеме ввода.
# You do not have to start from a dictionary - you can use any existing pandas or Spark DataFrame with this schema.
# Minimal evaluation set
bare_minimum_eval_set_schema = [
{
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
}]
# Complete evaluation set
complete_eval_set_schema = [
{
"request_id": "your-request-id",
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"expected_retrieved_context": [
{
# In `expected_retrieved_context`, `content` is optional, and does not provide any additional functionality.
"content": "Answer segment 1 related to What is the difference between reduceByKey and groupByKey in Spark?",
"doc_uri": "doc_uri_2_1",
},
{
"content": "Answer segment 2 related to What is the difference between reduceByKey and groupByKey in Spark?",
"doc_uri": "doc_uri_2_2",
},
],
"expected_response": "There's no significant difference.",
}]
# Convert dictionary to a pandas DataFrame
eval_set_df = pd.DataFrame(bare_minimum_eval_set_schema)
# Use a Spark DataFrame
import numpy as np
spark_df = spark.table("catalog.schema.table") # or any other way to get a Spark DataFrame
eval_set_df = spark_df.toPandas()
Пример. Передача ранее созданных выходных данных в оценку агента
В этом разделе описывается передача ранее созданных выходных данных в вызове mlflow_evaluate()
. Для требуемой схемы набора вычислений см . схему входных данных для оценки агента.
В следующем коде data
— это кадр данных pandas с набором оценки и выходными данными, созданными приложением. Это простые примеры. Дополнительные сведения см. в схеме ввода.
%pip install databricks-agents pandas
dbutils.library.restartPython()
import mlflow
import pandas as pd
evaluation_results = mlflow.evaluate(
data=eval_set_with_app_outputs_df, # pandas DataFrame with the evaluation set and application outputs
model_type="databricks-agent",
)
# You do not have to start from a dictionary - you can use any existing pandas or Spark DataFrame with this schema.
# Minimum required input
bare_minimum_input_schema = [
{
"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.",
}]
# Input including optional arguments
complete_input_schema = [
{
"request_id": "your-request-id",
"request": "What is the difference between reduceByKey and groupByKey in Spark?",
"expected_retrieved_context": [
{
# In `expected_retrieved_context`, `content` is optional, and does not provide any additional functionality.
"content": "Answer segment 1 related to What is the difference between reduceByKey and groupByKey in Spark?",
"doc_uri": "doc_uri_2_1",
},
{
"content": "Answer segment 2 related to What is the difference between reduceByKey and groupByKey in Spark?",
"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. If provided, the Databricks Context Relevance LLM Judge is executed to check the `content`'s relevance 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",
},
],
}]
# Convert dictionary to a pandas DataFrame
eval_set_with_app_outputs_df = pd.DataFrame(bare_minimum_input_schema)
# Use a Spark DataFrame
import numpy as np
spark_df = spark.table("catalog.schema.table") # or any other way to get a Spark DataFrame
eval_set_with_app_outputs_df = spark_df.toPandas()
Пример. Использование пользовательской функции для обработки ответов из LangGraph
Агенты LangGraph, особенно с функциями чата, могут возвращать несколько сообщений для одного вызова вывода. Это ответственность пользователя за преобразование ответа агента в формат, поддерживаемый оценкой агента.
Одним из способов является использование пользовательской функции для обработки ответа. В следующем примере показана пользовательская функция, извлекающая последнее сообщение чата из модели LangGraph. Затем эта функция используется для mlflow.evaluate()
возврата одного строкового ответа, который можно сравнить с столбцом ground_truth
.
В примере кода приводятся следующие предположения:
- Модель принимает входные данные в формате {"messages": [{"role": "user", "content": "hello"}]}.
- Модель возвращает список строк в формате ["ответ 1", "ответ 2"].
Следующий код отправляет сцепленные ответы судье в этом формате: "ответ 1nresponse2"
import mlflow
import pandas as pd
from typing import List
loaded_model = mlflow.langchain.load_model(model_uri)
eval_data = pd.DataFrame(
{
"inputs": [
"What is MLflow?",
"What is Spark?",
],
"expected_response": [
"MLflow is an open-source platform for managing the end-to-end machine learning (ML) lifecycle. It was developed by Databricks, a company that specializes in big data and machine learning solutions. MLflow is designed to address the challenges that data scientists and machine learning engineers face when developing, training, and deploying machine learning models.",
"Apache Spark is an open-source, distributed computing system designed for big data processing and analytics. It was developed in response to limitations of the Hadoop MapReduce computing model, offering improvements in speed and ease of use. Spark provides libraries for various tasks such as data ingestion, processing, and analysis through its components like Spark SQL for structured data, Spark Streaming for real-time data processing, and MLlib for machine learning tasks",
],
}
)
def custom_langgraph_wrapper(model_input):
predictions = loaded_model.invoke({"messages": model_input["messages"]})
# Assuming `predictions` is a list of strings
return predictions.join("\n")
with mlflow.start_run() as run:
results = mlflow.evaluate(
custom_langgraph_wrapper, # Pass the function defined above
data=eval_data,
model_type="databricks-agent",
)
print(results.metrics)
Создание панели мониторинга с метриками
При итерации по качеству агента может потребоваться поделиться панелью мониторинга со своими заинтересованными лицами, в которой показано, как качество улучшилось с течением времени. Вы можете извлечь метрики из выполнения оценки MLflow, сохранить значения в таблице Delta и создать панель мониторинга.
В следующем примере показано, как извлечь и сохранить значения метрик из последней ознакомительной версии в записной книжке:
uc_catalog_name = "catalog"
uc_schema_name = "schema"
table_name = "results"
eval_results = mlflow.evaluate(
model=logged_agent_info.model_uri, # use the logged Agent
data=evaluation_set, # Run the logged Agent for all queries defined above
model_type="databricks-agent", # use Agent Evaluation
)
# The `append_metrics_to_table function` is defined below
append_metrics_to_table("<identifier-for-table>", eval_results.metrics, f"{uc_catalog_name}.{uc_schema_name}.{table_name}")
В следующем примере показано, как извлечь и сохранить значения метрик для прошлых запусков, сохраненных в эксперименте MLflow.
import pandas as pd
def get_mlflow_run(experiment_name, run_name):
runs = mlflow.search_runs(experiment_names=[experiment_name], filter_string=f"run_name = '{run_name}'", output_format="list")
if len(runs) != 1:
raise ValueError(f"Found {len(runs)} runs with name {run_name}. {run_name} must identify a single run. Alternatively, you can adjust this code to search for a run based on `run_id`")
return runs[0]
run = get_mlflow_run(experiment_name ="/Users/<user_name>/db_docs_mlflow_experiment", run_name="evaluation__2024-10-09_02:27:17_AM")
# The `append_metrics_to_table` function is defined below
append_metrics_to_table("<identifier-for-table>", run.data.metrics, f"{uc_catalog_name}.{uc_schema_name}.{table_name}")
Теперь вы можете создать панель мониторинга с помощью этих данных.
Следующий код определяет функцию append_metrics_to_table
, используемую в предыдущих примерах.
# Definition of `append_metrics_to_table`
def append_metrics_to_table(run_name, mlflow_metrics, delta_table_name):
data = mlflow_metrics.copy()
# Add identifying run_name and timestamp
data["run_name"] = run_name
data["timestamp"] = pd.Timestamp.now()
# Remove metrics with error counts
data = {k: v for k, v in mlflow_metrics.items() if "error_count" not in k}
# Convert to a Spark DataFrame(
metrics_df = pd.DataFrame([data])
metrics_df_spark = spark.createDataFrame(metrics_df)
# Append to the Delta table
metrics_df_spark.write.mode("append").saveAsTable(delta_table_name)
Ограничение
Для бесед с несколькими поворотами выходные данные оценки записывают только последнюю запись в беседе.
Сведения о моделях, которые могут использовать судьи LLM
- Судьи LLM могут использовать сторонние службы для оценки приложений GenAI, включая Azure OpenAI, управляемых корпорацией Майкрософт.
- Для Azure OpenAI Databricks отказался от мониторинга злоупотреблений, поэтому запросы или ответы не хранятся в Azure OpenAI.
- Для рабочих областей Европейского союза (ЕС) судьи LLM используют модели, размещенные в ЕС. Все остальные регионы используют модели, размещенные в США.
- Отключение вспомогательных функций ИИ на основе искусственного интеллекта Azure запрещает судье LLM вызывать модели, на основе ИИ Azure.
- Данные, отправленные судье LLM, не используются для обучения модели.
- Судьи LLM предназначены для того, чтобы помочь клиентам оценить свои приложения RAG, и выходные данные судьи LLM не должны использоваться для обучения, улучшения или точной настройки LLM.