Заметки, которые никогда не были по-настоящему верными

Несколько месяцев назад заметка в моём хранилище едва не склонила меня к реальному решению. Она была убедительной. Конкретной. Прекрасно оформленной — с аккуратной маленькой таблицей и числом, красовавшимся в её центре. И число было неверным.
Неверным не потому, что кто-то солгал. Неверным потому, что это была выжимка из выжимки из выжимки, и где-то четырьмя поколениями выше по цепочке одна цифра сдвинулась — так, как сдвигается история при каждом пересказе. Когда она добралась до меня, она уже не помнила, откуда взялась. Она лежала в той же папке, набранная тем же шрифтом, с тем же спокойным авторитетом, что и банковская выписка двумя заметками правее. На её лице не было написано: я — догадка о догадке. В этом и состояла вся проблема.
Я веду то, что люди сейчас называют вторым мозгом: несколько тысяч файлов в формате Markdown — записи встреч, расшифровки, отсканированные документы, незаконченные мысли и неуклонно растущая гора всего, что ИИ когда-то резюмировал для меня. Поверх этого сидит ассистент, который по запросу извлекает нужное. И долгое время этот ассистент незаметно делал кое-что опасное: он считал каждый файл одинаково истинным.
Но они не одинаково истинны. Часть моих заметок — достоверные данные: договор, закон, удостоверение личности, сырая запись, цифра, которую я проверил у первоисточника. Часть — синтез первого уровня, написанный ИИ на основе трёх других заметок. А часть — синтез синтезов, три или четыре шага от чего-либо настоящего. ИИ-синтез может быть гладким и при этом совершенно неверным, и когда ретривер втягивает такую гладко-неверную заметку в ответ, ошибка отмывается до «факта». Уверенность — это не доказательство. Мои файлы не умели отличать одно от другого, и я тоже.
Решением стала не более умная модель. Решением стало происхождение — сделать так, чтобы каждая заметка прямо указывала, откуда она взялась и насколько она заслужила право быть принятой на веру.
Родословная каждой заметки
Каждая содержательная заметка теперь несёт в самом начале шесть строк метаданных:
- tier (уровень) — сколько шагов отделяет её от сырой реальности. Уровень 0 — первичный: оригинальный документ, договор, закон, удостоверение, сырое письмо прямо от отправителя. Уровень 1 — механическое преобразование один-к-одному из одного первичного источника: вычищенная расшифровка, отсканированный и распознанный текст. Уровень 2 — первый синтез. Уровень 3 сводит несколько источников вместе. Уровень 4 и выше — синтез синтезов. Правило предельно просто: уровень заметки на единицу выше наибольшего уровня среди тех, из которых она была создана.
- reliability (надёжность) — число от 0 до 1, полной точности, без округления до красивых десятых. Первичные источники выставляются вручную. Договор, закон, официальный документ, удостоверение, сырая запись — 1.0: документ остаётся тем, что он есть, независимо от того, правильно ли я его помню. Мой собственный рассказ из первых уст стоит чуть ниже, потому что память — не доказательство и я могу ошибаться именно в том, в чём уверен больше всего. Сырая расшифровка — 0.99: почти идеально, но микрофон может расслышать неверно. Копия с открытого веба — 0.8.
- sources (источники) — ссылки на конкретные заметки, из которых эта была выведена. Эти ссылки и есть рёбра графа доверия. Отсутствие источников означает, что заметка первичная.
- volatility (изменчивость) — static, slow или fast. Этот факт будет верен вечно или цена устареет к пятнице?
- verified (проверено) — последняя дата, когда человек действительно подтвердил утверждение. Эта одна строка, как оказалось, несёт большую часть сигнала.
- generated_by (создано) — кто или что произвело текст: я сам, модель транскрипции, конкретная языковая модель или их сочетание. Ортогонально всему остальному, потому что как написано предложение — это другой вопрос, нежели насколько оно верно.
Арифметика сомнения
Надёжность не складывается и не вычитается по мере прохождения знания через систему. Она перемножается, и размер множителя зависит от того, какой шаг был сделан.
Механическая копия ничего не теряет и сохраняет всё доверие к источнику. Добросовестный пересказ теряет почти ничего и сохраняет около 98 процентов. Полноценный первичный синтез — когда модель читает несколько заметок и делает вывод — сохраняет около 96. Сплав из нескольких источников сохраняет 95, а умозрительный прыжок, опережающий то, что источники на самом деле говорят, сохраняет около 90. Резкие падения припасены для шагов, которые действительно несут риск, а не для честных. Более ранняя версия штрафовала каждый шаг на одну и ту же фиксированную величину, и доверие рушилось слишком быстро. Привязка штрафа к типу умозаключения — вот что исправило ситуацию.
То, что остаётся неизменным, — принцип слабейшего звена, а не среднего. Синтез настолько надёжен, насколько ненадёжно самое шаткое из того, на что он опирался, потому что среднее позволило бы одному твёрдому источнику прикрыть гнилой. И поскольку каждый шаг умножает, а не вычитает, доверие скользит к нулю, никогда его не достигая, — так что даже длинная цепочка оставляет каждому звену отдельную, сопоставимую оценку вместо бессмысленного общего нуля.
Затухание — лишь половина истории, причём меньшая. Лучшая половина в том, что доверию позволено и расти. Утверждение, с которым согласны три независимых источника, — это не догадка, это почти установленный факт, и система теперь обращается с ним именно так: подтверждение поднимает достоверность заметки к уверенности, а не тянет её вниз. Хорошо подкреплённый вывод может удерживать позицию через многие шаги вместо того, чтобы угасать просто потому, что он далеко прошёл. Вот почему модель хранит два отдельных числа, а не одно. Надёжность источника — это история его происхождения. Достоверность утверждения — насколько хорошо конкретный факт подтверждён. Это разные вопросы, и они заслуживают разных ответов. А под всем этим лежит пол: наименее доверенная заметка понижается максимум вдвое, но никогда не обнуляется. Система понижает. Она не удаляет.
Летучие факты получают вторую скидку: часы свежести. Эффективная надёжность — это хранимая надёжность, умноженная на (1/2) в степени (возраст ÷ период полураспада). У цены период полураспада — 90 дней: верь ей сейчас, не доверяй к осени. У диапазона зарплат или нормативного акта — год. День рождения не затухает вообще. А под всем этим стоит одно человеческое поле, verified: дата, когда я в последний раз смотрел факту в лицо и кивал. Никакая изощрённая математика не превзойдёт свежее подтверждение человеком, и система достаточно честна, чтобы признавать это.
Оценки доверия, которые ничего не делали месяцами
Вот часть, которой я меньше всего горжусь. Долгое время все эти метаданные не давали никакого эффекта.
У каждой заметки были свой уровень, своя надёжность и честная маленькая дата verified прямо в начале, — а поисковый индекс, который на самом деле запрашивает мой ассистент, выбрасывал всё это. Он читал слова и полностью игнорировал родословную. Я выстроил сложную систему доверия и тихо подшил её под рубрику «оформление». Ретривер продолжал ранжировать заметки исключительно по тому, насколько текст совпадал с запросом, — а это именно то поведение, которое позволяет уверенному пересказу из четвёртых уст вообще оказываться на первом месте. Ярлыки были совестью, которую машина не слышала.
Исправить это было делом последних нескольких дней, и именно эта часть наконец сделала всё по-настоящему реальным. Хранилище превращается в поисковый индекс с помощью процесса под названием vault_indexer.py — частично ключевыми словами, частично смыслом. Изменение заключалось в том, чтобы перестать ранжировать только по релевантности и начать ранжировать по произведению релевантности, доверия, свежести и уровня, — с применением множителей доверия уже после того, как семантический поиск сделал своё. Каждый класс заметки теперь несёт вес: сырой лог сессии — 0.55, извлечённый урок — 0.80, запись проекта или человека — 1.00, дистиллированный навык или принцип — 1.20. Всё поведение живёт за одним переключателем, VAULT_TIER_WEIGHTS_ENABLED, — чтобы я мог его выключить и измерить, заслужил ли он своё место, вместо того чтобы доверять собственному вкусу.
Эффект мал в описании и велик в жизни. Надёжная заметка теперь опережает более красноречивую, даже когда красноречивая лучше совпадает по словам. Ретривер в реальном, переключаемом смысле научился понижать вес собственных прошлых догадок. Самое красноречивое в куче перестало побеждать по умолчанию. Самое надёжное начало побеждать вместо него.
Граф, который сам себя обслуживает
Есть ещё один элемент — тот, который не даёт всему сгнить, — и именно его я сейчас подключаю. Истина заметки актуальна ровно настолько, насколько актуальны её источники. Поэтому каждую ночь проход по рёбрам sources каждой производной заметки задаёт простой вопрос: изменился ли какой-либо источник с того дня, когда эта заметка в последний раз была проверена?
Ответ даётся хеш-суммами содержимого, а не временем модификации — потому что мои файлы постоянно синхронизируются между машинами, а синхронизация постоянно перезаписывает временны́е метки. Хеш не лжёт. Когда хеш источника изменяется позже даты verified у производной заметки, та заметка автоматически помечается устаревшей, а обратные рёбра зависимости пересчитываются скриптом — никогда мной. Граф зависимостей ведёт собственную бухгалтерию. Я только получаю уведомление, когда что-то, чему я однажды доверял, теперь стоит на сдвинувшейся почве.
Что я намеренно не строил
Самые интересные решения здесь — это отказы.
Я не храню отдельную оценку доверия по каждому измерению. Нет доверительных интервалов. Нет слияния Демпстера–Шейфера, нет EigenTrust, нет обученных весов на каждом отдельном ребре графа. Я прогонял дизайн через комиссию фоновых агентов, чья единственная работа — аргументировать в пользу большей сложности: больше сигналов, больше слияния, больше изощрённости, — и вердикт возвращался один и тот же: родословная и дата несут сигнал, а всё сверх этого — бюрократия в костюме строгости. Один равномерный коэффициент удержания. Принцип слабейшего звена. Часы свежести. Человеческая печать verified. Вот весь двигатель, и он зарабатывает каждую деталь, которую сохраняет.
Что это такое на самом деле
Если отбросить механику, то я построил базу знаний, которая знает, чего не знает. Каждая заметка может рассказать не только то, что она утверждает, но и как она пришла к этому утверждению, сколько рук прошла по дороге, как далеко отклонилась от чего-либо настоящего и не устарела ли тихо с тех пор, как кто-то последний раз проверял.
Ассистент, сидящий поверх, стал спокойнее. Он перестал путать собственное красноречие с доказательством. Когда он отвечает мне сейчас, достоверные данные говорят первыми, а уверенные догадки знают своё место.
Оказывается, самое полезное, что я когда-либо дал своему второму мозгу, — это не больше памяти.
Это сомнение.
Нужно что-то похожее для вашего бизнеса? Посмотрите, как я могу помочь →
Заберите чек-лист «AI Audit Kickoff»
Пятнадцать вопросов, которые стоит задать про свои процессы, прежде чем тратить деньги на ИИ. Тот самый первый час, с которого я начинаю настоящий аудит, одностраничным PDF. Оставьте почту и получите его сразу, плюс изредка письмо, когда напишу что-то стоящее. Без спама, отписка в один клик.