はじめに:新規実装ならAI_EXTRACTを使うのがおすすめ
以前は SNOWFLAKE.CORTEX.EXTRACT_ANSWER を使って、テキストから質問の答えを抽出する方法がありました。ただし現在は、後方互換用の旧関数として扱われており、新しく文書抽出処理を作る場合は AI_EXTRACT を使うのがおすすめです。
本記事では、AI_EXTRACT の基本的な使い方と、EXTRACT_ANSWER との違い・移行の考え方を初心者向けに整理します。Cortex AI Functions 全体の俯瞰は Snowflake Cortex AI関数まとめ もあわせてご覧ください。
AI_EXTRACTとは?
AI_EXTRACT は、テキストやファイル(PDF・Officeファイル・画像など)から、指定したキーに沿って情報を抽出するCortex AI関数です。1回の呼び出しで複数項目をまとめて取り出せるため、契約書・問い合わせメール・サポートチケット・カタログPDFといった構造化されていない文書から、ビジネスで使いたい情報をSQLだけで取り出せます。
- 入力は文字列またはファイル(ステージ上のファイルを
TO_FILEで参照)。 - 出力は
responseを含むJSONオブジェクト。後続SQLでフラット化しやすい形です。 scores => TRUEで抽出結果の信頼度を確認できます。- 利用可能なリージョン・モデル・対応形式は変わる可能性があるため、最新情報は公式ドキュメントを確認してください。
EXTRACT_ANSWERとの違い
| 比較項目 | AI_EXTRACT | EXTRACT_ANSWER |
|---|---|---|
| 位置づけ | 新規実装向けのCortex AI関数 | 後方互換用の旧関数 |
| 主な用途 | テキスト・ファイルから構造化情報を抽出 | テキストから質問への回答を抽出 |
| 入力 | 文字列またはファイル | 文字列 |
| ファイル対応 | PDF、DOCX、PPTX、画像など | 直接のファイル入力は不可 |
| 出力 | response を含むJSONオブジェクト | 文字列 |
| 複数項目抽出 | 可能 | 基本的には1質問ずつ |
| スコア | scores => TRUE で利用可能 | なし |
| 新規実装 | 推奨 | 非推奨化に注意 |
EXTRACT_ANSWER は既存SQLの理解や保守には役立ちますが、新しく文書抽出処理を作るなら AI_EXTRACT を中心に検討してください。
AI_EXTRACTでできること
- テキスト本文から、質問形式で指定した項目を抽出する。
- 1回の呼び出しで複数項目(契約日・金額・会社名 など)をまとめて取り出す。
- PDF・DOCX・PPTX・画像などのファイルから情報を抽出する。
- JSON schema を使って、List(配列)やTable(表)形式での抽出も可能。
scores => TRUEで信頼度を確認し、低スコア項目を人手レビューに回す運用が組める。
最小のSQL例:テキストから項目を抽出する
まずは1つのテキストと、1項目の質問でAI_EXTRACTを試してみます。
SELECT AI_EXTRACT(
'当社の標準保証期間は購入日から2年間です。延長保証に加入された場合は最大5年間まで延長されます。',
{'warranty_period': '保証期間は何年ですか?'}
) AS extracted;
戻り値は、次のようなJSONオブジェクトです。
{
"error": null,
"response": {
"warranty_period": "2年間"
}
}
response の中に、指定したキー名で抽出値が入る形です。後続SQLでは extracted:response:warranty_period::string のように取り出せます。
複数項目をまとめて抽出する
AI_EXTRACTは、1回の呼び出しで複数項目を抽出できます。EXTRACT_ANSWER を質問の数だけ呼び出すよりも、処理を整理しやすい点が大きな違いです。
SELECT AI_EXTRACT(
text => document_text,
responseFormat => {
'warranty_period': '標準保証期間は何年ですか?',
'extended_warranty': '延長保証に加入した場合、最大何年まで延長できますか?',
'return_policy': '返品可能期間は何日以内ですか?'
}
) AS extracted
FROM support_documents
WHERE document_text IS NOT NULL
LIMIT 10;
JSON結果から値を取り出す
結果のJSONをカラムへフラット化したい場合は、WITH 句で受けてから result:response:キー::string の形で取り出します。
WITH extracted AS (
SELECT AI_EXTRACT(
text => document_text,
responseFormat => {
'warranty_period': '標準保証期間は何年ですか?',
'return_policy': '返品可能期間は何日以内ですか?'
}
) AS result
FROM support_documents
LIMIT 10
)
SELECT
result:response:warranty_period::string AS warranty_period,
result:response:return_policy::string AS return_policy,
result:error::string AS error_message
FROM extracted;
error 列も同じJSONに含まれるため、エラー検知や再処理キュー設計に使えます。
PDF・Officeファイル・画像から情報を抽出する
AI_EXTRACT は、ステージ上のファイルを TO_FILE で渡せます。契約書PDFや会議資料DOCX、スキャン画像(PNG/JPEG)などから直接情報を抽出できます。
SELECT AI_EXTRACT(
file => TO_FILE('@docs_stage', 'contract_sample.pdf'),
responseFormat => {
'contract_date': '契約日はいつですか?',
'company_name': '契約先の会社名は何ですか?',
'contract_amount': '契約金額はいくらですか?'
},
scores => TRUE
) AS extracted;
- 対応形式はPDF、PNG、JPEG、DOCX、PPTX、TXT、HTMLなどが案内されています。
- 対応形式・サイズ上限・ページ数上限は変わる可能性があるため、最新情報は公式ドキュメントを確認してください。
- クライアントサイド暗号化されたステージはサポートされない場合があります。
Entity / List / Table抽出の使い分け
AI_EXTRACT は、抽出したい構造に合わせて主に3パターンを使い分けられます。
| 抽出タイプ | 使う場面 | 例 |
|---|---|---|
| Entity | 単一項目を取り出したい | 契約日、会社名、金額 |
| List | 複数の値を配列で取り出したい | 担当者一覧、商品一覧、住所一覧 |
| Table | 表形式のデータを取り出したい | 請求明細、売上表、検査結果表 |
List抽出の例
配列で取り出したい場合は、JSON schemaを使い type を array にします。
SELECT AI_EXTRACT(
text => '参加者は山田太郎、佐藤花子、鈴木一郎です。',
responseFormat => {
'schema': {
'type': 'object',
'properties': {
'participants': {
'description': '参加者の名前一覧',
'type': 'array'
}
}
}
}
) AS extracted;
Table抽出の考え方
- 表を抽出する場合はJSON schemaを使い、各列名と説明を明確にします。
column_orderingを使って列順を指定します。- PDF内の請求明細や検査表など、行と列が見えている表構造の抽出に向いています。
- schemaの細かい記法は更新される可能性があるため、最新情報は公式ドキュメントを確認してください。
スコア付きで抽出結果の信頼度を確認する
運用にAI_EXTRACTを組み込む場合、抽出結果の信頼度を見たいことがよくあります。scores => TRUE を指定すると、抽出値ごとのスコアを含むオブジェクトが返ります。
SELECT AI_EXTRACT(
text => document_text,
responseFormat => {
'company_name': '会社名は何ですか?',
'contract_amount': '契約金額はいくらですか?'
},
scores => TRUE
) AS extracted
FROM contracts
LIMIT 10;
- スコアが低い項目は人手確認や再処理キューに回す運用がしやすくなります。
- スコアは絶対的な正解保証ではなく、運用上の判断材料として使うのが安全です。
- スコアのレンジ・計算定義は将来変わる可能性があるため、しきい値は実データで調整してください。
EXTRACT_ANSWERからAI_EXTRACTへ移行する考え方
既存SQLで SNOWFLAKE.CORTEX.EXTRACT_ANSWER を使っている箇所は、次のように AI_EXTRACT へ書き換えられます。
旧:EXTRACT_ANSWER
SELECT SNOWFLAKE.CORTEX.EXTRACT_ANSWER(
document_text,
'保証期間は何年ですか?'
) AS warranty_period
FROM support_documents;
新:AI_EXTRACT
SELECT
AI_EXTRACT(
text => document_text,
responseFormat => {'warranty_period': '保証期間は何年ですか?'}
):response:warranty_period::string AS warranty_period
FROM support_documents;
- 既存SQLを保守する場合は、
EXTRACT_ANSWERの仕様(回答文字列をそのまま返す)を理解しておく価値があります。 - 新規実装や拡張開発では、AI_EXTRACT へ寄せるのがおすすめです。
- 複数項目を扱う場合は、AI_EXTRACTの方が呼び出し回数も少なく、後続SQLも整理しやすくなります。
権限の設定例
- AI関数を使うには、利用ロールに
USE AI FUNCTIONSまたは個別AI関数の利用権限が必要です。 SNOWFLAKE.CORTEX_USERまたはSNOWFLAKE.AI_FUNCTIONS_USERなどのデータベースロールが必要になる場合があります。- 本番環境では PUBLIC に広く付与するのではなく、必要なロールへ限定して付与する方が安全です。
USE ROLE ACCOUNTADMIN;
CREATE ROLE IF NOT EXISTS ai_extract_user_role;
GRANT USE AI FUNCTIONS ON ACCOUNT TO ROLE ai_extract_user_role;
GRANT DATABASE ROLE SNOWFLAKE.AI_FUNCTIONS_USER TO ROLE ai_extract_user_role;
GRANT ROLE ai_extract_user_role TO USER YOUR_USER_NAME;
個別関数だけを許可したい場合は、USE AI FUNCTION AI_EXTRACT ON ACCOUNT TO ROLE ai_extract_user_role のように個別権限を使う運用も検討できます。
コスト・ページ数・トークンの注意点
- AI_EXTRACTは、ページ数、入力プロンプト、出力トークンなどがコストに影響します。
- PDFやDOCXなどページ単位のファイルでは、ページ数が重要になります。
scale_factorを上げるとOCR品質が改善する可能性がありますが、トークン消費が増え、処理可能ページ数も減る場合があります。- Snowflake公式では、AI_EXTRACTを実行するクエリに必要以上に大きなウェアハウスを使わないことが推奨されています。
- まずは
LIMIT 10など少量データで検証し、本番実行前に対象件数・ページ数・ファイルサイズを確認してください。 - 利用実績は
SNOWFLAKE.ACCOUNT_USAGE.CORTEX_FUNCTIONS_USAGE_HISTORYなどのビューで確認できます(利用可能ビューは時期により追加・改名される場合があります)。
クレジット急増の原因調査・削減方法は Snowflakeのクレジット急増の原因調査と削減方法 もあわせてご覧ください。
リージョン・ガバナンス・セキュリティの注意点
- ファイルサイズ上限・ページ数上限・1回の呼び出しで指定できる質問数の上限があります。
- 対応ファイル形式は公式ドキュメントで最新を確認してください。
- クライアントサイド暗号化されたステージはサポートされない場合があります。
- リージョンによって利用可否が異なります。
- 使用機能・モデル・リージョンによってはクロスリージョン推論の設定が必要になる場合があります。
- 機密情報や個人情報を扱う場合は、社内ルール・ガバナンス要件・Service perimeter の設定を事前に確認してください。
うまく抽出できないときのチェックポイント
| 症状 | 確認ポイント |
|---|---|
| 値が空になる | 文書内に答えが明記されているか |
| 期待と違う値が返る | 質問文が曖昧でないか |
| 複数の候補が混ざる | 「契約日」「支払日」など項目名を具体化する |
| JSON形式エラーになる | responseFormat が正しいOBJECT形式になっているか |
| ファイルで失敗する | 対応形式・サイズ・暗号化・破損ファイルを確認する |
| コストが増える | 対象件数・ページ数・LIMIT・WHERE条件を確認する |
| 精度が低い | scores => TRUE、質問文の具体化、必要に応じて前処理を検討する |
まとめ
EXTRACT_ANSWER は既存SQLの理解・保守には役立つものの、これから新しく文書抽出を始めるなら AI_EXTRACT を中心に学ぶのがおすすめです。AI_EXTRACTを使えば、テキストだけでなくPDFやOfficeファイル、画像からも、契約日・金額・会社名・明細表などをSQLで抽出できます。まずは少量データで検証し、権限・リージョン・コスト・ガバナンスを確認しながら実務利用へ広げていきましょう。
参考リンク
- AI_EXTRACT 公式リファレンス
- EXTRACT_ANSWER(SNOWFLAKE.CORTEX) 公式リファレンス
- Snowflake Cortex AI Functions 概要
- Privileges and model access for Cortex AI Functions
- Cost considerations for Cortex AI Functions
- CORTEX_FUNCTIONS_USAGE_HISTORY
関連記事
- Snowflake Cortex AI関数まとめ|AI_COMPLETE・AI_TRANSLATE・AI_SENTIMENT・SUMMARIZEの使い方 – Cortex AI Functions全体を俯瞰したいときに。
- Snowflake Cortex AI_COMPLETE入門 – 自由なプロンプトでLLMを呼ぶ中核関数。
- Snowflake Cortex AI_TRANSLATE入門 – 多言語翻訳の最新仕様。
- Snowflake Cortex SUMMARIZE入門 – SUMMARIZE/AI_SUMMARIZE_AGG/AI_AGGの使い分け。
- Snowflakeのクレジット急増の原因調査と削減方法 – AI関数のコスト管理にも有用。
- Snowflake入門ガイド|12ステップで学ぶ学習ロードマップ – Snowflake全体像の学習ハブ。
- Snowflakeエラー解決まとめ – 症状別トラブルシューティングのハブ。


