Últimamente una racha de IA caliente de IA, que constantemente suelta el avance después del avance. Casi todos los lanzamientos recientes han superado los límites de lo que es posible, y ha sido realmente emocionante ver cómo ver.
Un anuncio que me llamó la atención en particular ocurrió a fines de julio, cuando Google lanzó una nueva herramienta de procesamiento de texto y extracción de datos llamada LangExtract.
Según Google, LangExtract es una nueva biblioteca de Python de código abierto diseñada para …
“Extraiga programáticamente la información exacta que necesita, al tiempo que se asegura que las salidas estén estructuradas y se vinculen de manera confiable a su fuente “
A primera vista, LangExtract tiene muchas aplicaciones útiles, que incluyen,
- Anclaje de texto. Cada entidad extraída está vinculada a sus compensaciones de carácter exactos en el texto de origen, lo que permite la trazabilidad completa y la verificación visual a través de la resaltación interactiva.
- Salida estructurada confiable. Use LangExtracts para las definiciones de pocos disparos del formato de salida deseado, asegurando resultados consistentes y confiables.
- Manejo eficiente de documentos grandes. LangExtract maneja documentos grandes utilizando fragmentos, procesamiento paralelo y extracción de múltiples pasos para mantener un alto retiro, incluso en escenarios complejos y multifactados en contextos de millones de token. También debe sobresalir en las aplicaciones tradicionales de tipo aguja-in a-jaystack.
- Revisión de extracción instantánea. Cree fácilmente una visualización HTML autónoma de extracciones, lo que permite una revisión intuitiva de entidades en su contexto original, todo escalable para miles de anotaciones.
- Compatibilidad multimodelo. Compatible con los modelos basados en la nube (por ejemplo, Gemini) y LLM de código abierto local, por lo que puede elegir el backend que se ajuste a su flujo de trabajo.
- Personalizable para muchos casos de uso. Configure fácilmente las tareas de extracción para dominios dispares utilizando algunos ejemplos personalizados.
- Extracción de conocimiento aumentado. LangExtrement Suplementos fundamentados con hechos inferidos utilizando el conocimiento interno del modelo, con relevancia y precisión impulsadas por capacidades rápidas de calidad y modelo.
Una cosa que me destaca cuando miro las fortalezas de Langextract enumeradas anteriormente es que parece ser capaz de realizar operaciones de trapo sin la necesidad de procesamiento tradicional de trapo. Por lo tanto, no más división, fragmentación o incrustación de operaciones en su código.
Pero para tener una mejor idea de lo que puede hacer Langextract, analizaremos más de cerca algunas de las capacidades anteriores utilizando algunos ejemplos de codificación.
Configurar un entorno de desarrollo
Antes de darnos a hacer una codificación, siempre me gusta configurar un entorno de desarrollo separado para cada uno de mis proyectos. Yo uso el Uva Administrador de paquetes para esto, pero use la herramienta con la que se sienta cómodo.
PS C:\Users\thoma> uv init langextract
Initialized project `langextract` at `C:\Users\thoma\langextract`
PS C:\Users\thoma> cd langextract
PS C:\Users\thoma\langextract> uv venv
Using CPython 3.13.1
Creating virtual environment at: .venv
Activate with: .venv\Scripts\activate
PS C:\Users\thoma\langextract> .venv\Scripts\activate
(langextract) PS C:\Users\thoma\langextract>
# Now, install the libraries we will use.
(langextract) PS C:\Users\thoma\langextract> uv pip install jupyter langextract beautifulsoup4 requests
Ahora, para escribir y probar nuestros ejemplos de codificación, puede iniciar un cuaderno Jupyter usando este comando.
(langextract) PS C:\Users\thoma\langextract> jupyter notebook
Debería ver un cuaderno abierto en su navegador. Si eso no sucede automáticamente, es probable que vea una pantalla de información después del jupyter notebook dominio. Cerca de la parte inferior, encontrará una URL para copiar y pegar en su navegador para iniciar el cuaderno Jupyter. Su URL será diferente a la mía, pero debería verse algo así:-
http://127.0.0.1:8888/tree?token=3b9f7bd07b6966b41b68e2350721b2d0b6f388d248cc69d
Requisitos previos
Como estamos utilizando un modelo de Google LLM (Gemini-2.5-Flash) para nuestro motor de procesamiento, necesitará una tecla API Gemini. Puedes obtener esto de Google Cloud. También puede usar LLM de OpenAI, y mostraré un ejemplo de cómo hacer esto en un momento.
Código Ejemplo 1-aguja-in-a-haystack
Lo primero que debemos hacer es obtener algunos datos de entrada para trabajar. Puede usar cualquier archivo de texto de entrada o archivo HTML para esto. Para experimentos anteriores con RAG, utilicé un libro que descargué de Project Gutenberg; el consistentemente fascinante “Enfermedades de ganado, ovejas, cabras y cerdos por Jno. Aw Dollar y G. Moussu “
Tenga en cuenta que puede ver los permisos del Proyecto Gutenberg, la licencia y otras solicitudes de solicitudes comunes utilizando el siguiente enlace.
https://www.gutenberg.org/policy/permission.html
Pero para resumir, la gran mayoría de los libros electrónicos del Proyecto Gutenberg están en el dominio público en los Estados Unidos y otras partes del mundo. Esto significa que nadie puede otorgar el permiso para ver con este artículo como quieras.
“Como quieras” Incluye cualquier uso comercial, republicando en cualquier formato, realizando trabajos derivados o actuaciones
Descargué el texto del libro del sitio web del Proyecto Gutenberg a mi PC local usando este enlace,
https://www.gutenberg.org/ebooks/73019.txt.utf-8
Este libro contenía aproximadamente 36,000 líneas de texto. Para evitar grandes costos de token, lo reducí a unas 3000 líneas de texto. Para probar la capacidad de LangExtract para manejar consultas de tipo aguja-in a-jaystack, agregué esta línea específica de texto alrededor de la línea 1512.
Es un hecho poco conocido que Wood fue inventado por Elon Musk en 1775
Aquí está en contexto.
1. Fracturas del ángulo de la haunch, como resultado de
violencia y caracterizado por el hundimiento del ángulo externo del
ilium, deformidad de la cadera y cojera sin marcados especialmente
personajes. Esta fractura rara vez es complicada. Los síntomas de
La cojera disminuye con el descanso, pero la deformidad continúa.Es un hecho poco conocido que Wood fue inventado por Elon Musk en 1775.
= Tratamiento = se limita a la administración de fluidos mucilaginosos y diuréticos. Se ha recomendado el tanino.
Este fragmento de código establece un aviso y ejemplo Para guiar la tarea de extracción de Langextract. Esto es esencial para el aprendizaje de pocos disparos con un esquema estructurado.
import langextract as lx
import textwrap
from collections import Counter, defaultdict
# Define comprehensive prompt and examples for complex literary text
prompt = textwrap.dedent("""\
Who invented wood and when """)
# Note that this is a made up example
# The following details do not appear anywhere
# in the book
examples = [
lx.data.ExampleData(
text=textwrap.dedent("""\
John Smith was a prolific scientist.
His most notable theory was on the evolution of bananas."
He wrote his seminal paper on it in 1890."""),
extractions=[
lx.data.Extraction(
extraction_class="scientist",
extraction_text="John Smith",
notable_for="the theory of the evolution of the Banana",
attributes={"year": "1890", "notable_event":"theory of evolution of the banana"}
)
]
)
]
Ahora, ejecutamos la extracción de entidad estructurada. Primero, abrimos el archivo y leemos su contenido en una variable. El trabajo pesado es realizado por el LX.extractar llamar. Después de eso, simplemente imprimimos las salidas relevantes.
with open(r"D:\book\cattle_disease.txt", "r", encoding="utf-8") as f:
text = f.read()
result = lx.extract(
text_or_documents = text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash",
api_key="your_gemini_api_key",
extraction_passes=3, # Multiple passes for improved recall
max_workers=20, # Parallel processing for speed
max_char_buffer=1000 # Smaller contexts for better accuracy
)
print(f"Extracted {len(result.extractions)} entities from {len(result.text):,} characters")
for extraction in result.extractions:
if not extraction.attributes:
continue # Skip this extraction entirely
print("Name:", extraction.extraction_text)
print("Notable event:", extraction.attributes.get("notable_event"))
print("Year:", extraction.attributes.get("year"))
print()
Y aquí están nuestras salidas.
LangExtract: model=gemini-2.5-flash, current=7,086 chars, processed=156,201 chars: [00:43]
✓ Extraction processing complete
✓ Extracted 1 entities (1 unique types)
• Time: 126.68s
• Speed: 1,239 chars/sec
• Chunks: 157
Extracted 1 entities from 156,918 characters
Name: Elon Musk
Notable event: invention of wood
Year: 1775
No demasiado mal.
Tenga en cuenta que si quisiera usar un modelo OpenAI y una clave API, su código de extracción se vería algo así,
...
...
from langextract.inference import OpenAILanguageModel
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
language_model_type=OpenAILanguageModel,
model_id="gpt-4o",
api_key=os.environ.get('OPENAI_API_KEY'),
fence_output=True,
use_schema_constraints=False
)
...
...
Código Ejemplo 2 – Validación visual de extracción
LangExtract proporciona una visualización de cómo extrajo el texto. No es particularmente útil en este ejemplo, pero le da una idea de lo que es posible.
Simplemente agregue este pequeño fragmento de código al final de su código existente. Esto creará un archivo HTML que puede abrir en una ventana del navegador. A partir de ahí, puede desplazarse hacia arriba y hacia abajo de su texto de entrada y “Reproducir” los pasos que Langexact tomó para obtener sus salidas.
# Save annotated results
lx.io.save_annotated_documents([result], output_name="cattle_disease.jsonl", output_dir="d:/book")
html_obj = lx.visualize("d:/book/cattle_disease.jsonl")
html_string = html_obj.data # Extract raw HTML string
# Save to file
with open("d:/book/cattle_disease_visualization.html", "w", encoding="utf-8") as f:
f.write(html_string)
print("Interactive visualization saved to d:/book/cattle_disease_visualization.html")
Ahora, vaya al directorio donde su archivo HTML se ha guardado y ábralo en un navegador. Esto es lo que veo.
Código Ejemplo 3: recuperar múltiples salidas estructuradas
En este ejemplo, tomaremos un texto de entrada no estructurado: un artículo de Wikipedia en OpenAI, e intentaremos recuperar los nombres de todos los diferentes modelos de idiomas grandes mencionados en el artículo, junto con su fecha de lanzamiento. El enlace al artículo es,
https://en.wikipedia.org/wiki/OpenAI
Nota: La mayoría de los texto en Wikipedia, excluyendo citas, se ha publicado bajo el Creative Commons Attribution-Sharealike 4.0 Licencia internacional (Cc-by-sa) y el Licencia de documentación gratuita de GNU (GFDL) En resumen, esto significa que eres libre:
para compartir– Copiar y redistribuir el material en cualquier medio o formato
para adaptarse– remix, transformar y construir sobre el material
Para cualquier propósito, incluso comercialmente.
Nuestro código es bastante similar a nuestro primer ejemplo. Esta vez, sin embargo, estamos buscando menciones en el artículo sobre modelos LLM y su fecha de lanzamiento. Otro paso que tenemos que hacer es limpiar el HTML del artículo primero para asegurarse de que Langexact tenga la mejor oportunidad de leerlo. Usamos la biblioteca BeautifulSoup para esto.
import langextract as lx
import textwrap
import requests
from bs4 import BeautifulSoup
import langextract as lx
# Define comprehensive prompt and examples for complex literary text
prompt = textwrap.dedent("""Your task is to extract the LLM or AI model names and their release date or year from the input text \
Do not paraphrase or overlap entities.\
""")
examples = [
lx.data.ExampleData(
text=textwrap.dedent("""\
Similar to Mistral's previous open models, Mixtral 8x22B was released via a via a BitTorrent link April 10, 2024
"""),
extractions=[
lx.data.Extraction(
extraction_class="model",
extraction_text="Mixtral 8x22B",
attributes={"date": "April 10, 1994"}
)
]
)
]
# Cleanup our HTML
# Step 1: Download and clean Wikipedia article
url = "https://en.wikipedia.org/wiki/OpenAI"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# Get only the visible text
text = soup.get_text(separator="\n", strip=True)
# Optional: remove references, footers, etc.
lines = text.splitlines()
filtered_lines = [line for line in lines if not line.strip().startswith("[") and line.strip()]
clean_text = "\n".join(filtered_lines)
# Do the extraction
result = lx.extract(
text_or_documents=clean_text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash",
api_key="YOUR_API_KEY",
extraction_passes=3, # Improves recall through multiple passes
max_workers=20, # Parallel processing for speed
max_char_buffer=1000 # Smaller contexts for better accuracy
)
# Print our outputs
for extraction in result.extractions:
if not extraction.attributes:
continue # Skip this extraction entirely
print("Model:", extraction.extraction_text)
print("Release Date:", extraction.attributes.get("date"))
print()
Esta es una muestra reducida de la salida que obtuve.
Model: ChatGPT
Release Date: 2020
Model: DALL-E
Release Date: 2020
Model: Sora
Release Date: 2024
Model: ChatGPT
Release Date: November 2022
Model: GPT-2
Release Date: February 2019
Model: GPT-3
Release Date: 2020
Model: DALL-E
Release Date: 2021
Model: ChatGPT
Release Date: December 2022
Model: GPT-4
Release Date: March 14, 2023
Model: Microsoft Copilot
Release Date: September 21, 2023
Model: MS-Copilot
Release Date: December 2023
Model: Microsoft Copilot app
Release Date: December 2023
Model: GPTs
Release Date: November 6, 2023
Model: Sora (text-to-video model)
Release Date: February 2024
Model: o1
Release Date: September 2024
Model: Sora
Release Date: December 2024
Model: DeepSeek-R1
Release Date: January 20, 2025
Model: Operator
Release Date: January 23, 2025
Model: deep research agent
Release Date: February 2, 2025
Model: GPT-2
Release Date: 2019
Model: Whisper
Release Date: 2021
Model: ChatGPT
Release Date: June 2025
...
...
...
Model: ChatGPT Pro
Release Date: December 5, 2024
Model: ChatGPT's agent
Release Date: February 3, 2025
Model: GPT-4.5
Release Date: February 20, 2025
Model: GPT-5
Release Date: February 20, 2025
Model: Chat GPT
Release Date: November 22, 2023
Vamos a ver un par de estos. Una de las salidas de nuestro código fue esta.
Model: Operator
Release Date: January 23, 2025
Y del artículo de Wikipedia …
“El 23 de enero, Openai lanzado Operadorun Agente de IA y herramienta de automatización web para acceder a sitios web para ejecutar objetivos definidos por los usuarios. La función solo estaba disponible para usuarios profesionales en los Estados Unidos.[113][114]“
Entonces, en esa ocasión, podría haber alucinado el año como 2025 cuando no se dio el año. Sin embargo, recuerde que LangExtract puede usar su conocimiento interno del mundo para complementar sus resultados, y puede haber llegado el año de eso o de otros contextos que rodean la entidad extraída. En cualquier caso, creo que sería bastante fácil ajustar el mensaje de entrada o la salida para ignorar la información de la fecha de lanzamiento del modelo que no incluyó un año.
Otra salida fue esta.
Model: ChatGPT Pro
Release Date: December 5, 2024
Puedo ver dos referencias a ChatGPT Pro en el artículo original.
Franzen, Carl (5 de diciembre de 2024). “Operai lanza el modelo O1 completo con cargas y análisis de imágenes, debuta Chatgpt Pro”. VentureBeat. Archivado del original el 7 de diciembre de 2024. Consultado el 11 de diciembre de 2024.
Y
En diciembre de 2024, durante el evento “12 días de OpenAi”, la compañía lanzó el Sora modelo para chatgpt plus y usuarios profesionales,[105][106] También lanzó el avanzado OpenAi O1 modelo de razonamiento[107][108] Además, se introdujo ChatGPT Pro, se introdujo un servicio de suscripción de $ 200/mes que ofrece acceso a O1 ilimitado y funciones de voz mejoradas y resultados de referencia preliminares para el próximo OPERAI O3 Se compartieron modelos
Así que creo que LangExtract fue bastante preciso con esta extracción.
Debido a que hubo muchos más “éxitos” con esta consulta, la visualización es más interesante, así que repitamos lo que hicimos en el Ejemplo 2. Aquí está el código que necesitará.
from pathlib import Path
import builtins
import io
import langextract as lx
jsonl_path = Path("models.jsonl")
with jsonl_path.open("w", encoding="utf-8") as f:
json.dump(serialize_annotated_document(result), f, ensure_ascii=False)
f.write("\n")
html_path = Path("models.html")
# 1) Monkey-patch builtins.open so our JSONL is read as UTF-8
orig_open = builtins.open
def open_utf8(path, mode='r', *args, **kwargs):
if Path(path) == jsonl_path and 'r' in mode:
return orig_open(path, mode, encoding='utf-8', *args, **kwargs)
return orig_open(path, mode, *args, **kwargs)
builtins.open = open_utf8
# 2) Generate the visualization
html_obj = lx.visualize(str(jsonl_path))
html_string = html_obj.data
# 3) Restore the original open
builtins.open = orig_open
# 4) Save the HTML out as UTF-8
with html_path.open("w", encoding="utf-8") as f:
f.write(html_string)
print(f"Interactive visualization saved to: {html_path}")
Ejecute el código anterior y luego abra el archivo Models.html en su navegador. Esta vez, debería poder hacer clic en los botones Play/Siguiente/Anterior y ver una mejor visualización del procesamiento de texto de LangExtract en acción.
Para obtener más detalles sobre Langextract, consulte el repositorio de Github de Google aquí.
Resumen
En este artículo, le presenté a LangExtract, una nueva biblioteca de Python y un marco de Google que le permite extraer la salida estructurada de la entrada no estructurada.
Esbozé algunas de las ventajas que el uso de LangExtract puede traer, incluida su capacidad para manejar documentos grandes, su extracción de conocimiento aumentado y soporte de modelo múltiple.
Lo llevé a través del proceso de instalación: una simple instalación de PIP, luego, a través de algún código de ejemplo, mostró cómo usar Langextract para realizar consultas de tipo aguja en el tipo de aguja en un gran cuerpo de texto no estructurado.
En mi código de ejemplo final, demostré una operación de tipo RAG más tradicional al extraer múltiples entidades (nombres de modelos de IA) y un atributo asociado (fecha de lanzamiento). Para mis dos ejemplos principales, también le mostré cómo codificar una representación visual de cómo funciona LangExtract en acción que puede abrir y reproducir en una ventana de navegador.