Как на самом деле работает постоянная память ИИ
«ИИ меня помнит» — фраза, которая многое скрывает. В модели ничего не изменилось. Что-то перед ней научилось хорошо доставать.
Веса модели заморожены. Разговор с ней ничему её не учит, а закрытие вкладки не заставляет её забыть — этому воспоминанию просто некуда было деться. То, что вы переживаете как ассистента, который вас помнит, устроено куда прозаичнее: текст был где-то сохранён, и перед тем как модель ответила, программа пошла, нашла релевантные куски и вставила их перед ней.
В этом весь фокус. Но качество памяти ИИ почти целиком равно качеству шага поиска, и именно здесь продукты этой категории различаются радикально, описывая себя совершенно одинаково.
Контекстное окно — это не память
Их постоянно путают, поэтому: контекстное окно — это рабочий стол модели. Всё, что она может учесть прямо сейчас, на этом ходу. В нынешних моделях оно большое, и между разговорами оно стирается полностью.
Память — это хранилище, которое переживает разговор. Связь между ними в том, что память *питает* окно — выборочно.
И она обязана быть выборочной, потому что наивная альтернатива проваливается и по стоимости, и по точности. Если бы у вас был год заметок и вы сваливали бы их все на каждом ходу, вы платили бы за эти токены в каждом сообщении, а модель работала бы хуже, а не лучше: релевантная деталь, погребённая под сотней страниц нерелевантных, разбавляется. Поиск существует потому, что меньше, но хорошо выбранное, лучше, чем больше.
Хранение: часть, которая кажется тривиальной и не является ею
В момент записи принимаются два решения, и оба преследуют вас потом.
Что сохранять. Сохранять целые стенограммы дёшево и почти бесполезно: вы в итоге ищете в стоге сена, который сами же и построили. Сохранять дистиллированные факты гораздо удобнее для поиска, но требует суждения о том, что было важно, а любое автоматическое извлечение иногда выбросит именно то, что вам было дорого. Большинство продуктов располагаются где-то на этой шкале, и их положение предсказывает ощущение через полгода лучше, чем любой список функций.
Как это резать. Текст попадает внутрь кусками (чанками), и чанк — это единица, которая извлекается. Слишком крупный — и попадание тянет за собой три несвязанные темы. Слишком мелкий — и фраза возвращается без контекста, который делал её осмысленной. Правильного ответа нет, есть только настроенный.
Поиск: эмбеддинги и их слепое пятно
Вторая модель — модель эмбеддингов, не та, с которой вы общаетесь, — превращает каждый чанк в вектор из нескольких сотен или нескольких тысяч чисел. Тексты близкого смысла оказываются рядом друг с другом. Ваш вопрос проходит ту же обработку, и поиск становится геометрией: вернуть ближайшие чанки.
Сделанное исчерпывающе, это медленно, поэтому реальные системы используют приближённый индекс — HNSW самый распространённый, навигируемый граф, который добирается до хорошего ответа, не посещая каждую точку. Он меняет небольшую часть полноты на порядки скорости, а в pgvector это индекс в одну строку.
Вот слепое пятно, о котором никто не упоминает в презентации. Семантический поиск *только* семантический. Спросите точный номер счёта, фамилию, версию библиотеки, имя переменной — случай, когда вы знаете точную строку, — и векторное сходство охотно выдаст вам пять вещей *про* эту тему, но не ту, что содержит строку.
Поэтому индекс по ключевым словам, BM25 или полнотекстовый поиск базы данных, — это не устаревший подход, который вытеснили векторы. Это та половина, в которой векторы плохи.
Гибридный поиск и реранкинг
Серьёзный пайплайн поиска запускает оба поиска и объединяет их. Стандартное объединение — reciprocal rank fusion: каждый результат оценивается по своему *рангу* в каждом списке, а не по сырому баллу, что обходит тот факт, что косинусное расстояние и балл BM25 измеряются не в одних единицах и не складываются.
Дальше идёт шаг, который даёт большую часть видимого качества и который многие продукты пропускают, потому что он стоит вычислений. Фузия даёт вам, скажем, тридцать кандидатов. Реранкер-кросс-энкодер читает вопрос и каждого кандидата *вместе* и оценивает, насколько хорошо этот отвечает на тот. Это гораздо точнее, чем сравнивать два независимо построенных вектора, и слишком медленно, чтобы прогонять по всему хранилищу — именно поэтому он работает последним, по короткому списку.
Одно предупреждение, если вы работаете более чем на одном языке. Оба этапа зависят от моделей, а множество моделей эмбеддингов и реранкинга сделаны в первую очередь под английский. Пайплайн с хорошими показателями на английском может тихо деградировать на французском или немецком, и вы переживёте это как «он забыл», а не как «реранкер был обучен на другом распределении». Если вы работаете не на английском, проверьте, что модели действительно мультиязычные — multilingual-e5 одно из таких семейств.
Когда мы перевели собственный пайплайн с простого векторного поиска на гибридную фузию плюс мультиязычный кросс-энкодер, mean reciprocal rank на нашем оценочном наборе вырос на 139%. Воспринимайте это как то, чем оно является: наше измерение, на наших данных, с нашим разбиением на чанки. Оно говорит, что шаг стоит делать; это не цифра, которую вы вправе ожидать воспроизвести на другом корпусе.
Четыре способа, которыми это ломается
- Это никогда не было сохранено. Самый частый сбой, с большим отрывом. Ничто в стеке поиска не найдёт факт, который никогда не был записан, а автоматическое извлечение пропускает вещи.
- Нет порога. Если система всегда возвращает свою топ-пятёрку, то когда ничего релевантного нет, она вернёт пять нерелевантных вещей — а модель, будучи покладистой, вплетёт их в ответ. Порог сходства, ниже которого не возвращается ничего, — это функция, и его отсутствие объясняет, почему некоторые ассистенты уверенно помнят неправильно.
- Устаревшие противоречия. Вы переехали в другой город; и старый, и новый факт лежат в хранилище, оба извлекаемы. Без учёта свежести или явного вытеснения модель может выбрать любой из них.
- Проблема иголки. Точные идентификаторы в системе только на векторах. См. выше.
Что спрашивать у продукта памяти
Пять вопросов, и у каждого есть фактический ответ, который вендор либо даёт, либо уходит от него:
- Поиск по ключевым словам в дополнение к векторному или только векторный?
- Есть ли этап реранкинга, и на какой модели?
- Есть ли порог релевантности, ниже которого не возвращается ничего?
- Мультиязычны ли модели эмбеддингов и реранкинга и оценены ли они на моём языке?
- Могу ли я увидеть, отредактировать и удалить отдельное воспоминание — или хранилище для меня непрозрачно?
Последний вопрос не о качестве поиска, но именно он станет для вас важным первым — в первый же раз, когда о вас запомнят что-то неверное.
Pryzm запускает гибридную фузию с мультиязычным реранкером-кросс-энкодером и порогом релевантности, на PostgreSQL с индексами HNSW, и каждое воспоминание видно и удаляемо по отдельности. Как с этим у альтернатив — в нашем сравнении.