ビジネス活動のコンテキストレイヤーのアクティブ化:ドキュメント

ドキュメントは、ビジネスを遂行するうえで不可欠な要素です。ドキュメントは、業務の主要なインターフェイスとして、またほぼすべてのビジネス活動のコンテキストレイヤーとして機能します。計画、すり合わせ、詳細な分析、承認、実行のすべてのプロセスにおいて、テキスト、スライド、スプレッドシートなどの膨大な記録が生成されます。
しかし、新しい調査結果、市場分析、臨床記録、斬新なアイデアが即座にドキュメント化される一方で、従来のデータスタックや処理ツールでは、それらの意味を正確に理解することは困難です。たとえば、新しいベンダーから請求書が届きます。法務部門は、契約書から免責条項を検索します。株式調査部門は、収益報告書を比較してトレンドを特定します。従来のツールでは、多くの企業がビジネスプロセスの自動化を安心して任せられるほどの高い精度で、このドキュメントデータをデジタル化することは困難な場合が多々あります。
だからこそ、ドキュメントをファーストクラスのデータとして扱う、Snowflakeネイティブのドキュメントインテリジェンス機能が開発されました。本記事では、組織がSnowflake Cortex AI関数を使用して、1日あたり数十万件のドキュメントを処理できる規模のドキュメントインテリジェンスワークフローを構築する方法について解説します。
ビジネス成果を促進する3つのパターン
Cortex AI関数は、従業員やユーザーが情報をより迅速に見つけられるように支援するエンタープライズ検索アプリケーションの基盤となるように設計されており、ドキュメントからデータを抽出してビジネスプロセスを自動化し、大規模なドキュメントライブラリ全体でより詳細な調査や分析を可能にします。

