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

Aprimoramento da precisão do LLM usando o Atlas Vector Search do MongoDB e os metadados Unstructured.io

Ronny Hoesada12 min read • Published Dec 04, 2023 • Updated Dec 04, 2023
IAPythonAtlas
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Apesar dos progressos notáveis na inteligência artificial, especialmente na AI generativa (GenAI), a precisão continua sendo um objetivo indefinido para os resultados doLLM. De acordo com a última Pesquisa Global Anual da MacKinset, “The state of AI in 2023,“A AI teve um ano de destaque. Praticamente um quarto dos gerentes de nível C usa pessoalmente ferramentas gerais de AI para o trabalho, e mais 25% das empresas com implementações de AI têm a AI geral nas agendas de seus conselhos. Além disso, 40% dos pesquisados planeja aumentar o capital da organização em AI devido aos progressos da AI em geral. A pesquisa reflete o infinito potencial e a rápida aprovação das tecnologias de AI. No entanto, a pesquisa também aponta para uma preocupação significativa: imprecisão.
A imprecisão nos LLMs geralmente resulta em "alucinações" ou informações incorretas devido a limitações como a compreensão semântica superficial e a qualidade variável de dados. A incorporação da pesquisa vetorial semântica usando o MongoDB pode ajudar, permitindo a consulta em tempo real dos dados de treinamento, garantindo que as respostas geradas estejam alinhadas com o que o modelo aprendeu. Além disso, a adição de filtragem de metadados extraídos por ferramentas não estruturadas pode refinar a precisão, permitindo que o modelo avalie a confiabilidade de suas fontes de dados. Juntos, esses métodos podem minimizar significativamente o risco de alucinações e tornar os LLMs mais confiáveis.
Este artigo aborda esse desafio fornecendo um guia abrangente sobre como melhorar a precisão de suas saídas de LLM usando o Atlas Vector Search e as técnicas de extração de metadados não estruturados do MongoDB. O principal objetivo deste tutorial é equipar você com o conhecimento e as ferramentas necessárias para incorporar documentos de origem externa em seu LLM, enriquecendo assim as respostas do modelo com informações bem fundamentadas e contextualmente precisas. Ao final deste tutorial, você poderá gerar uma saída precisa do modelo OpenAI GPT-4 para citar o documento de origem, incluindo o nome do arquivo e o número da página. O bloco de notas completo deste tutorial está disponível no Google Colab, mas analisaremos as seções do tutorial juntos.

Por que usar o MongoDB Vector Search?

O MongoDB é um banco de dados NoSQL, que significa "not only SQL", destacando sua flexibilidade no manuseio de dados que não se encaixam bem em estruturas tabulares como as dos bancos de dados SQL. Os bancos de dados NoSQL são particularmente adequados para armazenar dados não estruturados e semiestruturados, oferecendo um esquema mais flexível, escalonamento horizontal mais fácil e a capacidade de lidar com grandes volumes de dados. Isso os torna ideais para aplicativos que exigem desenvolvimento rápido e a capacidade de gerenciar vastos arrays de metadados.
Os recursos robustos de pesquisa vetorial do MongoDB e a capacidade de lidar perfeitamente com dados e metadados vetoriais fazem dele uma plataforma ideal para aprimorar a precisão dos resultados do LLM. Permite pesquisas multifacetadas com base na similaridade semântica e em vários atributos de metadados. Esse conjunto exclusivo de recursos distingue o MongoDB das plataformas tradicionais de dados para desenvolvedores e aumenta significativamente a precisão e a confiabilidade dos resultados em tarefas de modelagem de linguagem.

Por que usar metadados não estruturados?

