Память

Провенанс памяти: откуда ассистент знает то, что знает

Любой автоматически записанный факт обязан ссылаться хотя бы на одно доказательство — иначе ошибка извлечения становится вашей историей. Разбираем цепочку доказательств и чек-лист требований к записи.

Откройте список того, что ваш ассистент о вас «помнит». Возьмите любую запись, которую вы не добавляли вручную, и попробуйте ответить на вопрос: из какого именно сообщения она выведена?

Если ответа нет, у вас не память, а слухи. Записанное утверждение выглядит одинаково убедительно независимо от того, сказали вы это сами, сказал кто-то в общем чате, или модель домыслила из обрывка. Разница есть только в том случае, если она зафиксирована рядом с записью.

#Правило, которое почти нигде не соблюдается

Никакая автоматически созданная запись памяти не должна существовать без ссылки хотя бы на одно конкретное доказательство.

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

Формулировка звучит бюрократически, пока не посмотреть на цену её отсутствия.

#Цена отсутствия: как ошибка становится историей

1. модель извлекла факт из обрывка          → «работает в компании Б»
2. факт лёг в память без ссылки на источник
3. факт подмешивается в промпт при каждом ответе
4. ассистент отвечает, опираясь на него
5. ответ сохраняется в переписку
6. следующее извлечение видит подтверждение → факт «укрепился»
   └──────────────── возврат к шагу 3 ───────────────┘

Цикл замкнулся, и разорвать его нечем: чтобы проверить факт, нужно знать его источник, а источника нет. Через месяц в переписке будет десяток «подтверждений», каждое из которых — эхо первой ошибки.

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

#Что именно надо записывать рядом с фактом

Чек-лист требований к одной записи. Каждый пункт закрывает конкретную ошибку, а не существует «для порядка».

  1. Вид источника. Личное сообщение владельца, реплика участника группового чата, распознанный текст с экрана, расшифровка речи. Разные виды имеют разную доказательную силу.
  2. Ссылка на конкретную запись. Идентификатор сообщения, а не название чата.
  3. Признак принадлежности высказывания. Сказал ли это сам человек, о котором факт, или кто-то другой.
  4. Хеш содержимого. Позволяет обнаружить, что исходное сообщение изменилось или удалено.
  5. Фрагмент текста. Короткая цитата, чтобы человек мог проверить, не открывая базу.
  6. Время наблюдения. Когда источник появился, а не когда факт записан.
  7. Число независимых подтверждений. Одно наблюдение и три из разных источников — разная уверенность.

Пункты 1 и 3 вместе решают самую неприятную задачу — атрибуцию высказывания. В групповом чате всё написанное складывается в одну ленту, и утверждение «работаю в компании Б», сказанное другим человеком, при наивном извлечении превращается в факт о вас.

#Как это реализовано в Persona

Ночной цикл консолидации памяти — единственное место, где факты создаются автоматически без участия человека, и провенанс там встроен в правила допуска, а не в оформление.

Каждое доказательство — неизменяемая запись с видом источника, ссылкой на него, признаком принадлежности владельцу, хешем содержимого, фрагментом и временем наблюдения (DreamEvidence в app/domains/memory/dream.py). Кандидат в факты несёт набор таких доказательств.

Дальше работает отдельная детерминированная политика, и в ней есть правило, которое стоит процитировать по смыслу: доказательством о владельце считается только личное сообщение владельца. Распознанный текст с экрана и расшифровка речи не атрибутированы говорящему, поэтому они могут повысить релевантность кандидата, но не могут самостоятельно создать факт о человеке. Реплика участника группового чата не считается доказательством о владельце вовсе.

Кандидат без хотя бы одного доверенного доказательства отклоняется с явной причиной missing_trusted_owner_evidence. Это не предупреждение и не понижение приоритета — это отказ.

