Construindo um sistema RAG multimodal com Elasticsearch: A história de Gotham City

Aprenda a construir um sistema multimodal de Recuperação-Geração Aumentada (RAG) que integra dados de texto, áudio, vídeo e imagem para fornecer recuperação de informações mais rica e contextualizada.

O Elasticsearch conta com integrações nativas com as principais ferramentas e provedores de IA generativa do setor. Confira nossos webinars sobre como ir além do básico do RAG ou criar aplicativos prontos para produção com o banco de dados vetorial da Elastic.

Para criar as melhores soluções de busca para seu caso de uso, inicie um teste gratuito na nuvem ou experimente o Elastic em sua máquina local agora mesmo.

Neste blog, você aprenderá a criar um pipeline RAG (Retrieval-Augmented Generation) multimodal usando o Elasticsearch. Exploraremos como aproveitar o ImageBind para gerar incorporações para vários tipos de dados, incluindo texto, imagens, áudio e mapas de profundidade. Você também descobrirá como armazenar e recuperar esses embeddings de forma eficiente no Elasticsearch usando dense_vector e pesquisa k-NN. Por fim, integraremos um grande modelo de linguagem (LLM) para analisar as evidências recuperadas e gerar um relatório final abrangente.

Como funciona o gasoduto multimodal RAG?

  1. Coletando pistas → Imagens, áudio, textos e mapas de profundidade da cena do crime em Gotham.
  2. Gerando embeddings → Cada arquivo é convertido em um vetor usando o modelo multimodal ImageBind.
  3. Indexação no Elasticsearch → Os vetores são armazenados para recuperação eficiente.
  4. Pesquisando por similaridade → Dada uma nova pista, os vetores mais semelhantes são recuperados.
  5. O LLM analisa as evidências → Um modelo GPT-4 sintetiza a resposta e identifica o suspeito!

Tecnologias utilizadas

  • ImageBind → Gera embeddings unificados para várias modalidades.
  • Elasticsearch → Permite pesquisa vetorial rápida e eficiente.
  • LLM (GPT-4, OpenAI) → Analisa as evidências e gera um relatório final.

Para quem é este blog?

  • Usuários do Elastic interessados em pesquisa vetorial multimodal.
  • Desenvolvedores que buscam entender o RAG Multimodal na prática.
  • Qualquer pessoa em busca de soluções escaláveis para analisar dados de diversas fontes.

Pré-requisitos para RAG multimodal: Configurando o ambiente

Para resolver o crime em Gotham City, você precisa configurar seu ambiente tecnológico. Siga este guia passo a passo:

1. Requisitos técnicos

ComponenteEspecificação
Sistema OperacionalLinux, macOS ou Windows
Python3.10 ou posterior
BATERMínimo de 8 GB (16 GB recomendado)
GPUOpcional, mas recomendado para ImageBind

2. Configurando o projeto

Todos os materiais de investigação estão disponíveis no GitHub, e usaremos o Jupyter Notebook (Google Colab) para esta experiência interativa de resolução de crimes. Siga estes passos para começar:

Configurando com o Jupyter Notebook (Google Colab)

1. Acesse o notebook

  • Abra nosso notebook Google Colab pronto para uso: Multimodal RAG com Elasticsearch.
  • Este caderno contém todo o código e explicações que você precisa acompanhar.

2. Clone o repositório

3. Instalar dependências

4. Configurar credenciais

Observação: o modelo ImageBind (~2 GB) será baixado automaticamente na primeira execução.

Agora que tudo está pronto, vamos nos aprofundar nos detalhes e solucionar o crime!

Introdução: O crime em Gotham City

Em uma noite chuvosa em Gotham City, um crime chocante abala a cidade. O comissário Gordon precisa da sua ajuda para desvendar o mistério. As pistas estão espalhadas em diferentes formatos: imagens borradas, áudio misterioso, textos criptografados e até mapas de profundidade. Você está pronto para usar a tecnologia de IA mais avançada para resolver o caso?

Neste blog, você será guiado passo a passo pela construção de um sistema RAG (Recuperação-Geração Aumentada) multimodal que unifica diferentes tipos de dados (imagens, áudio, textos e mapas de profundidade) em um único espaço de busca. Usaremos o ImageBind para gerar embeddings multimodais, o Elasticsearch para armazenar e recuperar esses embeddings e um Large Language Model (LLM) para analisar as evidências e gerar um relatório final.

Fundamentos: Arquitetura RAG multimodal

O que é um RAG multimodal?

