Snowflake AI_EXTRACT入門|EXTRACT_ANSWERとの違いと文書抽出の使い方

Snowflake AI_EXTRACT入門のアイキャッチ図解。EXTRACT_ANSWERとの機能差や使い分け、PDFなど非構造化ドキュメントから情報をフィールド指定で抽出する流れを示し、文書抽出の基本ワークフローを直感的に把握できる構成イメージ Snowflake
この記事をシェアする𝕏B!FacebookLINEPocket

はじめに:新規実装なら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_EXTRACTEXTRACT_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を使い typearray にします。

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で抽出できます。まずは少量データで検証し、権限・リージョン・コスト・ガバナンスを確認しながら実務利用へ広げていきましょう。

参考リンク

関連記事

この記事をシェアする𝕏B!FacebookLINEPocket