Closed3

ベクトルデータベース「Weaviate」を試す 11: バックアップ/レストア

kun432kun432

バックアップで選択できるのは以下の4つで、それぞれモジュールの組み込み及びそれぞれの設定が必要になる

  • ローカルファイルシステム: backup-filesystem
  • Amazon S3: backup-s3
  • Google Cloud Strorage: backup-gcs
  • Azure Blob Storage: backup-azure

なお、WCSではこれらのモジュールは有効化されていない。クラウドなのでバックアップとか気にすんな、ということなのかもしれないけど未確認。

今回はEmbed Weaviate・Amazon S3を使ってやってみる。Colaboratoryで。

パッケージインストール

!pip install -U weaviate-client

クライアント初期化。このときbackup-s3モジュールを有効にして、S3のバケット定義や接続に必要な情報をadditional_env_varsで渡す。コメントアウトしている箇所は必要ならば指定する。

import weaviate
import weaviate.classes as wvc
from weaviate.embedded import EmbeddedOptions
import os
from google.colab import userdata

def init_embedded_client():
    client = weaviate.WeaviateClient(
        embedded_options=EmbeddedOptions(
            version="1.24.10",
            additional_env_vars={
                "ENABLE_MODULES": "backup-s3,text2vec-openai,generative-openai",
                "BACKUP_S3_BUCKET": "weaviate-backup-test",
                #"BACKUP_S3_PATH": "",
                #"BACKUP_S3_ENDPOINT": "s3.amazonaws.com",     
                #"BACKUP_S3_USE_SSL": "true",
                "AWS_ACCESS_KEY_ID": userdata.get('AWS_ACCESS_KEY_ID'),
                "AWS_SECRET_ACCESS_KEY": userdata.get('AWS_SECRET_ACCESS_KEY'),
                "AWS_REGION": "ap-northeast-1",
            },
        ),
        additional_headers={
            "X-OpenAI-Api-Key": userdata.get('OPENAI_API_KEY'),
        },
    )
    return client

client = init_embedded_client()

接続。embeddedの場合はここでプロセスが立ち上がる。

client.connect()
Binary /root/.cache/weaviate-embedded did not exist. Downloading binary from https://github.com/weaviate/weaviate/releases/download/v1.24.10/weaviate-v1.24.10-Linux-amd64.tar.gz
Started /root/.cache/weaviate-embedded: process ID 586

登録するデータを容易。前回と同じようにデータセットは以下を使用。

https://linecorp.com/ja/csr/newslist/ja/2020/260

!wget https://d.line-scdn.net/stf/linecorp/ja/csr/dataset_.zip
!unzip dataset_.zip
import pandas as pd

df = pd.read_excel("dataset_.xlsx")
df.drop(columns=["ID","サンプルID", "カテゴリ2","出典","<参考>UMカテゴリタグ","<参考>UMサービスメニュー\n(標準的な行政サービス名称)"], inplace=True)
df.rename(columns={
    'サンプル 問い合わせ文': 'question',
    'サンプル 応答文': 'answer',
    'カテゴリ1': 'category',
}, inplace=True)
df

faq_objs = df.to_dict(orient='records')
print(len(faq_objs))
print(faq_objs[0])
662
{'question': '母子手帳を受け取りたいのですが、手続きを教えてください。', 'answer': '窓口で妊娠届をご記入いただき、母子手帳をお渡しします。\n住民票の世帯が別の方が代理で窓口に来られる場合は、委任状が必要になります。\n\n▼詳しくはこちら\n(自治体HP内関連ページのURL)', 'category': '妊娠・出産'}

ではコレクションを作成して、データを登録。

faq = client.collections.create(
    name="FAQ",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
    generative_config=wvc.config.Configure.Generative.openai(),
)

faq = client.collections.get("FAQ")
faq.data.insert_many(faq_objs)

登録されたか軽く確認。

response = faq.query.near_text(
    query="妊娠したのですが、どういう手続が必要ですか?",
    limit=5,
)

