RAG за два дня: что нужно, а что — нет
Если коротко
- За два дня — не прод. Понимание. Понимание дороже прода.
- Четыре компонента и одна цепочка вызовов. Всё лишнее — отложить.
- Одна типичная ловушка, на которую попадает почти каждый.
~4s loop, ease-out: a horizontal pipeline of 5 boxes labeled "doc → chunks → embeddings → vector db → answer". Each box lights up in sequence with a soft indigo glow and a check-mark at the end of the cycle. White background, clean line work, transparent background, 800x400, ~24fps.
За выходные не строят прод. Строят понимание.
Без понимания вы будете три месяца настраивать гиперпараметры в чужой архитектуре. С пониманием — поймёте за час, что именно нужно поменять.
Минимум — четыре компонента
- Чанкер — режет документы на куски по 600-800 символов с лёгким перекрытием.
- Эмбеддер — превращает чанки в векторы. Для русско-узбекского контента берите bge-m3 или multilingual-e5.
- Векторное хранилище — на старте хватит Qdrant в Docker или даже pgvector в Postgres.
- LLM-клиент — любой OpenAI-совместимый. На два дня можно платный API.
Это всё. Никаких re-ranker'ов, никаких гибридных поисков, никакого agent-loop'а. Цепочка: загружаем → чанкуем → эмбеддим → кладём в векторку. На запрос — эмбеддим вопрос, top-5 ближайших → в промпт → ответ.
Что обязательно — с первого дня
Цитаты к ответу. Возвращайте не только текст, но и какие чанки использованы. Без этого вы не отличите хороший ответ от уверенной галлюцинации. Пять строк кода, и вся система становится управляемой.
20 размеченных вопросов. До запуска чего-либо соберите эвал-сет: вопрос → ожидаемый чанк. Это ваш компас при любом изменении. Без эвалов невозможно сказать «стало лучше», только «по ощущениям лучше».
Логи запросов и контекста. В файл: вопрос, какие чанки вытащены, что ответила модель. Через неделю это покажет, где модель проседает — и где проседает не модель, а ретривер.
От чего отказаться (пока)
- Re-ranker. Прирост есть, но смысл — после того, как базовый поиск нормально работает.
- Гибридный поиск (BM25 + векторы). Подключайте после первых жалоб «не находит точную фразу».
- Тонкая разметка чанков. 800 символов и перекрытие 120 — рабочий старт. Тюнинг — потом.
- Глубокий промпт-инжиниринг. Один разумный промпт по образцу. Это редко становится узким местом.
Ловушка: документ в эмбеддер целиком
Самая частая беда первого RAG — отправка целого документа в эмбеддер одним куском.
Эмбеддинг становится «средним по больнице». Поиск работает плохо, и непонятно, почему.
Чанкуйте всегда. Даже короткий PDF на пять страниц — это минимум 8-10 чанков, не один эмбеддинг на документ. Скажу иначе: если на ваш PDF приходится один вектор — вы построили не поиск, а лотерею.
- Поднимите Qdrant в Docker и напишите скрипт на 50 строк: загрузка PDF → чанки → эмбеддинги → upsert.
- Соберите 20 вопросов по вашим документам — это ваш будущий эвал-сет.
- Дальше — «До миллиона эмбеддингов не уходите из Postgres».