TL;DR
GenCache — система кэширования, которая не хранит готовые ответы, а генерирует Python-программы, создающие кастомизированные ответы для структурно похожих промптов. Когда приходит новый запрос, программа выполняется локально и подставляет нужные вариации (например, другое название товара в тот же шаблон действий).
Обычный семантический кэш (типа GPTCache) при схожих промптах выдаёт один и тот же ответ. Промпты _"купи 12 батареек AAA на Амазоне"_ и _"купи USB-C кабель на Амазоне"_ считаются похожими — кэш возвращает ответ про батарейки для обоих. Точное совпадение (ExactCache) безопаснее, но требует идентичных промптов — любая вариация даёт промах. Оба подхода не учитывают, что промпты структурно похожи (глагол-товар-магазин), но ответы должны различаться по ключевым параметрам.
GenCache кластеризует похожие промпты по embeddings, скармливает примеры из кластера LLM и просит сгенерировать программу, которая извлекает вариации через regex и подставляет их в шаблон ответа. Программа проходит валидацию на тех же примерах и сохраняется как кэш. При новом запросе программа выполняется через Python-интерпретатор — вместо вызова дорогой LLM.
Для кого эта работа
⚠️ Это исследование инфраструктурного инструмента, не промпт-техники.
GenCache как система требует: - Python runtime для выполнения сгенерированных программ - Векторную базу для кластеризации embeddings - Отдельные LLM-вызовы для генерации и валидации программ - API-интеграцию с вашим приложением
Кому полезно напрямую: - Разработчикам систем с LLM через API - Тем, кто строит AI-агентов с повторяющимися задачами - Компаниям с большим объёмом структурно похожих запросов (поддержка, операционные агенты)
Extractable principles для работы в чате: Хотя саму систему не применить в ChatGPT/Claude, исследование показывает ценный принцип структурного переиспользования промптов. Если ты регулярно делаешь похожие запросы с вариациями — можно явно выделить паттерн и переиспользовать структуру.
Схема работы GenCache
Кластеризация (офлайн):
Промпт + Ответ → Embeddings (prompt + response)
→ Кластер по cosine similarity (пороги Tp=0.8, Tr=0.75)
→ Накопление минимум ν примеров
Генерация кэша (офлайн):
Кластер с ν примерами → CodeGenLLM (с примерами как few-shot)
→ Python-программа (regex для извлечения + шаблон ответа)
→ ValidLLM проверяет программу на тех же примерах
→ Если ≥γ% корректных → сохранить как кэш
→ Иначе: retry с reflection (до ρ попыток)
Runtime (онлайн):
Новый промпт P → Ближайший кластер по embeddings
→ Regex-валидация структуры
→ Если есть кэш: выполнить Python-программу локально
→ Санity-check → вернуть ответ
→ Если нет кэша / провал: вызов LLM
Extractable principle: Явное структурное переиспользование
GenCache автоматизирует то, что можно делать вручную в чате — выделять повторяющуюся структуру и явно указывать вариации.
Применение в чате
Задача: Ты регулярно анализируешь стартапы по одной схеме, но каждый раз пишешь промпт с нуля. Названия компаний меняются, структура анализа одна.
Вместо повтора промптов:
ШАГ 1 — Создай шаблон явно:
Создай для меня шаблон анализа стартапа:
1. Бизнес-модель (B2B/B2C/marketplace)
2. Unit-экономика (LTV/CAC, если есть данные)
3. Конкуренты (топ-3)
4. Риски (топ-3)
5. Вывод одним предложением
Сохрани этот шаблон и жди от меня названий стартапов.
ШАГ 2 — Применяй с вариациями:
Примени шаблон к: [Название стартапа]
Результат: LLM запомнит структуру из ШАГ 1 в контексте чата. При новом запросе просто назови компанию — модель применит ту же схему анализа. Экономия времени на переписывание промпта, единообразие формата.
Почему это работает: Ты явно разделяешь неизменную структуру (шаблон анализа) и вариации (название стартапа). GenCache делает это автоматически через regex и программы, ты — через явное указание в контексте чата. Принцип один: структурное переиспользование эффективнее переписывания с нуля.
Альтернативный пример: Переиспользование через референс
Задача: Готовишь однотипные брифы для дизайнера — меняются проекты, формат одинаковый.
Промпт:
Вот бриф для проекта А:
[вставить готовый бриф]
Создай аналогичный бриф для проекта Б со следующими данными:
- Название: [новое название]
- Целевая аудитория: [новая ЦА]
- Основной посыл: [новый посыл]
Сохрани всю структуру и стиль из примера А.
Результат: Модель возьмёт формат, стиль, разделы из примера А и подставит новые данные. Ты получишь единообразные брифы без повторного объяснения структуры.
Почему принцип структурного переиспользования работает
Слабость LLM: Модель не знает, что твои 10 запросов подряд — это одна задача с вариациями. Каждый промпт обрабатывается независимо. Если ты не скажешь явно _"используй ту же структуру"_, модель каждый раз генерирует ответ с нуля — может менять формат, стиль, глубину.
Сильная сторона LLM: Модель отлично следует шаблонам и подставляет вариации, если их явно выделить. Chain-of-Thought работает именно так: ты задаёшь структуру рассуждения примером, модель повторяет паттерн. Структурное переиспользование — это тот же принцип для твоих повторяющихся задач.
Механика GenCache: Система автоматически находит общий паттерн в кластере похожих промптов (например, regex купи|купить|приобрести (товар) на Амазоне), генерирует программу с шаблоном ответа и подстановкой вариаций. Программа выполняется локально — вместо нового LLM-вызова.
В чате ты делаешь вручную: Явно говоришь _"вот структура, вот вариации"_ или _"используй тот же формат, что раньше"_. Модель понимает паттерн из контекста или few-shot примера и применяет к новым данным. Эффект тот же — единообразие и экономия на переобъяснении.
Рычаги управления:
- Явность шаблона: чем детальнее опишешь структуру один раз, тем точнее повторы
- Референсный пример: дай модели готовый пример вместо описания — она скопирует формат точнее
- Указание вариаций: перечисли что именно меняется (название, дата, регион) — модель не тронет остальное
Шаблон для структурного переиспользования
Вариант 1: Создание шаблона в контексте
Создай для меня шаблон {типа задачи}:
{опиши структуру результата — разделы, формат, стиль}
Сохрани этот шаблон. Дальше я буду давать тебе только {что меняется},
а ты применяй этот шаблон.
---
{первый пример с данными}
Дальнейшие запросы в том же чате:
Примени шаблон к: {новые данные}
Вариант 2: Переиспользование через референс
Вот пример результата, который мне нравится:
{вставить готовый пример}
Сделай то же самое для:
{новые данные}
Сохрани структуру, формат и стиль из примера.
Что подставлять:
- {тип задачи} — анализ стартапа, бриф для дизайнера, план встречи
- {структура результата} — разделы, пункты, формат вывода
- {что меняется} — название компании, проект, дата
- {готовый пример} — реальный результат, который хочешь повторить
- {новые данные} — вариации для нового запроса
Когда применять: - Делаешь 3+ похожих запроса подряд - Хочешь единообразия в серии результатов - Тратишь время на переписывание похожих промптов
Ограничения
⚠️ Техническая система: GenCache как инструмент требует Python runtime, API-интеграцию, векторную базу. В ChatGPT/Claude не применишь напрямую.
⚠️ Для повторяющихся задач: Принцип структурного переиспользования эффективен при регулярных похожих запросах. Для разовых задач проще написать промпт с нуля.
⚠️ Не для сложных вариаций: Если между запросами меняется не только данные, но и логика/цели — шаблон не поможет. GenCache тоже ломается, если промпты структурно разные.
⚠️ Риск overfitting: Автоматически сгенерированная программа может захардкодить специфичные слова из примеров. В чате ты контролируешь вручную, но важно проверять первые результаты при переиспользовании.
Как исследовали
Команда из Microsoft Research и Университета Иллинойса тестировала GenCache в двух сценариях: на синтетических данных и с интеграцией в реальных AI-агентах.
Синтетические данные: Взяли 12000+ инструкций пользователей из датасета WebShop (симуляция интернет-магазина). Каждая инструкция описывает покупку товара — например, _"купи 12 батареек AAA на Амазоне"_. GPT-4o сгенерировал два варианта: - Param-Only — вариации только в параметрах (товар, цена), формулировка идентична - Param-w-Synonym — вариации и в параметрах, и в глаголах (_купи/приобрети/возьми_), плюс небольшие перефразировки
AI-агенты: Интегрировали с двумя агентами. Laser — веб-навигационный агент на базе OpenAI API, планирует действия на веб-страницах (поиск, покупка). FLASH — облачный операционный агент на LangChain, диагностирует системные сбои по шаблонным алертам (_"NSM-RNM соединение потеряно в useast1"_ vs _"...в uswest1"_). Протестировали на 298 реальных инцидентах Microsoft за 2 месяца — 69% инцидентов относились к одному сценарию, 93% к двум, что подтвердило высокую повторяемость задач.
Сравнение с бейзлайнами: ExactCache (точное совпадение промптов) и GPTCache (семантическое кэширование). Для GPTCache использовали Sentence-BERT embeddings и FAISS-индексацию с порогом схожести 0.95. Измеряли cache hit rate (сколько запросов обработано из кэша) и корректность (правильный ли ответ при хите).
Результаты удивили: На Param-Only GenCache дал 97.8% hit rate при 98% корректных ответов — почти как GPTCache по хитам (91%), но GPTCache выдавал 100% некорректных (возвращал один и тот же ответ для разных товаров). На Param-w-Synonym (сложнее, есть перефразировки) GenCache показал 83.7% hit rate при 92% корректности — GPTCache опять 89% хитов, но всё некорректно. ExactCache дал 0% хитов в обоих случаях.
С агентами: GenCache снизил end-to-end латентность Laser на ~34% и поднял hit rate на ~20% против стандартного exact matching. Для FLASH, где 93% инцидентов укладываются в 2 сценария, выигрыш ещё выше.
Инсайт: Семантическое кэширование хорошо работает для идентичных ответов, но опасно при вариациях — 100% некорректных хитов означают, что агент делал не то, что просили. Точное совпадение безопасно, но неэффективно. GenCache попал в sweet spot — высокий hit rate без жертвы корректностью, потому что генерирует ответ под вариации вместо переиспользования старого.
Стоимость: Создание кэша требует LLM-вызовов (CodeGenLLM и ValidLLM), но окупается быстро — на WebShop экономия от кэша превысила 35% от общих токенов. Сами программы занимают ~5KB каждая, вся база кэша — десятки мегабайт.
Ресурсы
Generative Caching for Structurally Similar Prompts and Responses — Sarthak Chakraborty (University of Illinois at Urbana-Champaign), Suman Nath, Xuchao Zhang, Chetan Bansal (Microsoft Research), Indranil Gupta (University of Illinois at Urbana-Champaign). NeurIPS 2025.
