Память в чат-боте: три разные вещи под одним словом
«Пусть бот помнит клиента» звучит как одна функция, а на деле это три разные задачи с разной ценой и разными сроками. Причём ни одну из них не решает модель: она не помнит ничего и каждый запрос получает пустой. Помнит то, что вы построили вокруг неё.
Начать надо с неприятного: языковая модель не помнит ничего. Каждое обращение к ней — отдельный, ничем не связанный с предыдущими запрос. Ощущение непрерывного разговора создаётся тем, что вместе с новым сообщением ей заново отправляют всё предыдущее.
Отсюда следует главное: память — не свойство модели, а то, что вы построили вокруг неё. И это не одна вещь, а как минимум три, которые в разговоре обычно называют одним словом.
Три вида памяти
Контекст текущего разговора. То, что отправляется модели вместе с вопросом: последние сообщения, чтобы «он» и «то же самое, но подешевле» были понятны. Живёт ровно один разговор, ограничен размером окна и стоит денег на каждом сообщении.
Состояние пользователя. То, что вы храните у себя: кто это, что покупал, на чём остановился, что уже спрашивал. Не исчезает никогда, стоит копейки, к модели отношения не имеет — обычная база данных. Именно это имеют в виду в 90% случаев, когда говорят «пусть бот помнит клиента».
Знание о предметной области. Ваш каталог, прайс, регламенты, документы. Это не память вовсе, а поиск: под конкретный вопрос находится нужный кусок и подкладывается в запрос. Путают с памятью постоянно, а устроено и стоит совсем иначе.
Разделить их важно до начала работы, потому что цена у них разная на порядки, и «бот с памятью» может означать неделю работы, а может — месяц.
Что ломается в контексте
Соблазн простой: складывать в контекст всю историю переписки и не думать. Так делают, и вот что происходит дальше.
Стоимость растёт квадратично, а не линейно. Каждое новое сообщение отправляется вместе со всей историей. Десятое сообщение в диалоге тащит за собой девять предыдущих, сотое — девяносто девять. Платите вы за каждый такой запрос целиком.
Окно кончается. У любой модели есть предел, и при его достижении история начинает обрезаться — обычно с начала, то есть теряется ровно то, с чего разговор начался и что чаще всего было важным.
Сжатие истории теряет точность. Стандартный ответ — периодически просить модель пересказать разговор короче. Работает, но пересказ делает та же модель, которая может ошибиться, и ошибка потом переезжает во все следующие запросы уже как факт.
Рабочее решение — не хранить в контексте то, что должно быть в состоянии. Номер заказа, выбранный тариф, имя, уровень ученика — это поля, а не реплики. Языковой репетитор построен ровно так: диалог ведёт модель, а уровень, ошибки и пройденные темы лежат на стороне сервиса в понятном текстовом виде. Занятие продолжается с того места, где закончили, и для этого не нужно возить с собой всю историю.
Состояние — это просто база
Здесь хорошая новость: самая нужная часть «памяти» — самая дешёвая и самая предсказуемая. Никакого ИИ: таблица пользователей, таблица событий, поля.
Что имеет смысл хранить почти всегда: кто человек и как с ним связаться, чем интересовался, на каком шаге остановился, что ему уже отвечали, чем закончилось. Этого достаточно, чтобы бот при следующем визите не начинал с чистого листа, а сказал «в прошлый раз вы спрашивали про сварщиков, продолжаем?».
Важный приём — вынимать структурированные данные прямо из разговора. У ИИ-ассистента для этого формы прямо внутри диалога: имя, организация, количество слушателей. Данные попадают в поля, а не остаются текстом, который потом придётся разбирать. Бот-квалификатор делает то же самое с заявкой: на выходе карточка с задачей, бюджетом и срочностью, а не расшифровка беседы.
Знание — это поиск, а не память
Третий случай: «пусть бот помнит наш прайс». Прайс не надо помнить, по нему надо искать. Каталог переводится в векторы, под вопрос находятся подходящие позиции и подкладываются в запрос — модель отвечает только по ним.
Разница практическая: память растёт с числом разговоров, а знание — с числом документов, и обновляется независимо от пользователей. Поменялся прайс — переиндексировали, все диалоги немедленно отвечают по новому. Если бы прайс «помнился», его пришлось бы вычищать из каждой истории.
Здесь же лежит защита от выдумывания: ассистент, отвечающий только по найденному в каталоге, не изобретёт продукт и цену. Подробнее про эту часть — в разборе про ИИ-ассистента для сайта.
Чего делать не стоит
Хранить всё подряд на всякий случай. Переписка с клиентами — это персональные данные, и их обработка требует основания, уведомления и срока хранения. «Сохраним весь диалог, вдруг пригодится» — это не осторожность, а необъявленный риск. Решайте до запуска, что храните и сколько.
Делать память незаметной. Человек, которому бот через месяц припоминает подробности прошлого разговора, реагирует хуже, чем ожидают. Работает обратное: показать, что помните, и дать это стереть. Одна кнопка «забыть меня» снимает большую часть вопросов.
Считать, что память заменит сценарий. Бот, который «всё помнит», но не знает, что делать дальше, помнит бесполезно. Сначала понятный путь клиента, потом состояние под него — а не наоборот.
Как понять, что нужно вам
Три вопроса, и они разводят задачу по трём абзацам выше:
- Нужно ли, чтобы в рамках одного разговора бот понимал «а подешевле?» — это контекст, он есть почти всегда и стоит недорого.
- Нужно ли, чтобы через неделю он узнал человека и продолжил с прошлого места — это состояние, обычная база, самая полезная часть.
- Нужно ли, чтобы он отвечал по вашему каталогу или регламентам — это поиск, отдельная работа со своим сроком.
Чаще всего честный ответ: второе — обязательно, первое — в небольшом объёме, третье — только если каталог реально большой. Полный набор нужен реже, чем кажется, и стоит заметно дороже — про то, из чего складывается эта цена, есть отдельный разбор.
Если не очевидно, какой из трёх случаев ваш, это и есть тема первого разговора: обычно он занимает полчаса и заметно сокращает смету. Написать мне.
Обсудить бота с памятью
Напишите в Telegram пару предложений о задаче: что за бизнес, что должно получиться и что уже пробовали. В ответ — понятный план и цена. Без брифов на десять страниц.