Вопрос проверяет понимание концепции кэшированного RAG (Cached Augmented Generation), который оптимизирует производительность RAG-систем за счет кэширования результатов поиска и генерации.
Cached Augmented Generation (кэшированный RAG) — это эволюция классического подхода Retrieval-Augmented Generation (RAG), направленная на повышение производительности и снижение затрат. В традиционном RAG каждый запрос пользователя проходит полный цикл: поиск релевантных документов в векторной базе данных, передача контекста в LLM и генерация ответа. Кэшированный RAG добавляет слой кэширования, который сохраняет результаты предыдущих запросов.
Система кэширует как промежуточные результаты поиска (например, эмбеддинги запросов и найденные документы), так и финальные ответы LLM. При поступлении нового запроса сначала вычисляется его эмбеддинг и сравнивается с кэшированными. Если находится достаточно похожий запрос (по косинусной близости), система может вернуть кэшированный ответ или использовать кэшированный контекст для быстрой генерации.
import hashlib
from functools import lru_cache
class CachedRAG:
def __init__(self, llm, vector_store, cache_size=100):
self.llm = llm
self.vector_store = vector_store
self.cache = lru_cache(maxsize=cache_size)(self._generate)
def _generate(self, query_hash):
# Восстанавливаем запрос по хешу (упрощенно)
query = self._reverse_hash(query_hash)
# Поиск документов
docs = self.vector_store.similarity_search(query, k=3)
context = "\n".join(docs)
# Генерация ответа
return self.llm.generate(f"Context: {context}\nQuery: {query}")
def answer(self, query):
query_hash = hashlib.md5(query.encode()).hexdigest()
return self.cache(query_hash)Кэшированный RAG особенно полезен в production-средах, где важна скорость ответа и экономия ресурсов. Он позволяет обрабатывать повторяющиеся запросы мгновенно, не нагружая LLM и векторную базу данных, что делает его идеальным для высоконагруженных систем с предсказуемыми паттернами запросов.