LangExtractによる信頼性の高い情報抽出 ― Geminiでうねるテキストを構造化しよう
はじめに
大量のテキストデータ(例:診療記録、契約書、顧客の声など)から、必要な情報を機械的かつ信頼性高く取り出せたら…そんな悩みはありませんか?
Googleが2025年7月30日に公開した LangExtract は、GeminiなどのLLMを駆使して「構造化された」「ソースにひも付いた」「規模にも強い」情報抽出を実現するPythonライブラリです。この記事ではそのコア機能や実践的な使い方をサンプルコードとともにまとめてみます。
LangExtractとは?
LangExtract は、Google が開発した LLM駆動型の情報抽出(Information Extraction)フレームワーク です。
Gemini をはじめとする大規模言語モデル(LLM)に対して「どのような形式で、どのような情報を抽出するか」を明示的に指示し、スキーマに沿った構造化データを得ることを目的としています。
技術的な特徴
-
Controlled Generation
- LLM に出力のフォーマットや構造を強制する仕組み。
- JSON スキーマや属性定義に基づき、出力のブレを抑制します。
- 従来の自然言語出力に比べ、後処理がほぼ不要になります。
-
ソースグラウンディング(Source Grounding)
- 抽出結果には、元テキスト内での文字位置(offset)が付与されます。
- これにより「どこから抽出されたか」が常に追跡可能。
- データの検証・監査に必須の機能です。
-
スケーラブルな処理パイプライン
- 長文や大量文書を自動的にチャンク分割。
- 並列処理や複数パス抽出で精度とリコールを両立。
- 20ワーカー並列など、大規模処理でも安定動作します。
-
マルチモデル対応
- Gemini 以外にも OpenAI GPT やローカルLLM(Ollama)をサポート。
- モデル切り替えが容易で、環境やコスト要件に応じて選択可能です。
-
可視化と評価の統合
- 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 はそのモヤモヤを解消してくれるかもしれません。
また、少ない例からでもスキーマ通りの出力を得られるため、「まず小さく試してすぐ業務に組み込む」というアジャイル的な活用ができるのも大きな魅力です。

chameleonmeme.com/ ビジネスのすべての工程を自分たちの手で行い、 気の合う仲間と楽しく仕事をすることで熱中するためにチームをスタートしました。 お仕事のご相談・お誘いはお気軽にお問い合わせください。 コーポレートサイトのWEBフォームから随時受け付けております🙆
Discussion