Откройте список того, что ваш ассистент о вас «помнит». Возьмите любую запись, которую вы не добавляли вручную, и попробуйте ответить на вопрос: из какого именно сообщения она выведена?
Если ответа нет, у вас не память, а слухи. Записанное утверждение выглядит одинаково убедительно независимо от того, сказали вы это сами, сказал кто-то в общем чате, или модель домыслила из обрывка. Разница есть только в том случае, если она зафиксирована рядом с записью.
#Правило, которое почти нигде не соблюдается
Никакая автоматически созданная запись памяти не должна существовать без ссылки хотя бы на одно конкретное доказательство.
Не «источник в общем виде», не «извлечено из чата», а идентификатор конкретного сообщения, его хеш и указание, кому принадлежит высказывание. Ручные записи, которые человек ввёл сам, — исключение: у них провенанс очевиден.
Формулировка звучит бюрократически, пока не посмотреть на цену её отсутствия.
#Цена отсутствия: как ошибка становится историей
1. модель извлекла факт из обрывка → «работает в компании Б»
2. факт лёг в память без ссылки на источник
3. факт подмешивается в промпт при каждом ответе
4. ассистент отвечает, опираясь на него
5. ответ сохраняется в переписку
6. следующее извлечение видит подтверждение → факт «укрепился»
└──────────────── возврат к шагу 3 ───────────────┘
Цикл замкнулся, и разорвать его нечем: чтобы проверить факт, нужно знать его источник, а источника нет. Через месяц в переписке будет десяток «подтверждений», каждое из которых — эхо первой ошибки.
Провенанс разрывает цикл на шаге 6: подтверждением считается только независимое доказательство, а не собственный прошлый ответ ассистента. Подробнее сам цикл и способы его ловить разобраны в материале про галлюцинации в памяти.
#Что именно надо записывать рядом с фактом
Чек-лист требований к одной записи. Каждый пункт закрывает конкретную ошибку, а не существует «для порядка».
- Вид источника. Личное сообщение владельца, реплика участника группового чата, распознанный текст с экрана, расшифровка речи. Разные виды имеют разную доказательную силу.
- Ссылка на конкретную запись. Идентификатор сообщения, а не название чата.
- Признак принадлежности высказывания. Сказал ли это сам человек, о котором факт, или кто-то другой.
- Хеш содержимого. Позволяет обнаружить, что исходное сообщение изменилось или удалено.
- Фрагмент текста. Короткая цитата, чтобы человек мог проверить, не открывая базу.
- Время наблюдения. Когда источник появился, а не когда факт записан.
- Число независимых подтверждений. Одно наблюдение и три из разных источников — разная уверенность.
Пункты 1 и 3 вместе решают самую неприятную задачу — атрибуцию высказывания. В групповом чате всё написанное складывается в одну ленту, и утверждение «работаю в компании Б», сказанное другим человеком, при наивном извлечении превращается в факт о вас.
#Как это реализовано в Persona
Ночной цикл консолидации памяти — единственное место, где факты создаются автоматически без участия человека, и провенанс там встроен в правила допуска, а не в оформление.
Каждое доказательство — неизменяемая запись с видом источника, ссылкой на него, признаком принадлежности владельцу, хешем содержимого, фрагментом и временем наблюдения (DreamEvidence в app/domains/memory/dream.py). Кандидат в факты несёт набор таких доказательств.
Дальше работает отдельная детерминированная политика, и в ней есть правило, которое стоит процитировать по смыслу: доказательством о владельце считается только личное сообщение владельца. Распознанный текст с экрана и расшифровка речи не атрибутированы говорящему, поэтому они могут повысить релевантность кандидата, но не могут самостоятельно создать факт о человеке. Реплика участника группового чата не считается доказательством о владельце вовсе.
Кандидат без хотя бы одного доверенного доказательства отклоняется с явной причиной missing_trusted_owner_evidence. Это не предупреждение и не понижение приоритета — это отказ.
Три следствия, которые стоит назвать честно:
- Правило снижает полноту. Часть верных фактов, видных только по экрану или по речи, в память не попадёт. Это сознательный размен: ложный факт о человеке дороже пропущенного.
- Атрибуция в групповых чатах опирается на пометку, а не на структуру данных. Сообщения из групп помечаются при сохранении, и проверка ищет эту пометку. В коде это отмечено как временное решение до появления явных полей происхождения — то есть механизм рабочий, но не идеальный.
- Ручные и «онлайновые» записи под это правило не подпадают. Факты, которые извлекаются сразу после обмена репликами в личном чате, проходят по более простому пути и не несут структурированных доказательств. Провенанс с полным набором полей есть у ночного цикла, не у всей памяти.
#Что даёт провенанс, кроме проверяемости
Прицельное удаление. Зная источник, можно удалить не только факт, но и всё, что из него выведено, — иначе удаление превращается в угадайку: вы стёрли запись, а выведенные из неё связи и сводки остались.
Осмысленное устаревание. Факт с одним старым доказательством и факт с пятью свежими стареют по-разному. Без провенанса вы можете судить только по дате записи.
Оценка доверия по источнику. Если у вас несколько каналов ввода — чат, экран, речь, интеграции, — им можно назначить разный уровень доверия. Это невозможно, если после записи все факты выглядят одинаково.
Аудит после сбоя. Когда в памяти обнаруживается ерунда, вопрос «откуда это взялось» становится решаемым: смотрите доказательства, находите источник, находите класс ошибки.
Поддержка графа связей. Ребро графа, выведенное из факта, живёт ровно пока жив факт. Если факт заменён новой версией — механика замены разобрана в материале про bi-temporal память — поддержка ребра, державшаяся только на устаревшей записи, снимается. Без цепочки «сообщение → факт → ребро» это нереализуемо; границы применимости самого графа — в сравнении графа знаний и векторного поиска.
#Как проверить свою систему
Три вопроса, которые отвечают на «есть ли у меня провенанс» лучше, чем чтение документации.
- Возьмите случайную автоматическую запись памяти и попробуйте дойти до исходного сообщения. Если интерфейс не даёт этого сделать — провенанса нет, независимо от того, что написано в описании.
- Найдите факт, выведенный из группового разговора. Проверьте, приписан ли он правильному человеку. Это самая частая и самая незаметная ошибка.
- Удалите исходное сообщение и посмотрите, что стало с фактом. Правильное поведение — факт как минимум помечается сомнительным. Если он живёт как ни в чём не бывало, связи между ними нет.
Третья проверка самая жёсткая и самая показательная.
#Частые вопросы
#Разве недостаточно даты и текста факта?
Недостаточно. Дата говорит, когда запись создана, но не на каком основании. Два факта, записанные в один день, могут иметь совершенно разную обоснованность — один из прямой фразы человека, другой из домысла по обрывку разговора.
#Не раздувает ли провенанс базу?
Ощутимо — нет. Доказательство это несколько полей и короткая цитата; на фоне самого текста памяти это единицы процентов. Дороже оно обходится не местом, а работой: цепочку надо поддерживать при каждом изменении.
#Что делать с фактами, у которых источник уже потерян?
Помечать как непроверяемые и не удалять автоматически. Такие записи есть в любой системе, дожившей до второй версии схемы. Разумная политика — показывать их человеку отдельным списком и давать подтвердить или убрать вручную.
#Можно ли доверять модели самой указывать источник?
Нет. Ссылку на источник должен проставлять код, который читал исходные данные, а не модель, которая их пересказывала. Модель охотно придумает правдоподобный идентификатор — это ровно тот класс ошибок, от которого провенанс защищает.
#Как это связано с архитектурой ассистента?
Провенанс — это требование к слою памяти, а не к модели, и он влияет на то, как устроены записи и порядок их создания. Как этот слой встроен в остальную систему, разобрано в материале про агентную архитектуру Persona и в статье о том, как работает память у ИИ.
#Обязателен ли провенанс, если память я веду вручную?
Нет: у записи, которую вы ввели сами, источник — вы, и он очевиден. Требование касается ровно того, что система записала без вашего участия, — а это и есть та часть памяти, которой вы не можете доверять по умолчанию.
#Вывод
Если ваш ассистент записывает факты о вас автоматически, требуйте от системы одного: показать, из какого сообщения взялась любая конкретная запись. Это не украшение интерфейса — это единственный способ отличить ваше знание от домысла модели и единственный способ прицельно удалить и то и другое. И держите жёсткое правило атрибуции: сказанное другим человеком не становится фактом о вас, даже если лежит в той же ленте. Полнота памяти без этого правила растёт, а доверие к ней падает — размен всегда в эту сторону.