Skip to content

Разметка агентов

Оценка ИИ-агентов в Potato: 15 конвертеров форматов трасс, 5 типов отображения и готовые схемы для агентов, работающих с инструментами, вебом, кодом и чатом. Включая режимы PRM и оценки по рубрике.

Появилось в v2.3.0

Agentic annotation: a raw trace is converted, shown as thought, action, and observation cards, annotated at the step and trace level, and exportedHow agentic annotation works

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

Система разметки агентов в Potato решает это четырьмя способами:

  1. 15 конвертеров форматов трасс, приводящих логи агентов из любого крупного фреймворка к единому формату
  2. 5 специализированных типов отображения под разные модальности агентов (инструменты, веб, код, чат, наблюдение вживую)
  3. 9 готовых схем разметки, покрывающих самые частые измерения оценки агентов
  4. 4 отдельных типа разметки для продвинутой оценки: оценка траектории, оценка по рубрике, попарное сравнение и разметка процессных вознаграждений

Конвертеры форматов трасс

Трассы агентов приходят в совершенно разных форматах в зависимости от фреймворка. Potato поставляется с 15 конвертерами, которые приводят их к единому внутреннему представлению. Конвертер указывается в конфигурации, либо Potato определяет формат сам.

Справочник по конвертерам

КонвертерИсходный форматКлючевые извлекаемые поля
openaiТрассы OpenAI Chat Completions и Assistants APImessages, tool_calls, результаты функций
anthropicAnthropic Claude tool_use / Messages APIблоки content, tool_use, tool_result
swebenchТрассы задач SWE-benchпатч, результаты тестов, траектория
swe_agent_trajectoryФайлы траекторий SWE-Agentthought, 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
webarenaJSON трасс WebArena / VisualWebArenaдействия, скриншоты, снимки DOM, URL
web_agentТрассы веб-сёрфинга агентов (Mind2Web, Computer Use, сырые записи)действия, координаты, вьюпорт, скриншоты
atifAgent Trace Interchange Format (ATIF)шаги, наблюдения, метаданные
claude_codeЛоги сессий Claude Code и других кодовых агентовблоки tool_use, диффы, вывод терминала

Настройка

Укажите конвертер в конфигурации проекта:

yaml
agentic:
  enabled: true
  trace_converter: react
  trace_file: "data/agent_traces.jsonl"

Каждая строка файла трасс должна быть объектом JSON с сырой трассой агента. Остальное берёт на себя конвертер.

Для мультиагентных трасс, где разные агенты используют разные фреймворки, можно задать конвертер для каждого агента:

yaml
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:

yaml
agentic:
  enabled: true
  trace_converter: auto
  trace_file: "data/traces.jsonl"

Potato осматривает первые 10 трасс и выбирает наиболее подходящий конвертер по сигнатурам полей. Если уверенность ниже 80%, в лог пишется предупреждение — в таком случае конвертер стоит указать явно.

Свои конвертеры

Если вашего агентного фреймворка в списке нет, можно написать конвертер на Python:

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}

Зарегистрируйте его в конфигурации:

yaml
agentic:
  trace_converter: custom
  custom_converter: "converters/my_converter.py:MyConverter"

Типы отображения

После конвертации Potato отрисовывает трассы одним из пяти специализированных типов отображения. Каждый заточен под свою модальность агента.

1. Отображение трассы агента

Отображение по умолчанию для агентов, работающих с инструментами (вызов функций OpenAI, tool_use у Anthropic, ReAct, LangChain и т. д.). Каждый шаг отрисовывается карточкой с цветовой маркировкой по типу шага.

yaml
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-оверлеями, показывающими, где агент кликнул, что ввёл и куда прокрутил.

yaml
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. Интерактивный чат

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

yaml
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). Отрисовывает диффы кода с подсветкой синтаксиса, вывод терминала тёмными блоками и чтение файлов с номерами строк.

