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.
- Repositório: github.com/google/langextract
- PyPI: pypi.org/project/langextract
- Licença: Apache 2.0
- Stars: ~33k | Forks: ~2.2k
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 langextractPara 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.pyUso 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étodo | Como usar |
|---|---|
| Variável de ambiente | export LANGEXTRACT_API_KEY="chave" |
Arquivo .env | LANGEXTRACT_API_KEY=chave |
| Direto no código | api_key="chave" (não recomendado para produção) |
| Vertex AI | language_model_params={"vertexai": True, "project": "id"} |
Fontes de API key:
- Gemini: aistudio.google.com
- OpenAI: platform.openai.com/api-keys
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(...).