Databricks Vector Searchのインデックスの作成、クエリー方法

[How to create and query a Vector Search index \| Databricks on AWS](https://docs.databricks.com/en/generative-ai/create-query-vector-search.html) [2023/11/30時点]の翻訳です。


:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

本書では[Databricks Vector Search](https://qiita.com/taka_yayoi/items/494b00f2c8fc60dcc466)を用いたVector Searchインデックスの作成方法とクエリー方法を説明します。

UI、Python SDK、REST APIを用いてVector SearchエンドポイントやVector SearchインデックスのようなVector Searchのコンポーネントを作成、管理することができます。最もシンプルな方法としてはUIの使用をお勧めしますが、このガイドでは参照とクエリーにおけるSDKの利用方法もデモンストレーションします。

# 要件

- Unity Catalogが有効化されたワークスペース。
- アカウントコンソールでサーバレスコンピュートを有効化。
- インデックスを作成するカタログスキーマに対する`CREATE TABLE`権限。
- [パーソナルアクセストークンが有効化されていること。](https://docs.databricks.com/ja/administration-guide/access-control/tokens.html)
- SDKを使いたいのであれば、ノートブックにインストールすること。

    ```py
    %pip install databricks-vectorsearch
    dbutils.library.restartPython()
    ```

# Vector Searchエンドポイントの作成

UIを用いてVector Searchのエンドポイントを作成することができます。

1. **Compute** UIを開くために左のサイドバーの**Compute**をクリックします。
1. **Vector Search**タブをクリックし、**Create**をクリックします。
![](https://docs.databricks.com/en/_images/create-endpoint.png)
1. **Create endpoint form**が開きます。このエンドポイントの名前を入力します。
1. Confirmをクリックします。

SDKを使う場合には、Vector Searchエンドポイントを作成するために、以下を使うことができます。

```py
client = VectorSearchClient()

client.create_endpoint(
    name="vector_search_endpoint_name",
    endpoint_type="STANDARD"
)
```

# モデルサービングエンドポイントの設定

このセクションのガイドは、Databricksがあなたのためにエンべディングベクトルを自動で計算させるためのVector Searchインデックスを作成しようとしている場合にのみ適用されます。Deltaテーブルにご自身のエンべディングをお持ちの場合や、ご自身でエンべディングベクトルを計算する予定がある場合には、[Vector Searchインデックスの作成](#vector-searchインデックスの作成)までスキップしてください。

Vector Searchにえんべディングを計算させるためには、エンべディング生成のための[モデルサービングエンドポイント](https://docs.databricks.com/ja/machine-learning/model-serving/index.html)を設定する必要があります。お好きなエンべディングモデルのサービングのためのモデルサービングエンドポイントを設定するサンプルについては、[エンべディングモデル呼び出しのサンプルノートブック](#エンべディングモデル呼び出しのサンプルノートブック)のノートブックをご覧ください。

Vector Searchのためのモデルサービングエンドポイントをゼロにスケールダウンしないように設定することをお勧めします。サービングエンドポイントはウォームアップに数分を必要とするので、スケールダウンしているエンドポイントのインデックスに対する最初のクエリーは、エンドポイントのウォームアップ中にタイムアウトになるためです。

# Vector Searchインデックスの作成

UIを用いてVector Searchインデックスを作成することができます。以下のステップでは、ソースのDeltaテーブルの変更があった際に自動で更新される[Delta Sync Index](https://qiita.com/taka_yayoi/items/494b00f2c8fc60dcc466#%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%89%E3%82%A8%E3%83%B3%E3%83%99%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Fdelta-sync-index)の作成方法を説明しています。[Vector Searchインデックス](https://qiita.com/taka_yayoi/items/494b00f2c8fc60dcc466#vector-search%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9)をご覧ください。

1. **Catalog Explorer** UIを開くために、左のサイドバーの**Catalog**をクリックします。
1. 使用したいDeltaテーブルを選択します。
1. 右上のケバブメニューから**Create vector search index**を選択します。
![](https://docs.databricks.com/en/_images/create-index-button.png)
1. **Create vector index**フォームに入力します。
    1. インデックス名を指定します。
    1. 主キーとして使用するカラムを選択します。
    1. 使用したいエンべディングモデルをサービングしているモデルサービングエンドポイントを選択します。
    1. Databricksがあなたのためにエンべディングを計算できるように**Compute embeddings**を選択します。
        1. すでに計算されたエンべディングを持つDeltaテーブルがある場合には、**Use existing embedding column**を選択します。
    1. **Embedding source column**を選択します。Databricksによって計算されるエンべディングでは、テキストのみがサポートされます。
        1. **Use existing embedding column**を選択すると、任意のデータタイプをサポートするようにフィールドが**Embedding vector column**に変化します。
    1. どの**Embedding model**を使用するのかを選択します。
    1. 同期モードとして**Continuous**を選択します。`continuous`モードは数秒のレーテンシーでインデックスを同期し続けます。しかし、継続的な同期ストリーミングパイプラインを実行するために計算クラスターがプロビジョニングされるので、コストは高くなります。
1. **Create**をクリックします。

![](https://docs.databricks.com/en/_images/create-index-form.png)

SDKを使う場合には、以下を使用することができます。このサンプルは、Databricksによって計算されるエンべディングを用いたDelta Sync Indexを作成します。

```py
index = client.create_delta_sync_index(
  endpoint_name="vector_search_demo_endpoint",
  source_table_name="vector_search_demo.vector_search.en_wiki",
  index_name="vector_search_demo.vector_search.en_wiki_index",
  pipeline_type='TRIGGERED',
  primary_key="id",
  embedding_source_column="text",
  embedding_model_endpoint_name="e5-small-v2"
)
```

SDKを用いてのみ[Direct Vector Access Index](https://qiita.com/taka_yayoi/items/494b00f2c8fc60dcc466#direct-vector-access-index)を作成することができます。

```py
client = VectorSearchClient()
index = client.create_direct_access_index(
    endpoint_name="storage_endpoint",
    index_name="{catalog_name}.{schema_name}.{index_name}",
    primary_key="id",
    embedding_dimension=1024,
    embedding_vector_column="text_vector",
    schema={
     "id": "int",
     "field2": "str",
     "field3": "float",
     "text_vector": "array<float>"}
)
```

# Vector Searchエンドポイントのクエリー

SDKを用いてのみVector Searchエンドポイントにクエリーを行うことができます。以下の例では以前のセクションで作成したDelta Sync Indexを使用しています。

```py
results = index.similarity_search(
  query_text="Greek myths",
  columns=["id", "text"],
  num_results=2
)

results
```

# その他のリソース

以下のノートブックでは、Vector Search Python SDKの使い方をデモンストレーションしています。

## Python SDKを用いたVector Searchのノートブック

https://docs.databricks.com/_extras/notebooks/source/generative-ai/vector-search-python-sdk-example.html

## エンべディングモデル呼び出しのサンプルノートブック

### Databricksモデルサービングを用いたAzure OpenAIエンべディング呼び出しのノートブック

https://docs.databricks.com/_extras/notebooks/source/generative-ai/embedding-with-azure-openai.html

### Databricksモデルサービングを用いたOpenAIエンべディング呼び出しのノートブック

https://docs.databricks.com/_extras/notebooks/source/generative-ai/embedding-with-openai.html

### OSSエンべディングモデルの登録およびサービングのノートブック

https://docs.databricks.com/_extras/notebooks/source/generative-ai/embedding-with-oss-models.html


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)