⛳

Databricks Apps + Vector Search + AI関数で作る「名言レコメンダー」(第1回:準備編)

に公開

はじめに

Databricksには、データパイプラインだけでなく、構築したデータを活用するためのアプリケーション基盤「Databricks Apps」が用意されています。

本シリーズでは、Databricks Appsを使ってTVドラマの名言をレコメンドするStreamlitアプリを構築します。ユーザーが「今日は疲れた」「励ましてほしい」などと入力すると、ベクトル検索で類似した名言を探し出し、さらにAI関数でその名言をおすすめする理由まで生成してくれるアプリです。

全4回の構成で進めていきます。

回 内容
第1回(本記事) 準備編:全体像とデータ・インデックスの準備
第2回 実装編:Streamlitアプリのコード解説
第3回 デプロイ編:Databricks Appsへのデプロイ
第4回 発展編:検索タイプの比較とUI改善Tips

今回作るもの

完成イメージはこちらです。

  • ユーザーが気分やキーワードを入力
  • Vector Searchで類似する名言を検索
  • 「理由を生成」ボタンでAI関数が「なぜこの名言がおすすめか」を説明
┌─────────────────────────────────────────────┐
│  📺 Quote Recommender                        │
├─────────────────────────────────────────────┤
│  入力: [今日は疲れた...          ] [検索]   │
├─────────────────────────────────────────────┤
│  💬 "Tomorrow is another day."               │
│     📺 Gone with the Wind - S1E1             │
│     [Generate Reason]                        │
│     → When you're exhausted, remember that   │
│       tomorrow brings new hope...            │
└─────────────────────────────────────────────┘

使用する技術・機能

機能 用途
Databricks Apps Streamlitアプリのホスティング
Mosaic AI Vector Search 名言の類似検索
Databricks AI関数(ai_gen) おすすめ理由の動的生成
Databricks Asset Bundles デプロイ管理
SQL Warehouse AI関数の実行基盤

前提条件

  • Databricks Free Editionを使用(無料で試せます)
  • Vector Search エンドポイントが作成済み(または作成権限があること)

1. ソースデータの準備

まず、名言データを格納するテーブルを作成します。今回はmedia.tv_seriesというカタログ・スキーマ構成を想定しています。

1.1 カタログ・スキーマの作成

-- カタログの作成(既存の場合はスキップ)
CREATE CATALOG IF NOT EXISTS media;

-- スキーマの作成
CREATE SCHEMA IF NOT EXISTS media.tv_series;

1.2 名言テーブルの作成

Vector Searchのソースとなるテーブルを作成します。

CREATE TABLE IF NOT EXISTS media.tv_series.quotes_vs_source (
  quote_id STRING NOT NULL,          -- 名言の一意識別子
  series_name STRING,                -- ドラマ名
  season INT,                        -- シーズン番号
  episode INT,                       -- エピソード番号
  episode_name STRING,               -- エピソードタイトル
  quote STRING,                      -- 名言本文
  helpful INT DEFAULT 0,             -- いいね数(フィルタ用)
  quote_embedding ARRAY<FLOAT>       -- エンベディングベクトル(自動生成も可)
)
USING DELTA
TBLPROPERTIES (
  'delta.enableChangeDataFeed' = 'true'  -- Vector Search同期に必要
);

ポイント:

  • quote_idは各名言を一意に識別するために必須です
  • helpful列はユーザーからのいいね数を表し、Vector Searchのフィルタ機能で「人気の名言のみ検索」などの絞り込みに活用できます
  • delta.enableChangeDataFeedを有効にすることで、Vector Searchとの差分同期が可能になります

1.3 サンプルデータの投入

テスト用にいくつかサンプルデータを入れておきましょう。

Note: 本シリーズで使用する名言データは既にテーブルにロード済みです。以下はテーブル構造の参考としてご確認ください。

INSERT INTO media.tv_series.quotes_vs_source
  (quote_id, series_name, season, episode, episode_name, quote, helpful)
