NTT DATA TECH
🎉

Snowflake Document Processing Playgroundを触ってみた

に公開

はじめに

はじめまして。株式会社NTTデータグループ TC&S分野 DSS事業部の平手愛と申します。
2025年11月17日に、SnowflakeからDocument Processing PlaygroundがPreviewされました。
本記事では、このDocument Processing Playgroundを実際に触ってみた内容をご紹介します。
https://docs.snowflake.com/en/release-notes/2025/other/2025-11-17-document-processing-playground

この記事は、NTTデータ Snowflakeアドベントカレンダーの22日目です。
https://zenn.dev/nttdata_tech/articles/8069947063ca51

対象読者

  • AI_EXTRACT および AI_PARSE_DOCUMENT 関数の出力を試したいと考えている方
  • 文書の AI 抽出機能を Snowflake で試したい方
  • Snowflakeの新機能(Document Processing Playground)について知りたい方

Document Processing Playground とは

Document Processing Playground は、PDF や画像を Snowflake にアップロードするだけで、AI が文書を読み取り、要約・項目抽出・構造化などの処理をすぐに試せる環境です。具体的には、AI_EXTRACT関数 や AI_PARSE_DOCUMENT関数 を試し、 どんな JSON が返るのか知りたい方 や Snowflake の新しい文書処理機能をキャッチアップしたい方 に適しています。特に、従来の Document AI と異なり、固定のKEYに縛られない柔軟な抽出が可能です。

Document AIとの比較

観点 Document AI(旧) DPP(Cortex Playground)
目的 定型文書の構造化 LLMで文書理解を試すための検証環境
出力 固定KEY 質問に応じて KEY が変わる柔軟構造
利用方法 API/SQLベース UI上でファイルを投げて試す「実験用」
安定性 高い(スキーマ固定) 揺れやすい(プロンプト依存)
大量処理 本番で使える 少量検証向き

実際にDocument Processing Playground を触ってみた。

Document Processing Playgroundを触るための準備

  1. はじめに、Document Processing Playgroundで利用したい画像を内部ステージに格納する必要があるため、ステージを用意します。下記を実行しました。
    *「DIRECTORY = ( ENABLE = true )」を入れ忘れ、Document Processing Playground上にドキュメントが表示されませんでしたので注意してください💦
  DIRECTORY = ( ENABLE = true )
  ENCRYPTION = ( TYPE = 'SNOWFLAKE_SSE' );
REMOVE @HIRATE_POC_DB.HMPOC_SCHEMA.PLAYGROUND_RAW_STAGE;
  1. 次に、ステージにファイルを追加します。左側のメニューから、「データ追加>ステージにファイルをロード」から追加できます。

    今回利用するファイルは、MSCopilotを利用して作成した下記の請求書サンプルをPDFと画像ファイルで保存した「invoice.pdf」と「invoice.png」を利用します。
  2. AI StudioからDocument Processing Playgroundへ移動します。
  3. ステージから追加を押します。
  4. 画像を追加したステージを選択し、利用したい画像(最大10個)をDocument Processing Playgroundに追加します。以上で、Document Processing Playgroundを利用する準備が整いました。

