👓

LangExtractによる信頼性の高い情報抽出 ― Geminiでうねるテキストを構造化しよう

に公開

はじめに

大量のテキストデータ(例:診療記録、契約書、顧客の声など)から、必要な情報を機械的かつ信頼性高く取り出せたら…そんな悩みはありませんか?
Googleが2025年7月30日に公開した LangExtract は、GeminiなどのLLMを駆使して「構造化された」「ソースにひも付いた」「規模にも強い」情報抽出を実現するPythonライブラリです。この記事ではそのコア機能や実践的な使い方をサンプルコードとともにまとめてみます。

LangExtractとは?

https://developers.googleblog.com/en/introducing-langextract-a-gemini-powered-information-extraction-library/

LangExtract は、Google が開発した LLM駆動型の情報抽出(Information Extraction)フレームワーク です。
Gemini をはじめとする大規模言語モデル(LLM)に対して「どのような形式で、どのような情報を抽出するか」を明示的に指示し、スキーマに沿った構造化データを得ることを目的としています。

技術的な特徴

  1. Controlled Generation

    • LLM に出力のフォーマットや構造を強制する仕組み。
    • JSON スキーマや属性定義に基づき、出力のブレを抑制します。
    • 従来の自然言語出力に比べ、後処理がほぼ不要になります。
  2. ソースグラウンディング(Source Grounding)

    • 抽出結果には、元テキスト内での文字位置(offset)が付与されます。
    • これにより「どこから抽出されたか」が常に追跡可能。
    • データの検証・監査に必須の機能です。
  3. スケーラブルな処理パイプライン

    • 長文や大量文書を自動的にチャンク分割。
    • 並列処理や複数パス抽出で精度とリコールを両立。
    • 20ワーカー並列など、大規模処理でも安定動作します。
  4. マルチモデル対応

    • Gemini 以外にも OpenAI GPT やローカルLLM(Ollama)をサポート。
    • モデル切り替えが容易で、環境やコスト要件に応じて選択可能です。
  5. 可視化と評価の統合

    • HTML ビジュアライゼーションで抽出結果を色付き表示。
    • ユーザーはブラウザで抽出箇所や属性を即座に確認できます。

どんな課題を解決するのか?

従来、自然言語テキストからのデータ抽出は以下のような課題がありました:

  • 出力フォーマットが不安定(カンマ抜け、JSON崩壊など)
  • LLM 出力の裏付け(根拠)が不明
  • 長文処理時の情報欠落や精度低下
  • 大量データの処理効率の低さ

LangExtract はこれらを解消し、「正確・構造化・トレーサブル」 な抽出を標準化します。

実践:使い方と基本コード

インストール

pip install langextract

GitHub にも豊富なドキュメント・サンプルあり。

使い方:ステップ構成

ステップ1:タスク(抽出ルール)定義

Prompt と few‑shot 例で抽出内容を例示します。
Shakespeare の例だと

import textwrap
import langextract as lx

prompt = textwrap.dedent("""\
    Extract characters, emotions, and relationships in order of appearance.
    Use exact text for extractions. Do not paraphrase or overlap entities.
    Provide meaningful attributes for each entity to add context.""")
examples = [
    lx.data.ExampleData(
        text="ROMEO. But soft! What light through yonder window breaks? It is the east, and Juliet is the sun.",
        extractions=[
            lx.data.Extraction(extraction_class="character", extraction_text="ROMEO", attributes={"emotional_state": "wonder"}),
            lx.data.Extraction(extraction_class="emotion", extraction_text="But soft!", attributes={"feeling": "gentle awe"}),
            lx.data.Extraction(extraction_class="relationship", extraction_text="Juliet is the sun", attributes={"type": "metaphor"}),
        ]
    )
]

ステップ2:抽出を実行

input_text = "Lady Juliet gazed longingly at the stars, her heart aching for Romeo"
result = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-pro",
)

Gemini‑2.5‑flash(高速/低コスト)も選べます。

ステップ3:結果の保存と可視化

lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".")
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w") as f:
    f.write(html_content)

これで抽出された内容を視覚的に確認できるHTMLが生成されます。

ステップ4:スケール対応(長文・並列処理)

result = lx.extract(
    text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",
    extraction_passes=3,
    max_workers=20,
    max_char_buffer=1000
)

大規模テキストも並列・複数パスで高精度抽出。

実用例と応用分野

  • ラジオロジーレポート構造化(RadExtract)
    • Hugging Face デモでライブ体験可能。
  • 医療テキストの抽出
    • 薬剤名や投与量などの構造化抽出に利用。
  • 法務・契約文書
    • 条項・日付・当事者情報などを抽出可能。
  • ビジネス・研究文書分析
    • 論文、報告書、カスタマーフィードバックから構造化情報を抽出。

まとめ

LangExtract は、Gemini や他の LLM を活用しつつ、以下を同時に実現する強力なライブラリです

  • 高い信頼性
    • ソースと切り離せない抽出内容
  • 構造の一貫性
    • few-shot によるスキーマ型抽出
  • 大規模対応
    • チャンク分割・並列化・複数パスによる精度の両立
  • 可視・検証しやすい
    • インタラクティブな可視化付き
  • 柔軟な対応範囲
    • 医療・法務・研究…どんなドメインにも適応可能

感じたのは、「抽出結果が裏付け付きで返ってくる安心感」 です。
従来のLLM ベース抽出は、精度が高くても「本当にこの情報はテキスト中にあったのか?」という疑問がつきまとうこともあったかと思いますが、LangExtract はそのモヤモヤを解消してくれるかもしれません。

また、少ない例からでもスキーマ通りの出力を得られるため、「まず小さく試してすぐ業務に組み込む」というアジャイル的な活用ができるのも大きな魅力です。

合同会社カメレオンミーム Tech Blog

Discussion