Implementación de la generación de aumento de recuperación mediante índices vectoriales en Azure Cosmos DB for MongoDB basado en núcleo virtual

Completado

Con Azure OpenAI y Azure Cosmos DB for MongoDB basado en núcleo virtual, puede implementar un sistema de generación aumentada de recuperación (RAG). Este sistema combina funcionalidades de búsqueda vectorial de Azure Cosmos DB for MongoDB basado en núcleo virtual con los modelos avanzados de IA de Azure OpenAI para proporcionar respuestas detalladas basadas en los resultados de la búsqueda. Este enfoque mejora significativamente la calidad y la relevancia de las respuestas generadas por IA usando sus propios datos.

La primera parte de un sistema de generación aumentada de recuperación (RAG) implica hacer una pregunta y buscar en los datos elementos similares en función de la similitud de vectores. En otras palabras, la pregunta se convierte en un vector numérico y el sistema busca en los datos los elementos más similares a este vector.

En primer lugar, este proceso requiere configurar Azure Cosmos DB for MongoDB basado en núcleo virtual para admitir la búsqueda vectorial. Esta configuración implica tres pasos principales:

  1. Agregar campos vectoriales a los documentos para almacenar sus inserciones de datos de texto.
  2. Generar inserciones a partir de los datos de texto del documento y almacenarlos en los campos vectoriales.
  3. Crear índices vectoriales para estos campos vectoriales.

Vamos a explorar cada paso con más detalle.

Incorporación de campos vectoriales a los documentos

Para empezar, agrega campos vectoriales a los documentos de Azure Cosmos DB for MongoDB basado en núcleo virtual. Estos campos son cruciales, ya que almacenan datos vectoriales de alta dimensión. Puedes rellenar estos campos vectoriales mediante inserciones generadas a partir de los datos de texto del documento. Una vez rellenados, los índices vectoriales se crean a partir de estos campos vectoriales.

Generación de inserciones

Para poder aprovechar los índices vectoriales, debe generar inserciones para algunos de los campos de texto almacenados en los documentos de la base de datos. Las inserciones vectoriales son representaciones numéricas de los datos de texto que permiten a los sistemas de inteligencia artificial realizar una comparación eficaz de la similitud entre documentos. Por ejemplo, un vector de inserción generado para algún campo de texto podría tener este aspecto:

[0.123, 0.234, 0.345, ...]

Supongamos que tiene la colección productos en la base de datos ventas deAdventure Works Bike Shop. Puede generar inserciones para los campos de categoría y descripción del documento de colección. Azure OpenAI puede ayudarle a generar estas inserciones a partir de los datos de texto de los campos. Una vez generadas, puedes almacenar esas inserciones en los campos vectoriales del documento.

Para crear las inserciones de campos vectoriales, puedes usar Python de Azure OpenAI o SDK de Node.js, entre otros lenguajes. Por ejemplo, puede usar los siguientes fragmentos de código para generar inserciones para el texto en el campo de categoría mediante la API de Azure OpenAI:

Pitón

response = AzureOpenAIClient.embeddings.create(
    input=categoryText,
    model=embeddings_deployment)

Node.js

const response = await AzureOpenAIClient.getEmbeddings(embeddingsDeployment, categoryText);

Estos comandos llaman a la API de Azure OpenAI para generar inserciones numéricas para la variable categoryText mediante un modelo especificado (por ejemplo, GPT4). Una vez que hayas generado las inserciones del documento, puedes almacenarlo en los campos vectoriales mediante el comando insertar o actualizar de la colección de MongoDB.

Creación de índices vectoriales

Para poder realizar búsquedas vectoriales a fin de obtener los resultados que necesitamos para nuestro sistema de RAG, es necesario crear índices vectoriales en estos campos vectoriales. Estos índices permiten realizar búsquedas vectoriales eficaces para recuperar elementos similares en función de la similitud de los vectores. Hay dos tipos de índices vectoriales disponibles en Azure Cosmos DB for MongoDB: Los índices HNSW (mundo pequeño navegable jerárquico) y IVF (archivo invertido). Puede elegir el tipo de índice en función de los requisitos de la aplicación.

