Оценка агентов ИИ (предварительная версия) (классическая версия)

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

Примечание

Содержание в новой документации Microsoft Foundry может открываться по ссылкам в этой статье вместо документации Foundry (классической версии), которую вы просматриваете сейчас.

Важно

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

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

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

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

Примечание

Пакет Microsoft Foundry SDK и портал Foundry находятся в общедоступной предварительной версии, но API обычно доступны для оценки моделей и наборов данных (оценка агентов остается в общедоступной предварительной версии). Пакет SDK для оценки Azure ИИ и оценщики, помеченные как 'предварительная версия' и упомянутые в этой статье, в настоящее время находятся в стадии общедоступной предварительной версии повсеместно.

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

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

Оцените другие аспекты качества и безопасности рабочих процессов агента с помощью комплексного набора встроенных оценщиков. Как правило, агенты выдают агентские сообщения. Преобразование сообщений агента в правильные данные оценки для оценщиков может быть сложной задачей. Если вы создаете агент с помощью службы агента Foundry, вы можете легко оценить его с помощью нашей поддержки преобразователя. Если вы создаете агента за пределами службы агента Foundry, вы по-прежнему можете использовать оценщики в соответствии с вашим рабочим процессом агентства, преобразуя сообщения агента в необходимые форматы данных. См. примеры оценки других агентов.

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

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

pip install azure-ai-evaluation

Оцените агентов Microsoft Foundry

Если вы используете службу агентов Foundry, вы можете без труда оценить агентов с помощью поддержки нашего конвертера для Microsoft Foundry и Semantic Kernel. Следующие оценщики поддерживают данные оценки, возвращаемые преобразователем: IntentResolution, ToolCallAccuracy, TaskAdherence, Relevance и Groundedness.

Примечание

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

Поддержка моделей для оценщиков с поддержкой искусственного интеллекта

AzureOpenAI и OpenAI модели рассуждений и нерассуждающие модели поддерживают LLM-судью в зависимости от оценщиков:

Оценщиков Модели рассуждений в качестве оценщика (например, модели o-серии из Azure OpenAI / OpenAI) Модели без способности рассуждать как судья (например, gpt-4.1, gpt-4o и т. д.) Чтобы включить
IntentResolution, TaskAdherence, ToolCallAccuracy, ResponseCompleteness, Coherence, Fluency, Similarity, Groundedness, Retrieval, Relevance Поддерживается Поддерживается Установка дополнительных параметров is_reasoning_model=True при инициализации вычислителей
Другие оценщики Не поддерживается Поддерживается --

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

Поддержка оценки вызовов инструмента

ToolCallAccuracyEvaluator поддерживает оценку в агенте Foundry Microsoft для следующих средств:

  • Поиск файлов
  • Поиск с использованием ИИ Azure
  • Заземление Bing
  • Пользовательский поиск Bing
  • Основы SharePoint
  • Интерпретатор кода
  • Агент данных Fabric
  • OpenAPI
  • Инструменты функций (пользовательские инструменты)

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

В этом примере показано, как создать и оценить агент Foundry Microsoft. Отдельно от оценки службе агента Foundry требуется pip install azure-ai-projects azure-identity, строка подключения проекта Foundry и поддерживаемые модели.

Создание потоков и запуск агента

Агенты могут использовать инструменты. Ниже приведен пример создания пользовательских инструментов для использования агентом, используя макетную функцию погоды в качестве примера.

from azure.ai.projects.models import FunctionTool, ToolSet
from typing import Set, Callable, Any
import json

# Define a custom Python function.
def fetch_weather(location: str) -> str:
    """
    Fetches the weather information for the specified location.

    :param location (str): The location to fetch weather for.
    :return: Weather information as a JSON string.
    :rtype: str
    """
    # In a real-world scenario, you'd integrate with a weather API.
    # In the following code snippet, we mock the response.
    mock_weather_data = {"Seattle": "Sunny, 25°C", "London": "Cloudy, 18°C", "Tokyo": "Rainy, 22°C"}
    weather = mock_weather_data.get(location, "Weather data not available for this location.")
    weather_json = json.dumps({"weather": weather})
    return weather_json

user_functions: Set[Callable[..., Any]] = {
    fetch_weather,
}

