Snowflake の COMPLETE 関数の構造化出力がすごい
SNOWFLAKE WORLD TOUR TOKYO 2025
2025/9/11 - 12の2日間、Snowflake の国内最大のイベント『SNOWFLAKE WORLD TOUR TOKYO 2025』が開催されます!データ活用の最前線を是非体感しに来てください!私は『Snowflake Cortex AISQL を用いた高度な分析手法』というセッションで登壇させていただきます。AISQL の基本から応用までキャッチアップできますので是非ご登録いただければ嬉しいですー!(9/12の方がまだ空席がございます)
はじめに
Snowflake の生成 AI 機能群である Cortex AI において2025/2/11に Cortex COMPLETE Structured Outputs がパブリックプレビューとなりました。
最初はこの機能を「ふーん」と流し読みしていたのですが、使ってみたら驚くほど便利な機能だったので是非紹介させてください!
Cortex COMPLETE Structured Outputs
Cortex COMPLETE Structured Outputs は、LLM からの応答を指定した JSON スキーマに準拠した形式で取得できる機能です。通常の Cortex COMPLETE 関数の出力はテキスト形式で返されるため、構造化されたデータとして使用するには後処理が必要でした。この機能を使えば、その手間が省け、AI データパイプラインを構築する際の工数を大幅に削減できます。
ここで大事なことは、JSON 形式で出力されることよりも指定した JSON スキーマに準拠するところだと個人的には思いました。つまり、一般的にはプロンプトで「カンマ区切りで10項目出力して」とか「氏名と住所と年齢をテーブル形式で出力して」とかの指示に必ずしも従うとは限らない LLM の出力を制御できるということです!
基本的な使い方
Cortex COMPLETE Structured Outputs は、COMPLETE 関数の options 引数にresponse_format を指定して使用します。
SELECT SNOWFLAKE.CORTEX.COMPLETE('モデル名', [
{
'role': 'user',
'content': 'プロンプト'
}
],
{
'temperature': 0,
'max_tokens': 1000,
'response_format': {
'type': 'json',
'schema': {
'type': 'object',
'properties': {
'プロパティ名': {
'type': 'string'
},
...
},
'required': ['必須プロパティ名', ...]
}
}
});
これだと分かりづらいと思いますので、私の好きなゲーム制作を例に実演したいと思います。
ゲームデータ生成の実例
例1: ローグライク RPG の部屋生成
ゲーム開発者がダンジョンの部屋情報を生成する例です。
SELECT SNOWFLAKE.CORTEX.COMPLETE('claude-4-sonnet', [
{
'role': 'user',
'content': 'ダークファンタジーテーマのローグライクRPG用の部屋を1つ生成してください。'
}
],
{
'temperature': 0.7,
'max_tokens': 800,
'response_format': {
'type': 'json',
'schema': {
'type': 'object',
'properties': {
'room_name': {
'type': 'string',
'description': '部屋の名前'
},
'description': {
'type': 'string',
'description': '部屋の詳細な説明'
},
'monsters': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'name': {
'type': 'string'
},
'hp': {
'type': 'number'
},
'attack': {
'type': 'number'
}
}
}
},
'treasure': {
'type': 'object',
'properties': {
'gold': {
'type': 'number'
},
'items': {
'type': 'array',
'items': {
'type': 'string'
}
}
}
}
},
'required': ['room_name', 'description', 'monsters']
}
}
});
このクエリを実行すると以下のような結果が得られます。
{
"created": 1740490661,
"model": "claude-4-sonnet",
"structured_output": [
{
"raw_message": {
"description": "薄暗い石造りの部屋の中央には、古びた石の祭壇が佇んでいる。祭壇の表面は何者かの血で染まり、乾いて黒ずんでいる。壁には不気味な古代文字が刻まれ、蝋燭の明かりが不規則に揺らめいている。部屋の隅には白骨化した人骨が散乱し、かつてここで行われた暗黒の儀式の痕跡を物語っている。腐敗した空気が漂い、邪悪な気配が充満している。",
"monsters": [
{
"attack": 25,
"hp": 120,
"name": "堕落した司祭"
},
{
"attack": 15,
"hp": 45,
"name": "生贄の亡霊"
},
{
"attack": 20,
"hp": 30,
"name": "血に飢えた使い魔"
}
],
"room_name": "血塗られた祭壇の間",
"treasure": {
"gold": 250,
"items": [
"呪われた儀式のダガー",
"暗黒の魔導書",
"血染めの聖杯"
]
}
},
"type": "json"
}
],
"usage": {
"completion_tokens": 100,
"prompt_tokens": 587,
"total_tokens": 687
}
}
いかがでしょうか?RPG をイメージしたダンジョンの部屋の情報、モンスターの名前、HP、攻撃力、宝箱の情報などが指定した JSON スキーマに準拠して出力されていることが分かるかと思います。
descripotion
に細かい指示を与えるとより正確な出力が期待できます。
required
は必須フィールドであり、ここで指定したフィールドを LLM が生成できない場合は関数の結果がエラーとなります。
例2: キャラクターの能力値生成
RPG のキャラクターを自動生成する例です。例1よりも description
で更に細かい指示を与えてみます。
SELECT SNOWFLAKE.CORTEX.COMPLETE('claude-4-sonnet', [
{
'role': 'user',
'content': 'ファンタジーRPG用のランダムなプレイヤーキャラクターを1人生成してください'
}
],
{
'temperature': 0.8,
'max_tokens': 1000,
'response_format': {
'type': 'json',
'schema': {
'type': 'object',
'properties': {
'name': {
'type': 'string',
'description': '英語で6文字以内の名前'
},
'race': {
'type': 'string',
'description': 'エルフ、ドワーフ、人間、オークなど'
},
'class': {
'type': 'string',
'description': '戦士、魔法使い、盗賊、神官など'
},
'stats': {
'type': 'object',
'properties': {
'hp': {
'type': 'number',
'description': '10 - 30の範囲とすること'
},
'strength': {
'type': 'number',
'description': '1 - 15の範囲とすること'
},
'dexterity': {
'type': 'number',
'description': '1 - 15の範囲とすること'
},
'constitution': {
'type': 'number',
'description': '1 - 15の範囲とすること'
},
'intelligence': {
'type': 'number',
'description': '1 - 15の範囲とすること'
},
'wisdom': {
'type': 'number',
'description': '1 - 15の範囲とすること'
},
'charisma': {
'type': 'number',
'description': '1 - 3の範囲とすること'
}
}
},
'background': {
'type': 'string',
'description': '冒険に出る理由をraceやclassを考慮して記述すること'
}
},
'required': ['name', 'race', 'class', 'stats']
}
}
});
このクエリを実行すると以下のような結果が得られます。
{
"created": 1740492411,
"model": "claude-4-sonnet",
"structured_output": [
{
"raw_message": {
"background": "エルフの森で魔法の研究に没頭していたが、より深い知識を求めて冒険の旅に出ることを決意。高い知性と敏捷性を活かして、魔法の秘密を解き明かすことを目指している。",
"class": "魔法使い",
"name": "Thalia",
"race": "エルフ",
"stats": {
"charisma": 2,
"constitution": 8,
"dexterity": 13,
"hp": 15,
"intelligence": 15,
"strength": 6,
"wisdom": 12
}
},
"type": "json"
}
],
"usage": {
"completion_tokens": 99,
"prompt_tokens": 1122,
"total_tokens": 1221
}
}
いい感じですね! description
に従うかどうかはもちろん LLM の匙加減とはなりますが、十分に期待通りの出力を得ることができました。
最後に
Cortex COMPLETE Structured Outputs はいかがでしたでしょうか?若干趣味に走ったサンプルで恐縮ですが使い方のイメージが湧いたのではないかと思います。そしてこの機能が真価を発揮するのは実際の分析やビジネスのシーンです。例えば、非構造的なビジネスログから構造的なレポートを要約して出力したり、FAQ のテーブルを自動生成させたり、後続のパイプラインに繋げるためにデータクレンジングをしたりと幅広い用途で活用できると考えられます。是非皆様も使ってみてください!
宣伝
SNOWFLAKE DISCOVER (第2弾) 開催決定!
2025/7/8-9の2日間「Snowflake Discover (第2弾)」が開催されます!Snowflake Summit の振り返りからハンズオンまで凝縮したコンテンツを Webinar 形式でお届けしますので是非ご視聴ください!私は2日目のハンズオン「Snowflake Cortex AI で実現する次世代の VoC (顧客の声) 分析」をデリバリします。最新の Cortex AISQL 関数を用いた実践的な顧客の声分析の手法を体得することができますので是非お気軽にご登録ください!
開催日時: 2025/7/8-9
形式: Webinar (オンライン)
参加費: 無料
SNOWFLAKE DISCOVER で登壇しました!
2025/4/24-25に開催されました Snowflake のエンジニア向け大規模ウェビナー『SNOWFLAKE DISCOVER』において『ゼロから始めるSnowflake:モダンなデータ&AIプラットフォームの構築』という一番最初のセッションで登壇しました。Snowflake の概要から最新状況まで可能な限り分かりやすく説明しておりますので是非キャッチアップにご活用いただければ嬉しいです!
以下リンクでご登録いただけるとオンデマンドですぐにご視聴いただくことが可能です。
生成AI Conf 様の Webinar で登壇しました!
『生成AI時代を支えるプラットフォーム』というテーマの Webinar で NVIDIA 様、古巣の AWS 様と共に Snowflake 社員としてデータ*AI をテーマに LTをしました!以下が動画アーカイブとなりますので是非ご視聴いただければ幸いです!
X で Snowflake の What's new の配信してます
X で Snowflake の What's new の更新情報を配信しておりますので、是非お気軽にフォローしていただければ嬉しいです。
日本語版
Snowflake の What's New Bot (日本語版)
English Version
Snowflake What's New Bot (English Version)
変更履歴
(20250225) 新規投稿
(20250320) COMPLETE 関数の構造化出力機能の GA に伴い追記
(20250508) 宣伝欄の修正
(20250524) 例で使っている Cortex LLM のモデルを claude-4-sonnet
に変更
(20250629) 宣伝欄の修正
Discussion