Una guía de codificación para crear canales avanzados de inteligencia documental con Google LangExtract, modelos OpenAI, extracción estructurada y visualización interactiva

En este tutorial, exploramos cómo utilizar la biblioteca LangExtract de Google para transformar texto no estructurado en información estructurada legible por máquina. Comenzamos instalando las dependencias requeridas y configurando de forma segura nuestra clave API OpenAI para aprovechar potentes modelos de lenguaje para tareas de extracción. Además, construiremos un canal de extracción reutilizable que nos permitirá procesar una variedad de tipos de documentos, incluidos contratos, notas de reuniones, anuncios de productos y registros operativos. A través de indicaciones cuidadosamente diseñadas y anotaciones de ejemplo, demostramos cómo LangExtract puede identificar entidades, acciones, plazos, riesgos y otros atributos estructurados mientras los conecta a sus fuentes exactas. También visualizamos la información extraída y la organizamos en conjuntos de datos tabulares, lo que permite análisis posteriores, flujos de trabajo de automatización y sistemas de toma de decisiones.

!pip -q instalar -U “langextract[openai]” pandas IPython importar os importar json importar textwrap importar getpass importar pandas como pd OPENAI_API_KEY = getpass.getpass(“Ingrese OPENAI_API_KEY: “) os.environ[“OPENAI_API_KEY”] = OPENAI_API_KEY importar langextract como lx desde IPython.display importar visualización, HTML

Instalamos las bibliotecas necesarias, incluidas LangExtract, Pandas e IPython, para que nuestro entorno Colab esté listo para tareas de extracción estructuradas. Solicitamos de forma segura la clave API de OpenAI al usuario y la almacenamos como una variable de entorno para un acceso seguro durante el tiempo de ejecución. Luego importamos las bibliotecas principales necesarias para ejecutar LangExtract, mostrar resultados y manejar resultados estructurados.

MODEL_ID = “gpt-4o-mini” def run_extraction( text_or_documents, solicitud_descripción, ejemplos, salida_stem, model_id=MODEL_ID, extracción_passes=1, max_workers=4, max_char_buffer=1800,): resultado = lx.extract( text_or_documents=text_or_documents, solicitud_descripción=prompt_description, ejemplos=ejemplos, model_id=model_id, api_key=os.environ[“OPENAI_API_KEY”]valla_salida=Verdadero, uso_schema_constraints=Falso, extracción_pasos=extracción_pasos, max_workers=max_workers, max_char_buffer=max_char_buffer, ) jsonl_name = f”{output_stem}.jsonl” html_name = f”{output_stem}.html” lx.io.save_annotated_documents([result]nombre_salida=nombre_jsonl, dirección_salida=”.”) html_content = lx.visualize(nombre_jsonl) con open(nombre_html, “w”, codificación=”utf-8″) como f: if hasattr(html_content, “datos”): f.write(html_content.data) else: f.write(html_content) devuelve resultado, nombre_jsonl, nombre_html def extracción_rows(resultado): filas = []
para ex en result.extractions: start_pos = Ninguno end_pos = Ninguno if getattr(ex, “char_interval”, Ninguno): start_pos = ex.char_interval.start_pos end_pos = ex.char_interval.end_pos rows.append({ “class”: ex.extraction_class, “text”: ex.extraction_text, “attributes”: json.dumps(ex.attributes o {}, asegurar_ascii=False), “start”: start_pos, “end”: end_pos, }) return pd.DataFrame(rows) def vista previa_result(title, result, html_name, max_rows=50): print(“=” * 80) print(title) print(“=” * 80) print(f”Extracciones totales: {len(result.extractions)}”) df = extract_rows(resultado) mostrar(df.head(max_rows)) mostrar(HTML(f’

Abrir visualización interactiva: {html_name}

‘))

Definimos las funciones de servicios públicos principales que impulsan todo el proceso de extracción. Creamos una función run_extraction reutilizable que envía texto al motor LangExtract y genera salidas JSONL y HTML. También definimos funciones auxiliares para convertir los resultados de la extracción en filas tabulares y obtener una vista previa de ellos de forma interactiva en el cuaderno.

contract_prompt = textwrap.dedent(“”” Extraiga la información de riesgo del contrato en orden de aparición. Reglas: 1. Utilice intervalos de texto exactos de la fuente. No parafrasee el texto_extracción. 2. Extraiga las siguientes clases cuando estén presentes: – parte – obligación – fecha límite – término_pago – penalización – cláusula_terminación – ley_gobernante 3. Agregue atributos útiles: – nombre_parte para obligaciones o términos de pago cuando sea relevante – nivel_riesgo como bajo, medio o alto – categoría para el significado comercial 4. Mantenga la salida basada en la redacción exacta de la fuente. 5. No combine tramos no contiguos en una extracción “””) contract_examples =. [
lx.data.ExampleData(
text=(
“Acme Corp shall deliver the equipment by March 15, 2026. ”
“The Client must pay within 10 days of invoice receipt. ”
“Late payment incurs a 2% monthly penalty. ”
“This agreement is governed by the laws of Ontario.”
),
extractions=[
lx.data.Extraction(
extraction_class=”party”,
extraction_text=”Acme Corp”,
attributes={“category”: “supplier”, “risk_level”: “low”}
),
lx.data.Extraction(
extraction_class=”obligation”,
extraction_text=”shall deliver the equipment”,
attributes={“party_name”: “Acme Corp”, “category”: “delivery”, “risk_level”: “medium”}
),
lx.data.Extraction(
extraction_class=”deadline”,
extraction_text=”by March 15, 2026″,
attributes={“category”: “delivery_deadline”, “risk_level”: “medium”}
),
lx.data.Extraction(
extraction_class=”party”,
extraction_text=”The Client”,
attributes={“category”: “customer”, “risk_level”: “low”}
),
lx.data.Extraction(
extraction_class=”payment_term”,
extraction_text=”must pay within 10 days of invoice receipt”,
attributes={“party_name”: “The Client”, “category”: “payment”, “risk_level”: “medium”}
),
lx.data.Extraction(
extraction_class=”penalty”,
extraction_text=”2% monthly penalty”,
attributes={“category”: “late_payment”, “risk_level”: “high”}
),
lx.data.Extraction(
extraction_class=”governing_law”,
extraction_text=”laws of Ontario”,
attributes={“category”: “legal_jurisdiction”, “risk_level”: “low”}
),
]
) ]contract_text = “”” BluePeak Analytics proporcionará un panel listo para producción y un proceso de ETL subyacente a más tardar el 30 de abril de 2026. North Ridge Manufacturing remitirá el pago dentro de los 7 días calendario posteriores a la aceptación final. Si el pago se retrasa más de 15 días, BluePeak Analytics puede suspender los servicios de soporte y cobrar intereses al 1,5% mensual. Este Acuerdo se regirá por las leyes de Columbia Británica. “”” contract_result, contract_jsonl, contract_html = run_extraction( text_or_documents=contrato_texto, solicitud_descripción=contrato_prompt, ejemplos=contrato_examples, salida_stem=”contrato_riesgo_extraccion”, extracción_passes=2, max_workers=4, max_char_buffer=1400, ) vista previa_result(“CASO DE USO 1 – Extracción de riesgo de contrato”, contrato_resultado, contrato_html)

Creamos un flujo de trabajo de extracción de inteligencia de contratos definiendo un mensaje detallado y ejemplos estructurados. Proporcionamos a LangExtract ejemplos anotados de estilo de capacitación para que comprenda cómo identificar entidades como obligaciones, plazos, sanciones y leyes aplicables. Luego ejecutamos el proceso de extracción en un texto de contrato y obtenemos una vista previa de los resultados estructurados relacionados con el riesgo.

Meeting_prompt = textwrap.dedent(“”” Extraiga elementos de acción de las notas de la reunión en orden de aparición. Reglas: 1. Utilice intervalos de texto exactos del origen. No parafrasee en el texto de extracción. 2. Extraiga estas clases cuando estén presentes: – asignado – elemento_acción – fecha_de_vencimiento – bloqueador – decisión 3. Agregue atributos: – prioridad como baja, media o alta – flujo de trabajo cuando se pueda inferir del contexto local – propietario de elemento_acción cuando esté vinculado a un asignado asignado 4. Mantenga todos los intervalos basados en el texto fuente. 5. Preservar el orden de aparición “””) Meeting_examples =. [
lx.data.ExampleData(
text=(
“Sarah will finalize the launch email by Friday. ”
“The team decided to postpone the webinar. ”
“Blocked by missing legal approval.”
),
extractions=[
lx.data.Extraction(
extraction_class=”assignee”,
extraction_text=”Sarah”,
attributes={“priority”: “medium”, “workstream”: “marketing”}
),
lx.data.Extraction(
extraction_class=”action_item”,
extraction_text=”will finalize the launch email”,
attributes={“owner”: “Sarah”, “priority”: “high”, “workstream”: “marketing”}
),
lx.data.Extraction(
extraction_class=”due_date”,
extraction_text=”by Friday”,
attributes={“priority”: “medium”, “workstream”: “marketing”}
),
lx.data.Extraction(
extraction_class=”decision”,
extraction_text=”decided to postpone the webinar”,
attributes={“priority”: “medium”, “workstream”: “events”}
),
lx.data.Extraction(
extraction_class=”blocker”,
extraction_text=”missing legal approval”,
attributes={“priority”: “high”, “workstream”: “compliance”}
),
]
) ]meet_text = “”” Arjun preparará la hoja de precios revisada el martes por la noche. Mina confirmará los requisitos de residencia de datos del cliente empresarial esta semana. El grupo acordó enviar el piloto solo a la región de Omán primero. Bloqueado por una revisión de seguridad pendiente del equipo de TI del cliente. Ravi redactará el plan de reversión antes del corte de producción. “”” meet_result, Meeting_jsonl, Meeting_html = run_extraction( text_or_documents=meeting_text,prompt_description=meeting_prompt, ejemplos=meeting_examples,output_stem=”meeting_action_extraction”,extraction_passes=2, max_workers=4, max_char_buffer=1400, )view_result(“CASO DE USO 2: notas de la reunión para el seguimiento de acciones”, resultado_de la reunión, html de la reunión)

Diseñamos un extractor de inteligencia de reuniones que se centra en elementos de acción, decisiones, asignados y bloqueadores. Nuevamente proporcionamos anotaciones de ejemplo para ayudar a que la estructura del modelo cumpla con la información de manera consistente. Ejecutamos la extracción de notas de reuniones y mostramos el rastreador de tareas estructuradas resultante.

longdoc_prompt = textwrap.dedent(“”” Extraiga información sobre el lanzamiento del producto en orden de aparición. Reglas: 1. Utilice intervalos de texto exactos de la fuente. 2. Extraiga: – empresa – producto – fecha_lanzamiento – región – métrica – asociación 3. Agregue atributos: – categoría – importancia como baja, media o alta 4. Mantenga la extracción basada en el texto original. 5. No parafrasee el intervalo extraído. “””) longdoc_examples = [
lx.data.ExampleData(
text=(
“Nova Robotics launched Atlas Mini in Europe on 12 January 2026. ”
“The company reported 18% faster picking speed and partnered with Helix Warehousing.”
),
extractions=[
lx.data.Extraction(
extraction_class=”company”,
extraction_text=”Nova Robotics”,
attributes={“category”: “vendor”, “significance”: “medium”}
),
lx.data.Extraction(
extraction_class=”product”,
extraction_text=”Atlas Mini”,
attributes={“category”: “product_name”, “significance”: “high”}
),
lx.data.Extraction(
extraction_class=”region”,
extraction_text=”Europe”,
attributes={“category”: “market”, “significance”: “medium”}
),
lx.data.Extraction(
extraction_class=”launch_date”,
extraction_text=”12 January 2026″,
attributes={“category”: “timeline”, “significance”: “medium”}
),
lx.data.Extraction(
extraction_class=”metric”,
extraction_text=”18% faster picking speed”,
attributes={“category”: “performance_claim”, “significance”: “high”}
),
lx.data.Extraction(
extraction_class=”partnership”,
extraction_text=”partnered with Helix Warehousing”,
attributes={“category”: “go_to_market”, “significance”: “medium”}
),
]
) ]long_text = “”” Vertex Dynamics presentó FleetSense 3.0 para los equipos de logística industrial en todo el CCG el 5 de febrero de 2026. La compañía dijo que el lanzamiento mejora la precisión de la detección de desviaciones de ruta en un 22 % y reduce el tiempo de revisión manual en un 31 %. En la primera fase de implementación, la plataforma brindará soporte a Omán y los Emiratos Árabes Unidos. Vertex Dynamics también se asoció con Falcon Telematics para integrar eventos de comportamiento del conductor en vivo en el tablero. Una semana después, FleetSense 3.0 agregó un módulo de calificación de riesgos para los gerentes de seguridad. La actualización brinda a los supervisores una lista clasificada diaria de viajes de alto riesgo y eventos de excepción. La compañía describió el módulo como especialmente valioso para las operaciones de transporte de campos petroleros y las auditorías de flotas de contratistas. A fines de febrero de 2026, el equipo anunció un piloto con Desert Haul Services. El piloto cubre 240 vehículos pesados y se enfoca en acelerar la clasificación de incidentes, la revisión de cumplimiento y la recuperación de evidencia. 8 minutos en lugar de los 20 minutos anteriores “”” longdoc_result, longdoc_jsonl, longdoc_html = run_extraction( text_or_documents=long_text,prompt_description=longdoc_prompt, ejemplos=longdoc_examples,output_stem=”long_document_extraction”, extract_passes=3, max_workers=8, max_char_buffer=1000,)view_result(“CASO DE USO. 3 — Extracción de documentos largos”, longdoc_result, longdoc_html) batch_docs = [
“””
The supplier must replace defective batteries within 14 days of written notice.
Any unresolved safety issue may trigger immediate suspension of shipments.
“””,
“””
Priya will circulate the revised onboarding checklist tomorrow morning.
The team approved the API deprecation plan for the legacy endpoint.
“””,
“””
Orbit Health launched a remote triage assistant in Singapore on 14 March 2026.
The company claims the assistant reduces nurse intake time by 17%.
“””
]

lote_prompt = textwrap.dedent(“”” Extrae intervalos operativamente útiles en orden de aparición. Clases permitidas: – obligación – fecha límite – penalización – cesionario – elemento_acción – decisión – empresa – producto – fecha_lanzamiento – métrica Use solo texto exacto y adjunte un atributo simple: – tipo_fuente “””) lote_examples = [
lx.data.ExampleData(
text=”Jordan will submit the report by Monday. Late delivery incurs a service credit.”,
extractions=[
lx.data.Extraction(
extraction_class=”assignee”,
extraction_text=”Jordan”,
attributes={“source_type”: “meeting”}
),
lx.data.Extraction(
extraction_class=”action_item”,
extraction_text=”will submit the report”,
attributes={“source_type”: “meeting”}
),
lx.data.Extraction(
extraction_class=”deadline”,
extraction_text=”by Monday”,
attributes={“source_type”: “meeting”}
),
lx.data.Extraction(
extraction_class=”penalty”,
extraction_text=”service credit”,
attributes={“source_type”: “contract”}
),
]
) ]resultados_por lotes = []
para idx, doc en enumerar (batch_docs, inicio = 1): res, jsonl_name, html_name = run_extraction (text_or_documents = doc, Prompt_description = lote_prompt, ejemplos = lotes_examples, salida_stem = f”batch_doc_ {idx}”, extracción_passes = 2, max_workers = 4, max_char_buffer = 1200,) df = extract_rows(res) df.insert(0, “document_id”, idx) lote_results.append(df) print(f”Documento terminado {idx} -> {html_name}”) lote_df = pd.concat(batch_results, ignore_index=True) print(“\nSalida por lotes combinada”) display(batch_df) print(“\nRecuentos de extracción de contratos por clase”) display( extracción_rows(contrato_resultado) .groupby(“clase”, as_index=False) .size() .sort_values(“tamaño”, ascending=False) ) print(“\nSolo elementos de acción de la reunión”) reunión_df = extracción_rows(resultado_de la reunión) display(meeting_df[meeting_df[“class”] == “action_item”]) print(“\nSólo métricas de documentos largos”) longdoc_df = extract_rows(longdoc_result) display(longdoc_df[longdoc_df[“class”] == “métrica”]) final_df = pd.concat([
extraction_rows(contract_result).assign(use_case=”contract_risk”),
extraction_rows(meeting_result).assign(use_case=”meeting_actions”),
extraction_rows(longdoc_result).assign(use_case=”long_document”),
]ignore_index=True) final_df.to_csv(“langextract_tutorial_outputs.csv”, index=False) print(“\nCSV guardado: langextract_tutorial_outputs.csv”) print(“\nArchivos generados:”) para el nombre en [
contract_jsonl, contract_html,
meeting_jsonl, meeting_html,
longdoc_jsonl, longdoc_html,
“langextract_tutorial_outputs.csv”
]: imprimir(” -“, nombre)

Implementamos un canal de inteligencia de documentos extensos capaz de extraer información estructurada de un texto narrativo extenso. Realizamos la extracción en informes de lanzamiento de productos y documentos operativos, y también demostramos el procesamiento por lotes en múltiples documentos. También analizamos los resultados extraídos, filtramos clases clave y exportamos el conjunto de datos estructurados a un archivo CSV para su análisis posterior.

En conclusión, construimos un flujo de trabajo LangExtract avanzado que convierte documentos de texto complejos en conjuntos de datos estructurados con una base de origen rastreable. Ejecutamos múltiples escenarios de extracción, incluido el análisis de riesgos de contratos, el seguimiento de acciones de reuniones, la extracción de inteligencia de documentos extensos y el procesamiento por lotes de múltiples documentos. También visualizamos las extracciones y exportamos los resultados estructurados finales a un archivo CSV para su posterior análisis. A través de este proceso, vimos cómo el diseño rápido, la extracción basada en ejemplos y las técnicas de procesamiento escalables nos permiten construir sistemas robustos de extracción de información con un código mínimo.

Consulte los códigos completos aquí. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 120.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.

¿Necesita asociarse con nosotros para promocionar su repositorio de GitHub O su página principal de Hugging O su lanzamiento de producto O seminario web, etc.? Conéctate con nosotros