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

Безотходная агентная RAG: проектирование архитектур кэширования для минимизации задержки и затрат на LLM в масштабе

Сокращение затрат на LLM на 30% за счет многоуровневого кэширования с учетом проверки подлинности.

Делиться

5ce624ed7922a0ae63efe9417fab8219

Технология генерации с расширенными возможностями поиска (Retrieval-Augmented Generation, RAG) вышла из экспериментальной фазы и прочно вошла в корпоративную эксплуатацию. Мы больше не просто создаем чат-боты для тестирования возможностей LLM; мы строим сложные агентные системы, которые напрямую взаимодействуют с внутренними структурированными базами данных (SQL), неструктурированными озерами знаний (Vector DBs), а также сторонними API и инструментами MCP. Однако по мере масштабирования внедрения RAG в организации становится очевидной и дорогостоящей проблема — избыточность .

Во многих корпоративных системах RAG команды отмечают, что более 30% запросов пользователей являются повторяющимися или семантически схожими . Сотрудники разных отделов запрашивают одни и те же данные о продажах за 4 квартал, одни и те же процедуры адаптации и одни и те же сводки стандартных договоров с поставщиками. Внешние пользователи, спрашивающие о страховых взносах на медицинское страхование для своего возраста, часто получают идентичные ответы для пользователей со схожими профилями.

В простой архитектуре RAG каждый из этих повторяющихся вопросов запускает идентичную, дорогостоящую цепочку событий: генерацию эмбеддингов, выполнение поиска векторного сходства, сканирование таблиц SQL, извлечение огромных контекстных окон и принуждение большой языковой модели (LLM) к анализу тех же самых токенов для получения ответа, сгенерированного час назад.

Эта избыточность увеличивает затраты на облачную инфраструктуру и добавляет ненужные многосекундные задержки в ответах пользователей. Нам необходима интеллектуальная стратегия кэширования для контроля затрат и поддержания жизнеспособности RAG по мере роста числа пользователей и запросов.

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

Схема подключения: двухканальная агентная система

Рассмотрим смоделированную корпоративную среду, используя набор данных отзывов о товарах Amazon (CC0).

Наша система Agentic RAG выступает в роли интеллектуального маршрутизатора, оснащенного доступом к двум хранилищам данных:
1. Структурированная база данных SQL (SQLite): содержит табличные данные отзывов (идентификатор, имя профиля, оценка, время, краткое описание, текст отзыва).
2. Неструктурированная векторная база данных (FAISS): содержит встроенный текстовый контент отзывов покупателей о товарах. Это имитирует внутренние базы знаний, вики-сайты и нормативные документы.

Двухуровневая архитектура кэша

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

Уровень 1: Семантический кэш (на уровне запроса)

Семантический кэш выступает в качестве первой линии защиты, перехватывая пользовательский запрос. В отличие от традиционного кэша, требующего идеального совпадения строки (например, кэширование `SELECT * FROM table`), семантический кэш использует эмбеддинги.

Когда пользователь задает вопрос, мы встраиваем запрос и сравниваем его с ранее кэшированными запросами, используя косинусное сходство. Если новый запрос семантически идентичен — например, показатель сходства > 95% — мы немедленно возвращаем ранее сгенерированный ответ LLM. Например:
Вопрос А: «Какова политика компании в отношении отпусков?»
Вопрос Б: «Не могли бы вы рассказать мне о правилах предоставления отгулов?»
Семантический кэш распознает эти намерения как идентичные. Он перехватывает запрос еще до вызова агента, в результате чего ответ доставляется за миллисекунды с нулевой стоимостью токенов LLM.

Уровень 2: Кэш извлечения данных (контекстный уровень)

Рассмотрим случай, когда пользователь задает вопрос следующим образом:
Запрос C: «Кратко изложите политику предоставления отпусков, специально разработанную для удаленных сотрудников».

Это не 95% совпадение, поэтому оно не проходит первый уровень. Однако документы, необходимые для ответа на запрос C, в точности совпадают с документами, полученными для запроса A. Именно здесь активируется второй уровень — кэш поиска.