# Add tools that the agent will use. 
functions = FunctionTool(user_functions)

toolset = ToolSet()
toolset.add(functions)

AGENT_NAME = "Seattle Tourist Assistant"

Если вы используете проект Foundry (non-Hub), создайте агент с набором инструментов следующим образом:

Примечание

Если вы используете проект на основе Foundry Hub (который поддерживает только более низкие версии azure-ai-projects<1.0.0b10 и azure-ai-agents<1.0.0b10), перейдите на библиотеку последнего клиента Python SDK для Foundry Agent Service. Дополнительные сведения см. в разделе "Проект Foundry", настроенный для ведения журнала результатов пакетной оценки.

Создайте агент с набором инструментов следующим образом:

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from dotenv import load_dotenv

load_dotenv()

# Create an Azure AI Client from an endpoint, copied from your Foundry project.
# You need to login to Azure subscription via Azure CLI and set the environment variables
# Foundry project endpoint, example: AZURE_AI_PROJECT=https://your-account.services.ai.azure.com/api/projects/your-project
project_endpoint = os.environ["AZURE_AI_PROJECT"]  # Ensure the PROJECT_ENDPOINT environment variable is set

# Create an AIProjectClient instance
project_client = AIProjectClient(
    endpoint=project_endpoint,
    credential=DefaultAzureCredential(),  # Use Azure Default Credential for authentication
)

# Create an agent with the toolset 
agent = project_client.agents.create_agent(
    model=os.environ["MODEL_DEPLOYMENT_NAME"],  # Model deployment name
    name="my-agent",  # Name of the agent
    instructions="You are a helpful agent",  # Instructions for the agent
    toolset=toolset
)
print(f"Created agent, ID: {agent.id}")

# Create a thread for communication
thread = project_client.agents.threads.create()
print(f"Created thread, ID: {thread.id}")

# Add a message to the thread
message = project_client.agents.messages.create(
    thread_id=thread.id,
    role="user",  # Role of the message sender
    content="What is the weather in Seattle today?",  # Message content
)
print(f"Created message, ID: {message.id}")

# Create and process an agent run
run = project_client.agents.runs.create_and_process(thread_id=thread.id, agent_id=agent.id)
print(f"Run finished with status: {run.status}")

# Check if the run failed
if run.status == "failed":
    print(f"Run failed: {run.last_error}")

# Fetch and log all messages
messages = project_client.agents.messages.list(thread_id=thread.id)
for message in messages:
    print(f"Role: {message.role}, Content: {message.content}")
    

Оценка запуска одного агента

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

import json, os
from azure.ai.evaluation import AIAgentConverter, IntentResolutionEvaluator

# Initialize the converter for Microsoft Foundry agents.
converter = AIAgentConverter(project_client)

# Specify the thread and run ID.
thread_id = thread.id
run_id = run.id

converted_data = converter.convert(thread_id, run_id)

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

Оценщиков Модели рассуждений в качестве оценщика (например, модели o-серии из Azure OpenAI / OpenAI) Модели без способности рассуждать как судья (например, gpt-4.1, gpt-4o и т. д.) Чтобы включить
Все оценщики качества, кроме GroundednessProEvaluator Поддерживается Поддерживается Установка дополнительных параметров is_reasoning_model=True при инициализации вычислителей
GroundednessProEvaluator Пользователь не должен поддерживать модель Пользователь не должен поддерживать модель --

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

Вы настроили список оценщиков качества и безопасности в quality_evaluators и safety_evaluators. Вы ссылаетесь на них при оценке нескольких запусков агента или потока.

# This is specific to agentic workflows.
from azure.ai.evaluation import IntentResolutionEvaluator, TaskAdherenceEvaluator, ToolCallAccuracyEvaluator 
# Other quality, risk, and safety metrics:
from azure.ai.evaluation import RelevanceEvaluator, CoherenceEvaluator, CodeVulnerabilityEvaluator, ContentSafetyEvaluator, IndirectAttackEvaluator, FluencyEvaluator
from azure.identity import DefaultAzureCredential

import os
from dotenv import load_dotenv
load_dotenv()

model_config = {
    "azure_deployment": os.getenv("AZURE_DEPLOYMENT_NAME"),
    "api_key": os.getenv("AZURE_OPENAI_API_KEY"),
    "azure_endpoint": os.getenv("AZURE_OPENAI_ENDPOINT"),
    "api_version": os.getenv("AZURE_API_VERSION"),
}

