7 puntos por GN⁺ 2024-09-03 | 1 comentarios | Compartir por WhatsApp
  • Un artículo que resume la experiencia de desarrollar un scraper web asistido por IA usando la nueva función de salidas estructuradas de OpenAI

Pedirle a GPT-4o que extraiga datos

  • El primer experimento consistió en pedirle a GPT-4o que extrajera datos de una cadena HTML
  • Se configuró una salida estructurada usando un modelo de Pydantic
    from typing import List, Dict  
    class ParsedColumn(BaseModel):  
        name: str  
        values: List[str]  
    
    class ParsedTable(BaseModel):  
        name: str  
        columns: List[ParsedColumn]  
    
  • El prompt del sistema era el siguiente:

    Eres un experto en web scraping. Debes recibir el contenido de una tabla HTML y extraer datos estructurados

Analizar tablas complejas

  • Después de probar con tablas simples, se evaluaron tablas complejas como el pronóstico del clima de 10 días de Weather.com
  • GPT-4o analizó los datos correctamente al agregar la columna Day/Night
  • Como la columna Condition no era visible en el sitio web, al principio pareció una alucinación, pero al inspeccionar el código fuente se confirmó que sí existía como etiqueta

Las filas combinadas rompen el modelo

  • Se probó una tabla simple de Wikipedia (Human Development Index), pero el modelo falló debido a las filas combinadas
  • Se intentó modificar el prompt del sistema, pero no tuvo efecto

Pedirle a GPT-4o que devuelva XPath

  • Para reducir el costo de las llamadas a la API de OpenAI, se le pidió que devolviera XPath en lugar de los datos analizados
  • Sin embargo, muchas veces el modelo devolvía XPath incorrectos o no devolvía datos

Combinar ambos enfoques

  • Se intentó un enfoque en el que, después de extraer los datos, se pedía XPath tomando esos resultados como referencia
  • Este método dio mejores resultados, pero apareció el problema de que las imágenes se convertían en texto

GPT-4o es muy caro

  • Hacer scraping con GPT-4o sale muy caro
  • Se redujo el costo agregando una lógica de limpieza para eliminar datos innecesarios de la cadena HTML

Conclusión y demo

  • La calidad de extracción de datos de GPT-4o fue sorprendente, pero el problema del costo resultó decepcionante
  • Se ofrece una demo simple usando Streamlit
  • Aún hay mucho por mejorar mediante más experimentos

Resumen de GN⁺

  • Este artículo explora las posibilidades y limitaciones del web scraping con IA
  • Muestra que es posible extraer con precisión datos de tablas complejas aprovechando la función de salidas estructuradas de GPT-4o
  • Aunque existen problemas de costo y algunas limitaciones técnicas, se puede confirmar el potencial de las herramientas de web scraping asistidas por IA
  • Otros proyectos con funciones similares incluyen BeautifulSoup y Scrapy

1 comentarios

 
GN⁺ 2024-09-03
Opiniones en Hacker News
  • Fue exitoso convertir el HTML a un formato simple (por ejemplo, Markdown) antes de pasarlo al LLM

    • Probó Extractus y dom-to-semantic-markdown
    • Internamente usa Apify y Firecrawl para ejecutar Magic Loops en la nube
    • En la extensión de Chrome usa dom-to-semantic-markdown
    • Está explorando formas de extraer elementos específicos mediante flujos de soporte al usuario
    • Al simplificar el problema, también tuvo éxito con GPT-4o mini
  • Para contenido estructurado (por ejemplo, listas de elementos, tablas simples) no se necesita un LLM

    • Hizo una primera versión del web scraper con IA, pero las heurísticas basadas en atributos y ubicación de los elementos fueron más rápidas, baratas y precisas
    • En la mayoría de los sitios web, el enfoque sin IA funciona muy bien
    • Hay que verificar si realmente se necesita IA
  • Sorprende que el autor del post completara el 99% del trabajo y no descargara ni probara ollama para ese 1% restante

    • Un modelo 7B o 30B podría funcionar bien en este caso
    • No hace falta GPT-4o
  • Usa un método que toma una captura de pantalla de la página, recorta la parte necesaria y se la pasa a GPT

    • Es útil cuando hay que hacer trabajo manual para comparar precios de distintos proveedores
    • Puede salir caro, pero sigue siendo más barato que una persona real y permite dedicar tiempo a tareas más significativas
  • OpenAI anunció recientemente la Batch API

    • Se pueden preparar todos los prompts y ejecutarlos por lotes
    • El costo se reduce a la mitad
    • Es útil para aplicaciones no en tiempo real
  • Dar ejemplos de HTML y pedir un snippet de código con beautifulsoup ha funcionado bien

    • La estructura que se quiere scrapear se mantiene igual
    • Usar un LLM para el parseo real es excesivo y puede distorsionar los resultados
  • Se pregunta si existe un "html reducer"

    • El 90% del source de la página son tokens innecesarios
    • Si se usa un parser del DOM para conservar solo los nodos con texto, podría haber un ahorro considerable
    • Usa readability, pero la calidad baja en sitios web con mucho JS
  • En vez de scrapear directamente con GPT-4o, se puede hacer que GPT-4o escriba un script simple de web scraping

    • Si surge un problema, usa un bucle de prompts
    • Es más eficiente crear y ejecutar un resolvedor de restricciones
  • En Kadoa están trabajando en tareas de web scraping automatizado con IA

    • Al principio usaban GPT-3, pero desarrollaron una solución rentable
    • Usan codegen para generar código de extracción con selectores CSS o XPath
    • Usan un LLM pequeño para limpiar los datos y mapearlos al formato deseado
    • Usan un LLM como juez para evaluar la calidad de los datos
    • Combinan métodos tradicionales de ingeniería ETL con etapas de LLM pequeños
  • Está construyendo una base de datos de música clásica

    • Usa ChatGPT para extraer listas de eventos desde Wikipedia
    • Usa chatgpt-mini para reducir costos
    • Usa BeautifulSoup(html).text para reducir la cantidad de tokens
    • Al scrapear 10,000 páginas, resultó más eficiente proporcionar el HTML y hacer que escribiera código Python
    • La función from_html de Pandas es útil, pero no todas las tablas usan la etiqueta <table>