Продакшн: агентный 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 доступ к вашим данным: найти → подставить → ответить.
  • Ядро — эмбеддинги, косинусная близость и векторный поиск (вы написали их руками).
  • Качество решают чанкинг, релевантность извлечения и дисциплина промпта.
  • В проде следите за оценкой, стоимостью и латентностью; фреймворки лишь упрощают сборку.
Проверьте себя
1. Чем агентный RAG отличается от базового?
AОн не использует векторы
BLLM сама решает, искать ли, что и сколько раз, вместо одного жёсткого прохода
CОн работает без LLM
DОн всегда дешевле
2. Какой рычаг сильнее всего снижает стоимость запроса RAG?
AУвеличить k до максимума
BПодавать меньше, но релевантнее контекста (меньше входных токенов)
CУвеличить размерность эмбеддингов
DОтключить цитирование
3. Какова роль LangChain и LlamaIndex?
AЭто модели эмбеддингов
BФреймворки, собирающие пайплайн RAG из готовых блоков
CЭто векторные базы данных
DЭто метрики оценки
Поддержать проект