Databricks Certified Generative AI Engineer Associate 教科書
第3章 アプリケーション開発(Application Development, 30%)
🎯 この節の学習目標
similarity_search による検索(フィルタ・ハイブリッド検索を含む)と、LangChain の retriever としての利用方法を説明できるDatabricks AI Search(旧 Vector Search)は、Databricks が提供するマネージドなベクトル検索サービスです。かつては「Vector Search」という名称でしたが、現在は「AI Search」に改名されており、エンドポイント+インデックスという構成や主要機能はそのまま引き継がれています(本書では以降「AI Search」と表記します)。3-2 で埋め込んだチャンクを格納し、クエリベクトルとの類似検索を高速に実行します。構成要素は2つに分かれており、この区別が試験でも問われます。
試験問題では旧称の Vector Search のまま出題される可能性があります。Delta Sync Index・Direct Vector Access Index という用語や、旧SDK databricks-vectorsearch(VectorSearchClient)を前提とした選択肢が出てきても、本節の内容がそのまま対応します。
製品名は Databricks AI Search に改名され、Python SDK も databricks-ai-search(import は databricks.ai_search 配下)が正式になりました。旧パッケージは非推奨のシム(旧名のまま新実装を呼び出す互換層)として残り、DeprecationWarning を出しつつ動作します。インデックスの種類・同期モード・検索APIなどの概念は従来どおりです。
| 構成要素 | 正体 | 役割 |
|---|---|---|
| AI Search エンドポイント | 検索を実行する計算資源 | インデックスをホストし、検索リクエストを処理する。1つのエンドポイントで複数のインデックスをホストできる |
| AI Search インデックス | Unity Catalog 配下のオブジェクト(カタログ.スキーマ.インデックス名) | ベクトルとメタデータの格納体。UC のアクセス制御・ガバナンスの対象になる |
インデックスが Unity Catalog 配下にあることで、テーブルと同じように権限管理・監査ができます(ガバナンスは第6章で詳述)。
インデックスへのデータの入れ方には2方式あります。
ソースとなる Delta テーブルを指定すると、その内容がインデックスへ自動的に同期される方式です。ソーステーブルには Change Data Feed(CDF)の有効化が必要で、テーブルへの追加・更新・削除が差分としてインデックスに反映されます。さらに、埋め込みの計算を誰が行うかで2通りに分かれます。
| 埋め込みの管理 | 仕組み | 指定するもの |
|---|---|---|
| マネージド埋め込み | Databricks がテキスト列から埋め込みを自動計算。クエリ時の埋め込みも同じモデルで自動計算される | テキスト列名と embedding_model_endpoint_name(例:databricks-gte-large-en) |
| 自己管理埋め込み | 自分で計算した埋め込みベクトル列を Delta テーブルに持たせ、それを同期する | 埋め込みベクトル列名と次元数 |
マネージド埋め込みは、3-2 で学んだ「インデックスとクエリで同じモデルを使う」原則を仕組みとして保証してくれる点が大きな利点です。
ソーステーブルを持たず、API 経由でベクトルとメタデータを直接 upsert / delete する方式です。自動同期はなく、データの更新管理はすべてアプリケーション側の責任になります。既存のパイプラインで埋め込みを管理していて、書き込みタイミングを完全に制御したい場合に使います。
📝 試験のポイント
試験で問われやすい典型パターン:「ソースの Delta テーブルが更新されたら、検索インデックスにも自動で反映されるようにしたい」→ 正解は「Change Data Feed を有効化した Delta テーブルを Delta Sync Index のソースにする」です。Direct Vector Access Index は自動同期しないため、この要件では誤答になります。逆に「同期を自前で完全制御したい」なら Direct Vector Access が正解側に回ります。
Delta Sync Index の同期タイミングは2モードから選びます。
💡 具体例:マネージド埋め込みの Delta Sync Index を作成する
# 新SDK:databricks-ai-search パッケージ(import は databricks.ai_search 配下)
from databricks.ai_search.client import AISearchClient
# 旧: from databricks.vector_search.client import VectorSearchClient
# (旧パッケージ databricks-vectorsearch は非推奨のシムとして残り、
# DeprecationWarning を出しつつ同じ機能を提供する)
client = AISearchClient()
index = client.create_delta_sync_index(
endpoint_name="my_vs_endpoint",
index_name="main.rag.docs_index", # UC配下の3階層名
source_table_name="main.rag.docs_chunks", # CDF有効のDeltaテーブル
pipeline_type="TRIGGERED", # または CONTINUOUS
primary_key="chunk_id",
embedding_source_column="chunk_text", # テキスト列
embedding_model_endpoint_name="databricks-gte-large-en",
)
ソーステーブル側では、あらかじめ ALTER TABLE ... SET TBLPROPERTIES (delta.enableChangeDataFeed = true) のように Change Data Feed を有効化しておく必要があります。自己管理埋め込みの場合は、embedding_source_column とモデル指定の代わりに、埋め込みベクトル列名と次元数を指定します。
作成したインデックスに対しては、similarity_search で検索します。
results = index.similarity_search(
query_text="返品の手続きを教えて", # マネージド埋め込みならテキストでOK
columns=["chunk_id", "chunk_text", "source"], # 返してほしい列
num_results=5, # 上位k件
filters={"category": "customer_support"}, # メタデータで絞り込み
)
query_text — マネージド埋め込みでは質問テキストをそのまま渡せる(埋め込みは自動計算)。自己管理埋め込みでは自分でクエリをベクトル化して query_vector で渡すcolumns — 結果として返すメタデータ列。3-4 で出典表示に使うため、ソース名などを含めておくnum_results — 取得する上位 k 件。top-k の調整は 3-4・3-5 で扱うfilters — メタデータによる事前絞り込み。2-6 で設計したメタデータがここで効く(例:部署・年度・言語で絞る)また、ベクトル類似検索にキーワード一致の要素を組み合わせるハイブリッド検索もサポートされています。製品型番や固有名詞のように「字面の一致が重要」なクエリでは、純粋なベクトル検索よりもハイブリッド検索が有効な場面があります。
ここまでの部品を組み合わせると、RAG の検索パイプラインは次の流れになります。
図:AI Search を使った RAG 検索パイプラインの全体像
3-1 の RAG チェーンに AI Search を組み込むには、databricks-langchain の DatabricksVectorSearch を使います。
from databricks_langchain import DatabricksVectorSearch
vector_store = DatabricksVectorSearch(
index_name="main.rag.docs_index",
columns=["chunk_text", "source"],
)
retriever = vector_store.as_retriever(search_kwargs={"k": 5})
# 3-1 で学んだ RAG チェーンの骨格にそのまま差し込める
# rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | parser
as_retriever() で LangChain 標準の retriever インターフェースになるため、チェーンの他の部分を変えずに検索段だけを AI Search に差し替えられます。検索結果をどうプロンプトに組み込むかは、次の 3-4 のテーマです。
✅ この節のまとめ
databricks-ai-search が正式で、旧パッケージは非推奨のシムとして残る。概念・機能は旧称時代と同じ。embedding_model_endpoint_name を指定して Databricks が計算)か自己管理(自前の埋め込み列を同期)を選べる。similarity_search(query_text=..., columns=[...], num_results=k, filters=...)。ハイブリッド検索やメタデータフィルタも使える。LangChain からは DatabricksVectorSearch を retriever として接続する。問1. ナレッジベースの Delta テーブルは毎日更新される。テーブルの変更を AI Search インデックスへ自動的に反映させたい。最も適切な構成はどれか。
正解:B
「ソース Delta テーブルの変更を自動反映」という要件は Delta Sync Index の典型ユースケースで、前提として CDF の有効化が必要です。Aは自動同期がなく手動運用になるため要件を満たしません。Cは全再構築のコストが無駄に大きく、Dは Delta テーブル単体では類似(ベクトル)検索を提供できません。
問2. マネージド埋め込み(managed embeddings)の Delta Sync Index の説明として正しいものはどれか。
正解:B
マネージド埋め込みでは embedding_source_column(テキスト列)と embedding_model_endpoint_name を指定し、埋め込み計算は Databricks 側が行います。クエリ時も同じモデルが自動で使われるため、モデル不一致の事故を防げます。Aは自己管理埋め込みの説明、Dは Direct Vector Access Index の説明です。
問3. AI Search の「エンドポイント」と「インデックス」の関係として正しいものはどれか。
正解:A
エンドポイント=計算資源、インデックス=UC配下のデータオブジェクト、という役割分担です。Cは両者の役割が逆です。1つのエンドポイントは複数のインデックスをホストできるため、Dも誤りです。インデックスが UC 配下にあることで、権限管理やガバナンスをテーブルと同様に適用できます。
問4. 社内文書の検索で「経理部の文書だけを対象に、質問に意味的に近いチャンクを上位5件取得したい」。similarity_search の使い方として最も適切なのはどれか。
num_results=5 を指定し、部署の絞り込みは検索後にLLMに任せるquery_text に「経理部」と入力して検索するquery_text に質問文、num_results=5、filters に部署=経理部のメタデータ条件を指定する正解:C
「特定属性での絞り込み」はメタデータの filters、「意味的に近い上位k件」は query_text + num_results の役割です。Aは無関係な部署のチャンクが上位5件を占めるおそれがあり、絞り込みを後段に回すのは非効率かつ不確実です。Bは部署名との類似検索になってしまい、質問内容との類似性が失われます。Dは過剰で、メタデータ設計(2-6)で解決できる問題です。
問5. Databricks のベクトル検索サービスの名称に関する説明として正しいものはどれか。
正解:B
AI Search は Vector Search の改名後の名称であり、別製品ではありません(Aは誤り)。インデックスの2タイプや同期モードなどの概念・機能は改名後も同じです(Cは誤り)。旧パッケージは非推奨のシムとして残り、DeprecationWarning を出しつつ動作するため、即時削除というDも誤りです。試験では旧称のまま出題される可能性があるため、「AI Search(旧 Vector Search)」という対応関係を押さえておきましょう。