# example config for a reasoning model
reasoning_model_config = {
    "azure_deployment": "o4-mini",
    "api_key": os.getenv("AZURE_OPENAI_API_KEY"),
    "azure_endpoint": os.getenv("AZURE_OPENAI_ENDPOINT"),
    "api_version": os.getenv("AZURE_API_VERSION"),
}

# Evaluators you might want to use with reasoning models 
quality_evaluators = {evaluator.__name__: evaluator(model_config=reasoning_model_config, is_reasoning_model=True) for evaluator in [IntentResolutionEvaluator, TaskAdherenceEvaluator, ToolCallAccuracyEvaluator]}

# Other evaluators you might NOT want to use with reasoning models 
quality_evaluators.update({ evaluator.__name__: evaluator(model_config=model_config) for evaluator in [CoherenceEvaluator, FluencyEvaluator, RelevanceEvaluator]})

## Using Foundry (non-Hub) project endpoint, example: AZURE_AI_PROJECT=https://your-account.services.ai.azure.com/api/projects/your-project
azure_ai_project = os.environ.get("AZURE_AI_PROJECT")

safety_evaluators = {evaluator.__name__: evaluator(azure_ai_project=azure_ai_project, credential=DefaultAzureCredential()) for evaluator in [ContentSafetyEvaluator, IndirectAttackEvaluator, CodeVulnerabilityEvaluator]}

# Reference the quality and safety evaluator list above.
quality_and_safety_evaluators = {**quality_evaluators, **safety_evaluators}

for name, evaluator in quality_and_safety_evaluators.items():
    result = evaluator(**converted_data)
    print(name)
    print(json.dumps(result, indent=4)) 

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

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

  • {metric_name}: предоставляет числовую оценку в шкале Likert (целое число 1–5) или с плавающей запятой от 0 до 1.
  • {metric_name}_label: предоставляет двоичную метку, если метрика естественно выводит двоичную оценку.
  • {metric_name}_reason: объясняет, почему для каждой точки данных была предоставлена определенная оценка или метка.
  • details: необязательные выходные данные, содержащие сведения об отладке качества выполнения одного агента.

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

  • {metric_name}_result: строка "pass" или "fail", основанная на пороговом значении бинаризации.
  • {metric_name}_threshold: числовой порог бинаризации, установленный по умолчанию или пользователем.

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

{
    "intent_resolution": 5.0, # likert scale: 1-5 integer 
    "intent_resolution_threshold": 3,
    "intent_resolution_result": "pass", # pass because 5 > 3 the threshold
    "intent_resolution_reason": "The assistant correctly understood the user's request to fetch the weather in Seattle. It used the appropriate tool to get the weather information and provided a clear and accurate response with the current weather conditions in Seattle. The response fully resolves the user's query with all necessary information."
}
{
    "task_adherence": 5.0, # likert scale: 1-5 integer 
    "task_adherence_threshold": 3,
    "task_adherence_result": "pass", # pass because 5 > 3 the threshold
    "task_adherence_reason": "The response accurately follows the instructions, fetches the correct weather information, and relays it back to the user without any errors or omissions."
}
{
    "tool_call_accuracy": 5,  # a score between 1-5, higher is better
    "tool_call_accuracy_threshold": 3,
    "tool_call_accuracy_result": "pass", # pass because 5 > 3 the threshold
    "details": { ... } # helpful details for debugging the tool calls made by the agent
}

Оценка нескольких запусков или потоков агента

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

import json
from azure.ai.evaluation import AIAgentConverter

# Initialize the converter.
converter = AIAgentConverter(project_client)

# Specify a file path to save the agent output (evaluation input data) to.
filename = os.path.join(os.getcwd(), "evaluation_input_data.jsonl")

evaluation_data = converter.prepare_evaluation_data(thread_ids=thread_id, filename=filename) 

print(f"Evaluation data saved to {filename}")

Подготовив данные оценки в одной строке кода, вы можете выбрать оценщиков для оценки качества агента и запустить пакетную оценку. В следующем примере см. тот же список оценщиков качества и безопасности в разделе "Оценка одного агентаquality_and_safety_evaluators".

