こんにちは、ハルミト・セニ です。
クラウドコンピューティング、機械学習、そしてコードを通じて現実世界の問題を解決することに情熱を注いでいます。最近、Snowflake Snow Pro Core Certificationを取得し、このブログを始めるきっかけとなりました。私の目標は、私が学んだことを共有し、複雑なトピックを分解し、Snowflakeの旅で他の人をサポートすることです。これからSnowflakeを始める方にも、すでにプロとして活躍されている方にも、このブログがお役に立ち、何かヒントが見つかることを願っています。
目次
1. Snowflakeとは?
Snowflake はクラウドデータプラットフォームです。より具体的には、クラウド上で構築された初のデータプラットフォームです。そのアーキテクチャにより、データスペシャリストはデータウェアハウスだけでなく、クラウドデータレイクハウスも構築できます。構造化データと非構造化データの両方を容易に管理できるためです。ストレージ、コンピューティング、クラウドサービスを分離し、各コンポーネントの独立したスケーリングと最適化を可能にする独自のアーキテクチャが特徴的です。この分離により、ユーザーはデータの保存やクエリの実行など、実際に使用したリソースに対してのみ料金を支払います。
2. Document AIとは?
Document AIは、独自の大規模言語モデル(LLM)であるArctic-TILTを使用してドキュメントからデータを抽出するSnowflakeのAI機能です。様々な形式のドキュメントを処理し、テキスト中心の段落だけでなく、ロゴ、手書きのテキスト(署名)、チェックマークなどのグラフィック形式のコンテンツからも情報を抽出します。Document AI を使用すると、請求書や財務諸表など、特定の種類の新しいドキュメントを継続的に処理するためのパイプラインを準備できます。
Document AI は、ゼロショット抽出と微調整の両方を提供します。ゼロショットとは、基礎モデルがドキュメントを初めて処理した場合でも、ドキュメントの種類に固有の情報を特定して抽出できることを意味します。これは、基礎モデルが大量の様々なドキュメントでトレーニングされているため、処理対象のドキュメントの種類を広く理解しているためです。
さらに、Snowflake Arctic-TILT モデルを微調整し、ユースケースに固有のドキュメントでモデルをトレーニングすることで、結果を改善できます。微調整されたモデル(使用されるトレーニングデータを含む)は、お客様のみが利用でき、他の Snowflake のお客様と共有されることはありません。
3. Document AI の使用
ステップ 1: 必要なオブジェクトと権限を設定する
開始するには、こちら をクリックして、必要なファイルをダウンロードしてください。
データはgithub から取得しており、サンプルの PDF 請求書が含まれていますが、必要に応じて独自のデータセットを使用することもできます。
Snowflake アカウントをお持ちでない場合は、こちら から作成できます。
注: サインアップには個人または会社のメールアドレスを使用できます。各アカウントは無料プランを 1 回のみ利用できます。アカウント作成時に、Enterprise バージョンを選択し、東京 リージョンのクラウドプロバイダーとして AWS を選択してください。また、400 ドル の無料クレジットを取得して、このチュートリアルを無料で受講できるようにしてください。
ウェアハウス、データベース、スキーマ、カスタムロールを作成する
Document AI で使用するウェアハウス、データベース、スキーマ、ロールを作成するには、以下の手順を実行します。
- カスタムロール
DOC_ROLEを作成し、必要な権限を割り当てます。
USE ROLE ACCOUNTADMIN; CREATE ROLE DOC_ROLE; GRANT DATABASE ROLE SNOWFLAKE.DOCUMENT_INTELLIGENCE_CREATOR TO ROLE DOC_ROLE;
- 現在のユーザーにカスタムロールを付与します。
GRANT ROLE DOC_ROLE TO USER <your_user_name>;
注: ユーザー名を取得するには、Snowflake で SELECT CURRENT_USER() クエリを実行してください。
- ウェアハウスとデータベースを作成し、作成したロールに
CREATE SCHEMA権限を割り当てます。
CREATE WAREHOUSE DOC_WH; -- DOC_ROLE ロールにウェアハウスへのアクセス権限を付与します。 GRANT USAGE、OPERATE、MODIFY ON WAREHOUSE DOC_WH TO ROLE DOC_ROLE; -- 使用するデータベースとスキーマを作成し、DOC_ROLE ロールにアクセス権限を付与します。 CREATE DATABASE DOC_DB; GRANT CREATE SCHEMA、MODIFY、USAGE ON DATABASE DOC_DB TO ROLE DOC_ROLE;
DOC_ROLEを使用してスキーマを作成します。
USE ROLE DOC_ROLE; -- DOCUMENT AI モデル、ステージなどのスキーマを作成します。 CREATE SCHEMA DOC_DB.DOC_SCHEMA; -- スキーマに対する USAGE 権限と snowflake.ml.document_intelligence 権限を明示的に付与します。 GRANT USAGE ON SCHEMA DOC_DB.DOC_SCHEMA to role DOC ROLE; GRANT CREATE snowflake.ml.document_intelligence on schema DOC_DB.DOC_SCHEMA to role DOC_ROLE;
- Document AI モデルをテストするためのファイルをアップロードするためのステージを作成します。
CREATE STAGE DOC_DB.DOC_SCHEMA.DOC_STAGE DIRECTORY = (enable = true) ENCRYPTION = (type = 'snowflake_sse');
ステップ 2: Document AI モデルビルドを作成する
Document AI モデルビルドを作成するには、次の手順に従います。
- ナビゲーション メニューで、[AI & ML] » [Document AI] を選択します。
- 先ほど作成したウェアハウス「DOC_WH」を選択します。 (選択ドロップダウンは右上隅の [ビルド] ボタンの横にあります)。
- [+ ビルド] を選択します。
- 表示されるダイアログで、モデルビルドの名前として「DOC_TEST_BUILD」と入力し、場所(データベースは「DOC_DB」、スキーマは「DOC_SCHEMA」)を選択します。
- [作成] を選択します。
(「指定されたデータベースとスキーマでビルドを作成できません。詳細についてはドキュメントをご確認ください。」というエラーが発生した場合は、role を ACCOUNTADMIN から DOC_ROLE に切り替えてください。選択メニューは、ユーザー名が表示されている左下隅にあります。)
Document AI モデルビルドにドキュメントをアップロードする
新しく作成した Document AI モデルビルドにドキュメントをアップロードするには、次の手順に従います。
DOC_TEST_BUILDモデルビルドで、Build Detailsタブを選択します。Upload documentsボタンをクリックします。Browseを選択し、ダウンロードしたフォルダから任意の 10 個のドキュメントをアップロードします。- [Upload] を選択します。
ここでは 10 個のファイルをアップロードしましたが、モデルの精度を高めるために、さらにファイルをアップロードすることもできます。 アップロードが完了すると、次のような画面が表示されます。

ステップ 3: データ値を定義し、結果を確認する
Document AI モデルビルドの値を定義するには、以下の手順に従います。
DOC_TEST_BUILDモデルビルドで、「ビルド詳細」タブを選択します。- 「値の定義」を選択します。
- 右側に値を追加するためのボタンがあるドキュメントビューが表示されます。
- ドキュメントレビュービューで、「+ 値」を選択します。
- 各ドキュメントについて、値の「名前」と「質問」のペアを入力します。
- 各ドキュメントとデータ値について、モデルが提示する回答を確認します。
- 回答が正しい場合は、「チェックマーク」を選択します。
- 回答が間違っている場合は、「正しい値を手動で入力」します。
私のユースケースでは、値の「名前」と「質問」のペアは次のように定義されています。
| Sr | 値の名前 | 質問 |
|---|---|---|
| 1 | CLIENT | クライアントは誰ですか? |
| 2 | SHIPPING_ADDRESS | 配送先住所は何ですか? |
| 3 | TOTAL | 合計金額はいくらですか? |
| 4 | DISCOUNT | 割引額はいくらですか? |
| 5 | ITEM_NAME | 商品名は何ですか? |
注: 割引額を入力すると、(10%) というレスポンスが返されました。ただし、割引率ではなく割引額が必要です。そのため、モデルの回答に満足できない場合は編集できます。
変更前:

変更後:

完了したら、「すべて承認して次へ」ボタンをクリックして、他のすべてのドキュメントについても同じ質問を確認します。
(注: 「すべて承認して次へ確認」ボタンをクリックできない場合は、すべての値に緑色の 1.00 のボックスが表示され、既にそれらの値が承認されていることを示します。)
すべてのドキュメントの値を受け入れると、「ドキュメント」タブは次のようになります。

ステップ 4: Document AI モデルビルドを公開する
モデルビルドを公開するには、次の手順を実行します。
- 「DOC_TEST_BUILD」モデルビルドで、「ビルドの詳細」タブを選択します。
- 「モデルの精度」で、「バージョンの公開」を選択します。
- 表示されるダイアログで、「公開」を選択して確定します。
- 下に表示される「抽出クエリ」をコピーして、どこかに保存しておきます。
例えば、私の抽出クエリは次のようになります。
SELECT DOC_DB.DOC_SCHEMA.DOC_TEST_BUILD!PREDICT( GET_PRESIGNED_URL(@<stage_name>, '<relative_file_path>'), 1);
参考までに、Build Details タブは以下のようになります。

注: モデルの精度と結果が満足のいくものでない場合は、必要に応じてモデルを微調整して改善することができます。モデルの評価とトレーニングの詳細については、Document AI モデルの評価 をご覧ください。
ステップ 5: Document AI モデルビルドのテスト
モデルをテストするために、1000 ドキュメントフォルダからランダムにドキュメントを選択し、最初に作成した Snowflake ステージにアップロードしました。
Snowflake ステージにドキュメントをアップロード
ステージにファイルをアップロードするには、次の手順に従います。
- [データ] > [データの追加] を選択します。
- [データの追加] ページで、[ファイルをステージにロード] を選択します。
- 表示される [ファイルのアップロード] ダイアログで、アップロードするファイルを選択します。複数のファイルを同時にアップロードできます。
- ステージを作成したデータベーススキーマを選択し、ステージを選択します。
- [アップロード] を選択します。
以下の画像を参考にしてください。
1] Snowsightからデータを追加

