Layout Parser でドキュメントを処理する

レイアウト パーサーは、テキスト、表、リストなどのドキュメント コンテンツ要素を抽出し、生成 AI や検索アプリケーションでの情報検索を容易にするコンテキスト アウェア チャンクを作成します。

レイアウト パーサーの機能

  • ドキュメント レイアウトを解析します。Layout Parser に HTML ファイルまたは PDF ファイルを入力して、テキスト ブロック、表、リストなどのコンテンツ要素や、タイトルや見出しなどの構造要素を識別できます。これらの要素は、リッチ コンテンツと構造要素を含むドキュメントの構成と階層を定義するのに役立ちます。これらの要素は、情報検索と検出のコンテキストをより多く作成できます。

  • ドキュメントをチャンクします。レイアウト パーサーは、元のドキュメントのレイアウト階層に関するコンテキスト情報を保持するチャンクにドキュメントを分割できます。回答生成 LLM は、チャンクを使用して関連性を高め、計算負荷を軽減できます。

    チャンク化の際にドキュメントのレイアウトを考慮すると、セマンティックな一貫性が向上し、検索や LLM 生成に使用される際のコンテンツのノイズが軽減されます。チャンク内のすべてのテキストは、見出し、小見出し、リストなどの同じレイアウト エンティティから取得されます。

制限事項

次の制限が適用されます。

  • オンライン処理:
    • すべてのファイル形式で入力ファイルの最大サイズは 20 MB
    • PDF ファイルあたりの最大ページ数: 15 ページ
  • バッチ処理:
    • PDF ファイルの最大単一ファイルサイズは 40 MB
    • PDF ファイルあたりの最大ページ数: 500

ファイルタイプごとのレイアウト検出

次の表に、ドキュメントのファイル形式別に Layout Parser が検出できる要素を示します。

ファイル形式 MIME タイプ 検出された要素 制限事項
HTML text/html 段落、表、リスト、タイトル、見出し、ページ ヘッダー、ページ フッター 解析は HTML タグに大きく依存するため、CSS ベースの書式設定はキャプチャされない可能性があります。
PDF application/pdf 段落、表、タイトル、見出し、ページ ヘッダー、ページ フッター 複数ページにまたがる表は、2 つの表に分割されることがあります。
DOCX(プレビュー application/vnd.openxmlformats-officedocument.wordprocessingml.document 段落、複数ページにわたる表、リスト、タイトル、見出しの要素 ネストされたテーブルはサポートされていません。
PPTX(プレビュー application/vnd.openxmlformats-officedocument.presentationml.presentation 段落、表、リスト、タイトル、見出しの要素 見出しを正確に識別するには、PowerPoint ファイル内で見出しとしてマークする必要があります。ネストされた表と非表示のスライドはサポートされていません。
XLSX(プレビュー application/vnd.openxmlformats-officedocument.spreadsheetml.sheet Excel スプレッドシート内のテーブル。INTFLOATSTRING の値をサポート 複数のテーブルの検出はサポートされていません。非表示のシート、行、列も検出に影響する可能性があります。
XLSM(プレビュー application/vnd.ms-excel.sheet.macroenabled.12 マクロが有効なスプレッドシート。INTFLOATSTRING の値をサポート 複数のテーブルの検出はサポートされていません。非表示のシート、行、列も検出に影響する可能性があります。

始める前に

レイアウト パーサーをオンにする手順は次のとおりです。

  1. プロセッサの作成と管理の手順に沿って、レイアウト パーサーを作成します。

    プロセッサのタイプ名は LAYOUT_PARSER_PROCESSOR です。

  2. プロセッサを有効にするの手順に沿って、レイアウト パーサーを有効にします。

Layout Parser を使用してオンライン プロセス リクエストを送信する

  1. レイアウト パーサーに入力ドキュメントを渡して、解析とチャンク処理を行います。

    処理リクエストを送信するのバッチ処理リクエストの手順に沿って操作します。

    ProcessDocumentRequestProcessOptions.layoutConfig でフィールドを構成します。

    REST

    リクエストのデータを使用する前に、次のように置き換えます。

    • LOCATION: プロセッサのロケーション(例:
      • us - 米国
      • eu - 欧州連合
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • PROCESSOR_ID: カスタム プロセッサの ID。
    • MIME_TYPE: レイアウト パーサーは application/pdftext/html をサポートしています。
    • DOCUMENT: チャンクに分割するコンテンツ。レイアウト パーサーは、生の PDF ドキュメントまたは HTML ドキュメント、またはレイアウト パーサーによって出力された解析済みドキュメントを受け入れます。
    • CHUNK_SIZE: 省略可。ドキュメントの分割時に使用するチャンクサイズ(トークン単位)。
    • INCLUDE_ANCESTOR_HEADINGS: 省略可。ブール値。ドキュメントを分割するときに上位の見出しを含めるかどうか。

    HTTP メソッドと URL:

    POST https://LOCATION-documentai.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/processors/PROCESSOR_ID:process

    リクエストの本文(JSON):

    // Sample for inputting raw documents such as PDF or HTML
    {
      "rawDocument": {
        "mimeType": "MIME_TYPE",
        "content": "DOCUMENT"
      },
      "processOptions": {
        "layoutConfig": {
          "chunkingConfig": {
            "chunkSize": "CHUNK_SIZE",
            "includeAncestorHeadings": "INCLUDE_ANCESTOR_HEADINGS",
          }
        }
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

    curl -X POST \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://LOCATION-documentai.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/processors/PROCESSOR_ID:process"

    PowerShell

    リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

    $headers = @{  }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://LOCATION-documentai.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/processors/PROCESSOR_ID:process" | Select-Object -Expand Content
    レスポンスには、レイアウトとチャンク情報を含む処理済みドキュメントが Document.documentLayoutDocument.chunkedDocument として含まれます。

    Python

    詳細については、Document AI Python API リファレンス ドキュメントをご覧ください。

    Document AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

    
    from typing import Optional, Sequence
    
    from google.api_core.client_options import ClientOptions
    from google.cloud import documentai
    
    # TODO(developer): Uncomment these variables before running the sample.
    # project_id = "YOUR_PROJECT_ID"
    # location = "YOUR_PROCESSOR_LOCATION" # Format is "us" or "eu"
    # processor_id = "YOUR_PROCESSOR_ID" # Create processor before running sample
    # processor_version = "rc" # Refer to https://cloud.google.com/document-ai/docs/manage-processor-versions for more information
    # file_path = "/path/to/local/pdf"
    # mime_type = "application/pdf" # Refer to https://cloud.google.com/document-ai/docs/file-types for supported file types
    
    
    def process_document_layout_sample(
        project_id: str,
        location: str,
        processor_id: str,
        processor_version: str,
        file_path: str,
        mime_type: str,
    ) -> documentai.Document:
        process_options = documentai.ProcessOptions(
            layout_config=documentai.ProcessOptions.LayoutConfig(
                chunking_config=documentai.ProcessOptions.LayoutConfig.ChunkingConfig(
                    chunk_size=1000,
                    include_ancestor_headings=True,
                )
            )
        )
    
        document = process_document(
            project_id,
            location,
            processor_id,
            processor_version,
            file_path,
            mime_type,
            process_options=process_options,
        )
    
        print("Document Layout Blocks")
        for block in document.document_layout.blocks:
            print(block)
    
        print("Document Chunks")
        for chunk in document.chunked_document.chunks:
            print(chunk)
    
    
    
    def process_document(
        project_id: str,
        location: str,
        processor_id: str,
        processor_version: str,
        file_path: str,
        mime_type: str,
        process_options: Optional[documentai.ProcessOptions] = None,
    ) -> documentai.Document:
        # You must set the `api_endpoint` if you use a location other than "us".
        client = documentai.DocumentProcessorServiceClient(
            client_options=ClientOptions(
                api_endpoint=f"{location}-documentai.googleapis.com"
            )
        )
    
        # The full resource name of the processor version, e.g.:
        # `projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}`
        # You must create a processor before running this sample.
        name = client.processor_version_path(
            project_id, location, processor_id, processor_version
        )
    
        # Read the file into memory
        with open(file_path, "rb") as image:
            image_content = image.read()
    
        # Configure the process request
        request = documentai.ProcessRequest(
            name=name,
            raw_document=documentai.RawDocument(content=image_content, mime_type=mime_type),
            # Only supported for Document OCR processor
            process_options=process_options,
        )
    
        result = client.process_document(request=request)
    
        # For a full list of `Document` object attributes, reference this page:
        # https://cloud.google.com/document-ai/docs/reference/rest/v1/Document
        return result.document
    
    

Layout Parser でドキュメントをバッチ処理する

次の手順で、1 つのリクエストで複数のドキュメントを解析してチャンク化します。

  1. レイアウト パーサーに入力ドキュメントを渡して、解析とチャンク処理を行います。

    処理リクエストを送信するのバッチ処理リクエストの手順に沿って操作します。

    batchProcess リクエストを行うときに、ProcessOptions.layoutConfig でフィールドを構成します。

    入力

    次の JSON の例では、ProcessOptions.layoutConfig を構成します。

    "processOptions": {
      "layoutConfig": {
        "chunkingConfig": {
          "chunkSize": "CHUNK_SIZE",
          "includeAncestorHeadings": "INCLUDE_ANCESTOR_HEADINGS_BOOLEAN"
        }
      }
    }
    

    次のように置き換えます。

    • CHUNK_SIZE: ドキュメントの分割時に使用するチャンクの最大サイズ(トークンの数)。
    • INCLUDE_ANCESTOR_HEADINGS_BOOLEAN: ドキュメントを分割するときに、祖先の見出しを含めるかどうか。上位の見出しは、元のドキュメントの小見出しの親です。元のドキュメント内の位置に関する追加のコンテキストを含むチャンクを提供できます。チャンクには、最大 2 レベルの見出しを含めることができます。

次のステップ