Продакшн: агентный RAG, стоимость, инструменты и чек-лист
Что отличает учебный RAG от продакшна: агентность, экономика, инструменты и финальный чек-лист.
Агентный RAG — система, где LLM сама решает, искать ли, что искать и сколько раз, вместо одного жёсткого прохода «поиск → ответ».
Агентный RAG
Базовый RAG всегда делает один поиск. Агентный — гибче: модель-агент может переформулировать запрос, искать в несколько шагов, обращаться к разным источникам или вообще не искать, если ответ очевиден.
- Решает, нужен ли поиск: на «привет» искать не надо.
- Многошаговость: сложный вопрос разбивает на под-запросы.
- Выбор инструмента: векторный поиск, SQL, веб — что уместнее.
Цена гибкости — больше вызовов LLM, выше латентность и сложнее отладка.
Стоимость и латентность
Каждый запрос RAG — это деньги и время: эмбеддинг запроса, поиск, и главное — генерация LLM (платим за токены контекста + ответа). Рычаги экономии:
def cost_estimate(context_tokens, answer_tokens,
in_price=0.15, out_price=0.60):
# цены за 1 млн токенов (условные)
cost_in = context_tokens / 1_000_000 * in_price
cost_out = answer_tokens / 1_000_000 * out_price
return cost_in + cost_out
big = cost_estimate(context_tokens=8000, answer_tokens=300)
small = cost_estimate(context_tokens=1500, answer_tokens=300)
print(f"Большой контекст: ${big:.6f} за запрос")
print(f"Узкий контекст: ${small:.6f} за запрос")
print(f"Экономия: {(1 - small / big) * 100:.0f}%")Вывод:
Большой контекст: $0.001380 за запрос Узкий контекст: $0.000405 за запрос Экономия: 71%
Видно, почему «меньше, но релевантнее» — это не только про качество, но и про деньги: урезание контекста с 8000 до 1500 токенов экономит ~70% на запрос. На миллионах запросов это огромная разница.
Другие рычаги: кэшировать частые ответы, брать модель эмбеддингов поменьше, реранкингом сокращать k, выбирать модель генерации под задачу.
Инструменты (для чтения)
LangChain и LlamaIndex — фреймворки, собирающие весь пайплайн из готовых блоков: загрузчики, сплиттеры, векторные стораджи, ретриверы, цепочки. Экономят код, но добавляют абстракции.
# LlamaIndex: RAG в несколько строк
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
docs = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(docs) # парсинг+чанкинг+эмбеддинг+индекс
engine = index.as_query_engine(similarity_top_k=4)
print(engine.query("Какие условия возврата?"))Учебно полезно собрать RAG руками (как мы и делали), а в проде — взять фреймворк, понимая, что он делает под капотом.
Чек-лист запуска RAG
| Этап | Проверить |
| Данные | чистый парсинг, без мусора и колонтитулов |
| Чанкинг | подобран размер и overlap, факты не рвутся |
| Эмбеддинги | одна модель для базы и запроса, знает русский |
| Поиск | метрика под модель, разумный k, при нужде гибрид+реранк |
| Промпт | «только по контексту», цитаты, защита от выдумок |
| Оценка | recall@k и faithfulness на тестовом наборе |
| Прод | кэш, лимиты, мониторинг стоимости и латентности |
Итог курса
- RAG даёт LLM доступ к вашим данным: найти → подставить → ответить.
- Ядро — эмбеддинги, косинусная близость и векторный поиск (вы написали их руками).
- Качество решают чанкинг, релевантность извлечения и дисциплина промпта.
- В проде следите за оценкой, стоимостью и латентностью; фреймворки лишь упрощают сборку.