A biblioteca de código aberto Unstructured fornece componentes para a ingestão e o pré-processamento de imagens e documentos de texto, como PDFs, HTML, documentos do Word e muitos outros. Os casos de uso da Unstructured giram em torno da simplificação e otimização do fluxo de trabalho de processamento de dados para LLMs. Os blocos modulares e conectores da Unstructured formam um sistema coeso que simplifica a ingestão e o pré-processamento de dados, tornando-a adaptável a diferentes plataformas e transformando com eficiência dados não estruturados em resultados estruturados.
Os metadados são geralmente chamados de "dados sobre dados". Eles fornecem informações contextuais ou descritivas sobre os dados primários, como a fonte, o formato e as características relevantes. Os metadados das ferramentas não estruturadas rastreiam vários detalhes sobre elementos extraídos de documentos, permitindo que os usuários filtrem e analisem esses elementos com base em metadados específicos de interesse. Os campos de metadados incluem informações sobre o documento de origem e conectores de dados.
O conceito de metadados é familiar, mas sua aplicação no contexto de dados não estruturados gera muitas oportunidades. O pacote Unstructured acompanha uma variedade de metadados no nível do elemento. Esses metadados podem ser acessados com element.metadata e convertidos em uma representação de dicionário Python usando element.metadata.to_dict().
Neste artigo, nos concentramos particularmente nos metadados filename e page_number para melhorar a rastreabilidade e a confiabilidade das saídas do LLM. Ao fazer isso, podemos citar a localização exata do arquivo PDF que fornece a resposta a uma consulta do usuário. Isso se torna especialmente importante quando o LLM responde a consultas relacionadas a tópicos delicados, como questões financeiras, jurídicas ou médicas.

Passo a passo do código

Requisitos

  1. Cadastre-se para obter uma conta do MongoDB Atlas e instale a biblioteca PyMongo no IDE de sua escolha ou no Colab.
  2. Instale a biblioteca Unstructured no IDE de sua preferência ou no Colab.
  3. Instale a biblioteca Sentence Transformer para incorporar no IDE de sua escolha ou no Colab.
  4. Obtenha a chave da API OpenAI. Para isso, certifique-se de ter uma conta OpenAI.

Processo por etapas

  1. Extraia os textos e os metadados dos documentos de origem usando o partition_pdf do Unstructured.
  2. Prepare os dados para armazenamento e recuperação no MongoDB.
    • Vetorize os textos usando a biblioteca SentenceTransformer.
    • Conecte e carregue registros no MongoDB Atlas.
    • Consulte o índice com base na similaridade de incorporação.
  3. Gere a saída LLM usando o modelo OpenAI.
Etapa 1: extração de texto e metadados
Certifique-se de ter instalado as bibliotecas necessárias para executar o código necessário.
Vamos nos aprofundar na extração de dados de um documento PDF, especificamente o artigo seminal "Attention is All You Need", usando a função partition_pdf da biblioteca Unstructured em Python. Primeiro, você precisará importar a função com from unstructured.partition.pdf import partition_pdf. Em seguida, você pode chamar partition_pdf e passar os parâmetros necessários:
  • filename especifica o arquivo PDF a ser processado, que é "example-docs/Attention is All You Need.pdf."
  • strategy define o tipo de extração e, para uma varredura mais abrangente, usamos "hi_res."
  • Por fim, infer_table_structured=True diz à função para extrair também os metadados da tabela.