Кэш поиска хранит необработанные блоки данных (строки SQL или фрагменты текста FAISS) с более широким порогом «соответствия теме» ( например, > 70% ). Если семантический кэш не справляется с задачей, агент проверяет второй уровень. Если он находит соответствующий предварительно загруженный контекст, он пропускает дорогостоящие запросы к базе данных и напрямую передает кэшированный контекст в LLM для генерации нового ответа. Он действует как высокоскоростной блокнот.

Интеллектуальный маршрутизатор: создание агентов и инструментарий.

Простого извлечения данных из кэша недостаточно. Нам необходимы механизмы для обнаружения устаревания сохраненного контента в кэше, чтобы предотвратить некорректные ответы пользователю. Для организации извлечения и проверки данных из двухуровневого кэша и бэкэндов с двумя источниками система использует агент LLM. Вместо агента RAG, который действует только как синтезатор ответов в зависимости от контекста, здесь агенту предоставляется строгий системный запрос и специальный набор инструментов, позволяющих ему выступать в качестве интеллектуального маршрутизатора запросов и валидатора данных.

Инструментарий агента включает в себя несколько настраиваемых функций, которые он может вызывать автономно в зависимости от намерений пользователя:

  • search_vector_database: Выполняет запросы к базе данных Vector DB (FAISS) для поиска неструктурированного текста.
  • query_sql_database : Выполняет динамические SQL-запросы к локальной базе данных SQLite для получения точных чисел или отфильтрованных данных.
  • check_retrieval_cache : Извлекает предварительно загруженный контекст для более чем 70% похожих тем, чтобы пропустить поиск по Vector/SQL.
  • check_source_last_updated : Быстро запрашивает у работающей базы данных SQL точное значение MAX(Time) по метке времени. Помогает определить, была ли обновлена исходная таблица 'reviews' для глобальных агрегационных запросов (например, какова средняя оценка по всем отзывам?).
  • check_row_timestamp : Проверяет параметр даты и времени для конкретного идентификатора строки.
  • check_data_fingerprint : Вычисляет хеш содержимого документа для обнаружения изменений. Полезен, когда отсутствует столбец «Дата-время» или в распределенной базе данных.
  • check_predicate_staleness : Проверяет, изменился ли определенный «фрагмент» данных (например, определенный год).

Эта архитектура вызова инструментов преобразует LLM из пассивного генератора текста в активный, самокорректирующийся менеджер данных. В следующих сценариях будет показано, как эти инструменты используются для конкретных типов запросов с целью управления стоимостью и точностью ответов. На рисунке показан поток запросов во всех рассмотренных здесь сценариях.

242ee4331b59ca0fa6a1df1113d9a04e

Реальные сценарии

Сценарий 1: Попадание в семантический кэш (скорость и стоимость)

909a19c656a690e8ef448ae0c370b5b5

Это идеальный сценарий, когда вопрос одного пользователя практически идентично повторяется другим пользователем (>95% сходства). Например, пользователь спрашивает систему: «Каковы распространенные мнения о вкусе кофе?». Поскольку система впервые видит этот вопрос, это приводит к ошибке кэширования (MISS). Агент методично выполняет запрос к векторному поиску, извлекает три документа, и LLM тратит 36 секунд на анализ текста, чтобы сгенерировать исчерпывающее описание горького и восхитительного вкуса кофе.

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

В итоге время ответа сократилось с ~36,0 секунд до 0,02 секунд. Общая стоимость токенов для второго запроса: 0,00 долларов.

Вот последовательность выполнения запроса. ============================================================ ==== Сценарий 1: Попадание в семантический кэш (скорость и стоимость) ===== ============================================================== -> Запрос в ПЕРВЫЙ раз (ожидается промах кэша, медленный LLM + поиск в базе данных) [ПОЛЬЗОВАТЕЛЬ]: Каковы распространенные мнения о вкусе кофе? [СИСТЕМА]: Промах в семантическом кэше / ПРОПУЩЕНО. Перенаправление к агенту… [ИНСТРУМЕНТ: RetrievalCache]: Проверка кэша на наличие темы: 'общепринятые мнения о вкусе кофе' [ИНСТРУМЕНТ: RetrievalCache]: ПРОМАХ. Тема не найдена в кэше. [ИНСТРУМЕНТ: VectorSearch]: Поиск по запросу 'общепринятые мнения о вкусе кофе'… [ИНСТРУМЕНТ: VectorSearch]: Найдено 3 документа. Сохранение в кэш поиска. [АГЕНТ]: Судя по отзывам, общепринятые мнения о вкусе кофе различаются. Некоторые считают его горьким, другие описывают его как очень вкусный и восхитительный. Также встречаются мнения, что кофе может быть несвежим и безвкусным. Некоторые потребители также обеспокоены тем, как раскрыть весь вкусовой потенциал своего кофе. [ВРЕМЯ ЗАТРАЧЕНО]: 36,13 секунд -> Запрашивается ВТОРОЙ раз (ожидается попадание в семантический кэш, мгновенно) [ПОЛЬЗОВАТЕЛЬ]: Каковы общепринятые мнения о вкусе кофе? [СИСТЕМА]: Попадание в семантический кэш -> Судя по отзывам, мнения о вкусе кофе сильно разнятся. Некоторые считают его горьким, другие же описывают его как очень вкусный и приятный. Также встречаются мнения, что кофе может быть несвежим и безвкусным. Некоторые потребители также обеспокоены тем, насколько полно раскрывается вкус кофе. [ВРЕМЯ ВЫПОЛНЕНИЯ]: 0,02 секунды

Сценарий 2: Кэш извлечения данных (общий контекст)

baff3f847cb6dfbfe77f4096c9c75a67

Далее пользователь задает уточняющий вопрос: «Обобщите эти мнения в виде 3 пунктов».

Семантический кэш регистрирует ошибку MISS, поскольку намерение (формат суммирования) принципиально отличается. Однако семантическая тема очень похожа (>70%). Система обращается к кэшу поиска второго уровня , извлекает те же 3 документа, что и в сценарии 1, и передает их в LLM для форматирования в виде маркированных списков.
В итоге мы устраняем задержку и затраты, связанные с поиском ближайшего соседа в векторных базах данных, сохраняя процесс извлечения данных исключительно в оперативной памяти.

Вот последовательность выполнения запроса. ============================================================ ===== Сценарий 2: Попадание в кэш извлечения (общий контекст) ===== ============================================================== -> Проверка заполнения кэша извлечения (тихая проверка)… [ПОЛЬЗОВАТЕЛЬ]: Каковы общие мнения о вкусе кофе? [СИСТЕМА]: Попадание в семантический кэш -> Судя по отзывам, общие мнения о вкусе кофе различаются. Некоторые считают его горьким, в то время как другие описывают его как очень вкусный и восхитительный. Также существуют мнения, что кофе может быть несвежим и безвкусным. Некоторые потребители также обеспокоены тем, как раскрыть весь вкусовой потенциал своего кофе. -> Задается ДРУГОЙ вопрос на ТУ ЖЕ ТЕМУ. -> Семантический запрос немного отличается, поэтому происходит промах семантического кэша. -> Агент должен обратиться к кэшу извлечения, чтобы избежать поиска FAISS и ответить на него. [ПОЛЬЗОВАТЕЛЬ]: Обобщите эти мнения о вкусе кофе в виде маркированного списка. [СИСТЕМА]: Промах/обход семантического кэша. Переадресация агенту… [ИНСТРУМЕНТ: RetrievalCache]: Проверка кэша на тему: 'мнения о вкусе кофе' [ИНСТРУМЕНТ: RetrievalCache]: ПОПАДАНИЕ! Найден кэшированный контекст (ID документа: 481389 [АГЕНТ]: Вот краткое изложение отзывов о вкусе кофе: * Один пользователь отметил «странный привкус» и горький вкус кофе, выразив разочарование. * Другой пользователь оценил кофе, описав его как «очень вкусный» и «восхитительный» при приготовлении в капельной кофеварке, хотя он не был уверен, что полностью раскрыл его вкусовой потенциал из-за отсутствия инструкций по приготовлению. * Третий пользователь был сильно разочарован, посчитав кофе несвежим и безвкусным. [ВРЕМЯ ВЫПОЛНЕНИЯ]: 34,24 секунды

Сценарий 3: Обход кэша Agentic

1305f226d0a98afcc666cc2e5da1ebce

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

В этом случае маршрутизатор Agentic анализирует пользовательский запрос и понимает его временные намерения. На основе системного запроса он принимает решение полностью обойти кэш . Запрос направляется непосредственно в исходную базу данных SQL, чтобы обеспечить актуальный контекст для формирования ответа.

Вот последовательность выполнения запроса. ============================================================ ======= Сценарий 3: Обход семантического кэша для получения «последних» данных ======= ============================================================== -> Запрос «последних» данных. -> Логика запроса агента должна явно обходить кэш и обращаться к SQL. [ПОЛЬЗОВАТЕЛЬ]: Какие последние пятизвездочные отзывы? [СИСТЕМА]: Промах / Обход семантического кэша. Переадресация агенту… [АГЕНТ]: Вот последние 5-звездочные отзывы: * **Оценка:** 5, **Краткое описание:** Вкусно, **Текст:** Тонкие палочки в моей семье расходятся слишком быстро!.. продолжение

Сценарий 4: Обнаружение устаревших данных на уровне строк.

424e2ff7b8da73c6d8071528cae312a9

Данные не статичны. Поэтому перед использованием необходимо проверить содержимое кэша.

Допустим, пользователь спрашивает: «Каково краткое содержание отзыва с ID 120698?» Система кэширует ответ.

Впоследствии администратор обновляет базу данных, изменяя краткий текст для того же идентификатора. Когда пользователь задает тот же самый вопрос снова, семантический кэш определяет 100% совпадение. Однако он не выдает ответ вслепую.

Каждая запись в кэше хранится с тегом стратегии проверки . Перед возвратом результата система запускает инструмент проверки времени строки check_row_timestamp. Он быстро проверяет столбец Time на наличие ID 120698 в рабочей базе данных. Увидев, что метка времени в рабочей базе данных новее метки времени создания кэша, система запускает процесс аннулирования . Она удаляет устаревший кэш, принудительно выполняет запрос к базе данных и получает исправленную сводку.

Вот последовательность выполнения запроса. Я добавил дополнительную проверку, чтобы показать, что обновление несвязанной строки не приводит к аннулированию кэша. ============================================================ == Сценарий 4: Обнаружение устаревших данных (временная метка на уровне строки) === ============================================================== -> Шаг 1: Первоначальный запрос (ожидается промах, агент получает данные из SQL) [ПОЛЬЗОВАТЕЛЬ]: Предоставьте подробное описание проверки с ID 120698. [СИСТЕМА]: Промах / ОБХОД семантического кэша. Переадресация агенту… [TOOL: RetrievalCache]: Проверка кэша на наличие темы: 'review ID 120698' [TOOL: RetrievalCache]: ПРОМАХ. Тема не найдена в кэше. [AGENT]: Отзыв с ID 120698 имеет краткое описание «Мусор с привкусом гари»..продолжение. -> Шаг 2: Повторный запрос (ожидается совпадение — данные актуальны) [ПОЛЬЗОВАТЕЛЬ]: Предоставьте подробное описание отзыва с ID 120698. [СИСТЕМА]: Совпадение в семантическом кэше (метка времени актуальности строки) -> Отзыв с ID 120698 имеет краткое описание «Некачественный мусор»..продолжение.. -> Шаг 3: Имитация фонового обновления (не связанный ID 99999)… -> Тестирование извлечения ПОСЛЕ несвязанного изменения (ожидается совпадение — строка по-прежнему актуальна): [ПОЛЬЗОВАТЕЛЬ]: Предоставьте подробное описание отзыва с ID 120698. [СИСТЕМА]: Совпадение в семантическом кэше (метка времени актуальности строки) -> Отзыв с ID 120698 имеет краткое описание «Некачественный мусор»..продолжение.. -> Сейчас обновляется сам целевой отзыв (строка 120698)… [ОБНОВЛЕНИЕ В РЕАЛЬНОМ ВРЕМЕНИ]: Новый Временная метка в БД: 27-02-2026 03:53:00 -> Проверка извлечения данных из семантического кэша для строки 120698 ПОСЛЕ ее собственного обновления: -> ОЖИДАНИЕ: Обнаружен устаревший кэш (на уровне строки). Аннулирование. [ПОЛЬЗОВАТЕЛЬ]: Предоставьте подробное описание обзора с ID 120698. [СИСТЕМА]: Обнаружен устаревший кэш (строка 120698 обновлена 27-02-2026 03:53:00). Аннулирование. [СИСТЕМА]: Промах / ОБХОД семантического кэша. Переадресация агенту… [ИНСТРУМЕНТ: RetrievalCache]: Проверка кэша на наличие темы: 'обзор ID 120698' [ИНСТРУМЕНТ: RetrievalCache]: ПРОМАХ. Тема не найдена в кэше. [АГЕНТ]: ОБНОВЛЕННЫЙ отзыв по товару с ID 120698 кратко описывается как «Мусор с привкусом гари»…продолжение…

Сценарий 5: Устаревание данных на уровне таблиц (агрегации)

32ef9d15925eac62c3afd6f159d83a04

Проверка на уровне строк хорошо работает для отдельных запросов, но не для запросов, требующих агрегирования большого количества строк. Например;
Пользователь спрашивает: «Сколько всего отзывов в базе данных?» или «Какова средняя оценка всех отзывов?». И затем другой пользователь задает тот же вопрос снова. В этом случае проверка временной метки тысяч строк была бы крайне неэффективной. Вместо этого семантический кэш помечает агрегационные запросы стратегией проверки максимального времени в таблице. Когда тот же вопрос задается снова, агент использует инструмент check_source_last_updated для проверки запроса SELECT MAX(Time) FROM reviews. Если он обнаруживает новую временную метку в исходной таблице, он аннулирует кэш и точно пересчитывает общее количество.

Вот последовательность выполнения запроса. ============================================================ ====== Сценарий 5: Обнаружение устаревших данных (на уровне таблицы) ======= ============================================================= -> Шаг 1: Первоначальный запрос (ожидается MISS, агент выполняет глобальный подсчет) [ПОЛЬЗОВАТЕЛЬ]: Сколько всего отзывов в базе данных? [СИСТЕМА]: Промах/проход в семантическом кэше. Маршрутизация к агенту… [ИНСТРУМЕНТ: RetrievalCache]: Проверка кэша на наличие темы: 'общее количество отзывов' [ИНСТРУМЕНТ: RetrievalCache]: ПРОМАХ. Тема не найдена в кэше. [АГЕНТ]: В базе данных всего 205 отзывов. -> Шаг 2: Повторный запрос (ожидается попадание — таблица актуальна) [ПОЛЬЗОВАТЕЛЬ]: Сколько всего отзывов в базе данных? [СИСТЕМА]: Попадание в семантический кэш (актуальная метка времени источника) -> В базе данных всего 205 отзывов. -> Добавление новой записи об отзыве (id 11111) с актуальной меткой времени… -> Проверка извлечения из глобального кэша ПОСЛЕ изменения таблицы: -> ОЖИДАНИЕ: Обнаружен устаревший кэш (на уровне источника). Аннулирование. [ПОЛЬЗОВАТЕЛЬ]: Сколько всего отзывов в базе данных? [СИСТЕМА]: Обнаружен устаревший кэш (Источник 'reviews' обновлен 27.02.2026 08:03:26). Аннулирование. [СИСТЕМА]: Промах / Обход семантического кэша. Маршрутизация к агенту… [ИНСТРУМЕНТ: RetrievalCache]: Проверка кэша на наличие темы: 'общее количество отзывов' [ИНСТРУМЕНТ: RetrievalCache]: Промах. Тема не найдена в кэше. [АГЕНТ]: В базе данных всего 206 отзывов.

Сценарий 6: Выявление устаревших данных с помощью дактилоскопии.

612c2f14fbc40db3b6f5f4ea57d678e8

Иногда в базах данных отсутствуют надежные метки времени updated_at, или мы имеем дело с неструктурированными текстовыми файлами или распределенными базами данных. В этом случае мы полагаемся на криптографию. Пользователь задает вопрос: «Что говорится в отзыве с ID 120698?» Система кэширует ответ вместе с хешем SHA-256 исходного текста.

Когда текст изменяется без обновления метки времени, семантический кэш обнаруживает совпадение. Используя инструмент check_data_fingerprint, он пытается выполнить проверку, сравнивая кэшированный хеш SHA-256 с новым хешем исходного текста. Несоответствие хешей вызывает срабатывание сигнализации, что безопасно аннулирует скрытое редактирование.

Вот последовательность выполнения запроса. =========================================================== == Сценарий 6: Обнаружение устаревших данных (снятие отпечатков данных) === ============================================================== -> Шаг 1: Первоначальный запрос (ожидается промах, агент получает текст) [ПОЛЬЗОВАТЕЛЬ]: Какой точный текст отзыва с ID 120698? [СИСТЕМА]: Промах / обход семантического кэша. Переадресация агенту… [АГЕНТ]: Точный текст отзыва с ID 120698: «Худший кофейный напиток, который я когда-либо пил… продолжение». -> Шаг 2: Повторный запрос (ожидается совпадение — хеш действителен) [ПОЛЬЗОВАТЕЛЬ]: Какой точный текст отзыва с ID 120698? [СИСТЕМА]: Совпадение в семантическом кэше (действительный хеш) -> Точный текст отзыва с ID 120698: «Худший кофейный напиток, который я когда-либо пил… продолжение». -> Изменение исходного текста без метки времени в базе данных SQL… -> Проверка извлечения из семантического кэша ПОСЛЕ изменения содержимого: -> ОЖИДАНИЕ: Обнаружен устаревший кэш (несоответствие хеша). Аннулирование. [ПОЛЬЗОВАТЕЛЬ]: Какой точный текст отзыва с ID 120698? [СИСТЕМА]: Обнаружен устаревший кэш (несоответствие хеша). Аннулирование кэша и повторный запуск. [СИСТЕМА]: Промах / ОБХОД семантического кэша. Маршрутизация к агенту… [АГЕНТ]: Точный текст отзыва с ID 120698: «Худший кофейный напиток, который я когда-либо пробовал…»

Сценарий 7: Резервный вариант кэширования при извлечении данных (достаточность контекста)

9b6a07117ae2c8c3d7649a245d90eea9

Хотя контекстный кэш второго уровня является мощным инструментом, иногда контекст может содержать лишь половину ответа на вопрос пользователя.

Например, пользователь спрашивает: «Каково мнение об упаковке кофе?» Система выполняет поиск, и база данных Vector возвращает документы, в которых говорится исключительно об упаковке кофе. Эта информация кэшируется.

Далее пользователь спрашивает: «Что люди думают об упаковке и вкусе кофе?»

Система обращается к кэшу поиска на основе сходства тем и передает документы в LLM. Но агенту дается указание оценить достаточность с помощью инструмента check_retrieval_cache. Агент анализирует кэшированный контекст и понимает, что контекст содержит информацию только об упаковке, но не о вкусе кофе.
Вместо того чтобы генерировать ответ о вкусе, агент запускает резервный контекст . Он отбрасывает кэш, генерирует новый запрос, специально нацеленный на «вкус кофе» и «упаковку кофе», обращается к работающей базе данных Vector DB и объединяет результаты, чтобы предоставить безупречный, основанный на фактах ответ.

Вот последовательность выполнения запроса. ============================================================ Сценарий 7: Резервный кэш извлечения (достаточность контекста) ============================================================= -> Шаг 1: Заполнение кэша извлечения узким контекстом (только упаковка) для широкой темы… -> Шаг 2: Задание широкого вопроса («упаковка» И «вкус»). -> Ожидание: [ПОЛЬЗОВАТЕЛЬ]: Что люди думают об упаковке и реальном вкусе кофе? [СИСТЕМА]: Промах / ОБХОД семантического кэша. Маршрутизация к агенту… [ИНСТРУМЕНТ: RetrievalCache]: Проверка кэша на наличие темы: 'упаковка и вкус кофе' [ИНСТРУМЕНТ: RetrievalCache]: ПОПАДАНИЕ! Найден кэшированный контекст (Отзыв 1: Коробка пришла слегка помятой, но внутренняя упаковка была надежной. [ИНСТРУМЕНТ: VectorSearch]: Поиск по запросу «упаковка кофе»… [ИНСТРУМЕНТ: VectorSearch]: Найдено 3 документа. Сохранение в кэш поиска. [ИНСТРУМЕНТ: VectorSearch]: Поиск по запросу «вкус кофе»… [ИНСТРУМЕНТ: VectorSearch]: Найдено 3 документа. Сохранение в кэш поиска. [АГЕНТ]: Мнения людей об упаковке и вкусе кофе разделились. Что касается **упаковки**: * Некоторые покупатели получили товары с поврежденной упаковкой, например, «помятая коробка» и «кофейная пыль по всей упаковке капсул». * Другие отметили проблемы с четкостью информации на упаковке. Что касается **фактического вкуса кофе**: * В нескольких отзывах вкус описывается негативно, например, «очень горький». * Один рецензент просто заявил, что он «на вкус как растворимый кофе». [ВРЕМЯ, ЗАТРАЧЕННОЕ НА ЗАТРАТЫ]: 7,34 секунды

Сценарий 8: Кэширование предикатов (проверка с ограничением по времени)

c6ecb5bc704cee5a384f2f2330f55787

Наконец, мы можем применить усовершенствованную логику аннулирования устаревших данных для оптимизации извлечения данных из кэша. Вот пример.

Пользователь спрашивает: «Сколько отзывов было написано в 2011 году?»

Поскольку это глобальный запрос, затрагивающий большое количество строк, применяется проверка на устаревание на уровне таблицы (сценарий 5). Однако, если кто-то добавит обзор за 2026 год, значение MAX(Time) для всей таблицы изменится, и кэш за 2011 год будет аннулирован и очищен. Это неэффективно.

Вместо этого мы используем кэширование предикатов . Запись в кэше фиксирует конкретное ограничение предложения WHERE в SQL (например, Time BETWEEN start_of_2011 AND end_of_2011).

При добавлении нового обзора 2026 года с помощью инструмента check_predicate_staleness система проверяет MAX(Time) только в пределах среза 2011 года. Поскольку срез 2011 года остается неизменным, система безопасно возвращает Cache HIT. Только при добавлении обзора, датированного конкретно 2011 годом, проверка предиката помечает его как устаревший, обеспечивая высокоэффективную и целенаправленную аннулирование.

Вот последовательность выполнения запроса. ============================================================ = Сценарий 8: Кэширование предикатов (проверка с ограничением по времени) == ============================================================== -> Шаг 1: Первоначальный запрос (ожидается промах, агент выполняет отфильтрованный SQL) [ПОЛЬЗОВАТЕЛЬ]: Сколько отзывов было написано в 2011 году? [СИСТЕМА]: Промах/проход в семантическом кэше. Переадресация агенту… [АГЕНТ]: В 2011 году было написано 59 отзывов. -> Шаг 2: Повторный запрос (ожидается совпадение — фрагмент предиката свежий) [ПОЛЬЗОВАТЕЛЬ]: Сколько отзывов было написано в 2011 году? [СИСТЕМА]: Совпадение в семантическом кэше (маркер свежего предиката) -> В 2011 году было написано 59 отзывов. -> Шаг 3: Добавление НОВОГО отзыва за ДРУГОЙ год (2026)… -> Проверка семантического кэша за 2011 год ПОСЛЕ несвязанного обновления 2026 года: -> ОЖИДАНИЕ: Совпадение в семантическом кэше (фрагмент 2011 года не изменился!) [ПОЛЬЗОВАТЕЛЬ]: Сколько отзывов было написано в 2011 году? [СИСТЕМА]: Срабатывание семантического кэша (новый маркер предиката) -> В 2011 году было написано 59 отзывов. -> Шаг 4: Добавление НОВОГО отзыва В 2011 году… -> Проверка семантического кэша за 2011 год ПОСЛЕ соответствующего обновления 2011 года: -> ОЖИДАНИЕ: Обнаружен устаревший кэш (изменен маркер предиката). Аннулирование. [ПОЛЬЗОВАТЕЛЬ]: Сколько отзывов было написано в 2011 году? [СИСТЕМА]: Обнаружен устаревший кэш (изменен маркер предиката 'Время >= 1293840000 И Время <= 1325375999'). Аннулирование. [СИСТЕМА]: Промах / обход семантического кэша. Переадресация агенту... [АГЕНТ]: В 2011 году было написано 60 отзывов.

Заключение

В этой статье мы продемонстрировали, как избыточность незаметно увеличивает задержку и расход токенов в производственных системах RAG. Мы рассмотрели настройку агентской системы с двумя источниками данных, сочетающую структурированные данные SQL и неструктурированный векторный поиск, и показали, как повторяющиеся запросы излишне запускают идентичные конвейеры извлечения и генерации данных.

Для решения этой проблемы мы внедрили двухуровневую архитектуру кэширования, учитывающую валидацию:

  • Первый уровень (семантический кэш) исключает повторные рассуждения в рамках LLM, мгновенно предоставляя семантически идентичные ответы.
  • Второй уровень (кэш получения данных) позволяет избежать избыточных поисков в базе данных и векторных поисков за счет повторного использования ранее полученного контекста.
  • Многоуровневая проверка данных с помощью агентов — обход временных ограничений, проверки на уровне строк и таблиц, криптографическое хеширование, аннулирование с учетом предикатов и оценка достаточности контекста — гарантирует, что эффективность не достигается за счет корректности.

В результате получилась система, которая не только быстрее и дешевле, но и умнее и безопаснее.

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

Свяжитесь со мной и поделитесь своими комментариями на сайте www.linkedin.com/in/partha-sarkar-lets-talk-AI

Ссылка

Набор данных «Отзывы о товарах Amazon» от Архама Руми (владелец) (CC0: общественное достояние)

Изображения, использованные в этой статье, сгенерированы с помощью Google Gemini. Рисунки и соответствующий код созданы мной.

Источник: towardsdatascience.com

✅ Найденные теги: RAG, Агентная, Архитектура, Безотходная, Кэширование, новости

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Древние гоминиды в саванне изучают растения, рядом пасутся животные и мамонт.
Цилиндр на марсианской поверхности, покрытой красным песком и камнями.
Иллюстрация Боккаччо о чуме во Флоренции: сцены эпидемии и хаоса в городе.
Камера видеонаблюдения на столбе синим небом на фоне.
3D-модель молекулы пиридина: каркас атомов углерода, водорода и азота.
Рулевое колесо электромобиля Lucid с современным дизайном интерьера.
ideipro logotyp
Изолированные среды восстановления становятся важнейшим элементом киберустойчивости.
Запустите модель искусственного интеллекта для преобразования речи в речь в реальном времени локально.
Image Not Found
Камера видеонаблюдения на столбе синим небом на фоне.

Внутри чикагского паноптикума слежки

Для многих жизнь в Чикаго и его окрестностях означает практически постоянное наблюдение во имя общественной безопасности. Познакомьтесь с жителями города, которые взаимодействуют с этим противоречивым пространством. «Я не думаю, что в США есть еще один город с…

Мар 12, 2026
3D-модель молекулы пиридина: каркас атомов углерода, водорода и азота.

«Наноловушки» помогут в извлечении золота из электронных отходов

Индол — один из бензазолов, основы для наноловушек © Wikimedia Commons Химики Томского политехнического университета совместно с коллегами из Китая предложили эффективный, экологический и более безопасный способ извлечения золота из электронных отходов. Для этого ученые разработали двумерные…

Мар 12, 2026
Рулевое колесо электромобиля Lucid с современным дизайном интерьера.

Компания Lucid Motors поставляет Apple CarPlay и Android Auto владельцам внедорожника Gravity.

Вкратце Источник изображений: Lucid Motors Компания Lucid Motors объявила в среду утром, что в четверг выпустит обновление программного обеспечения для владельцев внедорожника Gravity в Северной Америке, которое позволит использовать Apple CarPlay и Android Auto. Владельцы в Европе…

Мар 12, 2026
ideipro logotyp

Изменение роли статистического программиста в фармацевтике: новые сложности и возможности

Комментарий предоставлен Крисом МакСпириттом, Domino. 6 февраля 2026 г. | На протяжении десятилетий роль статистических программистов в разработке лекарственных препаратов была четко определена. Они отвечали за создание проверенных таблиц, списков и диаграмм на основе данных клинических испытаний,…

Мар 12, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых