Volver al blog

Cómo construir un pipeline de base de datos vectorial fresca a partir de datos web en vivo

Ava Wilson
Ava Wilson

Expert in Web Scraping Technologies

20-Aug-2026

TL;DR:

  • Una base de datos vectorial no hace que los datos web sean frescos. La frescura proviene de un ciclo que renderiza la fuente, la limpia, la huella digitaliza, actualiza los fragmentos cambiados y elimina los fragmentos obsoletos.
  • El registro de la fuente es más importante que la incrustación sola. Cada fragmento necesita un ID estable, URL de la fuente, título, posición, huella digital del contenido y contexto de colección.
  • Los IDs de los fragmentos deben ser determinísticos. Derívalos de la fuente, posición y contenido normalizado para que los fragmentos sin cambios mantengan su identidad a través de las observaciones.
  • El upsert debe ir acompañado de la eliminación de fragmentos obsoletos. De lo contrario, los pasajes eliminados seguirán siendo buscables después de que la fuente cambie.
  • La evaluación de recuperación necesita verificaciones de frescura y relevancia. Mida si la revisión actual de la fuente está indexada antes de juzgar la calidad de búsqueda.
  • El Navegador Scrapeless Sin Scrap proporciona la entrada web en vivo renderizada. Chroma almacena y busca los vectores normalizados; ninguno de los productos reemplaza al otro.
  • Gratis para empezar. Las nuevas cuentas de Scrapeless incluyen tiempo de ejecución gratuito del Navegador de Scraping — regístrate en app.scrapeless.com.

Introducción: Un Índice Vectorial Es una Instantánea

Una base de datos vectorial responde preguntas sobre los registros que actualmente tiene almacenados. No sabe que una página fuente cambió, desapareció, se movió o renderizó una variante regional diferente después de la última ejecución de ingestión.

Esa distinción es la base de un pipeline de base de datos vectorial fresco. La capa web observa la página actual. Las transformaciones determinísticas la limpian y dividen. Una función de incrustación mapea fragmentos en vectores. La base de datos vectorial hace upsert de la nueva revisión y elimina los registros que ya no pertenecen a la página. La evaluación comprueba tanto la relevancia de recuperación como la frescura de la fuente.

Este tutorial utiliza el Navegador Scrapeless Sin Scrap para el límite de página renderizada y Chroma 1.5.9 para almacenamiento local de vectores. La verificación sin credenciales capturó una página pública a través de HTTP, y luego ejecutó el camino limpio → fragmento → huella digital → upsert → consulta contra Chroma. El paso de renderizado en la nube de Scrapeless sigue siendo un requisito explícito de clave API.

Pipeline a Primera Vista

Un pipeline de datos web de base de datos vectorial fresca separa la observación de la indexación.

Etapa Entrada Salida Control de frescura
Registrar URL pública aprobada y política Registro de fuente Propietario, región, cadencia
Renderizar URL y contexto del navegador Título y texto visible Estado de página esperado
Limpiar Texto renderizado Documento normalizado Reglas de plantilla
Fragmentar Documento normalizado Fragmentos ordenados Límites estables
Incrustar Texto de fragmento Vectores de longitud fija Registro de modelo/version
Upsert IDs, vectores, metadatos Registros actuales IDs determinísticos
Reconciliar IDs previos y actuales Eliminaciones obsoletas Manifiesto a nivel de fuente
Evaluar Conjunto de consultas y revisión de fuente Resultados de relevancia/frescura Umbrales de aceptación

Cada etapa almacena evidencia de manera independiente. Una mala recuperación puede entonces ser rastreada a la renderización, extracción, fragmentación, incrustación, índice o capa de consulta.

Lo Que Hace y No Hace la Base de Datos Vectorial

Una base de datos vectorial almacena vectores y registros asociados, luego busca vectores cercanos bajo una política de índice y distancia. Chroma puede almacenar incrustaciones, documentos y metadatos en una colección y consultar esos registros juntos. la descripción general de Chroma describe la colección y la superficie de recuperación.

La base de datos no descubre URLs, ejecuta JavaScript, identifica el artículo principal, elige un alcance de colección legal o decide que una revisión de fuente es actual. Esas responsabilidades permanecen en el pipeline de ingestión.

La siguiente separación mantiene clara la propiedad:

  • El Navegador Scrapeless Sin Scrap renderiza la página aprobada y preserva el contexto de sesión/región.
  • El código de limpieza elimina la navegación, chrome repetido, scripts y texto vacío.
  • El código de fragmentación define la unidad de recuperación.
  • La función de incrustación define el espacio vectorial.
  • Chroma almacena fragmentos actuales y devuelve registros más cercanos.
  • El manifiesto de la fuente decide qué registros anteriores son obsoletos.

