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"
}
}
}