LangExtract: Geminiを活用した情報抽出ライブラリ
GoogleはLangExtractを発表。これは、非構造化テキストから構造化情報を抽出するための新しいオープンソースPythonライブラリ。GeminiのようなLLMを利用し、ユーザーのカスタム指示に基づいて、柔軟性と追跡可能性を両立した情報抽出を実現する。医療レポートや法的文書など、テキストが多用される分野での活用が期待される。
- 正確なソースグラウンディング: 抽出された全てのエンティティは、ソーステキスト内の正確な文字オフセットにマッピングされ、追跡可能性を確保。
- 信頼性の高い構造化出力: 少数の例(few-shot)を提供することで、GeminiモデルなどのControlled Generation機能を活用し、一貫した構造化出力を保証。
- 長文コンテキストの最適化: チャンキング戦略、並列処理、複数回の抽出パスを用いて、長文からの情報検索を効率化。
- インタラクティブな可視化: 抽出エンティティを文脈の中でレビューできる、自己完結型のインタラクティブHTMLを生成。
- 柔軟なLLMバックエンド: GoogleのGeminiファミリーやオープンソースのオンデバイスモデルなど、様々なLLMをサポート。
- ドメイン横断的な柔軟性: LLMをファインチューニングすることなく、少数の例を示すだけで、あらゆるドメインの情報抽出タスクを定義可能。
- LLMの世界知識の活用: モデルが持つ世界知識を利用して、抽出された情報を補足することが可能。
出展:Introducing LangExtract: A Gemini powered information extraction library
リポジトリ:google/langextract
LangExtractの利用例
以下は、シェイクスピアの戯曲の一節から登場人物、感情、関係性を抽出するコード例。
まず、ライブラリをインストールする。
bash
pip install langextract次に、抽出タスクを定義し、実行する。明確なプロンプトと高品質な few-shot の例を提供することで、モデルの出力をガイドする。
python
import textwrap
import langextract as lx
# 1. 簡潔なプロンプトを定義
prompt = textwrap.dedent("""\
登場人物、感情、関係性を出現順に抽出してください。
抽出には正確なテキストを使用し、言い換えやエンティティの重複は避けてください。
各エンティティには文脈を追加するための意味のある属性を提供してください。""")
# 2. モデルをガイドするための高品質な例を提供
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. 入力テキストに対して抽出を実行
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",)抽出結果はJSONLファイルに保存し、インタラクティブなHTMLファイルとして可視化できる。
python
# 結果をJSONLファイルに保存
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl")
# ファイルからインタラクティブな可視化を生成
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w") as f:
f.write(html_content)