Weaviate — это новаторская векторная база данных с открытым исходным кодом, предназначенная для улучшения семантического поиска за счет использования моделей машинного обучения. В отличие от традиционных поисковых систем, которые полагаются на сопоставление ключевых слов, Weaviate использует принципы семантического сходства. Этот инновационный подход преобразует различные формы данных (тексты, изображения и т. д.) в векторные представления, числовые формы, которые отражают суть контекста и значения данных. Анализируя сходство между этими векторами, Weaviate предоставляет результаты поиска, которые действительно понимают намерения пользователя, предлагая значительный скачок за пределы ограничений поиска на основе ключевых слов.
Целью этого руководства является демонстрация плавной интеграции MinIO и Weaviate с использованием лучших возможностей собственного объектного хранилища Kubernetes и возможностей семантического поиска на базе искусственного интеллекта. В этом руководстве, использующем Docker Compose для оркестровки контейнеров, представлен стратегический подход к созданию надежной, масштабируемой и эффективной системы управления данными. Эта установка, направленная на то, как мы храним данные, получаем к ним доступ и управляем ими, меняет правила игры для разработчиков, DevOps-инженеров и специалистов по обработке данных, стремящихся использовать возможности современных решений хранения и извлечения данных на основе искусственного интеллекта.
В этой демонстрации мы сосредоточимся на резервном копировании Weaviate с помощью корзин MinIO с использованием Docker. Такая настройка обеспечивает целостность и доступность данных в наших проектах поиска и анализа с использованием искусственного интеллекта.
Эта демонстрация призвана продемонстрировать плавную интеграцию MinIO и Weaviate с использованием Docker, демонстрируя надежный метод резервного копирования систем поиска и анализа с улучшенным искусственным интеллектом.
Представленный здесь файл docker-compose.yaml
создан для простой настройки Weaviate, подчеркивая наше стремление к упрощенному и эффективному управлению данными. Эта конфигурация обеспечивает надежную среду, в которой MinIO выступает в качестве службы безопасного хранения, а Weaviate использует это хранилище для расширенных возможностей векторного поиска.
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: развертывание Weaviate с включенным модулем backups-s3
и сервером MinIO play.min.io
С помощью приведенного выше файла docker-compose.yaml Weaviate настроен на использование MinIO для резервного копирования, обеспечивая целостность и доступность данных. Эта настройка включает в себя важные переменные среды, такие как ENABLE_MODULES
со значением backup-s3
и различные настройки для корзины S3, конечной точки, ключей доступа и использования SSL. Кроме того, PERSISTENCE_DATA_PATH
устанавливается для обеспечения постоянного хранения данных, а CLUSTER_NAME
для идентификации узла.
ENABLE_MODULES
: 'резервное копирование-s3'BACKUP_S3_BUCKET
: 'weaviate-резервные копии'BACKUP_S3_ENDPOINT
: 'play.min.io:443'BACKUP_S3_ACCESS_KEY_ID
: 'миниоадмин'BACKUP_S3_SECRET_ACCESS_KEY
: 'миниоадмин'BACKUP_S3_USE_SSL
: 'истина'PERSISTENCE_DATA_PATH
: '/var/lib/weaviate'CLUSTER_NAME
: 'узел1'
Служба Weaviate в этом docker-compose настроена на использование смонтированных томов для сохранения данных; это гарантирует сохранение ваших данных во всех сеансах и операциях.
Примечание. Корзина MinIO должна существовать заранее. Weaviate не будет создавать корзину за вас.
Чтобы интегрировать MinIO и Weaviate в ваш проект с помощью Docker Compose, выполните следующую подробную процедуру:
Сохранение или обновление файла Docker Compose
После создания файла docker-compose.yaml используйте следующую команду в терминале или командной строке, чтобы начать развертывание:
docker-compose up -d --build
Эта команда запустит службы Weaviate в автономном режиме, запуская их в фоновом режиме вашей системы.
В процессе сборки и выполнения Docker Compose создаст постоянный каталог, указанный в файле docker-compose.yaml. Этот каталог ( ./weaviate/data
для Weaviate) используется для постоянного хранения данных, гарантируя, что ваши данные останутся нетронутыми при перезапусках и развертываниях контейнера.
Постоянное хранилище обеспечивает более стабильную среду, в которой данные не теряются при перезапуске контейнера.
После развертывания docker-compose вы можете посетить URL-адрес вашего сервера Weaviate в браузере, а затем /v1/meta
чтобы проверить правильность настроек развертывания.
Первая строка полезных данных JSON по адресу http://localhost:8080/v1/meta
должна выглядеть следующим образом:
{"hostname":"http://[::]:8080","modules":{"backup-s3":{"bucketName":"weaviate-backups","endpoint":"play.min.io:443","useSSL":true}...[truncated]...}
weaviate-backups
Для интеграции Weaviate с MinIO корзине резервного копирования в MinIO необходимо, чтобы политика доступа назначенной корзины резервного копирования, а именно weaviate-backups
, была общедоступной. Эта настройка необходима для предоставления модулю Weaviate backup-s3 необходимых разрешений для успешного взаимодействия с ведром MinIO для операций резервного копирования.
Примечание. В производственной среде вам, вероятно, потребуется это заблокировать, но это выходит за рамки данного руководства.
Очень важно подходить к этой настройке с четким пониманием последствий для безопасности установки сегмента « public » . Хотя такая настройка упрощает процесс резервного копирования в среде разработки, для производственных систем следует рассмотреть альтернативные подходы для обеспечения безопасности и целостности данных. Использование детального контроля доступа, такого как политики IAM или « заранее заданные » URL-адреса.
К концу этой демонстрации вы сможете увидеть объекты корзины, которые Weaviate создает на протяжении всего процесса при использовании модуля backup-s3
.
Чтобы включить резервное копирование S3 в Weaviate, установите необходимые переменные среды в файле docker-compose.yaml. Это предписывает Weaviate использовать MinIO в качестве места назначения резервного копирования, включая настройки модулей резервного копирования и сведения о корзине MinIO.
Прежде чем углубиться в технические операции, я хотел бы заявить, что я демонстрирую следующие шаги в среде JupyterLab для дополнительного преимущества инкапсуляции нашего конвейера в блокнот, доступный здесь .
Первый шаг включает настройку среды путем установки библиотеки weaviate-client
для Python с помощью pip
. Этот пакет Python необходим для взаимодействия с RESTful API Weaviate более Pythonic, обеспечивая плавное взаимодействие с базой данных для таких операций, как создание схемы, индексирование данных, резервное копирование и восстановление. Для демонстрации мы проиллюстрируем использование клиентской библиотеки Weaviate Python.
В этой демонстрации мы используем API Weaviate V3, поэтому при запуске скрипта 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(`
Это сообщение является предупреждающим баннером и его можно игнорировать. Для получения дополнительной информации вы можете посетить это
!pip install weaviate-client
В этом разделе представлены структура и схема данных для классов «Статья» и «Автор» , закладывающие основу для организации данных. Он демонстрирует, как программно определять схему и управлять ею в Weaviate, демонстрируя гибкость и возможности Weaviate для адаптации к различным моделям данных, адаптированным к конкретным потребностям приложения.
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: создание классов схемы
После определения схемы записная книжка поможет инициализировать клиент Weaviate, создать схему в экземпляре Weaviate и индексировать данные. Этот процесс заполняет базу данных исходными наборами данных, что позволяет изучить возможности векторного поиска Weaviate. Он иллюстрирует практические шаги, необходимые для начала использования Weaviate для хранения и запроса данных в векторизованном формате.
# 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: индексировать данные по классам
После индексации данных акцент смещается на сохранение состояния базы данных посредством резервного копирования. В этой части записной книжки показано, как запустить операцию резервного копирования в 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: создать резервную копию
Ожидать:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id-2', 'path': 's3://weaviate-backups/backup-id-2', 'status': 'SUCCESS'}
Успешный ответ резервного копирования
Прежде чем приступить к восстановлению, иногда необходимо очистить существующую схему. В этом разделе показаны этапы процесса чистого восстановления. Это гарантирует, что восстановленные данные не будут конфликтовать с существующими схемами или данными в базе данных.
client.schema.delete_class("Article") client.schema.delete_class("Author")
В этом разделе объясняется, как восстановить ранее зарезервированные данные, вернув базу данных в заведомо исправное состояние.
result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print(result)
Python: восстановить резервную копию
Ожидать:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Успешный ответ Backup-S3
В этой части записной книжки приведен пример реализации обработки ошибок в процессе восстановления из резервной копии. Он предлагает информацию о непредвиденных проблемах во время операций восстановления данных.
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.
Ожидать:
Backup restored successfully: {'backend': 's3', 'classes': ['Author', 'Article'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Успешное восстановление резервной копии
Наконец, чтобы подтвердить успешное завершение процесса резервного копирования и восстановления, в записной книжке предусмотрен этап получения схемы класса «Статья». Эта проверка гарантирует правильность восстановления данных и схемы.
client.schema.get("Article")
Возвращает класс Article как объект JSON.
Ожидать:
{'class': 'Article', 'description': 'A class to store articles'... [Truncated]...}
Каждый раздел записной книжки представляет собой подробное руководство по жизненному циклу управления данными в Weaviate, от первоначальной настройки и заполнения данных до резервного копирования, восстановления и проверки, и все это выполняется в экосистеме Python с использованием клиентской библиотеки Weaviate.
До сих пор мы показывали вам, как это сделать с помощью Pythonic. Мы подумали, что было бы полезно с помощью CURL
показать, как можно выполнить те же операции без написания сценария.
Для взаимодействия с экземпляром Weaviate для таких задач, как создание схемы, индексирование данных, выполнение резервного копирования и восстановление данных, можно использовать специальные команды Curl. Эти команды отправляют HTTP-запросы к REST API Weaviate. Например, для создания схемы запрос POST с подробностями схемы отправляется в конечную точку схемы Weaviate. Аналогично, для индексации данных к конечной точке объектов отправляется POST-запрос с полезными данными.
Резервное копирование запускается с помощью запроса POST к конечной точке резервного копирования, а восстановление выполняется с помощью запроса POST к конечной точке восстановления. Для каждой из этих операций требуются соответствующие полезные данные JSON, которые обычно предоставляются в виде ссылки на файл в команде curl с использованием символа @
.
Для реализации Weaviate нам, конечно, потребуются образцы данных для работы, которые
Я включил следующее:
schema.json
описывает структуру данных, которые мы хотим индексировать.
data.json
— это место, где в игру вступают наши фактические данные, его структура соответствует классам в файле Schema.json.
Файлы Schema.json и data.json доступны в репозитории ресурсов блога MinIO, расположенном
{ "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"} ] } ] }
Примеры классов схемы для статьи и автора
С другой стороны,
[ { "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] } } ]
Пример данных, содержащих статьи
Схема действует как структурная основа нашей системы управления данными, определяя, как данные организуются, индексируются и запрашиваются.
С помощью простой команды Curl и наших примеров файлов, клонированных локально в наш текущий рабочий каталог; мы можем опубликовать наш файл Schema.json непосредственно в Weaviate, устанавливая правила и отношения, которым будут соответствовать наши данные.
curl -X POST -H "Content-Type: application/json" \ --data @schema.json http://localhost:8080/v1/schema
КУРЛ: создать
Когда наша схема готова, следующим шагом будет ее заполнение фактическими данными. Используя другую команду Curl, мы индексируем наш data.json в схеме.
curl -X POST -H "Content-Type: application/json" \ --data @data.json http://localhost:8080/v1/objects
CURL: индекс
Нам нужно будет присвоить уникальный идентификатор или «backup-id». Этот идентификатор не только облегчает точное отслеживание и извлечение наборов резервных копий, но также гарантирует, что каждый набор данных находится под контролем версий.
curl -X POST 'http://localhost:8080/v1/backups/s3' -H 'Content-Type:application/json' -d '{ "id": "backup-id", "include": [ "Article", "Author" ] }'
CURL: резервная копия-s3
Ожидать:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
Успешный ответ Backup-S3
Этот вывод отформатирован как объект JSON. Он включает в себя используемый бэкэнд (в данном случае 's3'
), список классов, которые были включены в резервную копию ( 'Article'
, 'Author'
), уникальный идентификатор, присвоенный резервной копии ( 'backup-id'
) , путь, указывающий, где хранится резервная копия в корзине S3 ( s3://weaviate-backups/backup-id
), и статус операции ( 'SUCCESS'
).
Этот структурированный ответ не только подтверждает успешное завершение процесса резервного копирования, но также предоставляет важную информацию, которую можно использовать для будущих справок, аудита или процессов восстановления.
Восстановление данных в экосистеме Weaviate осуществляется с помощью структурированного вызова API через запрос POST, нацеленный на конечную точку /v1/backups/s3/backup-id/restore, идентифицируемую резервным идентификатором. Этот вызов Curl не только восстанавливает потерянные или заархивированные данные, но и позволяет поддерживать непрерывность.
curl -X POST 'http://localhost:8080/v1/backups/s3/backup-id/restore' \ -H 'Content-Type:application/json' \ -d '{ "id": "backup-id", "exclude": ["Author"] }'
КУРЛ: восстановить
Ожидать:
{ "backend": "s3", "classes": ["Article"], "id": "backup-id", "path": "s3://weaviate-backups/backup-id", "status": "SUCCESS" }
Успешный ответ на восстановление
Каждую из этих команд следует адаптировать в соответствии с вашими конкретными настройками и требованиями. При необходимости вам может потребоваться изменить URL-адреса конечных точек, пути к файлам данных и другие параметры. Также убедитесь, что необходимые файлы (schema.json, data.json) и конфигурации доступны в вашей среде.
Кодифицируя все в Git, команды могут легко отслеживать изменения, выполнять откат к предыдущим состояниям и обеспечивать согласованность между средами. Рабочие процессы GitOps можно интегрировать с инструментами непрерывной интеграции/непрерывного развертывания (CI/CD) и Kubernetes, что еще больше упрощает оркестровку контейнерных приложений и управление инфраструктурой. В следующем посте мы подробно расскажем о том, как автоматизировать использование GitOps.
Weaviate позволяет выполнять резервное копирование или восстановление определенных классов, что полезно в таких случаях, как частичная миграция данных или тестирование разработки.
Многоузловые резервные копии. Для многоузловых установок, особенно в средах Kubernetes, убедитесь, что в вашей конфигурации правильно указан модуль резервного копирования (например, backup-s3 для MinIO) и соответствующие переменные среды.
Если у вас возникли проблемы во время резервного копирования или восстановления, проверьте конфигурации переменных среды, особенно связанные с настройками SSL для S3-совместимого хранилища, такого как MinIO. Отключение SSL ( BACKUP_S3_USE_SSL: false
) может решить некоторые проблемы с подключением.
Когда мы завершаем исследование интеграции Weaviate с MinIO с помощью Docker Compose, становится очевидно, что эта комбинация — не просто техническое решение, а стратегическое усовершенствование управления данными. Эта интеграция идеально согласуется с обязательством MinIO предоставлять масштабируемые, безопасные и высокопроизводительные решения для хранения данных, которые теперь усиливаются возможностями Weaviate на основе искусственного интеллекта. Использование Docker Compose еще больше упрощает эту интеграцию, подчеркивая наше внимание к тому, чтобы сделать сложные технологии доступными и управляемыми.
Как всегда, команда MinIO по-прежнему привержена внедрению инноваций в области управления данными. Наша приверженность совершенствованию и оптимизации способов хранения, доступа и анализа данных лежит в основе нашей миссии.
Объединив передовые возможности векторной базы данных Weaviate с надежными решениями для хранения данных, предоставляемыми MinIO, пользователи получают возможность раскрыть весь потенциал своих данных. Это включает в себя использование функций семантического поиска, которые обеспечивают не только доступность данных, но и их безопасность на базовом уровне.
Нас искренне вдохновляют замечательные инновации, рождающиеся в умах таких преданных своему делу и увлеченных разработчиков, как вы. Мы рады предложить нашу поддержку и стать частью вашего пути к изучению передовых решений и достижению новых высот в ваших проектах, основанных на данных. Пожалуйста, не стесняйтесь обращаться к нам по