Практическое использование нейросети DeepSeek в решении сложных задач анализа производительности СУБД PostgreSQL
Оригинал — на основном техническом канале (Возможны правки и дополнения).
Практика применения больших языковых моделей в анализе производительности PostgreSQL
Аннотация
Рассматривается опыт применения большой языковой модели DeepSeek в проекте pg_expecto/markov_chain — системе прогнозирования инцидентов производительности СУБД PostgreSQL на основе адаптивной цепи Маркова (версия 26.2.1). Нейросеть использовалась для генерации и рефакторинга PL/pgSQL-кода, формулировки проверяемых гипотез и интерпретации результатов экспериментов. Описаны конкретные задачи, решённые при участии DeepSeek: устранение ошибок типизации (замена REAL на DOUBLE PRECISION в функциях прогноза риска), восстановление пропущенных исторических записей в profile_comparison_log, диагностика систематической ошибки в классификаторе непокрытых инцидентов. Приведены количественные оценки: объём кода превышает 10 000 строк, число итераций для ключевых функций достигает 10, ускорение разработки оценивается в 4–6 раз. Обсуждается модель разделения труда, при которой DBA выполняет роль архитектора и критика, а DeepSeek — высокопроизводительного исполнителя для задач, требующих удержания в контексте сотен строк кода и анализа больших массивов текстовых отчётов.
Ключевые слова: PostgreSQL, цепь Маркова, прогнозирование инцидентов, большие языковые модели, DeepSeek, PL/pgSQL, калибровка вероятностей, анализ производительности.
1. Введение
Задачи анализа производительности СУБД традиционно решаются экспертами-администраторами (DBA) на основе эвристик и интуиции, что затрудняет воспроизводимость результатов и объективную оценку рисков. Проект pg_expecto/markov_chain, развиваемый в открытом репозитории на платформе GitHub, ставит целью формализацию этих задач в терминах вероятностной модели — дискретной цепи Маркова с 189 состояниями, каждое из которых определяется комбинацией корреляции «скорость–ожидания» и знаков трендов этих метрик. Модель обучается в потоковом режиме, ежесекундно обновляя матрицу переходов, и использует механизм адаптивного забывания для учёта нестационарности нагрузки.
Построение подобной системы сопряжено с рядом нетривиальных проблем, выходящих за рамки классической теории цепей Маркова: обеспечение воспроизводимости экспериментов, интерпретация калибровочных кривых, согласование исторических и онлайн-данных, выбор гиперпараметров. Настоящая работа обобщает опыт решения этих проблем с привлечением нейросети DeepSeek, которая выполняла функции генератора кода, поставщика гипотез и аналитика экспериментальных данных. Цель статьи — описать конкретные механизмы взаимодействия DBA и нейросети, оценить эффективность такого симбиоза и сформулировать условия, при которых использование больших языковых моделей в задачах подобного класса даёт значимый эффект.
2. Материалы и методы
2.1. Архитектура системы
К версии 26.2.1 система включает более 80 хранимых функций и процедур на языке PL/pgSQL, организованных в несколько слоёв. Ядро цепи Маркова образуют функции mchain_train_step() (поминутное обучение), update_markov_probabilities() (пересчёт матрицы вероятностей) и mchain_predict_risk_k_v2() (многошаговый прогноз риска). Пространство состояний формируется дискретизацией корреляции (21 уровень от −1.0 до +1.0 с шагом 0.1) и трендов операционной скорости и времени ожиданий (по три уровня), что даёт 189 состояний.
Профилирование нагрузки реализовано через функции calculate_profile_metrics(), compare_profiles_at() и histogram_divergence(). Сравнение текущего окна (обычно 60 минут) с эталонным безынцидентным окном позволяет вычислять JS-дивергенцию гистограмм состояний и присваивать статусы NORMAL, WARNING или CRITICAL. Сигналы предупреждения SICPP и C-only, реализованные в функциях sicpp_calculate_at() и mchain_hybrid_alert_at() соответственно, используют пороги по JS-дивергенции, перцентилю риска (p90) и взвешенной оценке W-score. С версии 26.1.1 введена калибровка вероятностей: сырой риск, выдаваемый цепью Маркова, может быть откалиброван с помощью изотонической регрессии или масштабирования Платта; калибровочная карта хранится в таблице mchain_calibration_map.
2.2. Организация взаимодействия с DeepSeek
Работа с нейросетью строилась по итеративной схеме. DBA формулировал задачу (например, «необходимо выявить причины, по которым часть инцидентов не покрывается сигналом SICPP»), после чего DeepSeek анализировал соответствующие фрагменты кода и данные, предлагал гипотезы и генерировал код для их проверки. Результаты экспериментов (отчёты, логи, метрики) возвращались в диалог для интерпретации. Финальное решение о внедрении изменений принимал DBA. Такая схема позволяла сочетать скорость генерации кода и анализа данных, присущую нейросети, с критической оценкой и предметной экспертизой человека.
3. Результаты
3.1. Разработка исходного кода
Значительная часть PL/pgSQL-кода проекта была создана при участии DeepSeek. Нейросеть генерировала начальные версии сложных хранимых функций объёмом в несколько сотен строк, включая mchain_train_step(), compare_profiles_at(), historical_fill_sicpp() и generate_incident_forecast_report_v2(). В комментариях к функциям сохранились следы итеративной работы: для compare_profiles_at зафиксированы версии v4, v5 и v5-fix1, где v5 содержала критическую ошибку (секции вычисления метрик были заменены заглушкой), а v5-fix1 восстанавливала их. Подобная детализация изменений характерна для кода, прошедшего через несколько циклов генерации и верификации.
Отдельного внимания заслуживает исправление ошибок типизации. В функциях прогноза риска mchain_predict_risk_k_v2() и её варианте с матрицей использование типа REAL для вектора состояний приводило к «антипереполнению» при умножении малых вероятностей. DeepSeek, проанализировав сообщения об ошибках, предложил заменить REAL на DOUBLE PRECISION на всём протяжении вычислений, оставив приведение к REAL только на выходе. Это исправление, задокументированное в комментариях к функциям, позволило повысить точность прогнозов и избежать молчаливого искажения метрик. Аналогичное исправление было перенесено в mchain_predict_risk_k_v2_with_matrix() (версия 17.1.3). Кроме того, в функции evaluate_forgetting_params() зафиксирован переход с сигнатуры REAL на NUMERIC, чтобы вызовы с числовыми литералами не приводили к ошибке «функция не существует».
Целый пласт кода — функции profile_comparison_completeness_report(), diagnose_incidents_without_prior_comparison(), diagnose_profile_comparison_duplicates(), deduplicate_profile_comparison_log() и verify_profile_comparison_dedup() — был написан для решения проблемы рассинхронизации исторических и онлайн-записей в profile_comparison_log. DeepSeek не только сгенерировал код этих функций, но и предложил стратегию идемпотентного дозаполнения с параметром p_skip_existing, что позволило устранить пропуски в данных без перезаписи исторических сигналов.
3.2. Генерация гипотез
Одной из ключевых ролей DeepSeek было порождение гипотез — предложений о том, какие параметры изменить и какие архитектурные решения опробовать. Функция evaluate_forgetting_params() и таблица forgetting_optimization_log предназначены для эмпирического подбора параметров адаптивного забывания (base_alpha, incident_half_life_days, min_alpha, interval_minute). DeepSeek предлагал сетки значений для перебора, а затем анализировал результаты, сохраняемые в лог. В комментариях к функции зафиксировано, что версия 17.1.3 устранила дубликат REAL-сигнатуры, который приводил к вызову не той перегрузки — это пример гипотезы о причине расхождения результатов, которая была проверена и подтверждена.
В конфигурационной таблице incident_forecast_config присутствуют поля hybrid_js_min_threshold, hybrid_p90_min_threshold, hybrid_w_score_min_threshold, а также параметры автоматической настройки (auto_threshold, c_auto_threshold). DeepSeek участвовал в анализе того, какие значения этих порогов обеспечивают наилучший баланс между полнотой и точностью. В комментариях к generate_incident_forecast_report_v2() отмечено, что условие A (PreAlertAdv) было исключено как шумовое (precision 5.9%, recall 17.1%), а условие B не дало уникального вклада — эти выводы были получены в результате серии экспериментов, гипотезы для которых формулировались совместно.
Проблема дублей в profile_comparison_log (одна и та же логическая минута могла быть записана с микросекундами из онлайн-функции и с обнулёнными секундами из исторической) была выявлена при анализе отчётов. DeepSeek предложил разделить метрики на total_rows, recorded_minutes и extra_rows, а также создать функцию diagnose_profile_comparison_duplicates() для детализации. Это позволило не просто констатировать наличие дублей, но и количественно оценить масштаб проблемы и предложить алгоритм дедупликации с сохранением наиболее информативных записей.
3.3. Анализ результатов экспериментов
Третий крупный блок задач — анализ экспериментальных данных. Нейросеть обрабатывала отчёты, содержащие тысячи строк, и выделяла закономерности, которые было бы затруднительно обнаружить вручную. С версии 26.1.1 в системе появились метрики ECE (Expected Calibration Error) и MCE (Maximum Calibration Error). DeepSeek помог сгенерировать код для их расчёта и сформулировать критерии вердикта в функции mchain_calibration_health_report(): GREEN (Brier ≤ raw, ECE ≤ 0.10, MCE для бинов с n ≥ 10 ≤ 0.25), YELLOW (пограничная зона), RED (деградация). В отчёте generate_incident_forecast_report_v2() появилась секция «Качество прогнозов: raw vs calibrated», где для каждой метрики выводится относительное изменение — это позволяет быстро оценить, приносит ли калибровка пользу.
В функции generate_incident_forecast_report_v2() (версия 21.6.6) присутствует секция диагностики C по непокрытым инцидентам, которая классифицирует каждый непокрытый инцидент по причине: in_prev_incident, in_recovery, profile_incident или threshold_fail. DeepSeek участвовал в анализе распределения этих причин и выявлении того, что многие инциденты ошибочно классифицировались как in_incident из-за самодетекции (функция is_ts_inside_incident() для самого инцидента всегда возвращает TRUE). Исправление (проверка пересечения с другим инцидентом, pi2.id <> b.id) было предложено и реализовано в версии 21.6.6. Это пример того, как нейросеть, проанализировав логику классификатора, обнаружила систематическую ошибку и предложила её устранить.
В отчётах generate_incident_forecast_report_v2() присутствуют секции распределения инцидентов по часам и дням недели. DeepSeek использовал эти данные для формулировки гипотез о сезонности нагрузки и о том, какие временные интервалы требуют более агрессивной настройки порогов. Окончательные решения принимались DBA, однако нейросеть обеспечивала первичную фильтрацию и визуализацию, которая ложилась в основу для дальнейшего анализа.
4. Обсуждение
4.1. Модель разделения труда
Опыт проекта подтверждает модель, при которой DeepSeek берёт на себя «черновую» работу, а DBA выполняет стратегические функции. Роль DBA включает постановку целей и ограничений (например, «горизонт прогноза не должен превышать 120 минут», «порог риска для critical_states не увеличивать выше 0.10 без пересмотра эмпирической модели»), критическую оценку гипотез, предложенных нейросетью, принятие финальных решений о внедрении изменений и формулировку «прорывных» идей, которые затем формализовывались с помощью DeepSeek. Роль DeepSeek включает генерацию и рефакторинг SQL-кода объёмом до нескольких сотен строк, анализ экспериментальных данных и подготовку отчётов, выявление скрытых зависимостей и аномалий в логах, документирование кода и ведение истории изменений, а также предложение альтернативных архитектурных решений.
4.2. Оценка эффективности
Количественно оценить вклад DeepSeek можно по следующим показателям. Объём кода превышает 10 000 строк PL/pgSQL, включая определения таблиц, функций, процедур и комментариев. Число итераций развития ключевых функций (судя по комментариям) составляет от 3 до 10, при этом каждая итерация включала генерацию или рефакторинг кода объёмом до нескольких сотен строк. Скорость выполнения этих операций с DeepSeek была в 4–6 раз выше, чем при ручной работе. Качественно нейросеть обеспечила непрерывность документирования (комментарии к каждой версии) и систематичность анализа (регулярные отчёты с фиксированной структурой), что снизило риск потери знаний при переходе между версиями.
По состоянию на версию 26.2.1 достигнуты следующие результаты. Покрытие инцидентов сигналом SICPP составляет 74.6% (50 из 67 инцидентов в тестовом периоде), при этом медианное время упреждения находится в диапазоне 15–60 минут. Качество прогнозов после калибровки: Brier score снижен до 0.0361, ECE (калиброванное) составляет 0.0062, что свидетельствует о высокой надёжности вероятностных оценок. Устранены критические пробелы в исторических данных (патч 26.2.1), что позволило корректно диагностировать причины непокрытия инцидентов и повысить доверие к отчётам.
4.3. Ограничения
Предлагаемый подход имеет ограничения. Во-первых, эффективность DeepSeek существенно зависит от качества постановки задачи: расплывчатые формулировки приводят к генерации нерелевантного кода. Во-вторых, нейросеть склонна к «галлюцинациям» — генерации синтаксически корректных, но семантически неверных конструкций, что требует обязательной верификации человеком. В-третьих, длинные диалоги с нейросетью могут терять контекст, что приводит к повторам и противоречиям. Эти ограничения компенсируются итеративной схемой работы и критической оценкой со стороны DBA.
5. Заключение
Опыт проекта pg_expecto/markov_chain демонстрирует, что синергия DBA и DeepSeek позволяет решать задачи, которые были бы неподъёмны для одного человека в разумные сроки. Нейросеть не заменяет эксперта, а многократно усиливает его возможности, беря на себя рутину и предоставляя материал для критического анализа. Дальнейшее развитие модели связано с автоматизацией выбора гиперпараметров (адаптивное забывание, пороги SICPP и C-only) и расширением набора сигналов предупреждения. Представляется, что описанная модель разделения труда применима не только к анализу производительности СУБД, но и к другим задачам, требующим сочетания предметной экспертизы и масштабной генерации кода.















