ベクトルデータベース Weaviate を試す。Python で操作する。

Jul 15, 2024, 11:12 AM
前回、ベクトルデータベース Weaviate を試す。Docker 起動から簡単なテストまで の続きで、本日は、python で Weaviate を操作してみます。
マニュアルを見ると、かなり多くのことができますので、今回はかなりざっくりした内容をメモ程度に残しておきます。

ライブラリのインストール

$ pip install weaviate-client

import weaviate

client = weaviate.connect_to_custom(
http_host="localhost",
http_port="8080",
http_secure=False,
grpc_host="localhost",
grpc_port="50052",
grpc_secure=False,
skip_init_checks=True
)

try :

# スキーマ存在確認
if client.collections.exists('WebPage'):
# スキーマ削除
client.collections.delete('WebPage')

# スキーマ作成
# https://weaviate.io/developers/weaviate/manage-data/collections
schema = {
"class": "WebPage",
"properties": [
{
"name": "title",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": False
}
}
},
{
"name": "author",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "hostname",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "date",
"dataType": ["date"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "fingerprint",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "page_id",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "license",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "comments",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "raw_text",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": False
}
}
},
{
"name": "text",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": False
}
}
},
{
"name": "language",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "image",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "pagetype",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "filedate",
"dataType": ["date"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "source",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "source_hostname",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "excerpt",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": False
}
}
},
{
"name": "categories",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
},
{
"name": "tags",
"dataType": ["text"],
"moduleConfig": {
"text2vec-contextionary": {
"skip": True
}
}
}
]
}

client.collections.create_from_dict(schema)

# スキーマ一覧
print(client.collections.list_all())
# スキーマ取得
print(client.collections.get('WebPage'))

# データ登録
# https://weaviate.io/developers/weaviate/manage-data/create
articles = client.collections.get("WebPage")
data = {
"title": "Difyのバージョンが v0.6.11からv0.6.12 に上がったので、Kubernetes で運用しているDifyのバージョンアップを行ってみる | microAI",
"author": None,
"hostname": "microai.jp",
"date": "2024-06-29",
"fingerprint": "b0b37451d481f718",
"id": None,
"license": None,
"comments": "",
"raw_text": "2024/06/28 に v0.6.11 がリリースされていました。Difyは本当に素晴らしいアプリですが、不具合もまだまだ多くあるので、バージョンアップしていきます。 前回から2週間ほどでのバージョンアップ。活発で嬉しいです。 最初に Dify のバージョンアップ中に、(ブログが見づらくなるので省略)...",
"text": "2024/06/28 に v0.6.11 がリリースされていました。Difyは本当に素晴らしいアプリですが、不具合もまだまだ多くあるので、バージョンアップしていきます。\n前回から2週間ほどでのバージョンアップ。活発で嬉しいです。\n最初に\nDify のバージョンアップ中に、、(ブログが見づらくなるので省略)...",
"language": None,
"image": "https://microai.jp/images/ogimage.webp",
"pagetype": None,
"filedate": "2024-07-04",
"source": "https://microai.jp/blog/70b4bf89-fe4b-451f-ac81-2d757fca8b6a",
"source_hostname": "Microai",
"excerpt": None,
"categories": "",
"tags": "microAI,AI,API"
}

# データ整形
data["page_id"] = data["id"]
del data["id"]

# 日付をRFC3339形式に変換
from app.libs.utils import convert_to_rfc3339
data["date"] = convert_to_rfc3339(data["date"])
data["filedate"] = convert_to_rfc3339(data["filedate"])

# データ登録
inserted_uuid = articles.data.insert(data)

webPages = client.collections.get("WebPage")

# データ更新
# https://weaviate.io/developers/weaviate/manage-data/update
webPages.data.update(
uuid=inserted_uuid,
properties={
"language": "ja",
}
)


# 全データ取得
# https://weaviate.io/developers/weaviate/search/basics
response = webPages.query.fetch_objects()

for o in response.objects:
print(o.properties)

# ベクトル検索
# https://weaviate.io/developers/weaviate/search/similarity

from weaviate.classes.query import MetadataQuery
response = webPages.query.near_text(
query="Difyバージョンアップについて",
limit=2,
target_vector="text", # Specify the target vector for named vector collections
return_metadata=MetadataQuery(distance=True)
)

print(response)
for o in response.objects:
print("properties:----------------")
print(o.properties)
print("metadata:----------------")
print(o.metadata)
print("----------------")


# ハイブリッド検索
# https://weaviate.io/developers/weaviate/search/hybrid
from weaviate.classes.query import HybridVector, Move, HybridFusion

response = webPages.query.hybrid(
query="microAI",
vector=HybridVector.near_text(
query="Difyバージョンアップについて"
),
alpha=0.75,
limit=5,
)
print("hybrid response:----------------")
print(response)

# フィルター
# https://weaviate.io/developers/weaviate/search/filters
from datetime import datetime, timezone
from weaviate.classes.query import Filter
filter_time = datetime(2022, 6, 10).replace(tzinfo=timezone.utc)

response = webPages.query.hybrid(
query="microAI",
vector=HybridVector.near_text(
query="Difyバージョンアップについて"
),
alpha=0.75,
limit=5,
filters=Filter.by_property("date").less_than(filter_time)
)
print("hybrid response:----------------")
print(response)

# データ削除
# https://weaviate.io/developers/weaviate/manage-data/delete
delete_result = webPages.data.delete_by_id(
inserted_uuid
)
print("delete_result:----------------")
print(delete_result)

except Exception as e:
print(f"An error occurred: {str(e)}")
finally:
client.close()

hybrid Variables

VariablesRequiredTypeDescription
queryyesstringsearch query
検索クエリを指定します。検索したいテキストを入力します。
alphanofloatweighting for each search algorithm, default 0.75
各検索アルゴリズムの重みを指定します。デフォルト値は0.75です。例えば、BM25とベクトル検索のハイブリッド検索において、alphaを調整することで、どちらのアルゴリズムに重点を置くかを決めることができます。
vectorno[float]optional to supply your own vector
独自のベクトルを提供する場合に使用します。このベクトルを使用して検索が行われます。通常は、Weaviateが内部でテキストからベクトルを生成しますが、特定のベクトルを使用したい場合に指定します。
propertiesno[string]list of properties to limit the BM25 search to, default all text properties
BM25検索を特定のプロパティに限定するためのプロパティリストを指定します。デフォルトでは、すべてのテキストプロパティが対象となります。
["title", "description"](特定のプロパティのみを検索対象とする場合)
fusionTypenostringthe type of hybrid fusion algorithm (available from v1.20.0)
ハイブリッド融合アルゴリズムの種類を指定します。バージョン1.20.0以降で利用可能です。

Python コードに書いたサンプルの
alpha=0.75 の意味は、ベクトル検索の重み(重要度)を 75%、query="microAI" の検索の重みを25%にするという意味です。

本当にメモレベルな記事になってしまいました💦
ベクトルデータベース Weaviate を試す。Docker で起動〜簡単なテストまで
ベクトルデータベース Weaviate を試す。Docker で起動〜簡単なテストまで(Nvidia GPU使用)