Charge utile

L'une des fonctionnalités importantes de Qdrant est la capacité de stocker des informations supplémentaires en dehors des vecteurs (attributs métier de gestion du stockage). Dans la terminologie de Qdrant, ces informations supplémentaires sont appelées "charge utile".

Qdrant vous permet de stocker n'importe quelle information pouvant être représentée à l'aide de JSON.

Voici un exemple d'une charge utile typique :

{
    "name": "veste",
    "color": ["rouge", "bleu"],
    "quantity": 10,
    "price": 11.99,
    "location": [
        {
            "longitude": 52.5200,
            "latitude": 13.4050
        }
    ],
    "reviews": [
        {
            "user": "Alice",
            "score": 4
        },
        {
            "user": "Bob",
            "score": 5
        }
    ]
}

Types de charge utile

En plus de stocker des charges utiles, Qdrant vous permet également de rechercher en fonction de certains types de valeurs. Cette fonctionnalité est implémentée sous la forme de filtres supplémentaires lors du processus de recherche et vous permet d'incorporer une logique personnalisée sur la similarité sémantique.

Pendant le processus de filtrage, Qdrant vérifiera les conditions des valeurs qui satisfont aux critères de filtre. Si le type de valeur stockée ne satisfait pas aux critères de filtre, elle est considérée comme non satisfaisante.

Par exemple, l'application de conditions de plage à des données de type chaîne entraînera une sortie vide.

Cependant, la manipulation des tableaux (valeurs multiples du même type) est légèrement différente. Lorsque nous appliquons des filtres à un tableau, si au moins une valeur dans le tableau satisfait à la condition, le filtre aboutira.

Une discussion détaillée du processus de filtrage est menée dans la section sur le filtrage.

Jetons un coup d'œil aux types de données pris en charge par Qdrant :

Entier

int - entier 64 bits, allant de -9223372036854775808 à 9223372036854775807.

Exemples de valeurs int simple et multiple :

{
    "quantity": 10,
    "sizes": [35, 36, 38]
}

Flottant

float - nombre flottant 64 bits.

Exemples de valeurs float simple et multiple :

{
    "price": 11.99,
    "rating": [9.1, 9.2, 9.4]
}

Booléen

bool - valeur binaire. Égal à true ou false.

Exemples de valeurs bool simple et multiple :

{
    "delivered": true,
    "replies": [false, false, true, false]
}

Mot-clé

keyword - valeur de chaîne.

Exemples de valeurs keyword simple et multiple :

{
    "name": "Alice",
    "friends": [
        "Bob",
        "Eva",
        "Jack"
    ]
}

Coordonnées Géographiques

geo est utilisé pour représenter des coordonnées géographiques.

Exemples de valeurs geo simple et multiple :

{
    "location": {
        "longitude": 52.5200,
        "latitude": 13.4050
    },
    "cities": [
        {
            "longitude": 51.5072,
            "latitude": 0.1276
        },
        {
            "longitude": 40.7128,
            "latitude": 74.0060
        }
    ]
}

Les coordonnées doivent être décrites sous forme d'objet contenant deux champs : longitude - représentant la longitude, latitude - représentant la latitude.

Création de points avec charge utile

API REST (architecture)

PUT /collections/{collection_name}/points

{
    "points": [
        {
            "id": 1,
            "vector": [0.05, 0.61, 0.76, 0.74],
            "payload": {"city": "Berlin", "price": 1.99}
        },
        {
            "id": 2,
            "vector": [0.19, 0.81, 0.75, 0.11],
            "payload": {"city": ["Berlin", "Londres"], "price": 1.99}
        },
        {
            "id": 3,
            "vector": [0.36, 0.55, 0.47, 0.94],
            "payload": {"city": ["Berlin", "Moscou"], "price": [1.99, 2.99]}
        }
    ]
}

Configuration des charges utiles

API REST (Schéma) :

POST /collections/{nom_collection}/points/payload

{
    "payload": {
        "propriété1": "chaîne",
        "propriété2": "chaîne"
    },
    "points": [
        0, 3, 100
    ]
}

Suppression des charges utiles

Cette méthode supprime les clés de charge utile spécifiées des points spécifiés.

API REST (Schéma) :

POST /collections/{nom_collection}/points/payload/delete

{
    "clés": ["couleur", "prix"],
    "points": [0, 3, 100]
}

Effacement des charges utiles

Cette méthode supprime toutes les clés de charge utile des points spécifiés.

API REST (Schéma) :

POST /collections/{nom_collection}/points/payload/clear

{
    "points": [0, 3, 100]
}

Vous pouvez également utiliser models.FilterSelector pour supprimer les points qui correspondent à des conditions de filtre données, au lieu de fournir des IDs.

Indexation des charges utiles

Pour effectuer efficacement des recherches filtrées, Qdrant vous permet de créer un index pour les champs de charge utile en spécifiant le nom et le type du champ.

Les champs indexés ont également un impact sur l'index vectoriel.

En pratique, il est recommandé de créer des index sur les champs qui sont susceptibles de restreindre le plus les résultats. Par exemple, l'indexation sur l'identifiant d'objet sera plus efficace que l'indexation sur la couleur, car l'identifiant d'objet est unique pour chaque enregistrement, tandis que la couleur n'a que quelques valeurs possibles.

Dans les requêtes composites impliquant plusieurs champs, Qdrant tentera d'utiliser d'abord l'index le plus restrictif.

Pour créer un index pour un champ, on peut utiliser ce qui suit :

API REST (Schéma)

PUT /collections/{nom_collection}/index

{
    "field_name": "nom du champ à indexer",
    "field_schema": "mot-clé"
}

Les champs indexés sont affichés dans le schéma de charge utile, en association avec l'API informations de la collection.

Exemple de schéma de charge utile :

{
    "payload_schema": {
        "propriété1": {
            "data_type": "mot-clé"
        },
        "propriété2": {
            "data_type": "entier"
        }
    }
}