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

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

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

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

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

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

制限事項

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

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

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

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

ファイル形式 検出された要素 制限事項
HTML 段落、表、リスト、タイトル、見出し、ページ ヘッダー、ページ フッター 解析は HTML タグに大きく依存しているため、CSS ベースの書式設定がキャプチャされない可能性があります。
PDF 段落、表、タイトル、見出し、ページ ヘッダー、ページ フッター 複数のページにまたがるテーブルは、2 つのテーブルに分割される場合があります。
DOCX(プレビュー 段落、複数ページにまたがる表、リスト、タイトル、見出しの要素 ネストされたテーブルはサポートされていません。
PPTX(プレビュー 段落、表、リスト、タイトル、見出しの要素 見出しを正確に識別するには、PowerPoint ファイル内で見出しとしてマークする必要があります。ネストされた表と非表示のスライドはサポートされていません。
XLSX/XLSM(プレビュー Excel スプレッドシート内のテーブル(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: Layout Parser は application/pdftext/html をサポートしています。
    • DOCUMENT: チャンクに分割するコンテンツ。Layout Parser は、未加工の PDF または HTML ドキュメント、または Layout Parser によって出力された解析済みドキュメントを受け入れます。
    • 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 レベルの見出しを含めることができます。

次のステップ