edit_square igindin

Как я построил умный поиск по 3500 контактам за 2 часа

Семантический поиск по контактам с Qdrant — CRM, которая понимает смысл запроса.

Ilya Gindin

Как я построил умный поиск по 3500 контактам за 2 часа

У меня накопилось 3500 контактов из разных Telegram-чатов. Фаундеры, креаторы, разработчики — все в одном JSON. Искать что-то конкретное было мучением.

Раньше я открывал файл, писал jq-запросы, фильтровал по полям. Хочешь найти “фаундеров в Берлине кто интересуется AI”? Удачи с булевой логикой.

Сегодня я собрал решение, которое позволяет просто спросить: “Найди фаундеров в Берлине кто занимается AI”. И получить список.

Что получилось

Локальный MCP-сервер, который:

  • Берёт мою CRM (JSON с контактами)
  • Превращает каждый контакт в вектор через embeddings
  • Хранит всё в Qdrant Cloud
  • Позволяет искать через Claude Desktop на естественном языке

Теперь в Claude Desktop я просто пишу:

“Найди похожих на этого контакта”

“Кто из контактов занимается маркетингом и живёт в США?”

“Креаторы с большой аудиторией”

И получаю релевантные результаты. Без jq, без фильтров, без боли.

Стек

  • Qdrant Cloud — бесплатный tier, 1GB хранилища
  • Embedding APItext-embedding-3-small для эмбеддингов
  • MCP (Model Context Protocol) — интеграция с Claude Desktop
  • TypeScript — для MCP-сервера

Архитектура

┌─────────────────────────────────────────────────────┐
│  Mac                                                │
│  ┌──────────────┐      ┌──────────────────────┐    │
│  │Claude Desktop│ ───▶ │  MCP-сервер (node)   │    │
│  └──────────────┘      └──────────┬───────────┘    │
└───────────────────────────────────┼────────────────┘

                    ┌───────────────┴───────────────┐
                    │                               │
                    ▼                               ▼
        ┌───────────────────┐          ┌───────────────────┐
        │   Qdrant Cloud    │          │   Embedding API   │
        │   (векторы)       │          │   (эмбеддинги)    │
        └───────────────────┘          └───────────────────┘

MCP-сервер крутится локально, но данные в облаке. Это значит:

  • Быстрый поиск (Qdrant оптимизирован под векторы)
  • Можно использовать с любого устройства
  • Бесплатно на текущих объёмах

Как собирал

1. Парсинг контактов

Собрал контакты из нескольких Telegram-чатов через MTProto API. Парсил около 8 сообществ разной тематики — от технических до творческих. Получил ~3500 уникальных контактов.

2. Обогащение данных

Из сырых username + first_name извлёк:

  • Роли (founder, developer, creator)
  • Компании
  • Локации
  • Когорты по интересам

После обогащения ~1500 контактов имели достаточно данных для качественного поиска.

3. Qdrant Cloud

Создал кластер на cloud.qdrant.io — заняло 2 минуты. Free tier даёт 1GB, этого хватит на десятки тысяч контактов.

4. Индексация

Загрузил обогащённые контакты в Qdrant — ~90 секунд на всю базу. Стоимость эмбеддингов: меньше цента.

5. MCP-сервер

Написал MCP-сервер на TypeScript и подключил к Claude Desktop. Сервер принимает текстовый запрос, генерирует эмбеддинг и ищет ближайших соседей в Qdrant.

Настройка — стандартная конфигурация claude_desktop_config.json с тремя environment-переменными (ключи API и URL кластера).

Перезапустил Claude Desktop — готово.

Почему семантический поиск

Классический поиск ищет по точным совпадениям слов. Семантический — по смыслу.

Пишу: “люди кто строит продукты”

Нахожу:

  • “founder of startup X”
  • “building my own project”
  • “indie hacker”
  • “запускаю свой сервис”

Даже если слово “продукт” нигде не встречается — найдёт по смыслу. Эмбеддинги кодируют значение, а не буквы.

Что дальше

Сейчас данные статичные — после парсинга нужно переиндексировать. Планирую:

  1. Автоматическая переиндексация при обновлении CRM
  2. Фильтры — комбинировать семантику с точными условиями (например, по роли и городу)
  3. Интеграция с outreach — искать похожих на тех, кто уже ответил

Итого

ЧтоСколько
Время на настройку~2 часа
Контактов в базе~3,500
Контактов с данными~1,500
Стоимость индексации< $0.01
Qdrant Cloudбесплатно

Vibe coding в чистом виде: вместо того чтобы писать сложные фильтры, научил AI понимать мои запросы. Теперь CRM — это разговор, а не SQL.

← стрелки или свайп →