Как пользоваться Phoenix
в нашем chat-agent
Найти именно свой запрос. Понять, что сделали модель и инструменты. Разобрать ошибку, проверить время и сохранить вывод. Затем - сравнить изменение на учебных данных.
С чего начать и что Phoenix покажет
Вы задаёте вопрос на карте, агент обращается к модели и инструментам, а Phoenix собирает запись этих этапов. По ней видно, что вызвал агент, где возникла ошибка и сколько времени заняла генерация. Ответ на карте и техническое выполнение проверяем вместе.
Учебник снят с нашего Phoenix версии 20.19.0 7 октября 2026 года. Иллюстрации - настоящие снимки интерфейса с отдельным слоем подписей. Примеры для ввода выделены отдельно. Для учебника мы не отправляли новые вопросы агенту, не меняли карту и настройки сервиса, не создавали наборы данных или эксперименты.
| Уже можно | Нужно предварительно настроить |
|---|---|
| Найти этапы по сессии и request_id, прочитать дерево, длительности, модель, токены и класс ошибки. | Ручные оценки: подключить конфигурацию оценок к проекту. |
| Открыть Metrics, Dashboards и безопасные атрибуты. | Playground, эксперименты и PXI: разрешённый доступ к модельному провайдеру. В нашей форме он пока не настроен. |
| Посмотреть API и политику хранения. | Datasets и Evaluators: создать учебные примеры и критерии. Сейчас списки пусты. |
- 1Tracing: открыть проект
- 2Spans: отдельные этапы
- 3Заменить весь фильтр
- 4Выбрать время
- Откройте phoenix.gis-master.ru. Если видна Signature, войдите штатным способом. Подпись и cookie для диагностики копировать не нужно.
- Слева нажмите Tracing. В списке проектов откройте default. Наши текущие трассы находятся в нём.
- Откройте вкладку Spans. В ней ищем этап
chat_agent.agentи нужный бизнес-запрос. - Для нового вопроса выберите Last 15 Min или Last Hour. Для примеров со снимков - период, включающий 7 октября 2026 года, 04:51-06:59, GMT+3.
- Читайте главы 2-11 по порядку при первой отладке. Для конкретной задачи используйте оглавление слева. Снимки увеличиваются кликом; запросы можно копировать кнопкой.
Проверка по коду: какие атрибуты разрешены в трассах.
Задать вопрос на карте и сохранить ориентиры
Начнём с понятного учебного запроса. Он должен прочитать деморейс, показать маршрут и посчитать оставшееся время. Рейс и расчёт - демоданные, а не реальная информация о вылете.
Для деморейса TEST123 покажи маршрут до SVO и посчитай оставшееся время: 120 минут до вылета, 70 минут на дорогу, 30 минут запас.
- 1Вопрос: сюда и Enter
- 2Ответ: проверить смысл
- 3Демоданные и планы
- 4Связь с аудио и событиями
- Откройте chat-agent.gis-master.ru и нужный чат. Если панель свернута, нажмите Чат в правом нижнем углу.
- Для первого опыта используйте текст: вставьте пример в поле Введите сообщение... и нажмите Enter. Не запускайте параллельно несколько одинаковых вопросов - их будет сложнее сопоставлять по времени.
- Запишите время отправки до секунды и часовой пояс. В наших снимках Phoenix показывает GMT+3.
- Нажмите Ctrl+L и посмотрите адрес карты:
https://chat-agent.gis-master.ru/chat/<UUID>. Часть после/chat/- этоsession_id. Скопируйте только UUID. Если открыт адрес без выбранного чата, возьмите session_id из Payload запроса/core/message- путь описан в главе 5. - Дождитесь ответа на карте. Проверьте маршрут, упоминание деморейса и арифметику
120 − 70 − 30 = 20 минут. Статус OK в Phoenix сам по себе не доказывает правильность результата.
Проверка по коду: как текст получает request_id и отправляется в Core.
Выбрать период и убрать лишние этапы
В проекте смешаны HTTP-запросы, распознавание, работа модели и инструменты. Сначала сузим время и оставим верхний этап обработки вопроса.
- 1Открыть период
- 2Свежий запрос: 15 минут
- 3История: 7 дней
- 4Точные даты: календарь
- Нажмите период в правом верхнем углу. Выберите Last 15 Min, если вопрос только что отправлен. Если отладка заняла больше времени - Last Hour.
- Чтобы открыть старый случай, нажмите Pick from a calendar и задайте даты и время, включающие отправку вопроса.
- Вернитесь в Spans. Нажмите поле фильтра, затем Ctrl+A, чтобы выделить всё выражение.
- Вставьте фильтр ниже и нажмите обычный Enter. Не добавляйте его к
parent_id is None: Agent часто вложен в другой span и исчезнет из такой выборки. - Если таблица пуста, сначала расширьте период и проверьте синтаксис. Не считайте пустую выборку доказательством того, что агент не запускался.
name == "chat_agent.agent"
- 1Сюда: точное выражение
- 2Открыть строку Agent
Подробнее: официальный синтаксис фильтров.
Найти вопросы именно своего чата
Если точный request_id ещё неизвестен, ищем по сессии и времени. Это удобный путь из интерфейса карты. Он даёт кандидата для проверки; точное соответствие конкретному вопросу закрепляем идентификатором запроса.
- 1Сессия + этап Agent
- 2Открыть подходящий этап
- 3Обновление / пауза
chat.session_id == "id-f9c26e6ff459" and name == "chat_agent.agent"
- Возьмите UUID после
/chat/в адресе своего чата; этоsession_id. В примере выше замените UUID в кавычках своим значением. - Во вкладке Spans замените весь фильтр и нажмите Enter. Останутся только этапы этой сессии.
- Сопоставьте строку с временем отправки. Столбец start time может быть за правым краем таблицы: прокрутите таблицу по горизонтали или откройте строку и прочитайте дату в заголовке детали.
- Если строк мало, а вопроса ещё нет, дождитесь завершения ответа и обновления таблицы. Для новых данных используйте управление обновлением возле периода; не нажимайте отправку того же вопроса повторно.
- Откройте
chat_agent.agent. В Info разверните Attributes или перейдите во вкладку Attributes. Найдитеchat.session_idиchat.request_id. - Проверьте сессию, время и состав инструментов. Если рядом несколько похожих ходов, возьмите request_id из Network по следующей главе: совпадение только по времени недостаточно.
- 1Здесь request_id и session_id
- 2Время и длительность этапа
- 3Trace ID: другая сущность
Взять точный request_id из браузера
Это самый надёжный способ связать вашу реплику с Phoenix. Идентификатор запроса создаётся ещё до отправки текста в Core. В завершённом сообщении чата он может не показываться, поэтому Network удобнее открыть заранее.
- На странице карты нажмите F12 или Ctrl+Shift+I. В открывшихся инструментах Chrome выберите вкладку Network. Если она скрыта, найдите её в меню дополнительных вкладок ».
- Убедитесь, что запись Network включена: кнопка записи слева сверху красная. Выберите Fetch/XHR и в строке Filter введите
/core/message. - Теперь отправьте новый учебный вопрос на карте. В списке Network появится строка запроса. Нажмите её и проверьте: Request Method: POST.
- Откройте вкладку Payload → Request Payload. Найдите поля
request_idиsession_id. Скопируйте только их значения. - В Response после завершения проверьте итог и ошибку, если она есть. Не используйте Copy as cURL для передачи коллегам: так можно скопировать cookie и другие заголовки доступа.
- Перейдите в Phoenix. Вставьте
chat.request_id == "ВАШ_REQUEST_ID"в Spans, нажмите Enter и откройте Agent. Это связывает отладку именно с этой отправкой.
{
"text": "Учебный вопрос о TEST123",
"request_id": "<UUID запроса>",
"turn_id": "<UUID реплики>",
"session_id": "<UUID чата>"
}| Идентификатор | За что отвечает |
|---|---|
session_id | Один чат, в нём много вопросов. |
request_id | Одна обработка запроса. Основной ключ поиска. |
turn_id | Реплика в истории. Не подставляем его вместо request_id. |
trace_id | Техническая цепочка OpenTelemetry. Голосовая цепочка может охватывать несколько вопросов. |
span_id | Один этап внутри цепочки: Agent, модель или инструмент. |
Проверка по коду: POST /core/message и разбор ответа.
Открыть весь путь конкретного запроса
После поиска по request_id таблица может показать лишь несколько строк. Это не весь набор действий. Часть вложенных span SDK не имеет нашего бизнес-атрибута, но находится в той же трассе.
chat.request_id == "id-18139683b422"
- 1Фильтр по request_id
- 2Открыть Agent
- 3Два вызова gateway LLM
- Во вкладке Spans замените весь фильтр выражением по своему request_id. В нашем историческом примере используйте UUID выше.
- Нажмите строку
chat_agent.agent. Справа откроется дерево всей трассы и детали выбранного span. - Проверьте
chat.request_idиchat.session_idв Attributes. Скопируйте также Trace ID из верхнего заголовка для ссылки коллеге. - В дереве найдите этот Agent по времени начала. При голосе рядом могут быть Agent других вопросов.
- Дальше читайте только его вложенную ветку:
chat_agent.agent.pydantic,invoke_agent ..., вызовы модели и инструменты. - Чтобы увидеть дочерние span, не требуйте наличия request_id у каждого. Фильтр выбрал входную точку; дерево показывает связи, даже если SDK-child не несёт бизнес-UUID.
Подробнее: что такое trace, span и вложенность.
Прочитать дерево: кто вызвал кого
Дерево объясняет порядок исполнения. Внешний Agent владеет запросом, Pydantic AI выбирает следующий шаг, модель предлагает инструмент, а инструмент возвращает данные. Затем модель может сформировать окончательный ответ или сделать ещё один шаг.
- 1Владелец этого запроса
- 2Одна генерация модели
- 3Code Mode: run_code
- 4Проверить business ID
- Нажмите нужный Agent в дереве. Заголовок справа показывает название, статус, дату начала и длительность выбранного этапа.
- Разверните его вложенные строки, если они свернуты. Ищите родительскую ветку по отступам, а не только по повторяющемуся названию.
- Нажмите
chat Qwen3.8-27B-FP8. Это отдельное обращение к модели. Следующий такой же дочерний span может означать следующую генерацию после инструмента. - Нажмите
execute_tool flight_getилиexecute_tool run_code. Это исполнение инструмента, выбранного агентом. - Для временных границ наведите мышь на строку дерева: всплывающая подсказка показывает начало, конец и длительность. Кнопка часов возле поиска дерева управляет отображением метрик.
- Не складывайте длительности родителя и его детей. Родитель уже включает ожидание дочерних этапов. Несколько nested-обёрток одного LLM-вызова тоже не являются несколькими генерациями.
Проверка по коду: где начинается ветка Pydantic AI.
Проверить модель, генерации и токены
Если агент долго думал, сначала смотрим каждое обращение к модели. Phoenix показывает имя модели, длительность и количество токенов, когда провайдер вернул usage. Он не показывает в нашей production-настройке всю отправленную историю.
- 1Выбран именно LLM
- 2Вкладка Attributes
- 3Токены этого вызова
- 4Провайдер и модель
- Откройте ветку своего Agent. Выберите span
chat Qwen3.8-27B-FP8, а не общийchat_agent.llm. - Перейдите в Attributes. Найдите
llm.model_nameилиgen_ai.request.model. Так проверяется фактическое имя модели в вызове. - Найдите
llm.token_count.prompt/gen_ai.usage.input_tokensиllm.token_count.completion/gen_ai.usage.output_tokens. Это альтернативные названия одних чисел, не два расхода. - Посмотрите длительность в заголовке span. Для примера на снимке это около 4,5 с. Такое число относится к этому вызову, включая запрос к провайдеру, а не к целому голосовому сеансу.
- Повторите для остальных
chat Qwen...в той же ветке. Считайте генерации по одному выбранному виду span, чтобы не удвоить обёрткиchat_agent.agent.model. - При большом input сравните число с лимитом входа 6144 токена. История и схемы инструментов занимают бюджет вместе с вопросом. Не выводите содержимое истории из одного числа токенов.
Проверка по коду: streaming-запрос, параметры и usage.
Проверить инструменты и Code Mode
Теперь проверим, что агент действительно прочитал данные и сделал расчёт. Наличие правильного текста ответа недостаточно: нужно увидеть инструменты в ветке и результат на карте.
- 1flight_get: имя и время
- 2Карточка инструмента
- 3Инструмент внутри ветки
- В ветке Agent найдите
execute_tool flight_getи нажмите строку. В Info проверьте имя и статус, в Attributes -tool.name. - Найдите
execute_tool run_code. Это Code Mode: модель предложила вычисление, которое выполняется в Monty. - Под run_code посмотрите вызовы чтения. В снятом примере есть
position_get,flight_get,weather_getиgeo_distances. Их наличие доказывает обращение к данным, но сами аргументы и значения здесь скрыты. - После расчёта найдите
execute_tool map_show_routeилиmap_show_points. Это отдельный native tool для изменения карты. - Вернитесь на карту. Сопоставьте реально появившийся маршрут и текст ответа с задачей. Успешный tool-span означает завершение серверного действия; правильное отображение карты проверяется в интерфейсе.
- Если модель утверждает, что сохранила план, дополнительно проверьте карточку подтверждения и список сохранённых планов. Чтение данных или команда карты не заменяют подтверждение записи.
- 1Выбрать run_code
- 2Чтения внутри Code Mode
- 3tool.name = run_code
- 1Навести map_show_route
- 2Начало, конец и длительность
Разобрать запрос, который завершился ошибкой
Ошибки начинаем с самого запроса, а затем идём по его дочерним этапам. Красный родитель нередко лишь передаёт исключение, которое возникло ниже.
name == "chat_agent.agent" and status_code == "ERROR"
- 1Только ERROR у Agent
- 2Открыть конкретную ошибку
- Если request_id известен, ищите по нему. Если нет - примените фильтр ошибок и сузьте период до времени проблемного вопроса.
- Откройте
chat_agent.agent. Проверьте сессию, время и request_id в Attributes, чтобы не разбирать чужой случай. - Пройдите вниз по его ветке. Откройте красные дочерние этапы и сравните их время. Ошибка родителя не доказывает, что сломался именно он.
- Найдите
error.type. На снятом запросе этоRequestStopped. Такой класс используется для разных причин остановки; по одному имени нельзя объявить, что закончился deadline или упал flight_get. - Вернитесь в чат и прочитайте конкретную русскую причину. Для текстового запроса также посмотрите Network → /core/message → Response: там находится штатный ответ приложения, включая ошибку.
- Зафиксируйте request_id, trace_id, время, самый глубокий доступный ERROR, длительности LLM/tool и видимый пользователю результат. Если подробная причина не экспортирована, так и укажите: "класс остановки найден, точная причина по этой трассе не установлена".
- 1Ошибка выбранного Agent
- 2Проверить request_id
- 3Класс: RequestStopped
- 1Идём в красную ветку
- 2Смотрим выбранный этап
Проверка по коду: что записывается при исключении.
Найти, где запрос потерял время
Сначала отделяем время одного вопроса от времени соединения. Затем сравниваем его последовательные генерации и инструменты. Такой порядок не даст обвинить модель из-за долгого открытого микрофона.
- 1Вся голосовая трасса
- 2Один этап: 463 мс
- Найдите свой request_id и Agent по разделам о сессии и точном request_id. Запишите длительность выбранного Agent справа, не верхнюю Latency всей trace.
- Проверьте начало Agent относительно отправки текста или ASR final. Если до Agent была пауза, поищите соседний Core/voice-этап. Не приписывайте эту паузу LLM без доказательства.
- Откройте каждую генерацию
chat Qwen...этой ветки. Большой вход может удлинить подготовку контекста, большой выход - генерацию. Сам Phoenix здесь не разделяет внутренние GPU-этапы. - Посмотрите инструменты. Если один занимает основную часть Agent, проблема может быть в ожидании данных или вычислении. Если инструмент быстрый, но генераций много - изучайте порядок выбора действий.
- Сравните последовательные вызовы по временным границам. Учитывайте только один уровень LLM-span: Pydantic span, NATS-обёртка и gateway могут охватывать один и тот же вызов.
- Для очереди, CPU, RAM и медиапоказателей нужны отдельные метрики Grafana/VictoriaMetrics и runtime. В коде есть
chat_agent.queue.wait, но отсутствие соответствующего span в Phoenix не означает нулевое ожидание.
name == "chat_agent.agent" and latency_ms > 10000
Проверка по коду: раздельные метрики этапов, очередей и клиента.
Найти голосовой запрос: PCM → ASR final → Agent
Для голоса есть два разных канала: аудио идёт через WebRTC или /audio/ws, а статусы и ответы приходят в браузер по NATS WebSocket /ws. Ошибка соединения с микрофоном может возникнуть ещё до появления Agent.
- 1Статус подключения
- 2Аудио / события отдельно
- 3Выбор аудиотранспорта
- 4Микрофон
- На карте проверьте, что аудио и события подключены. При первой работе разрешите микрофон штатным способом. Для отладки существующего вопроса не меняйте транспорт и настройки задним числом.
- Запишите время окончания своей фразы. В Phoenix выберите ту же сессию и нужный период.
- В дереве ищите
chat_agent.asr.final, затем следующий соответствующийvoice.agent_requestиchat_agent.agent. Partial - промежуточное распознавание; оно не равно отправке нового окончательного вопроса Agent. - Из Agent возьмите request_id. Если в одной длинной trace несколько Agent, сверяйте время и business ID у каждого.
- Для точного ID из браузера откройте F12 → Network → WS. Выберите событийное соединение
/ws, затем Messages. Найдите полученный JSON сrequest_idиsession_idнужного ответа. Это внутри текстовых сообщений NATS; служебные строки INFO/PING/MSG сами по себе не являются ответом агента. - Не ищите этот JSON в
/audio/ws: там отправляется бинарный PCM. При проблеме с голосом разделяйте "ASR final ещё нет" и "Agent получил final, но не ответил". - Если PCM/распознавание не подтверждаются нашими span, нужна диагностика владельца voice. Внутреннее выполнение Whisper на H100 не появляется автоматически в Phoenix от наличия traceparent у chat-agent.
Info, Attributes и Events: что там читать
Деталь span состоит из удобного представления Info, списка атрибутов и событий. У нашей интеграции содержимое специально ограничено, поэтому полезно заранее понимать, какие пустые поля нормальны.
- 1Info / Attributes / Events
- 2Output: служебные данные
- 3Annotations: ручная оценка
- Во вкладке Info прочитайте название, тип, статус и блоки LLM/Tool. Отсутствие текста Input/Output в текущих трассах ожидаемо.
- Во вкладке Attributes найдите числовые значения и безопасные ключи. Переключатель Table / JSON меняет представление тех же данных.
- Если таблица длинная, используйте лупу поиска атрибутов и введите
token,requestилиerror. Если поиск не включён, можно просто прокрутить таблицу. - Во вкладке Events проверьте число. Текущий safe exporter удаляет события, поэтому
Events 0не доказывает отсутствие исключений или streaming. - Кнопка копирования рядом с Attributes копирует этот набор атрибутов. Для передачи коллеге достаточно IDs и безопасных времён, без содержимого самого чата.
- Не включайте запись conversation content только ради удобства диагностики. Для проверки текста используйте интерфейс чата и контролируемые учебные примеры.
Проверка по коду: санитизация атрибутов, events и links.
Почему Sessions пусто и как смотреть весь чат
Phoenix умеет собирать разговоры в Sessions, но для этого нужен стандартный атрибут сессии. У нас сейчас передаётся пользовательский ключ chat.session_id. Поэтому вкладка Sessions пуста, хотя запросы чата есть в Spans.
- 1Вкладка Sessions
- 2Сейчас сессий 0
- 3Set up: изменение интеграции
- В Tracing → default откройте Sessions. Если видите пустой список как на снимке, не пытайтесь искать чат по тексту или чужому user ID.
- Вернитесь в Spans. Используйте фильтр по
chat.session_idиname == "chat_agent.agent". - Откройте вопросы этой сессии по времени и сравните последовательность инструментов. Это рабочий способ просмотра текущего чата.
- Историю реплик и состояние планов смотрите в chat-agent: они хранятся приложением, а не восстанавливаются из Phoenix.
- Кнопка Set up Sessions объясняет подключение стандартного атрибута
session.id. Это задача интеграции в коде, а не кнопка, которая автоматически найдёт наши старые чаты.
chat.session_id == "id-f9c26e6ff459" and name == "chat_agent.agent"
Оценить правильность ответа вручную
Технический OK говорит, что этап завершился. Ручная оценка отвечает на другой вопрос: выполнил ли агент задачу пользователя. Так можно отделить "модель ответила" от "маршрут и расчёт действительно правильные".
- 1Settings → Annotations
- 2Готовая user_feedback
- 3Создать свой критерий
- Откройте Settings → Annotations. Для простой проверки достаточно существующей
user_feedbackс категориями positive / negative. - Если нужен свой критерий, нажмите New Configuration. В Annotation Name введите
task_correctness, а в Description -Правильность выполнения учебной задачи на карте. - Выберите Categorical. В Categories задайте
correctсо score1иincorrectсо score0. Для такого критерия подходит Maximize. Нажатие Create Annotation Config сохранит конфигурацию. - Откройте Tracing → default → Config. В Annotation Configs поставьте галочку напротив выбранной конфигурации. Это её назначение проекту; без него span-редактор оценки не предложит категорию.
- Найдите свой Agent через Spans и откройте Info → Annotations. Нажмите карандаш, выберите имя критерия и категорию. Если форма предлагает explanation, кратко укажите проверяемый факт, например
Маршрут показан; арифметика 120-70-30 дала 20 минут; демоданные обозначены. Сохраните оценку кнопкой формы. - Вернитесь к тому же span и проверьте появившуюся оценку. Она привязана к выбранному этапу; оценка инструмента и оценка всего Agent - разные записи.
- 1Имя критерия
- 2Тип оценки
- 3Категория и score
- 4Сохранить конфигурацию
- 1Открыть Config
- 2Назначить оценку проекту
Подробнее: ручные оценки в UI.
Добавить заметку и передать ссылку на случай
Заметка нужна, когда одного класса ошибки мало. В ней оставляем наблюдаемые факты и вопрос для следующего расследования. Ссылка открывает ту же трассу, но не выдаёт доступ человеку без штатной авторизации.
- 1Notes: добавить факт
- 2Share: ссылка на трассу
- 3Ключи для сопоставления
- Найдите конкретный Agent и проверьте его request_id. В Info разверните Notes.
- Нажмите значок добавления заметки справа от Notes. Введите краткое описание: время, ожидаемый результат, видимый пользователю сбой и что уже доказано по trace. Сохраните заметку кнопкой редактора.
- Укажите границу знания: например
Видим RequestStopped после двух LLM-вызовов. Точный код остановки в этой трассе не экспортирован.. Не записывайте предположение как установленную причину. - Для ссылки нажмите Share над деревом и воспользуйтесь копированием ссылки. Можно также скопировать текущий URL страницы с выбранным span.
- Передайте ссылку, request_id, trace_id и время коллеге через разрешённый рабочий канал. Не добавляйте Signature, cookie, SDP, аудио и разговор в техническую заметку.
- Учитывайте срок хранения. Ссылка не является архивом: после очистки трассы сохранённый HTML-снимок останется, а живой trace может исчезнуть.
Случай: TEST123 / запрос <request_id> Время: <дата, время, GMT+3> Trace ID: <trace_id> Ожидалось: маршрут и расчёт 20 минут Наблюдалось: <что увидел пользователь> Phoenix: <этап, статус, длительность, error.type> Не установлено: <какой причины пока нет в данных>
Посмотреть общую картину в Metrics и Dashboards
Эти экраны помогают заметить изменения потока запросов, ошибок и токенов. В нашем проекте вместе находятся разные виды trace, поэтому общий график задержки не равен скорости ответа агента.
- 1Metrics внутри проекта
- 2Задержки целых трасс
- 3Cost: сейчас нет данных
- Откройте Tracing → default → Metrics. Выберите одинаковый период при сравнении двух наблюдений.
- Посмотрите Traces: сколько цепочек зарегистрировано и какие статусы у них были. Это число трасс, а не гарантированное число пользовательских реплик.
- В Trace latency читайте p50 как середину распределения, p95/p99 - как его медленный хвост. Сначала выясните, какие trace вошли: долгий голосовой сеанс может доминировать в хвосте.
- Прокрутите вниз к Token usage и моделям по токенам. Сверяйте счётчики с конкретным LLM-span, если хотите понять один вопрос.
- Для общего экрана нажмите слева Dashboards. В Select a project выберите default. Без проекта графики не появятся.
- Чтобы измерить время Agent, используйте выборку Spans и длительности Agent, а для ресурсов и очередей - корпоративную Grafana. Не выдавайте общий Phoenix p99 за время ответа чата.
- 1Открыть Dashboards
- 2Выбрать default
- 1Проверить проект
- 2Проверить период
Откуда берётся Cost и зачем нужен Models
В Models хранится сопоставление имени модели с ценой токенов. Это справочник расчёта стоимости в Phoenix. Он не устанавливает модель на H100 и не меняет выбор модели нашего Agent.
- 1Settings → Models
- 2Поиск точного имени
- 3Цена входа и выхода
- 4Add Model: новая запись
- Откройте Settings → Models. В поиске введите
Qwen3.8-27B-FP8. - Проверьте наличие правила и его match pattern. Сопоставление должно подходить фактическому имени из LLM-span.
- Если записи нет, Phoenix не знает согласованную цену этой модели. Наличие чужих built-in записей не решает этот вопрос.
- Для расчёта владелец может нажать Add Model, задать имя/шаблон, цену prompt и completion за миллион токенов и дату начала. Для собственного H100 нужны утверждённые внутренние ставки; не подставляйте облачный тариф другой модели.
- После настройки проверьте расчёт в конкретном span и периоде Dashboards. Отдельно учитывайте ресурсы сервера - этот справочник не даёт CPU/RAM и фактическую себестоимость.
Собрать учебные случаи в Dataset
Dataset - набор одинаковых входов и ожидаемых результатов. Он нужен, чтобы сравнивать варианты на одних и тех же задачах. Для начала достаточно трёх синтетических арифметических примеров, без истории production-чата.
- 1Datasets & Experiments
- 2Новый набор
- Откройте слева Datasets & Experiments, затем нажмите New Dataset.
- На вкладке From scratch укажите имя
chat-agent-demo-arithmetic. В Description напишитеСинтетические проверки арифметики, без production-разговоров. - В metadata можно записать
{"scope":"synthetic","purpose":"tutorial"}. Это служебное описание набора. - Нажмите Create Dataset, если хотите создать пустой набор. После создания отдельно нужно добавить примеры: само имя Dataset не создаёт тестовые строки.
- Для первого законченного опыта удобнее путь From file в следующей главе: он сразу импортирует три подготовленных примера.
- При использовании production-span не рассчитывайте автоматически получить исходный вопрос и ответ: они удалены из экспортированных данных. Для оценки качества нужны разрешённые входы и эталоны.
- 1From scratch
- 2Имя набора
- 3Описание и metadata
- 4Создать пустой набор
Подробнее: создание и импорт Dataset.
Импортировать готовые примеры из файла
Этот путь превращает учебные фразы в повторяемый набор. Inputs хранит вопрос, Outputs - ожидаемый результат, Metadata - признаки случая. Ожидаемый ответ - эталон для сравнения, а не уже полученный ответ модели.
- 1From file
- 2Выбрать учебный файл
- Нажмите кнопку скачивания выше. Она создаёт файл из встроенных синтетических примеров прямо в браузере; запросов к сервисам не делает.
- В Phoenix откройте Datasets & Experiments → New Dataset → From file. Нажмите область загрузки или перетащите
phoenix-demo.jsonl. - В предварительном просмотре проверьте три строки. Если мастер предлагает сопоставление, назначьте
inputsвходами,outputsэталонными выходами,metadataслужебными данными. Точные подписи следующего шага зависят от распознанного формата. - Назовите набор
chat-agent-demo-arithmeticи завершите импорт кнопкой создания в мастере. - Откройте созданный набор и проверьте количество примеров: 3. В каждой строке должен быть
inputs.questionи эталонoutputs.expected. - Если импорт сообщает ошибку, сначала проверьте структуру JSONL: одна самостоятельная JSON-запись в строке, без общего массива. Не запускайте эксперимент по пустому или неправильно сопоставленному набору.
{"inputs": {"question": "До вылета 120 минут. На дорогу 70 минут, запас 30 минут. Сколько останется?"}, "outputs": {"expected": "20 минут"}, "metadata": {"case": "margin_20", "synthetic": true}}
{"inputs": {"question": "До вылета 90 минут. На дорогу 50 минут, запас 30 минут. Сколько останется?"}, "outputs": {"expected": "10 минут"}, "metadata": {"case": "margin_10", "synthetic": true}}
{"inputs": {"question": "До вылета 60 минут. На дорогу 50 минут, запас 30 минут. Объясни результат."}, "outputs": {"expected": "Не хватает 20 минут"}, "metadata": {"case": "negative_margin", "synthetic": true}}
Подготовить модель для Playground
Чтение production-трасс и запуск нового модельного запроса - разные возможности. Agent уже работает через свой gateway, но Phoenix не наследует его credentials и доступ автоматически.
- 1Settings → AI Providers
- 2Состояние подключения
- 3Настройка провайдера
- Откройте Settings → AI Providers. Проверьте состояние выбранного провайдера и наличие согласованного custom provider.
- Для нашей Qwen нужен разрешённый доступ из Phoenix к существующему vLLM requester. Сам факт, что ваш Chrome авторизован через Slim Auth, не выдаёт серверу Phoenix такой доступ.
- Перед запуском попросите владельца настроить разрешённое подключение. Не переносите cookie, Signature или ключ нашего Agent в поле API Keys.
- Откройте Playground. Выбор
gpt-5.6-lunaна снимке - значение формы, а не доказательство настроенного провайдера и не модель текущего chat-agent. - После разрешённой настройки откройте параметры выбранной модели: API Type - Chat Completions, Model Name -
Qwen3.8-27B-FP8, Base URL -https://nats-proxy-vllm.gis-master.ru/v1. Согласуйте доступ до запуска, потому что наличие URL не доказывает доступ из Phoenix. - Для сопоставимости с Agent используйте temperature
0, Max Completion Tokens2048и в Extra Body{"chat_template_kwargs":{"enable_thinking":false}}. Параметры формы не применяются к production-Agent.
- 1Открыть параметры
- 2Имя модели
- 3API: Chat Completions
- 4Base URL провайдера
Проверка по коду: параметры production-запроса Qwen.
Подробнее: подключение совместимого провайдера.
Проверить один промпт в Playground
Playground помогает проверить, как модель ответит на заданный текст. Он не воспроизводит весь Agent: без отдельной интеграции здесь нет нашей истории, снимка карты, NATS, Monty и сохранения плана.
- 1System: правило ответа
- 2User: {{question}}
- 3Ввести question
- 4Run после настройки
- Убедитесь, что провайдер настроен по предыдущей главе. Откройте Playground и проверьте модель и параметры.
- В сообщении System замените учебное правило на
Отвечай по-русски. Посчитай остаток времени. Если остаток отрицательный, явно скажи, сколько минут не хватает.. - В сообщении User укажите
{{question}}. Оставьте формат Mustache: это переменная шаблона. - В блоке Inputs → question введите
До вылета 120 минут. Дорога 70 минут, запас 30 минут. Сколько останется?. - Нажмите Run. В Output проверьте, что модель получила вопрос и рассчитала 20 минут. При ошибке доступа сначала исправляется штатное подключение провайдера, а не меняется защита endpoint.
- Для следующего опыта поменяйте только question. Если хотите сравнить промпты, сохраните вход одинаковым и переходите к следующей главе.
- Кнопка запуска из production-LLM-span не восстановит отсутствующий Input. Наш safe exporter удаляет содержание, поэтому для replay нужно вручную создать разрешённый синтетический пример.
Подробнее: Playground и сравнение вариантов.
Сравнить два варианта и запустить Experiment
Сравнение имеет смысл, если вопросы одинаковые. Тогда меняем только правило ответа или модель и смотрим, улучшились ли результаты. Dataset задаёт входы, Experiment сохраняет результаты одного прогона.
- 1Добавить вариант B
- 2Выбрать Dataset
- 3Запустить выбранные варианты
- Создайте учебный Dataset по разделам "Собрать учебные случаи в Dataset" и "Импортировать готовые примеры" и настройте провайдера. Вернитесь в Playground.
- В варианте A оставьте исходное правило. Нажмите Compare, чтобы добавить вариант B. В B измените только System, например добавьте требование проверять знак результата.
- Убедитесь, что в обоих вариантах одинаковые question, модель и параметры, если сравнивается именно промпт. Если сравниваются модели, одинаковым должен остаться промпт.
- В Inputs нажмите Test over a dataset. Выберите
chat-agent-demo-arithmeticи нужную версию набора. Переменнаяquestionдолжна братьinputs.questionкаждого примера. - Перед Run проверьте число строк и выбранные варианты. Запуск создаёт модельные запросы и результаты эксперимента - это не просто открытие страницы.
- После завершения откройте Datasets & Experiments → свой Dataset → список его Experiments. Выберите завершившийся прогон; сравните ответы по одним и тем же строкам, ошибки и оценки.
- Сначала исправьте неудачные строки, затем сравните сводную оценку. Три учебных примера показывают работу процедуры, но не доказывают общее качество всего голосового агента.
Поставить автоматическую оценку
Evaluator превращает правило проверки в повторяемую оценку. Для арифметики лучше начать с точного правила, а не просить вторую модель судить первую. Но простая проверка наличия "20" легко пропустит неправильный смысл.
- 1Раздел Evaluators
- 2Code: формальная проверка
- 3LLM: оценка моделью
- 4Начать с Dataset
- Создайте Dataset и откройте его. В его разделе Evaluators нажмите Add Evaluator. Корневой пустой экран на снимке сначала предлагает View Datasets.
- Выберите тип проверки. Для строгого формата удобно Exact Match; для небольшого признака - Contains или Regex. Для содержательного ответа по-русски одного совпадения строки недостаточно.
- Задайте имя
margin_correctи сопоставьте фактический output с ответом Experiment, а reference - сoutputs.expectedпримера. Не подставляйте входной вопрос вместо ответа модели. - Для code evaluator выберите разрешённую sandbox-конфигурацию. В следующей главе показаны доступные профили; они не меняют Monty внутри нашего Agent.
- Для LLM evaluator отдельно выберите настроенного судью и задайте критерии: правильный остаток, явный дефицит при отрицательном результате, отсутствие выдуманных фактов. Это создаёт дополнительные модельные вызовы.
- Сохраните evaluator и запустите новый Experiment с выбранным критерием. В результатах проверьте не только score, но и строки с ошибками оценки и explanation, если он доступен.
- Вручную просмотрите хотя бы случаи с нулевым/отрицательным остатком. Если evaluator ошибается, исправляйте критерий; нельзя объявлять Agent правильным только по красивой средней оценке.
Подробнее: настройка server-side evaluators.
Различать песочницу Phoenix и Monty нашего Agent
В Phoenix тоже есть Monty. Но это отдельное выполнение для оценок и служебных операций Phoenix. Настройки этой страницы не меняют лимиты run_code нашего chat-agent.
- 1Settings → Sandboxes
- 2Локальные провайдеры
- 3Готовые профили
- 4Hosted требует доступа
- Откройте Settings → Sandboxes. В верхней карточке смотрите provider, язык и состояние Enabled / Authentication required.
- В нижней карточке Sandbox Configurations найдите готовый профиль нужного языка. На снимке есть
default-monty-python,default-wasm-pythonиdefault-deno-typescript. - При создании code evaluator выберите подходящую конфигурацию. Статус Enabled показывает настройку, но не заменяет успешный тест вашего evaluator.
- Для простой арифметики/JSON используйте локальную изолированную проверку. Внешний runtime, сеть и secrets для такого примера не нужны.
- Не меняйте timeout Phoenix, чтобы починить
run_codeв Agent. У Agent отдельный бюджет: Monty 10 с вычислений, 64 МиБ и общий ограниченный запрос. Для его диагностики смотрите tool-span и код chat-agent.
Подробнее: назначение sandbox-профилей.
Сохранить промпт и работать с версиями
Сохранённый промпт позволяет вернуться к точному варианту после эксперимента. Важно не путать эту библиотеку с развертыванием нашего Agent: сохранение в Phoenix не переписывает системный промпт приложения.
- 1Prompt: открыть сохранение
- 2Имя / существующий промпт
- 3Tag версии
- 4Сохранить в Phoenix
- Подготовьте вариант в Playground. Нажмите кнопку Prompt с иконкой сохранения рядом с выбором сохранённого промпта.
- В поле Prompt введите новое имя
demo-time-marginили выберите существующее, чтобы сохранить следующую версию. - В Description объясните изменение, например
Явно сообщает дефицит при отрицательном остатке. В Metadata можно хранить имя учебного набора и цель опыта. - Если нужен tag, выберите
developmentдля учебного варианта. Tags production / staging / development - указатели версий, а не команды CI/CD. - Нажмите Create Prompt. Затем откройте слева Prompts, найдите имя и проверьте сохранённую версию, сообщения и параметры.
- Для следующего изменения загрузите нужный вариант в Playground, измените правило и сохраните новую версию. Сравнивайте её на той же версии Dataset.
- Чтобы перенести удачное изменение в chat-agent, нужна отдельная правка кода/интеграции и штатная поставка. Наша текущая реализация не читает автоматически Phoenix tag production.
Подробнее: версионирование промптов.
Попросить PXI объяснить span или trace
PXI - помощник внутри Phoenix. Он может помочь прочитать цепочку и предложить направление проверки, но не заменяет доказательства в span. Это отдельный агент, а не наш агент на карте.
- 1Объяснить выбранный этап
- 2Ознакомиться с условиями
- 3Запись трасс отключена
- 4Первый вход: Acknowledge
- Откройте нужный Agent/span в Phoenix. Нажмите Ask PXI справа сверху.
- На первом открытии прочитайте сообщение о данных. Если вы решаете использовать помощника, нажмите Acknowledge. В нашем снимке запись полных session traces отключена системными настройками; не включайте её ради отладки.
- Проверьте модель и доступ: Settings → Assistant и AI Providers. Выбранный по умолчанию
claude-opus-4-6не доказывает наличие credentials. В текущей проверке запросы PXI не запускались. - После разрешённой настройки нажмите Explain this span для выбранного этапа либо Debug this span. Для общей цепочки используйте Explain this trace.
- Если открылась строка сообщения, задайте конкретный вопрос:
Разбери выбранный Agent: какие этапы самые долгие, какие ERROR видны, а каких данных не хватает для причины? Ничего не меняй.. - Сверьте ответ помощника с временем, атрибутами и business ID. Для нашего RequestStopped PXI тоже не получает скрытый текст исключения и не должен выдавать догадку за точный код причины.
- Если помощник предлагает изменение данных или настроек, сначала рассмотрите действие. Для чтения трассы такие изменения не обязательны.
- 1Settings → Assistant
- 2Права: manual approval
- 3Модель помощника
Подробнее: возможности PXI.
Чем Chat в Phoenix отличается от карты
Раздел Chat отправляет сообщения напрямую выбранной модели через провайдера Phoenix. Это быстрый способ проверить модельный ответ, но у него нет нашей бизнес-логики и инструментов карты.
- 1System prompt модели
- 2Ввести учебное сообщение
- 3Выбрать модель
- 4Отправить
- После настройки разрешённого провайдера откройте слева Chat.
- В нижнем выборе модели установите нужный провайдер/модель. Имя в пустом поле на снимке - default формы, не модель chat-agent.
- В System prompt напишите учебное правило. При необходимости задайте Temperature и Max output tokens слева.
- В нижнем поле напишите синтетический вопрос и отправьте стрелкой. Проверьте ответ и доступность модели.
- Для повторяемого сравнения переносите пример в Dataset/Playground. Страница предупреждает: разговоры этого Chat не сохраняются после выхода.
- Проверку маршрута, approval или голоса выполняйте на карте chat-agent. Отсутствие этих действий в Phoenix Chat - ожидаемая граница этого режима.
Проверить срок хранения трасс
Трасса - временная запись выполнения. История чата и сохранённые планы живут в БД приложения отдельно. Удаление старой trace не удаляет их и не означает, что запрос не выполнялся.
- 1General
- 2Версия 20.19.0
- 3Хранение: 7 дней
- Откройте Settings → General. Проверьте Hostname и Platform Version, чтобы понимать, с каким Phoenix работаете.
- Прочитайте Maximum Trace Retention in Days. В нашей настройке -
7. Здесь значение только просмотрено. - Откройте Tracing → default → Config → Data Retention. В нашем UI указана политика Default: удаляются traces старше 7 дней, расписание - воскресенье 00:00 UTC.
- Для разбора недавнего сбоя сохраните ссылку, IDs и снимок выбранного этапа. Ссылка после очистки не является долговечным архивом.
- Не увеличивайте retention самостоятельно только потому, что старый пример пропал. Владелец должен согласовать хранение и объём, а для учебника уже встроены изображения исторических случаев.
Проверка по коду: версия Phoenix, внутренняя БД, retention и OAuth ingress.
Посмотреть REST API без изменения сервиса
REST API нужен для разрешённой автоматизации чтения и оценок. Схема показывает доступные операции именно установленной версии. Цветные POST/PUT/DELETE - реальные изменения данных, а не учебные кнопки.
- 1REST API
- 2GET: описание чтения
- 3POST / PUT / DELETE меняют данные
- Нажмите слева REST API. Откроется схема Arize-Phoenix REST API.
- Раскройте нужный GET, например
/v1/annotation_configs. Прочитайте query/path parameters и формат ответа, прежде чем вызывать endpoint. - Для связи запроса с трассой пользуйтесь именами и IDs из Phoenix.
request_idприложения не является универсальным ID любого объекта REST API. - Если вам нужен только просмотр структуры, не нажимайте Try it out / Execute. Для программного чтения сначала нужен штатный доступ, согласованный для клиента; браузерная Signature не равна API credentials.
- Учтите внешний Slim Auth. В нашей конфигурации встроенная Phoenix-auth отключена за защищённым ingress, поэтому обычная инструкция Phoenix по API keys не описывает весь корпоративный доступ.
- При 401/403 или блокировке клиента остановите этот путь и используйте разрешённый UI/обратитесь к владельцу доступа. Не копируйте браузерные cookie в скрипт как обход.
Проверка по коду: граница встроенной авторизации и Slim Auth.
Сделать безопасный запрос чтения в GraphQL
GraphQL позволяет выбрать нужные поля из схемы Phoenix. Для первого знакомства достаточно запроса, который возвращает имя корневого типа. Он ничего не записывает и не раскрывает разговоры.
- 1Ввод query слева
- 2Выполнить чтение
- 3Результат справа
- 4Документация схемы
query { __typename }- Откройте слева GraphQL. На странице GraphiQL нажмите левый редактор Query.
- Нажмите Ctrl+A внутри редактора и замените содержимое выражением выше. Не вводите
mutationдля знакомства: оно может изменить данные. - Нажмите розовый треугольник либо Ctrl+Enter. Справа должен появиться JSON
{"data":{"__typename":"Query"}}. Такой результат действительно получен в этой проверке. - Чтобы изучить прикладной query, откройте Documentation Explorer слева сверху. Ищите тип Query и доступные поля текущей схемы, затем их аргументы и возвращаемые поля.
- Не придумывайте запрос по request_id, не проверив схему. Это атрибут span нашего приложения; путь фильтрации GraphQL определяется схемой Phoenix.
- Для первой отладки пользовательского запроса удобнее Spans и готовые фильтры учебника. GraphQL оставьте для разрешённой автоматизации, когда формат действительно нужен.
Зачем в Phoenix Secrets
Secrets - служебное хранилище для поддерживаемых интеграций Phoenix. Это не место для копирования Signature пользователя или credentials chat-agent при обычной отладке.
- 1Settings → Secrets
- 2Список сейчас пуст
- 3New Secret: отдельная настройка
- Откройте Settings → Secrets. Посмотрите названия записей, если они есть; для чтения trace этот раздел не нужен.
- Если evaluator или провайдер требует secret, сначала определите, кто владеет интеграцией и какой доступ ей разрешён. Новая запись не создаёт сетевой доступ сама по себе.
- Настройку выполняет владелец через штатный механизм. Не помещайте значения в заметки, Dataset, промпт, учебник или снимок экрана.
- При разборе ошибки доступа фиксируйте имя интеграции и статус, а не значение секрета. В текущем учебном пути достаточно настроить разрешённого провайдера через владельца.
Что означает MCP и почему это отдельный доступ
MCP даёт внешнему агенту возможность обращаться к операциям Phoenix. Он может облегчить поиск trace и работу с экспериментами, но подключение клиента не выполнено в рамках этого учебника.
- 1Settings → MCP
- 2Сервер включён
- 3Адрес MCP
- 4Инструкции по клиентам
- Откройте Settings → MCP. Прочитайте состояния сервера и Code mode. На снимке они enabled, URL -
https://phoenix.gis-master.ru/mcp. - Не трактуйте надпись "Authentication is disabled" как открытый публичный доступ. Она относится к встроенной авторизации Phoenix; снаружи наш домен защищает Slim Auth.
- Для подключения внешнего клиента сначала согласуйте штатный машинный доступ и область операций. Готовые команды этой страницы не проверяют совместимость с корпоративным ingress.
- После разрешённого подключения начните с чтения проекта и trace. Операции создания/редактирования/удаления datasets, prompts и annotations имеют побочные эффекты и требуют отдельного намерения.
- Code mode MCP работает с операциями Phoenix. Он не вызывает автоматически инструменты карты и не заменяет
run_codeв chat-agent. Для обычной отладки хватит Spans без установки клиента.
Подробнее: встроенный MCP Phoenix.
Получить фильтр из обычной фразы
AI Query помогает составить выражение поиска. Это отдельная функция редактора фильтра, а не новая генерация нашего Agent. Для точной диагностики безопаснее сохранять и проверять итоговое выражение.
- 1Звёздочки / настройки
- 2Модель фильтра
- 3Generative AI settings
- В Spans нажмите звёздочки Plain-English query рядом со строкой фильтра. Для выбора модели откройте соседнюю шестерёнку AI query settings.
- Прочитайте выбранную модель и состояние в её настройках. На снимке выбран Gemini Nano; это не Qwen нашего Agent. Выбор в форме не заменяет проверку доступности конвертации.
- Если функция готова и её использование разрешено, замените строку описанием, например
Show spans named chat_agent.agent with error status. Для преобразования используйте действие AI Query / указанное сочетание Ctrl+Enter. Обычный Enter применяет готовый фильтр. - Прочитайте получившееся выражение: имя должно быть
chat_agent.agent, статусERROR, а поля должны относиться к spans. Только затем применяйте фильтр. - Если конвертация недоступна или дала неверный фильтр, вставьте готовое выражение ниже и нажмите обычный Enter. Для нашей задачи помощь модели необязательна.
- Не вводите сюда текст разговора для поиска: наша production-трасса его не содержит. Формулируйте условие по имени этапа, status, session_id, request_id или длительности.
name == "chat_agent.agent" and status_code == "ERROR"
Если что-то не видно или выглядит странно
Эти ситуации встречаются раньше, чем настоящая поломка модели. Проверяем их в этом порядке, чтобы не искать ошибку в неправильном запросе или периоде.
| Что вижу | Что проверить | Что это пока не доказывает |
|---|---|---|
| Нет Agent в списке | Spans, период, полностью заменить parent_id is None фильтром Agent. | Что запрос не выполнялся. |
| По request_id лишь 3-4 строки | Открыть Agent и всё дерево его trace. SDK-child может не иметь business ID. | Что было только 3-4 действия. |
| Trace длилась почти час | Выбрать span конкретного Agent и сверить его request_id/время. | Что ответ занимал час. |
| Sessions = 0 | Использовать chat.session_id в Spans. | Что история чатов потеряна. |
| Input/Output пусто, Events 0 | Учесть safe exporter; смотреть текст в чате, безопасные атрибуты в Phoenix. | Что не было prompt, ответа или исключения. |
| OK, но ответ неверный | Проверить инструменты, карту и арифметику; поставить ручную оценку. | Что задача решена правильно. |
| RequestStopped | Проверить штатный ответ UI/Network и вложенные ERROR. | Конкретную причину: deadline, отмену или неверный tool. |
| UNSET / unknown | Посмотреть статус и kind выбранного span, а не считать слово unknown ошибкой. | Неуспешное выполнение. |
| Cost пуст / $0 | Проверить Models и match pattern, согласованную цену Qwen. | Бесплатность H100. |
| Playground 401/403 | Проверить разрешённого провайдера и доступ из Phoenix. | Что сломался production-Agent. |
| Старый пример исчез | Период, retention 7 дней и плановая очистка. Снимок в учебнике остаётся. | Что такой запрос никогда не существовал. |
| Нет внутреннего Whisper/GPU | Проверить границу экспортирующих сервисов и обратиться к владельцу voice. | Что GPU не выполнял распознавание. |
- Вернитесь к своей реплике: session_id, request_id, время и ожидаемый результат.
- Убедитесь, что рассматриваете его Agent, затем выбранную дочернюю ветку.
- Отделите подтверждённые факты от отсутствующих данных. Для неустановленной причины оставьте точное описание пробела.
- Если нужен коллега, передайте безопасную ссылку и краткую заметку по главе 16. Не снимайте защиту и не запускайте повторный production-сценарий только ради красивого trace.
Короткий маршрут от вопроса до вывода
Для ежедневной работы достаточно этого порядка. Остальные разделы нужны, когда вы переходите от разбора одного случая к оценке изменения.
- На карте отправить один учебный вопрос; сохранить время, session_id и request_id из Network, если нужен точный ключ.
- Phoenix → Tracing → default → Spans → правильный период.
- Ctrl+A в фильтре →
chat.request_id == "ВАШ_ID"→ Enter → открыть Agent. - Проверить session_id, request_id и начало выбранного Agent. Смотреть его длительность, а не всей голосовой trace.
- Пройти по его ветке: LLM → tools / run_code → map tool → итог. Для ошибки - вложенные ERROR и error.type.
- Сверить результат на карте. OK в Phoenix и правильный пользовательский ответ - разные проверки.
- Сохранить заметку/ссылку и оценку. Для сравнения изменений создать синтетический Dataset и разрешённый Experiment.
name == "chat_agent.agent" chat.request_id == "ВАШ_REQUEST_ID" chat.session_id == "ВАШ_SESSION_ID" and name == "chat_agent.agent" name == "chat_agent.agent" and status_code == "ERROR" name == "chat_agent.agent" and latency_ms > 10000 name == "execute_tool flight_get"
Два реальных случая со снимков
| Случай | Ключи | Что действительно видно |
|---|---|---|
| Успешный деморейс / расчёт | request_id = id-c6d770439429trace_id = 09827560b569665617a71cb45167f78e07.10.2026 04:51:23, GMT+3 | Agent 8,9 с; flight_get, run_code, чтения и map_show_route. Точный исходный текст не экспортирован. |
| Остановленный запрос | request_id = id-18139683b422trace_id = 15bd3a8e95843122a9953e02713f690707.10.2026 06:17:45, GMT+3 | Agent ERROR 2,4 с; RequestStopped; два gateway LLM этапа. Точная причина остановки в этом наборе атрибутов отсутствует. |
Старые живые trace могут быть удалены политикой хранения. Их снимки встроены в этот файл, поэтому учебник открывается автономно.
На чём основан учебник
Пути кнопок и состояние настроек проверены в Phoenix 20.19.0. Контракт приложения сверён с исходниками 7747c4c3. Это ссылка на проверенную версию кода, а не самостоятельное подтверждение SHA каждого работающего контейнера. Поздние изменения основного потока в этот снимок не включены.
Наш Phoenix · Карта chat-agent · Официальная документация Phoenix
Основные кодовые источники: безопасный экспорт, этапы и ошибки, ID текстового запроса, инструментирование Agent, вызов модели, размещение и защита Phoenix.