🌟

TiDB Cloud Starter (旧Serverless) の自動埋め込み (Auto Embedding) を試してみた

に公開

従来TiDB Serverlessとして提供されていたサーバレス型MySQL互換分散データベースが、改めてTiDB Cloud Starter と名称変更となりました。
https://pingcap.co.jp/tidb-cloud-starter/

TiDB にはほかにDedicated版も提供されており、機能差異が存在しています。Starter プランは「お試し・学習・小規模開発」向けという位置づけの様で、一定のリソース枠(クエリ数・ストレージ容量・接続数など)が無料で提供されます。インフラのサイズ指定は不要で、利用状況に応じてスケールされるというメリットがあります。ただし、データサイズ上限、接続数や同時クエリ数などに制限があります。

一方DedicatedはAWS/GCP 上に専有リソースで構築され自動フェイルオーバー、3AZ構成など高い可用性とパフォーマンスを実現させるため、クラスターサイズ(TiDBノード、TiKVノード、TiFlashノード)を明示的に指定することが可能です。ワークロードに応じてストレージ・コンピューティングを水平/垂直スケールさせることでパフォーマンスを増減させることができます。

TiDB Vector Search と Auto Embedding

TiDB Vector Search はベクトル検索用データストアです。RDB用テーブルとベクトル用テーブルが同じデータベースに同居することができ、同じセッションや単一SQLで両方のデータにまたがったクエリを発行できることが大きな特徴です。
https://zenn.dev/kameoncloud/articles/f30e732b039633
https://zenn.dev/kameoncloud/articles/56e84dce9cd89f
Vector Searchはベクトルでの検索に対応しており、例えば自然言語のベクトル検索には、一度検索対象文字列をベクトルに変換したのちベクトル検索を行う必要がありました。

SELECT embedding, vec_l2_distance(embedding, '[1.2, 3.4, 7.2, 4.5, 8.2]') AS d FROM vector_table ORDER BY d;

今回リリースされた Auto Embeddingという機能により、あらかじめベクトル化処理を行う必要がなく直接自然言語でのクエリを行うことができるようになりました。

さっそくやってみる

以下のサイトにサンプルが提供されています。
https://docs.pingcap.com/tidbcloud/vector-search-auto-embedding-overview/
現時点で本機能は以下3つのリージョンで提供されています。
Frankfurt (eu-central-1)
Oregon (us-west-2)
N. Virginia (us-east-1)

まずはテーブルを作成します。

CREATE TABLE documents (
    id INT PRIMARY KEY AUTO_INCREMENT,
    content TEXT,
    content_vector VECTOR(1024) GENERATED ALWAYS AS (
        EMBED_TEXT("tidbcloud_free/amazon/titan-embed-text-v2", content)
    ) STORED
);

以下の部分が今回のアップデートのポイントです。

    content_vector VECTOR(1024) GENERATED ALWAYS AS (
        EMBED_TEXT("tidbcloud_free/amazon/titan-embed-text-v2", content)
    ) STORED

あらかじめテーブルのカラムに埋め込みモデル(文字列をベクトル化するモデル)を指定しておくことにより、前もってベクトル化を行う処理が不要となります。
このカラムに対して発行されるInsertの際に、自動で対象文字列が指定したモデルでベクトル化されます。同様にSelect時も同じモデルでベクトル化が行われたあと、ベクトル検索が実行されます。

2025年8月30日時点で以下のモデルに対応しています。

次に以下のSQLを実行しデータを挿入します。

INSERT INTO documents (content) VALUES
    ("Electric vehicles reduce air pollution in cities."),
    ("Solar panels convert sunlight into renewable energy."),
    ("Plant-based diets lower carbon footprints significantly."),
    ("Deep learning algorithms improve medical diagnosis accuracy."),
    ("Blockchain technology enhances data security systems.");

contentの値が自動でベクトル化されcontent_vectorに格納されます。
では最後に自然言語による検索を行います。

SELECT id, content FROM documents
ORDER BY VEC_EMBED_COSINE_DISTANCE(
    content_vector,
    "Renewable energy solutions for environmental protection"
)
LIMIT 3;

ベクトル検索との共存

自動でベクトル処理が行われ検索が実行されるようになりましたが、従来通りのベクトル検索を行いたいケースも当然存在します。例えば、テーブルに格納しきれない画像や音楽といった非構造化データの検索です。先ほど作成したテーブルは以下の通りベクトル化した値が含まれています。

SELECT * FROM documents
ORDER BY VEC_EMBED_COSINE_DISTANCE(
    content_vector,
    "Renewable energy solutions for environmental protection"
)
LIMIT 3;


ただしcontent_vectorはリテラルとしてベクトルを格納しており、利用にはフルスキャンが行われまます。このため以下の様にベクトル計算を多用する場合は、インデックスを用いた従来通りの方式と組み合わせるのが効率がよさそうです。

以下の様にテーブル作成時に明示的にベクトル用インデックスを作成しておくことでインデックスを用いたベクトル検索が可能となります。

CREATE TABLE documents (
    id INT PRIMARY KEY AUTO_INCREMENT,
    content TEXT,
    content_vector VECTOR(1024) GENERATED ALWAYS AS (
        EMBED_TEXT("tidbcloud_free/amazon/titan-embed-text-v2", content)
    ) STORED,
    VECTOR INDEX ((VEC_COSINE_DISTANCE(content_vector)))
);

VEC_COSINE_DISTANCEの他にユークリッド距離(VEC_EMBED_L2_DISTANCE)にも対応しています。

Discussion