for r in response.objects:
    print(r.properties)
{'answer': '妊娠したら妊娠届を○○課窓口(または支所・出張所窓口)に提出し、母子手帳を受け取ってください。\n\n▼詳しくはこちら\n(自治体HP内関連ページのURL)', 'question': '妊娠したので、必要な手続きを教えてください。', 'category': '妊娠・出産'}
{'answer': '産前は母子手帳以外の手続きは特にありません。\n産後に、出生の届出や出生通知書の提出、(自治体が行う出産助成等)の申請をお願いします。', 'question': '母子手帳の他に産前に市役所でやるべき手続きはありますか?', 'category': '妊娠・出産'}
{'answer': '母子手帳の申請には診断書はいりませんが、妊娠届に診断を受けた病院名・医師名を記入していただきます。', 'question': '母子手帳の申請には医師の診断書が必要ですか?', 'category': '妊娠・出産'}
{'answer': '出産後に必要な手続きは出生届・出生通知票の提出、児童手当、子ども医療費助成の申請等があります。\n\n▼詳しくはこちら\n(自治体HP内関連ページのURL)', 'question': '子どもが生まれたら、どんな手続きが必要ですか。', 'category': '妊娠・出産'}
{'answer': '窓口で妊娠届をご記入いただき、母子手帳をお渡しします。\n住民票の世帯が別の方が代理で窓口に来られる場合は、委任状が必要になります。\n\n▼詳しくはこちら\n(自治体HP内関連ページのURL)', 'question': '母子手帳を受け取りたいのですが、手続きを教えてください。', 'category': '妊娠・出産'}

登録されている。

バックアップを実行。include_collections/exclude_collectionsを指定してバックアップするコレクションを明示的に指定することもできるが、今回はまるっとバックアップする。

result = client.backup.create(
    backup_id="backup-faq-20240429",
    backend="s3",
    wait_for_completion=True,
)
print(result)
status=<BackupStatus.SUCCESS: 'SUCCESS'> path='s3://weaviate-backup-test/backup-faq-20240429' collections=['FAQ']

バックアップ成功した。S3側でも以下の通りファイルが確認できる。

ではコレクションを削除してレストアしてみる。

削除前のコレクション。

client.collections.list_all().keys()
dict_keys(['FAQ'])

全てのコレクションを削除

client.collections.delete_all()
client.collections.list_all().keys()
dict_keys([])

コレクションが削除された。

レストアする。

result = client.backup.restore(
    backup_id="backup-faq-20240429",
    backend="s3",
    wait_for_completion=True,
)
print(result)
status=<BackupStatus.SUCCESS: 'SUCCESS'> path='s3://weaviate-backup-test/backup-faq-20240429' collections=['FAQ']

レストアが成功した。コレクションを見てみる。

client.collections.list_all().keys()
dict_keys(['FAQ'])

コレクションが復活している。検索してみる。

faq = client.collections.get("FAQ")

response = faq.query.near_text(
    query="妊娠したのですが、どういう手続が必要ですか?",
    limit=5,
)

for r in response.objects:
    print(r.properties)
{'answer': '妊娠したら妊娠届を○○課窓口(または支所・出張所窓口)に提出し、母子手帳を受け取ってください。\n\n▼詳しくはこちら\n(自治体HP内関連ページのURL)', 'question': '妊娠したので、必要な手続きを教えてください。', 'category': '妊娠・出産'}
{'answer': '産前は母子手帳以外の手続きは特にありません。\n産後に、出生の届出や出生通知書の提出、(自治体が行う出産助成等)の申請をお願いします。', 'question': '母子手帳の他に産前に市役所でやるべき手続きはありますか?', 'category': '妊娠・出産'}
{'answer': '母子手帳の申請には診断書はいりませんが、妊娠届に診断を受けた病院名・医師名を記入していただきます。', 'question': '母子手帳の申請には医師の診断書が必要ですか?', 'category': '妊娠・出産'}
{'answer': '出産後に必要な手続きは出生届・出生通知票の提出、児童手当、子ども医療費助成の申請等があります。\n\n▼詳しくはこちら\n(自治体HP内関連ページのURL)', 'question': '子どもが生まれたら、どんな手続きが必要ですか。', 'category': '妊娠・出産'}
{'answer': '窓口で妊娠届をご記入いただき、母子手帳をお渡しします。\n住民票の世帯が別の方が代理で窓口に来られる場合は、委任状が必要になります。\n\n▼詳しくはこちら\n(自治体HP内関連ページのURL)', 'question': '母子手帳を受け取りたいのですが、手続きを教えてください。', 'category': '妊娠・出産'}

レストアできている。

kun432kun432

docker-composeの場合は多分ここで全部指定することになると思う。試してないのでわからないけども。

    (snip)
    environment:
      (snip)
      ENABLE_MODULES: 'text2vec-openai,generative-openai,backup-s3'
      BACKUP_S3_BUCKET: "S3_BUCKET_NAME"
      AWS_ACCESS_KEY_ID: "XXXXXXXXXX"
      AWS_SECRET_ACCESS_KEY: "XXXXXXXXXX"
      AWS_REGION: "ap-northeast-1"
このスクラップは20日前にクローズされました