LLMにテキストから情報を抜き出させると、もっともらしい嘘が混ざる。抽出結果が原文のどこに対応するのか追えなければ、検証に時間がかかるだけでなく、そもそも気づけないこともある。

Googleが公開したオープンソースのPythonライブラリ「LangExtract」は、この問題を正面から解決する。抽出した情報を原文の文字位置まで紐づけ、インタラクティブなHTMLでハイライト表示する仕組みだ。GitHubで3.6万スターを超え、2026年4月29日にはv1.3.0がリリースされている。

この記事でわかること

  • LangExtractが解決する「LLM抽出の信頼性」問題
  • ソースグラウンディングの仕組み
  • 長文ドキュメントへの対応方法
  • インストールから抽出・可視化までの手順
  • 対応モデルと料金

https://github.com/google/langextract

LLMに抽出を任せると何が起きるか

契約書から条件を抜き出す、診療記録から投薬情報を整理する、レポートからKPIを拾う。こうしたタスクにLLMを使う場面は増えている。しかし、LLMは原文にない情報を「それらしく」生成することがある。いわゆるハルシネーションだ。

問題は、抽出結果だけを見ても捏造かどうか判断できない点にある。原文と突き合わせる作業を人間が手動でやるなら、LLMに頼んだ意味が薄れる。LangExtractは、この検証プロセス自体を自動化する。

ソースグラウンディングで「出典」を強制する

LangExtractの核心は「ソースグラウンディング」と呼ばれる仕組みだ。抽出されたエンティティ(人物名、金額、日付など)のすべてが、原文中の正確な文字位置(character offset)に紐づく。

原文に存在しないテキストを抽出した場合、その結果には char_interval = None が自動で付与される。フィルタリング1行で捏造を除外できる。

grounded = [e for e in result.extractions if e.char_interval]

Geminiモデルを使う場合はControlled Generation(制御付き生成)が併用され、出力スキーマの一貫性も担保される。Few-shotの例を数個与えるだけで、ドメイン固有の抽出タスクに対応する。ファインチューニングは不要だ。

長文ドキュメントへの3つの対策

LLMは長いテキストの中から複数の情報を同時に拾うのが苦手だ。いわゆる「Needle-in-a-Haystack」問題で、コンテキストが長くなるほど再現率が下がる。

LangExtractは3つの方法でこれに対処する。

まず、テキストをチャンクに分割する。次に、チャンクを並列処理する。max_workers パラメータで並列数を指定でき、20並列なら長編小説でも数分で処理できる。最後に、複数回の抽出パス(extraction_passes)を実行して見落としを減らす。1回のパスでは拾えなかった情報を、別のパスで補完する仕組みだ。

result = lx.extract(
    text_or_documents="https://example.com/long_document.txt",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",
    extraction_passes=3,
    max_workers=20,
    max_char_buffer=1000
)

URLを直接渡せるため、ファイルのダウンロード処理を書く手間もない。

抽出結果をHTMLで即座に検証する

LangExtractは抽出結果をJSONL形式で保存した後、1行のコードでインタラクティブなHTMLファイルを生成する。原文中の該当箇所がハイライトされ、抽出クラスごとに色分けされる。数千件の抽出結果でも動作する。

Google ColabやJupyter Notebookではインラインで表示され、スタンドアロンHTMLとしてブラウザで開くこともできる。チームメンバーへの共有にも使いやすい。

インストールと基本的な使い方

インストールはpipだけで完了する。

pip install langextract

抽出タスクの定義は3ステップで構成される。まず、何を抽出したいかをプロンプトで記述する。次に、Few-shotの例を1つ以上用意する。最後に lx.extract() を呼ぶ。

例の中の extraction_text は原文からそのまま引用する必要がある。言い換えると精度が落ちる。LangExtractはこのズレを検知すると Prompt alignment の警告を出す。

対応モデルはGemini 2.5 Flash(推奨デフォルト)、Gemini 2.5 Pro(高精度が必要な場合)に加え、OpenAI GPT-5やOllama経由のローカルモデルも使える。Geminiモデルを使う場合はGoogle AI StudioのAPIキーが必要だが、無料枠で試用できる。

活用されている分野

LangExtractは医療分野での利用を起点に開発された。診療記録から投薬情報(薬剤名、用量、投与経路)を抽出し、関連する薬剤ごとにグルーピングする。放射線レポートの構造化デモ「RadExtract」もHugging Faceで公開されている。

医療以外にも、法務文書の条項抽出、財務レポートの数値整理、カスタマーフィードバックの分類など、非構造化テキストから構造化データを取り出すあらゆる場面に適用できる。ファインチューニングなしでドメインに適応する柔軟さが、採用の幅を広げている。

料金と類似ツールとの違い

LangExtract自体はApache 2.0ライセンスの無料ソフトウェアだ。コストはバックエンドのLLM API利用料のみ発生する。Gemini 2.5 Flashは入力100万トークンあたり数セントと安価で、大量処理にはVertex AIのバッチAPIも用意されている。

類似のアプローチとしてはLangChainの出力パーサーやInstructor(Pydanticベースの構造化出力)がある。LangExtractの差別化ポイントは、文字位置レベルのソースグラウンディングとインタラクティブ可視化を標準搭載している点だ。抽出結果の「信頼性の証明」まで含めてワンパッケージになっている。

まとめに代えて

LLMの抽出能力は高いが、出力を無条件に信じるのは危険だ。LangExtractは「抽出して終わり」ではなく「抽出して、根拠を示して、検証できる」ところまでを1つのライブラリで完結させる。原文との照合を自動化したい場面があるなら、最初に試す価値のあるツールだ。