yaml
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. Отображение живого агента

Наблюдение за ИИ-агентами в реальном времени с органами управления для вмешательства человека. Поддерживает веб-агентов и кодовых агентов.

yaml
agentic:
  enabled: true
  display_type: live_agent

Возможности:

  • Потоковая передача действий агента в реальном времени через Server-Sent Events
  • Пауза и продолжение агента между шагами
  • Отправка инструкций, чтобы перенаправить агента посреди задачи
  • Перехват управления вручную
  • Откат к любой предыдущей контрольной точке (у кодовых агентов контрольные точки на основе git)
  • Ветвление и повтор от любой контрольной точки с другими инструкциями

Подробности настройки — в оценке живого агента и живом кодовом агенте.


Продвинутые типы разметки

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

Оценка траектории (trajectory_eval)

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

yaml
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. Задайте свои критерии и шкалу оценок. Разметчики оценивают каждый критерий независимо.

yaml
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/ничья по каждому измерению с обязательным обоснованием
yaml
annotation_schemes:
  - annotation_type: pairwise
    name: agent_comparison
    mode: multi_dimension
    allow_tie: true

Все три режима описаны в руководстве по попарному сравнению.

Разметка процессных вознаграждений

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

yaml
annotation_schemes:
  - annotation_type: process_reward
    name: prm
    mode: first_error    # or per_step

Полный справочник — в разметке процессных вознаграждений.


Оценки по репликам

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

yaml
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 позволяет показывать уточняющие вопросы только при определённых оценках, не захламляя интерфейс.

Формат вывода по репликам

Разметка по репликам сохраняется с индексами шагов:

json
{
  "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 предоставляет слой прокси агента. Прокси стоит между интерфейсом разметки и бэкендом агента и записывает весь диалог для последующего разбора.

yaml
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:

yaml
agent_proxy:
  type: openai
  openai:
    model: "gpt-4o"
    api_key: ${OPENAI_API_KEY}
    system_prompt: "You are a helpful assistant."
    temperature: 0.7

HTTP-прокси переправляет сообщения на любой HTTP-эндпоинт (ваш собственный сервер агента):

yaml
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

Эхо-прокси возвращает сообщение пользователя обратно (полезно для тестов и разработки интерфейса):

yaml
agent_proxy:
  type: echo
  echo:
    prefix: "[Echo] "
    delay_ms: 500

Готовые схемы разметки

Potato поставляется с 9 схемами разметки, созданными специально для оценки агентов. Используйте их напрямую или как отправную точку для своих.

СхемаТипОписание
agent_task_successradioБинарный успех/провал с возможностью частичного зачёта
agent_step_correctnessper_turn_rating (radio)Пошаговые оценки «верно / неверно / лишнее»
agent_error_taxonomyper_turn_rating (multiselect)Таксономия ошибок из 12 категорий (не тот инструмент, галлюцинация, зацикливание и т. д.)
agent_safetyradio + textВыявление нарушений безопасности со шкалой серьёзности
agent_efficiencylikertОценка того, шёл ли агент эффективным путём
agent_instruction_followinglikertОценка следования исходной инструкции пользователя
agent_explanation_qualitylikertОценка качества рассуждений и объяснений агента
agent_web_action_correctnessper_turn_rating (radio)Пошаговая оценка веб-действий (верная цель, верный тип действия)
agent_conversation_qualitymultirateМногомерное качество чата (полезность, точность, тон, безопасность)

Готовая схема подключается по имени:

yaml
annotation_schemes:
  - preset: agent_task_success
  - preset: agent_step_correctness
  - preset: agent_error_taxonomy

Или сочетайте готовые схемы со своими:

yaml
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 с пошаговыми оценками:

yaml
# 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):

json
{
  "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."}
  ]
}

Запустите сервер:

bash
potato start config.yaml -p 8000

Что почитать дальше

Детали реализации — в исходной документации.