Три следствия, которые стоит назвать честно:

  • Правило снижает полноту. Часть верных фактов, видных только по экрану или по речи, в память не попадёт. Это сознательный размен: ложный факт о человеке дороже пропущенного.
  • Атрибуция в групповых чатах опирается на пометку, а не на структуру данных. Сообщения из групп помечаются при сохранении, и проверка ищет эту пометку. В коде это отмечено как временное решение до появления явных полей происхождения — то есть механизм рабочий, но не идеальный.
  • Ручные и «онлайновые» записи под это правило не подпадают. Факты, которые извлекаются сразу после обмена репликами в личном чате, проходят по более простому пути и не несут структурированных доказательств. Провенанс с полным набором полей есть у ночного цикла, не у всей памяти.

#Что даёт провенанс, кроме проверяемости

Прицельное удаление. Зная источник, можно удалить не только факт, но и всё, что из него выведено, — иначе удаление превращается в угадайку: вы стёрли запись, а выведенные из неё связи и сводки остались.

Осмысленное устаревание. Факт с одним старым доказательством и факт с пятью свежими стареют по-разному. Без провенанса вы можете судить только по дате записи.

Оценка доверия по источнику. Если у вас несколько каналов ввода — чат, экран, речь, интеграции, — им можно назначить разный уровень доверия. Это невозможно, если после записи все факты выглядят одинаково.

Аудит после сбоя. Когда в памяти обнаруживается ерунда, вопрос «откуда это взялось» становится решаемым: смотрите доказательства, находите источник, находите класс ошибки.

Поддержка графа связей. Ребро графа, выведенное из факта, живёт ровно пока жив факт. Если факт заменён новой версией — механика замены разобрана в материале про bi-temporal память — поддержка ребра, державшаяся только на устаревшей записи, снимается. Без цепочки «сообщение → факт → ребро» это нереализуемо; границы применимости самого графа — в сравнении графа знаний и векторного поиска.

#Как проверить свою систему

Три вопроса, которые отвечают на «есть ли у меня провенанс» лучше, чем чтение документации.

  1. Возьмите случайную автоматическую запись памяти и попробуйте дойти до исходного сообщения. Если интерфейс не даёт этого сделать — провенанса нет, независимо от того, что написано в описании.
  2. Найдите факт, выведенный из группового разговора. Проверьте, приписан ли он правильному человеку. Это самая частая и самая незаметная ошибка.
  3. Удалите исходное сообщение и посмотрите, что стало с фактом. Правильное поведение — факт как минимум помечается сомнительным. Если он живёт как ни в чём не бывало, связи между ними нет.

Третья проверка самая жёсткая и самая показательная.

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

#Разве недостаточно даты и текста факта?

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

#Не раздувает ли провенанс базу?

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

#Что делать с фактами, у которых источник уже потерян?

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

#Можно ли доверять модели самой указывать источник?

Нет. Ссылку на источник должен проставлять код, который читал исходные данные, а не модель, которая их пересказывала. Модель охотно придумает правдоподобный идентификатор — это ровно тот класс ошибок, от которого провенанс защищает.

#Как это связано с архитектурой ассистента?

Провенанс — это требование к слою памяти, а не к модели, и он влияет на то, как устроены записи и порядок их создания. Как этот слой встроен в остальную систему, разобрано в материале про агентную архитектуру Persona и в статье о том, как работает память у ИИ.

#Обязателен ли провенанс, если память я веду вручную?

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

#Вывод

Если ваш ассистент записывает факты о вас автоматически, требуйте от системы одного: показать, из какого сообщения взялась любая конкретная запись. Это не украшение интерфейса — это единственный способ отличить ваше знание от домысла модели и единственный способ прицельно удалить и то и другое. И держите жёсткое правило атрибуции: сказанное другим человеком не становится фактом о вас, даже если лежит в той же ленте. Полнота памяти без этого правила растёт, а доверие к ней падает — размен всегда в эту сторону.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт