Разметка агентов
Оценка ИИ-агентов в Potato: 15 конвертеров форматов трасс, 5 типов отображения и готовые схемы для агентов, работающих с инструментами, вебом, кодом и чатом. Включая режимы PRM и оценки по рубрике.
Появилось в v2.3.0
How agentic annotation works
ИИ-агентов всё чаще выпускают на сложные многошаговые задачи: ходить по вебу, писать код, дёргать API, управлять подчинёнными агентами. Но чтобы оценить, действительно ли агент сделал то, что нужно, требуется человеческое суждение с такой детализацией, какую традиционные инструменты разметки не вытягивают. Одна трасса агента может содержать десятки шагов, вызовов инструментов, промежуточных рассуждений, скриншотов и ветвящихся решений. Разметчику нужно видеть весь этот контекст, быстро по нему перемещаться и давать структурные оценки и на уровне трассы, и на уровне отдельного шага.
Система разметки агентов в Potato решает это четырьмя способами:
- 15 конвертеров форматов трасс, приводящих логи агентов из любого крупного фреймворка к единому формату
- 5 специализированных типов отображения под разные модальности агентов (инструменты, веб, код, чат, наблюдение вживую)
- 9 готовых схем разметки, покрывающих самые частые измерения оценки агентов
- 4 отдельных типа разметки для продвинутой оценки: оценка траектории, оценка по рубрике, попарное сравнение и разметка процессных вознаграждений
Конвертеры форматов трасс
Трассы агентов приходят в совершенно разных форматах в зависимости от фреймворка. Potato поставляется с 15 конвертерами, которые приводят их к единому внутреннему представлению. Конвертер указывается в конфигурации, либо Potato определяет формат сам.
Справочник по конвертерам
| Конвертер | Исходный формат | Ключевые извлекаемые поля |
|---|---|---|
openai | Трассы OpenAI Chat Completions и Assistants API | messages, tool_calls, результаты функций |
anthropic | Anthropic Claude tool_use / Messages API | блоки content, tool_use, tool_result |
swebench | Трассы задач SWE-bench | патч, результаты тестов, траектория |
swe_agent_trajectory | Файлы траекторий SWE-Agent | thought, action, observation, exit_status |
aider | История парного программирования в Aider | реплики, блоки правок, пути изменённых файлов |
otel | Выгрузки OpenTelemetry / OTLP (семантические соглашения GenAI) | спаны, атрибуты, события, связь «родитель — потомок» |
mcp | Сессии Model Context Protocol (JSON-RPC 2.0) | определения инструментов, пары «вызов — ответ» |
multi_agent | Мультиагентные логи CrewAI / AutoGen / LangGraph | роли агентов, делегирование, передача сообщений |
langchain | Выгрузки трасс запусков LangChain / LangSmith | запуски цепочек, вызовы LLM, обращения к инструментам |
langfuse | Выгрузки наблюдений Langfuse | генерации, спаны, оценки |
react | Логи в стиле ReAct «мысль/действие/наблюдение» | thought, action, action_input, observation |
webarena | JSON трасс WebArena / VisualWebArena | действия, скриншоты, снимки DOM, URL |
web_agent | Трассы веб-сёрфинга агентов (Mind2Web, Computer Use, сырые записи) | действия, координаты, вьюпорт, скриншоты |
atif | Agent Trace Interchange Format (ATIF) | шаги, наблюдения, метаданные |
claude_code | Логи сессий Claude Code и других кодовых агентов | блоки tool_use, диффы, вывод терминала |
Настройка
Укажите конвертер в конфигурации проекта:
instance_display:
fields:
- key: task_description
type: text
label: "Task"
- key: conversation
type: agent_trace
label: "Agent trace"
span_target: true
display_options:
show_step_numbers: true
show_summary: true
collapse_observations: false
step_type_colors:
thought: "#e8f4fd"
action: "#fff3e0"
observation: "#e8f5e9"Каждая строка файла трасс должна быть объектом JSON с сырой трассой агента. Остальное берёт на себя конвертер.
Для мультиагентных трасс, где разные агенты используют разные фреймворки, можно задать конвертер для каждого агента:
instance_display:
fields:
- key: conversation
type: dialogue
label: "Agent trace"
span_target: true
display_options:
show_turn_numbers: true
alternating_shading: true
max_height: 600Автоопределение
Если вы не уверены, какой конвертер нужен, поставьте trace_converter: auto:
instance_display:
fields:
- key: trace
type: web_agent_trace
label: "Browsing session"
display_options:
show_overlays: true
show_filmstrip: true
filmstrip_size: 150
screenshot_max_width: 900
show_thought: true
show_element_info: truePotato осматривает первые 10 трасс и выбирает наиболее подходящий конвертер по сигнатурам полей. Если уверенность ниже 80%, в лог пишется предупреждение — в таком случае конвертер стоит указать явно.
Свои конвертеры
Если вашего агентного фреймворка в списке нет, можно написать конвертер на Python:
# converters/my_converter.py
from potato.agentic.base_converter import BaseTraceConverter
class MyConverter(BaseTraceConverter):
name = "my_framework"
def convert(self, raw_trace: dict) -> dict:
steps = []
for entry in raw_trace["log"]:
steps.append({
"type": entry.get("kind", "action"),
"content": entry["text"],
"timestamp": entry.get("ts"),
"metadata": entry.get("extra", {}),
})
return {"steps": steps}Зарегистрируйте его в конфигурации:
instance_display:
fields:
- key: steps
type: coding_trace
label: "Coding session"
span_target: true
display_options:
diff_view: unified
show_file_tree: true
show_reasoning: true
terminal_theme: dark
collapse_long_outputs: true
max_output_lines: 50Типы отображения
После конвертации Potato отрисовывает трассы одним из пяти специализированных типов отображения. Каждый заточен под свою модальность агента.
1. Отображение трассы агента
Отображение по умолчанию для агентов, работающих с инструментами (вызов функций OpenAI, tool_use у Anthropic, ReAct, LangChain и т. д.). Каждый шаг отрисовывается карточкой с цветовой маркировкой по типу шага.
instance_display:
fields:
- key: messages
type: interactive_chat
label: "Conversation"
display_options:
show_turn_numbers: true
alternating_shading: trueВозможности:
- Карточки шагов с цветной левой границей, обозначающей тип (мысль, действие, наблюдение, ошибка)
- Сворачиваемые блоки для длинных наблюдений и выводов инструментов (порог настраивается)
- Форматирование JSON для аргументов вызова инструментов и структурных ответов
- Подсветка синтаксиса для блоков кода в наблюдениях
- Боковой таймлайн шагов, показывающий всю трассу целиком
- Переход к шагу для навигации по длинным трассам
2. Отображение трассы веб-агента
Для агентов, работающих в вебе (WebArena, VisualWebArena, сырые записи из браузера). Отрисовывает скриншоты с SVG-оверлеями, показывающими, где агент кликнул, что ввёл и куда прокрутил.
instance_display:
fields:
- key: screenshots
type: gallery
label: "Screenshots"
display_options:
layout: horizontal
thumbnail_size: 300
zoomable: trueВозможности:
- Галерея скриншотов с просмотром в полный размер и зумом
- SVG-оверлеи, показывающие цели кликов (красные кружки), области ввода текста (синяя подсветка) и направления прокрутки
- Лента кадров внизу, показывающая все скриншоты миниатюрами для быстрой навигации
- Описание действия под каждым скриншотом (например, «Клик по кнопке „Добавить в корзину“»)
- Строка адреса с URL текущей страницы на каждом шаге
- Сравнение «до и после» для шагов, меняющих содержимое страницы
3. Интерактивный чат
Для оценки диалоговых агентов и чат-ботов. Поддерживает два подрежима: живой чат, где разметчик общается с агентом в реальном времени, и разбор трассы, где разметчик оценивает записанный диалог.
annotation_schemes:
- annotation_type: radio
name: task_success
description: "Did the agent complete the task?"
labels:
- name: success
tooltip: "Fully completed correctly"
- name: partial
tooltip: "Partially completed, or completed with errors"
- name: failure
tooltip: "Not completed"
sequential_key_binding: true
- annotation_type: likert
name: efficiency
description: "How efficient was the agent's path?"
size: 5
min_label: "Very inefficient"
max_label: "Optimal"
- annotation_type: radio
name: safety
description: "Did the agent take any unsafe action?"
labels:
- name: safe
- name: minor_concern
- name: major_violationРежим разбора трассы отрисовывает записанный диалог с необязательным подсчётом токенов и задержкой по каждому сообщению. Разметчик может оценивать отдельные реплики или диалог целиком.
Режим живого чата подключает разметчика к работающему агенту через систему прокси агентов (см. ниже). Разметчик общается с агентом, а затем размечает получившийся диалог.
4. Отображение трассы кодового агента
Для сессий кодовых агентов (Claude Code, Aider, SWE-Agent). Отрисовывает диффы кода с подсветкой синтаксиса, вывод терминала тёмными блоками и чтение файлов с номерами строк.
- annotation_type: multiselect
name: mast_errors
description: "Select every failure mode observed in this trace"
labels:
- name: disobey_task_spec
tooltip: "Does not follow the task specification"
- name: step_repetition
tooltip: "Repeats the same action unnecessarily"
- name: loss_of_history
tooltip: "Forgets prior context"
- name: unaware_of_termination
tooltip: "Does not recognize when to stop"
- name: fail_to_clarify
tooltip: "Fails to ask for needed clarification"
- name: task_derailment
tooltip: "Goes off track from the main task"
- name: reasoning_action_mismatch
tooltip: "Reasoning contradicts the action taken"
- name: premature_termination
tooltip: "Stops before the task is complete"
- name: incomplete_verification
tooltip: "Does not verify the result"
- name: no_errors
tooltip: "No errors observed"Возможности:
- Единый вид диффа с красно-зелёной подсветкой для операций правки
- Тёмные терминальные блоки для вывода команд bash и shell
- Блоки кода с номерами строк для операций чтения файлов
- Боковое дерево файлов со всеми файлами, затронутыми за сессию
- Сворачивание длинного вывода для многословного терминала или содержимого файлов
Полный справочник — в разметке кодовых агентов.
5. Отображение живого агента
Наблюдение за ИИ-агентами в реальном времени с органами управления для вмешательства человека. Поддерживает веб-агентов и кодовых агентов.
- annotation_type: span
name: hallucination_spans
description: "Mark claims the trace does not support"
labels:
- name: hallucination
tooltip: "Claim not grounded in the observations"
- name: incorrect_fact
tooltip: "Factually incorrect statement"Возможности:
- Потоковая передача действий агента в реальном времени через Server-Sent Events
- Пауза и продолжение агента между шагами
- Отправка инструкций, чтобы перенаправить агента посреди задачи
- Перехват управления вручную
- Откат к любой предыдущей контрольной точке (у кодовых агентов контрольные точки на основе git)
- Ветвление и повтор от любой контрольной точки с другими инструкциями
Подробности настройки — в оценке живого агента и живом кодовом агенте.
Продвинутые типы разметки
Помимо оценок по репликам и готовых схем, в Potato есть четыре отдельных типа разметки для структурной оценки агентов.
Оценка траектории (trajectory_eval)
Локализация ошибок по шагам с иерархическими таксономиями ошибок и оценкой серьёзности. Каждый шаг получает оценку корректности, тип ошибки, уровень серьёзности и необязательное обоснование. Текущий счёт уменьшается в зависимости от серьёзности.
display_options:
show_turn_numbers: true
per_turn_ratings:
speakers: ["Agent (Action)"]
schema_name: "action_correctness"
scheme:
type: likert
size: 3
labels: ["Wrong", "Right"]Полное руководство — в публикации об оценке траекторий.
Оценка по рубрике (rubric_eval)
Многокритериальная сетка в стиле MT-Bench. Задайте свои критерии и шкалу оценок. Разметчики оценивают каждый критерий независимо.
display_options:
per_turn_ratings:
speakers: ["Agent (Action)"]
schemes:
- schema_name: action_correctness
scheme:
type: likert
size: 3
labels: ["Wrong", "Right"]
- schema_name: reasoning_quality
scheme:
type: likert
size: 5
labels: ["Poor", "Excellent"]Инструкции по настройке — в руководстве по оценке по рубрике.
Попарное сравнение
Сравнение двух трасс агентов бок о бок в трёх режимах:
- Бинарный: кликом выбрать A или B (с необязательной ничьей)
- Шкала: ползунок от «A намного лучше» до «B намного лучше»
- По измерениям: независимый выбор A/B/ничья по каждому измерению с обязательным обоснованием
- annotation_type: multirate
name: step_ratings
description: "Rate each step"
options_from_data: step_summaries
labels: ["Incorrect", "Questionable", "Correct"]Все три режима описаны в руководстве по попарному сравнению.
Разметка процессных вознаграждений
Пошаговая бинарная разметка корректности, заточенная под обучение моделей вознаграждения процесса. Два режима: первая ошибка (кликаете первый неверный шаг, остальные помечаются автоматически) и по шагам (каждый оценивается отдельно).
- annotation_type: trajectory_eval
name: step_eval
description: "Mark each step and classify any error"
steps_key: steps
step_text_key: content
error_types:
- name: reasoning
subtypes:
- logical_error
- incorrect_assumption
- name: action
subtypes:
- wrong_tool
- wrong_arguments
- premature_termination
severities:
- name: minor
weight: -1
- name: major
weight: -5
show_score: trueПолный справочник — в разметке процессных вознаграждений.
Оценки по репликам
Для диалоговых и многошаговых оценок часто нужны оценки отдельных реплик, а не (или не только) трассы целиком. Potato поддерживает разметку по репликам для любого типа отображения.
- annotation_type: rubric_eval
name: agent_rubric
description: "Rate this run on each criterion"
scale_points: 5
scale_labels: ["Very poor", "Poor", "Acceptable", "Good", "Excellent"]
criteria:
- name: correctness
description: "Did the agent produce the correct result?"
- name: efficiency
description: "Did the agent take an efficient path?"
- name: safety
description: "Did the agent avoid unsafe actions?"
show_overall: trueОценки по репликам появляются рядом с карточкой каждого шага. Блок conditional позволяет показывать уточняющие вопросы только при определённых оценках, не захламляя интерфейс.
Формат вывода по репликам
Разметка по репликам сохраняется с индексами шагов:
{
"id": "trace_042",
"annotations": {
"overall_quality": 3,
"step_correctness": {
"0": "Correct",
"1": "Correct",
"2": "Incorrect",
"3": "Correct"
},
"step_explanation": {
"2": "The agent searched for the wrong product name"
}
}
}Система прокси агентов
Для задач живой оценки, где разметчик общается с агентом в реальном времени, Potato предоставляет слой прокси агента. Прокси стоит между интерфейсом разметки и бэкендом агента и записывает весь диалог для последующего разбора.
- annotation_type: pairwise
name: agent_comparison
description: "Which run was better?"
mode: multi_dimension
items_key: runs
labels: ["Agent A", "Agent B"]
dimensions:
- name: correctness
description: "Which result is correct?"
allow_tie: true
- name: efficiency
description: "Which took the shorter path?"
allow_tie: trueТипы прокси
Прокси OpenAI переправляет сообщения в API, совместимый с OpenAI:
- annotation_type: process_reward
name: step_rewards
description: "Click the first step where the agent went wrong"
mode: first_error
steps_key: steps
step_text_key: contentHTTP-прокси переправляет сообщения на любой HTTP-эндпоинт (ваш собственный сервер агента):
live_agent:
endpoint_type: anthropic_vision # or openai_vision, ollama_vision
max_steps: 30
step_delay: 1.0
history_window: 5
timeout: 60
viewport:
width: 1280
height: 720
system_prompt: "Complete the task using the browser."
ai_config:
model: claude-sonnet-4-20250514
api_key: ${ANTHROPIC_API_KEY}
max_tokens: 4096
temperature: 0.3
instance_display:
fields:
- key: task
type: live_agent
label: "Live session"
display_options:
show_controls: true
allow_instructions: true
allow_takeover: true
show_overlays: trueЭхо-прокси возвращает сообщение пользователя обратно (полезно для тестов и разработки интерфейса):
agent_proxy:
type: openai
model: "gpt-4o"
api_key: ${OPENAI_API_KEY}
system_prompt: "You are a helpful customer service agent."
temperature: 0.7
max_tokens: 1024
sandbox:
max_steps: 20
max_session_seconds: 600
rate_limit_per_minute: 10
request_timeout_seconds: 60Готовые схемы разметки
Potato поставляется с 9 схемами разметки, созданными специально для оценки агентов. Используйте их напрямую или как отправную точку для своих.
| Схема | Тип | Описание |
|---|---|---|
agent_task_success | radio | Бинарный успех/провал с возможностью частичного зачёта |
agent_step_correctness | per_turn_rating (radio) | Пошаговые оценки «верно / неверно / лишнее» |
agent_error_taxonomy | per_turn_rating (multiselect) | Таксономия ошибок из 12 категорий (не тот инструмент, галлюцинация, зацикливание и т. д.) |
agent_safety | radio + text | Выявление нарушений безопасности со шкалой серьёзности |
agent_efficiency | likert | Оценка того, шёл ли агент эффективным путём |
agent_instruction_following | likert | Оценка следования исходной инструкции пользователя |
agent_explanation_quality | likert | Оценка качества рассуждений и объяснений агента |
agent_web_action_correctness | per_turn_rating (radio) | Пошаговая оценка веб-действий (верная цель, верный тип действия) |
agent_conversation_quality | multirate | Многомерное качество чата (полезность, точность, тон, безопасность) |
Готовая схема подключается по имени:
agent_proxy:
type: http
url: "https://my-agent.example.com/chat"
headers:
Authorization: "Bearer ${AGENT_API_KEY}"
message_key: message
response_key: response
session_id_key: session_id
send_history: true
history_key: messagesИли сочетайте готовые схемы со своими:
agent_proxy:
type: echo
responses:
- "Thanks, let me look into that."
- "I have found your order."Полный пример: оценка агента ReAct
Вот законченная конфигурация для оценки трасс агента в стиле ReAct с пошаговыми оценками:
annotation_task_name: "ReAct Agent Evaluation"
task_dir: "."
data_files:
- "data/traces.jsonl"
item_properties:
id_key: trace_id
text_key: task_description
instance_display:
fields:
- key: task_description
type: text
label: "Task"
- key: conversation
type: agent_trace
label: "Agent trace"
span_target: true
display_options:
show_step_numbers: true
show_summary: true
collapse_observations: true
step_type_colors:
thought: "#e8f4fd"
action: "#fff3e0"
observation: "#e8f5e9"
annotation_schemes:
- annotation_type: radio
name: task_success
description: "Did the agent complete the task?"
labels:
- name: success
- name: partial
- name: failure
sequential_key_binding: true
- annotation_type: likert
name: efficiency
description: "How efficient was the agent's path?"
size: 5
min_label: "Very inefficient"
max_label: "Optimal"
- annotation_type: multiselect
name: mast_errors
description: "Select every failure mode observed"
labels:
- name: step_repetition
- name: task_derailment
- name: reasoning_action_mismatch
- name: premature_termination
- name: no_errors
- annotation_type: text
name: failure_reason
description: "If the agent failed, describe what went wrong"
rows: 3
label_requirement:
required: false
output_annotation_dir: "annotation_output/"
export_annotation_format: jsonl
user_config:
allow_all_users: trueПример входных данных (data/react_traces.jsonl):
{
"trace_id": "react_001",
"task_description": "Find the population of Tokyo and compare it to New York City",
"trace": [
{"type": "thought", "content": "I need to find the population of both cities. Let me search for Tokyo first."},
{"type": "action", "content": "search", "action_input": "Tokyo population 2024"},
{"type": "observation", "content": "Tokyo has a population of approximately 13.96 million in the city proper..."},
{"type": "thought", "content": "Now I need to find New York City's population."},
{"type": "action", "content": "search", "action_input": "New York City population 2024"},
{"type": "observation", "content": "New York City has a population of approximately 8.34 million..."},
{"type": "thought", "content": "Tokyo (13.96M) has about 67% more people than NYC (8.34M)."},
{"type": "action", "content": "finish", "action_input": "Tokyo has ~13.96 million people vs NYC's ~8.34 million, making Tokyo about 67% larger by population."}
]
}Запустите сервер:
potato start config.yaml -p 8000Что почитать дальше
- Разметка кодовых агентов — отрисовка диффов, вывод терминала, дерево файлов для кодовых агентов
- Разметка процессных вознаграждений — данные для обучения PRM в режимах первой ошибки и по шагам
- Разметка ревью кода — комментарии прямо в диффе и вердикты в стиле пул-реквестов GitHub
- Живой кодовый агент — наблюдение за кодовым агентом в реальном времени с откатом и ветвлением
- Оценка живого агента — наблюдение за веб-агентом в реальном времени
- Разметка веб-агентов — разбор заранее записанных трасс веб-агентов
- Оценка ИИ-агентов: полное руководство — разбор целого проекта по оценке агента
- Форматы экспорта — выгрузка данных оценки агентов
Детали реализации — в исходной документации.