Cortex Search サービスを Snowflake Intelligence 経由でツールとして使用するまでの手順を試してみた

Cortex Search サービスを Snowflake Intelligence 経由でツールとして使用するまでの手順を試してみた

2026.01.06

はじめに

Snowflake における RAG 関連の機能である Cortex Search について個人的に理解を深めたく試してみましたので、その内容を記事としました。本機能については他にも記事になっているのでこちらもあわせてご参照ください。

https://dev.classmethod.jp/articles/snowflake-try-cortex-search/

https://dev.classmethod.jp/articles/review-introduction-snowflake-cortex-search/

本記事で検証すること

本記事では以下を行います。

  • Cortex Search サービスを作成
    • 各種オブジェクトの作成
    • ドキュメントの配置
    • Cortex Search サービスで参照するテーブルの作成(ドキュメントのチャンク化)
  • Cortex Agent から問い合わせ
  • Snowflake Intelligence 経由で問い合わせ

前提条件

以下の環境で検証しています。

  • Snowflake トライアルアカウント
    • クラウドリージョン:アジア太平洋 (東京)

Cross Region 推論の有効化

後の工程で、Cortex Agents から問い合わせを行います。

執筆時点で、Cortex Agents ではこちらに記載のモデルを使用できます。現在、このモデルは国内の Snowflake アカウントでは利用できないため、アカウントでクロスリージョン推論を有効化します。これにより、推論リクエストを現在のアカウントのクラウドリージョンとは異なるリージョンで処理できるようになります。

この設定には ACCOUNTADMIN での作業が必要です。

USE ROLE ACCOUNTADMIN;
ALTER ACCOUNT SET CORTEX_ENABLED_CROSS_REGION = 'AWS_US';

注意点として、送信元と宛先の両方のリージョンが AWS にある場合、データは AWS グローバルネットワーク 内に留まり、パブリック インターネットを横断することはありませんが、異なるクラウドプロバイダー上にある場合、データは相互 TLS 認証を使用した上で、パブリック インターネットを横断します。

https://docs.snowflake.com/ja/user-guide/snowflake-cortex/cross-region-inference

各種オブジェクトの作成

上記の各種オブジェクトの作成のための準備として、以下のオブジェクトを作成します。

  • データベース・スキーマ
    • Cortex Search サービス、Cortex Agentなどはスキーマレベルのオブジェクトとなるため、作成先となるデータベース・スキーマを用意します
  • あわせてドキュメントの配置先となる内部ステージ、本機能で使用する仮想ウェアハウスも作成します
USE ROLE SYSADMIN;

-- cortex searchサービスなどの作成先となるデータベースを作成
CREATE DATABASE IF NOT EXISTS cortex_db;

-- cortex_searchサービス作成先となるスキーマを作成
CREATE SCHEMA IF NOT EXISTS cortex_db.cortex_search_services;

-- ドキュメントの配置先となる内部ステージ、テーブルの作成先となるスキーマを作成
CREATE SCHEMA IF NOT EXISTS cortex_db.data;

-- cortex agentsの作成先となるスキーマを作成
CREATE SCHEMA IF NOT EXISTS cortex_db.cortex_agents;

-- オプション:仮想ウェアハウスを作成
CREATE OR REPLACE WAREHOUSE cortex_wh WITH
     WAREHOUSE_SIZE='X-SMALL'
     AUTO_SUSPEND = 120
     AUTO_RESUME = TRUE
     INITIALLY_SUSPENDED=TRUE;

アクセス制御:ロールの作成

スキーマまではSYSADMINで作成し、以降のオブジェクトは専用のロールで作成しました。まずは Cortex Search サービス作成用のロールを作成し、以下の通り各種権限を付与しました。

-- 作業用のロールを作成
USE ROLE USERADMIN;
CREATE ROLE IF NOT EXISTS cortex_search_role;

-- 権限付与
USE ROLE SECURITYADMIN;

-- 親データベーススキーマの使用権限
GRANT USAGE ON DATABASE cortex_db TO ROLE cortex_search_role;
GRANT USAGE ON SCHEMA cortex_db.cortex_search_services TO ROLE cortex_search_role;
GRANT USAGE ON SCHEMA cortex_db.data TO ROLE cortex_search_role;

-- ウェアハウス権限
GRANT USAGE, MONITOR, OPERATE ON WAREHOUSE cortex_wh TO ROLE cortex_search_role;