Requisitos Previos

  • Python 3.12.
  • Chroma 1.5.9, HTTPX 0.28.1 y Beautiful Soup 4.14.3 para la verificación local ejecutada.
  • Node.js y el scrapeless-scraping-browser CLI para la entrada en la nube renderizada.
  • Una cuenta de Scrapeless y clave API.
  • Una o más fuentes públicas con un propósito de ingestión documentado y política de retención.

Instale las dependencias de vector y limpieza:

bash Copy
python -m pip install chromadb==1.5.9 httpx==0.28.1 beautifulsoup4==4.14.3

Etapa 1 — Renderizar la Fuente Web en Vivo

La etapa de renderización devuelve una entrega compacta: URL final, título y texto principal visible. No pase capturas de pantalla en bruto o una shell de página no examinada al pipeline vectorial.

Nota: El siguiente bloque requiere su clave API de Scrapeless. La verificación sin credenciales no pudo crear la sesión del navegador en la nube, por lo que no se presenta salida en la nube como una ejecución completada.

bash Copy
SESSION=$(scrapeless-scraping-browser new-session \
  --name vector-ingest --ttl 300 --proxy-country US --json \
  | jq -r '.taskId')

scrapeless-scraping-browser --session-id "$SESSION" open \
  "https://www.iana.org/help/example-domains"
scrapeless-scraping-browser --session-id "$SESSION" wait 3000
scrapeless-scraping-browser --session-id "$SESSION" eval '
JSON.stringify({
  url: location.href,
  title: document.title,
  text: document.body.innerText
})' > rendered-page.json

scrapeless-scraping-browser stop "$SESSION"

Las instrucciones rápidas del Scraping Browser explican la configuración de la sesión. La página del producto Scraping Browser y precios cubren la capa de navegador gestionado.

Etapa 2 — Limpiar y Dividir Con Límites Estables

La limpieza debe preservar el significado mientras hace que los cambios irrelevantes desaparezcan. Colapsar espacios en blanco repetidos, eliminar las regiones de navegación/footer conocidas antes de la entrega, y mantener la URL y el título finales junto al texto.

El ejemplo ejecutado usa ventanas de 80 palabras con un solapamiento de 15 palabras porque la página de prueba pública es corta. Esos valores son entradas de demostración, no recomendaciones universales. El tamaño del fragmento de producción debe seleccionarse en función del corpus objetivo, modelo de incrustación, conjunto de consultas y resultados de evaluación.

Las posiciones de los fragmentos son importantes. Si cada pequeña edición desplaza cada fragmento subsiguiente, los ID deterministas cambiarán a lo largo de la página. Preferir límites semánticos como encabezados y párrafos cuando la fuente los proporciona, luego aplicar una política de tamaño limitado dentro de cada sección.

Etapa 3 — Incrustar Con Metadatos Explícitos

Cada registro vectorial necesita suficiente metadatos para explicar su origen y revisión.

Campo Propósito
source_url Fuente de observación canónica
title Contexto de revisión humana
position Orden dentro de la página
content_sha256 Comparación de revisiones de origen
modelo/version de incrustación Decisiones de compatibilidad y re-indexación
contexto de colección Región, estado de la página y versión de adaptador

La muestra a continuación utiliza un vector de hashing de términos determinista de 64 coordenadas para mantener la ejecución local autocontenida. Prueba la plomería de la base de datos vectorial, no la calidad del modelo semántico. Sustitúyelo por un modelo de incrustación evaluado antes de la producción y re-indexa la colección cuando el espacio vectorial cambie.

SHA-256 produce las huellas digitales de origen y registro. FIPS 180-4 especifica los algoritmos de hash seguro. Una huella digital de contenido detecta cambios; no es una decisión de autorización o confianza.

Comienza a Hacer Scraping con Scrapeless

Potencia tu flujo de trabajo de web scraping y automatización con Scrapeless!
Regístrate hoy y obtén $5 de crédito gratissin necesidad de tarjeta de crédito.

Reclama tu crédito gratuito ahora en el Tablero de Scrapeless.

Tablero de Scrapeless mostrando $5.00 en Créditos de Equipo

Etapa 4 — Actualizar Fragmentos Actuales y Eliminar los Obsoletos

El siguiente programa lee rendered-page.json, crea IDs de fragmentos deterministas, los actualiza en una colección persistente de Chroma, elimina IDs anteriores que ya no están presentes y ejecuta una consulta.

python Copy
import hashlib
import json
import math
import os
import re
from pathlib import Path

import chromadb

VECTOR_SIZE = 64
CHUNK_WORDS = 80
OVERLAP_WORDS = 15


