edit_square igindin

Comment j'ai construit une recherche intelligente sur ~3500 contacts en 2 heures

Recherche sémantique dans le CRM avec Qdrant Cloud et Claude Code. Plus de filtres — je pose des questions en langage naturel

Ilya Gindin
translate de  · en  · es  · pt-br  · ru
lire la version ilao dzindin arrow_forward

J’avais accumulé ~3500 contacts issus de différents chats Telegram. Founders, créateurs, développeurs — tout dans un seul JSON. Trouver quelque chose de précis était un calvaire.

Avant, j’ouvrais le fichier, j’écrivais des requêtes jq, je filtrais par champs. Tu veux trouver des “founders à Berlin qui s’intéressent à l’AI” ? Bonne chance avec la logique booléenne.

Aujourd’hui, j’ai construit une solution qui permet de simplement demander : “Trouve des founders à Berlin qui travaillent sur l’AI”. Et d’obtenir une liste.

Ce que ça donne

Un serveur MCP local qui :

  • Prend mon CRM (JSON avec les contacts)
  • Transforme chaque contact en vecteur via des embeddings
  • Stocke tout dans Qdrant Cloud
  • Permet de chercher depuis Claude Desktop en langage naturel

Maintenant dans Claude Desktop j’écris simplement :

“Trouve des personnes similaires à ce contact”

“Quels contacts travaillent dans le marketing et habitent aux États-Unis ?”

“Créateurs avec une grande audience”

Et j’obtiens des résultats pertinents. Sans jq, sans filtres, sans souffrance.

Stack

  • Qdrant Cloud — tier gratuit, 1Go de stockage
  • Embedding APItext-embedding-3-small pour les embeddings
  • MCP (Model Context Protocol) — intégration avec Claude Desktop
  • TypeScript — pour le serveur MCP

Architecture

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

                    ┌───────────────┴───────────────┐
                    │                               │
                    ▼                               ▼
        ┌───────────────────┐          ┌───────────────────┐
        │   Qdrant Cloud    │          │   Embedding API   │
        │   (vecteurs)      │          │   (embeddings)    │
        └───────────────────┘          └───────────────────┘

Le serveur MCP tourne localement, mais les données sont dans le cloud. Ça signifie :

  • Recherche rapide (Qdrant est optimisé pour les vecteurs)
  • Utilisable depuis n’importe quel appareil
  • Gratuit aux volumes actuels

Comment j’ai construit ça

1. Parsing des contacts

J’ai collecté des contacts depuis plusieurs chats Telegram via l’API MTProto. J’ai parsé environ 8 communautés de thématiques variées — des techniques aux créatives. Résultat : ~3500 contacts uniques.

2. Enrichissement des données

À partir des username + first_name bruts, j’ai extrait :

  • Les rôles (founder, developer, creator)
  • Les entreprises
  • Les localisations
  • Les cohortes par centres d’intérêt

Après enrichissement, ~1500 contacts avaient suffisamment de données pour une recherche de qualité.

3. Qdrant Cloud

J’ai créé un cluster sur cloud.qdrant.io — ça m’a pris 2 minutes. Le tier gratuit offre 1Go, largement suffisant pour des dizaines de milliers de contacts.

4. Indexation

J’ai chargé les contacts enrichis dans Qdrant — ~90 secondes pour toute la base. Coût des embeddings : moins d’un centime.

5. Serveur MCP

J’ai écrit un serveur MCP en TypeScript et je l’ai connecté à Claude Desktop. Le serveur reçoit une requête textuelle, génère un embedding et cherche les voisins les plus proches dans Qdrant.

La configuration, c’est le claude_desktop_config.json standard avec trois variables d’environnement (clés API et URL du cluster).

J’ai redémarré Claude Desktop — c’était prêt.

Pourquoi la recherche sémantique

La recherche classique cherche des correspondances exactes de mots. La sémantique — par le sens.

J’écris : “des gens qui construisent des produits”

Je trouve :

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

Même si le mot “produit” n’apparaît nulle part — ça trouve par le sens. Les embeddings encodent la signification, pas les lettres.

La suite

Pour l’instant les données sont statiques — après le parsing il faut réindexer. Je prévois :

  1. Réindexation automatique lors des mises à jour du CRM
  2. Filtres — combiner la sémantique avec des conditions exactes (par exemple par rôle et ville)
  3. Intégration avec l’outreach — chercher des profils similaires à ceux qui ont déjà répondu

Bilan

QuoiCombien
Temps de configuration~2 heures
Contacts dans la base~3 500
Contacts avec données~1 500
Coût de l’indexation< 0,01 $
Qdrant Cloudgratuit

Du vibe coding à l’état pur : au lieu d’écrire des filtres complexes, j’ai appris à l’AI à comprendre mes requêtes. Maintenant le CRM, c’est une conversation, pas du SQL.

← arrow keys or swipe →