qdrant-search-speed-optimization

Par github · awesome-copilot

Diagnostique et corrige les recherches Qdrant lentes. À utiliser lorsqu'un utilisateur signale que « la recherche est lente », « la latence est élevée », « les requêtes prennent trop de temps », « le QPS est faible », « le débit est trop bas », « la recherche filtrée est lente » ou « la recherche était rapide mais elle l'est moins maintenant ». À utiliser également lorsque les performances de recherche se dégradent après des modifications de configuration ou une croissance des données.

npx skills add https://github.com/github/awesome-copilot --skill qdrant-search-speed-optimization

Diagnostiquer un problème

Il y a plusieurs raisons possibles à une dégradation des performances de recherche. Les plus courantes sont :

  • Pression mémoire : si l'ensemble de travail dépasse la RAM disponible
  • Requêtes complexes (par exemple, hnsw_ef élevé, filtres complexes sans index de payload)
  • Processus en arrière-plan concurrents (par exemple, l'optimiseur encore en cours d'exécution après un chargement en masse)
  • Problème avec le cluster (par exemple, problèmes réseau, dégradation du matériel)

Requête unique trop lente (latence)

À utiliser quand : les requêtes individuelles prennent trop de temps indépendamment de la charge.

Étapes de diagnostic :

  • Vérifier si la deuxième exécution de la même requête est nettement plus rapide (indique une pression mémoire)
  • Essayer la même requête avec with_payload: false et with_vectors: false pour voir si la récupération du payload est le goulot d'étranglement
  • Si la requête utilise des filtres, essayer de les supprimer un par un pour identifier si une condition de filtre spécifique est le goulot d'étranglement

Correctifs courants :

Ne peut pas traiter assez de QPS (débit)

À utiliser quand : le système ne peut pas servir assez de requêtes par seconde sous charge.

La recherche filtrée est lente

À utiliser quand : la recherche filtrée est nettement plus lente que non filtrée. Plainte SA la plus courante après la mémoire.

  • Créer un index de payload sur le champ filtré Payload index
  • Utiliser is_tenant=true pour la condition de filtrage primaire : Tenant index
  • Essayer l'algorithme ACORN pour les filtres complexes : ACORN
  • Éviter d'utiliser les conditions de filtrage nested comme filtre primaire. Cela peut forcer qdrant à lire les valeurs de payload brutes au lieu d'utiliser l'index.
  • Si l'index de payload a été ajouté après la construction HNSW, déclencher la réindexation pour créer les liens de sous-graphe filtrables

Optimiser les performances de recherche avec les mises à jour parallèles

Étapes de diagnostic

  • Essayer de lancer la même requête avec le paramètre indexed_only=true, si la requête est nettement plus rapide, cela signifie que l'optimiseur est encore en cours d'exécution et n'a pas encore indexé tous les segments.
  • Si l'utilisation du CPU ou des entrées/sorties est élevée même sans requêtes, cela indique également que l'optimiseur est encore en cours d'exécution.

Changements de configuration recommandés

  • réduire optimizer_cpu_budget pour réserver plus de CPU aux requêtes
  • Utiliser prevent_unoptimized=true pour éviter de créer des segments avec une grande quantité de données non indexées pour les recherches. À la place, une fois qu'un segment atteint le seuil d'indexation, tous les points supplémentaires seront ajoutés dans l'« état différé ».

En savoir plus ici

Ce qu'il NE FAUT PAS faire

  • Définir always_ram=false sur la quantification (thrashing disque à chaque recherche)
  • Mettre HNSW sur disque pour la production sensible à la latence (seulement pour l'archivage froid)
  • Augmenter le nombre de segments pour le débit (inverse : moins = mieux)
  • Créer des index de payload sur chaque champ (gaspille de la mémoire)
  • Blâmer Qdrant avant de vérifier l'état de l'optimiseur

Skills similaires