Поиск, который находит и по точному слову, и по смыслу

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