Lanceテーブルフォーマットを触ってみる

公式のGetting Started with LanceDBを元にLanceDBを触ってみます。

まずは必要なパッケージをインストールします。Python 3.8以上が必要となります。

Terminal window
pip install lancedb pandas

次に上記のライブラリをインポートします。lancedbがコアとなるベクターデータベースの機能を提供し、pandasはデータの操作に利用します。

Terminal window
import lancedb
import pandas as pd

次にLanceDBに接続します。公式の例ではLanceDB Cloudを利用していますが、以下のように指定するとローカルで試すことができます。

Terminal window
db = lancedb.connect(uri="data/lance.db")

pandasのデータフレームを3つのフィールド(id、vector、text)で作成します。

Terminal window
data = pd.DataFrame([
{"id": "1", "vector": [0.9, 0.4, 0.8], "text": "knight"},
{"id": "2", "vector": [0.8, 0.5, 0.3], "text": "ranger"},
{"id": "3", "vector": [0.5, 0.9, 0.6], "text": "cleric"},
{"id": "4", "vector": [0.3, 0.8, 0.7], "text": "rogue"},
{"id": "5", "vector": [0.2, 1.0, 0.5], "text": "thief"},
])

データベース内にテーブルを作成します。スキーマはデータから自動で決定されます。

Terminal window
table = db.create_table("adventurers", data)

次にベクトルの類似検索を実行します。クエリで指定するディメンションは実際のデータと一致する必要があります。例えば、前述のデータは[0.9, 0.4, 0.8]なので、ディメンションは3です。

この例を実行するとユークリッド距離を用いて、[0.8, 0.3, 0.8]にもっとも近い結果が3行返却されます。

Terminal window
query_vector = [0.8, 0.3, 0.8] # warrior
results = table.search(query_vector).limit(3).to_pandas()
print(results)

distanceカラムが低い値が距離が近い、つまり類似していることを表しています。

idvectortextdistance
1[0.9, 0.4, 0.8]knight0.02
2[0.8, 0.5, 0.3]ranger0.29
3[0.5, 0.9, 0.6]cleric0.49
×