Анализ логов нейросетью: от тысяч строк к понятной причине сбоя

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

4 мин · · автоматизация · разработка

Нейросеть для анализа логов хорошо находит закономерность в шуме, но у неё две слабые стороны: огромные объёмы и склонность выдавать правдоподобную версию вместо проверенной. Решение одно и то же для обеих: перед моделью поставить фильтр и сжатие, а после модели — проверку гипотез. Ниже рабочая схема: как свести миллион строк к нескольким тысячам токенов, что просить у модели, как проверять ответ и сколько это стоит. Тот же подход подходит и для других больших текстов: выгрузок, переписок, отчётов.

Почему нельзя просто отправить файл целиком

Логи тяжёлые. Для прикидки примем строку в 100 символов за 30 токенов (для разных логов и языков число отличается, точное значение даёт подсчёт токенов). Тогда миллион строк это 30 млн токенов: это больше контекста любой модели каталога (у большинства 1M, у Grok 256K, у GLM 128K). А если бы и помещалось, платить за вход пришлось бы за все повторяющиеся строки. К тому же на очень длинных контекстах модели могут хуже замечать детали в середине: проверьте это на своих данных.

Поэтому работаем в четыре шага.

Шаг 1. Сузьте по времени и уровню

Инцидент почти всегда имеет окно: от первого алерта до восстановления. Возьмите его с запасом и отбросьте уровни DEBUG и INFO, если нет подозрения, что причина в них.

bash
awk '$1 >= "2026-10-18T09:40" && $1 <= "2026-10-18T10:20"' app.log \
  | grep -E 'WARN|ERROR|FATAL' > window.log
wc -l window.log

Команда берёт строки за окно инцидента, уровни WARN и выше. Формат времени в awk зависит от вашего лога, подстройте под него.

Шаг 2. Свёртка по шаблонам

Тысячи одинаковых ошибок отличаются только числами, идентификаторами и адресами. Заменим переменные части маркерами и посчитаем, сколько раз встречается каждый шаблон.

bash
import re
from collections import Counter

PATTERNS = [
    (re.compile(r"\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b"), "<UUID>"),
    (re.compile(r"\b\d{1,3}(?:\.\d{1,3}){3}\b"), "<IP>"),
    (re.compile(r"\b0x[0-9a-fA-F]+\b"), "<HEX>"),
    (re.compile(r"\b\d+\b"), "<N>"),
]

def template(line: str) -> str:
    for rx, mark in PATTERNS:
        line = rx.sub(mark, line)
    return line

На выходе список из нескольких десятков шаблонов с числом повторений и номером первой строки. Это основная часть будущего запроса. Хронология важна не меньше частоты, поэтому номер первой строки сохраняем: шаблон, который появился первым, часто и есть причина, а лавина последующих это следствие.

Шаг 3. Добавьте контекст вокруг первой ошибки

Шаблоны теряют детали. Добавьте к ним небольшой «сырой» фрагмент вокруг самой ранней ошибки, например 30 строк до и 10 после, а также трассировку стека, если она есть. Секреты (токены, пароли, адреса клиентов) вычистите до отправки.

Шаг 4. Запрос: гипотезы с доказательствами

Просите не «найди причину», а структурированный ответ, где каждая гипотеза привязана к строкам.

bash
from openai import OpenAI

client = OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_ваш_ключ")

templates = open("templates.txt", encoding="utf-8").read()
raw = open("first_error_context.txt", encoding="utf-8").read()

prompt = f"""Ниже сводка логов за окно инцидента и сырой фрагмент у первой ошибки.
Сводка: шаблон строки, число повторений, номер первой строки.

СВОДКА:
{templates}

ФРАГМЕНТ:

Требование «какую команду выполнить для проверки» превращает ответ из версии в план проверки. Документация по клиенту: Python SDK.

Проверка гипотез

Ответ модели это набор гипотез, а не диагноз. Для каждой выполните проверку из ответа: посмотрите метрики и деплои в то же окно, найдите в исходных логах строки, на которые ссылается модель, воспроизведите ошибку на стенде. Если модель называет номер строки или имя функции, найдите их сами: выдуманные детали встречаются. Только после этого меняйте систему. Для сложных случаев можно продолжить диалог, показав результаты проверок, и попросить обновить гипотезы.

Сколько стоит

Допустим, в окне 200 000 строк, а после свёртки и контекста остаётся 15 000 токенов входа; ответ модели 1 500 токенов. Формула без кэша: вход × цена входа + выход × цена выхода. Цены на 18 октября 2026, $ за 1M токенов:

  • claude-sonnet-5-5 (0,4 / 2): 0,015 × 0,4 + 0,0015 × 2 = 0,006 + 0,003 = $0,009.
  • claude-opus-5-5 (0,8 / 4): 0,015 × 0,8 + 0,0015 × 4 = 0,012 + 0,006 = $0,018.
  • deepseek-v4.1-flash (0,013 / 0,038): 0,015 × 0,013 + 0,0015 × 0,038 = 0,000195 + 0,000057 = $0,000252.

Для сравнения, 200 000 строк без свёртки (при условных 30 токенах на строку это 6 млн токенов) не поместятся в контекст ни одной модели каталога, а по цене входа Sonnet 5.5 дали бы 6 × 0,4 = $2,4 за один запрос, и это без выхода. Свёртка делает анализ и возможным, и дешёвым. Актуальные цены: GET https://api.zukko.pro/v1/models; заранее проверить размер запроса можно через POST /v1/messages/count_tokens.

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

Подключение

Скрипты выше работают с любым OpenAI-совместимым клиентом: создайте ключ в кабинете, укажите base URL https://api.zukko.pro/v1. Пополнить баланс можно через СБП, картой MasterCard или криптовалютой. Если пользуетесь не Python, смотрите страницу Chat Completions.

Частые вопросы

Можно ли отправлять модели продакшн-логи?

Только после вычистки секретов и персональных данных и с учётом политики вашей компании. Автоматически вычищайте токены, e-mail, номера телефонов, а вручную просматривайте итоговый запрос.

Нейросеть для анализа больших текстов поймёт любой формат лога?

Для типовых форматов (текстовые строки, JSON-lines) да. Для экзотического формата дайте в запросе одну-две примерные строки с пояснением, что означает каждое поле.

Почему модель назвала причину, которая оказалась неверной?

Модель выдаёт самое правдоподобное объяснение по данным, которые вы показали. Если данных мало, версия может быть неверной. Поэтому просите гипотезы с проверкой и указанием недостающих данных.

Какую модель брать?

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

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.