Разметка агентов
Оценка ИИ-агентов в 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, диффы, вывод терминала |
Настройка
Укажите конвертер в конфигурации проекта:
agentic:
enabled: true
trace_converter: react
trace_file: "data/agent_traces.jsonl"Каждая строка файла трасс должна быть объектом JSON с сырой трассой агента. Остальное берёт на себя конвертер.
Для мультиагентных трасс, где разные агенты используют разные фреймворки, можно задать конвертер для каждого агента:
agentic:
enabled: true
trace_converter: multi_agent
trace_file: "data/multi_agent_traces.jsonl"
multi_agent:
agent_converters:
planner: react
coder: anthropic
reviewer: openaiАвтоопределение
Если вы не уверены, какой конвертер нужен, поставьте trace_converter: auto:
agentic:
enabled: true
trace_converter: auto
trace_file: "data/traces.jsonl"Potato осматривает первые 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}Зарегистрируйте его в конфигурации:
agentic:
trace_converter: custom
custom_converter: "converters/my_converter.py:MyConverter"Типы отображения
После конвертации Potato отрисовывает трассы одним из пяти специализированных типов отображения. Каждый заточен под свою модальность агента.
1. Отображение трассы агента
Отображение по умолчанию для агентов, работающих с инструментами (вызов функций OpenAI, tool_use у Anthropic, ReAct, LangChain и т. д.). Каждый шаг отрисовывается карточкой с цветовой маркировкой по типу шага.
agentic:
enabled: true
trace_converter: openai
display_type: agent_trace
agent_trace_display:
# Color coding for step types
colors:
thought: "#6E56CF"
action: "#3b82f6"
observation: "#22c55e"
error: "#ef4444"
system: "#6b7280"
# Collapsible sections
collapse_observations: true
collapse_threshold: 500 # characters before auto-collapsing
# Step numbering
show_step_numbers: true
show_timestamps: true
# Tool call rendering
render_json: true # pretty-print JSON arguments
syntax_highlight: true # highlight code in observationsВозможности:
- Карточки шагов с цветной левой границей, обозначающей тип (мысль, действие, наблюдение, ошибка)
- Сворачиваемые блоки для длинных наблюдений и выводов инструментов (порог настраивается)
- Форматирование JSON для аргументов вызова инструментов и структурных ответов
- Подсветка синтаксиса для блоков кода в наблюдениях
- Боковой таймлайн шагов, показывающий всю трассу целиком
- Переход к шагу для навигации по длинным трассам
2. Отображение трассы веб-агента
Для агентов, работающих в вебе (WebArena, VisualWebArena, сырые записи из браузера). Отрисовывает скриншоты с SVG-оверлеями, показывающими, где агент кликнул, что ввёл и куда прокрутил.
agentic:
enabled: true
trace_converter: webarena
display_type: web_agent
web_agent_display:
# Screenshot rendering
screenshot_max_width: 900
screenshot_quality: 85
# SVG overlay for agent actions
overlay:
enabled: true
click_marker: "circle" # circle, crosshair, or arrow
click_color: "#ef4444"
click_radius: 20
type_highlight: "#3b82f6" # highlight for text input fields
scroll_indicator: true
# Filmstrip view
filmstrip:
enabled: true
thumbnail_width: 150
show_action_labels: true
# DOM snapshot display
show_dom_snapshot: false # optional raw DOM view
show_url_bar: true
show_action_description: trueВозможности:
- Галерея скриншотов с просмотром в полный размер и зумом
- SVG-оверлеи, показывающие цели кликов (красные кружки), области ввода текста (синяя подсветка) и направления прокрутки
- Лента кадров внизу, показывающая все скриншоты миниатюрами для быстрой навигации
- Описание действия под каждым скриншотом (например, «Клик по кнопке „Добавить в корзину“»)
- Строка адреса с URL текущей страницы на каждом шаге
- Сравнение «до и после» для шагов, меняющих содержимое страницы
3. Интерактивный чат
Для оценки диалоговых агентов и чат-ботов. Поддерживает два подрежима: живой чат, где разметчик общается с агентом в реальном времени, и разбор трассы, где разметчик оценивает записанный диалог.
agentic:
enabled: true
display_type: interactive_chat
interactive_chat_display:
mode: trace_review # or "live_chat"
# Trace review settings
trace_review:
show_system_prompt: false
show_token_counts: true
show_latency: true
message_grouping: turn # "turn" or "message"
# Live chat settings (when mode: live_chat)
live_chat:
proxy: openai # agent proxy to use
max_turns: 20
timeout_seconds: 60
show_typing_indicator: true
allow_regenerate: true
# Common settings
show_role_labels: true
role_colors:
user: "#3b82f6"
assistant: "#6E56CF"
system: "#6b7280"
tool: "#22c55e"Режим разбора трассы отрисовывает записанный диалог с необязательным подсчётом токенов и задержкой по каждому сообщению. Разметчик может оценивать отдельные реплики или диалог целиком.
Режим живого чата подключает разметчика к работающему агенту через систему прокси агентов (см. ниже). Разметчик общается с агентом, а затем размечает получившийся диалог.
4. Отображение трассы кодового агента
Для сессий кодовых агентов (Claude Code, Aider, SWE-Agent). Отрисовывает диффы кода с подсветкой синтаксиса, вывод терминала тёмными блоками и чтение файлов с номерами строк.
agentic:
enabled: true
trace_converter: claude_code
display_type: coding_trace
coding_trace_display:
diff_style: unified # unified or split
terminal_theme: dark
show_file_tree: true
collapse_long_output: true
collapse_threshold: 50 # lines
show_line_numbers: true
syntax_highlight: trueВозможности:
- Единый вид диффа с красно-зелёной подсветкой для операций правки
- Тёмные терминальные блоки для вывода команд bash и shell
- Блоки кода с номерами строк для операций чтения файлов
- Боковое дерево файлов со всеми файлами, затронутыми за сессию
- Сворачивание длинного вывода для многословного терминала или содержимого файлов
Полный справочник — в разметке кодовых агентов.
5. Отображение живого агента
Наблюдение за ИИ-агентами в реальном времени с органами управления для вмешательства человека. Поддерживает веб-агентов и кодовых агентов.
agentic:
enabled: true
display_type: live_agentВозможности:
- Потоковая передача действий агента в реальном времени через Server-Sent Events
- Пауза и продолжение агента между шагами
- Отправка инструкций, чтобы перенаправить агента посреди задачи
- Перехват управления вручную
- Откат к любой предыдущей контрольной точке (у кодовых агентов контрольные точки на основе git)
- Ветвление и повтор от любой контрольной точки с другими инструкциями
Подробности настройки — в оценке живого агента и живом кодовом агенте.
Продвинутые типы разметки
Помимо оценок по репликам и готовых схем, в Potato есть четыре отдельных типа разметки для структурной оценки агентов.
Оценка траектории (trajectory_eval)
Локализация ошибок по шагам с иерархическими таксономиями ошибок и оценкой серьёзности. Каждый шаг получает оценку корректности, тип ошибки, уровень серьёзности и необязательное обоснование. Текущий счёт уменьшается в зависимости от серьёзности.
annotation_schemes:
- annotation_type: trajectory_eval
name: step_eval
error_types:
reasoning:
- logical_error
- incorrect_assumption
action:
- wrong_tool
- wrong_arguments
- premature_terminationПолное руководство — в публикации об оценке траекторий.
Оценка по рубрике (rubric_eval)
Многокритериальная сетка в стиле MT-Bench. Задайте свои критерии и шкалу оценок. Разметчики оценивают каждый критерий независимо.
annotation_schemes:
- annotation_type: rubric_eval
name: agent_rubric
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?"
scale_points: 5
scale_labels:
1: "Very Poor"
3: "Acceptable"
5: "Excellent"Инструкции по настройке — в руководстве по оценке по рубрике.
Попарное сравнение
Сравнение двух трасс агентов бок о бок в трёх режимах:
- Бинарный: кликом выбрать A или B (с необязательной ничьей)
- Шкала: ползунок от «A намного лучше» до «B намного лучше»
- По измерениям: независимый выбор A/B/ничья по каждому измерению с обязательным обоснованием
annotation_schemes:
- annotation_type: pairwise
name: agent_comparison
mode: multi_dimension
allow_tie: trueВсе три режима описаны в руководстве по попарному сравнению.
Разметка процессных вознаграждений
Пошаговая бинарная разметка корректности, заточенная под обучение моделей вознаграждения процесса. Два режима: первая ошибка (кликаете первый неверный шаг, остальные помечаются автоматически) и по шагам (каждый оценивается отдельно).
annotation_schemes:
- annotation_type: process_reward
name: prm
mode: first_error # or per_stepПолный справочник — в разметке процессных вознаграждений.
Оценки по репликам
Для диалоговых и многошаговых оценок часто нужны оценки отдельных реплик, а не (или не только) трассы целиком. Potato поддерживает разметку по репликам для любого типа отображения.
annotation_schemes:
# Overall trace rating
- annotation_type: likert
name: overall_quality
description: "Rate the overall quality of this agent trace"
labels:
1: "Very Poor"
5: "Excellent"
# Per-turn ratings
- annotation_type: trajectory_eval
name: step_correctness
description: "Was this step correct?"
steps_key: agentic_steps # binds to trace steps
correctness_options:
- "Correct"
- "Partially Correct"
- "Incorrect"
- "Unnecessary"
- annotation_type: trajectory_eval
name: step_explanation
description: "Explain any issues with this step"
steps_key: agentic_stepsОценки по репликам появляются рядом с карточкой каждого шага. Блок 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 предоставляет слой прокси агента. Прокси стоит между интерфейсом разметки и бэкендом агента и записывает весь диалог для последующего разбора.
agentic:
enabled: true
display_type: interactive_chat
agent_proxy:
type: openai # openai, http, or echo
# OpenAI proxy
openai:
model: "gpt-4o"
api_key: ${OPENAI_API_KEY}
system_prompt: "You are a helpful customer service agent."
temperature: 0.7
max_tokens: 1024Типы прокси
Прокси OpenAI переправляет сообщения в API, совместимый с OpenAI:
agent_proxy:
type: openai
openai:
model: "gpt-4o"
api_key: ${OPENAI_API_KEY}
system_prompt: "You are a helpful assistant."
temperature: 0.7HTTP-прокси переправляет сообщения на любой HTTP-эндпоинт (ваш собственный сервер агента):
agent_proxy:
type: http
http:
url: "https://my-agent.example.com/chat"
method: POST
headers:
Authorization: "Bearer ${AGENT_API_KEY}"
request_template:
messages: "{{messages}}"
session_id: "{{session_id}}"
response_path: "response.content"
timeout_seconds: 30Эхо-прокси возвращает сообщение пользователя обратно (полезно для тестов и разработки интерфейса):
agent_proxy:
type: echo
echo:
prefix: "[Echo] "
delay_ms: 500Готовые схемы разметки
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 | Многомерное качество чата (полезность, точность, тон, безопасность) |
Готовая схема подключается по имени:
annotation_schemes:
- preset: agent_task_success
- preset: agent_step_correctness
- preset: agent_error_taxonomyИли сочетайте готовые схемы со своими:
annotation_schemes:
- preset: agent_task_success
- preset: agent_step_correctness
# Custom schema alongside presets
- annotation_type: text
name: evaluator_notes
description: "Any additional observations about this agent trace"
label_requirement:
required: falseПолный пример: оценка агента ReAct
Вот законченная конфигурация для оценки трасс агента в стиле ReAct с пошаговыми оценками:
# project config
task_name: "ReAct Agent Evaluation"
task_dir: "."
data_files:
- "data/react_traces.jsonl"
item_properties:
id_key: trace_id
text_key: task_description
agentic:
enabled: true
trace_converter: react
display_type: agent_trace
agent_trace_display:
colors:
thought: "#6E56CF"
action: "#3b82f6"
observation: "#22c55e"
error: "#ef4444"
collapse_observations: true
collapse_threshold: 300
show_step_numbers: true
render_json: true
annotation_schemes:
- preset: agent_task_success
- preset: agent_step_correctness
- preset: agent_efficiency
- annotation_type: text
name: failure_reason
description: "If the agent failed, describe what went wrong"
label_requirement:
required: false
output_annotation_dir: "output/"
output_annotation_format: "jsonl"Пример входных данных (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
- Живой кодовый агент — наблюдение за кодовым агентом в реальном времени с откатом и ветвлением
- Оценка живого агента — наблюдение за веб-агентом в реальном времени
- Разметка веб-агентов — разбор заранее записанных трасс веб-агентов
- Оценка ИИ-агентов: полное руководство — разбор целого проекта по оценке агента
- Форматы экспорта — выгрузка данных оценки агентов
Детали реализации — в исходной документации.