У бота накапливается много разговоров с пользователем. Год спустя пользователь напишет: «помнишь, я рассказывала про бег?» — и ты хочешь, чтобы бот «вспомнил» ту сессию. Запихнуть всю историю в system prompt невозможно (дорого, не поместится). Нужно уметь искать только релевантные куски и подкладывать их в промпт в нужный момент. Эта техника называется RAG (Retrieval-Augmented Generation). А contextual retrieval — её улучшенная версия от Anthropic.
<memory>.Когда ты режешь длинный разговор на чанки по 500 слов, из каждого чанка «выпадает» контекст: кто говорил, когда, про что был весь разговор. Строка «пробежала 3 км впервые» сама по себе плохо находится на запрос «расскажи про первые шаги в беге у Ани».
Перед тем как превращать чанк в эмбеддинг — дописать к нему короткий контекст: чей это разговор, когда, о чём. Делает это та же LLM: даёшь ей полный документ и чанк, просишь написать в одну фразу, «где этот чанк живёт». Результат:
исходный чанк:
«пробежала 3 км впервые, чуть не умерла, но горжусь»
контекстуализированный чанк:
«Запись из сессии с Аней от 2026-04-15, разговор про долгосрочную цель
«бегать 3 раза в неделю». Аня:
пробежала 3 км впервые, чуть не умерла, но горжусь»
Что здесь происходит: теперь этот чанк найдётся и на запрос «первая пробежка», и на «Аня бег», и на «апрель 2026». Релевантность поиска вырастает в разы.
Благодаря prompt caching один и тот же документ подставляется в контекст для каждого своего чанка, но кешируется — и на длинную историю обработка выходит около $1 за миллион токенов. Это разовая стоимость: один раз обработал и сохранил контекстуализированные чанки, дальше они используются сколько угодно.
Честно: скорее всего нет, пока у пользователя меньше
100 сессий в истории. Для начала хватит: сохранять важные факты в
отдельную таблицу user_notes (текущая цель, срывы,
интересы) и подставлять их в system prompt целиком. Это не RAG, а
просто «короткий дайджест пользователя».
Contextual retrieval пригодится, когда:
user_notes прямо в
твоей SQLite-базе bot.db. Поля — user_id, type
(goal / struggle / interest / fact), text, date. Подставляешь это
целиком в system prompt при каждом запросе.