def hash_embedding(text: str) -> list[float]:
    vector = [0.0] * VECTOR_SIZE
    for token in re.findall(r"[a-z0-9]+", text.lower()):
        digest = hashlib.sha256(token.encode()).digest()
        bucket = int.from_bytes(digest[:2], "big") % VECTOR_SIZE
        vector[bucket] += 1.0 if digest[2] % 2 == 0 else -1.0
    length = math.sqrt(sum(value * value for value in vector)) or 1.0
    return [value / length for value in vector]


def make_chunks(text: str) -> list[str]:
    words = text.split()
    step = CHUNK_WORDS - OVERLAP_WORDS
    return [" ".join(words[start:start + CHUNK_WORDS]) for start in range(0, len(words), step)]


input_path = Path(os.environ.get("RENDERED_PAGE_PATH", "rendered-page.json"))
database_path = os.environ.get("CHROMA_PATH", "chroma-data")
page = json.loads(input_path.read_text(encoding="utf-8"))
clean_text = " ".join(page["text"].split())
chunks = make_chunks(clean_text)
fingerprint = hashlib.sha256(clean_text.encode()).hexdigest()

ids = [
    hashlib.sha256(f'{page["url"]}:{position}:{chunk}'.encode()).hexdigest()[:24]
    for position, chunk in enumerate(chunks)
]
metadata = [
    {
        "source_url": page["url"],
        "title": page["title"],
        "position": position,
        "content_sha256": fingerprint,
    }
    for position in range(len(chunks))
]

client = chromadb.PersistentClient(path=database_path)
collection = client.get_or_create_collection(
    name="live_web_pages",
    metadata={"hnsw:space": "cosine"},
)

previous = collection.get(where={"source_url": page["url"]})
stale_ids = sorted(set(previous["ids"]) - set(ids))
if stale_ids:
    collection.delete(ids=stale_ids)

collection.upsert(
    ids=ids,
    documents=chunks,
    metadatas=metadata,
    embeddings=[hash_embedding(chunk) for chunk in chunks],
)

query = collection.query(
    query_embeddings=[hash_embedding("example domains documentation")],
    n_results=min(2, len(ids)),
    include=["documents", "metadatas", "distances"],
)

print(json.dumps({
    "chromadb_version": chromadb.__version__,
    "vector_size": VECTOR_SIZE,
    "chunk_count": len(chunks),
    "stored_count": collection.count(),
    "stale_deleted": len(stale_ids),
    "fingerprint_prefix": fingerprint[:12],
    "top_ids": query["ids"][0],
}, indent=2))

La ejecución de la página pública en vivo produjo la siguiente salida:

json Copy
{
  "chromadb_version": "1.5.9",
  "vector_size": 64,
  "chunk_count": 2,
  "stored_count": 2,
  "stale_deleted": 0,
  "fingerprint_prefix": "9ed322155bab",
  "top_ids": [
    "8289a31c06c87c9e1abac29d",
    "3ee123fc6659b0c9168231ff"
  ]
}

La segunda ejecución devolvió la misma huella digital, IDs y recuento almacenado. Ese es el comportamiento esperado de fuente inalterada.

Etapa 5 — Detectar Cambios Antes de Re-Incrustar

Calcular una huella digital de fuente normalizada antes de fragmentar. Si la huella digital y el contexto de la colección coinciden con la observación exitosa anterior, la etapa vectorial puede detenerse sin cambiar registros.

Cuando la huella digital cambia, primero construir el nuevo conjunto de fragmentos. Actualizar IDs actuales, luego eliminar la diferencia entre IDs anteriores e IDs actuales. Mantener el antiguo manifiesto de origen hasta que la nueva escritura y conciliación se completen para que una transformación fallida no borre el último estado de índice conocido.

No confiar solo en marcas de tiempo. Una página puede devolver la misma marca de tiempo con contenido diferente, o una nueva marca de tiempo sin un cambio de texto significativo. Los IDs dirigidos por contenido hacen que la comparación sea determinista.

Etapa 6 — Agregar Búsqueda Híbrida Sin Perder Procedencia

Los vectores densos capturan relaciones definidas por el modelo de incrustación, mientras que la coincidencia léxica ayuda con identificadores exactos, códigos de productos y nombres raros. Una capa de recuperación híbrida puede combinar ambos, pero cada resultado todavía debe devolver la URL de origen, el título de la página, la posición del fragmento y la huella digital del contenido.
La procedencia describe cómo se generó una entidad y qué actividad la produjo. el vocabulario W3C PROV-O proporciona un modelo formal para entidades, actividades y agentes cuando un pipeline necesita linaje interoperable.

