Обычный поиск по базе ищет совпадение слов. Спросите «чем лечить кашель», а в документе написано «терапия при бронхите», и он не найдёт ничего.
Векторный поиск решает это, но ломается на обратном: точные артикулы, номера договоров, фамилии он находит хуже, чем простое совпадение строки.
Здесь работают оба сразу. Запрос идёт одновременно в PostgreSQL на точное совпадение и в векторную базу на близость по смыслу, результаты сливаются в общий список, и по нему модель формулирует ответ со ссылками на источники.
Работает асинхронно, поэтому запросы не ждут друг друга. Три сервиса в Docker, разворачивается одной командой.
Где это нужно. Поиск по каталогу, где есть и артикулы, и описания. База документов, где ищут и по номеру, и по смыслу. Внутренняя справочная, где сотрудник спрашивает обычными словами, а данные лежат структурированно.
Код открыт: github.com/Vadtop/sql-rag-pipeline
Стек: Python, FastAPI, PostgreSQL, Qdrant, asyncpg, OpenAI, Docker.
https://github.com/Vadtop/sql-rag-pipeline