Как я построил умный поиск по 3500 контактам за 2 часа
Семантический поиск по контактам с Qdrant — CRM, которая понимает смысл запроса.
Как я построил умный поиск по 3500 контактам за 2 часа
У меня накопилось 3500 контактов из разных Telegram-чатов. Фаундеры, креаторы, разработчики — все в одном JSON. Искать что-то конкретное было мучением.
Раньше я открывал файл, писал jq-запросы, фильтровал по полям. Хочешь найти “фаундеров в Берлине кто интересуется AI”? Удачи с булевой логикой.
Сегодня я собрал решение, которое позволяет просто спросить: “Найди фаундеров в Берлине кто занимается AI”. И получить список.
Что получилось
Локальный MCP-сервер, который:
- Берёт мою CRM (JSON с контактами)
- Превращает каждый контакт в вектор через embeddings
- Хранит всё в Qdrant Cloud
- Позволяет искать через Claude Desktop на естественном языке
Теперь в Claude Desktop я просто пишу:
“Найди похожих на этого контакта”
“Кто из контактов занимается маркетингом и живёт в США?”
“Креаторы с большой аудиторией”
И получаю релевантные результаты. Без jq, без фильтров, без боли.
Стек
- Qdrant Cloud — бесплатный tier, 1GB хранилища
- Embedding API —
text-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”
- “запускаю свой сервис”
Даже если слово “продукт” нигде не встречается — найдёт по смыслу. Эмбеддинги кодируют значение, а не буквы.
Что дальше
Сейчас данные статичные — после парсинга нужно переиндексировать. Планирую:
- Автоматическая переиндексация при обновлении CRM
- Фильтры — комбинировать семантику с точными условиями (например, по роли и городу)
- Интеграция с outreach — искать похожих на тех, кто уже ответил
Итого
| Что | Сколько |
|---|---|
| Время на настройку | ~2 часа |
| Контактов в базе | ~3,500 |
| Контактов с данными | ~1,500 |
| Стоимость индексации | < $0.01 |
| Qdrant Cloud | бесплатно |
Vibe coding в чистом виде: вместо того чтобы писать сложные фильтры, научил AI понимать мои запросы. Теперь CRM — это разговор, а не SQL.