Configurado corretamente, como você pode ver em nosso arquivo Colab, o código fica assim:
Ao executar esse código, você preencherá a variável elements com todas as informações extraídas do PDF, prontas para análise ou manipulação adicionais. Nos trechos de código do Colab, você pode inspecionar os textos extraídos e os metadados dos elementos. Para observar as saídas de amostra – ou seja, o tipo e o texto do elemento – execute a linha abaixo. Use uma declaração impressa e certifique-se de que a saída recebida corresponda à seguinte:
Saída:
Você também pode usar o Counter da Python Collection para contar o número de tipos de elementos identificados no documento.
Por fim, você pode converter os objetos de elemento em dicionários Python usando a função integrada convert_to_dict para extrair e modificar seletivamente os metadados do elemento.
Etapa 2: Preparação, armazenamento e recuperação de dados
Etapa 2a: Vetorize os textos usando a biblioteca SentenceTransformer.
Devemos incluir os metadados do elemento extraído ao armazenar e recuperar os textos do MongoDB Atlas para permitir a recuperação de dados com metadados e pesquisa vetorial.
Primeiro, vetorizamos os textos para realizar uma pesquisa vetorial baseada em similaridade. Neste exemplo, usamos microsoft/mpnet-base da biblioteca Sentence Transformer. Esse modelo tem um tamanho de incorporação 768.
É importante usar um modelo com o mesmo tamanho de incorporação definido no Índice do MongoDB Atlas. Certifique-se de usar o tamanho de incorporação compatível com os índices do MongoDB Atlas. Você pode definir o índice usando a sintaxe JSON abaixo:
Copie e cole o índice JSON em sua coleção MongoDB para que ele possa indexar o campo embedding nos registros. Consulte esta documentação sobre como indexar incorporações de vetores para Vector Search.
Fig 1. criar um índice usando o tipo knnVector para o campo de incorporação
Em seguida, crie a incorporação de texto para cada registro antes de carregá-los no MongoDB Atlas:
Passo 2b: conectar e carregar registros no MongoDB Atlas
Antes de podermos armazenar nossos registros no MongoDB, usaremos a biblioteca PyMongo para estabelecer uma conexão com o MongoDB database e a coleção. Use este trecho de código para conectar e testar a conexão (consulte a documentação do MongoDB sobre como se conectar ao cluster).
Uma vez executada, a saída: "Pinged your deployment. You successfully connected to MongoDB!" aparecerá.
Em seguida, podemos fazer o upload dos registros usando a função insert_many do PyMongo.
Para isso, primeiro precisamos obter nossa string de conexão com o MongoDB database. Certifique-se de que os nomes do banco de dados e da coleção correspondem aos do MongoDB Atlas.
Vamos visualizar os registros no MongoDB Atlas:
Fig 2. visualize os registros na coleção do MongoDB Atlas
Passo 2c: Consulte o índice com base na similaridade de incorporação
Agora, podemos recuperar os registros relevantes calculando a pontuação de similaridade definida na pesquisa vetorial do índice. Quando um usuário envia uma consulta, precisamos vetorizá-la usando o mesmo modelo de incorporação que usamos para armazenar os dados. Usando a função aggregate, podemos passar um pipeline que contém as informações para realizar uma pesquisa vetorial.
Agora que temos os registros armazenados no MongoDB Atlas, podemos pesquisar os textos relevantes usando a pesquisa vetorial. Para isso, precisamos vetorizar a consulta usando o mesmo modelo de incorporação e usar a função de agregação para recuperar os registros do índice.
Na pipeline, especificaremos o seguinte:
  • index: o nome do índice de pesquisa vetorial na coleção
  • vector: a consulta vetorizada do usuário
  • k: o número dos registros mais semelhantes que queremos extrair da coleção
  • score: a pontuação de similaridade gerada pelo MongoDB Atlas