import os
from dotenv import load_dotenv
load_dotenv()

# Batch evaluation API (local):
from azure.ai.evaluation import evaluate

response = evaluate(
    data=filename,
    evaluation_name="agent demo - batch run",
    evaluators=quality_and_safety_evaluators,
    # optionally, log your results to your Foundry project for rich visualization 
    azure_ai_project=os.environ.get("AZURE_AI_PROJECT"),  # example: https://your-account.services.ai.azure.com/api/projects/your-project
)
# Inspect the average scores at a high level.
print(response["metrics"])
# Use the URL to inspect the results on the UI.
print(f'Foundry URL: {response.get("studio_url")}')

Выбрав URL-адрес, вы будете перенаправлены в Foundry. Просмотрите результаты оценки в проекте Foundry и отладите приложение. Используйте поля с указанием причины и результаты прохождения/провала для оценки качества и безопасности ваших приложений. Можно запускать и сравнивать несколько запусков, чтобы проверить регрессию или улучшения.

Используйте клиентскую библиотеку SDK для оценки агентов Microsoft Foundry и ИИ Azure с поддержкой преобразователя, что обеспечивает наблюдаемость и прозрачность в рабочих процессах агентов.

Оцените других агентов

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

Агенты обычно отправляют сообщения для взаимодействия с пользователем или другими агентами. Встроенные вычислители принимают простые типы данных, такие как строки в query, response и ground_truth в соответствии с требованиями к вводу данных в один этап. Однако извлечение этих простых типов данных из сообщений агента может быть сложной из-за сложных шаблонов взаимодействия агентов и различий платформы. Например, один запрос пользователя может активировать длинный список сообщений агента, как правило, с несколькими вызовами инструментов.

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

Эвалуатор query response tool_calls tool_definitions
IntentResolutionEvaluator Обязательно: Union[str, list[Message]] Обязательно: Union[str, list[Message]] Не применяется Необязательно: list[ToolCall]
ToolCallAccuracyEvaluator Обязательно: Union[str, list[Message]] Необязательно: Union[str, list[Message]] Дополнительно: Union[dict, list[ToolCall]] Обязательно: list[ToolDefinition]
TaskAdherenceEvaluator Обязательно: Union[str, list[Message]] Обязательно: Union[str, list[Message]] Не применяется Необязательно: list[ToolCall]
GroundednessEvaluator Обязательно: Union[str, list[Message]] Обязательно: Union[str, list[Message]] Не применяется Обязательно: list[ToolCall]
  • Message: dict сообщение в стиле OpenAI, описывающее взаимодействие агента с пользователем, где query должно содержать системное сообщение в качестве первого сообщения.
  • ToolCall: dict указывает вызовы средства, вызываемые во время взаимодействия агента с пользователем.
  • ToolDefinition: dict описывает средства, доступные агенту.

Для ToolCallAccuracyEvaluator необходимо указать либо response, либо tool_calls.

GroundednessEvaluator требуется tool_definitions для оценки обоснованности ответов агента в отношении выходных данных средства, получаемых агентом.

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

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

Простые данные агента

В простом формате данных агента query и response являются простыми строками Python. Например:

import os
import json
from azure.ai.evaluation import AzureOpenAIModelConfiguration
from azure.identity import DefaultAzureCredential
from azure.ai.evaluation import IntentResolutionEvaluator, ResponseCompletenessEvaluator
  
model_config = AzureOpenAIModelConfiguration(
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_key=os.environ["AZURE_OPENAI_API_KEY"],
    api_version=os.environ["AZURE_OPENAI_API_VERSION"],
    azure_deployment=os.environ["MODEL_DEPLOYMENT_NAME"],
)
 
intent_resolution_evaluator = IntentResolutionEvaluator(model_config)

# Evaluate the query and response as strings.
# The following is a positive example. Intent is identified and understood and the response correctly resolves user intent.
result = intent_resolution_evaluator(
    query="What are the opening hours of the Eiffel Tower?",
    response="Opening hours of the Eiffel Tower are 9:00 AM to 11:00 PM.",
)
print(json.dumps(result, indent=4))
 

См. следующие выходные данные (см. Формат вывода для подробностей):