-- ステージ作成権限
GRANT CREATE STAGE ON SCHEMA cortex_db.data TO ROLE cortex_search_role;

-- テーブル作成権限
GRANT CREATE TABLE ON SCHEMA cortex_db.data TO ROLE cortex_search_role;

-- Cotex Search Serviceの作成権限
GRANT CREATE CORTEX SEARCH SERVICE ON SCHEMA cortex_db.cortex_search_services TO ROLE cortex_search_role;

-- ロール継承
GRANT ROLE cortex_search_role TO ROLE SYSADMIN;

内部ステージの作成

Cortex Search 用のロールに切り替え、指定のスキーマにドキュメントの配置先となるステージを作成します。

-- ロールを切り替え
USE ROLE cortex_search_role;

-- コンテキストを指定
USE SCHEMA cortex_db.data;

-- ドキュメントの配置先となるステージを作成
CREATE OR REPLACE STAGE cortex_db.data.documents
    DIRECTORY = (ENABLE = TRUE)
    ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');

ドキュメントの配置

サンプルとして、以下の各ブログ記事を PDF 化したものを使用しました。

2025年12月にリリースされたSnowflakeの新機能・変更点のまとめ #SnowflakeDB|DevelopersIO
2025年11月にリリースされたSnowflakeの新機能・変更点のまとめ #SnowflakeDB|DevelopersIO
2025年10月にリリースされたSnowflakeの新機能・変更点のまとめ #SnowflakeDB|DevelopersIO
2025年9月にリリースされたSnowflakeの新機能・変更点のまとめ #SnowflakeDB|DevelopersIO
2025年8月にリリースされたSnowflakeの新機能・変更点のまとめ #SnowflakeDB|DevelopersIO

各ドキュメントを内部ステージに配置します。ここでは簡単に GUI から、配置しました

image

ドキュメントからの情報抽出

以降の手順でドキュメントから情報を抽出します。こちらは以下の記事の内容を参考にさせていただいています。

https://www.snowflake.com/en/developers/guides/ask-questions-to-your-own-documents-with-snowflake-cortex-search/#pre-process-documents

情報抽出先のテーブルを作成

RAG での検索のために、ドキュメントから情報を抽出します。ここではテーブル(RAW_TEXT)を作成し、AI_PARSE_DOCUMENT 関数を使用し、ドキュメントからテキスト・レイアウト情報を抽出しています。{'mode': 'LAYOUT'}により、出力はマークダウン形式となります。

※本機能について、執筆時点では日本語に最適化はされていない点にご注意ください。

-- テーブルを作成
-- AI_PARSE_DOCUMENT関数を使用し、 PDFからテキストとレイアウト情報を抽出し、RAW_TEXTテーブルに格納
CREATE OR REPLACE TEMPORARY TABLE cortex_db.data.raw_text AS
WITH FILE_TABLE as (
  (SELECT 
        RELATIVE_PATH,
        SIZE,
        'https://app.snowflake.com/XXXXX/XXXXX/#/data/databases/CORTEX_DB/schemas/DATA/stage/DOCUMENTS' AS STAGE_URL,
        TO_FILE('@cortex_db.data.documents', RELATIVE_PATH) AS docs 
    FROM 
        DIRECTORY(@cortex_db.data.documents))
)
SELECT 
    RELATIVE_PATH,
    SIZE,
    STAGE_URL,
    TO_VARCHAR (
        SNOWFLAKE.CORTEX.AI_PARSE_DOCUMENT (
            docs,
            {'mode': 'LAYOUT'} ):content
        ) AS EXTRACTED_LAYOUT 
FROM 
    FILE_TABLE;

チャンクの作成

抽出したテキストデータをチャンクに分割します。LLM 使用時にはプロンプトのトークン数に制限もあるため「チャンク」としてテキストを分割します。

現在、Snowflake ではチャンク化のために以下の関数を使用できます。

ここでは SPLIT_TEXT_RECURSIVE_CHARACTER を使用し、以下のようにチャンク化したデータをテーブルとして作成します。

format としてmarkdownを指定することで、separatorsで指定の区切り文字の他、ヘッダー(見出し)、コードブロック、テーブル で分割されます。

-- チャンクテーブル
CREATE OR REPLACE TABLE chunks_table ( 
    RELATIVE_PATH VARCHAR, 
    SIZE NUMBER, 
    STAGE_URL VARCHAR, 
    CHUNK VARCHAR, 
    CHUNK_INDEX INT 
);

