Carga útil

Una de las características importantes de Qdrant es la capacidad de almacenar información adicional fuera de los vectores (atributos comerciales de gestión de almacenamiento). En la terminología de Qdrant, esta información adicional se denomina "carga útil".

Qdrant le permite almacenar cualquier información que pueda representarse utilizando JSON.

Aquí hay un ejemplo de una carga útil típica:

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

Tipos de Carga Útil

Además de almacenar cargas útiles, Qdrant también le permite buscar según ciertos tipos de valores. Esta característica se implementa como filtros adicionales durante el proceso de búsqueda y le permite incrustar lógica personalizada en la similitud semántica.

Durante el proceso de filtrado, Qdrant verificará las condiciones de los valores que cumplen con los criterios de filtro. Si el tipo de valor almacenado no cumple con los criterios de filtro, se considera insatisfactorio.

Por ejemplo, aplicar condiciones de rango a datos de cadena dará como resultado una salida vacía.

Sin embargo, el manejo de matrices (múltiples valores del mismo tipo) es ligeramente diferente. Cuando aplicamos filtros a una matriz, si al menos un valor en la matriz cumple con la condición, el filtro será válido.

Una discusión detallada del proceso de filtrado se lleva a cabo en la sección de filtrado.

Echemos un vistazo a los tipos de datos admitidos por Qdrant:

Entero

entero - entero de 64 bits, que va desde -9223372036854775808 a 9223372036854775807.

Ejemplos de valores enteros individuales y múltiples:

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

Flotante

flotante - número de punto flotante de 64 bits.

Ejemplos de valores flotantes individuales y múltiples:

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

Booleano

bool - valor binario. Igual a true o false.

Ejemplos de valores booleanos individuales y múltiples:

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

Palabra Clave

palabra clave - valor de cadena.

Ejemplos de valores de palabra clave individuales y múltiples:

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

Coordenadas Geográficas

geo se utiliza para representar coordenadas geográficas.

Ejemplos de valores geo individuales y múltiples:

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

Las coordenadas deben describirse como un objeto que contiene dos campos: longitud - que representa la longitud, latitud - que representa la latitud.

Creación de puntos con cargas útiles

API REST (arquitectura)

PUT /colecciones/{nombre_de_colección}/puntos

{
    "puntos": [
        {
            "id": 1,
            "vector": [0.05, 0.61, 0.76, 0.74],
            "payload": {"ciudad": "Berlín", "precio": 1.99}
        },
        {
            "id": 2,
            "vector": [0.19, 0.81, 0.75, 0.11],
            "payload": {"ciudad": ["Berlín", "Londres"], "precio": 1.99}
        },
        {
            "id": 3,
            "vector": [0.36, 0.55, 0.47, 0.94],
            "payload": {"ciudad": ["Berlín", "Moscú"], "precio": [1.99, 2.99]}
        }
    ]
}

Configuración de cargas útiles

API REST (Esquema):

POST /colecciones/{nombre_coleccion}/puntos/carga-util

{
    "carga_util": {
        "propiedad1": "cadena",
        "propiedad2": "cadena"
    },
    "puntos": [
        0, 3, 100
    ]
}

Eliminación de cargas útiles

Este método elimina claves de cargas útiles especificadas de los puntos especificados.

API REST (Esquema):

POST /colecciones/{nombre_coleccion}/puntos/carga-util/eliminar

{
    "claves": ["color", "precio"],
    "puntos": [0, 3, 100]
}

Borrado de cargas útiles

Este método elimina todas las claves de cargas útiles de los puntos especificados.

API REST (Esquema):

POST /colecciones/{nombre_coleccion}/puntos/carga-util/limpiar

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

También puedes usar models.FilterSelector para eliminar puntos que cumplan condiciones de filtro especificadas, en lugar de proporcionar IDs.

Indexación de cargas útiles

Para realizar búsquedas filtradas de manera eficiente, Qdrant te permite crear un índice para campos de carga útil especificando el nombre y tipo del campo.

Los campos indexados también impactan en el índice vectorial.

En la práctica, se recomienda crear índices en campos que probablemente restrinjan más los resultados. Por ejemplo, indexar el ID del objeto será más eficiente que indexar el color, ya que el ID del objeto es único para cada registro, mientras que el color solo tiene unos pocos valores posibles.

En consultas compuestas que involucran varios campos, Qdrant intentará utilizar primero el índice más restrictivo.

Para crear un índice para un campo, se puede usar lo siguiente:

API REST (Esquema)

PUT /colecciones/{nombre_coleccion}/indice

{
    "nombre_campo": "nombre del campo a indexar",
    "esquema_campo": "palabra_clave"
}

Los campos indexados se muestran en el esquema de carga útil junto con el API de información de colección.

Ejemplo de esquema de carga útil:

{
    "esquema_carga_util": {
        "propiedad1": {
            "tipo_datos": "palabra_clave"
        },
        "propiedad2": {
            "tipo_datos": "entero"
        }
    }
}