Snowflake Cortex Searchは、キーワード検索とセマンティック検索を融合したハイブリッド検索をマネージドサービスとして提供します。 エンベディング生成・インデックス構築・スコア融合がすべて自動化されており、ユーザーはCREATE CORTEX SEARCH SERVICEでサービスを定義するだけで、 高品質な検索機能をアプリケーションに組み込めます。 RAG(Retrieval-Augmented Generation)のリトリーバとして利用することで、Cortex LLM関数と組み合わせた社内ドキュメントQAシステムを構築できます。
Cortex Searchが採用するハイブリッド検索は、2つの検索手法を内部的に組み合わせています。
| 検索方式 | 手法 | 強み | 弱み |
|---|---|---|---|
| キーワード検索(スパース) | BM25ベースの転置インデックス | 完全一致・固有名詞に強い | 同義語・言い換えに弱い |
| セマンティック検索(デンス) | ベクトル埋め込み+近似近傍探索 | 意味的類似に強い | 固有名詞・型番の正確性に弱い |
| ハイブリッド(Cortex Search) | 両方のスコアを融合 | 正確性と意味理解の両立 | インデックス構築コスト |
検索フロー:
[ユーザークエリ: "Snowflakeのデータ保護機能"]
│
├──→ キーワード検索 ──→ BM25スコア
│ └─ "Snowflake", "データ", "保護" で転置インデックスを走査
│
├──→ セマンティック検索 ──→ ベクトル類似度スコア
│ └─ クエリをエンベディング化 → 近似近傍探索
│
└──→ スコア融合(Reciprocal Rank Fusion)
└─ 最終ランキング結果を返却Cortex Searchサービスの作成はDDLで行います。ソーステーブル・検索対象カラム・フィルタカラム・更新頻度を指定します。
CREATE OR REPLACE CORTEX SEARCH SERVICE knowledge_base_search
ON doc_content -- 検索対象のテキストカラム
ATTRIBUTES doc_title, category -- フィルタ用カラム(任意)
WAREHOUSE = search_wh -- インデックス構築用WH
TARGET_LAG = '1 hour' -- ソースデータの反映遅延
AS (
SELECT
doc_id,
doc_title,
doc_content,
category,
updated_at
FROM knowledge_base
WHERE is_published = TRUE
);| パラメータ | 説明 | 必須 |
|---|---|---|
| ON | 全文検索・セマンティック検索の対象テキストカラム | はい |
| ATTRIBUTES | メタデータフィルタリング用カラム(WHERE条件で利用) | いいえ |
| WAREHOUSE | インデックス構築に使用するウェアハウス | はい |
| TARGET_LAG | ソーステーブルの変更がインデックスに反映されるまでの最大遅延 | はい |
作成したCortex Searchサービスへのクエリは、Python SDK(推奨)またはREST APIで実行します。
# Python SDKでの検索
from snowflake.core import Root
root = Root(session)
search_service = (
root.databases["MY_DB"]
.schemas["PUBLIC"]
.cortex_search_services["KNOWLEDGE_BASE_SEARCH"]
)
results = search_service.search(
query="Snowflakeのタイムトラベル機能について",
columns=["doc_id", "doc_title", "doc_content", "category"],
filter={
"@eq": {"category": "data_protection"}
},
limit=5
)
for result in results.results:
print(f"Title: {result['doc_title']}")
print(f"Score: {result['search_score']}")
print(f"Content: {result['doc_content'][:200]}...")
print("---")ATTRIBUTESで指定したカラムに対して、以下のフィルタ演算子が使えます。
# 完全一致
{"@eq": {"category": "security"}}
# OR条件(複数値)
{"@or": [
{"@eq": {"category": "security"}},
{"@eq": {"category": "governance"}}
]}
# AND条件
{"@and": [
{"@eq": {"category": "security"}},
{"@eq": {"doc_type": "guide"}}
]}Cortex SearchをリトリーバとしてCortex LLM関数と組み合わせることで、 社内ナレッジに基づいたRAGパイプラインを構築できます。
RAGパイプライン構成:
[ユーザー質問]
│
▼
[Cortex Search] ← リトリーバ
│ 関連ドキュメント Top-K を取得
▼
[プロンプト構築]
│ "以下のコンテキストに基づいて回答してください:
│ {検索結果のdoc_content}"
▼
[SNOWFLAKE.CORTEX.COMPLETE()] ← ジェネレータ
│ コンテキスト付きで回答を生成
▼
[回答をユーザーに返却]# RAGパイプラインの実装例(Streamlit in Snowflake)
import streamlit as st
from snowflake.core import Root
from snowflake.snowpark.context import get_active_session
session = get_active_session()
root = Root(session)
search_service = (
root.databases["KB_DB"]
.schemas["PUBLIC"]
.cortex_search_services["KB_SEARCH"]
)
user_question = st.text_input("質問を入力してください")
if user_question:
# Step 1: Cortex Searchで関連ドキュメント取得
results = search_service.search(
query=user_question,
columns=["doc_content"],
limit=3
)
context = "\n\n".join([r["doc_content"] for r in results.results])
# Step 2: COMPLETE関数で回答生成
prompt = f"""以下のコンテキストのみに基づいて質問に回答してください。
コンテキストに情報がない場合は「情報が見つかりませんでした」と回答してください。
コンテキスト:
{context}
質問: {user_question}"""
answer = session.sql(
"SELECT SNOWFLAKE.CORTEX.COMPLETE('llama3.1-70b', ?)",
params=[prompt]
).collect()[0][0]
st.write(answer)| 手法 | 検索方式 | エンベディング管理 | 適したユースケース |
|---|---|---|---|
| Cortex Search | ハイブリッド(自動) | 自動 | RAGリトリーバ・ドキュメント検索 |
| VECTOR型 + 距離関数 | セマンティックのみ | 手動管理 | カスタムエンベディング・画像検索 |
| SEARCH OPTIMIZATION | キーワードのみ(点検索最適化) | 不要 | 等値検索・LIKE検索の高速化 |
Cortex Search
問題 1
Cortex Searchサービスを作成するSQL文で、ソーステーブルの変更が検索インデックスに反映されるまでの最大遅延を制御するパラメータはどれか?
正解: B
CREATE CORTEX SEARCH SERVICEのTARGET_LAGパラメータは、ソーステーブルの変更がインデックスに反映されるまでの最大遅延を指定します。例えば '1 hour' を指定すると、最大1時間以内に変更が反映されます。A/C/DはCortex Searchの実在するパラメータではありません。
Cortex Searchのハイブリッド検索とは何ですか?
ハイブリッド検索は、従来のキーワードマッチング(BM25等のスパース検索)とベクトルベースのセマンティック検索(密ベクトル検索)を組み合わせた手法です。Cortex Searchでは両方のスコアを内部的に融合し、キーワードの正確性と意味的な関連性の両方を考慮した検索結果を返します。ユーザーがスコア融合の重み付けを意識する必要はありません。
Cortex SearchとVector Searchの違いは何ですか?
Cortex Searchはテキストデータのハイブリッド検索に特化したマネージドサービスで、インデックス構築・エンベディング生成・スコア融合がすべて自動化されています。一方、Snowflakeの VECTOR データ型やVECTOR_L2_DISTANCE等のベクトル関数は、ユーザー自身がエンベディングを生成・格納し、類似度計算を自分で記述する低レベルAPIです。RAGのリトリーバとしてはCortex Searchの方が構築が容易です。
Cortex Searchのデータ更新はどのタイミングで反映されますか?
CREATE CORTEX SEARCH SERVICEでTARGET_LAGパラメータを設定します。例えば '1 hour' を指定すると、ソーステーブルの変更が最大1時間以内に検索インデックスに反映されます。TARGET_LAGを短くするほどリアルタイム性は上がりますが、サーバーレスクレジットの消費量も増加します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...