Aproveitando o Milvus e os Friendli Serverless Endpoints para RAG Avançado e Consultas Multimodais
FriendliAI é especializada em infraestrutura de IA generativa, oferecendo soluções que permitem às organizações implantar e gerenciar com eficiência grandes modelos de linguagem (LLMs) e outros modelos de IA generativa com desempenho otimizado e custo reduzido. Os usuários têm a capacidade de escolher entre LLMs convencionais prontos para produção acessíveis por meio de APIs, ou LLMs personalizados ajustados finamente implantados no hardware de escolha do usuário, seja na nuvem pública ou em clusters privados on-premise.
Milvus é um banco de dados vetorial de código aberto que armazena, indexa e pesquisa dados não estruturados em escala de bilhões por meio de embeddings vetoriais de alta dimensão. Ele é perfeito para criar aplicações modernas de IA, como geração aumentada por recuperação (RAG), busca semântica, busca multimodal e sistemas de recomendação.
Neste artigo, exploraremos como usar o Milvus com os Friendli Serverless Endpoints para executar Geração Aumentada por Recuperação (RAG) em documentos e materiais específicos e executar consultas multimodais que incorporam imagens e outros conteúdos visuais. Essa poderosa combinação permite aplicações de IA mais sofisticadas e sensíveis ao contexto.
Entendendo RAG e Modelos Multimodais
Geração Aumentada por Recuperação (RAG)
RAG é uma técnica que aprimora modelos de linguagem fornecendo a eles informações relevantes, principalmente recuperadas de uma base de conhecimento alimentada por um banco de dados vetorial. Essa abordagem permite que modelos de IA gerem respostas mais precisas e contextualmente apropriadas ao referenciar fontes de dados externas designadas.
Modelos Multimodais
Modelos multimodais podem processar e compreender múltiplos tipos de dados de entrada, como texto, imagens e áudio. Eles podem analisar e gerar respostas com base em diversas fontes de informação, possibilitando interações mais abrangentes e sutis.
Por que incorporar RAG e modelos multimodais juntos?
A combinação de RAG e capacidades multimodais melhora significativamente os sistemas de IA ao fornecer simultaneamente os seguintes recursos:
- Permitir tipos de entrada mais diversos e ricos à escolha do usuário
- Fornecer informações atualizadas
- Aumentar a precisão e a relevância das respostas
- Possibilitar interações sensíveis ao contexto
Implementação Prática
Vamos mergulhar na implementação prática de RAG e consultas multimodais usando o banco de dados vetorial Milvus e os Friendli Serverless Endpoints.
Etapa 1: Instalar Pré-requisitos e Baixar a Documentação do Milvus
Primeiro, instalaremos as bibliotecas necessárias e baixaremos a documentação do Milvus que usaremos para nosso trabalho de RAG:
!pip install --upgrade pymilvus requests tqdm langchain langchain-community langchain-huggingface langchain-openai friendli-client tiktoken
!wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
!rm -rf milvus_docs
!unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
Etapa 2: Processar Arquivos de Documentação
Em seguida, leremos os arquivos da documentação do Milvus e usaremos uma estratégia simples de divisão de arquivos para tratar cada linha de texto como um bloco individual:
from glob import glob
text_lines = []
for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
with open(file_path, "r") as file:
file_text = file.read()
text_lines += file_text.split("# ")
Etapa 3: Preparar Embeddings
Usaremos a biblioteca de embeddings da Hugging Face para usar um modelo simples all-MiniLM-L6 para criar representações vetoriais do nosso texto:
from langchain_huggingface import HuggingFaceEmbeddings
embeddings_model_name = "sentence-transformers/all-MiniLM-L6-v2"
embedding = HuggingFaceEmbeddings(model_name=embeddings_model_name)
test_embedding = embedding.embed_query("This is a test")
embedding_dim = len(test_embedding)
print(embedding_dim)
print(test_embedding[:10])
Etapa 4: Configurar o Cliente Milvus
Agora, vamos preparar o cliente Milvus para nossa implementação de RAG. Neste exemplo simples, usamos o Milvus Lite, que é executado localmente e materializa um arquivo em um arquivo local. Você também pode considerar outras opções de implantação do Milvus:
Se você só precisa de um banco de dados vetorial local para dados em pequena escala ou prototipagem, definir o uri como um arquivo local, por exemplo, ./milvus.db, é o método mais conveniente, pois utiliza automaticamente o Milvus Lite para armazenar todos os dados nesse arquivo.
Para dados e tráfego em maior escala em produção, você pode configurar um servidor Milvus no Docker ou Kubernetes. Nesta configuração, use o endereço e a porta do servidor como seu uri, por exemplo, http://localhost:19530. Se você habilitar o recurso de autenticação no Milvus, defina o token como "<your_username>:<your_password>", caso contrário, não há necessidade de definir o token.
Você também pode usar o Milvus totalmente gerenciado na Zilliz Cloud. Basta definir o uri e o token como o Public Endpoint e a API key da sua instância da Zilliz Cloud.
from pymilvus import MilvusClient
milvus_client = MilvusClient(uri="./milvus_demo.db")
collection_name = "my_rag_collection"
Etapa 5: Criar a Coleção Milvus
Criaremos uma coleção no cliente Milvus se ela ainda não existir:
if milvus_client.has_collection(collection_name):
milvus_client.drop_collection(collection_name)
milvus_client.create_collection(
collection_name=collection_name,
dimension=embedding_dim,
metric_type="IP", # Inner product distance
consistency_level="Strong", # Strong consistency level
)
Etapa 6: Gerar Embeddings e Inserir Texto no Milvus
Vamos gerar embeddings do nosso texto e inseri-lo na coleção Milvus:
from tqdm import tqdm
data = []
for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
data.append({"id": i, "vector": embedding.embed_query(line), "text": line})
milvus_client.insert(collection_name=collection_name, data=data)
Etapa 7: Executar Consulta RAG
Agora podemos fazer uma pergunta e pesquisar dados relevantes dentro do nosso banco de dados Milvus:
question = "How is data stored in milvus?"
search_res = milvus_client.search(
collection_name=collection_name,
data=[
embedding.embed_query(question)
],
limit=3, # Return top 3 results
search_params={"metric_type": "IP", "params": {}}, # Inner product distance
output_fields=["text"], # Return the text field
)
import json
retrieved_lines_with_distances = [
(res["entity"]["text"], res["distance"]) for res in search_res[0]
]
print(json.dumps(retrieved_lines_with_distances, indent=4))
context = "\n".join(
[line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
)
Etapa 8: Criar Prompts para RAG
Vamos criar os prompts de sistema e de usuário para nossa consulta RAG:
SYSTEM_PROMPT = """
Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
"""
USER_PROMPT = f"""
Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
<context>
{context}
</context>
<question>
{question}
</question>
"""
Etapa 9: Configurar o Token da Friendli
Obtenha seu FRIENDLI_TOKEN na Friendli Suite e defina-o como uma variável de ambiente:
import os
if "FRIENDLI_TOKEN" not in os.environ:
os.environ["FRIENDLI_TOKEN"] = 'flp_FILL_IN_WITH_YOUR_OWN_PERSONAL_ACCESS_TOKEN'
Etapa 10: Executar Consulta RAG
Agora podemos executar nossa consulta RAG usando os Friendli Serverless Endpoints:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="meta-llama-3.1-70b-instruct",
base_url="https://api.friendli.ai/serverless/v1",
api_key=os.environ["FRIENDLI_TOKEN"],
)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
("system", SYSTEM_PROMPT),
("user", USER_PROMPT)
])
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
print(chain.invoke({"input": question}))
Isso produz a resposta com base nos documentos fornecidos:
No Milvus, os dados são armazenados em duas formas: dados inseridos e metadados.
Os dados inseridos (dados vetoriais, dados escalares e esquema específico da coleção) são armazenados em armazenamento persistente como logs incrementais. O Milvus oferece suporte a vários backends de armazenamento de objetos, incluindo MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS e Tencent Cloud Object Storage (COS).
Os metadados, por outro lado, são gerados dentro do Milvus e armazenados no etcd, com cada módulo do Milvus tendo seus próprios metadados.
Etapa 11: Consultas Multimodais
Para consultas multimodais, usaremos o modelo Llama-3.2-11b-vision:
multimodalllm = ChatOpenAI(
model="llama-3.2-11b-vision-instruct",
base_url="https://api.friendli.ai/serverless/beta",
api_key=os.environ["FRIENDLI_TOKEN"],
)
image_url = "https://milvus.io/docs/v2.4.x/assets/highly-decoupled-architecture.png"
message = HumanMessage(
content=[
{"type": "text", "text": "describe what is in this image"},
{"type": "image_url", "image_url": {"url": image_url}},
],
)
response = multimodalllm.invoke([message])
print(response.content)
A partir da resposta, podemos inferir que o modelo entende corretamente a imagem:
A imagem mostra um fluxograma dos componentes de um sistema, com os seguintes componentes:
**Serviço Coordenador**
* Root
* Query
…
Etapa 12: Combinar Recursos de RAG e Multimodais
Por fim, vamos combinar os recursos de RAG e multimodais:
question = "How is data stored in milvus with respect to this picture?"
USER_PROMPT = f"""
Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
<context>
{context}
</context>
<question>
{question}
</question>
"""
message = HumanMessage(
content=[
{"type": "text", "text": USER_PROMPT},
{"type": "image_url", "image_url": {"url": image_url}},
],
)
response = multimodalllm.invoke([message])
print(response.content)
O modelo gera corretamente uma resposta correta com base na imagem e nos documentos:
**Etapa 1: Identificar os componentes envolvidos no armazenamento de dados no Milvus.**
Os componentes envolvidos no armazenamento de dados no Milvus incluem:
* Camada de Acesso
* Armazenamento de Mensagens
* Nó de Trabalho
**Etapa 2: Determinar como os dados são armazenados no Milvus.**
Os dados são armazenados na Camada de Acesso e no Armazenamento de Mensagens.
**Etapa 3: Determine onde os dados são armazenados no Milvus.**
Os dados são armazenados tanto na Camada de Acesso quanto no Armazenamento de Mensagens.
**Resposta:** Os dados são armazenados tanto na Camada de Acesso quanto no Armazenamento de Mensagens.
Para ver o código completo e mais detalhes, confira este notebook do Colab.
Conclusão
Este tutorial demonstrou como aproveitar o Milvus e os Friendli Serverless Endpoints para implementar consultas RAG avançadas e multimodais. Ao combinar essas tecnologias poderosas, você pode criar aplicações de IA mais sofisticadas, capazes de compreender e processar diversos tipos de informação, levando a respostas mais precisas e conscientes do contexto.
Continue lendo

Migrating from S3 Vectors to Zilliz Cloud: Unlocking the Power of Tiered Storage
Learn how Zilliz Cloud bridges cost and performance with tiered storage and enterprise-grade features, and how to migrate data from AWS S3 Vectors to Zilliz Cloud.

Zilliz Cloud Now Available in Azure North Europe: Bringing AI-Powered Vector Search Closer to European Customers
The addition of the Azure North Europe (Ireland) region further expands our global footprint to better serve our European customers.
Milvus/Zilliz + Surveillance: How Vector Databases Transform Multi-Camera Tracking
See how Milvus vector database enhances multi-camera tracking with similarity-based matching for better surveillance in retail, warehouses and transport hubs.