-- チャンク化したレコードを追加
INSERT INTO chunks_table (relative_path, size, stage_url,
                            chunk, chunk_index)

    SELECT relative_path, 
            size,
            stage_url, 
            c.value::TEXT as chunk,
            c.INDEX::INTEGER as chunk_index            
    FROM 
        raw_text,
        LATERAL FLATTEN( input => SNOWFLAKE.CORTEX.SPLIT_TEXT_RECURSIVE_CHARACTER (
              EXTRACTED_LAYOUT,
              'markdown',
              2000, -- ドキュメントを最大サイズ2000文字のチャンクに分割
              300, -- オーバーラップ
              ['\n\n', '\n', ' ', '']
           )) c;

-- テーブルを確認
SELECT * FROM chunks_table;

image 1

もう一方の SPLIT_TEXT_MARKDOWN_HEADER によるチャンク分割については、以下の記事で詳しく解説されていますので、詳細はこちらをご参照ください。

https://zenn.dev/snowflakejp/articles/028b164c7a1a7b

Cortex Search サービスの作成

抽出したドキュメント情報を対象とする Cortex Search サービスを作成します。

これにより、テキストのベクトル化、メンテナンス、パラメータの調整、インデックスの更新などを気にすることなく、RAG の構築・運用を行えます。

-- cortex search serviceを作成
USE SCHEMA cortex_db.cortex_search_services;

CREATE OR REPLACE CORTEX SEARCH SERVICE cortex_db.cortex_search_services.test_search_service
ON chunk
ATTRIBUTES relative_path
WAREHOUSE = cortex_wh
EMBEDDING_MODEL = 'voyage-multilingual-2'
TARGET_LAG = '1 day'
AS (
    SELECT chunk,
        chunk_index,
        relative_path,
        stage_url
    FROM cortex_db.data.chunks_table
);

-- 例:SQLでクエリ
SELECT PARSE_JSON(
  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
      'cortex_db.cortex_search_services.test_search_service',
      '{
         "query": "Snowpipeの価格体系変更について教えてください",
         "limit":10
      }'
  )
)['results'] as results;

主なオプションは以下の通りです。

  • ON
    • 実際に検索対象のテキストが含まれるカラム
  • ATTRIBUTES
    • サービスにクエリを発行する際にフィルタリングしたいベーステーブルの列のリストをカンマ区切りのリストで指定
    • ここで指定のカラムはクエリに含めること
  • EMBEDDING_MODEL
    • デフォルトはSnowflake-arctic-embed-m-v1.5
    • ここでは多言語対応のvoyage-multilingual-2を指定

属性でのフィルタについては、以下の記事が参考になります。
Cortex Search によるテキスト本文(非構造化データ)の全文検索を行いつつ、ATTRIBUTES 列で指定のカラムで絞り込みも可能とできる設定です。これにより、同じキーワードでも対象としたい情報だけでの検索などが可能になります。

https://medium.com/snowflake/making-the-most-of-filters-in-snowflake-cortex-search-1d4c03b05ed3

https://docs.snowflake.com/en/sql-reference/sql/create-cortex-search

Cortex Agents の作成

Cortex Search サービスを作成したら、エージェント機能から RAG での検索を行えます。Snowflake におけるエージェント機能として、Cortex Agents という機能があるため、こちらを使用します。
作成は、GUI の方が容易なため、ここでは GUI から行いました。

アクセス制御:ロールの作成

ここでは、別途 Cortex Agents 作成用ロールを作成し、このロールで作業を行います。以下の通りロールを作成し必要な権限を付与します。

-- Cortex Agents ロール
USE ROLE USERADMIN;
CREATE ROLE IF NOT EXISTS cortex_agent_role;

-- 権限付与
USE ROLE SECURITYADMIN;

-- Cortex Searchサービスの使用権限
GRANT USAGE ON DATABASE cortex_db TO ROLE cortex_agent_role;
GRANT USAGE ON SCHEMA cortex_db.cortex_search_services TO ROLE cortex_agent_role;
GRANT USAGE ON CORTEX SEARCH SERVICE cortex_db.cortex_search_services.test_search_service
    TO ROLE cortex_agent_role;

-- スキーマへのエージェント作成権限
GRANT USAGE ON SCHEMA cortex_db.cortex_agents TO ROLE cortex_agent_role;
GRANT CREATE AGENT ON SCHEMA cortex_db.cortex_agents TO ROLE cortex_agent_role;