A pipeline acima retornará os cinco principais registros mais próximos da incorporação da consulta do usuário. Podemos definir k para recuperar os registros top-k no MongoDB Atlas. Observe que os resultados contêm metadata, text e score. Podemos usar essas informações para gerar a saída do LLM na etapa seguinte.
Aqui está um exemplo dos cinco vizinhos mais próximos da consulta acima:
Etapa 3: Gerar a saída do LLM com a citação do documento de origem
Podemos gerar a saída usando o modelo GPT-4 da OpenAI. Usaremos a função ChatCompletion da API OpenAI para essa etapa final. A API ChatCompletion processa uma lista de mensagens para gerar uma resposta orientada por modelo. Projetada para conversas com vários turnos, ela é igualmente adequada para tarefas de turno único. A entrada primária é o parâmetro "messages", que compreende uma matriz de objetos de mensagem com funções designadas ("system", "user", ou "assistant") e conteúdo. Geralmente iniciadas com uma mensagem do sistema para orientar o comportamento do assistente, as conversas podem variar em duração com mensagens alternadas do usuário e do assistente. Embora a mensagem do sistema seja opcional, sua ausência pode padronizar o modelo para um comportamento genérico de assistente útil.
Você precisará de uma chave de API da OpenAI para executar as inferências. Antes de tentar executar essa etapa, verifique se você tem uma conta da OpenAI. Supondo que você armazene a chave de API da OpenAI na variável de ambiente, é possível importá-la usando a função os.getenv:
Em seguida, ter um prompt convincente é fundamental para gerar um resultado satisfatório. Aqui está o prompt para gerar a saída com referência específica da origem das informações – ou seja, nome do arquivo e número da página.
Nesse script em Python, é feita uma solicitação ao modelo GPT-4 da OpenAI por meio do método ChatCompletion.create para processar uma conversa. A conversa é estruturada com funções e mensagens predefinidas. Ela é instruída a gerar uma resposta com base no contexto fornecido e na consulta do usuário, resumindo a resposta e citando o número da página e o nome do arquivo. O parâmetro de temperature definido como 0.2 influencia a aleatoriedade da saída, favorecendo respostas mais determinísticas.

Avaliando a qualidade da saída do LLM com o documento de origem

Um dos principais recursos da utilização de metadados não estruturados em conjunto com o Vector Search do MongoDB é a capacidade de fornecer resultados altamente precisos e rastreáveis.
Você pode inserir essa consulta na API ChatCompletion como a função "user" e o contexto dos resultados de recuperação do MongoDB como a função "assistant". Para fazer com que o modelo responda com o nome do arquivo e o número da página, você pode fornecer a instrução na função "system".
Documento de origem: Fig 3. Os textos relevantes no documento de origem para responder à consulta do usuário
Saída do LLM: Fig 4. A resposta do modelo GPT-4 se refere ao nome do arquivo e ao número da página
O resultado altamente específico cita informações do documento de origem, "Attention is All You Need.pdf," armazenado no diretório "example-docs". As respostas são referenciadas com números de página exatos, facilitando a verificação das informações por qualquer pessoa. Esse nível de detalhe é crucial ao responder a consultas relacionadas a questões médicas, jurídicas ou de pesquisa, e aumenta significativamente a confiabilidade dos resultados do LLM.

Conclusão

Este artigo apresenta um método para aumentar a precisão do LLM usando as técnicas de pesquisa vetorial e extração de metadados não estruturados do MongoDB. Essas abordagens, que facilitam a consulta em tempo real e a filtragem de metadados, reduzem substancialmente o risco de geração de informações incorretas. Os recursos do MongoDB, especialmente no tratamento de dados vetoriais e na facilitação de pesquisas multifacetadas, juntamente com a eficiência do processamento de dados da biblioteca Unstructured, surgem como soluções robustas. Essas técnicas não apenas melhoram a precisão, mas também aprimoram a rastreabilidade e a confiabilidade das saídas do LLM, especialmente ao lidar com tópicos delicados, equipando os usuários com as ferramentas necessárias para gerar saídas mais precisas e contextualmente corretas a partir dos LLMs.
Pronto para começar? Solicite sua chave de API Unstructured hoje mesmo e desbloqueie o poder da API e dos conectores Unstructured. Junte-se ao grupo da comunidade Unstructured para se conectar com outros usuários, fazer perguntas, compartilhar suas experiências e obter as atualizações mais recentes. Mal podemos esperar para ver o que você vai criar.

Í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

RAG interativo com MongoDB Atlas + API de chamada de função


Sep 18, 2024 | 16 min read
Tutorial

Como implementar fluxos de trabalho do Databricks e o Atlas Vector Search para melhorar a precisão da pesquisa de comércio eletrônico


Sep 18, 2024 | 6 min read
Tutorial

Desenvolver um catálogo de conteúdo de e-commerce com Atlas Search


Jun 27, 2022 | 10 min read
Sumário