Por ejemplo, para crear un índice vectorial mediante el algoritmo de HNSW, puede usar el siguiente comando de MongoDB:

db.command({ 
    "createIndexes": "exampleCollection",
    "indexes": [
        {
            "name": "VectorSearchIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": 16, 
                "efConstruction": 64, 
                "similarity": "COS", 
                "dimensions": 3
            } 
        } 
    ] 
});

Este comando de MongoDB crea un índice vectorial denominado VectorSearchIndex en la colección exampleCollection del campo vectorial contentVector. Puede usar un comando similar para crear un índice vectorial mediante el algoritmo IVF. Exploramos ese ejemplo en el ejercicio del módulo. Una vez creados los índices vectoriales, puede usarlos para realizar búsquedas de similitud en la base de datos de Azure Cosmos DB for MongoDB basado en núcleo virtual. La base de datos de Azure Cosmos DB for MongoDB basado en núcleo virtual ya está lista para realizar búsquedas vectoriales.

Una vez creados los índices vectoriales, puede realizar búsquedas vectoriales para recuperar elementos similares en función de la similitud de los vectores. El proceso de búsqueda implica dos pasos principales:

  1. Insertar una consulta: Convierte una pregunta en lenguaje sencillo en un vector con las mismas funciones de inserción que usaste para crear las inserciones de campos vectoriales. Por ejemplo, si escribe una pregunta como ¿Qué tipo de bicicletas vende? generará la inserción de la pregunta con la misma función de API de Azure OpenAI que usó para crear las inserciones de la categoría o descripción del documento.

  2. Buscar: Use la inserción generada (también denominada vector de consulta) para buscar elementos similares en la base de datos. El algoritmo de búsqueda compara el vector de consulta con los datos vectoriales almacenados en la base de datos para buscar los elementos más similares. Para realizar una búsqueda vectorial, puede usar el siguiente comando agregado de MongoDB:

db.exampleCollection.aggregate([
  {
    "$search": {
        "cosmosSearch": {
            "vector": "queryVector",
            "path": "contentVector",
            "k": 2,
            "efSearch": 40
        },
    }
  }
]);

El resultado de la búsqueda vectorial devuelve los elementos más similares en función del vector de consulta. En este comando, contentVector sería el nombre de campo vectorial. Estos resultados son solo una matriz de los documentos con las puntuaciones de similitud más altas. Sin embargo, puede mejorar aún más la experiencia del usuario mediante la integración de Azure OpenAI para generar respuestas detalladas basadas en los resultados de la búsqueda. Esta integración es el último paso del sistema de generación aumentada de recuperación (RAG).

Integración de Azure OpenAI

Aunque los resultados de la búsqueda vectorial proporcionan elementos relevantes, puede mejorar aún más la experiencia del usuario mediante la integración de Azure OpenAI para generar respuestas detalladas basadas en los resultados de la búsqueda vectorial. Los modelos avanzados de IA de Azure OpenAI pueden proporcionar respuestas que tienen en cuenta el contexto y que complementan los resultados de la búsqueda vectorial.