ナレッジのアクティブ化
一見すると、検索アプリケーションの構築は簡単そうに思えますが、実際のエンタープライズドキュメントに直面するとその難しさに気づきます。収益報告書には、テーブル、チャート、脚注、複雑なレイアウトが含まれています。契約書は数百ページに及び、条項は複数のセクションや付録にまたがっています。医療フォームには、構造化フィールド、手書きのメモ、スキャンされた画像が混在しています。ここでの課題は、情報を検索することではなく、まずすべてのドキュメントをAIが正確に理解できるデータに変換することです。
AI_PARSE_DOCUMENTは、企業がドキュメントをデータに変換するための基盤となります。デジタルドキュメントやスキャンしたドキュメントのテキスト表現のみが必要な場合は、OCRモードでスキャンしたドキュメントや画像からテキストを抽出できます。しかし、エンタープライズ検索、RAG、エージェントベースのアプリケーションにおいては、多くの場合、構造自体が意味を持ちます。LAYOUTモードでは、ドキュメントの元の構造が保持されるため、後続のAIシステムは、ドキュメント本来の読み取り順序を維持したまま、検索、推論、回答の生成を行うことができます。これには、複雑なマルチカラムレイアウトでの読み取り順序の保持、テーブル構造の抽出、視覚的な階層の維持、チャート、図、その他のグラフィック要素の埋め込み画像のキャプチャが含まれます。
その結果、正確な検索に必要なコンテキストを保持した構造化ドキュメントデータが得られます。組織は、フラット化されたテキストストリームをインデックス化するのではなく、Cortex Searchを使用して、複雑なドキュメント全体で意味を保持するために必要な構造情報とともにコンテンツを検索できます。Cortex Searchは、ドキュメントコーパス全体から最も関連性の高いセクションを検索し、組織独自のコンテンツに基づいて回答を生成します。ワークフローは完全にSnowflake内で実行されるため、エンタープライズデータに適用されるのと同じガバナンスとアクセス制御によって、ユーザーが検索および取得できる内容も決定されます。
ビジネスプロセスの自動化
日々のビジネスにおいて、請求書、契約書、請求フォーム、発注書、税務書類などが絶えず流入する場合、手作業によるデータ入力はすぐにボトルネックとなります。多くの場合、これらのワークフローは、担当者が手作業でドキュメントを読み、必要な情報を見つけて後続のシステムに入力することから始まると企業から伺っています。エンタープライズ規模では、このプロセスはコストがかかり、監査が困難であり、多くの場合、ビジネスの運用スピードを制限する要因となります。
Snowflakeは、大量かつ高品質なドキュメント抽出をネイティブに処理します。AI_EXTRACTを使用すると、ベンダー名、請求日、合計金額、支払い条件、明細など、必要なフィールドを平易な英語で記述でき、後続のアナリティクス、コンプライアンス、自動化ですぐに使用できる構造化JSONが返されます。抽出された各フィールドには信頼度スコアが含まれており、信頼度の低い結果を元のドキュメントと照らし合わせてレビューおよび検証できる、ヒューマンインザループのワークフローが可能になります。多種多様なドキュメントタイプを処理する組織の場合、AI_CLASSIFY(パブリックプレビュー)がトラフィックコントローラーとして機能し、異なるドキュメントを異なるAIパイプラインに自動的にルーティングできます。
その結果、ドキュメントを運用データに変換する、信頼性の高い抽出パイプラインが実現します。信頼度の高い抽出結果は自動的に処理され、信頼度の低い結果はレビューに回されます。特殊なドキュメント形式、業界固有の用語、コンプライアンスに敏感なワークフローの場合、Snowflake内で直接AI_EXTRACTをファインチューニングして、抽出精度をさらに向上させることができます。
ドキュメント全体にわたる詳細なアナリティクス
価値は単一のドキュメント内に隠されているとは限りません。数百、数千のドキュメント間で情報を結び付けることで、価値が明らかになることもあります。たとえば、株式調査アナリストは、成長トレンドを特定するために、業界全体の収益報告書を比較する必要があるかもしれません。製薬会社は、競争環境を理解するために、臨床試験や規制当局への提出書類をレビューする必要があるかもしれません。課題は情報を見つけることではなく、ドキュメントコーパス全体にわたって情報を統合することです。
これを実現するために、お客様はAI_PARSE_DOCUMENTを使用し、分析に必要なテキスト、テーブル、画像、レイアウトを保持したまま、大規模なドキュメントコレクションを構造化データに変換しています。次に、AI_COMPLETEは、そのコレクション全体にLLMの推論を適用します。タスクが、調査結果の要約、ドキュメントの比較、トレンドの特定、複雑な言語の解釈、あるいは複数のソースにまたがる情報を結びつけるマルチホップな質問への回答のいずれであっても対応します。その後、AI_EMBEDを使用してこれらの要約をベクトルに変換し、意味の類似性によってドキュメントをクラスター化することで、ドキュメントコーパス内の主要なテーマを抽出できます。
その結果、ドキュメントコレクションを実用的なインサイトに変換する、リサーチおよびアナリティクスパイプラインが構築されます。ヘルスケア組織は、何千もの臨床研究ドキュメントにわたる長期的なビューを生成し、アナリストや研究者が大規模に調査結果を統合するのを支援できます。一方、金融アナリストは、手動での分析よりも効率的に、レポートや提出書類の大規模なコレクションからトレンド、リスク、機会を抽出できます。
本番環境に向けたスケーリング
10個のファイルでドキュメントのユースケースが機能することを証明するのは簡単です。エンタープライズにおける真の課題は、そのボリュームにあります。エンジニアリングパイプラインを破綻させることなく、毎日何十万ものドキュメントを処理するために、これをどのように本番環境に導入するかが問題となります。
Snowflakeは、ダイナミックテーブルを活用することでこれを簡素化します。複雑に広がるオーケストレーションシステムを構築する代わりに、ドキュメントデータをどのように処理し、データをどの程度最新の状態に保つかを定義するデータパイプラインを表現する、1つ以上の宣言型SQLステートメントを記述します。Snowflakeは、スケジューリングとリフレッシュのオーケストレーションを自動的に処理します。
追跡している企業の年次報告書を継続的に取り込んでいる戦略チームを例に挙げます。新しい提出書類が届くたびに、各ドキュメントから構造化データを抽出し、アナリストの要約を生成し、戦略的テーマごとに企業をクラスター化して、業界のパターンに当てはまらない投資を行っている企業を抽出したいと考えています。
新しいCortex Code(CoCo)のai-functions-pipeline-builderスキルを使用して簡単に実行できるパイプラインは、3つのCortex AI関数を組み合わせています。
- AI_PARSE_DOCUMENTは、テーブル、見出し、読み取り順序を保持したまま、各年次報告書のPDFを構造化テキストに変換します。
- AI_EXTRACTは、戦略テーマ、成長イニシアチブ、逆風、収益、会計年度など、名前付きフィールドをドキュメントから抽出します。
- AI_COMPLETEは、各企業を戦略、財務実績、見通し、差別化にわたる4つのアナリストの側面に分類し、明示的にラベル付けされていないコンテンツを含むドキュメントのテキスト全体から、リスクと機会を個別に推論します。
- AI_EMBEDは、各企業の要約をベクトルに変換します。これにより、意味の類似性によって企業をクラスター化し、コーパス全体から名前付きテーマや外れ値を発見できるようになります。どのテーマにも明確に当てはまらない戦略を持つ企業が自動的に抽出されます。
CoCoが生成したSQLコード
-- ── Step 1 | Parse annual reports ──────────────────────────────────────────
-- Note: Setting the refresh mode to "incremental" guarantees that each incoming document is processed only once.
CREATE OR REPLACE DYNAMIC TABLE DT_ESR_PARSED
TARGET_LAG = DOWNSTREAM WAREHOUSE = SNOWADHOC REFRESH_MODE = INCREMENTAL
AS
SELECT
SPLIT_PART(SPLIT_PART(fl.RELATIVE_PATH, '/', -1), '.', 1) AS COMPANY,
fl.RELATIVE_PATH,
AI_PARSE_DOCUMENT(
TO_FILE('@ESR_DOCS_STAGE', fl.RELATIVE_PATH),
{'mode': 'LAYOUT'}
) AS RAW_PARSE
FROM ESR_FILE_LOG fl
WHERE fl.RELATIVE_PATH ILIKE '%.pdf';
-- ── Step 2 | Extract structured fields ─────────────────────────────────────
CREATE OR REPLACE DYNAMIC TABLE DT_CONS_EXTRACTED
TARGET_LAG = DOWNSTREAM WAREHOUSE = SNOWADHOC REFRESH_MODE = INCREMENTAL
AS
WITH full_text AS (
SELECT COMPANY, RELATIVE_PATH,
LISTAGG(f.value:content::STRING, '\n') WITHIN GROUP (ORDER BY f.index) AS DOC_TEXT
FROM DT_ESR_PARSED, LATERAL FLATTEN(input => RAW_PARSE:pages) f
GROUP BY COMPANY, RELATIVE_PATH
)
SELECT
COMPANY, RELATIVE_PATH,
AI_EXTRACT(
text => LEFT(DOC_TEXT, 120000),
responseFormat => {'schema': {'type': 'object', 'properties': {
'title': {'type': 'string', 'description': 'Company name and fiscal year'},
'fiscal_year': {'type': 'string', 'description': '4-digit fiscal year'},
'revenue': {'type': 'string', 'description': 'Total revenue with currency'},
'strategy_themes': {'type': 'array', 'description': 'Top strategic priorities'},
'growth_initiatives': {'type': 'array', 'description': 'Key growth programs and investments'},
'headwinds': {'type': 'array', 'description': 'Key challenges and risks'}
}}}
) AS RAW_EXTRACT
FROM full_text;
-- ── Step 3 | Summarize + embed each company ─────────────────────────────────
CREATE OR REPLACE DYNAMIC TABLE DT_CONS_EMBEDDED
TARGET_LAG = DOWNSTREAM WAREHOUSE = SNOWADHOC REFRESH_MODE = INCREMENTAL
AS
WITH summarised AS (
SELECT COMPANY, RELATIVE_PATH, RAW_EXTRACT,
AI_COMPLETE(
'claude-sonnet-4-5',
PROMPT('Summarise this company''s annual report into 4 JSON fields:
strategy, financial_performance, outlook, differentiation.\n\n{0}',
'company: ' || COALESCE(RAW_EXTRACT:response:title::STRING, COMPANY) || '\n' ||
'themes: ' || COALESCE(ARRAY_TO_STRING(RAW_EXTRACT:response:strategy_themes::ARRAY, '; '), '') || '\n' ||
'headwinds: ' || COALESCE(ARRAY_TO_STRING(RAW_EXTRACT:response:headwinds::ARRAY, '; '), '')
),
response_format => {'type': 'json', 'schema': {'type': 'object', 'properties': {
'strategy': {'type': 'string'},
'financial_performance': {'type': 'string'},
'outlook': {'type': 'string'},
'differentiation': {'type': 'string'}
}}}
) AS SUMMARY_JSON
FROM DT_CONS_EXTRACTED
)
SELECT
COMPANY, RELATIVE_PATH,
RAW_EXTRACT:response:title::STRING AS TITLE,
RAW_EXTRACT:response:fiscal_year::STRING AS FISCAL_YEAR,
RAW_EXTRACT:response:revenue::STRING AS REVENUE,
SUMMARY_JSON:strategy::STRING AS S_STRATEGY,
SUMMARY_JSON:financial_performance::STRING AS S_FINANCIAL_PERFORMANCE,
SUMMARY_JSON:outlook::STRING AS S_OUTLOOK,
SUMMARY_JSON:differentiation::STRING AS S_DIFFERENTIATION,
TRIM(CONCAT_WS(' ',
COALESCE(SUMMARY_JSON:strategy::STRING, ''),
COALESCE(SUMMARY_JSON:outlook::STRING, ''),
COALESCE(SUMMARY_JSON:differentiation::STRING, '')
)) AS SUMMARY_TEXT,
AI_EMBED('snowflake-arctic-embed-l-v2.0', TRIM(CONCAT_WS(' ',
COALESCE(SUMMARY_JSON:strategy::STRING, ''),
COALESCE(SUMMARY_JSON:outlook::STRING, ''),
COALESCE(SUMMARY_JSON:differentiation::STRING, '')
))) AS SUMMARY_VEC
FROM summarised;
-- ── Step 4 | Discover strategic themes across the corpus ────────────────────
CREATE OR REPLACE TABLE CONS_THEMES AS
WITH themes AS (
SELECT AI_COMPLETE(
'claude-sonnet-4-5',
PROMPT('Identify 4-5 distinct strategic themes that organise these companies.
Each needs a short name and one-sentence description.\n\n{0}',
LISTAGG(COMPANY || ': ' || S_STRATEGY, '\n')),
response_format => {'type': 'json', 'schema': {'type': 'object', 'properties': {
'themes': {'type': 'array', 'items': {'type': 'object', 'properties': {
'name': {'type': 'string'},
'description': {'type': 'string'}
}}}
}}}
) AS RAW FROM DT_CONS_EMBEDDED
)
SELECT
f.index AS THEME_ID,
f.value:name::STRING AS THEME_NAME,
f.value:description::STRING AS THEME_DESC,
AI_EMBED('snowflake-arctic-embed-l-v2.0',
f.value:name::STRING || ': ' || f.value:description::STRING) AS THEME_VEC
FROM themes, LATERAL FLATTEN(input => RAW:themes) f;
CoCoが生成したStreamlitアプリケーション

