Semantic Search для CRM: как мы построили векторный поиск на Azure OpenAI и Qdrant
- Sarov+

- 4 days ago
- 3 min read
Поиск в CRM — одна из тех вещей, которые кажутся очевидными, пока не начинаешь с ними работать вплотную. Стандартный keyword-поиск находит только то, что написано буква в букву, но совершенно не понимает смысл запроса. Мы решили это изменить и построили систему Semantic Search на базе DRAZI, Azure OpenAI и Qdrant — векторной базы данных, которая ищет не по словам, а по содержанию. В этой статье делимся архитектурой, проблемами, с которыми столкнулись, и выводами, которые из этого вынесли.
А узнать больше можно в нашем видео:
Почему обычный поиск в CRM не справляется
Главная проблема стандартного CRM-поиска — он работает по ключевым словам и не понимает контекст. Если пользователь формулирует запрос иначе, чем записано в базе, система просто не находит нужный результат. Нам была нужна принципиально другая логика: поиск, который ранжирует результаты по смысловой близости, а не фильтрует по точному совпадению слов.
Архитектура решения
Идея была простой: взять данные из CRM, преобразовать их в векторное представление и использовать его для смыслового поиска. Пайплайн выглядит следующим образом:
данные из Dataverse → обработка как Stream → генерация Embeddings через Azure OpenAI → сохранение в Qdrant → запросы через Power Automate или любую другую интеграцию.
Таким образом получился полный цикл от сырых данных до AI-поиска в реальном времени.
Инфраструктура и компоненты
Для развёртывания системы была поднята Azure-виртуальная машина на Ubuntu. На ней установили Docker и развернули Kubernetes через K3S. DRAZI работает внутри кластера, а Qdrant вынесен отдельно как Docker-контейнер с открытыми портами 6333 и 6334 — это позволило обращаться к векторной базе напрямую через API извне.
Важный момент по безопасности: несмотря на то что база стала публично доступной, подключиться к ней может только тот IP-адрес, который зарегистрирован на уровне виртуальной машины. Это базовый, но рабочий уровень защиты.
Настройка пайплайна
Настройка состояла из нескольких шагов. Сначала был создан source-коннектор к Dataverse, затем настроен Continuous Query, который извлекает нужные поля из таблиц. После этого добавили Reaction — она генерирует embeddings и записывает их в Qdrant. В результате данные начали синхронизироваться автоматически без ручного вмешательства.
Проблемы и как мы их решали
Qdrant недоступен снаружи. Изначально Qdrant находился внутри Kubernetes-кластера, и Power Automate не мог до него достучаться. Решение оказалось простым: вынесли Qdrant в отдельный Docker-контейнер и открыли порты на VM.
Лимиты на обработку данных. В таблице было около 17 000 записей, и при попытке синхронизировать их все сразу мы упёрлись в ограничения подписки Embedding-модели. Поскольку основная цель была протестировать сам подход, мы просто почистили тестовые данные и продолжили работу с меньшим объёмом.
Некорректные коллекции в Qdrant. В процессе экспериментов и перезапусков Qdrant создавал пустые коллекции, которые давали некорректные результаты поиска. Чтобы получить чистое состояние системы, пришлось полностью очистить коллекции и перезапустить всё с нуля — после этого всё заработало корректно.
Результат
После устранения всех проблем система заработала в полном объёме: около 300 записей успешно проиндексированы, embeddings сгенерированы, Semantic Search возвращает релевантные результаты. База данных доступна извне и готова к использованию в Power Automate и других интеграциях.
Заключение
Построить Semantic Search для CRM реально — и это не так сложно, как кажется на старте. Главное, что мы вынесли из этого опыта: нужно контролировать объём данных и учитывать лимиты подписки на Embedding-модель ещё на этапе планирования. И важно помнить, что Vector Search — это не улучшенный keyword-поиск, а принципиально другой подход: он не фильтрует результаты, а ранжирует их по смысловой близости. Именно это делает его по-настоящему полезным инструментом для работы с данными CRM.



Comments