Google открыла LangExtract: LLM-инструмент для извлечения структурированных данных

Google опубликовала LangExtract — Python-библиотеку, которая использует большие языковые модели (LLM) для извлечения структурированной информации из неструктурированных текстов по пользовательским инструкциям. Она умеет работать с клиническими записями, отчётами и другими документами — находить в них ключевые детали и гарантировать, что каждый извлечённый фрагмент привязан к конкретному месту в исходном тексте. Библиотека была выпущена Google 30 июля 2025 года, а текущая версия — 1.6.0, разработана Акшаем Гоэлем.


Зачем нужен LangExtract?

В отличие от традиционных NLP-инструментов, использующих регулярные выражения или жёсткие правила, LangExtract применяет возможности рассуждения современных LLM для понимания контекста, выявления сущностей и организации информации — при этом сохраняя точную трассируемость к исходному тексту.

Организации часто сталкиваются с проблемой: внутри текстов скрыты ценные данные, но извлекать их надёжно трудно. Ручная проверка медленна и ошибкоопасна, а создание кастомных пайплайнов требует времени и хрупко в поддержке.

ℹ Что такое source grounding?
Source grounding (привязка к источнику) — это механизм, при котором каждое извлечённое значение сопоставляется с точным символьным интервалом в исходном тексте. Это позволяет визуально проверить, откуда взялся результат, и исключить галлюцинации LLM.

Ключевые возможности

ФункцияОписание
Precise Source GroundingКаждая сущность привязана к конкретному месту в исходном тексте
Structured OutputsГарантированный вывод по заданной схеме через few-shot примеры
Long Document ProcessingЧанкинг, параллельная обработка и multiple passes для длинных документов
Interactive VisualizationГенерация самодостаточного интерактивного HTML для просмотра тысяч сущностей
Flexible LLM SupportПоддержка Gemini, OpenAI и локальных моделей через Ollama
No Fine-tuningАдаптация к любой задаче через несколько примеров без дообучения

Как это работает


graph TD
    A[Входной текст] --> B[Описание задачи + few-shot примеры]
    B --> C[lx.extract — LLM-модель]
    C --> D[Извлечённые сущности с char_interval]
    D --> E{Grounded?}
    E -- Да --> F[JSONL-файл с результатами]
    E -- Нет --> G[char_interval = None, фильтрация]
    F --> H[Интерактивная HTML-визуализация]


Быстрый старт

Установка через pip:

pip install langextract

Минимальный пример — определить задачу, дать примеры и запустить извлечение:

import langextract as lx
import textwrap

# 1. Описание задачи
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. Few-shot пример
examples = [
    lx.data.ExampleData(
        text="ROMEO. But soft! What light through yonder window breaks?",
        extractions=[
            lx.data.Extraction(
                extraction_class="character",
                extraction_text="ROMEO",
                attributes={"emotional_state": "wonder"}
            ),
        ]
    )
]

# 3. Запуск
result = lx.extract(
    text_or_documents="Lady Juliet gazed longingly at the stars, her heart aching for Romeo",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-3.5-flash",
)

# 4. Только grounded-результаты (без галлюцинаций)
grounded = [e for e in result.extractions if e.char_interval]
💡 Фильтрация галлюцинаций
LLM иногда «придумывают» сущности из few-shot примеров вместо входного текста. LangExtract автоматически это детектирует: у таких извлечений char_interval = None. Фильтруйте их через [e for e in result.extractions if e.char_interval].

Визуализация

# Сохранить результаты
lx.io.save_annotated_documents([result], output_name="results.jsonl", output_dir=".")

# Сгенерировать HTML
html_content = lx.visualize("results.jsonl")
with open("visualization.html", "w") as f:
    f.write(html_content)

Масштабирование на большие документы

Для длинных документов LangExtract использует оптимизированную стратегию: чанкинг текста, параллельную обработку и несколько проходов для повышения полноты извлечения (recall).

Пример обработки целого романа «Ромео и Джульетта» с Project Gutenberg:

result = lx.extract(
    text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-3.5-flash",
    extraction_passes=3,   # Несколько проходов для лучшего recall
    max_workers=20,         # Параллельная обработка
    max_char_buffer=1000    # Меньший контекст — выше точность
)

Поддерживаемые модели

LangExtract поддерживает как облачные LLM семейства Google Gemini, так и локальные open-source модели через встроенный интерфейс Ollama.

Рекомендованная по умолчанию модель — gemini-3.5-flash. Gemini 3.5 Flash была выпущена 19 мая 2026 года. Контекстное окно составляет до 1 048 576 входных токенов и 65 536 выходных токенов. Стоимость — $1,50 за миллион входных токенов и $9,00 за миллион выходных, что делает её доступным вариантом для большинства задач.

⚠ Жизненный цикл моделей Gemini
Модели Gemini имеют определённый жизненный цикл и даты вывода из эксплуатации. Перед запуском в продакшен проверяйте актуальные версии в официальной документации Google. Gemini-3.5-flash сейчас помечена как legacy, хотя дата отключения ещё не объявлена.

Лицензия и ограничения

LangExtract распространяется под лицензией Apache 2.0. При этом это не официально поддерживаемый продукт Google. Использование библиотеки бесплатно, однако при работе с Gemini или OpenAI возникают расходы на API. Локальное развёртывание через Ollama позволяет полностью избежать этих затрат.

«LangExtract рассматривает задачу извлечения как инженерную проблему, а не просто AI-задачу» — пользователь из сообщества разработчиков.


Значение для отрасли

LangExtract ориентирован на широкий круг применений: от извлечения лекарств и дозировок из клинических записей до анализа рисков в финансовых аудитах и отношений между персонажами в художественных текстах.

Задачи извлечения можно определять для любого домена, используя лишь несколько примеров — дообучение модели не требуется. Это делает инструмент особенно привлекательным для команд, работающих с медицинской документацией, юридическими текстами и аналитикой, где точность и прослеживаемость результатов критичны.

📝 Пример применения: медицина
LangExtract уже используется для структурированной обработки радиологических отчётов (RadExtract) и извлечения данных о медикаментах из клинических записей. Однако авторы подчёркивают: это демонстрационные сценарии, не предназначенные для реальной медицинской практики.

Исходный код и примеры доступны на GitHub. Интерактивное демо можно запустить прямо в браузере без установки.