Por lo tanto, ¿qué debemos hacer para integrar Azure OpenAI con los resultados de la búsqueda vectorial? En primer lugar, vamos a crear una indicación estructurada que Azure OpenAI puede usar para generar respuestas detalladas basadas en los resultados de la búsqueda vectorial. La indicación estructurada combina los siguientes elementos:

  • La consulta original que usó en la búsqueda vectorial: por ejemplo, ¿Qué tipo de bicicletas vende?
  • La indicación del sistema definida por el usuario: la indicación del sistema proporciona una descripción clara del trabajo, en la que se detallan las tareas que se espera que la inteligencia artificial realice; por ejemplo, podría definir su rol como asistente en Adventure Works Bike Shop. Describe cómo la inteligencia artificial debe responder a preguntas y asegurarse de que todas las respuestas son relevantes y devueltas en un formato fácil de seguir. La indicación del sistema podría tener los siguientes componentes:
    • Descripción del trabajo: Quién se supone que es la IA; por ejemplo, "como asistente en Adventure Works Bike Shop, usted es responsable de responder a las consultas de los clientes sobre las bicicletas que vendemos".
    • Dar formato a las respuestas de IA: La indicación dice a la inteligencia artificial cómo dar formato a sus respuestas exactamente, como el uso de listas con espaciado específico. Este formato presenta la información de manera clara y coherente para que los usuarios la comprendan fácilmente.
    • Limitar las respuestas de interacción con la IA: La indicación podría incluir una lista de temas que la inteligencia artificial debería poder tratar, como los tipos de bicicletas, los precios y la disponibilidad. Esta lista fundamenta a la inteligencia artificial y garantiza que la IA se ciña al tema y proporcione información pertinente.
    • Gestión de la incertidumbre: La indicación permite a la inteligencia artificial saber cómo gestionar situaciones en las que es posible que no tenga suficiente información para proporcionar una respuesta. La inteligencia artificial podría sugerir frases como "No lo sé" o animar a los usuarios a realizar su propia investigación. Esta sección puede ayudar a la inteligencia artificial a gestionar mejor las situaciones de incertidumbre.
    • Otras instrucciones: La indicación podría incluir otras instrucciones; por ejemplo, cómo proporcionar otros recursos a los usuarios o cómo gestionar preguntas inapropiadas. Por lo tanto, si quiere que la inteligencia artificial haga cualquier otra cosa, debe incluirla en la indicación del sistema. Estas instrucciones ayudan a la inteligencia artificial a proporcionar una experiencia coherente y útil para los usuarios.
  • Los resultados de la búsqueda vectorial: Los resultados de la búsqueda vectorial proporcionan los elementos más similares de los datos en función del vector de consulta. Dado que los resultados de la búsqueda vectorial devueltos son los documentos enteros, debería elegir los campos más relevantes que se van a incluir en la indicación, como quizás la categoría o la descripción de la bicicleta. La inteligencia artificial puede usar esta información para generar respuestas detalladas basadas en los resultados de la búsqueda vectorial. Por ejemplo, si los resultados de la búsqueda vectorial devuelven bicicletas de montaña y bicicletas de carretera, la IA puede proporcionar información detallada sobre estos tipos de bicicletas.

Hay muchas maneras de generar la indicación mediante programación. La clave es estructurarla de forma que proporcione instrucciones claras a la inteligencia artificial sobre cómo generar respuestas basadas en los resultados de la búsqueda vectorial. Visitamos uno de estos métodos en el ejercicio del módulo.

Una vez definida la indicación estructurada, puede usar los siguientes fragmentos de código para generar respuestas mediante Azure OpenAI:

Pitón

response = AzureOpenAICompletionClient.chat.completions.create(
    model=completion_deployment, messages=structuredPrompt)

Node.js

const response = await AzureOpenAICompletionClient.getChatCompletions(completionDeployment, structuredPrompt);

Estos comandos llaman a la API de Azure OpenAI para generar respuestas detalladas basadas en la indicación estructurada, mediante un modelo especificado para proporcionar información que tiene en cuenta el contexto y que complementa los resultados de la búsqueda vectorial.

Esta configuración combina los datos del cliente de Azure Cosmos DB for MongoDB basado en núcleo virtual con los modelos de IA de Azure OpenAI para formar el sistema de generación aumentada de recuperación (RAG). Mediante la integración de la búsqueda de vectores, se permite que la inteligencia artificial extraiga información precisa y pertinente de Azure Cosmos DB for MongoDB basado en núcleo virtual para obtener respuestas mejoradas. Este enfoque mejora significativamente la calidad y la relevancia de las respuestas generadas por IA usando sus propios datos.