Snowflake の COMPLETE 関数の構造化出力がすごい
はじめに
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-3-5-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-3-5-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-3-5-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-3-5-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 のテーブルを自動生成させたり、後続のパイプラインに繋げるためにデータクレンジングをしたりと幅広い用途で活用できると考えられます。是非皆様も使ってみてください!
宣伝
生成AI Conf 様の Webinar で登壇しました!
『生成AI時代を支えるプラットフォーム』というテーマの Webinar で NVIDIA 様、古巣の AWS 様と共に Snowflake 社員としてデータ*AI をテーマに LTをしました!以下が動画アーカイブとなりますので是非ご視聴いただければ幸いです!
SNOWFLAKE WORLD TOUR TOKYO のオンデマンド配信中!
Snowflake の最新情報を知ることができる大規模イベント『SNOWFLAKE WORLD TOUR TOKYO』が2024/9/11-12@ANAインターコンチネンタル東京で開催されました。
現在オンデマンド配信中ですので数々の最新のデータ活用事例をご覧ください。
また私が登壇させていただいた『今から知ろう!Snowflakeの基本概要』では、Snowflakeのコアの部分を30分で押さえられますので、Snowflake をイチから知りたい方、最新の Snowflake の特徴を知りたい方は是非ご視聴いただければ嬉しいですmm
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 に伴い追記
Discussion