[新機能]Cortex Knowledge Extensionsが一般提供!MarketplaceからSnowflake公式ドキュメントのExtensionsを取得してSnowflake Intelligenceから問い合わせをしてみた
さがらです。
Snowflake公式のXのポストにて私も知ったのですが、Cortex Knowledge Extensionsが一般提供となりました!
これを受けて、MarketplaceからSnowflake公式ドキュメントのExtensionsを取得してSnowflake Intelligenceから問い合わせをしてみたので、その内容をまとめてみます。
※検証環境は、AWS東京リージョンのEnterpriseのアカウントとなります。
Cortex Knowledge ExtensionsをMarketplaceから取得
Cortex Knowledge Extensions(CKE)とは
Cortex Knowledge Extensions (CKE) は、一言でいうと 「Snowflake Marketplaceで共有できる、AI用の知識データベース」 です。
プロバイダー(企業や個人)が持つ独自のテキストデータ(記事、市場調査レポート、書籍、社内マニュアルなど)を、検索可能な状態にしてパッケージ化したものをSnowflake Marketplaceで販売することが出来ます。これをコンシューマー(利用者)が自身のSnowflakeアカウント内に組み込むことで、公開情報だけではなく、専門的で信頼性の高い情報源に基づいた回答を生成するAI(チャットボットやエージェントシステムなど)を構築できます。
Snowflake MarketplaceからCKEを取得
実際に、Snowflake MarketplaceからCKEを取得してみます。取得するCKEとして、公式から提供されている「Snowflake Documentation」を使用してみます。
Marketplaceでsnowflake documentationを検索すると、下図のような画面となるので赤枠のプロダクトを選択します。

右上のGetを押します。

下図のように表示されるので、作成されるデータベースと付与するロール名を指定し、Getを押します。

下図の画面が表示されたら、準備完了です!Cortex Search Playgroundを押すと、簡易的にSnowflake Documentationに対してCortex Searchを用いて検索できる画面が表示されます。


Snowflake IntelligenceからCortex Knowledge Extensionsに対して質問をしてみる
続いて、先日パブリックプレビューとなったSnowflake Intelligenceから、Cortex Knowledge Extensions(CKE)に対して質問をしてみます。
Snowflake Intelligenceとは
Snowflake Intelligenceは、一言でいうと「自然言語を使って非構造化データ・構造化データを問わず対話し、ビジネス上の問いに対する深い洞察を得られるようにする、新しいAI搭載のインターフェース」です。
裏側ではCortex Agentsが動いているため、非構造化データに対するCortex Search、構造化データに対するCortex Analyst、どちらも用いた問い合わせが可能となっています。
また、Snowflake Intelligence用のエージェントを作成する際に、Cortex Knowledge Extensionsを検索対象に設定できるため、Marketplaceで公開されているCortex Knowledge Extensionsに対しての自然言語での問い合わせも可能となっています。
より詳細は以下の公式ブログをご覧ください。
また、以下のブログでもとてもわかりやすく紹介がされております。
事前準備:Snowflake Intelligenceのセットアップ
Snowflake Intelligenceを使うためにはユーザー側で必要なリソースのセットアップが必要です。
参考までに、以下は私がSnowflake Intelligenceをセットアップしたときのクエリを記載しておきます。
-------------------------------
-------------------------------
-- Set up Snowflake Intelligence
-------------------------------
-------------------------------
/* =====================================================
   事前設定
===================================================== */
USE ROLE accountadmin;
/* =====================================================
   ロール
===================================================== */
CREATE ROLE snowflake_intelligence_admin_rl;
CREATE ROLE snowflake_intelligence_modeling_rl;
GRANT ROLE snowflake_intelligence_modeling_rl TO ROLE snowflake_intelligence_admin_rl;
GRANT ROLE snowflake_intelligence_admin_rl      TO ROLE accountadmin;
CREATE ROLE snowflake_intelligence_ro_rl;
GRANT ROLE snowflake_intelligence_ro_rl TO ROLE snowflake_intelligence_modeling_rl;
/* =====================================================
   ウェアハウス
===================================================== */
CREATE WAREHOUSE snowflake_intelligence_wh
       WITH WAREHOUSE_SIZE = 'X-SMALL';
GRANT USAGE, OPERATE ON WAREHOUSE snowflake_intelligence_wh TO ROLE snowflake_intelligence_admin_rl;
GRANT USAGE, OPERATE ON WAREHOUSE snowflake_intelligence_wh TO ROLE snowflake_intelligence_modeling_rl;
GRANT USAGE, OPERATE ON WAREHOUSE snowflake_intelligence_wh TO ROLE snowflake_intelligence_ro_rl;
/* =====================================================
   データベース
===================================================== */
CREATE DATABASE snowflake_intelligence;
GRANT OWNERSHIP ON DATABASE snowflake_intelligence TO ROLE snowflake_intelligence_admin_rl;
/* =====================================================
   動的ロール付与(そのまま)
===================================================== */
DECLARE
    sql_command STRING;
BEGIN
    sql_command := 'GRANT ROLE snowflake_intelligence_admin_rl TO USER "' || CURRENT_USER() || '";';
    EXECUTE IMMEDIATE sql_command;
    RETURN 'Role snowflake_intelligence_admin_rl granted successfully to user ' || CURRENT_USER();
END;
/* =====================================================
   ステージ/スキーマ等のセットアップ
===================================================== */
USE ROLE snowflake_intelligence_admin_rl;
USE DATABASE snowflake_intelligence;
/* 一時ファイル用スキーマ */
CREATE OR REPLACE SCHEMA snowflake_intelligence.temp;
GRANT USAGE ON SCHEMA snowflake_intelligence.temp TO ROLE public;
/* コンフィグ用スキーマ */
CREATE SCHEMA IF NOT EXISTS config;
GRANT USAGE ON SCHEMA config TO ROLE snowflake_intelligence_modeling_rl;
GRANT USAGE ON SCHEMA config TO ROLE snowflake_intelligence_ro_rl;
USE SCHEMA config;
/* セマンティックモデル格納ステージ */
CREATE STAGE semantic_models
       ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
GRANT READ ON STAGE snowflake_intelligence.config.semantic_models TO ROLE snowflake_intelligence_modeling_rl;
GRANT READ ON STAGE snowflake_intelligence.config.semantic_models TO ROLE snowflake_intelligence_ro_rl;
-------------------------------
-------------------------------
-- Agent Table Configuration
-------------------------------
-------------------------------
/* =====================================================
   0. 事前設定
===================================================== */
USE ROLE snowflake_intelligence_admin_rl;
/* =====================================================
   1. エージェント用スキーマ
===================================================== */
CREATE SCHEMA IF NOT EXISTS snowflake_intelligence.agents;
/* スキーマは全員が discover 可能に */
GRANT USAGE ON SCHEMA snowflake_intelligence.agents TO ROLE public;
/* =====================================================
   2. ROW ACCESS POLICY  (行レベル権限制御)
===================================================== */
CREATE OR REPLACE ROW ACCESS POLICY snowflake_intelligence.agents.agent_policy
AS (grantee_roles ARRAY) RETURNS BOOLEAN ->
    ARRAY_SIZE(
        FILTER(
            grantee_roles::ARRAY(VARCHAR),
            role -> is_role_in_session(role)
        )
    ) <> 0;
/* =====================================================
   3. エージェント設定テーブル
===================================================== */
CREATE OR REPLACE TABLE snowflake_intelligence.agents.config (
       agent_name           VARCHAR      NOT NULL,
       agent_description    VARCHAR,
       grantee_roles        ARRAY        NOT NULL,
       tools                ARRAY,
       tool_resources       OBJECT,
       tool_choice          OBJECT,
       response_instruction VARCHAR,
       sample_questions     ARRAY,
       CONSTRAINT pk_agent_name PRIMARY KEY (agent_name)
)
WITH ROW ACCESS POLICY snowflake_intelligence.agents.agent_policy
     ON (grantee_roles);
/* 権限付与 */
GRANT SELECT           ON TABLE snowflake_intelligence.agents.config TO ROLE public;
GRANT UPDATE, INSERT   ON TABLE snowflake_intelligence.agents.config TO ROLE snowflake_intelligence_modeling_rl;
/* =====================================================
   4. フィードバックログ用スキーマ
===================================================== */
CREATE SCHEMA IF NOT EXISTS snowflake_intelligence.logs;
GRANT USAGE ON SCHEMA snowflake_intelligence.logs TO ROLE snowflake_intelligence_ro_rl;
/* =====================================================
   5. フィードバック格納テーブル
===================================================== */
CREATE OR REPLACE TABLE snowflake_intelligence.logs.feedback (
       entity_type              VARCHAR  NOT NULL,
       username                 VARCHAR  NOT NULL,
       agent_name               VARCHAR  NOT NULL,
       agent_session_id         VARCHAR  NOT NULL,
       context                  VARIANT  NOT NULL,
       feedback_timestamp       DATETIME NOT NULL,
       feedback_categories      VARIANT,
       feedback_message         VARCHAR,
       message_id               VARCHAR,
       feedback_sentiment       VARCHAR,
       user_prompt              VARIANT,
       executed_queries         ARRAY,
       documents_returned       ARRAY,
       response_start_timestamp DATETIME,
       response_end_timestamp   DATETIME,
       response_duration        NUMBER
);
/* INSERT 権限は誰でも */
GRANT INSERT ON TABLE snowflake_intelligence.logs.feedback TO ROLE public;
CKEを参照するSnowflake Intelligence用のエージェントをセットアップ
以下のドキュメントを参考に、CKEを参照するSnowflake Intelligence用のエージェントをセットアップしてみます。
まず、先ほどMarketplaceから取得したSnowflake DocumentationのCKEに対する権限を、Snowflake Intelligence用のロールに対して付与します。
grant imported privileges on database SNOWFLAKE_DOCUMENTATION to role snowflake_intelligence_admin_rl;
次に、エージェントを作成していきます。
AI/MLのメニューから、Agentsを押します。

Create agentを押します。

下図のように表示されるので、名前を入力してCreate agentを押します。

作成されたエージェントを選択します。

右上のEditを押した後、ToolsからCortex Search Servicesの横の+ Addを押します。


表示された画面で、下図のようにMarketplaceから取得したCKEの中に含まれるCortex Search Serviceを選択し、各情報を入力します。

これで設定は完了のため、右上のSaveを押します。

Snowflake Intelligenceからエージェントを用いた問い合わせをする
それでは実際に、Snowflake Intelligenceから作成したエージェントを用いた問い合わせをしてみます!
AI/MLのメニューから、Snowflake Intelligenceを押します。

エージェントが一つしかない場合、先程作成したエージェントが最初から選択されていると思います。

この状態で、「Snowpipeのコストについて教えて」と聞いてみます。すると、下図のように実際に公式ドキュメントの内容を参考にした回答が返ってきます!Snowpipeのコスト体系が最近変わったばかりなので、最新のドキュメントの情報を元に回答しているのがわかりますね。


Thinking stepsを見ると、どのように検索を行ったのかの詳細が得られます。

参考までに、CKEに対するCortex Search Serviceを追加していないエージェントで同じ質問をしてみると、シンプルにLLMを用いた問い合わせ結果が返ってきます。Thinking stepsも表示されません。


最後に
Cortex Knowledge Extensionsが一般提供となったので、MarketplaceからSnowflake公式ドキュメントのExtensionsを取得してSnowflake Intelligenceから問い合わせをしてみました。
実際に試してみた結果を見ると、Cortex Knowledge Extensionsの有無によって明らかに回答の精度が異なっていたのがわかると思います!良いCortex Search Serviceを作ればそれだけ精度がよくなることがわかったので、自分たちのデータに対しても上手く構築して活かしていきたいですね!







