LangExtract

Biblioteca Python do Google para extração de informações estruturadas a partir de textos não estruturados, usando LLMs com rastreabilidade precisa da fonte e visualização interativa.


Principais Características

  • Rastreabilidade da fonte: cada extração é mapeada à localização exata no texto original, com highlight visual.
  • Saída estruturada confiável: schema consistente baseado em exemplos few-shot; geração controlada em modelos como Gemini.
  • Otimizado para documentos longos: chunking de texto, processamento paralelo e múltiplas passagens para maior recall.
  • Visualização interativa: gera HTML standalone para revisar entidades extraídas no contexto original.
  • Suporte flexível a LLMs: Gemini (cloud), OpenAI, modelos locais via Ollama.
  • Sem fine-tuning: adapta-se a qualquer domínio apenas com exemplos e instruções de prompt.

Instalação

pip install langextract

Para OpenAI:

pip install langextract[openai]

Instalação a partir do código-fonte (modo dev):

git clone https://github.com/google/langextract.git
cd langextract
pip install -e ".[dev]"

Via Docker:

docker build -t langextract .
docker run --rm -e LANGEXTRACT_API_KEY="sua-chave" langextract python script.py

Uso Básico

1. Definir a tarefa de extração

import langextract as lx
import textwrap
 
prompt = textwrap.dedent("""\
    Extraia personagens, emoções e relacionamentos em ordem de aparição.
    Use o texto exato para as extrações. Não parafraseie.""")
 
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"}
            ),
        ]
    )
]

2. Executar a extração

result = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",  # modelo recomendado
)

3. Salvar e visualizar

lx.io.save_annotated_documents([result], output_name="resultado.jsonl", output_dir=".")
 
html_content = lx.visualize("resultado.jsonl")
with open("visualizacao.html", "w") as f:
    f.write(html_content)

Documentos Longos

Para textos extensos, use processamento paralelo e múltiplas passagens:

result = lx.extract(
    text_or_documents="https://url-do-documento.txt",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",
    extraction_passes=3,   # múltiplas passagens para maior recall
    max_workers=20,        # processamento paralelo
    max_char_buffer=1000   # contextos menores para maior precisão
)

Configuração de API Key

MétodoComo usar
Variável de ambienteexport LANGEXTRACT_API_KEY="chave"
Arquivo .envLANGEXTRACT_API_KEY=chave
Direto no códigoapi_key="chave" (não recomendado para produção)
Vertex AIlanguage_model_params={"vertexai": True, "project": "id"}

Fontes de API key:


Provedores de Modelos

Gemini (padrão)

  • Modelo recomendado: gemini-2.5-flash
  • Para tarefas complexas: gemini-2.5-pro

OpenAI

result = lx.extract(
    ...,
    model_id="gpt-4o",
    api_key=os.environ.get('OPENAI_API_KEY'),
    fence_output=True,
    use_schema_constraints=False
)

Ollama (local, sem API key)

result = lx.extract(
    ...,
    model_id="gemma2:2b",
    model_url="http://localhost:11434",
    fence_output=False,
    use_schema_constraints=False
)

Setup: instalar ollama.com, executar ollama pull gemma2:2b e ollama serve.


Exemplos Notáveis

  • Romeu e Julieta (texto completo): extração de 147k caracteres direto do Project Gutenberg → ver exemplo
  • Extração de medicamentos: reconhecimento de nomes, dosagens e vias de administração em notas clínicas → ver exemplo
  • RadExtract (demo ao vivo): estruturação de laudos radiológicos → HuggingFace Spaces

Observações

  • Não é um produto oficialmente suportado pelo Google.
  • Para aplicações de saúde, sujeito aos Health AI Developer Foundations Terms of Use.
  • Provedores customizados podem ser adicionados via sistema de plugins com @registry.register(...).

Referências