実際にDocument Processing Playgroundを触る

  1. 画像ファイル「invoice.png」を選択し、実際に触ってみます。右側には、実際に取り込んだドキュメントが表示され、左側にプロンプトを入力できるようになっています。
  2. MarkdownとTextのタブを押してみると右の画像がそれぞれの形式に変換されています。

    しかし、テキスト形式は読みこめなかったようです。PDFファイルに選択ファイルを変え、同じように試します。
  3. PDFファイルの場合、Markdownファイル化もTEXT化も問題なく実施できました。画像ファイルとPDFファイルを試しましたが、TEXT形式に変換したい場合は、PDFファイルの方が適していそうです。
  4. 続いて、画面左側のプロンプトを試してみます。KEYには任意のKEYが入れることができます。今回は、「total_amount」を入力し、プロンプトに「支払いの合計金額は?」と記載し、質問しました。すると、ドキュメントに記載通りの合計金額が返ってきました。
  5. プロンプトの「リスト」を利用して投げてみます。質問に対して回答が複数含まれる場合、リスト型として返します。「List」を選択し、KEYを「companies」、質問を「請求書に記載の会社名を教えてください。」としたところ、実際に記載のある2社について返答が返ってきました。
  6. 請求書にテーブル形式が含まれているので、プロンプトの「テーブルを抽出」を利用してプロンプトを投げてみます。「テーブルを抽出」を選択し、KEYに「invoice_items」とし、コンテキストに「請求書の品目一覧テーブル」と記載しました。品目を商品名に変え、「商品名、数量、単位、単価、金額」というカラム名を設定し、プロンプトを投げます。

    ドキュメント通りの回答が返ってきました。問題なくテーブルについても抽出できています。
  7. Document Processing Playground上で投げかけたプロントに沿って、「AI_EXTRACT関数」では、JSON形式に変換してくれます。右上の「Open in Workspaces」ボタンをポチっと押すと、ワークシートに移動し、「AI_EXTRACT関数」を使ったSQLが表示されます。
-- AI_EXTRACT
SELECT
  AI_EXTRACT(
    file => TO_FILE(
      '@HIRATE_POC_DB.HMPOC_SCHEMA.PLAYGROUND_RAW_STAGE',
      'Invoice.pdf'
    ),
    responseFormat => PARSE_JSON(
      '{"schema":{"type":"object","properties":{"companies":{"description":"請求書に記載の会社名を教えてください。","type":"array","items":{"type":"string"}},"invoice_items":{"description":"請求書の品目一覧テーブル","type":"object","properties":{"単位":{"type":"array","items":{"type":"string"}},"単価":{"type":"array","items":{"type":"string"}},"商品名":{"type":"array","items":{"type":"string"}},"数量":{"type":"array","items":{"type":"string"}},"金額":{"type":"array","items":{"type":"string"}}},"column_ordering":["商品名","数量","単位","単価","金額"]},"total_amount":{"description":"支払いの合計金額は?","type":"string"}}}}'
    )
  ) AS extracted_data;
  1. 実際に実行すると、プロンプトで投げかけた際の「Key」に値を入れてJSON形式に変換してくれます。プロンプトを投げるだけでデータを抽出し、JSON化ができ、検証に便利だと思いました。また、プロンプトは、投げた後も修正することができます。実行してみて、構造化がうまくいかない場合、コードを書かずに何度でも試せるところが良い部分だと思いました。
{
  "error": null,
  "response": {
    "companies": [
      "デモクライアントA",
      "カ)ビジネスソリューションズ"
    ],
    "invoice_items": {
      "単位": [
        "式",
        "個",
        "月"
      ],
      "単価": [
        "15,000",
        "3,000",
        "2,280"
      ],
      "商品名": [
        "クラウド管理システム",
        "セキュリティパッチ",
        "サポートサービス"
      ],
      "数量": [
        "1",
        "3",
        "1"
      ],
      "金額": [
        "15,000",
        "9,000",
        "2,280"
      ]
    },
    "total_amount": "28,908"
  }
}
  1. ワークシートには、「AI_PARSE_DOCUMENT関数」を利用したSQLも記載されます。「AI_PARSE_DOCUMENT関数」では、指定したドキュメントのパース処理を実行します。モードが「LAYOUT」「OCR」の二つ存在しているため、実行結果の違いを見てみます。
    それぞれ実行SQLは以下です。modeの部分以外同じ条件となっています。
SELECT
  AI_PARSE_DOCUMENT(
    TO_FILE(
      '@HIRATE_POC_DB.HMPOC_SCHEMA.PLAYGROUND_RAW_STAGE',
      'Invoice.pdf'
    ),
    { 'mode': 'LAYOUT',
    'page_split': true }
  ) AS parsed_document;
-- PARSE_DOCUMENT (OCR)
SELECT
  AI_PARSE_DOCUMENT(
    TO_FILE(
      '@HIRATE_POC_DB.HMPOC_SCHEMA.PLAYGROUND_RAW_STAGE',
      'Invoice.pdf'
    ),
    { 'mode': 'OCR',
    'page_split': true }
  ) AS parsed_document;

