Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este artículo le guía por el proceso de cómo crear datos vectoriales, indexar los datos y, a continuación, consultar los datos en un contenedor.
Antes de usar la indexación y la búsqueda de vectores, primero debe habilitar la búsqueda de vectores en Azure Cosmos DB para NoSQL. Después de configurar el contenedor de Azure Cosmos DB para la búsqueda de vectores, se crea una directiva de inserción de vectores. A continuación, agregará índices vectoriales a la directiva de indexación de contenedores. A continuación, cree un contenedor con índices vectoriales y una directiva de inserción de vectores. Por último, se realiza una búsqueda de vectores en los datos almacenados.
Requisitos previos
- Una cuenta existente de Azure Cosmos DB for NoSQL.
- Si no tiene una suscripción de Azure, pruebe Azure Cosmos DB para NoSQL de forma gratuita.
- Si tiene una suscripción de Azure existente, cree una cuenta de Azure Cosmos DB for NoSQL.
- Versión más reciente del SDK de .NET de Azure Cosmos DB (versión: 3.45.0 o posterior, versión preliminar: 3.46.0-preview.0 o posterior).
Habilitar la característica
Para habilitar la búsqueda de vectores para Azure Cosmos DB para NoSQL, siga estos pasos:
- Vaya a la página de recursos de Azure Cosmos DB para NoSQL.
- En el panel izquierdo, en Configuración, seleccione Características.
- Seleccione Búsqueda vectorial en Azure Cosmos DB para NoSQL.
- Lea la descripción de la característica para confirmar que desea habilitarla.
- Seleccione Habilitar para activar la búsqueda de vectores en Azure Cosmos DB para NoSQL.
Sugerencia
Como alternativa, use la CLI de Azure para actualizar las funcionalidades de su cuenta para admitir la búsqueda de vectores de Azure Cosmos DB para NoSQL.
az cosmosdb update \
--resource-group <resource-group-name> \
--name <account-name> \
--capabilities EnableNoSQLVectorSearch
La solicitud de registro se aprobó automáticamente, pero puede tardar 15 minutos en surtir efecto.
Descripción de los pasos implicados en la búsqueda de vectores
En los pasos siguientes se da por supuesto que sabe cómo configurar una cuenta de Azure Cosmos DB para NoSQL y crear una base de datos. La característica de búsqueda vectorial no se admite actualmente en los contenedores existentes. Debe crear un nuevo contenedor. Al crear el contenedor, se especifica la directiva de inserción de vectores de nivel de contenedor y la directiva de indexación de vectores.
Veamos un ejemplo de cómo crear una base de datos para una librería basada en Internet. Quiere almacenar información de título, autor, ISBN y descripción para cada libro. También debe definir las dos propiedades siguientes para contener incrustaciones de vectores:
- La
contentVectorpropiedad contiene incrustaciones de texto que se generan a partir del contenido de texto del libro. Por ejemplo, concatenas las propiedadestitle,author,isbnydescriptionantes de crear la incrustación. - La
coverImageVectorpropiedad se genera a partir de imágenes de la portada del libro.
Para realizar una búsqueda vectorial, haga lo siguiente:
- Cree y almacene incrustaciones de vectores para los campos en los que desea realizar el vector de búsqueda.
- Especifique las rutas de acceso de inserción de vectores en la directiva de inserción de vectores.
- Incluya los índices vectoriales que desee en la directiva de indexación para el contenedor.
Para las secciones posteriores de este artículo, tenga en cuenta la siguiente estructura para los elementos almacenados en el contenedor:
{
"title": "book-title",
"author": "book-author",
"isbn": "book-isbn",
"description": "book-description",
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1],
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78]
}
Creación de una directiva de inserción de vectores para el contenedor
Ahora debe definir una directiva de vectores de contenedor. Esta directiva proporciona información que se usa para informar al motor de consultas de Azure Cosmos DB sobre cómo controlar las propiedades vectoriales en las funciones del VectorDistance sistema. Esta directiva también proporciona información necesaria a la directiva de indexación de vectores, si decide especificar una.
La siguiente información se incluye en la política de vectores de contenedores:
| Parámetro | Description |
|---|---|
path |
La propiedad path que contiene vectores. |
datatype |
Tipo de los elementos del vector. (El valor predeterminado es Float32. |
dimensions |
Longitud de cada vector de la ruta de acceso. (El valor predeterminado es 1536. |
distanceFunction |
Métrica que se usa para calcular la distancia o similitud. (El valor predeterminado es Cosine. |
En el ejemplo con detalles del libro, la directiva de vectores podría ser similar al ejemplo siguiente:
Database db = await client.CreateDatabaseIfNotExistsAsync("vector-benchmarking");
List<Embedding> embeddings = new List<Embedding>()
{
new Embedding()
{
Path = "/coverImageVector",
DataType = VectorDataType.Float32,
DistanceFunction = DistanceFunction.Cosine,
Dimensions = 8,
},
new Embedding()
{
Path = "/contentVector",
DataType = VectorDataType.Float32,
DistanceFunction = DistanceFunction.Cosine,
Dimensions = 10,
}
};
Creación de un índice vectorial en la directiva de indexación
Después de decidir las rutas para la incrustación de vectores, debe agregar índices vectoriales a la directiva de indexación. Actualmente, la característica de búsqueda de vectores para Azure Cosmos DB para NoSQL solo se admite en nuevos contenedores. Al crear el contenedor, se aplica la directiva de vectores. No se puede modificar la directiva más adelante. La directiva de indexación tiene un aspecto similar al del ejemplo siguiente:
Collection<Embedding> collection = new Collection<Embedding>(embeddings);
ContainerProperties properties = new ContainerProperties(id: "vector-container", partitionKeyPath: "/id")
{
VectorEmbeddingPolicy = new(collection),
IndexingPolicy = new IndexingPolicy()
{
VectorIndexes = new()
{
new VectorIndexPath()
{
Path = "/vector",
Type = VectorIndexType.QuantizedFlat,
}
}
},
};
properties.IndexingPolicy.IncludedPaths.Add(new IncludedPath { Path = "/*" });
properties.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath { Path = "/vector/*" });
Importante
Ruta de acceso vectorial agregada a la sección excludedPaths de la directiva de indexación para garantizar un rendimiento optimizado para la inserción. No agregar la ruta de acceso del vector a excludedPaths da como resultado una mayor carga de unidad de solicitud y latencia para las inserciones vectoriales.
Ejecución de una consulta de búsqueda de similitud vectorial
Después de crear un contenedor con la directiva de vectores que desea e insertar datos vectoriales en el contenedor, use la función del sistema VectorDistance en una consulta para realizar una búsqueda vectorial.
Supongamos que desea buscar libros sobre recetas de alimentos examinando la descripción. Primero debe obtener las incrustaciones para el texto de la consulta. En este caso, es posible que quiera generar incrustaciones para el texto food recipede consulta . Después de tener la inserción de la consulta de búsqueda, puede usarla en la función VectorDistance de la consulta de búsqueda vectorial para obtener todos los elementos similares a la consulta:
SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])
Esta consulta recupera los títulos del libro junto con puntuaciones de similitud con respecto a la consulta. A continuación se muestra un ejemplo de .NET:
float[] embedding = {1f,2f,3f,4f,5f,6f,7f,8f,9f,10f};
var queryDef = new QueryDefinition(
query: $"SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)"
).WithParameter("@embedding", embedding);
using FeedIterator<Object> feed = container.GetItemQueryIterator<Object>(
queryDefinition: queryDef
);
while (feed.HasMoreResults)
{
FeedResponse<Object> response = await feed.ReadNextAsync();
foreach ( Object item in response)
{
Console.WriteLine($"Found item:\t{item}");
}
}