Bien démarrer avec Qdrant !

1. Qu’est-ce qu’une base de données vectorielle ?

Traditionnellement, les bases de données relationnelles (SQL) ou NoSQL gèrent des données structurées ou semi-structurées. Cependant, avec l’avènement des modèles de langage (LLM) et de l’IA, nous avons besoin de stocker et de rechercher des données sous forme de vecteurs (embeddings). Les bases de données vectorielles (ou vector stores) sont conçues pour :

  • Enregistrer des vecteurs de grande dimension (ex. 768, 1536, 2048 dimensions…).

  • Offrir une recherche de similarité efficace (e.g. similarité cosinus, distance Euclidienne, etc.).

  • Permettre une mise à l’échelle pour gérer des millions (voire des milliards) de vecteurs.

Qdrant est l’une de ces bases de données vectorielles, libre et open source, qui se distingue par sa simplicité d’utilisation et ses performances.


2. Présentation de Qdrant

Qdrant est un moteur de recherche vectorielle et de recommandation. Ses points forts :

  • Open Source (Licence Apache 2.0).

  • Performant pour des recherches de similarité (ANN: Approximate Nearest Neighbor).

  • API REST et client officiel (en Python, Go, JavaScript, etc.) simples à utiliser.

  • Scalabilité : Qdrant propose une version Cloud managée, ou vous pouvez héberger vous-même (docker, etc.).

Terminologie :

  1. Collection : c’est l’équivalent d’une “table” dans Qdrant. Chaque collection stocke des points (ou documents vectorisés) ayant la même dimension pour les vecteurs.

  2. Points (ou documents) : chaque point possède :

    • Un id unique,

    • Un vecteur (la représentation numérique de votre texte / image / etc.),

    • Un payload (métadonnées libres au format JSON).

  3. Distance : la métrique de comparaison entre vecteurs (COSINE, Euclidean, Dot, etc.).


3. Installation et prise en main

Il existe plusieurs manières d’utiliser Qdrant :

  1. Localement : via Docker ou un binaire à installer.

  2. Qdrant Cloud : solution managée (vous créez un compte, vous obtenez une URL et une clé API).

3.1. Démarrer Qdrant en local (avec Docker)

bashCopierModifierdocker run -p 6333:6333 \
    -v $(pwd)/qdrant_storage:/qdrant/storage \
    qdrant/qdrant
  • Le serveur Qdrant écoute alors par défaut sur le port 6333.

  • Les données sont persistées dans le dossier qdrant_storage.

  • Vous pouvez maintenant appeler l’API REST sur http://localhost:6333.

3.2. Accéder à l’API REST

Pour vérifier que ça fonctionne, lancez un :

bashCopierModifiercurl http://localhost:6333/collections

Vous devriez recevoir quelque chose comme :

jsonCopierModifier{
  "status": "ok",
  "result": {
    "collections": []
  }
}

Cela signifie que vous n’avez aucune collection pour le moment, ce qui est normal.


4. Créer et gérer une collection

Pour travailler avec Qdrant, il y a deux moyens courants :

  1. API REST (via requêtes HTTP).

  2. Clients officiels (Python, Go, Node.js, etc.).

Dans ce cours d’initiation, on va surtout montrer la version Python (car c’est souvent le langage privilégié dans les projets IA), mais le principe est le même avec l’API REST ou un autre client.

4.1. Installation du client Python

bashCopierModifierpip install qdrant-client

4.2. Se connecter à Qdrant (Python)

pythonCopierModifierfrom qdrant_client import QdrantClient

# Si Qdrant tourne en local :
qdrant_client = QdrantClient(url="http://localhost:6333")

# Si vous avez un compte Qdrant Cloud :
# qdrant_client = QdrantClient(url="https://<CLUSTER_ID>.cloud.qdrant.io", api_key="VOTRE_CLE_API")

4.3. Créer une collection

Imaginons que nous travaillons avec des embeddings de dimension 1536 (comme ceux produits par le modèle OpenAI text-embedding-ada-002). On crée une collection nommée "my_collection" :

pythonCopierModifierfrom qdrant_client.models import VectorParams, Distance

qdrant_client.recreate_collection(
    collection_name="my_collection",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)
  • size=1536 : la dimension du vecteur.

  • distance=Distance.COSINE : la métrique de similarité (distance cosinus).

Remarque : recreate_collection supprime la collection si elle existe déjà et la recrée. Vous pouvez utiliser create_collection si vous ne voulez pas la recréer à chaque fois.


5. Insérer des vecteurs (points) dans la collection

Pour alimenter Qdrant, on stocke des “points”, c’est-à-dire :

  • id : un identifiant unique (entier ou chaîne de caractères).

  • vector : la liste (un tableau) de dimensions = 1536 (dans notre exemple).

  • payload : un dictionnaire JSON contenant des métadonnées arbitraires.

5.1. Exemple de données à insérer

Imaginons que vous avez déjà généré un embedding pour une phrase :

  • Embedding (1536 floats)

  • Métadonnées : { "text": "Ceci est un texte", "source": "wiki" }

On peut faire un upsert :

pythonCopierModifierpoints = [
    {
        "id": 1,
        "vector": [0.1, 0.2, 0.3, ..., 0.0005],  # 1536 valeurs
        "payload": {
            "text": "Ceci est un texte",
            "source": "wiki"
        }
    },
    {
        "id": 2,
        "vector": [0.07, 0.22, 0.31, ..., 0.0012],  # 1536 valeurs
        "payload": {
            "text": "Un autre exemple de phrase",
            "source": "blog"
        }
    }
]

qdrant_client.upsert(
    collection_name="my_collection",
    points=points
)

Le paramètre upsert signifie : “insérer ou mettre à jour”. Si l’id existe déjà, il sera mis à jour.


6. Rechercher des points par similarité

La fonctionnalité clé de Qdrant est la recherche de similarité. On lui fournit un vecteur de requête, et il renvoie les points (documents) les plus proches selon la métrique définie.

Principe :

  1. Vous générez l’embedding de votre requête (ou d’un nouveau texte).

  2. Vous appelez la fonction search en passant le vecteur.

  3. Qdrant renvoie un classement (score) des points les plus similaires.

6.1. Exemple en Python

pythonCopierModifierquery_vector = [0.12, 0.29, 0.05, ..., 0.00009]  # 1536 valeurs
search_results = qdrant_client.search(
    collection_name="my_collection",
    query_vector=query_vector,
    limit=3  # récupérer les 3 plus proches
)

for result in search_results:
    print("ID:", result.id)
    print("Score:", result.score)
    print("Payload:", result.payload)
    print("------")
  • result.score représente la distance ou la similarité (selon la métrique choisie).

  • result.payload contient vos métadonnées (text, source, etc.).


7. Gestion avancée

7.1. Filtres sur le payload

Vous pouvez filtrer les points selon leurs métadonnées. Par exemple, récupérer uniquement les points dont source = "wiki" :

pythonCopierModifierfrom qdrant_client.models import Filter, FieldCondition, MatchValue

search_results = qdrant_client.search(
    collection_name="my_collection",
    query_vector=query_vector,
    limit=3,
    query_filter=Filter(
        must=[
            FieldCondition(
                key="source",
                match=MatchValue(value="wiki")
            )
        ]
    )
)

7.2. Mise à jour / suppression d’un point

  • Mise à jour : On utilise à nouveau upsert pour réécrire un point avec le même id.

  • Suppression :

      pythonCopierModifierqdrant_client.delete(
          collection_name="my_collection",
          points_selector=[1, 2]  # liste des ids à supprimer
      )
    

7.3. Import massif

Pour importer des milliers (ou millions) de points, il est préférable de faire du batch (par paquets) au lieu de one-by-one. Qdrant gère aussi l’import via CSV ou un dump complet, mais dans de nombreux scénarios, on utilise un script Python en batch.


8. Hébergement et production

8.1. Qdrant Cloud

Si vous ne voulez pas gérer l’infrastructure vous-même, vous pouvez vous inscrire sur Qdrant Cloud. Vous obtiendrez :

  • Une URL de type https://<cluster_id>.cloud.qdrant.io

  • Une clé API associée

Cela permet d’utiliser la même API et le même client Python, avec du SSL/TLS et une gestion scalable.

8.2. Sécurité et authentification

  • En local, Qdrant ne nécessite pas d’authentification (par défaut).

  • En production, vous devriez le protéger derrière un proxy ou un pare-feu, ou activer l’authentification.

  • Dans Qdrant Cloud, il faut un api_key pour chaque requête.


9. Intégration avec l’IA (use case typique)

  1. Embeddings : vous générez les embeddings de textes, d’articles, de documents, en utilisant par exemple OpenAI, Hugging Face, etc.

  2. Stockage : vous insérez ces embeddings dans Qdrant (chaque embedding dans une collection, payload = contenu original ou métadonnées).

  3. Recherche de similarité : quand un utilisateur pose une question, vous générez l’embedding de la question, vous interrogez Qdrant pour obtenir les chunks les plus similaires, puis vous donnez ces informations à un modèle de langage (LLM) pour formuler une réponse enrichie.

C’est la base des “chatbots connectés à une base documentaire” ou de la “recherche sémantique” dans des documents.


10. Synthèse

Qdrant est une solution pratique et performante pour :

  1. Gérer des données sous forme de vecteurs.

  2. Effectuer des recherches de similarité (ANN) rapides.

  3. Gérer l’évolutivité grâce à son mode Cloud ou en local (conteneur Docker).

Le flux de travail type :

  1. Préparer vos données (textes, images, etc.) et générer les embeddings.

  2. Créer une collection dans Qdrant (choisir la bonne dimension et la métrique).

  3. Upsert (insérer) vos vecteurs avec un ID et des métadonnées (payload).

  4. Rechercher par similarité à l’aide de search.

  5. (Optionnel) Gérer des filtres, la mise à jour et la suppression de points.


Ressources supplémentaires

  • Site officiel : qdrant.tech

  • Documentation : Qdrant Documentation

  • Exemples en Python : Qdrant GitHub

  • Blog / Tutoriels : Qdrant Blog

  • Qdrant + LangChain : des intégrations existent pour gérer le stockage vectoriel et la recherche dans LangChain (VectorStore).

Vous avez maintenant les bases pour commencer à utiliser Qdrant. Bon apprentissage !

0
Subscribe to my newsletter

Read articles from Chatbot-Entreprise directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Chatbot-Entreprise
Chatbot-Entreprise