{
    "intent_resolution": 5.0,
    "intent_resolution_result": "pass",
    "intent_resolution_threshold": 3,
    "intent_resolution_reason": "The response provides the opening hours of the Eiffel Tower, which directly addresses the user's query. The information is clear, accurate, and complete, fully resolving the user's intent.",
}

Определения и вызовы инструментов агента

Ознакомьтесь со следующими примерами tool_calls и tool_definitions для ToolCallAccuracyEvaluator:

import json 

query = "How is the weather in Seattle?"
tool_calls = [{
                    "type": "tool_call",
                    "tool_call_id": "call_CUdbkBfvVBla2YP3p24uhElJ",
                    "name": "fetch_weather",
                    "arguments": {
                        "location": "Seattle"
                    }
            },
            {
                    "type": "tool_call",
                    "tool_call_id": "call_CUdbkBfvVBla2YP3p24uhElJ",
                    "name": "fetch_weather",
                    "arguments": {
                        "location": "London"
                    }
            }]

tool_definitions = [{
                    "name": "fetch_weather",
                    "description": "Fetches the weather information for the specified location.",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "location": {
                                "type": "string",
                                "description": "The location to fetch weather for."
                            }
                        }
                    }
                }]

from azure.ai.evaluation import ToolCallAccuracyEvaluator

tool_call_accuracy = ToolCallAccuracyEvaluator(model_config) # reuse the config defined above
response = tool_call_accuracy(query=query, tool_calls=tool_calls, tool_definitions=tool_definitions)
print(json.dumps(response, indent=4))

См. следующие результаты (см. формат вывода для получения подробной информации):

{
    "tool_call_accuracy": 3,  # a score between 1-5, higher is better
    "tool_call_accuracy_result": "fail",
    "tool_call_accuracy_threshold": 4,
    "details": { ... } # helpful details for debugging the tool calls made by the agent
}

Схема сообщения агента

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

Ожидаемый формат входных данных для оценщиков — это список сообщений в формате Python, следующим образом:

[
  {
    "role": "system" | "user" | "assistant" | "tool",
    "createdAt": "ISO 8601 timestamp",     // Optional for 'system'
    "run_id": "string",                    // Optional, only for assistant/tool in tool call context
    "tool_call_id": "string",              // Optional, only for tool/tool_result
    "name": "string",                      // Present if it's a tool call
    "arguments": { ... },                  // Parameters passed to the tool (if tool call)
    "content": [
      {
        "type": "text" | "tool_call" | "tool_result",
        "text": "string",                  // if type == text
        "tool_call_id": "string",         // if type == tool_call
        "name": "string",                 // tool name if type == tool_call
        "arguments": { ... },             // tool args if type == tool_call
        "tool_result": { ... }            // result if type == tool_result
      }
    ]
  }
]

Примеры объектов запросов и ответов:

query = [
    {
        "role": "system",
        "content": "You are an AI assistant interacting with Azure Maps services to serve user requests."
    },
    {
        "createdAt": "2025-04-25T23:55:43Z",
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "Find the address for coordinates 41.8781,-87.6298."
            }
        ]
    },
    {
        "createdAt": "2025-04-25T23:55:45Z",
        "run_id": "run_DGE8RWPS8A9SmfCg61waRx9u",
        "role": "assistant",
        "content": [
            {
                "type": "tool_call",
                "tool_call_id": "call_nqNyhOFRw4FmF50jaCCq2rDa",
                "name": "azure_maps_reverse_address_search",
                "arguments": {
                    "lat": "41.8781",
                    "lon": "-87.6298"
                }
            }
        ]
    },
    {
        "createdAt": "2025-04-25T23:55:47Z",
        "run_id": "run_DGE8RWPS8A9SmfCg61waRx9u",
        "tool_call_id": "call_nqNyhOFRw4FmF50jaCCq2rDa",
        "role": "tool",
        "content": [
            {
                "type": "tool_result",
                "tool_result": {
                    "address": "300 South Federal Street, Chicago, IL 60604",
                    "position": {
                        "lat": "41.8781",
                        "lon": "-87.6298"
                    }
                }
            }
        ]
    },
    {
        "createdAt": "2025-04-25T23:55:48Z",
        "run_id": "run_DGE8RWPS8A9SmfCg61waRx9u",
        "role": "assistant",
        "content": [
            {
                "type": "text",
                "text": "The address for the coordinates 41.8781, -87.6298 is 300 South Federal Street, Chicago, IL 60604."
            }
        ]
    },
    {
        "createdAt": "2025-04-25T23:55:50Z",
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "What timezone corresponds to 41.8781,-87.6298?"
            }
        ]
    },
]

