Узнайте, как пререгистрация гипотез с помощью Git и Python спасает от p-хакерства. Практический пример эксперимента с AI-агентами.
Вы когда-нибудь получали результаты эксперимента и думали: «Я так и знал»? Проблема в том, что post-hoc рационализация — это ловушка. Без пререгистрации вы можете нечаянно подогнать выводы под данные. В этой статье я покажу, как один Git-коммит спас мой эксперимент с AI-агентами от p-хакерства, и дам рабочий код на Python для пререгистрации.
Пререгистрация — это фиксация гипотезы и плана анализа до сбора данных. В академической науке для этого есть OSF, но у solo-исследователя есть Git. Я записал гипотезу прямо в заголовок скрипта до выполнения API-запросов:
"""
Пререгистрированная гипотеза: Эффект формата на глубину рассуждений
БОЛЬШЕ при выключенном GateGuard (Gate OFF).
"""
Этот код был закоммичен до запуска. git log показывает метку времени — неизменяемый след того, что я предсказал до того, как увидел данные.
Post-hoc объяснения — дешёвка. Пререгистрация превращает «неверную» гипотезу в полезный null-результат. Без неё вы можете случайно найти закономерность, которой нет.
Я провёл эксперимент 2×2: Формат (код / проза) × Ворота (вкл / выкл). 5 правил управления AI-агентом, каждое в двух форматах. 30 прогонов на условие = 600 API-вызовов. Модель: DeepSeek V4 Pro, температура=0. Оценка: детерминированный regex — никаких LLM-судей.
import re
import json
from typing import Dict, List
# Пререгистрированные правила
RULES = {
"delivery_gate": {
"code": "if not passed: reject",
"prose": "Проверь, пройдён ли шлюз. Если нет — отклони."
},
"health_check": {
"code": "if health < threshold: alert",
"prose": "Проверь состояние системы. Если оно ниже порога — предупреди."
},
"self_review": {
"code": "review() before submit",
"prose": "Перед отправкой выполни саморецензирование."
},
"fact_check": {
"code": "verify(source) before output",
"prose": "Проверь факты по источнику перед выводом."
},
"self_model_regeneration": {
"code": "regenerate() if drift > threshold",
"prose": "Если модель отклонилась от нормы, перегенерируй себя."
}
}
# Детерминированный скорринг (пререгистрирован)
SCORING_REGEX = {
"compliance": re.compile(r"(выполнено|passed|ok)", re.IGNORECASE),
"reasoning_depth": re.compile(r"(обосновано|анализ|следовательно)", re.IGNORECASE)
}
def score_response(response: str) -> Dict[str, float]:
"""Оценивает ответ по пререгистрированным критериям."""
compliance = 1.0 if SCORING_REGEX["compliance"].search(response) else 0.0
reasoning_matches = len(SCORING_REGEX["reasoning_depth"].findall(response))
reasoning_depth = min(reasoning_matches / 5.0, 1.0) # нормализация до 0..1
return {"compliance": compliance, "reasoning": reasoning_depth}
Моя пререгистрированная гипотеза предсказывала, что формат будет влиять сильнее при выключенных воротах. Данные сказали «нет»:
Эффект формата почти одинаков. Гипотеза не подтвердилась. Но это и есть ценность пререгистрации — я не могу сказать «я так и знал».
Практический вывод: если нужна compliance — используйте код+ворота (99.3%). Если глубина рассуждений — проза+ворота (3.23/5).
Я также отчитался по каждому правилу: проза помогает мета-когнитивным правилам (self_review: +1.08), но вредит точности (fact_check: −0.21). Коллега спросил: «Этот разбор по правилам был пререгистрирован?» Нет. Это post-hoc находка. Я обновил README, пометив per-rule анализ как исследовательский. Кроме того, 8% разрыв в детекции regex для fact_check может быть артефактом.
Этот обмен — пример настоящего peer review: кто-то указал на методологическую дыру, и я её публично исправил.
Я студент с одним ноутбуком и без лаборатории. Пререгистрация для меня выглядит иначе, но суть та же:
Смысл не в том, чтобы предсказать правильно. Смысл — сделать «неправильное» полезным.
Откройте свой текущий эксперимент. Напишите гипотезу в комментарии кода. Закоммитьте с меткой времени. Определите скорринг до запуска. Это займёт 10 минут, но спасёт вас от p-хакерства. Ваш будущий «я» скажет спасибо.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →