EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Usando os embeddings mais recentes da OpenAI em um sistema RAG com o MongoDB

Richmond Alake15 min read • Published Jul 01, 2024 • Updated Jul 01, 2024
IAPythonAtlas
Ícone do FacebookÍcone do Twitterícone do linkedin
MongoDB Atlas e funções do Azure
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty

Introdução

A OpenAI lançou recentemente novos modelos de incorporação e moderação. Este artigo explora o processo de implementação passo a passo da utilização de um dos novos modelos de incorporação: text-embedding-3-small em um sistema de geração aumentada de recuperação (RAG) desenvolvido pelo banco de dados vetorial do MongoDB Atlas.

O que é uma incorporação?

Uma incorporação é uma representação matemática de dados em um espaço de alta dimensão, normalmente chamado de espaço vetorial. Dentro de um espaço vetorial, as incorporações vetoriais são posicionadas com base em suas relações semânticas, conceitos ou relevância contextual. Essa relação espacial dentro do espaço vetorial reflete efetivamente as associações nos dados originais, tornando as incorporações úteis em vários domínios de IA, como aprendizado de máquina, aprendizado profundo, IA generativa (GenAI), processamento de linguagem natural (PLN), visão computacional e ciência de dados.
A criação de uma incorporação envolve o mapeamento de dados relacionados a entidades como palavras, produtos, áudio e perfis de usuário em um formato numérico. Na PLN, esse processo envolve a transformação de palavras e frases em vetores, convertendo seus significados semânticos em uma forma legível por máquina.
Os aplicativos de AI que utilizam padrões de design de arquitetura RAG aproveitam as incorporações para aumentar o processo generativo de grandes modelos de linguagem (LLM), recuperando informações relevantes de um armazenamento de dados como o MongoDB Atlas. Ao comparar as incorporações da query com as do banco de dados, os sistemas RAG incorporam conhecimento externo, melhorando a relevância e a precisão das respostas.
Diagrama de arquitetura do RAG Naive. Crédito da imagem
Recentemente, a OpenAI introduziu dois novos modelos de incorporação: text-embedding-3-small e text-embedding-3-large. O modelo text-embedding-3-small oferece uma solução compacta e altamente eficiente, ideal para aplicações que exigem velocidade e agilidade, enquanto o modelo text-embedding-3-large fornece uma representação vetorial mais detalhada e poderosa, adequada para tarefas de processamento de dados complexas e com nuances.
ada v2text-embedding-3-smalltext-embedding-3-large
Tamanho de incorporação1536256, 512 e 1536256, 1024 e 3072

Principais conclusões

  • Modelos de incorporação da OpenAI: conheça os novos modelos de incorporação da OpenAI, text-embedding-3-small e text-embedding-3-large, e seus aplicativos.
  • Etapas práticas de implementação: siga etapas práticas, incluindo instalação de bibliotecas, carregamento e pré-processamento de dados, criação de incorporações e ingestão de dados no MongoDB.
  • Índice de pesquisa vetorial no MongoDB: saiba como criar e usar um índice de pesquisa vetorial para recuperação eficiente e processamento de queries do usuário.
  • Respostas a queries orientadas por IA: entenda como lidar com as queries de usuários e gerar respostas de IA, integrando insights do sistema RAG para obter respostas mais precisas.
  • Insights de aplicativos no mundo real: obtenha experiência prática na implementação de um sistema RAG avançado para usos práticos, como um mecanismo de recomendações de filmes.
A seção a seguir apresenta uma série de etapas que explicam como utilizar o novo modelo de incorporação OpenAI text-embedding-3-small   para incorporar pontos de dados de plotagem para filmes em um conjunto de dados de filmes para alimentar um RAG que responde às queries dos usuários com base na coleção de filmes.
As etapas também abrangem os estágios típicos dos sistemas e pipelines RAG que os engenheiros de AI provavelmente encontrarão:
  1. Carregamento de dados: importar e acessar conjuntos de dados de várias fontes de dados para processamento e análise; a etapa envolve a disponibilização de dados no ambiente do aplicativo.
  2. Limpeza e preparação de dados: refinamento do conjunto de dados com a remoção de imprecisões, preenchimento de valores ausentes e formatação de dados para uso nos estágios posteriores do pipeline.
  3. Ingestão e indexação de dados: mover os dados processados para um armazenamento de dados, como o banco de dados do MongoDB Atlas, e criar índices para otimizar a eficiência da recuperação e o desempenho da pesquisa.
  4. Query: execução de query de pesquisa no banco de dados para recuperar dados relevantes com base em critérios específicos ou entradas do usuário.

Etapa 1: instalação de bibliotecas

O ambiente de desenvolvimento para a demonstração do modelo de incorporação text-embedding-3-small e do sistema de recuperação requer a configuração de bibliotecas e ferramentas instaladas usando o pip do gerenciador de pacotes Python.
Abaixo estão breves explicações das ferramentas e bibliotecas utilizadas no código de implementação:
  • conjuntos de dados: essa biblioteca faz parte do ecossistema Hugging Face. Ao instalar os "conjuntos de dados", obtemos acesso a vários conjuntos de dados pré-processados e prontos para uso, que são essenciais para o treinamento e o ajuste fino dos modelos de aprendizado de máquina ou para a avaliação comparativa de seu desempenho.
  • pandas: esta é uma biblioteca de ciência de dados que fornece estruturas de dados robustas e métodos para manipulação, processamento e análise de dados.
  • openai: esta é a biblioteca oficial do cliente Python para acessar o conjunto de modelos e ferramentas de AI da OpenAI, incluindo GPT e modelos de incorporação.
  • pymongo: PyMongo é um kit de ferramentas Python para MongoDB. Ele permite interações com um MongoDB database.

Etapa 2: carregamento de dados

O trecho de código abaixo mostra a fase de carregamento de dados em que as bibliotecas load_dataset da biblioteca de conjuntos de dados Hugging Face e a biblioteca do panda, denotada como pd, são importadas para o ambiente de desenvolvimento. A função load_dataset serve para acessar uma ampla gama de conjuntos de dados disponíveis no repositório da Hugging Face.
Carregue o conjunto de dados intitulado AIatMongoDB/embedded_movies. Esse conjunto de dados é uma coleção de detalhes relacionados a filmes que incluem atributos como título, ano de lançamento, elenco e enredo. Um recurso exclusivo desse conjunto de dados é o campo plot_embedding para cada filme. Essas incorporações são geradas usando o modelo text-embedding-ada-002 da OpenAI.
Depois de carregar o conjunto de dados, ele é convertido em um DataFrame do pandas; esse formato de dados simplifica o tratamento e a análise dos dados. Exiba as cinco primeiras linhas usando a função head(5) para obter uma compreensão inicial dos dados. Essa visualização fornece um snapshot da estrutura do conjunto de dados e seus vários atributos, como incorporações de gênero, elenco e enredo.
Importe as bibliotecas:
  • de conjuntos de dados importa load_dataset: importa a função load_dataset da biblioteca de conjuntos de dados do Hugging Face; essa função é usada para carregar conjuntos de dados do extenso repositório de conjuntos de dados do Hugging Face.
  • importar pandas como pd: importa a biblioteca pandas, uma ferramenta fundamental em Python para manipulação e análise de dados, usando o alias pd.
Carregue o conjunto de dados:
  • dataset = load_dataset("AIatMongoDB/embedded_movies"): carrega o conjunto de dados denominado embedded_movies do repositório de conjuntos de dados do Hugging Face; esse conjunto de dados é fornecido pelo MongoDB e é projetado especificamente para tarefas de incorporação e recuperação.
Converter conjunto de dados para Pandas DataFrame:
  • dataset_df = pd.DataFrame(dataset\['train'\]): converte a parte de treinamento do conjunto de dados em um pandas DataFrame.
Visualize o conjunto de dados:
  • dataset_df.head(5): exibe as cinco primeiras entradas do DataFrame.

Etapa 3: limpeza e preparação de dados

A próxima etapa limpa os dados e os prepara para a próxima etapa, que cria um novo ponto de dados de incorporação usando o novo modelo de incorporação da OpenAI.
Removendo dados incompletos:
  • dataset_df = dataset_df.dropna(subset=\['plot'\]): garante a integridade dos dados removendo qualquer ponto/linha de dados onde a coluna "plot" está sem dados; como "plot" é um componente vital para as novas incorporações, sua integridade afeta o desempenho de recuperação.
Preparação para novas incorporações:
  • dataset_df = dataset_df.drop(columns=\['plot_embedding'\]): remover a coluna “plot_embedding existente; para novas incorporações usando o modelo "text-embedding-3-small" do OpenAI, as incorporações existentes (geradas por um modelo diferente) não são mais necessárias.
  • dataset_df.head(5): permite ver as cinco primeiras linhas do datagrama atualizado para garantir a remoção da coluna "plot_embedding " e confirmar a prontidão dos dados.

Etapa 4: criar incorporações com OpenAI

Esse estágio se concentra na geração de novas incorporações usando o modelo avançado da OpenAI.
Esta demonstração usa um Google Colab Notebook, no qual as variáveis de ambiente são configuradas explicitamente na seção Secrets do notebook e acessadas usando o módulo de dados do usuário. Em um ambiente de produção, as variáveis de ambiente que armazenam chaves secretas geralmente são armazenadas em um arquivo .env ou equivalente.
Uma chave de API OpenAI é necessária para garantir a conclusão bem-sucedida desta etapa. Mais detalhes sobre os modelos de incorporação da OpenAI podem ser encontrados no site oficial.
Configurando a API da OpenAI:
  • Importações e chave de API: importe a biblioteca openai e recupere a chave de API dos dados de usuário do Google Colab.
  • Seleção de modelo: defina a variável EMBEDDING_MODEL como text-embedding-3-small.
Função de geração de incorporação:
  • get_embedding: converte texto em incorporações; ele usa a entrada de string e o modelo de incorporação como argumentos e gera a incorporação de texto usando o modelo OpenAI especificado.
  • Validação de entrada e chamada de API: valida a entrada para garantir que seja uma string válida e, em seguida, chama a OpenAI API para gerar a incorporação.
  • Se o processo encontrar algum problema, como entrada inválida ou erros de API, a função retornará Nenhum.
  • Aplicando ao conjunto de dados: a função get_embedding é aplicada à coluna "plot" do DataFrame dataset_df. Cada gráfico é transformado em um dado de incorporação otimizado armazenado em uma nova coluna, plot_embedding_optimised.
  • Visualizar conjunto de dados atualizado: dataset_df.head() exibe as primeiras linhas do DataFrame.

Etapa 5: configuração do banco de dados vetorial e ingestão de dados

O MongoDB atua como um banco de dados operacional e um banco de dados vetorial. Ele oferece uma solução de banco de dados que armazena, consulta e recupera com eficiência incorporações vetoriais — as vantagens disso estão na simplicidade da manutenção, do gerenciamento e do custo do banco de dados.
Para criar um novo MongoDB database, configure um cluster de banco de dados:
  1. Registre-se para obter uma conta gratuita do MongoDB Atlas ou, para usuários existentes, faça login no MongoDB Atlas.
  2. Selecione a opção “Database” no painel esquerdo, que navegará até a página de implantação do banco de dados, na qual há uma especificação de implantação de qualquer cluster existente. Crie um novo cluster de banco de dados clicando no botão "+Criar".
Implantações de banco de dados e dashboard de cluster
3.   Selecione todas as configurações aplicáveis para o cluster do banco de dados. Depois que todas as opções de configuração estiverem selecionadas, clique no botão "Create Cluster" para implantar o cluster recém-criado. O MongoDB também permite a criação de clusters gratuitos no "Shared Tab. "
Observação: não se esqueça de colocar o IP na lista de permissões para o host Python ou 0.0.0.0/0 para qualquer IP ao criar a prova de conceitos.
Visão geral da configuração do cluster
4. Depois de criar e implantar o cluster com êxito, o cluster se tornará acessível na página “Database Deployment".
Dashboard e visão geral do cluster
5. Clique no botão “Connect” do cluster para ver a opção de configurar uma conexão com o cluster por meio de vários drivers de linguagem.
Visão geral das opções para conexão ao cluster
6. Este tutorial requer apenas o URI (identificador exclusivo de recurso) do cluster. Pegue o URI e copie-o para o ambiente do Google Colib Secrets em uma variável chamada MONGO_URI, ou coloque-o em um arquivo .env ou equivalente. Conectando ao cluster do Atlas via URI e driver Python
7. Configuração da conexão do banco de dados:
  • Função de conexão MongoDB: a função get_mongo_client é definida para estabelecer uma conexão com MongoDB usando o URI fornecido. Inclui tratamento de erros para gerenciar falhas de conexão.
8. Processo de ingestão de dados:
  • Recuperando o URI do MongoDB: o URI do MongoDB, crucial para a conexão com o banco de dados, é obtido das variáveis de ambiente usando userdata.get('MONGO_URI').
  • Estabelecendo conexão com o banco de dados: o script tenta se conectar ao MongoDB usando este URI.
  • Seleção de banco de dados e coleção: uma vez conectado, o script seleciona o banco de dados movies e a coleção movie_collection. Isto especifica onde os dados serão armazenados no MongoDB. Se o banco de dados ou a coleção não existirem, o MongoDB os criará automaticamente.
  • Conversão e inserção de dados: o DataFrame, com incorporações aprimoradas, é convertido em um formato de dicionário adequado para o MongoDB usando to_dict('records'). O método insert_many é então usado para alimentar dados em lote.

Etapa 6: crie um índice de pesquisa vetorial

Esta próxima etapa é obrigatória para realizar pesquisas baseadas em vetor eficientes e precisas com base nas incorporações vetoriais armazenadas nos documentos na coleção movie_collection. A criação de um índice de pesquisa vetorial habilita a capacidade de percorrer os documentos com eficiência para recuperar documentos com incorporações que correspondam à incorporação da query com base na similaridade vetorial. Leia mais sobre índices de pesquisa vetorial do MongoDB.
1. Navegue até Movie_collection no banco de dados de filmes. Neste ponto, o banco de dados é preenchido com vários documentos contendo informações sobre vários filmes, especialmente dentro dos gêneros de ação e relacionamento. Visão geral do registro na coleção de filmes
2. Selecione a opção da aba "Atlas Search" no painel de navegação para criar um índice do Atlas Vector Search. Clique no botão "Create Search Index" para criar um índice do Atlas Vector Search. Visão geral das funcionalidades do Atlas Search
3. Na página para criar um índice de pesquisa vetorial, selecione a opção Atlas Vector Search, que permite a criação de um índice de pesquisa vetorial definindo o índice que usa JSON.
Criando um índice de pesquisa de vetores por meio da interface do MongoDB Atlas
4. A página abaixo permite a definição do índice via JSON. Essa página também oferece a capacidade de nomear a pesquisa de índice vetorial. O nome dado ao índice será referenciado no código de implementação nas etapas a seguir. Para este tutorial, o nome "vector_index " será usado.
5. Para concluir a criação do índice de pesquisa vetorial, selecione o banco de dados e a coleção apropriados para os quais o índice deve ser criado. Neste cenário, é o banco de dados "movies " e a coleção "movie_collection. O JSON inserido no editor de JSON deve ser semelhante ao seguinte:
  • campos: esta é uma lista que especifica os campo a serem indexados na coleção MongoDB junto com a definição da característica do próprio índice.
  • numDimensions: em cada item de campo, numDimensions especifica o número de dimensões dos dados do vetor. Nesse caso, ele é definido como 1536. Esse número deve corresponder à dimensionalidade dos dados de vetor armazenados no campo e também é uma das dimensões que o text-embedding-3-small da OpenAI cria em incorporações de vetor.
  • caminho: o campo de caminho indica o caminho para os dados dentro dos documentos do banco de dados a serem indexados. Aqui, ele está definido como plot_embedding_optimised.
  • similaridade: o campo de similaridade define o tipo de métrica de distância de similaridade que será usada para comparar vetores durante uma pesquisa. Aqui, ele é definido como cosseno, que mede o cosine do ângulo entre dois vetores, determinando efetivamente o nível de semelhança ou diferença desses vetores em sua orientação no espaço vetorial. Outras medidas métricas de distância de similaridade são Euclideano e Produtos pontuais. Encontre mais informações sobre como indexar incorporações vetoriais para pesquisa vetorial.
  • Tipo: este campo especifica o tipo dos dados que o índice manipulará. Nesse caso, ele é definido como vector, indicando que esse índice foi projetado especificamente para lidar com e otimizar pesquisas em dados vetoriais.
