AI_PARSE_DOCUMENTとAI_EXTRACTは、ステージに置いたPDFや画像をSQLだけで処理するSnowflake Cortex AIの関数です。前者は文書をテキストやMarkdownに変換し、後者は指定した項目を抜き出してJSONで返します。日本語文書で使うときは注意が要ります。公式ドキュメントの対応言語一覧で日本語を含むのはAI_EXTRACTだけで、AI_PARSE_DOCUMENTの一覧に日本語はありません(2026年9月17日時点)。本記事では、2つの関数の構文、出力JSON、上限値、料金の目安を公式ドキュメントの記載に沿って整理します。仕様はAI_PARSE_DOCUMENTの公式ガイド(対応言語・入力要件)とAI_EXTRACTの公式リファレンスを基にしています。
まとめ
- AI_PARSE_DOCUMENTは文書全体をテキスト化する関数です。既定のOCRモードはプレーンテキスト、LAYOUTモードは表や見出しを保ったMarkdownを返します。上限は1ファイル100MB・1文書2,000ページです。
- AI_EXTRACTは、
responseFormatに書いた質問に答える形で項目・リスト・表を抜き出します。上限は100MB未満・125ページで、1回に聞けるのはエンティティ100問、表なら10問までです。 - 公式の対応言語は、AI_EXTRACTが日本語を含む29言語、AI_PARSE_DOCUMENTが日本語を含まない15言語です。日本語帳票の項目抽出はAI_EXTRACTに任せ、AI_PARSE_DOCUMENTによる日本語の全文化は自社の文書で検証してから採用してください。
- AWS東京リージョンでは両関数ともネイティブで提供されています。Azure Japan EastはAI_EXTRACTのみがネイティブ提供の一覧に載っています。
- 料金の目安(オンデマンド・Global単価)は、1,000ページあたりOCRが約1.36ドル、LAYOUTが約7.32ドルです。AI_EXTRACTはページ分の入力トークンだけで約10.77ドルかかり、これに質問文と回答のトークンが加わります。
AI_PARSE_DOCUMENTとAI_EXTRACTの役割分担
2つの関数は入力が同じでも、返すものが違います。AI_PARSE_DOCUMENTは「何が書いてあるか」を丸ごと返し、AI_EXTRACTは「聞いたことへの答え」だけを返します。RAG用の全文インデックスを作るなら前者、請求書番号や合計金額をテーブルの列にしたいなら後者です。
| 項目 | AI_PARSE_DOCUMENT | AI_EXTRACT |
|---|---|---|
| 出力 | テキスト/Markdown | 項目ごとのJSON |
| 公式対応言語 | 15言語(日本語なし) | 29言語(日本語あり) |
| ファイル上限 | 100MB | 100MB未満 |
| ページ上限 | 2,000ページ | 125ページ |
| 課金単位 | 1,000ページ | 100万トークン |
| 一般提供 | 2025年8月21日(LAYOUT) | 2025年10月16日 |
| 前身の関数 | PARSE_DOCUMENT | EXTRACT_ANSWER |
対応ファイル形式も異なります。AI_PARSE_DOCUMENTはPDF、PPTX、DOCX、JPEG、JPG、PNG、TIFF、TIF、HTML、TXTの10種類です。AI_EXTRACTはこれに加えてPPT、EML、DOC、BMP、GIF、WEBP、MDなども受け付けます。メール(EML)や旧形式のWord文書を直接読めるのはAI_EXTRACTだけです。Cortex AI関数群全体の中での位置づけはCortex AI(Snowflake)とは?主要機能・導入メリット・読み方を解説にまとめています。
日本語文書で使うときの前提
AI_EXTRACTとAI_PARSE_DOCUMENTの日本語対応範囲
AI_EXTRACTのリファレンスは、アラビア語、中国語、日本語、韓国語、タイ語、ベトナム語などを含む29言語を対応言語として挙げています。一方、AI_PARSE_DOCUMENTのガイドには「AI_PARSE_DOCUMENT is trained for the following languages in both OCR and LAYOUT modes」とあり、続く一覧は中国語、英語、フランス語、ドイツ語、ヒンディー語、イタリア語、ノルウェー語、ポーランド語、ポルトガル語、ルーマニア語、ロシア語、スペイン語、スウェーデン語、トルコ語、ウクライナ語の15言語です。日本語はありません。日本語版ドキュメントはOCRモードとLAYOUTモードで別々の言語表を載せていますが、どちらの表にも日本語は含まれていません。エラー一覧には「Document contains language that is not supported.」というメッセージも定義されています。
ただし、日本語の決算資料をAI_PARSE_DOCUMENTで処理できたという利用者の検証記事は公開されています。「動かない」とは言い切れませんが、公式には保証されていない状態です。実務では次のように分けるのが安全です。
- 日本語の請求書・申込書から決まった項目を取る処理は、AI_EXTRACTに直接ファイルを渡す
- 日本語文書の全文をRAGや検索に使う処理は、AI_PARSE_DOCUMENTを自社の代表的な文書数十件で試し、欠落や誤認識の傾向を確認してから本番に入れる
- 日本語と英語・中国語が混在する文書も、文書全体でエラーや抽出欠落を確認し、対応言語の部分だけが確実に返るとは想定しない
日本語対応の判断には、現在の公式対応言語一覧と、対象文書での検証結果を使ってください。
東京リージョンでの提供状況
AI_EXTRACTのリファレンスとCortex AI関数のリージョン対応表では、AWS AP Northeast 1(東京)とAzure Japan East(東京、埼玉)のどちらにもAI_EXTRACTが提供済みとして記載されています。AI_PARSE_DOCUMENTのネイティブ提供リージョン表にはAWSのAsia Pacific (Tokyo)がありますが、Azure Japan Eastは載っていません。Azure Japan EastのアカウントでAI_PARSE_DOCUMENTを使う場合は、クロスリージョン推論を有効にします。
-- ACCOUNTADMIN で実行
ALTER ACCOUNT SET CORTEX_ENABLED_CROSS_REGION = 'ANY_REGION';
このパラメータはアカウント単位でしか設定できません。値はANY_REGIONのほか、クラウド単位・地域単位の指定やDISABLEDから選びます。社内規程で推論処理の越境が認められていない場合は、有効化の前に対象範囲を確認してください。
事前準備:権限とステージ
以下のSQLは公式リファレンスの構文に基づく例で、Snowflakeアカウント上での動作確認はしていません。ユーザー名・ステージ名・ファイル名は利用環境に合わせて置き換えてください。
AI関数を呼ぶには、アカウントレベルのUSE AI FUNCTIONS権限と、SNOWFLAKE.CORTEX_USERまたはSNOWFLAKE.AI_FUNCTIONS_USERデータベースロールの両方が必要です。どちらも既定でPUBLICロールに付与されているため、新規アカウントなら追加の設定なしで呼び出せます。利用者を絞る場合は、PUBLICから外したうえで関数単位の権限を付けます。
USE ROLE ACCOUNTADMIN;
REVOKE USE AI FUNCTIONS ON ACCOUNT FROM ROLE PUBLIC;
REVOKE DATABASE ROLE SNOWFLAKE.CORTEX_USER FROM ROLE PUBLIC;
CREATE ROLE doc_ai_role;
GRANT USE AI FUNCTION AI_PARSE_DOCUMENT ON ACCOUNT TO ROLE doc_ai_role;
GRANT USE AI FUNCTION AI_EXTRACT ON ACCOUNT TO ROLE doc_ai_role;
GRANT USE AI FUNCTION AI_CLASSIFY ON ACCOUNT TO ROLE doc_ai_role;
GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE doc_ai_role;
GRANT ROLE doc_ai_role TO USER example_user;
SNOWFLAKE.CORTEX_USERはユーザーに直接付与できないため、必ずロールを経由させます。
文書はステージに置き、TO_FILEでFILE型に変換して関数に渡します。TO_FILEの第1引数は'@stage_name'という形式の文字列で、クォートを落とすとエラーになります。ディレクトリテーブルを有効にしておくと、ステージ内の全ファイルを1本のクエリで処理できます。
CREATE STAGE doc_stage
DIRECTORY = (ENABLE = TRUE)
ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
-- PUT コマンドでファイルを置いたあと
ALTER STAGE doc_stage REFRESH;
SELECT TO_FILE('@doc_stage', 'invoice_001.pdf');
クライアント側暗号化のステージと、PrivateLinkなどで公開ネットワークからのステージアクセスを制限したアカウントへの対応は、2026年8月20日に一般提供になりました。
AI_PARSE_DOCUMENTの使い方
OCRモードとLAYOUTモードの選び方
構文はAI_PARSE_DOCUMENT(<file_object> [, <options>] [, <return_error_details>])です。modeを省略するとOCRモードになり、テキストだけを返します。LAYOUTモードは表や見出しの構造をMarkdownで保持します。公式ガイドは、ほとんどの用途、特に複雑な文書にはLAYOUTモードを推奨しています。OCRモードは、スキャンした契約書やマニュアルのように文字の多い文書を速く処理したいときに使います。
-- テキストだけ取り出す(既定の OCR モード)
SELECT AI_PARSE_DOCUMENT(
TO_FILE('@doc_stage', 'contract.pdf'),
{'mode': 'OCR'}
) AS ocr_result;
-- 表を Markdown で保持する
SELECT AI_PARSE_DOCUMENT(
TO_FILE('@doc_stage', 'annual_report.pdf'),
{'mode': 'LAYOUT', 'page_split': TRUE}
) AS layout_result;
料金はLAYOUTがOCRの約5.4倍です(後述)。表の数値を後段で使わない文書までLAYOUTで流すと費用がかさむため、文書の種類ごとにモードを分けてください。
page_splitとpage_filterによるページ分割・範囲指定
page_splitをTRUEにすると、結果がページごとの配列になります。この指定が使えるのはPDF、.pptx、.docxだけで、他の形式ではエラーになります。page_filterを使うと、処理するページを範囲で指定できます。範囲は0始まりで、startを含みendを含みません。page_filterを指定するとpage_splitも有効になるので、両方を書く必要はありません。
-- 1ページ目(index 0)だけを処理する
SELECT AI_PARSE_DOCUMENT(
TO_FILE('@doc_stage', 'research.pdf'),
{'mode': 'LAYOUT', 'page_filter': [{'start': 0, 'end': 1}]}
);
課金はページ数に比例するため、表紙だけで文書を分類したい場合はpage_filterで先頭ページに絞ると費用を抑えられます。この機能は2025年9月25日に追加されました。
出力JSONの構造とエラー詳細の取り方
page_splitが無効ならcontentが1つだけ返り、有効ならpages配列の各要素にcontentとindexが入ります。indexは0始まりで、文書に印刷されたページ番号とは関係ありません。関数リファレンスは、戻り値をSQLで扱う場合はPARSE_JSONで変換するよう案内しています。
ページ数(pageCount)の扱いには注意が要ります。関数リファレンスによると、pageCountなどのメタデータは既定の出力に含まれず、第3引数return_error_detailsにTRUEを渡したときに、最上位のmetadataとして返ります。ガイド側の実行例にはmetadataを含む出力が載っており、2つのページの記述は揃っていません。ページ数を使う処理では第3引数を付けておくと確実です。
WITH parsed AS (
SELECT
relative_path,
PARSE_JSON(TO_VARCHAR(AI_PARSE_DOCUMENT(
TO_FILE('@doc_stage', relative_path),
{'mode': 'LAYOUT', 'page_split': TRUE},
TRUE
))) AS r
FROM DIRECTORY(@doc_stage)
)
SELECT
relative_path,
r:metadata:pageCount::INT AS page_count,
r:error::STRING AS error_message,
p.value:index::INT AS page_index,
p.value:content::STRING AS page_text
FROM parsed,
LATERAL FLATTEN(input => r:value:pages, OUTER => TRUE) p;
第3引数を付けない場合、処理できなかった行はNULLになるだけで、クエリ全体は止まりません。大量のファイルを一括処理して一部だけNULLになったとき、原因をたどれなくなります。バッチ処理では第3引数をTRUEにして、errorを記録してください。ドキュメントに載っている主なエラーは、2,000ページ超過、ページサイズ10000×10000ピクセル超過、ファイルサイズ104857600バイト超過、ファイルへのアクセス権限不足、タイムアウトです。
画像の抽出(extract_images)
LAYOUTモードで'extract_images': TRUEを指定すると、文書に埋め込まれた画像がimages配列に入ります。各要素はid、左上と右下の座標、Base64文字列のimage_base64を持ちます。1文書から取り出せる画像は50枚までで、4×4ピクセル未満の画像は対象外です。画像を抽出しても追加の料金はかかりません。この機能は2026年4月30日に一般提供になりました。
公式ガイドには、取り出した画像をBASE64_DECODE_BINARYでバイナリに戻し、AI_EXTRACTのfile_data引数に渡して内容を説明させる例が載っています。図表を含む文書を検索対象にする設計はマルチモーダルRAGとは?図表・画像を検索する仕組みと実装方式の選び方で扱っています。
AI_EXTRACTの使い方
responseFormatの書き方
AI_EXTRACTは、テキストを渡すtextとファイルを渡すfileのどちらか一方を取ります。1回の呼び出しで両方は指定できません。何を取り出すかはresponseFormatで指定し、単一の値を取るエンティティ抽出には次の4つの書き方があります。
- ラベルと質問の組を並べたオブジェクト:
{'invoice_no': '請求書番号は?'} - 質問文だけの配列:
['請求書番号は?', '合計金額は?'] - ラベルと質問を2要素にした配列の配列:
[['invoice_no', '請求書番号は?']] schemaキーを持つJSONスキーマ('type': 'string')
質問文は自然文でなくてもかまいません。{'address': '都道府県、市区町村、番地'}のように、取り出したい情報を説明するだけでも動きます。
SELECT
relative_path,
AI_EXTRACT(
file => TO_FILE('@doc_stage', relative_path),
responseFormat => {
'invoice_no': '請求書番号は何ですか?',
'issue_date': '発行日はいつですか?',
'total': '税込の合計金額はいくらですか?',
'vendor': '請求元の会社名は何ですか?'
}
) AS extracted
FROM DIRECTORY(@doc_stage)
WHERE relative_path ILIKE 'invoice_%';
戻り値は{"error": null, "response": {...}}の形です。列に展開するときはextracted:response:total::STRINGのようにresponseの下を参照します。
表とリストの抽出
明細行のように複数の値を取る場合は、JSONスキーマで'type': 'array'を指定するとリストで返ります。表をそのまま取り出す場合は、サブオブジェクトに'type': 'object'とcolumn_orderingを指定し、各列を'type': 'array'のプロパティとして定義します。表の抽出は2025年10月16日の一般提供で追加されました。
SELECT AI_EXTRACT(
file => TO_FILE('@doc_stage', 'invoice_001.pdf'),
responseFormat => {
'schema': {
'type': 'object',
'properties': {
'line_items': {
'description': '請求明細の表',
'type': 'object',
'column_ordering': ['item', 'quantity', 'amount'],
'properties': {
'item': {'description': '品名', 'type': 'array'},
'quantity': {'description': '数量', 'type': 'array'},
'amount': {'description': '金額', 'type': 'array'}
}
}
}
}
}
);
スキーマ形式には3つの制約があります。schemaキーを使う場合は、すべての質問をスキーマの中に書く必要があり、他の形式とは混在できません。抽出値のスカラー型として使えるのは現在stringだけです。リストは文字列の配列、表は列ごとの文字列配列を持つオブジェクトとして定義します。column_orderingは大文字・小文字を区別し、propertiesの列名と一致させる必要があります。descriptionには文書中の表見出しを書くと、モデルが目的の表を見つけやすくなります。
scoresによる項目別・表全体の信頼度取得
名前付き引数でscores => TRUEを渡すと、responseと並んでscoringオブジェクトが返り、項目ごとに0から1のスコアが付きます。リストと表のスコアは全体で1つだけで、行やセルごとの値は取れません。スコアを付けても料金は変わりません。この機能は2026年5月22日に一般提供になりました。スコアが一定値を下回る行だけを人の確認に回す、という運用に使えます。
質問数・出力長・scale_factorの上限
1回の呼び出しで聞けるのは、エンティティ抽出なら100問、表抽出なら10問までです。表の質問1問はエンティティ10問として数えるため、たとえば表4問とエンティティ60問を同時に聞けます。回答の長さは、エンティティが1問あたり512トークン、表が4,096トークンまでです。
小さな文字やA4より大きいページで読み取りを誤る場合は、config => {'scale_factor': 2.0}のように1.0から4.0の範囲でページを拡大できます。ただし、拡大率に比例して消費トークンが増え、1文書で処理できるページ数は減ります。
| scale_factor | 1ページのトークン | 最大ページ数 |
|---|---|---|
| 1.0(既定) | 970 | 125 |
| 2 | 1,940 | 62 |
| 2.5 | 2,425 | 50 |
| 4 | 3,880 | 31 |
2つの関数を組み合わせる処理の流れ
様式の違う文書が混在する場合は、AI_PARSE_DOCUMENTで先頭ページだけを読み、AI_CLASSIFYで種類を判定してから、種類ごとにresponseFormatを変えたAI_EXTRACTを通します。公式ガイドにも、page_filterで1ページ目だけを取り出してAI_CLASSIFYに渡す例があります。
CREATE OR REPLACE TABLE doc_types AS
SELECT
relative_path,
AI_CLASSIFY(
TO_VARCHAR(AI_PARSE_DOCUMENT(
TO_FILE('@doc_stage', relative_path),
{'mode': 'OCR', 'page_filter': [{'start': 0, 'end': 1}]}
)),
['invoice', 'contract', 'purchase_order']
):labels[0]::STRING AS doc_type
FROM DIRECTORY(@doc_stage);
この流れでは、AI_EXTRACTの料金に加え、判定用の1ページを解析するAI_PARSE_DOCUMENTの料金と、分類に使うAI_CLASSIFYのトークン料金が発生します。すべてが同じ様式の請求書だと分かっているなら、AI_EXTRACTへ直接渡すほうが安く済みます。なお、日本語文書の先頭ページをAI_PARSE_DOCUMENTに読ませる処理は、前述のとおり公式の対応言語から外れます。日本語だけの文書群なら、ファイル名や格納フォルダで種類を分けるほうが確実です。
料金の見積もり
どちらの関数もAIクレジットで課金されます。AIクレジットはウェアハウスの計算に使うPlatform Creditとは別の単位で、Service Consumption Table(2026年9月16日発効版)によるオンデマンド単価はGlobalが2.00ドル、Regionalが2.20ドルです。Platform Creditの契約割引はAIクレジットには適用されない、と同表に明記されています。
| 処理 | 単価 | 1,000ページの目安 |
|---|---|---|
| AI_PARSE_DOCUMENT(OCR) | 0.68 AIクレジット/1,000ページ | 約1.36ドル |
| AI_PARSE_DOCUMENT(LAYOUT) | 3.66 AIクレジット/1,000ページ | 約7.32ドル |
| AI_EXTRACT | 5.55 AIクレジット/100万トークン | 約10.77ドル+質問と回答分 |
| AI_EXTRACT(ファインチューニング済み) | 9.14 AIクレジット/100万トークン | 約17.73ドル+質問と回答分 |
目安の列はGlobal単価の2.00ドルで計算しています。AI_EXTRACTはPDF・DOCX・TIF・TIFFの1ページを970トークンとして数えるので、1,000ページ分の入力は97万トークン、5.38クレジットになります。responseFormatの質問文も入力トークンに加算され、回答も出力トークンとして課金されるため、実額はこの目安より高くなります。scale_factorを2にすると、ページ分のトークンも2倍になります。
AI_PARSE_DOCUMENTでは、JPEG・PNGなどの画像は1ファイルで1ページ、HTMLとTXTは3,000文字ごとに1ページとして数えます。3,000文字に満たない末尾も1ページです。どちらの関数も、ウェアハウスはMEDIUM以下が推奨されています。大きくしても処理は速くならず、ウェアハウスの料金だけが増えます。
実績の確認にはSNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORYビューを使います。公式のコスト管理ガイドでは、文書処理の利用量もこのビューに集約されたとされ、データは2026年1月5日以降が入っています。以前のCORTEX_FUNCTIONS_USAGE_HISTORYはデータが2025年11月21日で止まっており、ページ数と文書数を持つCORTEX_DOCUMENT_PROCESSING_USAGE_HISTORYも廃止予定のビューとして記載されています。古い記事のクエリをそのまま使うと、最近の利用量が表示されません。
旧関数とDocument AIからの移行
AI_PARSE_DOCUMENTはSNOWFLAKE.CORTEX.PARSE_DOCUMENTの、AI_EXTRACTはSNOWFLAKE.CORTEX.EXTRACT_ANSWERの後継です。旧関数のリファレンスには、どちらにも「This legacy function will be deprecated by the end of 2026.」と書かれています。旧関数を使うパイプラインは、新関数への移行を計画してください。公式に示されているのは2026年末までの非推奨化予定であり、同年中の利用停止や移行必須期限ではありません。
Document AIのUIと!PREDICTメソッドは2026年3月16日に廃止されました。現在、特定の様式に合わせてモデルを調整するには、arctic-extractモデルのファインチューニング(2026年4月20日に一般提供)を使い、調整後のモデルをAI_EXTRACTから呼び出します。廃止の範囲と、移行済みモデルの扱いはSnowflake Document AIは2026年3月16日に廃止|AI_EXTRACTへの移行と現在の文書処理で解説しています。
SQLを書く前に試す場合は、SnowsightのDocument Processing Playground(2026年1月22日に一般提供)が使えます。ステージの文書をアップロードして両関数の結果を確認し、生成されたSQLをコピーできます。
Snowflake内で文書処理を組まないほうがよい場面
次のいずれかに当てはまる場合は、専用の文書解析サービスで処理し、結果だけをSnowflakeに取り込む構成を検討してください。
- 日本語文書の全文テキスト化が処理の中心で、公式の対応言語に入っていないことを受け入れられない場合
- 125ページを超える文書から項目を抜き出す必要があり、分割の前処理を入れられない場合(AI_EXTRACTの上限。
scale_factorを上げるとさらに減ります) - 文字位置の座標や、1文字ごとの信頼度が必要な場合(AI_EXTRACTのスコアは項目単位か、表全体で1つだけです)
外部サービスの選択肢については、Azure AI Document Intelligenceの料金・使い方・精度|文書解析AIを実務目線で解説や、OCRとは?光学文字認識の仕組み・種類・精度と実装での組み込み方を解説が参考になります。
よくある質問
AI_PARSE_DOCUMENTの料金はいくらですか?
1,000ページあたり、OCRモードが0.68 AIクレジット、LAYOUTモードが3.66 AIクレジットです(2026年9月16日発効のService Consumption Table)。オンデマンドのGlobal単価2.00ドルで換算すると、それぞれ約1.36ドルと約7.32ドルです。画像抽出を有効にしても追加料金はかかりません。
SnowflakeのAI_EXTRACTとは何ですか?
ステージ上のファイルまたはテキストから、responseFormatで指定した項目・リスト・表を抜き出してJSONで返すCortex AI関数です。2025年8月22日にプレビューとして公開され、2025年10月16日に一般提供になりました。前身はSNOWFLAKE.CORTEX.EXTRACT_ANSWERです。
PARSE_DOCUMENTとAI_PARSE_DOCUMENTの違いは何ですか?
AI_PARSE_DOCUMENTがSNOWFLAKE.CORTEX.PARSE_DOCUMENTの新しい版です。page_filterや画像抽出などの新機能はAI_PARSE_DOCUMENTに追加されています。旧関数は後方互換のために残されていますが、2026年末までに非推奨になる予定です。
AI_PARSE_DOCUMENTは日本語に対応していますか?
2026年9月17日時点で、公式ドキュメントの対応言語一覧(15言語)に日本語は含まれていません。日本語文書を処理できたという利用者の報告はありますが、公式の保証はありません。日本語帳票から項目を取り出すなら、対応言語に日本語を含むAI_EXTRACTを使ってください。
SnowflakeでOCRだけを使うことはできますか?
できます。AI_PARSE_DOCUMENTを{'mode': 'OCR'}で呼ぶと、レイアウトを保持せずテキストだけを返します。OCRモードは既定のモードで、料金もLAYOUTモードの約5分の1です。