A ascensão da Geração Aumentada de Recuperação (RAG) Multimodal está revolucionando a maneira como interagimos com modelos de IA. Tradicionalmente, os sistemas RAG trabalham exclusivamente com texto, recuperando informações relevantes de bancos de dados antes de gerar respostas. No entanto, o mundo não se limita ao texto: imagens, vídeos e áudio também contêm conhecimento valioso. É por isso que as arquiteturas multimodais estão ganhando destaque, permitindo que os sistemas de IA combinem informações de diferentes formatos para respostas mais ricas e precisas.

Três abordagens principais para RAG multimodal

Para implementar um RAG multimodal, três estratégias são comumente usadas. Cada abordagem tem suas próprias vantagens e limitações, dependendo do caso de uso:

1. Espaço vetorial compartilhado

Dados de diferentes modalidades são mapeados em um espaço vetorial comum usando modelos multimodais como o ImageBind. Isso permite que consultas de texto recuperem imagens, vídeos e áudio sem conversão de formato explícita.

Vantagens:

  • Permite recuperação multimodal sem exigir conversão de formato explícita.
  • Fornece uma integração fluida entre diferentes modalidades, permitindo recuperação direta de texto, imagem, áudio e vídeo.
  • Escalável para diversos tipos de dados, o que o torna útil para aplicações de recuperação em larga escala.

Desvantagens:

  • O treinamento requer grandes conjuntos de dados multimodais, que podem nem sempre estar disponíveis.
  • O espaço de incorporação compartilhado pode introduzir deriva semântica, onde as relações entre modalidades não são perfeitamente preservadas.
  • O viés em modelos multimodais pode afetar a precisão da recuperação, dependendo da distribuição do conjunto de dados.

2. Modalidade de aterramento único

Todas as modalidades são convertidas em um único formato, geralmente texto, antes da recuperação. Por exemplo, as imagens são descritas por meio de legendas geradas automaticamente e o áudio é transcrito em texto.

Vantagens:

  • Simplifica a recuperação, pois tudo é convertido em uma representação de texto uniforme.
  • Funciona bem com mecanismos de busca baseados em texto existentes, eliminando a necessidade de infraestrutura multimodal especializada.
  • Pode melhorar a interpretabilidade, pois os resultados recuperados estão em um formato legível por humanos.

Desvantagens:

  • Perda de informações: certos detalhes (por exemplo, relações espaciais em imagens, tom em áudio) podem não ser totalmente capturados em descrições de texto.
  • Depende da qualidade da legenda/transcrição: erros em anotações automáticas podem reduzir a eficácia da recuperação.
  • Não é ideal para consultas puramente visuais ou auditivas, pois o processo de conversão pode remover contexto essencial.

3. Recuperação separada

Mantém modelos distintos para cada modalidade. O sistema realiza pesquisas separadas para cada tipo de dado e depois mescla os resultados.

Vantagens:

  • Permite otimização personalizada por modalidade, melhorando a precisão da recuperação para cada tipo de dado.
  • Menor dependência de modelos multimodais complexos, facilitando a integração de sistemas de recuperação existentes.
  • Fornece controle refinado sobre classificação e reclassificação, pois resultados de diferentes modalidades podem ser combinados dinamicamente.

Desvantagens:

  • Requer fusão de resultados, tornando o processo de recuperação e classificação mais complexo.
  • Pode gerar respostas inconsistentes se modalidades diferentes retornarem informações conflitantes.
  • Maior custo computacional , pois são realizadas buscas independentes para cada modalidade, aumentando o tempo de processamento.

Nossa escolha: Espaço vetorial compartilhado com ImageBind

Dentre essas abordagens, escolhemos o espaço vetorial compartilhado, uma estratégia que se alinha perfeitamente com a necessidade de buscas multimodais eficientes. Nossa implementação é baseada no ImageBind, um modelo capaz de representar múltiplas modalidades (texto, imagem, áudio e vídeo) em um espaço vetorial comum. Isso nos permite:

  • Realize pesquisas multimodais entre diferentes formatos de mídia sem precisar converter tudo em texto.
  • Use incorporações altamente expressivas para capturar relacionamentos entre diferentes modalidades.
  • Garanta escalabilidade e eficiência, armazenando embeddings otimizados para recuperação rápida no Elasticsearch.

Ao adotar essa abordagem, construímos um pipeline de pesquisa multimodal robusto, onde uma consulta de texto pode recuperar imagens ou áudio diretamente sem pré-processamento adicional. Este método expande aplicações práticas de busca inteligente em grandes repositórios para sistemas avançados de recomendação multimodal.

A figura a seguir ilustra o fluxo de dados dentro do pipeline RAG multimodal, destacando o processo de indexação, recuperação e geração de resposta com base em dados multimodais:

Como funciona o espaço de incorporação?

Tradicionalmente, as incorporações de texto vêm de modelos de linguagem (por exemplo, BERT, GPT). Agora, com modelos multimodais nativos como o ImageBind da Meta AI, temos uma estrutura que gera vetores para múltiplas modalidades:

  • Texto: Frases e parágrafos são transformados em vetores da mesma dimensão.
  • Imagens (visão): Os pixels são mapeados no mesmo espaço dimensional usado para texto.
  • Áudio: Os sinais sonoros são convertidos em incorporações comparáveis a imagens e texto.
  • Mapas de profundidade: os dados de profundidade são processados e também resultam em vetores.

Assim, qualquer pista (texto, imagem, áudio, profundidade) pode ser comparada a qualquer outra usando métricas de similaridade vetorial, como similaridade de cosseno. Se uma amostra de áudio de riso e uma imagem do rosto de um suspeito estiverem “próximas” neste espaço, podemos inferir alguma correlação (por exemplo, a mesma identidade).

Etapa 1 - Coletando pistas da cena do crime

Antes de analisar as evidências, precisamos coletá-las. O crime em Gotham deixou rastros que podem estar escondidos em imagens, áudios, textos e até mesmo dados de profundidade. Vamos organizar essas pistas para alimentá-las em nosso sistema.

O que temos?

O Comissário Gordon nos enviou os seguintes arquivos contendo evidências coletadas na cena do crime em quatro modalidades diferentes:

Descrição e modalidade da pista

a) Imagens (2 fotos)

  • crime_scene1.jpg, crime_scene2.jpg → Fotos tiradas da cena do crime. Mostra vestígios suspeitos no chão.
  • suspect_spotted.jpg → Imagem de câmera de segurança mostrando uma silhueta fugindo do local.

b) Áudio (1 gravação)

  • joker_laugh.wav → Um microfone perto da cena do crime captou uma risada sinistra.

c) Texto (1 mensagem)

  • Riddle.txt, note2.txt → Algumas notas misteriosas foram encontradas no local, possivelmente deixadas pelo criminoso.

d) Profundidade (1 mapa de profundidade)

  • depth_suspect.png → Uma câmera de segurança com sensor de profundidade capturou um suspeito em um beco próximo.
  • jdancing-depth.png → Uma câmera de segurança com sensor de profundidade capturou um suspeito descendo a estação de metrô.

Essas evidências estão em formatos diferentes e não podem ser analisadas diretamente da mesma maneira. Precisamos transformá-los em embeddings — vetores numéricos que permitirão comparação entre modais.

Organização de arquivos

Antes de iniciar o processamento, precisamos garantir que todas as pistas estejam organizadas corretamente no diretório data/ para que o pipeline funcione sem problemas.

Estrutura de diretório esperada:

Código para verificar a organização da pista

Antes de prosseguir, vamos garantir que todos os arquivos necessários estejam no local correto.

Executando o arquivo

Saída esperada (se todos os arquivos estiverem corretos):

Saída esperada (se algum arquivo estiver faltando):

Este script ajuda a evitar erros antes de começarmos a gerar embeddings e indexá-los no Elasticsearch.

Etapa 2 - Organizando as evidências

Gerando embeddings com ImageBind

Para unificar as pistas, precisamos transformá-las em embeddings — representações vetoriais que capturam o significado de cada modalidade. Usaremos o ImageBind, um modelo da Meta AI que gera embeddings para diferentes tipos de dados (imagens, áudio, texto e mapas de profundidade) dentro de um espaço vetorial compartilhado.

Como o ImageBind funciona?

Para comparar diferentes tipos de evidências (imagens, áudio, texto e mapas de profundidade), precisamos transformá-los em vetores numéricos usando o ImageBind. Este modelo permite que qualquer tipo de entrada seja convertido no mesmo formato de incorporação, permitindo pesquisas entre modalidades.

Abaixo está um código otimizado (src/embedding_generator.py) para gerar embeddings para qualquer tipo de entrada usando os processadores apropriados para cada modalidade:

Um tensor é uma estrutura de dados fundamental em aprendizado de máquina e aprendizado profundo, especialmente ao trabalhar com modelos como o ImageBind. No nosso contexto:

Aqui, o tensor representa os dados de entrada (imagem, áudio ou texto) convertidos em um formato matemático que o modelo pode processar. Especificamente:

  • Para imagens: O tensor representa a imagem como uma matriz multidimensional de valores numéricos (pixels organizados por altura, largura e canais de cor).
  • Para áudio: O tensor representa ondas sonoras como uma sequência de amplitudes ao longo do tempo.
  • Para texto: O tensor representa palavras ou tokens como vetores numéricos.