-- ロール継承
GRANT ROLE cortex_agent_role TO ROLE SYSADMIN;

Snowsight でエージェントの作成

Snowflake(GUI)にログインし、必要な権限を持つロール(ここではcortex_agent_role)に切り替え、「AI & ML > Agents」に移動します。

「Create agent」をクリックし下図の項目を指定します。
※Datbase and schema:エージェントの作成先となるデータベース・スキーマ。その他の名称は任意の名称で問題ないです。

image 2

上図で「Create Agent」をクリックすると下図の画面になります。

image 3

上図で「Tools」タブを開き、Cortex Search Services として先の手順で作成したサービスを追加します。この際、以下の項目を明示的に変更しました。

  • ID column:ソースへのハイパーリンクを生成するために使用する列を選択できます
    • ここではドキュメント間で共通ですが、作成した [STAGE_URL] カラムを指定しました
  • Title column
    • 検索対象とするカラム(ここでは [chunk])を選択します

image 4

続けて「Orchestration」タブを開きます。ここでは、以下の項目を指定できます。

  • Model:Auto
    • エージェントとして使用する LLM モデル
  • Orchestration instructions
    • オプション。ここでは空としました。
    • ユーザーから提供された入力に基づいて、エージェントのツール選択に影響を与える指示を記載できます。(例:各ツールをいつ使用するかに関する具体的な指示や、応答の最初または最後に必ずツールを使用する、といった指示など)
  • Response instructions:
    • オプション。モデルが応答を生成する際に用いる指示を記載できます
    • 例:グラフ作成を優先するよう指定したり、ユーザーに対して特定の口調(トーン)を維持する など
    • ここでは以下のように指定しました
あなたは「社内ナレッジに基づく一次回答」を行うサポートエージェントです。
回答を作成する際は、次の方針に従ってください。

- 一次情報(ドキュメント)を最優先する
  - 提示された社内/公式ドキュメント、仕様書、手順書の内容を最優先に参照し、それに基づいて回答する。
  - ドキュメントと推測が混ざる場合は、ドキュメントに書かれている内容と補足(推測/一般論)を明確に分けて記載する。

- 不明点は断定せず、確認先を案内する
  - ドキュメントに明記されていない点、環境依存・権限依存・運用ルール依存の点は断定しない。
  - 回答に必要な情報が不足している場合は、必要な追加情報を質問するか、次のように案内する:
    - 「詳細については○○部門(例:情報システム部門/運用担当/セキュリティ担当)にお問い合わせください」
  - 可能なら「何を確認すべきか(確認観点)」も併記する。

- 読み手にとって親切で分かりやすい表現にする
  - 専門用語は必要最小限にし、初出時は短く説明する。
  - 結論→理由→補足の順で、要点が先に伝わる構成にする。
  - 曖昧な表現を避け、条件(前提・対象・例外)を明確にする。
  - 手順がある場合は番号付きで具体的に書く

- 操作や実行手順は、必要に応じて番号付きリストで記載する。
  - 可能なら「前提条件」「期待される結果」「よくあるエラー/注意点」も簡潔に添える。
  • Budget configuration
    • タイムアウトとトークンの上限を指定できます
    • デフォルト:
      • タイムアウト: 900 seconds (15 minutes)
      • トークン:409600 tokens

この辺りの設定は以下が参考になります。

https://www.snowflake.com/en/developers/guides/getting-started-with-cortex-agents/#0

https://www.snowflake.com/ja/developers/guides/getting-started-with-snowflake-intelligence-ja/

設定後、保存します。このまま Snowsight から GUI で問い合わせのテストを行えます。

image 5

Snowflake Intelligence 経由でエージェントを使用する

Cortex Agents は API として提供されるため、一般ユーザーが利用する際はチャットボットのようなインターフェースが必要です。そこで、Snowflake Intelligence を使用できます。

Streamlit でも作成できますが、コーディングが必要なため、カスタマイズが必要な場合を除いて、まずは Snowflake が提供するチャットボットライクなインターフェース機能である Snowflake Intelligence を試してみるのがよい考えです。

Snowflake Intelligence オブジェクトの作成

前提として、アカウントで「Snowflake Intelligence オブジェクト」を作成する必要があります。こちらはアカウントで一つしか作成できないため、以下のような名称で問題ない考えです。

