Weaviate é um banco de dados vetorial pioneiro e de código aberto, projetado para aprimorar a pesquisa semântica por meio da utilização de modelos de aprendizado de máquina. Ao contrário dos motores de busca tradicionais que dependem da correspondência de palavras-chave, o Weaviate emprega princípios de similaridade semântica. Esta abordagem inovadora transforma diversas formas de dados (textos, imagens e muito mais) em representações vetoriais, formas numéricas que capturam a essência do contexto e do significado dos dados. Ao analisar as semelhanças entre esses vetores, o Weaviate fornece resultados de pesquisa que realmente compreendem a intenção do usuário, oferecendo um salto significativo além das limitações das pesquisas baseadas em palavras-chave.
Este guia tem como objetivo demonstrar a integração perfeita de MinIO e Weaviate , aproveitando o melhor do armazenamento de objetos nativo do Kubernetes e dos recursos de pesquisa semântica baseados em IA. Aproveitando o Docker Compose para orquestração de contêineres, este guia fornece uma abordagem estratégica para construir um sistema de gerenciamento de dados robusto, escalonável e eficiente. Voltada para a forma como armazenamos, acessamos e gerenciamos dados, esta configuração é uma virada de jogo para desenvolvedores, engenheiros de DevOps e cientistas de dados que buscam aproveitar o poder das soluções modernas de armazenamento e da recuperação de dados orientada por IA.
Nesta demonstração, focaremos no backup do Weaviate com buckets MinIO usando Docker. Essa configuração garante integridade e acessibilidade dos dados em nossos projetos de pesquisa e análise aprimorados por IA.
Esta demonstração tem como objetivo destacar a integração perfeita do MinIO e do Weaviate usando Docker, apresentando um método confiável para fazer backup de sistemas de pesquisa e análise aprimorados por IA.
O arquivo docker-compose.yaml
fornecido aqui foi criado para estabelecer uma configuração perfeita para o Weaviate, destacando nosso compromisso com o gerenciamento de dados simplificado e eficiente. Essa configuração permite um ambiente robusto onde o MinIO atua como um serviço de armazenamento seguro e o Weaviate aproveita esse armazenamento para recursos avançados de pesquisa de vetores.
O
version: '3.8' services: weaviate: container_name: weaviate_server image: semitechnologies/weaviate:latest ports: - "8080:8080" environment: AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' ENABLE_MODULES: 'backup-s3' BACKUP_S3_BUCKET: 'weaviate-backups' BACKUP_S3_ENDPOINT: 'play.min.io:443' BACKUP_S3_ACCESS_KEY_ID: 'minioadmin' BACKUP_S3_SECRET_ACCESS_KEY: 'minioadmin' BACKUP_S3_USE_SSL: 'true' CLUSTER_HOSTNAME: 'node1' volumes: - ./weaviate/data:/var/lib/weaviate
Docker-Compose: Implante o Weaviate com o módulo backups-s3
habilitado e o servidor play.min.io
MinIO
Com o docker-compose.yaml acima, o Weaviate é intrinsecamente configurado para utilizar MinIO para backups, garantindo integridade e acessibilidade dos dados. Essa configuração envolve variáveis de ambiente essenciais, como ENABLE_MODULES
definidas como backup-s3
e várias configurações para o bucket S3, endpoint, chaves de acesso e uso de SSL. Além disso, PERSISTENCE_DATA_PATH
é definido para garantir que os dados sejam armazenados de forma persistente e CLUSTER_NAME
para identificação do nó.
ENABLE_MODULES
: 'backup-s3'BACKUP_S3_BUCKET
: 'weaviate-backups'BACKUP_S3_ENDPOINT
: 'play.min.io:443'BACKUP_S3_ACCESS_KEY_ID
: 'minioadmin'BACKUP_S3_SECRET_ACCESS_KEY
: 'minioadmin'BACKUP_S3_USE_SSL
: 'verdadeiro'PERSISTENCE_DATA_PATH
: '/var/lib/weaviate'CLUSTER_NAME
: 'nó1'
O serviço Weaviate neste docker-compose está configurado para utilizar volumes montados para persistência de dados; isso garante que seus dados persistam entre sessões e operações.
Nota: O bucket MinIO precisa existir previamente, o Weaviate não criará o bucket para você.
Para integrar MinIO e Weaviate em seu projeto usando Docker Compose, siga este procedimento detalhado:
Salvando ou atualizando o arquivo Docker Compose
Assim que o arquivo docker-compose.yaml estiver instalado, use o seguinte comando em seu terminal ou prompt de comando para iniciar a implantação:
docker-compose up -d --build
Este comando iniciará os serviços Weaviate em modo desanexado, executando-os em segundo plano do seu sistema.
Durante o processo de construção e execução, o Docker Compose criará um diretório persistente conforme especificado no arquivo docker-compose.yaml. Este diretório ( ./weaviate/data
para Weaviate) é usado para armazenar dados de forma persistente, garantindo que seus dados permaneçam intactos durante reinicializações e implantações de contêineres.
O armazenamento persistente permite um ambiente mais estável onde os dados não são perdidos quando o contêiner é reiniciado.
Depois de implantar seu docker-compose, você pode visitar a URL do servidor Weaviate em um navegador, seguido de /v1/meta
para examinar se suas configurações de implantação estão corretas.
A primeira linha da carga JSON em http://localhost:8080/v1/meta
deve ser semelhante a esta:
{"hostname":"http://[::]:8080","modules":{"backup-s3":{"bucketName":"weaviate-backups","endpoint":"play.min.io:443","useSSL":true}...[truncated]...}
weaviate-backups
Para integrar o Weaviate ao MinIO, o bucket de backup no MinIO precisa apropriadamente da Política de Acesso do bucket de backup designado, ou seja, weaviate-backups
, para Público. Esse ajuste é necessário para conceder ao módulo Weaviate backup-s3 as permissões necessárias para interagir com êxito com o bucket MinIO para operações de backup.
Nota: Em um ambiente de produção você provavelmente precisará bloquear isso, o que está além do escopo deste tutorial.
É essencial abordar essa configuração com uma compreensão clara das implicações de segurança de definir um bucket como “ público ” . Embora esta configuração facilite o processo de backup em um ambiente de desenvolvimento, abordagens alternativas devem ser consideradas para que os sistemas de produção mantenham a segurança e a integridade dos dados. Empregar controles de acesso refinados, como políticas IAM ou URLs “ pré-assinados ”.
Ao final desta demonstração, você poderá ver os objetos bucket que o Weaviate cria ao longo do processo ao utilizar o módulo backup-s3
.
Para habilitar backups S3 no Weaviate, defina as variáveis de ambiente necessárias em seu arquivo docker-compose.yaml. Isso orienta o Weaviate a usar MinIO como destino de backup, envolvendo configurações para módulos de backup e detalhes do bucket MinIO.
Antes de mergulhar nas operações técnicas, gostaria de afirmar que estou demonstrando as etapas a seguir em um ambiente JupyterLab com o benefício adicional de encapsular nosso pipeline em um notebook, disponível aqui .
A primeira etapa envolve configurar o ambiente instalando a biblioteca weaviate-client
para python com pip
. Este pacote Python é essencial para a interface com a API RESTful do Weaviate de uma forma mais Pythonic, permitindo uma interação perfeita com o banco de dados para operações como criação de esquema, indexação de dados, backup e restauração. Para a demonstração, ilustraremos o uso da biblioteca cliente Weaviate Python.
Nesta demonstração, estamos usando a API Weaviate V3, então você poderá ver uma mensagem como a abaixo ao executar o script python:
`DeprecationWarning: Dep016: You are using the Weaviate v3 client, which is deprecated. Consider upgrading to the new and improved v4 client instead! See here for usage: https://weaviate.io/developers/weaviate/client-libraries/python warnings.warn(`
Esta mensagem é um banner de aviso e pode ser ignorada, para mais informações você pode visitar este
!pip install weaviate-client
Esta seção apresenta a estrutura e o esquema de dados para as classes 'Artigo' e 'Autor' , estabelecendo a base de como os dados serão organizados. Ele demonstra como definir e gerenciar programaticamente o esquema no Weaviate, mostrando a flexibilidade e o poder do Weaviate para se adaptar a vários modelos de dados adaptados às necessidades específicas do aplicativo.
import weaviate client = weaviate.Client("http://localhost:8080") # Schema classes to be created schema = { "classes": [ { "class": "Article", "description": "A class to store articles", "properties": [ {"name": "title", "dataType": ["string"], "description": "The title of the article"}, {"name": "content", "dataType": ["text"], "description": "The content of the article"}, {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"}, {"name": "url", "dataType": ["string"], "description": "The URL of the article"}, {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"} ] }, { "class": "Author", "description": "A class to store authors", "properties": [ {"name": "name", "dataType": ["string"], "description": "The name of the author"}, {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"} ] } ] } client.schema.delete_class('Article') client.schema.delete_class('Author') client.schema.create(schema)
Python: crie classes de esquema
Depois de definir o esquema, o notebook orienta a inicialização do cliente Weaviate, a criação do esquema na instância do Weaviate e a indexação dos dados. Este processo preenche o banco de dados com conjuntos de dados iniciais, permitindo a exploração dos recursos de pesquisa vetorial do Weaviate. Ele ilustra as etapas práticas necessárias para começar a aproveitar o Weaviate para armazenar e consultar dados em formato vetorizado.
# JSON data to be Ingested data = [ { "class": "Article", "properties": { "title": "LangChain: OpenAI + S3 Loader", "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...", "url": "https://blog.min.io/langchain-openai-s3-loader/", "customEmbeddings": [0.4, 0.3, 0.2, 0.1] } }, { "class": "Article", "properties": { "title": "MinIO Webhook Event Notifications", "content": "Exploring the webhook event notification system in MinIO...", "url": "https://blog.min.io/minio-webhook-event-notifications/", "customEmbeddings": [0.1, 0.2, 0.3, 0.4] } }, { "class": "Article", "properties": { "title": "MinIO Postgres Event Notifications", "content": "An in-depth look at Postgres event notifications in MinIO...", "url": "https://blog.min.io/minio-postgres-event-notifications/", "customEmbeddings": [0.3, 0.4, 0.1, 0.2] } }, { "class": "Article", "properties": { "title": "From Docker to Localhost", "content": "A guide on transitioning from Docker to localhost environments...", "url": "https://blog.min.io/from-docker-to-localhost/", "customEmbeddings": [0.4, 0.1, 0.2, 0.3] } } ] for item in data: client.data_object.create( data_object=item["properties"], class_name=item["class"] )
Python: indexar dados por classe
Com os dados indexados, o foco passa a ser a preservação do estado do banco de dados por meio de backups. Esta parte do notebook mostra como acionar uma operação de backup para MinIO.
result = client.backup.create( backup_id="backup-id", backend="s3", include_classes=["Article", "Author"], # specify classes to include or omit this for all classes wait_for_completion=True, ) print(result)
Python: criar backup
Esperar:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id-2', 'path': 's3://weaviate-backups/backup-id-2', 'status': 'SUCCESS'}
Resposta de backup bem-sucedida
Antes de prosseguir com uma restauração, às vezes é necessário limpar o esquema existente. Esta seção mostra as etapas para um processo de restauração limpo. Isso garante que os dados restaurados não entrem em conflito com esquemas ou dados existentes no banco de dados.
client.schema.delete_class("Article") client.schema.delete_class("Author")
Esta seção explica como restaurar os dados de backup anterior, trazendo o banco de dados de volta a um estado bom conhecido.
result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print(result)
Python: restaurar backup
Esperar:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Resposta bem-sucedida do Backup-S3
Esta parte do notebook fornece um exemplo de implementação do tratamento de erros durante o processo de restauração de backup. Oferece insights sobre problemas inesperados durante operações de restauração de dados.
from weaviate.exceptions import BackupFailedError try: result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print("Backup restored successfully:", result) except BackupFailedError as e: print("Backup restore failed with error:", e) # Here you can add logic to handle the failure, such as retrying the operation or logging the error.
Esperar:
Backup restored successfully: {'backend': 's3', 'classes': ['Author', 'Article'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Restauração de backup bem-sucedida
Finalmente, para confirmar que o processo de backup e restauração foi concluído com sucesso, o notebook inclui uma etapa para recuperar o esquema da classe ‘Artigo’. Essa verificação garante que os dados e o esquema sejam restaurados corretamente.
client.schema.get("Article")
Retorna a classe Article como um objeto JSON
Esperar:
{'class': 'Article', 'description': 'A class to store articles'... [Truncated]...}
Cada seção do notebook fornece um guia abrangente através do ciclo de vida do gerenciamento de dados no Weaviate, desde a configuração inicial e preenchimento de dados até backup, restauração e verificação, todos realizados dentro do ecossistema Python usando a biblioteca cliente Weaviate.
Até agora, mostramos como fazer isso da maneira pitônica. Achamos que seria útil mostrar internamente via CURL
como as mesmas operações poderiam ser realizadas sem escrever um script.
Para interagir com uma instância do Weaviate para tarefas como criar um esquema, indexar dados, realizar backups e restaurar dados, comandos curl específicos podem ser usados. Esses comandos fazem solicitações HTTP para a API REST do Weaviate. Por exemplo, para criar um esquema, uma solicitação POST com os detalhes do esquema é enviada ao endpoint do esquema do Weaviate. Da mesma forma, para indexar dados, uma solicitação POST com a carga de dados é feita para o endpoint do objeto.
Os backups são acionados por meio de uma solicitação POST para o endpoint de backups e a restauração é feita por meio de uma solicitação POST para o endpoint de restauração. Cada uma dessas operações requer a carga JSON apropriada, normalmente fornecida como uma referência de arquivo no comando curl usando o símbolo @
.
Para implementar o Weaviate, é claro que precisaremos de dados de amostra para trabalhar, o que
Eu incluí o seguinte:
schema.json
descreve a estrutura dos dados que queremos indexar.
data.json
é onde nossos dados reais entram em ação, sua estrutura se alinha com as classes no arquivo schema.json.
Os arquivos schema.json e data.json estão disponíveis no repositório MinIO blog-assets localizado
{ "classes": [ { "class": "Article", "description": "A class to store articles", "properties": [ {"name": "title", "dataType": ["string"], "description": "The title of the article"}, {"name": "content", "dataType": ["text"], "description": "The content of the article"}, {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"}, {"name": "url", "dataType": ["string"], "description": "The URL of the article"}, {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"} ] }, { "class": "Author", "description": "A class to store authors", "properties": [ {"name": "name", "dataType": ["string"], "description": "The name of the author"}, {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"} ] } ] }
Classes de esquema de exemplo para Artigo e Autor
O
Por outro lado, o
[ { "class": "Article", "properties": { "title": "LangChain: OpenAI + S3 Loader", "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...", "url": "https://blog.min.io/langchain-openai-s3-loader/", "customEmbeddings": [0.4, 0.3, 0.2, 0.1] } }, { "class": "Article", "properties": { "title": "MinIO Webhook Event Notifications", "content": "Exploring the webhook event notification system in MinIO...", "url": "https://blog.min.io/minio-webhook-event-notifications/", "customEmbeddings": [0.1, 0.2, 0.3, 0.4] } }, { "class": "Article", "properties": { "title": "MinIO Postgres Event Notifications", "content": "An in-depth look at Postgres event notifications in MinIO...", "url": "https://blog.min.io/minio-postgres-event-notifications/", "customEmbeddings": [0.3, 0.4, 0.1, 0.2] } }, { "class": "Article", "properties": { "title": "From Docker to Localhost", "content": "A guide on transitioning from Docker to localhost environments...", "url": "https://blog.min.io/from-docker-to-localhost/", "customEmbeddings": [0.4, 0.1, 0.2, 0.3] } } ]
Dados de amostra contendo artigos
O esquema atua como a espinha dorsal estrutural do nosso sistema de gerenciamento de dados, definindo como os dados são organizados, indexados e consultados.
Através de um comando curl simples e com nossos arquivos de amostra clonados localmente em nosso diretório de trabalho atual; podemos postar nosso schema.json diretamente no Weaviate, estabelecendo as regras e relacionamentos aos quais nossos dados irão aderir.
curl -X POST -H "Content-Type: application/json" \ --data @schema.json http://localhost:8080/v1/schema
CURL: criar
Com nosso esquema implementado, a próxima etapa envolve preenchê-lo com dados reais. Usando outro comando curl, indexamos nosso data.json no esquema.
curl -X POST -H "Content-Type: application/json" \ --data @data.json http://localhost:8080/v1/objects
CURL: índice
Precisaremos atribuir um identificador exclusivo, ou “backup-id”. Esse identificador não apenas facilita o rastreamento e a recuperação precisos de conjuntos de backup, mas também garante que cada conjunto de dados seja controlado por versão.
curl -X POST 'http://localhost:8080/v1/backups/s3' -H 'Content-Type:application/json' -d '{ "id": "backup-id", "include": [ "Article", "Author" ] }'
CURL: backup-s3
Esperar:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Resposta bem-sucedida do Backup-S3
Esta saída é formatada como um objeto JSON. Inclui o backend usado (neste caso, 's3'
), uma lista de classes que foram incluídas no backup ( 'Article'
, 'Author'
), o identificador exclusivo fornecido ao backup ( 'backup-id'
) , o caminho que indica onde o backup está armazenado no bucket S3 ( s3://weaviate-backups/backup-id
) e o status da operação ( 'SUCCESS'
).
Essa resposta estruturada não apenas confirma a conclusão bem-sucedida do processo de backup, mas também fornece informações essenciais que podem ser usadas para referência futura, auditoria ou processos de restauração.
A restauração de dados dentro do ecossistema Weaviate é facilitada por meio de uma chamada de API estruturada, por meio de uma solicitação POST direcionada ao endpoint /v1/backups/s3/backup-id/restore, identificado por backup-id. Essa chamada curl não apenas restaura os dados perdidos ou arquivados, mas também permite manter a continuidade.
curl -X POST 'http://localhost:8080/v1/backups/s3/backup-id/restore' \ -H 'Content-Type:application/json' \ -d '{ "id": "backup-id", "exclude": ["Author"] }'
CURL: restaurar
Esperar:
{ "backend": "s3", "classes": ["Article"], "id": "backup-id", "path": "s3://weaviate-backups/backup-id", "status": "SUCCESS" }
Resposta de restauração bem-sucedida
Cada um desses comandos deve ser adaptado com base em sua configuração e requisitos específicos. Talvez seja necessário modificar URLs de endpoint, caminhos de arquivos de dados e outros parâmetros conforme necessário. Além disso, certifique-se de que os arquivos e configurações necessários (schema.json, data.json) e configurações estejam disponíveis em seu ambiente.
Ao codificar tudo no Git, as equipes podem rastrear facilmente as alterações, reverter para estados anteriores e garantir a consistência entre os ambientes. Os fluxos de trabalho GitOps podem ser integrados com ferramentas de integração/implantação contínua (CI/CD) e Kubernetes, simplificando ainda mais a orquestração de aplicativos em contêineres e o gerenciamento de infraestrutura. Entraremos em detalhes em uma postagem futura sobre como automatizar usando GitOps.
Weaviate permite fazer backup ou restaurar classes específicas, o que é útil para casos como migração parcial de dados ou testes de desenvolvimento.
Backups de vários nós: para configurações de vários nós, especialmente em ambientes Kubernetes, certifique-se de que sua configuração especifique corretamente o módulo de backup (como backup-s3 para MinIO) e as variáveis de ambiente relacionadas.
Se você encontrar problemas durante o backup ou a restauração, verifique as configurações das variáveis de ambiente, especialmente relacionadas às configurações SSL para armazenamento compatível com S3, como MinIO. Desativar SSL ( BACKUP_S3_USE_SSL: false
) pode resolver certos problemas de conexão.
Ao encerrarmos esta exploração da integração do Weaviate com MinIO usando Docker Compose, fica evidente que essa combinação não é apenas uma solução técnica, mas um aprimoramento estratégico para o gerenciamento de dados. Essa integração se alinha perfeitamente ao compromisso da MinIO em fornecer soluções de armazenamento de dados escaláveis, seguras e de alto desempenho, agora amplificadas pelos recursos orientados por IA da Weaviate. O uso do Docker Compose agiliza ainda mais essa integração, enfatizando nosso foco em tornar tecnologias complexas acessíveis e gerenciáveis.
Como sempre, a equipe do MinIO continua comprometida em impulsionar a inovação na área de gerenciamento de dados. Nossa dedicação em aprimorar e simplificar a forma como os dados são armazenados, acessados e analisados está no centro da nossa missão.
Ao reunir os recursos avançados de banco de dados vetoriais do Weaviate com as soluções robustas de armazenamento fornecidas pelo MinIO, os usuários têm a capacidade de desbloquear todo o potencial de seus dados. Isto inclui o aproveitamento de funcionalidades de pesquisa semântica que garantem não apenas a acessibilidade dos dados, mas também a sua segurança ao nível fundamental.
Estamos verdadeiramente inspirados pela notável inovação que surge das mentes de desenvolvedores dedicados e apaixonados como você. É um prazer oferecer nosso apoio e fazer parte de sua jornada para explorar soluções avançadas e alcançar novos patamares em seus projetos baseados em dados. Por favor, não hesite em entrar em contato conosco em