[新機能]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を作ればそれだけ精度がよくなることがわかったので、自分たちのデータに対しても上手く構築して活かしていきたいですね!