2] ファイルをアップロード

モデル構築のテスト
ワークシートにコピーした抽出クエリを使用してドキュメントをクエリし、回答を取得します。このステージにはファイルが1つしかアップロードされていないため、単一ファイルクエリを使用します。 Build Details タブの 2 番目の抽出クエリを使用して、ステージ内のすべてのファイルをクエリすることもできます。
SELECT DOC_DB.DOC_SCHEMA.DOC_TEST_BUILD!PREDICT( GET_PRESIGNED_URL(@<stage_name>, '<relative_file_path>'), 1);
<relative_file_path> を取得するには、[Data] » [Databases] » [DOC_DB] » [DOC_SCHEMA] » [Stages] » [DOC_STAGE] でステージに移動してください。

ファイル名をコピーします。例:私の場合は invoice_Sh****y S****dt_14495.pdf です。
クエリエディタでクエリを実行します。
SELECT DOC_DB.DOC_SCHEMA.DOC_TEST_BUILD!PREDICT( GET_PRESIGNED_URL(@DOC_STAGE, 'invoice_Sh****y S****dt_14495.pdf'), 1);
上記のクエリを実行した結果、以下のレスポンスが返されました。
{
"CLIENT": [
{
"score": 0.983,
"value": "Sh****y S****dt"
}
],
"DISCOUNT": [
{
"score": 0.35,
"value": "(50%)"
}
],
"ITEM_NAME": [
{
"score": 0.907,
"value": "S***o C***ic B****a**, Traditional Bookcases, Furniture, FUR-BO-5763"
}
],
"SHIPPING_ADDRESS": [
{
"score": 0.906,
"value": "G****n G****en, Netherlands"
}
],
"TOTAL": [
{
"score": 0.876,
"value": "$4,012.61"
}
],
"__documentMetadata": {
"ocrScore": 0.92
}
}
注: スコアは信頼度、値は回答を表します。
ステップ 6: モデルの再トレーニング
割引値が期待値ではなく (50%) になっていることがわかります。これは、トレーニングが10件のドキュメントのみで行われたためです(DISCOUNT キーの score 値を参照)。Build Details タブの train ボタンをクリックするとモデルを微調整でき、その後、新しい Extracting Query を使用してクエリを実行できます。
「Train」ボタンをクリックしてモデルのトレーニングを完了すると、ビルドバージョンが 1 から 2 に増加します。
新しいクエリを実行します:
SELECT DOC_DB.DOC_SCHEMA.DOC_TEST_BUILD!PREDICT( GET_PRESIGNED_URL(@DOC_STAGE, 'invoice_Sh****y S****dt_14495.pdf'), 2);
ビルドバージョンが 1 から 2 に変更されていることに注意してください。
結果は次のとおりです。
{
"CLIENT": [
{
"score": 0.998,
"value": "Sh****y S****dt"
}
],
"DISCOUNT": [
{
"score": 1,
"value": "$3,943.35"
}
],
"ITEM_NAME": [
{
"score": 1,
"value": "S***o C***ic B****a**, Traditional Bookcases, Furniture, FUR-BO-5763"
}
],
"SHIPPING_ADDRESS": [
{
"score": 1,
"value": "G****n G****en, Netherlands"
}
],
"TOTAL": [
{
"score": 1,
"value": "$4,012.61"
}
],
"__documentMetadata": {
"ocrScore": 0.92
}
}
ここでは、Define Values セクションで指定した値でモデルをトレーニングしたため、パーセンテージではなく割引値を取得できました。したがって、Document AI は、ドキュメントで AI-OCR を使用し、SQL クエリからその情報を抽出するための、Snowflake の非常に優れたサービスと言えます。
次のコマンドを実行してクリーンアップします。
DROP SCHEMA DOC_SCHEMA; USE ROLE ACCOUNTADMIN; DROP DATABASE DOC_DB; DROP ROLE DOC_ROLE; DROP WAREHOUSE DOC_WH;
Document AI からもビルドを削除してください。これにより、Snowflake アカウントのコストを節約できます。
4. 結論
まとめると、SnowflakeのDocument AIは、自然言語を用いて質問への回答を取得し、段階的に未知のドキュメントをクエリするために使用できます。さらに、データパイプラインを作成して、新しく追加された各ファイルを処理し、結果を通常のリレーショナルテーブルと同様に分析用テーブルに保存できます。これにより、SnowflakeのAI機能によって、非構造化データに対して構造化データであるかのようにクエリを実行できます。
Author:
Harmit Saini
JTP Co., Ltd.
