LangExtract のご紹介: Gemini を活用した情報抽出ライブラリ

2025年7月30日
Akshay Goel ML Software Engineer
Atilla Kiraly ML Software Engineer

今日のようにデータが豊富な世界では、詳細な臨床記録、長文の法的文書、顧客フィードバックのスレッド、更新され続けるニュース レポートなど、構造化されていないテキストに貴重な洞察が埋もれてしまいがちです。こうした情報を手動でふるい分けたり、そのデータを処理するための特別なコードをビルドしたりするのは時間がかかり、エラーが発生しやすくなります。また最新の大規模言語モデル(LLM)を単純に使用すると、エラーを誘発する可能性があります。ならば、出力が構造化され、ソースと確かに結びついていることを確保しながら、必要とする情報をプログラムで正確に抽出できたらどうなるでしょうか?

そこで本日ご紹介するのが新たなオープンソース Python ライブラリLangExtract です。まさに上記の処理をデベロッパーが実行できるよう開発されています。LangExtract は、Google の Gemini モデルなどさまざまな LLM の軽量インターフェースを備えており、柔軟性とトレーサビリティの両方を確保しながら、大量の非構造化テキストをカスタム指示に従って構造化テキストに処理できます。

扱うのが医療報告や財務サマリーであれ、またはその他の文書量が多い分野であれ、その中に含まれるデータを柔軟かつ強力に引き出す方法を LangExtract は提供してくれます。


情報の抽出に LangExtract が効果的な理由

LangExtract では情報抽出に役立つ次のような機能を独自に組み合わせています。

  • 正確なソース グラウンディング: 抽出されたすべてのエンティティは、ソーステキストの正確な文字オフセットにあらためてマッピングされます。以下のアニメーションで示すように、この機能では、元のテキストで抽出箇所を視覚的にハイライト表示してトレーサビリティを実現しており、抽出された情報の評価と検証がはるかに簡単にできます。

  • 信頼性の高い構造化出力: LangExtract のデータ表現を使用して必要な出力を定義し、「フューショット」例を入力します。LangExtract はこれを使用してスキーマを強制し、Gemini などの対応モデルの制御付き生成 を活用しながら、確実に一貫性のある構造化された出力となるようにします。これにより、「ロミオとジュリエット」のフルテキスト分析で示したような堅牢な結果が得られます。

  • ロングコンテキストの情報抽出を最適化: 大量のドキュメントからの情報検索は複雑な場合があります。たとえば、LLM は数々のベンチマークで優れたパフォーマンスを示していますが、100 万トークンのコンテキストなどの「干し草の山から針を探すテスト」では、多要素検索シナリオで再現率が低下する可能性があります。LangExtract はこれをチャンク戦略、並列処理や、さらに小さく焦点を絞ったコンテキストでの複数の抽出パスを使用して処理するよう構築されています。

  • インタラクティブな視覚化: 未加工のテキストを分単位でインタラクティブな自己完結型の HTML にできます。このため LangExtract では抽出したエンティティをコンテキスト内で簡単に確認でき、何千ものアノテーションを調べることが可能です。

  • LLM バックエンドを柔軟にサポート: クラウドベースの LLM(Google の Gemini ファミリーなど)でも、オープンソースのオンデバイス モデルでも、お好みのモデルで作業が可能です。

  • 領域の柔軟性: どの領域でも入念に選ばれた数例を使って情報抽出タスクを定義でき、LLM で微調整する必要がありません。LangExtract が必要な出力を「学習」して大規模なテキスト入力に適用します。この仕組みは医療情報の抽出の例で確認できます。

  • LLM の世界知識を活用: LangExtract ではグラウンディングされたエンティティの抽出に加えて、LLM モデルの世界知識を活用して抽出した情報を補足します。この情報は明示的(ソーステキストから派生)なものまたは推論(モデルから継承された世界知識から派生)されたものとなります。こうした補足知識の精度と関連性は、推論の場合は特に、選択された LLM の機能と、抽出を導くプロンプト例の適合率に大きく左右されます。


クイック スタート: シェイクスピアから構造化オブジェクトを抽出

ここではシェイクスピアの 1 節から登場人物の詳細情報を抽出してみます。

最初に、ライブラリをインストールします。

仮想環境や API キーの設定など、セットアップ手順の詳細については、このプロジェクトの README を参照してください。

pip install langextract
Python

次に、抽出タスクを定義します。モデルを導くための具体的なプロンプトと質の高い「フューショット」例を入力します。

import textwrap
import langextract as lx
 
# 1. Define a concise prompt
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.""")
 
# 2. Provide a high-quality example to guide the model
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"},
            ),
        ],
    )
]
 
# 3. Run the extraction on your input text
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",
)
Python

結果のオブジェクトに含まれる抽出されたエンティティは JSONL ファイルに保存できます。このファイルから、インタラクティブな HTML ファイルを作成してアノテーションを表示できます。この視覚化はデモや抽出の質を評価するのに最適で、貴重な時間を節約できます。Google Colab などの環境とシームレスに連携させることも、単体の HTML ファイルとして保存しブラウザで表示することも可能です。

# Save the results to a JSONL file
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl")
 
# Generate the interactive visualization from the file
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w") as f:
    f.write(html_content)
Python

専門領域に対する柔軟性

医療、金融、工学、法律などの専門領域に対しても上記と同じ原則が当てはまります。LangExtract を支えるアイデアが最初に適用されたのは医療情報の抽出でしたが、これは臨床テキストの処理にも効果的です。たとえば、医薬品と分量、その他医薬品の属性を特定して、それぞれの関係性をマッピングできます。この機能は今回のライブラリの研究につながる重要な部分となっています。詳細は、医療情報の抽出の迅速化に関する論文をご覧ください。

以下のアニメーションでは LangExtract が臨床テキストを処理して医薬品に関するエンティティを抽出し、ソースの医薬品にグループ化する様子を示しています。

構造化された放射線治療レポートのデモ

専門領域での LangExtract の力を示すため、Hugging Face に RadExtract という、構造化された放射線治療レポートのインタラクティブなデモを作成しました。このデモでは、LangExtract でフリーテキストの放射線治療レポートを処理し、主な検出項目を構造化されたフォーマットに変換すると同時に、重要な項目をハイライト表示します。このアプローチは、レポートの構造化によって明瞭さを高め、完全性を確保し、研究と臨床ケアにおけるデータの互換性を高めるという点で、放射線治療において重要です。

HuggingFace でデモ(https://google-radextract.hf.space)をお試しください。


免責事項: 上記の医薬品の抽出例と構造化されたレポートのデモは、あくまで LangExtract の基盤となる機能を説明するためのものです。完成または承認されたプロダクトを表すものではなく、病気や症状を診断したり治療を推奨したりすることを意図したものでもありません。これを使用して医学的なアドバイスを行うことはできません。


LangExtract を使ってみる: リソースと次のステップ

今後デベロッパーの皆さんが、革新的な方法で LangExtract を使ってテキストから知見を引き出すことを期待しています。ドキュメントを詳しくご覧いただき、GitHub リポジトリ の例を調べ、さっそく非構造化データの変換を始めてみましょう。