USE ROLE ACCOUNTADMIN;
CREATE SNOWFLAKE INTELLIGENCE SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT;

https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-intelligence

アクセス制御:ロールの作成

ここでは Snowflake Intelligence 作成のためのロールを用意し、必要な権限を付与しました。

-- ロールを作成
USE ROLE USERADMIN;
CREATE ROLE IF NOT EXISTS snowflake_intelligence_admin;

-- 権限付与
USE ROLE SECURITYADMIN;
GRANT ROLE snowflake_intelligence_admin TO ROLE SYSADMIN;

-- Snowflake Intelligenceオブジェクトへの操作権限
GRANT USAGE ON SNOWFLAKE INTELLIGENCE SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT TO ROLE snowflake_intelligence_admin;
GRANT MODIFY ON SNOWFLAKE INTELLIGENCE SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT TO ROLE snowflake_intelligence_admin;

-- Cortex Agentsの使用権限が必要なので付与
GRANT USAGE ON DATABASE cortex_db TO ROLE snowflake_intelligence_admin;
GRANT USAGE ON SCHEMA cortex_db.cortex_agents TO ROLE snowflake_intelligence_admin;
GRANT USAGE ON AGENT cortex_db.cortex_agents.test_agent TO ROLE snowflake_intelligence_admin;

Snowflake Intelligence オブジェクトにエージェントを追加

Snowflake Intelligence でエージェントを使用するには、Snowflake Intelligence オブジェクトにエージェント(Cortex Agents)を追加する必要があります。

-- Agentを追加
USE ROLE snowflake_intelligence_admin;
ALTER SNOWFLAKE INTELLIGENCE SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT ADD AGENT cortex_db.cortex_agents.my_agent;

Snowflake Intelligence 経由で問い合わせ

Snowflake Intelligence にアクセスします。

image 6

ログイン後、問い合わせに必要な権限があればそのまま問い合わせを行えます。

image 7

ユーザーへの Snowflake Intelligence へのアクセス権の付与

今回の設定でユーザーに Snowflake Intelligence 経由での問い合わせを行わせるためには、以下の権限を付与します。

  • エージェントの使用権限
  • Cortex Search サービスをツールとして使用する場合、Cortex Search サービスの使用権限
  • 上記の権限を持つロールをデフォルトロールに設定しておく

以下のような形で権限を付与できます。

CREATE ROLE cortex_agent_user_role;
GRANT ROLE cortex_agent_user_role TO USER <ユーザー>;

--権限を与える
USE ROLE SECURITYADMIN;

-- cortex agent の使用権限
GRANT USAGE ON DATABASE cortex_db TO ROLE cortex_agent_user_role;
GRANT USAGE ON SCHEMA cortex_db.cortex_agents TO ROLE cortex_agent_user_role;
GRANT USAGE ON AGENT cortex_db.cortex_agents.test_agent TO ROLE cortex_agent_user_role;

-- cortex search サービスの使用権限
GRANT USAGE ON SCHEMA cortex_db.cortex_search_services TO ROLE cortex_agent_user_role;
GRANT USAGE ON CORTEX SEARCH SERVICE cortex_db.cortex_search_services.test_search_service
    TO ROLE cortex_agent_user_role;

-- 仮想ウェアハウスの使用権限
GRANT USAGE ON WAREHOUSE <ウェアハウス> TO ROLE cortex_agent_user_role;

さいごに

Cortex Search の基本操作と Snowflake Intelligence からエージェント経由でツールとして使用するまでの手順を試してみました。
ドキュメント更新の自動化なども以下を参考に実装できます。

https://www.snowflake.com/en/developers/guides/ask-questions-to-your-own-documents-with-snowflake-cortex-search/#automatic-processing-of-new-documents

こちらの内容がどなたかの参考になれば幸いです。

参考

https://www.snowflake.com/en/developers/guides/ask-questions-to-your-own-documents-with-snowflake-cortex-search/#pre-process-documents

https://www.snowflake.com/en/developers/guides/getting-started-with-snowflake-intelligence/

https://docs.snowflake.com/ja/user-guide/snowflake-cortex/cortex-search/tutorials/cortex-search-tutorial-3-chat-advanced#step-4-create-search-service

https://docs.snowflake.com/en/user-guide/data-load-dirtables-auto

この記事をシェアする

FacebookHatena blogX

関連記事