結論
長年にわたり、ドキュメントはデータプラットフォームの外部に存在していたため、組織がそこに含まれる情報を検索、分析、自動化する方法は制限されていました。Cortex AI関数を使用することで、ドキュメントはデータとなり、エンタープライズ規模で検索、自動化、アナリティクス、AIアプリケーションを強化できるようになります。
エンタープライズ検索を通じたナレッジのアクティブ化、構造化された抽出を通じたドキュメント主導のビジネスプロセスの自動化、または大規模なドキュメント分析を通じたインサイトの生成のいずれが目標であっても、Cortex AI関数がその基盤を提供します。その後、そのインテリジェンスは、Snowflake CoWork、Cortex Agents、Cortex Code、またはSnowflake上に構築されたカスタムアプリケーションなどのエクスペリエンスを通じて活用できます。
コアドキュメントインテリジェンスAI関数の概要
| 部門 | 機能 | アプリケーションへの影響 |
|---|---|---|
| AI_PARSE_DOCUMENT | テーブルとレイアウトを保持したまま、PDF、画像、Officeドキュメントを構造化テキストに変換 | 検索、RAG、アナリティクス、後続のAIワークフローのための忠実度の高い基盤を作成 |
| AI_EXTRACT | 自然言語スキーマを使用して、構造化フィールド、テーブル、エンティティを抽出 | ドキュメント主導のプロセスを自動化し、ドキュメントを運用データに変換 |
| AI_CLASSIFY | 後続処理のために、タイプに基づいてドキュメントをルーティングおよび分類 | 適切なワークフロー、モデル、またはビジネスプロセスにコンテンツをルーティング |
| AI_COMPLETE | 詳細な分析とドキュメント横断的なインサイトのための汎用LLM推論 | 要約、分析、リサーチ、複数ドキュメントの推論、インサイトの生成を強化 |