Editor JSON para definir o índice de pesquisa vetorial
Agora, o índice de pesquisa vetorial deve ser criado com sucesso. Navegar de volta para a página do Atlas Search deve mostrar o índice chamado vector_index com o status ativo.
Visão geral do índice de pesquisa do Atlas

Etapa 7: realize a pesquisa vetorial nas queries dos usuários

Essa etapa combina todas as atividades da etapa anterior para fornecer a funcionalidade de realizar pesquisas vetoriais em registros armazenados com base em queries de usuários incorporadas.
Esta etapa implementa uma função que retorna um resultado de pesquisa vetorial gerando uma incorporação de query e definindo um pipeline de agregação MongoDB. O pipeline, que consiste nos estágios $vectorSearch e $project, faz queries usando o vetor gerado e formata os resultados para incluir somente informações necessárias, como enredo, título e gêneros, incorporando uma pontuação de pesquisa para cada resultado. Essa projeção seletiva melhora o desempenho da query reduzindo a transferência de dados e otimiza o uso de recursos de rede e memória, o que é especialmente importante ao lidar com grandes conjuntos de dados. Para engenheiros e desenvolvedores de IA que consideram a segurança de dados em um estágio inicial, as chances de dados confidenciais vazarem para o lado do cliente podem ser minimizadas excluindo cuidadosamente campos irrelevantes para a query do usuário.
Descrição do pipeline agregado para executar queries de pesquisa vetorial
1. Função personalizada da pesquisa vetorial:
  • A função vector_search foi projetada para executar uma pesquisa sofisticada dentro de uma coleção do MongoDB, utilizando as incorporações vetoriais armazenadas no banco de dados.
  • Aceita dois parâmetros: user_query, uma string representando a query de pesquisa do usuário e collection, uma coleção do MongoDB a ser pesquisada.
2. Incorporação de query e pipeline de pesquisa:
  • Geração de incorporação: a função começa gerando uma incorporação para a query do usuário usando a função get_embedding .
  • Definindo o pipeline de pesquisa: um pipeline de agregação MongoDB é definido para a pesquisa vetorial. Esse pipeline usa o operador $vectorSearch para encontrar documentos cujas incorporações correspondam melhor à incorporação da query. O pipeline especifica o índice a ser usado, o vetor de query e o caminho para as incorporações nos documentos, limitando o número de correspondências de candidatos e o número de resultados retornados.
  • Projeção de resultados: o estágio$project formata a saída incluindo campos relevantes, como enredo, título, gêneros e pontuação de pesquisa, excluindo o ID do documento MongoDB.

Etapa 8: lidando com a query do usuário e o resultado

A etapa final da fase de implementação se concentra na aplicação prática de nossa funcionalidade de pesquisa vetorial e na integração de AI para lidar com as queries dos usuários de forma eficaz.  A função handle_user_query realiza uma pesquisa vetorial na coleção do MongoDB com base na query do usuário e utiliza o modelo GPT-3.5 da OpenAI para gerar respostas sensíveis ao contexto.
1. Funcionalidade para tratamento de queries:
  • A função handle_user_query recebe uma query do usuário e a coleção MongoDB como entradas.
  • Ele começa executando uma pesquisa vetorial na coleção com base na query do usuário, recuperando documentos relevantes do filme.
2. Geração de respostas orientadas por IA:
  • Compilação de contexto: em seguida, a função compila uma string de contexto a partir dos resultados da pesquisa, concatenando títulos e enredos dos filmes recuperados.
  • Integração do modelo OpenAI: a função openai.chat.completions.create é chamada com o modelo gpt-3.5-turbo.
  • Funções de sistema e usuário: na mensagem enviada ao modelo da OpenAI, duas funções são definidas: sistema, que estabelece o papel da IA como um sistema de recomendação de filmes, e usuário, que fornece a query real do usuário e o contexto.
3. Executando e exibindo respostas:
  • A função handle_user_query retorna a resposta gerada por IA e o contexto do resultado da pesquisa usado.
Este é o resultado da execução da função:

Conclusão

O novo modelo de incorporação da OpenAI promete melhor desempenho em termos de recuperação em vários idiomas e precisão específica da tarefa, em comparação com os modelos de incorporação da OpenAI lançados anteriormente. Este artigo descreveu as etapas de implementação de um sistema RAG que aproveita o modelo de incorporação mais recente. Veja o repositório do GitHub para obter o código de implementação.
Em cenários práticos, incorporações de menor dimensão que podem manter um alto nível de captura semântica são benéficas para aplicativos de AI generativa, nos quais a relevância e a velocidade de recuperação são cruciais para a experiência e o valor do usuário.
Outras vantagens de dimensões de incorporação menores com alto desempenho são:
  • Melhor experiência e relevância do usuário: a relevância da recuperação de informações é otimizada, impactando diretamente a experiência do usuário e o valor em aplicativos orientados por IA.
  • Comparação com o modelo anterior: em contraste com o modelo ada v2 anterior, que fornecia apenas incorporações na dimensão 1536, os novos modelos oferecem mais flexibilidade. O text-embedding-3-large estende essa flexibilidade ainda mais com dimensões de 256, 1024 e 3072.
  • Eficiência no processamento de dados: a disponibilidade de incorporações de menor dimensionamento ajuda no processamento de dados mais eficiente, reduzindo a carga computacional sem comprometer a qualidade dos resultados.
  • Otimização de recursos: as incorporações de dimensões inferiores são otimizadas para recursos, benéficas para aplicativos executados com memória e capacidade de processamento limitadas e para reduzir os custos computacionais gerais.
Os próximos artigos abordarão tópicos avançados, como modelos de incorporação de benchmarking e tratamento de migração de incorporações.

Perguntas frequentes

1. O que é incorporação?

Incorporação é uma técnica em que dados — como palavras, áudio ou imagens — são transformados em representações matemáticas, vetores de números reais em um espaço de alta dimensão conhecido como espaço vetorial. Esse processo permite que os modelos de IA entendam e processem dados complexos, capturando os relacionamentos semânticos subjacentes e as nuances contextuais.

2. O que é um armazenamento de vetor no contexto de IA e banco de dados?

Um armazenamento de vetor, como um banco de dados MongoDB Atlas, é um mecanismo de armazenamento para incorporações de vetor. Ele permite o armazenamento, a indexação e a recuperação eficientes de dados vetoriais, essenciais para tarefas como pesquisa semântica, sistemas de recomendações e outros aplicativos de IA.

3. Como um sistema de geração aumentada de recuperação (RAG) usa as incorporações?

Um sistema RAG usa incorporações para melhorar a resposta gerada por um grande modelo de linguagem (LLM) recuperando informações relevantes de um armazenamento de conhecimento com base em similaridades semânticas. A incorporação da query é comparada com a incorporação do armazenamento de conhecimento (registro do banco de dados) para buscar dados contextualmente semelhantes e relevantes, o que melhora a precisão e a relevância das respostas geradas pelo LLM para a query do usuário.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Vídeo

A cena do Atlas Search: Temporada 1


Sep 11, 2024 | 2 min
Tutorial

Tutorial do MongoDB Atlas Data Federation: consultas federadas e $out para AWS S3


Jan 23, 2024 | 7 min read
Tutorial

Como escrever testes de unidade para MongoDB Atlas Functions


Sep 09, 2024 | 10 min read
Artigo

Multi-agent Systems With AutoGen and MongoDB


Sep 18, 2024 | 10 min read
Sumário