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
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 с сырой трассой агента. Остальное берёт на себя конвертер.

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

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

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

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
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 и т. д.). Каждый шаг отрисовывается карточкой с цветовой маркировкой по типу шага.

yaml
instance_display:
  fields:
    - key: messages
      type: interactive_chat
      label: "Conversation"
      display_options:
        show_turn_numbers: true
        alternating_shading: true

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

  • Карточки шагов с цветной левой границей, обозначающей тип (мысль, действие, наблюдение, ошибка)
  • Сворачиваемые блоки для длинных наблюдений и выводов инструментов (порог настраивается)
  • Форматирование JSON для аргументов вызова инструментов и структурных ответов
  • Подсветка синтаксиса для блоков кода в наблюдениях
  • Боковой таймлайн шагов, показывающий всю трассу целиком
  • Переход к шагу для навигации по длинным трассам

2. Отображение трассы веб-агента

Для агентов, работающих в вебе (WebArena, VisualWebArena, сырые записи из браузера). Отрисовывает скриншоты с SVG-оверлеями, показывающими, где агент кликнул, что ввёл и куда прокрутил.

yaml
instance_display:
  fields:
    - key: screenshots
      type: gallery
      label: "Screenshots"
      display_options:
        layout: horizontal
        thumbnail_size: 300
        zoomable: true

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

  • Галерея скриншотов с просмотром в полный размер и зумом
  • SVG-оверлеи, показывающие цели кликов (красные кружки), области ввода текста (синяя подсветка) и направления прокрутки
  • Лента кадров внизу, показывающая все скриншоты миниатюрами для быстрой навигации
  • Описание действия под каждым скриншотом (например, «Клик по кнопке „Добавить в корзину“»)
  • Строка адреса с URL текущей страницы на каждом шаге
  • Сравнение «до и после» для шагов, меняющих содержимое страницы

3. Интерактивный чат

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

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

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

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

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

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

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

yaml
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/ничья по каждому измерению с обязательным обоснованием
yaml
  - annotation_type: multirate
    name: step_ratings
    description: "Rate each step"
    options_from_data: step_summaries
    labels: ["Incorrect", "Questionable", "Correct"]

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

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

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

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

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

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

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

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

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

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

yaml
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

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

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

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

yaml
agent_proxy:
  type: echo
  responses:
    - "Thanks, let me look into that."
    - "I have found your order."

Полный пример: оценка агента ReAct

Вот законченная конфигурация для оценки трасс агента в стиле ReAct с пошаговыми оценками:

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

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

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

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