Compartir a través de


Indexación y vectores de consulta en Azure Cosmos DB for NoSQL en JavaScript.

SE APLICA A: NoSQL

La búsqueda vectorial en Azure Cosmos DB for NoSQL es actualmente una característica en versión preliminar. Es necesario registrarse para la versión preliminar antes de usarla. En este artículo se tratan los siguientes pasos:

  1. Registro para la versión preliminar de Vector de búsqueda en Azure Cosmos DB for NoSQL
  2. Configuración del contenedor de Azure Cosmos DB para el vector de búsqueda
  3. Directiva de inserción de vectores de creación
  4. Adición de índices vectoriales a la directiva de indexación de contenedores
  5. Creación de un contenedor con índices vectoriales y directiva de inserción de vectores
  6. Realizar un vector de búsqueda en los datos almacenados.
  7. En esta guía se explica el proceso de creación de datos vectoriales, la indexación de los datos y, a continuación, la consulta de los datos en un contenedor.

Requisitos previos

Registro para la versión preliminar

El vector de búsqueda de Azure Cosmos DB for NoSQL requiere el registro de característica en vista previa (GB). Siga los pasos siguientes para registrarse:

  1. Vaya a la página de recursos de Azure Cosmos DB for NoSQL.

  2. Seleccione el panel "Características" en el elemento de menú "Configuración".

  3. Seleccione "Vector de búsqueda en Azure Cosmos DB for NoSQL".

  4. Lea la descripción de la característica para confirmar que desea inscribirse en la versión preliminar.

  5. Seleccione "Habilitar" para inscribirse en la versión preliminar.

Nota:

La solicitud de registro será autoaprobada, pero puede tardar varios minutos en surtir efecto.

En los pasos siguientes se supone que sabe cómo configurar una cuenta Cosmos DB NoSQL y crear una base de datos. La característica de vector de búsqueda solo se admite actualmente en nuevos contenedores, no en contenedores existentes. Debe crear un contenedor y, a continuación, especificar la directiva de inserción de vectores de nivel de contenedor y la directiva de indexación de vectores en el momento de la creación.

Veamos un ejemplo de cómo crear una base de datos para una librería basada en Internet y almacenar título, autor, ISBN y descripción para cada libro. También definimos dos propiedades para contener incrustaciones de vectores. La primera es la propiedad “contentVector”, que contiene incrustaciones de texto generadas a partir del contenido de texto del libro (por ejemplo, concatenando las propiedades "title" “author" “isbn" y “description" antes de crear la inserción). El segundo es “coverImageVector”, que se genera a partir deimágenes de la portada del libro.

  1. Cree y almacene incrustaciones de vectores para los campos en los que desea realizar el vector de búsqueda.
  2. Especifique las rutas de acceso de inserción de vectores en la directiva de inserción de vectores.
  3. Incluya los índices de vector deseados en la directiva de indexación para el contenedor.

Para las secciones posteriores de este artículo, consideramos la siguiente estructura para los elementos almacenados en nuestro 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.

A continuación, 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 cómo controlar las propiedades vectoriales en las funciones del sistema VectorDistance. Esto también informa a la directiva de indexación de vectores de la información necesaria, si decide especificar una. La siguiente información se incluye en la directiva de vectores contenida:

  • “path”: Ruta de acceso de la propiedad que contiene vectores
  • “datatype”: El tipo de los elementos del vector (valor predeterminado Float32)
  • “dimensiones”: Longitud de cada vector en la ruta de acceso (valor predeterminado 1536)
  • “distanceFunction”: La métrica usada para calcular la distancia o similitud (coseno predeterminado)

En nuestro ejemplo con detalles del libro, la directiva de vectores puede tener un aspecto similar al JSON de ejemplo:

const vectorEmbeddingPolicy: VectorEmbeddingPolicy = {
      vectorEmbeddings: [
        {
          path: "/coverImageVector",
          dataType: "float32",
          dimensions: 8,
          distanceFunction: "euclidean",
        },
        {
          path: "contentVector",
          dataType: "float32",
          dimensions: 10,
          distanceFunction: "dotproduct",
        },
      ],
    };

Creación de un índice vectorial en la directiva de indexación

Una vez que se decidan las rutas de acceso de inserción de vectores, es necesario agregar índices vectoriales a la directiva de indexación. Actualmente, la característica de vector de búsqueda para Azure Cosmos DB for NoSQL solo se admite en contenedores nuevos, por lo que debe aplicar la directiva de vectores durante el tiempo de creación del contenedor y no se puede modificar más adelante. En este ejemplo, la directiva de indexación tendría el siguiente aspecto:

const indexingPolicy: IndexingPolicy = {
  vectorIndexes: [
    { path: "/coverImageVector", type: "quantizedFlat" },
    { path: "/contentVector", type: "diskANN" },
  ]
};

Ahora cree el contenedor como de costumbre.

const containerName = "vector embedding container";
    // create container
    const { resource: containerdef } = await database.containers.createIfNotExists({
      id: containerName,
      vectorEmbeddingPolicy: vectorEmbeddingPolicy,
      indexingPolicy: indexingPolicy,
    });

Importante

Actualmente, la búsqueda vectorial en Azure Cosmos DB for NoSQL solo se admite en nuevos contenedores. Debe establecer la directiva de vectores de contenedor y cualquier directiva de indexación de vectores durante el tiempo de creación del contenedor, ya que no se puede modificar más adelante. Ambas directivas serán modificables en una futura mejora de la característica en versión preliminar.

Ejecución de una consulta de búsqueda de similitud vectorial

Una vez creado un contenedor con la directiva de vector deseada e insertar datos vectoriales en el contenedor, puede realizar un vector de búsqueda mediante la función del sistema Distancia de vectores en una consulta. Supongamos que desea buscar libros sobre recetas alimentarias examinando la descripción, primero debe obtener las incrustaciones para el texto de la consulta. En este caso, es posible que desee generar incrustaciones para el texto de consulta: “receta de alimentos”. Una vez que tenga la inserción de la consulta de búsqueda, puede usarla en la función VectorDistance de la consulta de vector de búsqueda y obtener todos los elementos similares a la consulta, como se muestra aquí:

SELECT 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. Este es un ejemplo en JavaScript:

const { resources } = await container.items
  .query({
    query: "SELECT c.title, VectorDistance(c.contentVector, @embedding) AS SimilarityScore FROM c  ORDER BY VectorDistance(c.contentVector, @embedding)"
    parameters: [{ name: "@embedding", value: [1,2,3,4,5,6,7,8,9,10] }]
  })
  .fetchAll();
for (const item of resources) {
  console.log(`${itme.title}, ${item.SimilarityScore} is a capitol `);
}

Pasos siguientes