【Snowflake】Cortex Searchの使い方
はじめに
SnowflakeのCortex Searchについて、RAGにおける役割から具体的な使い方をお伝えします。
Cortex Searchとは?
参考:Snowflake DOCUMENTATION Cortex Search for RAG
Cortex Searchは、非構造化データ(テキスト、ドキュメント、FAQなど)を対象とした自然言語検索サービスです。RAG(Retrieval Augmented Generation)という技術をベースにしており、「〜について説明して」「〜の資料を教えて」といった、人間が話すような自然な言葉で質問できます。
Snowflake上で完結するため、データの移動や複雑なインフラ構築は不要。これにより、社内マニュアルや契約書、顧客サポートのFAQといった様々なユースケースで、効率的な情報検索・要約が可能になります。
Cortex SearchはRAGのどの部分を担うのか?
Cortex Searchは、RAG(Retrieval-Augmented Generation)の構築プロセスにおいて、特に 「Retrieval(検索)」 フェーズを担う機能です。
RAGの一般的な構築プロセス
RAGは通常、以下の3つの主要なステップで構成されます。
- データの準備フェーズ (Preprocessing)
このステップでは、RAGシステムに知識ベースを「学習」させるための準備をします。
プロセス | 説明 |
---|---|
ドキュメントのチャンキング | ドキュメント全体を、AIモデルが扱いやすい 意味のある小さな塊(チャンク) に分割する。 |
ベクトル埋め込み | チャンク化されたテキストを、埋め込みモデルを使って意味を表現する数値の配列(ベクトル)に変換する。 |
インデックス作成と格納 | 生成されたベクトルを、高速な類似度検索に特化したベクトルデータベースに格納する。 |
- 検索フェーズ (Retrieval)
これはユーザーが質問を投げかけたときに実行されるフェーズです。
プロセス | 説明 |
---|---|
ユーザーの質問をベクトル化 | ユーザーからの質問を、AIが理解できる数値の配列(ベクトル)に変換する。 |
類似度計算と検索 | 質問のベクトルと、あらかじめ格納されているドキュメントのチャンクのベクトルとの類似度を計算し、関連性の高いチャンクを取り出す。 |
- 生成フェーズ (Generation)
検索結果を元に最終的な回答を生成するフェーズです。
プロセス | 説明 |
---|---|
回答生成 | 検索で取得した関連性の高い情報(コンテキスト)とユーザーの元の質問をLLMに渡し、その情報をもとに、より正確でハルシネーション(AIが事実ではない情報を生成すること)の少ない回答を生成する。 |
Cortex Searchは、この一連の流れの中でも特に 「ベクトル埋め込み」と「類似度検索」という、RAGのコアとなる技術部分 をSnowflakeネイティブで担います。これにより、ユーザーは煩雑なベクトル化やインデックス管理、ベクトルデータベースの運用を意識することなく、検索機能を利用することが可能です。
設定のポイント
- テーブルの準備
Cortex Search Serviceを作成する前に、検索対象となるデータを持つテーブルを用意します。このテーブルには、以下の2種類のカラムを含める必要があります。
カラムの種類 | 説明 |
---|---|
ベクトル化するカラム(複数不可) | 検索クエリとドキュメントの内容の関連性を計算するために使用。CORTEX SEARCH SERVICEの作成時の「ON」句で指定するカラム。複数のカラムの内容を検索対象としたい場合は、事前にそれらを結合した1つのカラムを準備する必要がある。 |
検索で利用するカラム(複数可) | 検索結果として表示したい情報(例:ドキュメント名、ページ番号、カテゴリなど)を格納するカラム。これらのカラムは、検索結果のフィルタリング条件としても利用可能。 |
- Cortex Search Serviceの設定
CREATE OR REPLACE CORTEX SEARCH SERVICEコマンドを使ってサービスを作成します。この際、以下のパラメータを設定します。
CREATE OR REPLACE CORTEX SEARCH SERVICE transcript_search_service
ON transcript_text
ATTRIBUTES region
WAREHOUSE = cortex_search_wh
TARGET_LAG = '1 day'
EMBEDDING_MODEL = 'snowflake-arctic-embed-l-v2.0'
AS (
SELECT
transcript_text,
region,
agent_id
FROM support_transcripts
);
参考:Snowflake DOCUMENTATION Create the service
設定項目 | 説明 |
---|---|
ON | ベクトル化するカラムを指定する。 |
ATTRIBUTES | 検索結果をフィルタリングする際に利用するカラムを指定する。特定の条件(例:部署、日付など)で検索結果を絞り込むことができ、精度が向上する |
WAREHOUSE | Cortex Search Serviceの作成時と検索時に利用するウェアハウスを指定する。 |
TARGET_LAG | インデックスの更新頻度を指定する。データの更新頻度に合わせて調整することで、常に最新の情報を検索対象にすることが可能。 |
EMBEDDING_MODEL | テキストをベクトルに変換するための埋め込みモデルを選択する。日本語での検索には「snowflake-arctic-embed-l-v2.0-8k」などがおすすめ。 |
Streamlitでの構築例
Cortex Searchは、Streamlitと組み合わせることで、ユーザーフレンドリーなチャットボットを簡単に構築できます。基本的な手順は以下の通りです。
ステップ1: 検索
ユーザーの入力(prompt)を受け取ったら、search_service.search()メソッドを呼び出して検索を実行します。このとき、filterパラメータを活用すると、特定の条件で検索結果を絞り込め、パフォーマンスが向上します。
search_results = search_service.search(
query=prompt,
columns=["TEXT", "PAGE_NUM"],
filter={"@eq": {"region": "North America"}}, # フィルタリングの例
limit=5
)
ステップ2: 回答生成
検索結果(関連性の高いドキュメントの「チャンク」)をコンテキストとして使用し、AIモデルに回答を生成させます。これにより、モデルは手元の情報だけに基づいて回答を生成できるため、ハルシネーション(嘘の情報生成)のリスクを減らせます。
# AIモデルを呼び出す関数
def call_cortex_ai_model(model_name, prompt, context):
prompt_text = f"""
あなたは、○○のエキスパートです。
提供されたコンテキストを参考にしながらユーザーからの質問に対して日本語で丁寧に回答してください。
情報がない場合は、その旨を伝えつつ可能な限り適切な回答をしてください。
Context: {context}
Question: {prompt}
Answer:
"""
response = CompleteText(model_name, prompt_text)
return response
# 回答生成
response = call_cortex_ai_model(model, full_prompt, context)
注意点
- 日本語カラム名利用不可: 執筆時点では、CORTEX SEARCH SERVICEの作成時に日本語のカラム名が利用できない可能性があります。アルファベットを使用しましょう。
参考
Snowflake DOCUMENTATION Cortex Search
おわりに
今回は、SnowflakeのCortex Searchについて、RAGにおける役割から具体的な使い方についてお届けしました。
社内のドキュメント検索やナレッジベースの活用などにお悩みの方のヒントになれば幸いです。