Capture um Fantasma Fofo neste Halloween com Milvus
Uma versão deste artigo está publicada no DZone.
Acabei de apresentar uma palestra no All Things Open e é difícil acreditar que Retrieval Augmented Generation (RAG) agora parece uma técnica que já usamos há anos.
Há uma boa razão para isso, pois nos últimos dois anos ela explodiu em profundidade e amplitude, já que a utilidade do RAG é ilimitada. A capacidade de melhorar os resultados gerados por large language models está melhorando constantemente, à medida que variações, melhorias e novos paradigmas impulsionam as coisas adiante.
Hoje veremos:
Aplicações práticas para RAG multimodal
- Busca de imagens com filtros
- Encontrando os melhores fantasmas de Halloween
Usando Ollama, LLava 7B e reclassificação por LLM
Executando RAG multimodal avançado localmente
Usarei alguns desses novos avanços no estado do RAG para resolver alguns problemas de Halloween. Vamos analisar os problemas: descobrir se algo é um fantasma e qual é o fantasma de gato mais fofo?
Aplicações práticas para RAG multimodal
Algo é um fantasma? Busca de imagens com filtros e clip-vit-base-patch32
Queremos criar uma ferramenta para todos os detectores de fantasmas por aí, ajudando a determinar se algo é um “fantasma”. Para fazer isso, usaremos nossa coleção hospedada “ghosts”, que tem vários campos pelos quais podemos filtrar, além de pesquisar nosso vetor codificado multimodal. Permitimos que alguém envie uma foto de fantasma por meio de formulário do Google, aplicativo Streamlit, upload para S3 e notebook Jupyter. Codificamos essa consulta, que pode ser uma combinação de texto e/ou imagem, utilizando o modelo CLIP da OpenAI com o Sentence Transformer da Hugging Face. Isso nos permite codificar nossa imagem de suposto fantasma e usá-la para pesquisar em nossa coleção a fim de ver sua similaridade. Se a similaridade for alta o suficiente, então podemos considerá-la um "fantasma".
Design da coleção
Antes de criar qualquer aplicação, você deve garantir que ela esteja bem definida com todos os campos de que possa precisar e com os tipos e tamanhos que correspondam às suas necessidades.
Para nossa coleção de “ghosts”, no mínimo precisaremos de:
Um campo id que seja do tipo INT64, definido como chave primária e configurado para ter geração automática de ID
O próximo campo em nosso esquema é ghostclass, que é uma string escalar VARCHAR de comprimento 20 que contém as classificações tradicionais de fantasmas, como Class I, Class II, Fake e Class IV.
Depois disso vem category, que é uma string escalar VARCHAR maior, de comprimento 256, que contém nossas descrições curtas, que são classificações como Fake, Ghost, Deity, Unstable e Legend.
Adicionamos um campo para s3path, que é definido como uma string escalar VARCHAR grande, de comprimento 1.024, que contém um caminho S3 para a imagem do objeto.
Finalmente e mais importante, vector, que contém nosso vetor de ponto flutuante de dimensão 512.
Agora que temos nosso esquema de dados, podemos construí-lo e usá-lo para análises fantasmagóricas em nossos dados.
Etapa 1: Conectar ao Milvus Standalone
Etapa 2: Carregar o modelo CLIP
Etapa 3: Defina nossa coleção com seu esquema de vetores e escalares.
Etapa 4: Codifique nossa imagem para usar em uma consulta.
Etapa 5: Execute a consulta na coleção de fantasmas em nosso banco de dados Milvus standalone e procure apenas aqueles filtrados pela categoria que não seja Fake. Limitamos a um resultado.
Etapa 6: Verifique a distância; se for 0.8 ou maior, consideraremos isso um fantasma. Fazemos isso comparando a entidade suspeita com nosso grande banco de dados de fotos reais de fantasmas; se algo for da classe atual de fantasma, deve ser semelhante aos nossos existentes.
Etapa 7: O resultado é exibido com o possível fantasma e sua correspondência mais próxima.
Como você pode ver em nosso exemplo, encontramos uma correspondência próxima o suficiente a um "fantasma" semelhante que não estava na categoria Fake.
Em uma aplicação separada de Halloween, veremos uma coleção diferente e um modelo de codificação diferente para um caso de uso separado que também envolve fantasmas de Halloween.
Encontrando o Fantasma de Gato Mais Fofo com o modelo BGE Visualized
Queremos encontrar os fantasmas de gato mais fofos e talvez outros para ganhar prêmios, publicar em redes sociais ou outros empreendimentos importantes.
Design da Coleção
Antes de criar qualquer aplicação, você deve se certificar de que determinou quais campos pode precisar. Para este caso de uso simples, teremos um esquema dinâmico com geração automática de id. Dessa forma, não precisamos definir os campos, e eles serão criados com campos de id e vetor.
Para nossa coleção de “ghostslocal”, estes serão criados automaticamente para nós:
Um campo id que é do tipo INT64, definido como a chave primária e configurado para ter geração automática de ID
Configuramos esta coleção para habilitar campos dinâmicos; adicionaremos um campo importante durante a inserção de dados.
Por fim e mais importante, vector, que contém nosso vetor de ponto flutuante de dimensão 768.
Agora que temos nosso esquema de dados, podemos encontrar o fantasma mais fofo.
Etapa 1: Conecte-se ao Milvus Standalone
Etapa 2: Carregue o modelo BAAI/bge-base-en-v1.5
Etapa 3: Defina nossa coleção com seu esquema de vetores e escalares.
Etapa 4: Itere por nossa lista de imagens, codifique-as e adicione-as a um dict para inserção posterior.
Etapa 5: Insira ****nossas imagens, image_path é criado como um campo dinâmico em nosso esquema para esta coleção.
Etapa 6: Codifique vetorialmente a consulta de texto, “Show me the cutest cat ghost”, para usar em uma consulta.
Etapa 5: Execute nossa busca por similaridade
Etapa 6: Itere os resultados e mostre a imagem que corresponde ao gato mais fofo.
Nossa busca vetorial é bem simples: apenas codificamos nosso texto procurando o fantasma de gato mais fofo (em sua pequena fantasia de Halloween). Milvus consultará o vetor de ponto flutuante de 768 dimensões e encontrará a correspondência mais próxima para nós. Com todos os ghouls e fantasmas assustadores em nosso banco de dados, é difícil discordar destes resultados.
Usando Ollama, LLava 7B e Reranking com LLM
Executando RAG Avançado Localmente
Ok, isto é um pouco de travessura E gostosura, podemos fazer os dois tópicos ao mesmo tempo. Conseguimos executar toda esta técnica avançada de RAG localmente utilizando Milvus Lite, Ollama, LLava 7B e um Jupyter Notebook. Vamos fazer uma Busca Multimodal com um Reranker Generativo. Isso usa um LLM para classificar as imagens e explicar os melhores resultados. Anteriormente, fizemos isso com o modelo turbinado GPT-4o. Estou obtendo bons resultados com o LLava 7B hospedado localmente com Ollama. Vamos mostrar isso rodando de forma aberta, local e gratuita!
Vamos reutilizar o código de exemplo existente para criar a foto panorâmica a partir das imagens retornadas pela nossa busca híbrida de uma foto de escritório com fantasmas com o texto “computer monitor with ghost”. Em seguida, enviamos essa foto para o modelo LLaVA7B hospedado no Ollama com instruções sobre como classificar os resultados. Recebemos de volta uma classificação, uma explicação e uma imagem.
Nossa imagem de busca e nove resultados
Resultados retornados pelo LLM para a ordem da lista classificada.
Nossa consulta Milvus simples e rápida para obter resultados para alimentar o LLM.
Você pode encontrar o código completo em nosso exemplo no github e pode usar quaisquer imagens de sua escolha, como o exemplo mostra. Há também algumas referências e código documentado, incluindo uma aplicação StreamLit para você experimentar por conta própria.
Conclusão
Como você pode ver, o RAG multimodal não só não é assustador, como também é divertido e útil para muitas aplicações.
Se você tem interesse em criar aplicações de IA mais avançadas, então usar Milvus e RAG Multimodal é uma ótima combinação para criar aplicações. Agora você pode ir além de apenas texto e adicionar imagens e muito mais. O RAG multimodal abre muitos novos caminhos para geração com LLM, busca e aplicações de IA em geral.
Adoraríamos saber o que você pensa!
Se você gostou deste artigo, gostaríamos muito que você pudesse nos dar uma estrela no GitHub! Você também é bem-vindo para participar da nossa comunidade Milvus no Discord para compartilhar suas experiências. Participe de um ou de todos os nossos meetups para ter acesso à comunidade local presencial e ao código, além de também obter acesso à nossa biblioteca do Youtube com palestras, demos e análises aprofundadas de meetups gravados.
Se você tem interesse em aprender mais, confira nosso repositório Bootcamp no GitHub para ver exemplos de como criar apps de RAG Multimodal com Milvus.
Recursos adicionais
Continue lendo

Notion's Vector Search Is Excellent. Their Next Problem Is Harder.
Notion solved vector search scaling in two years. The next bottleneck — offline context engineering, unified data, and the real-time/offline gap — is harder.

Why and How to Migrate from Self-Hosted Milvus to Zilliz Cloud
A simple, step-by-step guide to migrating from Milvus to Zilliz Cloud. Learn both endpoint and backup methods for a smooth, scalable vector database migration.

Why AI Databases Don't Need SQL
Whether you like it or not, here's the truth: SQL is destined for decline in the era of AI.



