Implementar a Geração de Aumento de Recuperação usando índices de vetor no Azure Cosmos DB for MongoDB baseado em vCore
Usando o OpenAI do Azure e o Azure Cosmos DB for MongoDB baseado em vCore, você pode implementar um sistema RAG (Geração Aumentada por Recuperação). Esse sistema combina os recursos de busca em vetores do Azure Cosmos DB for MongoDB baseado em vCore com os modelos avançados de IA do OpenAI do Azure para fornecer respostas detalhadas com base nos resultados da pesquisa. Essa abordagem melhora significativamente a qualidade e a relevância das respostas geradas por IA utilizando seus próprios dados.
Configurar o Azure Cosmos DB for MongoDB baseado em vCore para a busca em vetores
A primeira parte de um sistema RAG (Geração Aumentada por Recuperação) envolve fazer uma pergunta e pesquisar itens semelhantes em seus dados com base na similaridade de vetores. Em outras palavras, sua pergunta é convertida em um vetor numérico e o sistema pesquisa seus dados em busca de itens mais semelhantes a este vetor.
Esse processo requer primeiro a configuração do Azure Cosmos DB for MongoDB baseado em vCore para dar suporte à busca em vetores. Essa configuração envolve três etapas principais:
- Adicione campos de vetor aos seus documentos para armazenar suas inserções de dados de texto.
- Gere inserções dos dados de texto do documento e armazene-as nos campos de vetor.
- Crie índices de vetor para esses campos de vetor.
Vamos explorar cada etapa em mais detalhes.
Adicionar campos de vetor aos seus documentos
Comece adicionando campos de vetor aos documentos do Azure Cosmos DB for MongoDB baseados em vCore. Esses campos são cruciais, pois armazenam dados de vetor de alta dimensão. Você preenche esses campos de vetor usando inserções geradas a partir dos dados de texto do documento. Depois de preenchidos, os índices de vetor são criados a partir desses campos de vetor.
Gerar inserções
Antes de aproveitar os índices de vetor, você precisa gerar inserções para alguns dos campos de texto armazenados nos documentos do seu banco de dados. As inserções de vetores são representações numéricas dos dados de texto, permitindo que os sistemas de IA realizem uma comparação eficiente de similaridade entre os documentos. Por exemplo, um vetor de inserção gerado para algum campo de texto pode aparecer assim:
[0.123, 0.234, 0.345, ...]
Suponha que você tenha a coleção de produtos no banco de dados de Adventure Works Bike Shopvendas. Você pode gerar inserções para os campos de categoria e descrição do documento de coleção. O OpenAI do Azure pode ajudar você a gerar esses inserções a partir dos dados de texto dos campos. Depois de geradas, você pode armazenar essas inserções nos campos de vetor do documento.
Para criar suas inserções de campo de vetor, você pode usar o Python do OpenAI do Azure ou o SDK do Node.js, dentre outros idiomas. Por exemplo, você pode usar os seguintes snippets de código para gerar inserções para o texto no campo de categoria usando a API do Azure OpenAI:
Python
response = AzureOpenAIClient.embeddings.create(
input=categoryText,
model=embeddings_deployment)
Node.js
const response = await AzureOpenAIClient.getEmbeddings(embeddingsDeployment, categoryText);
Esses comandos chamam a API do OpenAI do Azure para gerar inserções numéricas para a variável categoryText utilizando um modelo especificado (por exemplo, GPT4). Depois de gerar as inserções do documento, você poderá armazená-lo em seus campos de vetor usando o comando de inserção ou atualização de uma coleção mongoDB.
Criar índices de vetor
Antes de executarmos pesquisas de vetor para obter os resultados necessários para o nosso sistema RAG, precisamos criar índices de vetor nesses campos de vetor. Esses índices permitem que você realize buscas em vetores eficientes para recuperar itens semelhantes com base na similaridade vetorial. Há dois tipos de índices de vetor disponíveis no Azure Cosmos DB para MongoDB: HNSW (Mundo Pequeno Navegável Hierárquico) e IVF (Arquivo Invertido). Você pode escolher o tipo de índice com base nos requisitos do seu aplicativo.
Por exemplo, para criar um índice de vetor usando o algoritmo HNSW , você pode usar o seguinte comando 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 mongoDB cria um índice de vetor chamado VectorSearchIndex na coleção exampleCollection do campo de vetor contentVector . Você pode usar um comando semelhante para criar um índice de vetor usando o algoritmo de FIV . Visitaremos esse exemplo no exercício do módulo. Depois de criar os índices de vetor, você poderá usá-los para realizar pesquisas de similaridade em seu banco de dados do Azure Cosmos DB for MongoDB baseado em vCore. Seu banco de dados do Azure Cosmos DB for MongoDB baseado em vCore agora está pronto para realizar buscas em vetores.
Executar a busca em vetores
Depois de criar os índices de vetor, você pode realizar buscas em vetores para recuperar itens semelhantes com base na similaridade vetorial. O processo de pesquisa envolve duas etapas principais:
Insira uma consulta: converta uma pergunta de linguagem simples em um vetor usando as mesmas funções de inserção usadas para criar as inserções de campo de vetor. Por exemplo, se a sua entrada for uma pergunta como Qual tipo de bicicleta você vende? Você geraria a inserção da pergunta usando a mesma função de API openai do Azure usada para criar as inserções de categoria ou de descrição do documento.
Pesquisa: use a inserção gerada (também chamada de vetor de consulta) para pesquisar itens semelhantes no banco de dados. O algoritmo de pesquisa compara o vetor de consulta com os dados de vetores armazenados no banco de dados para encontrar os itens mais semelhantes. Para executar uma pesquisa de vetor, você pode usar o seguinte comando de agregação do MongoDB:
db.exampleCollection.aggregate([
{
"$search": {
"cosmosSearch": {
"vector": "queryVector",
"path": "contentVector",
"k": 2,
"efSearch": 40
},
}
}
]);
O resultado da busca em vetores retorna os itens mais semelhantes com base no vetor de consulta. Nesse comando, o contentVector seria o nome do campo de vetor. Esses resultados são apenas uma matriz de seus documentos com as pontuações de similaridade mais altas. No entanto, você pode aprimorar ainda mais a experiência do usuário integrando o OpenAI do Azure para gerar respostas detalhadas com base nos resultados da pesquisa. Essa integração é a última etapa do nosso sistema RAG (Geração Aumentada por Recuperação).
Integrar OpenAI do Azure
Embora os resultados da busca em vetores forneçam itens relevantes, você pode aprimorar ainda mais a experiência do usuário integrando o OpenAI do Azure para gerar respostas detalhadas com base nos resultados da busca em vetores. Os modelos avançados de IA do OpenAI do Azure podem fornecer respostas com reconhecimento de contexto que complementam os resultados da busca em vetores.
Então, o que precisamos fazer para integrar o OpenAI do Azure aos resultados da busca em vetores? Primeiro, vamos criar um prompt estruturado que o OpenAI do Azure pode usar para gerar respostas detalhadas com base nos resultados da busca em vetores. O prompt estruturado combina os seguintes elementos:
- A consulta original que você usou em sua pesquisa de vetor – Por exemplo, que tipo de bicicleta você vende?
-
Prompt do sistema definido pelo usuário – O prompt do sistema fornece uma descrição de trabalho clara, detalhando as tarefas que a IA deve lidar, por exemplo, ele pode definir sua função como auxiliar na Adventure Works Bike Shop. Ele descreve como a IA deve responder às perguntas, garantindo que todas as respostas sejam relevantes e retornadas em um formato fácil de seguir. O prompt do sistema poderia ter os seguintes componentes:
- Descrição do trabalho: Quem é a IA que deveria ser, por exemplo, "como auxiliar na Adventure Works Bike Shop, você é responsável por responder consultas de clientes sobre as bicicletas que vendemos".
- Formatação de respostas de IA: o prompt informa à IA exatamente como formatar suas respostas, como usar listas com espaçamento específico. Essa formatação mantém as informações claras e consistentes para que os usuários possam entender facilmente.
- Limitando as respostas de interação de IA: o prompt pode incluir uma lista de tópicos que a IA deve ser capaz de discutir, como tipos de bicicleta, preços e disponibilidade. Essa lista fundamenta e garante que a IA permaneça no tópico e forneça informações relevantes.
- Manipulando a incerteza: o prompt permite que a IA saiba como lidar com situações em que pode não ter informações suficientes para fornecer uma resposta. A IA pode sugerir frases como "Não sei" ou incentivar os usuários a fazer suas próprias pesquisas. Esta seção pode ajudar a IA a gerenciar melhor as situações de incerteza.
- Outras instruções: o prompt pode incluir outras instruções, como como fornecer outros recursos aos usuários ou como lidar com perguntas inadequadas. Portanto, qualquer outra coisa que você queira que a IA faça, deve ser incluída no prompt do sistema. Essas instruções ajudam a IA a proporcionar uma experiência consistente e útil aos usuários.
- Os resultados da pesquisa de vetor: os resultados da pesquisa de vetor fornecem os itens mais semelhantes em seus dados com base no vetor de consulta. Como os resultados da pesquisa de vetor retornados são os próprios documentos inteiros, você deve escolher os campos mais relevantes a serem incluídos no prompt, como talvez a categoria ou a descrição da bicicleta. A IA pode usar essas informações para gerar respostas detalhadas com base nos resultados da busca em vetores. Por exemplo, se os resultados da pesquisa de vetor retornarem Mountain Bikes e Road Bikes, a IA poderá fornecer informações detalhadas sobre esses tipos de bicicletas.
Há muitas maneiras programáticas de gerar o prompt. O segredo é estruturá-lo de forma a fornecer instruções claras à IA sobre como gerar respostas com base nos resultados da busca em vetores. Visitamos um desses métodos no exercício do módulo.
Depois de definir seu prompt estruturado, você poderá usar os seguintes trechos de código para gerar respostas usando o OpenAI do Azure:
Python
response = AzureOpenAICompletionClient.chat.completions.create(
model=completion_deployment, messages=structuredPrompt)
Node.js
const response = await AzureOpenAICompletionClient.getChatCompletions(completionDeployment, structuredPrompt);
Esses comandos chamam a API do OpenAI do Azure para gerar respostas detalhadas com base no prompt estruturado, usando um modelo especificado para fornecer informações com reconhecimento de contexto que complementam os resultados da busca em vetores.
Essa configuração combina os dados do cliente do Azure Cosmos DB for MongoDB baseado em vCore com os modelos de IA do OpenAI do Azure para formar seu sistema RAG (Geração Aumentada por Recuperação). Ao integrar a busca em vetores, ela permite que a IA extraia informações precisas e relevantes do Azure Cosmos DB for MongoDB baseado em vCore para obter respostas aprimoradas. Essa abordagem melhora significativamente a qualidade e a relevância das respostas geradas por IA utilizando seus próprios dados.