response = [
    {
        "createdAt": "2025-04-25T23:55:52Z",
        "run_id": "run_DmnhUGqYd1vCBolcjjODVitB",
        "role": "assistant",
        "content": [
            {
                "type": "tool_call",
                "tool_call_id": "call_qi2ug31JqzDuLy7zF5uiMbGU",
                "name": "azure_maps_timezone",
                "arguments": {
                    "lat": 41.878100000000003,
                    "lon": -87.629800000000003
                }
            }
        ]
    },
    {
        "createdAt": "2025-04-25T23:55:54Z",
        "run_id": "run_DmnhUGqYd1vCBolcjjODVitB",
        "tool_call_id": "call_qi2ug31JqzDuLy7zF5uiMbGU",
        "role": "tool",
        "content": [
            {
                "type": "tool_result",
                "tool_result": {
                    "ianaId": "America/Chicago",
                    "utcOffset": None,
                    "abbreviation": None,
                    "isDaylightSavingTime": None
                }
            }
        ]
    },
    {
        "createdAt": "2025-04-25T23:55:55Z",
        "run_id": "run_DmnhUGqYd1vCBolcjjODVitB",
        "role": "assistant",
        "content": [
            {
                "type": "text",
                "text": "The timezone for the coordinates 41.8781, -87.6298 is America/Chicago."
            }
        ]
    }
]

Примечание

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

Пример оценки сообщений агента с помощью ToolCallAccuracyEvaluatorсм. в следующих примерах:

import json

# The user asked a question.
query = [
    {
        "role": "system",
        "content": "You are a friendly and helpful customer service agent."
    },
    # Past interactions are omitted. 
    # ...
    {
        "createdAt": "2025-03-14T06:14:20Z",
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "Hi, I need help with the last 2 orders on my account #888. Could you please update me on their status?"
            }
        ]
    }
]
# The agent emits multiple messages to fulfill the request.
response = [
    {
        "createdAt": "2025-03-14T06:14:30Z",
        "run_id": "0",
        "role": "assistant",
        "content": [
            {
                "type": "text",
                "text": "Hello! Let me quickly look up your account details."
            }
        ]
    },
    {
        "createdAt": "2025-03-14T06:14:35Z",
        "run_id": "0",
        "role": "assistant",
        "content": [
            {
                "type": "tool_call",
                "tool_call_id": "tool_call_20250310_001",
                "name": "get_orders",
                "arguments": {
                    "account_number": "888"
                }
            }
        ]
    },
    # Many more messages are omitted. 
    # ...
    # Here is the agent's final response:
    {
        "createdAt": "2025-03-14T06:15:05Z",
        "run_id": "0",
        "role": "assistant",
        "content": [
            {
                "type": "text",
                "text": "The order with ID 123 has been shipped and is expected to be delivered on March 15, 2025. However, the order with ID 124 is delayed and should now arrive by March 20, 2025. Is there anything else I can help you with?"
            }
        ]
    }
]

# An example of tool definitions available to the agent:
tool_definitions = [
    {
        "name": "get_orders",
        "description": "Get the list of orders for a given account number.",
        "parameters": {
            "type": "object",
            "properties": {
                "account_number": {
                    "type": "string",
                    "description": "The account number to get the orders for."
                }
            }
        }
    },
    # Other tool definitions are omitted. 
    # ...
]

result = tool_call_accuracy(
    query=query,
    response=response,
    tool_definitions=tool_definitions 
)
print(json.dumps(result, indent=4))

См. следующие выходные данные (подробности см. в формате выходных данных):

{
    "tool_call_accuracy": 2,  # a score between 1-5, higher is better
    "tool_call_accuracy_result": "fail",
    "tool_call_accuracy_threshold": 3,
    "details": { ... } # helpful details for debugging the tool calls made by the agent
}

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

Примеры записных книжек

Попробуйте образец для каждого из этих оценщиков.