LanceDB : ガイド : テーブル / ベクトル検索 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/21/2023 (v0.2.6)
* 本ページは、lancedb の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
LanceDB : ガイド : テーブル
テーブルは LanceDB データベースのレコードのコレクションです。
LanceDB テーブルの作成
VectorDB 接続
const lancedb = require("vectordb");
const uri = "data/sample-lancedb";
const db = await lancedb.connect(uri);
テーブルの作成
レコードの配列を使用して javascript で LanceDB テーブルを作成することができます。
data
const tb = await db.createTable("my_table",
data=[{"vector": [3.1, 4.1], "item": "foo", "price": 10.0},
{"vector": [5.9, 26.5], "item": "bar", "price": 20.0}])
Note : テーブルが既に存在する場合、LanceDB はデフォルトではエラーを上げます。テーブルを上書きした場合は、createTable 関数で WriteMode を指定する必要があります。
const table = await con.createTable(tableName, data, { writeMode: WriteMode.Overwrite })
既存のテーブルのオープン
テーブルの名前を忘れた場合、すべてのテーブル名のリストをいつでも取得できます :
console.log(await db.tableNames());
そして既存のテーブルをオープンできます :
const tbl = await db.openTable("my_table");
テーブルに追加
テーブルが作成された後、次を使用してそれにデータをいつでも追加することができます :
await tbl.add([{vector: [1.3, 1.4], item: "fizz", price: 100.0},
{vector: [9.5, 56.2], item: "buzz", price: 200.0}])
テーブルから削除
テーブルから行を削除するためにはテーブルで delete() メソッドを使用します。どの行を削除するか選択するには、メタデータカラム上で一致するフィルタを提供します。これはフィルタに一致する任意の数の行を削除できます。
await tbl.delete('item = "fizz"')
特定のカラム値を持つ行の削除
const con = await lancedb.connect("./.lancedb")
const data = [
{id: 1, vector: [1, 2]},
{id: 2, vector: [3, 4]},
{id: 3, vector: [5, 6]},
];
const tbl = await con.createTable("my_table", data)
await tbl.delete("id = 2")
await tbl.countRows() // Returns 2
値のリストから削除
const to_remove = [1, 5];
await tbl.delete(`id IN (${to_remove.join(",")})`)
await tbl.countRows() // Returns 1
LanceDB : ガイド : ベクトル検索
ベクトル検索はデータベースから最も近いベクトルを見つけます。レコメンデーション・システムや検索エンジンでは、検索したものと似た商品を見つけることができます。LLM や他の AI アプリケーションでは、各データポイントは モデルから生成された埋め込みにより表す ことができて、最も関連する特徴を返します。
高次元ベクトル空間での検索は、クエリーベクトルの K 最近傍 (KNN) を見つけることです。
メトリック
LanceDB では、メトリックはベクトルのペア間の距離を表す方法です。現在、以下のメトリクスをサポートします :
メトリック | 説明 |
---|---|
L2 | ユークリッド / L2 距離 |
Cosine | Cosine 類似度 |
Dot | ドット積 |
検索
フラットな検索
LanceDB がベクトルインデックスを作成しない場合、LanceDB は最も近い一致を見つけるために、ベクトルカラム全体をスキャンして (Flat Search) 各ベクトルの距離を計算する必要があります。
const vectordb = require('vectordb')
const db = await vectordb.connect('data/sample-lancedb')
const tbl = await db.openTable("my_vectors")
const results_1 = await tbl.search(Array(1536).fill(1.2))
.limit(10)
.execute()
デフォルトでは、l2 がメトリックタイプとして使用されます。メトリックタイプをカスタマイズすることもできます。
const results_2 = await tbl.search(Array(1536).fill(1.2))
.metricType("cosine")
.limit(10)
.execute()
ベクトルインデックスを使用した近似最近傍 (ANN) 検索
ベクトル検索を高速化するため、ベクトルインデックスを構築するのが一般的です。ベクトルインデックスは、類似度や距離メトリックスに基づいて、ベクトルデータを効率的に体系化して検索するために特に設計されたデータ構造です。ベクトルインデックスを構築することにより、検索空間を削減してベクトルカラム全体のブルートフォース・スキャンの必要性を回避することができます。
ただし、インデックスを使用した高速なベクトル検索はある程度の精度とのトレードオフを伴う場合が多いです。これがそれは 近似最近傍 (ANN) 検索としばしば呼ばれる理由で、一方でフラットな検索 (KNN) は常に 100% の再現率 (recall) を常に返します。
詳細は ANN インデックス をご覧ください。
以上