Si estás trabajando en una empresa que utiliza datos web, sabes con seguridad que es sólo la primera capa de un producto más complejo. De hecho, los datos de rascado web se han almacenado tradicionalmente en archivos o bases de datos (buckets de almacenamiento en la nube, lagos de datos o almacenes de datos) y luego se han analizado utilizando herramientas de inteligencia empresarial (BI), tanto comerciales como propietarias. Por ejemplo, un equipo podría raspar precios de productos o comentarios de clientes de la web, guardar los datos brutos como archivos CSV/JSON, cargarlos en un almacén de datos SQL, y luego usar plataformas de BI como Tableau o Power BI para crear dashboards y informes. Las soluciones modernas de rascado web incluso emiten datos en formatos estructurados (CSV, JSON, Excel, etc Hoy en día, los grandes modelos de idiomas (LLM) están cambiando este paradigma. En lugar de depender únicamente de los dashboards estáticos o de las consultas SQL, las organizaciones pueden utilizar asistentes de IA para obtener información de los datos desgarrados a través de las promesas de lenguaje natural. En otras palabras, en lugar de que un humano escriba una consulta o interprete un gráfico, un asistente de IA puede responder directamente a preguntas sobre los datos. Piense en tener su interfaz similar a ChatGPT y escriba algunas promesas para obtener información, evitando la creación de los dashboards. He visto este tipo de enfoque en varios productos antes de que los LLM salieran, pero sin gran éxito. El paisaje evolucionado de la IA y las mejoras semanales que vemos en los LLM podrían cambiar el paisaje, explorando datos Imagínate a preguntar, Este enfoque promete un acceso más rápido e intuitivo a la información para usuarios no técnicos sin la necesidad de construir gráficos o escribir código.En las empresas pasadas en las que trabajé, he visto demasiadas veces una proliferación de diferentes dashboards por grupo de usuarios (si no por usuario), a veces extrayendo números diferentes unos de otros. “¿Cuál competidor tuvo el precio más alto en el último trimestre?” Por supuesto, surge un nuevo conjunto de desafíos: ¿y las alucinaciones?Si no vemos el número subyacente de una respuesta, ¿podemos estar 100% seguros de que la respuesta es correcta? En este post (y el siguiente de la serie Lab), construiremos un proyecto de fin a fin donde comenzaremos rascando los artículos en este boletín, colocándolos en una base de datos adecuada para el uso de IA, recuperando este conocimiento y luego publicando una aplicación web que pueda usar una versión enriquecida de un modelo GPT. Mejorar los conocimientos de LLM La integración de datos personalizados (como su conjunto de datos rasgado) en un LLM se puede hacer principalmente de dos maneras: por El modelo o el uso , y cada uno de estos métodos tiene pros y contras.Vamos a ver cómo se diferencian y qué enfoque podría ser el mejor para nuestro caso de uso. fine-tuning Retrieval-Augmented Generation (RAG) Fine-Tuning vs. Generación aumentada significa entrenar el LLM de base en datos adicionales para que absorba nuevos conocimientos. En esencia, tomas un modelo pre-entrenado y continúas entrenándolo en tu conjunto de datos específico de dominio, ajustando sus pesos para incorporar ese conocimiento. Por ejemplo, si has rasgado una colección de artículos técnicos, podrías ajustar un LLM en esos artículos. Después del ajuste, el modelo La información (en la medida en que fue representada en los datos de entrenamiento). El ajuste de fin es a menudo hecho proporcionando al modelo un gran conjunto de pares de preguntas y respuestas o pasajes de texto de sus datos para que aprenda a responder con esa información cuando sea relevante. - El conocimiento se convierte en parte de sus parámetros.La próxima vez que consultes el modelo, puede sacar de esta información cocida sin necesidad de ayuda externa. Fine-tuning intrinsically knows augmented from the inside adopta un enfoque diferente: el modelo permanece inalterado, pero le damos acceso a una base de conocimientos externa (normalmente a través de una búsqueda vectorial). El LLM luego genera su respuesta con la ayuda de ese contexto complementario. Para los boomers como yo, considere que es como insertar un CD en la cabeza del Neo en la Matriz para aprender nuevas habilidades y movimientos. En nuestro caso, la base de conocimiento podría ser una colección de artículos web rasgados almacenados en una base de datos especializada. RAG es como un examen de libro abierto para el LLM - en el momento de la consulta, mira la "página" relevante de datos y la utiliza para formular una respuesta, en lugar de depender únicamente de su memoria interna. Retrieval-Augmented Generation (RAG) retrieve relevant documents Como se puede imaginar, una diferencia clave es donde permanece el conocimiento adicional: con el ajuste fino, el conocimiento se incorpora. (los pesos del modelo se actualizan). Con RAG, el conocimiento permanece Fine-tuning es similar a enseñar al modelo nuevos hechos permanentemente, mientras que RAG es como equipar al modelo con una biblioteca dinámica que puede referenciar en el vuelo. in the model itself external Los dos enfoques tienen diferentes pros y contras: Fine-Tuning: Once fine-tuned, the model can respond faster and more integratedly to new knowledge. It doesn't need lengthy prompts with documents each time. A well-fine-tuned model typically outperforms the base model on domain-specific questions because it has a deeper understanding of that niche terminology and content. Pros: Fine-tuning can be resource-intensive and time-consuming – you need sufficient training data and computing power (or budget if using a service). It also makes the model static concerning that training snapshot. If your scraped data changes or new information comes in, you’d have to fine-tune again to update the model. There’s also a risk of the model or overriding some of its original knowledge if not carefully managed. Importantly, fine-tuning means your data becomes part of the model’s parameters, which could be a privacy concern if the model weights are exposed or if using a third-party service to fine-tune (your data is uploaded for training). Last but not least, once the knowledge is embedded in the model, you cannot cite any article used to improve it. Cons: forgetting Retrieval-Augmented Generation (RAG): No need to modify the LLM itself – you leave the base model as-is and simply provide relevant context at query time. This makes updating or expanding the knowledge base easy: add or remove documents in your external index, and the model will use the latest data. It’s very flexible and (which can be more secure). RAG can reduce hallucinations by grounding answers in real sources – essentially, the model has the “receipts” to back up its answer. It also typically requires less upfront work than full fine-tuning; most effort goes into setting up the retrieval system. Pros: keeps your proprietary data external RAG introduces more moving parts – you need a system for embedding and indexing documents and retrieving them at runtime. At query time, you pay the cost in latency and token length for feeding documents into the model’s prompt. If the retrieved documents aren’t relevant (due to a bad query or vector mismatch), the answer will suffer. The LLM is also limited by its input size; if the documents plus question exceeds the model’s context window, you might have to truncate or select fewer documents. Additionally, the raw text of documents might influence the model's style, which could lead to less coherent or conversational answers unless you prompt it to refine the wording. Cons: Para nuestro caso de uso de integrar datos arrebatados constantemente actualizados, RAG parece ser un enfoque mejor: puede atraer continuamente nuevos datos web y hacer que su asistente lo use de inmediato en lugar de retrasar periódicamente todo el modelo. Antes de avanzar, vale la pena señalar que el ajuste fino y el RAG no se excluyen mutuamente; pueden complementarse entre sí. Por ejemplo, puede ajustar un modelo para ajustar su tono o la capacidad de seguir las instrucciones (o agregar conocimientos que son pequeños y estáticos), y todavía usar el RAG para darle acceso a una base de conocimientos más grande que se actualiza con frecuencia. Uso de un modelo local vs. una API externa Otra consideración es para su asistente de IA: un modelo local (código abierto) que ejecute usted mismo o un modelo alojado a través de una API (como el GPT-3.5/GPT-4 de OpenAI o otros). what LLM to use – Modelos como LLaMA 2, Mistral o Falcon se pueden ejecutar en sus propios servidores. Sus datos arrebatados nunca salen de su entorno, lo que es importante si contiene información sensible. Puedes ajustarlos libremente en tus datos o modificar cómo funcionan. De manera rentable, ejecutar un modelo local podría ser más barato para grandes volúmenes de consultas (sin tarifas de API), pero tienes que invertir en hardware o infraestructura en la nube para alojarlo. La desventaja es que muchos modelos abiertos no podrían coincidir con el rendimiento de los GPT más recientes. Puede que necesites usar modelos más grandes o más especializados para obtener un rendimiento comparable, que puede ser complejo de gestionar. Tener un conjunto de datos altamente específico de dominio y la experiencia, un modelo local puede ser ajustado para sobresalir en ese dominio, lo que lo convierte en una sólida solución para un “GPT privado”. Local Open-Source LLMs control and privacy por – Usando una API como la GPT-4 de OpenAI significa que no tiene que preocuparse de ejecutar el modelo; sólo envía sus llamadas a su servicio y recibe la finalización. Esto es muy conveniente y generalmente le da acceso a la calidad del modelo de vanguardia sin problemas de infraestructura. Para nuestro escenario, usted podría usar RAG simplemente prependendo los documentos recuperados a su prompt y pidiendo a la API que responda. Las desventajas aquí se relacionan con la personalización y la privacidad. No todos los modelos están disponibles para ajustes finos ( También está sujeto a las reglas del proveedor (por ejemplo, podrían tener filtros de contenido que podrían prevenir algunas consultas relacionadas con el rascado). Desde un punto de vista de privacidad, está enviando sus datos (pregunta y contexto recuperado) a un tercero, por lo que no sugeriré este enfoque para datos sensibles o protegidos por derechos de autor. Otra limitación es el coste - cada llamada de la API cuesta tokens, que puede sumarse cuando está incluyendo un montón de contexto (texto rascado) en las solicitudes. External API LLMs (e.g. OpenAI’s) OpenAI, por ejemplo, le permite hacerlo en GPT4-o y GPT4-mini OpenAI, por ejemplo, le permite hacerlo en GPT4-o y GPT4-mini En general, si su caso de uso involucra datos altamente sensibles o requiere un control total, se recomienda un LLM local a pesar del esfuerzo adicional. Si su prioridad es la mejor capacidad de lenguaje posible y la configuración rápida, un modelo alojado como el de OpenAI podría ser la mejor opción. En la implementación de este post, ilustraremos el uso de la API GPT de OpenAI para simplicidad y calidad, pero el sistema de recuperación que construimos podría alimentarse tan fácilmente en un modelo de código abierto como Llama2 a través de las bibliotecas HuggingFace o LangChain. Considerando estas decisiones, vamos a integrar mis artículos rasgados en un asistente de IA. Utilizaremos el enfoque RAG con un modelo OpenAI, que se alinea bien con los datos web continuamente actualizados y evita la necesidad de costosos trabajos de ajuste. Scraping TWSC con Firecrawl es un motor de rascado web expuesto como una API REST y SDK. Está diseñado específicamente para convertir sitios web en (en formatos como texto limpio o marcado), maneja todo el levantamiento pesado, como enlaces de rastreo, renderización de JavaScript, y así sucesivamente.El gran beneficio de Firecrawl es que con una llamada de API, puede raspar un sitio entero. El Firecrawl LLM-ready data El Firecrawl El Firecrawl Para el blog de The Web Scraping Club, usaremos su sitemap para descubrir todas las URLs del artículo. (El blog está alojado en Substack, que proporciona un sitemap XML que enumera todas las publicaciones.) Firecrawl podría rastrear el sitio sin un sitemap, pero usarlo como punto de partida puede ser más eficiente y asegurarnos de no perder ninguna página. Primero, configuramos Firecrawl mediante la instalación de su SDK de Python y la autenticación con una clave de API (suponiendo que usted se haya registrado y obtuvo una clave): from firecrawl import FirecrawlApp import os os.environ["FIRECRAWL_API_KEY"] = "YOURKEY" # or load from .env app = FirecrawlApp() # Define the sitemap URL (we can loop this for multiple years if needed) map_result = app.map_url('https://substack.thewebscraping.club/sitemap.xml', params={ 'includeSubdomains': True }) print(map_result) for article in map_result['links']: if '/p/' in article: print(article) response = app.scrape_url(url=article, params={'formats': [ 'markdown' ]}) Con solo unas pocas líneas de código, nuestros artículos ya están en formato Markdown. Elegir una base de datos vectorial para RAG a es un componente clave de la implementación de RAG. Almacena las incorporaciones de sus documentos (representaciones vectoriales) y permite una búsqueda rápida de similitud para obtener documentos relevantes para una incorporación de consulta dada. Hay muchas opciones disponibles, incluyendo bibliotecas de código abierto y servicios de nube gestionados, pero para nuestra implementación, usaremos . vector database Pinecone es a Construido para una búsqueda rápida y escalable de similitud.A diferencia de las bases de datos de código abierto que requieren auto-hosting, Pinecone es una solución nativa de la nube, lo que significa que no tenemos que preocuparnos por la gestión de la infraestructura. Pinecón fully managed vector database Pinecón Instalación de Pinecone Los primeros pasos son, por supuesto, registrarse en Pinecone y obtener la API_KEY y el entorno del dashboard. pip install pinecone Finalmente, entonces, podemos conectarnos a Pinecone en nuestro guión from pinecone import Pinecone, ServerlessSpec pc = pinecone.Pinecone( api_key="YOUR API KEY" ) El valor del entorno proviene de la consola web Pinecone cuando crea su clave de API. Creación de un índice Pinecone Un índice es donde sus datos se almacenan para un retrivial posterior del LLM. En lugar de estar en texto simple, es en formato vectorial (básicamente una cadena de números), que permite al LLM entender qué entrada en el índice es más probable una buena respuesta para la consulta que el LLM hace. En A como , además de los datos vectoriales, también tenemos metadatos: metadatos son al lado de cada vector (incorporación) para hacer que la recuperación sea más significativa. vector database Pinecone, , or ChromaDB Weaviate extra information ChromaDB ChromaDB Weaviate Weaviate Mientras Representación para la búsqueda de similitudes, proporciona información estructurada sobre lo que representa el vector. Mientras que en los datos vectoriales insertaremos el marcado de los artículos, en los metadatos usaremos alguna información que queremos que el LLM comparta con nosotros, como el autor del blog utilizado para la respuesta, el título y el enlace al post. vectors numerical embeddings metadata filtering, categorization, and interpretability index_name = "article-index" if not pc.has_index(index_name): index_model = pc.create_index_for_model( name=index_name, cloud="aws", region="us-east-1", embed={ "model":"llama-text-embed-v2", "field_map":{"text": "chunk_text"} } ) #pc.describe_index(index_name) #to get the host index=pc.Index(host='YOURINDEXENDPOINT') ..... article_data = [ {"id": f"article-{i}", "text": page["markdown"], "url": page["metadata"]["url"], "title": page["metadata"]["title"], "author": page["metadata"]["author"][0]} for i, page in enumerate(scrape_results['data']) ] #print(article_data) # Generate embeddings using LLaMA v2 for article in article_data: # Estrai il testo dell'articolo text = article["text"] #print(text) # Single article insert to avoid failures embedding = pc.inference.embed( model="llama-text-embed-v2", inputs=[text], parameters={"input_type": "passage"} ) # Prepare data for Pinecone upsert vector_data = { "id": article["id"], # Unique article ID "values": embedding[0]["values"], # Embedding vector "metadata": { "url": article["url"], # Store article URL "content": text[:300], # Store first 500 chars as a preview/snippet "title": article["title"][:100], "author": article["author"][:50] } } #print(vector_data) # Upsert the single article into Pinecone index.upsert(vectors=[vector_data], namespace="articles") print(f"✅ Upserted: {article['id']} ({article['title']})") # Optional: Add a short delay to prevent API rate limits (adjust as needed) time.sleep(1) Como se puede ver del código, básicamente iteramos cada artículo rasgado antes y lo añadimos a un índice recién creado llamado . article-index Si quieres jugar más con Pinecone hay una amplia documentación en su página web. una amplia documentación en su página web. Pero ahora que he insertado todos los artículos en el índice, ¿podemos extraer la información que necesitamos? He creado un script básico llamado query.py para probar los resultados de las búsquedas en el índice. Cuando se le pregunta “¿Puede listar algunos artículos sobre el paso de Kasada?”, la consulta devuelve los siguientes artículos: {'matches': [{'id': 'article-0', 'metadata': {'author': 'Pierluigi Vinciguerra', ..., 'title': 'THE LAB #76: Bypassing Kasada With Open ' 'Source Tools In 2025', 'url': 'https://substack.thewebscraping.club/p/bypassing-kasada-2025-open-source'}, 'score': 0.419812053, 'values': []}, {'id': 'article-129', 'metadata': {'author': 'Pierluigi Vinciguerra', ..., 'title': 'How to by-pass Kasada bot mitigation?', 'url': 'https://substack.thewebscraping.club/p/how-to-by-pass-kasada-bot-mitigation'}, 'score': 0.418432325, 'values': []}, {'id': 'article-227', 'metadata': {'author': 'Pierluigi Vinciguerra', ..., 'title': 'Scraping Kasada protected websites', 'url': 'https://substack.thewebscraping.club/p/scraping-kasada-protected-websites'}, 'score': 0.378159761, 'values': []}], 'namespace': 'articles', 'usage': {'read_units': 6}} ¡No está mal!Todos los tres artículos eran exactamente sobre el tema! Para hoy es suficiente, en el próximo episodio veremos cómo conectar este DB a GPT4 y luego crear una interfaz de usuario simple para escribir prompts y obtener los datos que necesita. El artículo es parte de la serie “The Lab” de Pierluigi Vinciguerra. Compruebe su página Substack para obtener más información sobre el rascado web. El artículo es parte de la serie “The Lab” de Pierluigi Vinciguerra. Compruebe su página Substack para obtener más información sobre el rascado web. “El laboratorio”