Testando a geração de incorporação:

Vamos testar nossa geração de incorporação com o código a seguir. Salve-o em 02-stage/test_embedding_generation.py e execute-o com este comando:

Saída esperada:

Agora, a imagem foi transformada em um vetor de 1024 dimensões.

Etapa 3 - Armazenamento e pesquisa no Elasticsearch

Agora que geramos os embeddings para as evidências, precisamos armazená-los em um banco de dados vetorial para permitir pesquisas eficientes. Para isso, usaremos o Elasticsearch, que suporta vetores densos (dense_vector) e permite buscas por similaridade.

Esta etapa consiste em dois processos principais:

  • Indexando os embeddings → Armazena os vetores gerados no Elasticsearch.
  • Pesquisa de similaridade → Recupera os registros mais semelhantes a uma nova evidência.

Indexando as evidências no Elasticsearch

Cada evidência processada pelo ImageBind (imagem, áudio, texto ou profundidade) é convertida em um vetor de 1024 dimensões. Precisamos armazenar esses vetores no Elasticsearch para permitir pesquisas futuras.

O código a seguir (src/elastic_manager.py) cria um índice no Elasticsearch e configura o mapeamento para armazenar os embeddings.

Executando a indexação

Agora, vamos indexar uma evidência para testar o processo.

Saída esperada no Elasticsearch (resumo do documento indexado):

Para indexar todas as evidências multimodais, execute o seguinte comando Python:

Agora, as evidências são armazenadas no Elasticsearch e estão prontas para serem recuperadas quando necessário.

Verificando o processo de indexação

Depois de executar o script de indexação, vamos verificar se todas as nossas evidências foram armazenadas corretamente no Elasticsearch. Você pode usar as ferramentas de desenvolvimento do Kibana para executar algumas consultas de verificação:

1. Primeiro, verifique se o índice foi criado:

2. Em seguida, verifique a contagem de documentos por modalidade:

3. Por fim, examine a estrutura do documento indexado:

Resultados esperados:

  • Um índice chamado `multimodal_content` deve existir.
  • Cerca de 7 documentos distribuídos em diferentes modalidades (visão, áudio, texto, profundidade).
  • Cada documento deve conter: campos de incorporação, modalidade, descrição, metadados e content_path.

Esta etapa de verificação garante que nosso banco de dados de evidências esteja configurado corretamente antes de prosseguirmos com as pesquisas de similaridade.

Procurando evidências semelhantes no Elasticsearch

Agora que as evidências foram indexadas, podemos realizar pesquisas para encontrar os registros mais semelhantes a uma nova pista. Esta pesquisa usa similaridade vetorial para retornar os registros mais próximos no espaço de incorporação.

O código a seguir realiza essa pesquisa.

Testando a pesquisa - Usando áudio como consulta para resultados multimodais

Agora, vamos testar a busca por evidências usando um arquivo de áudio suspeito. Precisamos gerar um embedding para o arquivo da mesma maneira e procurar por embeddings semelhantes:

Saída esperada no terminal:

Agora, podemos analisar as evidências recuperadas e determinar sua relevância para o caso.

Além do áudio - Explorando pesquisas multimodais

Invertendo os papéis: Qualquer modalidade pode ser uma "pergunta"

Em nosso sistema RAG multimodal , cada modalidade é uma consulta de pesquisa potencial. Vamos além do exemplo de áudio e explorar como outros tipos de dados podem iniciar investigações.

1. Busca por texto (decifrando a nota do criminoso)

Cenário: Você encontrou uma mensagem de texto criptografada e quer encontrar evidências relacionadas.

Resultados esperados:

2. Busca de imagens (rastreamento da cena suspeita do crime)

Cenário: Uma nova cena de crime (crime_scene2.jpg) precisa ser comparada com outras evidências.

Saída:

3. Busca de mapa de profundidade (busca 3D)

Cenário: Um mapa de profundidade (jdancing-depth.png) revela padrões de escape de imagem.

Saída

Por que isso importa?

Cada modalidade revela conexões únicas:

  • Texto → Padrões linguísticos do suspeito.
  • Imagens → Reconhecimento de locais e objetos.
  • ProfundidadeReconstrução de cena 3D.

Agora, temos um banco de dados de evidências estruturado no Elasticsearch, o que nos permite armazenar e recuperar evidências multimodais de forma eficiente.

Resumo do que fizemos:

  • Embeddings multimodais armazenados no Elasticsearch.
  • Realizou pesquisas de similaridade, encontrando evidências relacionadas a novas pistas.
  • Testou a pesquisa usando um arquivo de áudio suspeito, garantindo que o sistema funcionasse corretamente.