El texto web limpio para el pipeline RAG profundiza en la obtención, extracción y límites de fragmentación que preceden al almacenamiento en vectores.

Evaluar la Calidad y Frescura de la Recuperación

Evalúe el pipeline con dos conjuntos de preguntas independientes.

Las pruebas de frescura preguntan si la última revisión de fuente aprobada está presente, las secciones eliminadas están ausentes, el estado de la región y la página coincide con la política, y cada resultado apunta a la huella digital actual.

Las pruebas de recuperación preguntan si aparecen fragmentos relevantes para preguntas representativas, los identificadores exactos siguen siendo localizables, los fragmentos irrelevantes se mantienen por debajo del umbral de aceptación, y las citas se resuelven en la evidencia mostrada al modelo.

El documento de referencia del benchmark BEIR demuestra por qué la calidad de recuperación varía entre conjuntos de datos y tareas. Utilice un conjunto de consultas extraído de su corpus real en lugar de tratar una puntuación genérica como universal.

Lista de Verificación de Costos y Operaciones

  • Registre al propietario de la fuente, propósito, región, cadencia y retención antes de la recopilación.
  • Rechace estados de página inesperados antes de la incorporación.
  • Almacene la fuente, fragmento, incorporación y versiones del adaptador con cada registro.
  • Omitir contenido normalizado sin cambios por huella digital.
  • Elimine IDs de fragmentos obsoletos después de una actualización exitosa.
  • Reindexar cuando el modelo de incorporación o la dimensión del vector cambien.
  • No mantenga más de tres trabajadores por host objetivo a menos que el propietario apruebe otro límite.
  • Mida el éxito de representación, rendimiento de texto limpio, rotación de fragmentos, antigüedad del índice, relevancia de la consulta y validez de la cita por separado.

Conclusión: La Frescura Es un Ciclo de Reconciliación

Un pipeline de base de datos de vectores fresco es un sistema de reconciliación, no una importación única. Renderice la fuente aprobada, valide el estado de la página, normalice el contenido, cree fragmentos deterministas, incorpórelos bajo un modelo versionado, actualice los registros actuales y elimine los IDs obsoletos.

Scrapeless Scraping Browser posee la observación web renderizada. Chroma posee almacenamiento y búsqueda de vectores. El manifiesto entre ellos prueba qué revisión de fuente representa el índice.


¿Listo para construir un pipeline de conocimiento web fresco?

Únase a nuestra comunidad para reclamar un plan gratuito y conectarse con desarrolladores que construyen una ingestión RAG rastreable: Discord · Telegram.

Regístrese en app.scrapeless.com para obtener tiempo de ejecución gratuito de Scraping Browser y conectar el traspaso de páginas renderizadas a su almacenamiento de vectores evaluado.


Preguntas Frecuentes

Q: ¿Una base de datos de vectores mantiene los datos web frescos automáticamente?

No. Una base de datos de vectores almacena los registros que recibe. Su pipeline debe observar fuentes, comparar revisiones, actualizar fragmentos cambiados y eliminar fragmentos obsoletos.

Q: ¿Qué base de datos de vectores debería usar un pipeline de datos web?

Elija la base de datos que se ajuste a sus requisitos de implementación, filtrado de metadatos, índice, durabilidad, control de acceso y operaciones. Este tutorial utiliza Chroma como un ejemplo ejecutable local, no como un ranking universal.

Q: ¿Los pipelines de vectores de la web en vivo necesitan un proxy?

Las fuentes dinámicas o dependientes de la región a menudo necesitan una salida de navegador estable. Fije el país aprobado para que las observaciones sucesivas se refieran al mismo estado de página regional.

Q: ¿Qué sucede cuando cambia el DOM de la fuente?

Verifique nuevamente el adaptador de representación y extracción antes de indexar. Rechace un estado de página inesperado en lugar de incorporar un mensaje de acceso, un shell vacío o una página solo de navegación.

Q: ¿Cuánta concurrencia debería usar el recolector?

No mantenga más de tres trabajadores por host objetivo a menos que el propietario del sitio apruebe otro límite. La indexación de vectores se puede escalar por separado de la recopilación de fuentes.

Q: ¿Es legal extraer contenido web público para una base de datos de vectores?

La disponibilidad pública no resuelve todas las preguntas legales. Revise los términos de la fuente, la guía de robots, derechos de autor, privacidad, retención y el uso previsto a futuro; consulte con un abogado para el proyecto específico.

Q: ¿Puede este pipeline funcionar sin un agente de IA?

Sí. El renderizador, transformaciones deterministas, función de incorporación, cliente Chroma y suite de evaluación pueden funcionar como software programado sin un agente de IA.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar