- はじめに:Snowflake上でテキスト要約をSQLだけで実行する
- 結論:要約系AI関数の使い分け
- SUMMARIZEとは?
- SUMMARIZEの基本構文
- SUMMARIZEで英語の単一テキストを要約する
- テーブル列をSUMMARIZEで要約する
- 日本語要約や形式指定にはAI_COMPLETEを使う
- 複数行の要約にはAI_SUMMARIZE_AGGを使う
- 観点指定ありの要約・洞察抽出にはAI_AGGを使う
- GROUP BYと組み合わせてカテゴリ別に要約する
- 要約結果をテーブルに保存する
- 差分処理で再実行コストを抑える
- 要約系AI関数を使うための権限
- コスト・トークン・ウェアハウスの考え方
- 使用量を確認するSQL
- SUMMARIZEに向いている用途・注意が必要な用途
- よくあるエラーと確認ポイント
- まとめ
- 参考リンク
- 関連記事
はじめに:Snowflake上でテキスト要約をSQLだけで実行する
Snowflakeでは、SQLだけでテキスト要約を実行できるCortex AI関数が用意されています。1つの英語テキストをシンプルに要約したい場合は SNOWFLAKE.CORTEX.SUMMARIZE、日本語や箇条書きなど要約形式を指定したい場合は AI_COMPLETE、複数行のレビューや問い合わせをまとめたい場合は AI_SUMMARIZE_AGG、特定観点で洞察を出したい場合は AI_AGG を使い分けるのがおすすめです。
本記事では、これらの要約系AI関数を初心者向けに整理し、用途別の使い分けと実務で使えるSQL例をまとめます。Cortex全体の位置づけはSnowflake Cortex入門もあわせてご覧ください。
結論:要約系AI関数の使い分け
| やりたいこと | 優先候補 | 理由 |
|---|---|---|
| 英語の単一テキストを短く要約したい | SNOWFLAKE.CORTEX.SUMMARIZE | 構文がシンプル |
| 日本語で要約したい | AI_COMPLETE | 出力言語を指定しやすい |
| 箇条書き・文字数・形式を指定したい | AI_COMPLETE | プロンプトで柔軟に指定できる |
| 複数行のレビューをまとめたい | AI_SUMMARIZE_AGG | テキスト列全体を要約できる |
| 複数行から不満点や改善要望を抽出したい | AI_AGG | 自然言語の指示で観点指定できる |
| カテゴリ別・商品別に要約したい | AI_SUMMARIZE_AGG + GROUP BY | グループ単位で集約できる |
| 大量データを要約したい | AI_SUMMARIZE_AGG / AI_AGG | 行ごとのAI_COMPLETEより集約向き |
SUMMARIZEとは?
SNOWFLAKE.CORTEX.SUMMARIZE は、指定した英語テキストを要約するシンプルなCortex関数です。入力は文字列1つで、出力も要約された文字列です。モデル名やプロンプト、出力形式を細かく指定する関数ではありません。
- SUMMARIZEは英語入力テキスト向けとして公式に説明されています。
- モデル名は指定しません。
- 要約形式や出力言語を指定したい場合は
AI_COMPLETEを使います。 - 複数行をまとめて要約したい場合は
AI_SUMMARIZE_AGGを使います。
SUMMARIZEの基本構文
引数は要約したいテキスト1つだけです。戻り値は要約された文字列になります。
SNOWFLAKE.CORTEX.SUMMARIZE( <text> )
SUMMARIZEで英語の単一テキストを要約する
SELECT SNOWFLAKE.CORTEX.SUMMARIZE(
'Snowflake is a cloud data platform that supports data warehousing, data lakes, data engineering, data science, and secure data sharing. Its storage and compute resources are separated, allowing workloads to scale independently.'
) AS summary;
1つの英語パラグラフを短くまとめたい、というシンプルな用途にはこれだけで十分です。
テーブル列をSUMMARIZEで要約する
SELECT
ticket_id,
ticket_body,
SNOWFLAKE.CORTEX.SUMMARIZE(ticket_body) AS summary
FROM support_tickets
WHERE ticket_body IS NOT NULL
LIMIT 10;
- まずは
LIMITを付けて少量で試します。 WHERE条件でNULLや空文字を除外します。- 英語テキストの単一行要約に向きます。
- 同じ行を何度も要約すると、そのたびにコストが発生します。
日本語要約や形式指定にはAI_COMPLETEを使う
SUMMARIZE はシンプルですが、「日本語で」「3行で」「箇条書きで」「結論・理由・次アクションに分けて」などの指定は苦手です。このような場合は、プロンプトで自由に指示できる AI_COMPLETE が向いています。
SELECT AI_COMPLETE(
model => 'mistral-large2',
prompt => '次の問い合わせ内容を日本語で3行に要約してください。問い合わせ内容: ' || ticket_body,
model_parameters => {
'temperature': 0.2,
'max_tokens': 200
}
) AS summary_ja
FROM support_tickets
WHERE ticket_body IS NOT NULL
LIMIT 10;
AI_COMPLETE の使い方や model_parameters の詳細はSnowflake AI_COMPLETE関数入門でまとめています。
複数行の要約にはAI_SUMMARIZE_AGGを使う
AI_SUMMARIZE_AGG は、テキスト列全体をまとめて要約する集計関数です。1行ずつ要約する SUMMARIZE や AI_COMPLETE と違い、複数行のレビュー、問い合わせ、アンケート、通話メモなどをまとめて要約したいときに向いています。
SELECT AI_SUMMARIZE_AGG(review_text) AS review_summary
FROM product_reviews
WHERE review_text IS NOT NULL;
集約関数なので、複数行をまとめて1つの要約に集約します。レビュー一覧全体や問い合わせ履歴全体から「全体的な傾向」をつかむのに便利です。
観点指定ありの要約・洞察抽出にはAI_AGGを使う
AI_SUMMARIZE_AGG は汎用的な要約を返します。一方で、AI_AGG は自然言語の指示を指定できるため、「不満点だけを抽出」「改善要望を3つに整理」「解約理由を分類」など、観点を指定した分析に向いています。
SELECT AI_AGG(
review_text,
'このレビュー全体から、ユーザーが不満に感じている点を3つにまとめてください'
) AS pain_points
FROM product_reviews
WHERE review_text IS NOT NULL;
AI_SUMMARIZE_AGGとAI_AGGの違い
| 比較項目 | AI_SUMMARIZE_AGG | AI_AGG |
|---|---|---|
| 目的 | テキスト列全体の汎用要約 | 指示に基づく洞察抽出・観点指定要約 |
| プロンプト | 不要 | 必要 |
| 向いている用途 | レビュー一覧の全体要約、問い合わせ全体の要約 | 不満点、改善要望、解約理由、傾向分析 |
| GROUP BY | 使える | 使える |
| 大量データ | 向いている | 向いている |
| 初心者向け | より簡単 | 指示文の設計が必要 |
GROUP BYと組み合わせてカテゴリ別に要約する
商品カテゴリ別、店舗別、問い合わせ種別別など、グループ単位で要約したい場合は GROUP BY と組み合わせます。
SELECT
product_category,
AI_SUMMARIZE_AGG(review_text) AS category_summary
FROM product_reviews
WHERE review_text IS NOT NULL
GROUP BY product_category
ORDER BY product_category;
同じパターンで、カテゴリ別に改善ポイントを AI_AGG で抽出することもできます。
SELECT
product_category,
AI_AGG(
review_text,
'このカテゴリのレビューから、改善すべきポイントを3つにまとめてください'
) AS improvement_points
FROM product_reviews
WHERE review_text IS NOT NULL
GROUP BY product_category
ORDER BY product_category;
要約結果をテーブルに保存する
AI関数を毎回実行するとコストが増えていきます。一度作った要約結果はテーブルに保存し、ダッシュボードやレポートでは保存済みの要約を参照するのが基本です。
CREATE OR REPLACE TABLE product_review_category_summary AS
SELECT
product_category,
AI_SUMMARIZE_AGG(review_text) AS category_summary,
CURRENT_TIMESTAMP() AS summarized_at
FROM product_reviews
WHERE review_text IS NOT NULL
GROUP BY product_category;
- AI関数を毎回実行するとコストが増えます。
- 一度作った要約結果はテーブルに保存します。
- ダッシュボードやレポートでは保存済みの要約結果を参照します。
- 更新頻度(日次・週次など)を決めて再生成します。
差分処理で再実行コストを抑える
- 新しいレビューや問い合わせだけを対象にします。
- 更新日時やIDを使って、前回処理済みのデータを除外します。
- 週次・日次などバッチ単位で要約します。
- 大量データを毎回全件再要約しないように設計します。
日次バッチで前日分のレビューだけを要約する例:
CREATE OR REPLACE TABLE daily_review_summary AS
SELECT
DATE_TRUNC('day', created_at) AS review_date,
AI_SUMMARIZE_AGG(review_text) AS daily_summary,
CURRENT_TIMESTAMP() AS summarized_at
FROM product_reviews
WHERE review_text IS NOT NULL
AND created_at >= DATEADD('day', -1, CURRENT_TIMESTAMP())
GROUP BY 1;
本番では、INSERT INTO や MERGE を使って既存テーブルに追記する設計にすると、履歴を残しつつコストを抑えられます。
要約系AI関数を使うための権限
SUMMARIZE / AI_SUMMARIZE_AGG / AI_AGG / AI_COMPLETE を使うには、利用ロールにAI関数の利用権限と、必要なデータベースロールが必要です。検証環境では広めの権限、本番環境では必要な関数だけに絞る設計を検討します。
検証用ロール例(AI関数全体を許可):
USE ROLE ACCOUNTADMIN;
CREATE ROLE IF NOT EXISTS ai_summary_user_role;
GRANT USE AI FUNCTIONS ON ACCOUNT TO ROLE ai_summary_user_role;
GRANT DATABASE ROLE SNOWFLAKE.AI_FUNCTIONS_USER TO ROLE ai_summary_user_role;
GRANT ROLE ai_summary_user_role TO USER <USER_NAME>;
個別関数だけ許可する例(AI_SUMMARIZE_AGG / AI_AGG のみ):
USE ROLE ACCOUNTADMIN;
CREATE ROLE IF NOT EXISTS ai_summarize_only_role;
GRANT USE AI FUNCTION AI_SUMMARIZE_AGG
ON ACCOUNT TO ROLE ai_summarize_only_role;
GRANT USE AI FUNCTION AI_AGG
ON ACCOUNT TO ROLE ai_summarize_only_role;
GRANT DATABASE ROLE SNOWFLAKE.AI_FUNCTIONS_USER
TO ROLE ai_summarize_only_role;
GRANT ROLE ai_summarize_only_role TO USER <USER_NAME>;
USE AI FUNCTIONSはAI関数全体を許可する権限です。USE AI FUNCTION <関数名>は個別AI関数を許可する権限です。SNOWFLAKE.CORTEX_USERまたはSNOWFLAKE.AI_FUNCTIONS_USERのデータベースロールが必要になる場合があります。- 本番では必要な関数だけに絞ります。
PUBLICに広く付与しすぎないようにしてください。
コスト・トークン・ウェアハウスの考え方
- AI要約関数は入力テキスト量、対象行数、出力長に応じてコストが増えます。
AI_COMPLETEは入力トークンと出力トークンの両方に注意します。AI_SUMMARIZE_AGGとAI_AGGは複数行をまとめて処理できますが、大量データでは事前検証が必要です。- AI関数を呼び出すクエリでは、通常のウェアハウス稼働コストも発生します。
- 必要以上に大きなウェアハウスを使ってもAI関数自体が速くなるとは限りません。
- まずは
LIMITや日付条件で対象を絞ります。 - 要約結果は保存し、同じデータを何度も再要約しないようにします。
- Cortex AI関数の使用量はUsage Historyで確認します。
料金体系の全体像はSnowflakeの料金体系をやさしく解説、急増時の対処はSnowflakeのクレジット急増の原因調査と削減方法もご覧ください。
使用量を確認するSQL
要約系AI関数の利用状況は、Account Usageの専用ビューで確認できます。まずは列構成を確認してから集計するのがおすすめです。
DESC VIEW SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY;
日別・関数別の消費(要約系関数のみ抽出):
SELECT
DATE_TRUNC('day', START_TIME) AS usage_date,
FUNCTION_NAME,
SUM(CREDITS) AS total_credits,
COUNT(DISTINCT QUERY_ID) AS query_count
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY
WHERE START_TIME >= DATEADD('day', -30, CURRENT_TIMESTAMP())
AND FUNCTION_NAME IN ('SUMMARIZE', 'AI_SUMMARIZE_AGG', 'AI_AGG', 'AI_COMPLETE')
GROUP BY 1, 2
ORDER BY usage_date DESC, total_credits DESC;
ユーザー別の消費(直近3か月、要約系関数のみ):
SELECT
DATE_TRUNC('month', h.START_TIME) AS usage_month,
u.NAME AS user_name,
u.EMAIL,
h.FUNCTION_NAME,
SUM(h.CREDITS) AS total_credits,
COUNT(DISTINCT h.QUERY_ID) AS query_count
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY h
JOIN SNOWFLAKE.ACCOUNT_USAGE.USERS u
ON h.USER_ID = u.USER_ID
WHERE h.START_TIME >= DATEADD('month', -3, CURRENT_TIMESTAMP())
AND h.FUNCTION_NAME IN ('SUMMARIZE', 'AI_SUMMARIZE_AGG', 'AI_AGG', 'AI_COMPLETE')
GROUP BY 1, 2, 3, 4
ORDER BY usage_month DESC, total_credits DESC;
CORTEX_AI_FUNCTIONS_USAGE_HISTORYはCortex AI関数の使用状況確認に使います。- ビューの列名や利用可否はSnowflakeの仕様変更で変わる可能性があります。
- まずは
DESC VIEWで列名を確認してください。 - 古い記事や環境では
CORTEX_FUNCTIONS_USAGE_HISTORYなどのビュー名を見かける場合があるため、最新の公式ドキュメントで確認してください。
SUMMARIZEに向いている用途・注意が必要な用途
向いている用途
- 英語の問い合わせ文の簡易要約
- カスタマーレビュー一覧の全体要約
- 問い合わせカテゴリ別の傾向把握
- アンケート自由記述の要約
- 通話メモや議事メモの一次整理
- 日次・週次の問い合わせ傾向レポート
- 不満点や改善要望の抽出
注意が必要な用途
- 法務・医療・金融など高リスク文書の最終判断
- 事実確認が必要なレポートの確定版
- 日本語の微妙なニュアンスが重要な文書
- 個人情報や機密情報を含む大量要約
- AI出力をそのまま顧客へ返す処理
- コスト見積もりなしの全件要約
よくあるエラーと確認ポイント
| 症状 | 確認ポイント |
|---|---|
| 権限エラーになる | USE AI FUNCTIONS または個別関数権限、AI_FUNCTIONS_USER / CORTEX_USER を確認 |
| NULLが返る | 入力が空、長すぎる、未対応言語、リージョン制限を確認 |
| 日本語要約が期待通りでない | AI_COMPLETE で日本語出力を明示する |
| 要約がざっくりしすぎる | AI_AGG で観点を指定する |
| カテゴリ別に要約できない | GROUP BY と集計関数の使い方を確認 |
| コストが増える | 対象件数、再実行、保存有無、Usage Historyを確認 |
| 出力を細かく制御できない | SUMMARIZE ではなく AI_COMPLETE を使う |
コスト超過を防ぐ仕組みはSnowflake Resource Monitor入門も参考になります。
まとめ
Snowflakeでテキスト要約を行う場合、1つの英語テキストをシンプルに要約するなら SNOWFLAKE.CORTEX.SUMMARIZE、日本語や箇条書きなど形式を指定したいなら AI_COMPLETE、複数行のレビューや問い合わせをまとめたいなら AI_SUMMARIZE_AGG、不満点や改善要望など特定観点で洞察を出したいなら AI_AGG を使い分けるのがおすすめです。実務利用では、まず少量データで検証し、要約結果をテーブルに保存し、Usage Historyでコストを確認しながら運用しましょう。
参考リンク
- Snowflake公式:SNOWFLAKE.CORTEX.SUMMARIZE
- Snowflake公式:AI_SUMMARIZE_AGG
- Snowflake公式:AI_AGG
- Snowflake公式:AI_COMPLETE
- Snowflake公式:Cortex functions usage history
- Snowflake公式:Service Consumption Table (PDF)
※リンク先のパスはSnowflake側の構成変更で変わる可能性があります。最新URLは公式ドキュメントのトップから検索してください。