実際に投げてみます。下記はLAYOUTモードの出力です。

{
  "metadata": {
    "pageCount": 1
  },
  "pages": [
    {
      "content": "# ご請求書\n\n**請求先** デモクライアントA\n\n〒100-0001 東京都千代田区丸の内1-1-1 担当: 山田 太郎 TEL: 03-1234-5678\n\n**件名:** Invaxベーシックプラン 9月利用分\n\n**請求書番号:** INV-202512-001 **発行日:** 2025年12月12日\n\n**下記の通りご請求申し上げます** 合計金額\n\n¥28,908\n\n**支払期限:** 2026年1月10日\n\n|  品目 | 数量 | 単位 | 単価(円) | 金額(円)  |\n| --- | --- | --- | --- | --- |\n|  クラウド管理システム | 1 | 式 | 15,000 | 15,000  |\n|  セキュリティパッチ | 3 | 個 | 3,000 | 9,000  |\n|  サポートサービス | 1 | 月 | 2,280 | 2,280  |\n|  **合計** |  |  | 26,280 |   |\n|  **消費税(10%)** |  |  | 2,628 |   |\n|  **合計** |  |  | 28,908 |   |\n\n**備考** 支払方法: 銀行振込 銀行名: みずほ銀行 / 支店: 渋谷支店 / 口座: 普通 1234567 / 名義: カ)ビジネスソリューションズ",
      "index": 0
    }
  ]
}

次にOCRモードの出力結果です。

{
  "metadata": {
    "pageCount": 1
  },
  "pages": [
    {
      "content": "ご 請 求 書\n請求先\nデモクライアントA\nデモクライアントA\n〒100-0001 東京都千代田区丸の内1-1-1\n担当: 山田 太郎\nTEL: 03-1234-5678\n件名: Invaxベーシックプラン 9月利用分\n請求書番号: INV-202512-001\n発行日: 2025年12月12日\n下記の通りご請求申し上げます\n合計金額\n¥28,908\n支払期限: 2026年1月10日\n品目 数量 単位 単価(円) 金額(円)\nクラウド管理システム 1 式 15,000 15,000\nセキュリティパッチ 3 個 3,000 9,000\nサポートサービス 1 月 2,280 2,280\n小計 26,280\n消費税(10%) 2,628\n合計 28,908\n備考\n支払方法: 銀行振込\n銀行名: みずほ銀行 / 支店: 渋谷支店 / 口座: 普通 1234567 / 名義: カ)ビジネスソリューションズ",
      "index": 0
    }
  ]
}

ドキュメントのテーブルで記載されていた部分が
LAYOUTモードではテーブルで保持されているのに対し、
OCRではテキストとして保持されるという違いを確認できました。

まとめ

記事では以下の内容を紹介しました。

  • Document Processing Playgroundの利用手順を確認
  • Document Processing Playgroundを実際に動かし、自然言語での質問・指示に対してドキュメントから適切な回答を得られることを確認
  • 「AI_EXTRACT関数」を用いて、Document Processing Playgroundで投げたプロンプトから、ドキュメントをJSON形式で構造化できることを確認
  • 「AI_PARSE_DOCUMENT関数」を用いて、ドキュメントをパースできることを確認

終わりに

実際に触ってみて感じたのは、Document Processing Playground の最大の魅力が
“とにかく試行が速い” ことです。
欲しい JSON 形式をその場で試しながら形にでき、
うまくいかなければすぐにプロンプトを調整し、
最適な構造を探っていけるというのが魅力に感じました。

コードを書く必要もなく、自分の文書を使ってすぐに検証できるため、
ビジネスユーザでも手軽に PoC を始められます。
今後の Snowflake における AI 機能の進化にも、ますます期待したいと思います。

参考

Document Processing Playground(Snowflakeドキュメント)
https://docs.snowflake.com/en/user-guide/snowflake-cortex/document-processing-playground

NTT DATA TECH
NTT DATA TECH
設定によりコメント欄が無効化されています