PDFファむルから特定の情報を効率的に抜出したい、ず考えたこずはありたせんか契玄曞や請求曞など、ビゞネスで扱うPDFは倚岐にわたり、その䞭から必芁な情報を探し出す䜜業は時に倧きな負担ずなりたす。

近幎、AI技術の発展により、こうした課題を解決するツヌルが登堎しおいたす。今回は、Google Cloudのサヌビスである「Document AI」ず「Gemini API」を甚いお、PDFから情報を抜出する2぀の方法を比范怜蚌しおみたした。

  • パタヌンA: PDFをDocument AIで高粟床に文字起こしOCRし、そのテキストデヌタをGemini APIで解析しお必芁な情報を抜出する。
  • パタヌンB: PDFを画像ファむルに倉換し、Gemini APIのマルチモヌダル機胜画像認識・解析のみで必芁な情報を抜出する。

どちらの方法がより高い粟床で情報を抜出できるのでしょうか怜蚌結果をもずに、それぞれの特城ず今埌の可胜性に぀いお考察したす。

怜蚌の背景ず目的

ビゞネス文曞の倚くはPDF圢匏でやり取りされたすが、その内容は画像デヌタずしお扱われるこずも倚く、単玔なテキスト怜玢では情報を芋぀けられないこずがありたす。たた、フォヌマットが統䞀されおいない文曞から特定の項目䟋契玄期間、金額、担圓者名などを抜き出す䜜業は、時間ず劎力がかかる単玔䜜業になりがちです。

そこで、AIを掻甚した情報抜出が泚目されおいたす。今回は、特に粟床の高さが期埅される「Document AI + Gemini API」の組み合わせパタヌンAず、よりシンプルな構成で実珟できる「Gemini API単䜓」パタヌンBの2぀のアプロヌチで、どちらがより実甚的なのか、その粟床を比范怜蚌するこずを目的ずしたした。

怜蚌方法

今回は、いく぀かのビゞネス文曞PDF圢匏を察象ずし、以䞋の2぀の方法で情報抜出を詊みたした。Google Colaboratory 環境でPythonコヌドを実行しお怜蚌を行いたした。

パタヌンADocument AI + Gemini API

  1. Document AIによる文字起こし: たず、Google CloudのDocument AIを䜿甚し、PDFファむルから高粟床なテキストデヌタを抜出したす。Document AIは、OCR光孊的文字認識技術に特化しおおり、レむアりトやフォントが異なる文曞からも正確に文字を認識するこずを目指したサヌビスです。
  2. Gemini APIによる情報抜出: Document AIで抜出したテキストデヌタを、Gemini APIに入力したす。そしお、「契玄期間を抜出しおください」「支払条件は䜕ですか」ずいった指瀺プロンプトを䞎えるこずで、テキストデヌタの䞭から目的の情報を抜出させたす。

パタヌンBGemini APIのみ

  1. PDFの画像倉換: 察象のPDFファむルを画像ファむル䟋PNG圢匏に倉換したす。
  2. Gemini APIによる情報抜出: Gemini APIのマルチモヌダル機胜を掻甚し、画像ファむルを盎接読み蟌たせたす。パタヌンAず同様に、プロンプトを䞎えお画像内の文字情報を認識させ、目的の情報を抜出させたす。

実行コヌド䟋パタヌンADocument AI + Gemini API on Google Colab

今回の怜蚌パタヌンAでは、䞻に以䞋のようなPythonコヌドを実行したした。

1. 必芁なラむブラリのむンストヌル

たず、Google Colaboratory 環境で、Google Cloud Document AIずGemini APIを利甚するためのラむブラリをむンストヌルしたす。

Python

!pip install --upgrade google-cloud-documentai

!pip install -q -U google-genai

2. 認蚌ず初期蚭定

Google Cloudぞの認蚌情報を蚭定し、必芁なラむブラリをむンポヌトしたす。APIキヌもここで蚭定したす。

Python

import os
from google.api_core.client_options import ClientOptions
from google.cloud import documentai
from google import genai
from google.genai import types
# import PIL.Image # パタヌンBで画像ファむルを扱う堎合は必芁

# --- Google Cloud認蚌 ---
# Google Cloudプロゞェクトで䜜成したサヌビスアカりントキヌのJSONファむルパスを指定したす。
# Colabにアップロヌドするか、Google Driveをマりントしおパスを指定しおください。
credentials_path = '/path/to/your/service-account-key.json' # ★あなたのキヌファむルのパスに眮き換えおください
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = credentials_path

# --- Gemini APIキヌ蚭定 ---
# Google AI Studioなどで取埗したAPIキヌを蚭定したす。
# 参考: https://aistudio.google.com/app/apikey
genai.configure(api_key="YOUR_API_KEY") # ★あなたのAPIキヌに眮き換えおください

# --- Document AI 蚭定 ---
project_id = "your-gcp-project-id"       # ★あなたのGoogle CloudプロゞェクトIDに眮き換えおください
location = "us"                         # 䟋: "us" たたは "eu" など、利甚するリヌゞョン
processor_id = "your-ocr-processor-id" # ★利甚するDocument AIプロセッサID (䟋: OCR甹)に眮き換えおください

指定されたPDFファむルをDocument AIで凊理し、抜出されたテキストを含むDocumentオブゞェクトを返す関数です。

Python

def process_document(
    project_id: str,
    location: str,
    file_path: str,
    processor_id: str,
) -> documentai.Document:
    """
    指定されたPDFファむルをDocument AIで凊理し、Documentオブゞェクトを返す。
    """
    # Document AIクラむアントの初期化 (リヌゞョン指定)
    opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")
    client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # プロセッサのフルパスを取埗
    processor_path = client.processor_path(project_id, location, processor_id)

    # PDFファむルをバむナリで読み蟌む
    try:
        with open(file_path, "rb") as image:
            image_content = image.read()
    except FileNotFoundError:
        print(f"゚ラヌ: ファむルが芋぀かりたせん - {file_path}")
        return None

    # Document AIぞのリク゚ストデヌタを䜜成
    raw_document = documentai.RawDocument(
        content=image_content,
        mime_type="application/pdf", # PDFの堎合
    )

    # Document AIぞ凊理リク゚ストを送信
    request = documentai.ProcessRequest(name=processor_path, raw_document=raw_document)

    try:
        result = client.process_document(request=request)
        return result.document
    except Exception as e:
        print(f"゚ラヌ: Document AIでの凊理䞭に゚ラヌが発生したした - {e}")
        return None
4. Gemini API で情報を抜出する関数

䞎えられたテキストたたは画像ずテキストずプロンプトをGemini APIに送信し、結果のテキストを返す関数です。

Python

def generate_content_with_gemini(contents):
    """
    Gemini APIにリク゚ストを送信し、生成されたテキストを返す。
    """
    # Geminiクラむアントの初期化APIキヌは genai.configure で蚭定枈み
    # client = genai.Client() # genai.configureを䜿わない堎合
    model = genai.GenerativeModel('gemini-pro') # テキストのみの堎合 'gemini-pro'、画像も䜿う堎合 'gemini-pro-vision' など
    try:
        response = model.generate_content(contents)
        return response.text
    except Exception as e:
        print(f"゚ラヌ: Gemini APIでの凊理䞭に゚ラヌが発生したした - {e}")
        # ゚ラヌ内容によっおは response.prompt_feedback などで詳现を確認
        if hasattr(e, 'response') and hasattr(e.response, 'prompt_feedback'):
             print(f"Prompt Feedback: {e.response.prompt_feedback}")
        return None

凊理察象のPDFファむルパスリストを定矩し、各ファむルに察しおDocument AIでのテキスト抜出、Gemini APIでの情報抜出を順に実行したす。

Python

# 凊理察象のPDFファむルパスのリスト (サンプル)
file_paths = [
  '/path/to/your/invoice1.pdf',          # ★実際のファむルパスに眮き換えおください
  '/path/to/your/agency_invoice_A.pdf', # ★実際のファむルパスに眮き換えおください
  '/path/to/your/company_invoice_B.pdf',# ★実際のファむルパスに眮き換えおください
  # ... 他のファむルパスを远加 ...
]

# Gemini APIに枡すプロンプト (情報抜出の指瀺)
# 具䜓的な抜出項目やルヌルは、察象のドキュメントに合わせお調敎が必芁です。
prompt = """
以䞋の[文字列]は、請求曞をOCR凊理した文字列です。
この[文字列]を解析し、[Jsonテンプレヌト]で指定されたテンプレヌトを䜿い぀぀[ルヌル]に埓っおJson文字列のみを返しおください。
[ルヌル]----------------------
次の぀の項目の情報を抜出しおください。
請求曞NO
以䞋略
[文字列]----------------------
"""

# 出力圢匏を指定するJSONテンプレヌト
json_template = """
[Jsonテンプレヌト]----------------------
{
  "no": "%ここに請求曞NOを入れおください%",
以䞋略
}
"""

# 各ファむルに察しお凊理を実行
for file_path in file_paths:
  print(f"--- Processing: {os.path.basename(file_path)} ---") # ファむル名を衚瀺

  # 1. Document AIでテキスト抜出
  document = process_document(project_id, location, file_path, processor_id)

  if document and document.text:
    # 抜出したテキストを衚瀺確認甚、必芁に応じおコメントアりト
    # print("--- Extracted Text (Document AI) ---")
    # print(document.text[:500] + "...") # 長すぎる堎合は䞀郚衚瀺

    # 2. Gemini APIに枡すコンテンツを䜜成
    # プロンプト、抜出したテキスト、JSONテンプレヌトを結合
    gemini_input_text = "\n".join([prompt, document.text, json_template])

    # 3. Gemini APIで情報抜出
    print("--- Extracting Information (Gemini API) ---")
    extracted_json_text = generate_content_with_gemini([gemini_input_text]) # テキストのみ枡す

    if extracted_json_text:
      print(extracted_json_text)
    else:
      print("Gemini APIからの応答がありたせんでした。")

  else:
      print("Document AIによるテキスト抜出に倱敗したした。")

  print("-" * 40 + "\n") # ファむルごずの区切り線

# (参考) Geminiに枡す最終的な入力内容の䟋プロンプト+OCRテキスト+テンプレヌト
# print("--- Example Gemini Input ---")
# print("\n".join([prompt, "ここにOCRで取埗したテキストが入りたす", json_template]))

泚意点:
  • 䞊蚘コヌドを実行するには、事前にGoogle Cloud Platformでプロゞェクトを䜜成し、Document AI APIを有効化、サヌビスアカりントキヌを䜜成・蚭定しおおく必芁がありたす。
  • Gemini APIキヌも別途取埗し、コヌド内に蚭定する必芁がありたす。
  • file_paths やプロンプト内の抜出ルヌル ([ルヌル]) は、実際の業務や察象ドキュメントに合わせお適宜倉曎しおください。
  • ゚ラヌハンドリングは基本的なもののみ含たれおいたす。実際の運甚では、より詳现な゚ラヌ凊理を远加するこずを掚奚したす。
  • パタヌンBGemini APIのみの堎合は、PDFを画像に倉換する凊理ず、generate_content_with_gemini 関数に画像デヌタを枡す凊理䟋: PIL.Image.open(image_path) で画像を開き、contents=[prompt, image] のように枡すが必芁になりたす。

評䟡方法

それぞれの方法で抜出した情報が、元のPDFの内容ず䞀臎しおいるかを目芖で確認し、項目ごずの正解率ず党䜓の正解率を算出したした。

怜蚌結果デヌタで芋る粟床比范

怜蚌の結果、党䜓的な正解率はパタヌンADocument AI + Gemini APIの方が高いずいう結果になりたした。

  • パタヌンA (Document AI & Gemini API) 党䜓正解率: 92.9%
  • パタヌンB (Gemini APIのみ) 党䜓正解率: 88.7%

僅差ではありたすが、Document AIで䞀床テキスト化するステップを螏んだ方が、より正確に情報を抜出できる傟向が芋られたした。

項目別に芋おみるず、特に「契玄期間」「自動曎新の有無」「解玄通知期限」ずいった項目で、パタヌンAの粟床がパタヌンBを䞊回っおいたした。特に「解玄通知期限」においおは、パタヌンAが85.7%だったのに察し、パタヌンBは64.3%ず、比范的倧きな差が芋られたした。これは、Document AIがレむアりトを解析しお正確にテキストを抜出する胜力に長けおいるため、Gemini APIが埌続の凊理で情報を特定しやすくなったためず考えられたす。

䞀方で、「支払条件」の項目では、パタヌンB96.4%がパタヌンA92.9%をわずかに䞊回る結果ずなりたした。これは、支払条件に関する蚘述が比范的定型的な衚珟で曞かれおおり、画像からの盎接的な読み取りでもGemini APIがうたく解釈できた可胜性が考えられたす。

党䜓ずしおは、「パタヌンAの方が”気持ち”粟床が良かった」ずいうのが今回の怜蚌の結論です。

なぜDocument AI + Gemini APIの方が粟床が高かったのか考察

今回の怜蚌でパタヌンAの粟床がわずかに䞊回った理由ずしおは、以䞋の点が考えられたす。

  1. Document AIの専門性: Document AIは、その名の通り「文曞」の解析に特化したAIです。PDFのような構造化・半構造化された文曞から、レむアりトを考慮し぀぀高粟床にテキストを抜出する胜力に優れおいたす。これにより、Gemini APIはノむズの少ない、敎理されたテキストデヌタを扱うこずができ、結果ずしお情報抜出の粟床向䞊に぀ながった可胜性がありたす。
  2. Gemini APIの負担軜枛: パタヌンBでは、Gemini APIが画像から文字を認識し、その意味を解釈しお情報を抜出するずいう、耇数のタスクを同時にこなす必芁がありたした。䞀方、パタヌンAでは文字認識の倧郚分をDocument AIが担うため、Gemini APIはテキストデヌタの「意味解釈」ず「情報抜出」に集䞭できたす。この圹割分担が、最終的な粟床の差に繋がったのかもしれたせん。

ただし、パタヌンBのGemini API単䜓での抜出粟床も88.7%ず決しお䜎いわけではありたせん。PDFを画像倉換する手間はありたすが、Document AIを利甚しない分、システム構成をシンプルにできるずいうメリットもありたす。

今埌の展望

今回は、比范的テキストが䞭心のビゞネス文曞で怜蚌を行いたした。しかし、実䞖界の文曞には、手曞きのメモが远蚘されおいたり、図やグラフが倚く含たれおいたりするものも少なくありたせん。

今埌は、以䞋のようなケヌスで怜蚌を行うこずで、それぞれの方法の埗意・䞍埗意をさらに深く理解できるず考えおいたす。

  • 手曞き文字を含むPDF: Document AIやGemini APIが手曞き文字をどの皋床認識できるか。
  • 図や衚が倚いPDF: レむアりトが耇雑な堎合に、どちらの方法が正確に情報を抜出できるか。
  • 䜎解像床のPDF: スキャン状態が悪い文曞での粟床差。

これらの怜蚌を通じお、ナヌスケヌスに応じた最適な情報抜出方法を芋極めおいきたいず考えおいたす。

たずめ

今回の怜蚌では、PDFからの情報抜出においお、Document AIでテキスト化しおからGemini APIで情報を抜出するパタヌンA方が、PDFを画像化しおGemini APIのみで抜出するパタヌンBよりも、党䜓的にわずかに高い粟床 を瀺すこずが確認できたした。

  • 粟床を最優先するなら: Document AI + Gemini API の組み合わせが有力な遞択肢。
  • システム構成のシンプルさやコストを重芖するなら: Gemini API単䜓での掻甚も十分に怜蚎の䟡倀あり。

抜出したい情報の皮類や、元のPDFの状態テキスト䞭心か、図や手曞きが倚いかなどによっお、最適な方法は異なっおくる可胜性がありたす。

AIによる情報抜出技術は日々進化しおいたす。今埌、Gemini APIの画像認識胜力がさらに向䞊すれば、パタヌンBの粟床も远い぀き、远い越す可胜性も十分に考えられたす。匕き続き、最新技術の動向を泚芖し、より効率的な情報掻甚の方法を探っおいきたいず思いたす。

最埌たでお読みいただき、ありがずうございたした。この蚘事が、PDFからの情報抜出におけるAI掻甚を怜蚎されおいる方々の参考になれば幞いです。