VALUES
  ('q001', 'ブレイキング・バッド', 1, 1, 'Pilot',
   'I am the one who knocks.', 100),
  ('q002', 'フレンズ', 1, 1, 'The Pilot',
   'Welcome to the real world. It sucks. You''re gonna love it.', 85),
  ('q003', 'ゲーム・オブ・スローンズ', 1, 1, 'Winter Is Coming',
   'Winter is coming.', 95),
  ('q004', 'ストレンジャー・シングス', 1, 1, 'Chapter One',
   'Friends don''t lie.', 80),
  ('q005', 'THE OFFICE', 1, 1, 'Pilot',
   'That''s what she said.', 70);

2. Vector Search インデックスの作成

2.1 Vector Search エンドポイントの確認

Vector Searchを利用するには、まずエンドポイントが必要です。
ワークスペースの「コンピュート」→「Vector Search」から確認・作成できます。

既存のエンドポイントがない場合は、UIから以下の手順で作成します:

  1. ワークスペースの「コンピュート」→「Vector Search」を開く
  2. 「Create」ボタンをクリック
  3. エンドポイント名(例:quote_search_endpoint)を入力
  4. 「Confirm」をクリック

作成には数分かかります。ステータスが「Online」になれば準備完了です。

2.2 インデックスの作成

ソーステーブルに対してVector Searchインデックスを作成します。
今回はManaged Embeddingsを使用し、Databricks側でエンベディングを自動生成させます。

UIからの作成手順:

  1. 「カタログ」→ media.tv_series.quotes_vs_source テーブルを開く
  2. 「Create」→「Vector search index」を選択
  3. 以下の設定を入力:
設定項目 値
Name quotes_index
Primary key quote_id
Endpoint quote_search_endpoint
Columns to sync 必要な列を選択(quote, series_name, helpful など)
Embedding source quote
Embedding model databricks-gte-large-en
Sync mode Triggered
  1. 「Create」をクリック

Sync mode(pipeline_type)の選び方:

タイプ ユースケース
Triggered バッチ更新向け。データ更新頻度が低い場合や、コストを抑えたい場合に最適
Continuous リアルタイム更新向け。データが頻繁に追加・更新され、即座に検索可能にしたい場合

今回は名言データの更新頻度が低いため、Triggeredを採用しています。

2.3 インデックスの同期

Triggeredパイプラインの場合、データ追加後に手動で同期を実行します。

UIからの同期手順:

  1. 「カタログ」→ media.tv_series.quotes_index インデックスを開く
  2. 右上の「Sync」ボタンをクリック

同期状況は同じ画面で確認できます。ステータスが「Online」になれば同期完了です。

3. SQL Warehouse の準備

AI関数(ai_gen)を実行するために、SQL Warehouseが必要です。

3.1 Warehouse IDの確認

既存のSQL Warehouseを使用する場合、Warehouse IDを確認しておきます。

Note: Databricks Free Editionでは新規でウェアハウスを作成することはできません。デフォルトで用意されているサーバレスウェアハウス(Starter Warehouse)を使用します。

UIから確認する方法:

  1. ワークスペースの「SQL Warehouses」を開く
  2. 対象のWarehouse(Starter Warehouse)を選択
  3. 「接続の詳細」タブでHTTP Pathを確認
  4. /sql/1.0/warehouses/XXXXXXXXXXXXXXXXのXXXXXXXXXXXXXXXX部分がWarehouse ID

3.2 AI関数の動作確認

Warehouse上でAI関数が使えることを確認しておきましょう。

SELECT ai_gen('こんにちは、と日本語で返答してください') AS response;

正常に応答が返れば準備完了です。

4. 動作確認:Vector Searchのテストクエリ

アプリ実装前に、Vector Searchが正しく動作するか確認しておきましょう。

SELECT *
FROM VECTOR_SEARCH(
  index => 'media.tv_series.quotes_index',
  query => 'I want to hear encouraging words when I am tired',
  num_results => 3
);

類似した名言が返ってくれば、準備は完了です。

まとめ

今回は、名言レコメンダーアプリを構築するための準備として以下を行いました。

  • ソースデータ用テーブルの作成
  • Vector Searchインデックスの作成と同期
  • SQL Warehouseの準備とAI関数の確認

次回は、いよいよStreamlitアプリの実装に入ります。Vector Search APIの呼び出し方や、AI関数を使った理由生成の仕組みを詳しく解説します。

参考リンク


次回:[第2回 実装編:Streamlitアプリのコード解説](リンク)

Discussion