Próximo passo: Usaremos um LLM (Large Language Model) para analisar as evidências recuperadas e gerar um relatório final.

Etapa 4 - Conectando os pontos com o LLM

Agora que as evidências foram indexadas no Elasticsearch e podem ser recuperadas por similaridade, precisamos de um LLM (Large Language Model) para analisá- las e gerar um relatório final para enviar ao Comissário Gordon. O LLM será responsável por identificar padrões, conectar pistas e sugerir um possível suspeito com base nas evidências recuperadas.

Para esta tarefa, usaremos o GPT-4 Turbo, formulando um prompt detalhado para que o modelo possa interpretar os resultados de forma eficiente.

Integração LLM

Para integrar o LLM em nosso sistema, criamos a classe LLMAnalyzer (src/llm_analyzer.py), que recebe as evidências recuperadas do Elasticsearch e gera um relatório forense usando essas evidências como contexto de prompt.

Configuração de temperatura na análise LLM:

Para nosso sistema de análise forense, usamos uma temperatura moderada de 0,5. Este cenário equilibrado foi escolhido porque:

  • Representa um meio termo entre saídas determinísticas (muito rígidas) e altamente aleatórias;
  • Em 0,5, o modelo mantém estrutura suficiente para fornecer conclusões forenses lógicas e justificáveis;
  • Essa configuração permite que o modelo identifique padrões e faça conexões, permanecendo dentro de parâmetros razoáveis de análise forense;
  • Ele equilibra a necessidade de resultados consistentes e confiáveis com a capacidade de gerar análises criteriosas.

Essa configuração de temperatura moderada ajuda a garantir que nossa análise forense seja confiável e criteriosa, evitando conclusões excessivamente rígidas e especulativas.

Executando a análise de evidências

Agora que temos a integração do LLM, precisamos de um script que conecte todos os componentes do sistema. Este script irá:

  • Pesquise evidências semelhantes no Elasticsearch.
  • Analise as evidências recuperadas usando o LLM para gerar um relatório final.

Código: Script de análise de evidências

Saída esperada do LLM

Conclusão: Caso resolvido

Com todas as pistas reunidas e analisadas, o sistema Multimodal RAG identificou um suspeito: o Coringa.

Ao combinar imagens, áudio, texto e mapas de profundidade em um espaço vetorial compartilhado usando o ImageBind, o sistema foi capaz de detectar conexões que seriam impossíveis de identificar manualmente. O Elasticsearch garantiu buscas rápidas e eficientes, enquanto o LLM sintetizou as evidências em um relatório claro e conclusivo.

No entanto, o verdadeiro poder deste sistema vai além de Gotham City. A arquitetura Multimodal RAG abre portas para inúmeras aplicações do mundo real:

  • Vigilância urbana: Identificação de suspeitos com base em imagens, áudio e dados de sensores.
  • Análise forense: Correlacionando evidências de múltiplas fontes para solucionar crimes complexos.
  • Recomendação multimídia: Criação de sistemas de recomendação que entendam contextos multimodais (por exemplo, sugerir músicas com base em imagens ou texto).
  • Tendências de mídia social: detectando tópicos de tendência em diferentes formatos de dados.

Agora que você aprendeu a construir um sistema RAG multimodal, por que não testá-lo com suas próprias dicas?

Compartilhe suas descobertas conosco e ajude a comunidade a avançar no campo da IA multimodal!

Agradecimentos especiais

Gostaria de agradecer a Adrian Cole por sua valiosa contribuição e revisão durante o processo de definição da arquitetura de implantação deste código.

Referências

Perguntas frequentes

O que é um RAG multimodal?

O RAG multimodal é um método que permite que sistemas de IA combinem informações de diferentes formatos (como imagens, vídeos e áudio) para obter respostas mais ricas e precisas.

Como implementar RAG multimodal?

Para implementar um RAG multimodal, três estratégias são comumente usadas: espaço vetorial compartilhado, modalidade de aterramento único e recuperação separada

Quão útil foi este conteúdo?

Não útil

Um pouco útil

Muito útil

Conteúdo relacionado

Pronto para criar buscas de última geração?

Uma pesquisa suficientemente avançada não se consegue apenas com o esforço de uma só pessoa. O Elasticsearch é impulsionado por cientistas de dados, especialistas em operações de aprendizado de máquina, engenheiros e muitos outros que são tão apaixonados por buscas quanto você. Vamos nos conectar e trabalhar juntos para construir a experiência de busca mágica que lhe trará os resultados desejados.

Experimente você mesmo(a)