0Pricing
AI Agents · Урок

Журналирование вызовов инструментов и входов/выходов

Узнайте, что фиксировать на каждом шаге: имя инструмента, аргументы входа, вывод, задержку, ошибку и идентификатор родительского интервала.

«Журналирование вызовов инструментов и входов/выходов» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

Что записывать для каждого шага

Для каждого span фиксируйте:

  • Название шага (вызов LLM, вызов инструмента, извлечение)
  • Входные данные (сообщения, аргументы инструмента, запрос)
  • Выходные данные (ответ, результат инструмента)
  • Метаданные (модель, задержка, количество токенов, стоимость)
  • Сведения об ошибке при сбое

Вспомогательная функция span, написанная вручную

Без использования платформы минимальная вспомогательная функция:

from contextlib import contextmanager
import time, uuid

@contextmanager
def span(name, trace_id, parent_id=None):
    span_id = str(uuid.uuid4())
    start = time.time()
    record = {'trace_id': trace_id, 'span_id': span_id, 'parent_id': parent_id, 'name': name, 'start': start}
    try:
        yield record
    except Exception as e:
        record['error'] = str(e)
        raise
    finally:
        record['duration_ms'] = (time.time() - start) * 1000
        save_span(record)

Using It

trace_id = str(uuid.uuid4())
with span('llm_call_planner', trace_id) as s:
    s['model'] = 'gpt-4o-mini'
    s['messages_in'] = messages
    response = client.chat.completions.create(model='gpt-4o-mini', messages=messages)
    s['response'] = response.choices[0].message.content
    s['tokens_in'] = response.usage.prompt_tokens
    s['tokens_out'] = response.usage.completion_tokens

Вложенность span

Передавайте идентификатор родительского элемента, чтобы span образовали дерево:

with span('agent_step', trace_id) as parent:
    with span('llm_call', trace_id, parent_id=parent['span_id']):
        ...
    with span('tool_call:search', trace_id, parent_id=parent['span_id']):
        ...

Запись вызовов инструментов

В частности, для вызовов инструментов записывайте:

  • Название инструмента
  • Аргументы (JSON)
  • Результат (JSON, возможно усечённый)
  • Задержка
  • Ошибка (если есть)

Усечение больших полезных нагрузок

Некоторые результаты инструментов огромны (HTML размером 200 КБ). Усеките их перед сохранением:

def safe_payload(obj, max_chars=8000):
    s = json.dumps(obj)
    return s if len(s) <= max_chars else s[:max_chars] + '...[truncated]'

Удаление PII

Удаляйте персональные данные перед сохранением:

import re
EMAIL_RE = re.compile(r'[\w\.-]+@[\w\.-]+')

def redact(text):
    return EMAIL_RE.sub('[email]', text)

print(redact("Contact me at alice@example.com for details."))

Структурированный вывод журналов

Формируйте одну запись JSON для каждого span — направляйте её в ELK, Loki, Datadog или BigQuery:

import json
import sys

def save_span(record):
    print(json.dumps(record), file=sys.stderr, flush=True)

demo_record = {'span': 'call_llm', 'duration_ms': 120, 'ok': True}
save_span(demo_record)
print("Logged span:", json.dumps(demo_record))

Связывайте с пользовательскими сеансами

Включайте session_id и user_id в каждый span, чтобы позже фильтровать трассировки по пользователю.

Сэмплирование

Для агентов с большим объёмом запросов используйте сэмплирование:

import random

def should_trace(user_id):
    return random.random() < 0.10  # 10% of traces
# Always trace errors and slow runs.

random.seed(42)
sampled = sum(should_trace(i) for i in range(1000))
print(f"Traced {sampled} out of 1000 calls (~10% target)")

Повторный запуск по трассировкам

Сохраняйте полные входные данные (сообщения, инструменты, аргументы), чтобы повторно запускать trace с новым промптом и проверять улучшения. Это основа разработки на основе оценивания.

Обрезать большие данные?

Зачем обрезать большие результаты работы инструментов в журналах?

Повторим

Каждый шаг, каждый вход, каждый выход — структурированные, вложенные и отобранные. Это сырьё для всего остального в наблюдаемости.

Часто задаваемые вопросы

Урок «Журналирование вызовов инструментов и входов/выходов» бесплатный?

Да — полный текст урока «Журналирование вызовов инструментов и входов/выходов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Журналирование вызовов инструментов и входов/выходов»?

Узнайте, что фиксировать на каждом шаге: имя инструмента, аргументы входа, вывод, задержку, ошибку и идентификатор родительского интервала. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Журналирование вызовов инструментов и входов/выходов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем агентам трассировка
  2. Журналирование вызовов инструментов и входов/выходов
  3. Задержка и стоимость каждого шага
  4. Визуализация запусков агентов (Langfuse, LangSmith)
← Назад к AI Agents