Después de lanzar la primera parte del artículo, seguí consultando el Vectordb con diferentes consultas. No estaba contento con los resultados, así que quería optimizar la ingestión de datos en Pinecone (o al menos probarlo) un poco).
Mejora de la calidad de los datos
En primer lugar, intenté limpiar el Marrido del enlace a imágenes, nuevas líneas, separadores y otras cosas para que los archivos pasados a Pinecone sean más legibles.
Entonces, creé una pequeña función con expresiones regulares (¡gracias, chatgpt!) Para preprocesar el markdown extraído por Firecrawl antes de pasarlo a Pinecone.
def clean_markdown(md_text):
"""Cleans Markdown textual content by eradicating pictures and dividers."""
import re
md_text = re.sub(r"", "", md_text) # Take away markdown pictures
md_text = re.sub(r'
]*>', "", md_text) # Take away HTML pictures
md_text = re.sub(r"(*{3,}|-{3,})n(.*?)n(*{3,}|-{3,})", "", md_text, flags=re.DOTALL) # Take away dividers
md_text = re.sub(r'ns*n', 'n', md_text).strip() # Take away additional newlines
return md_text
Dividirse en trozos de longitud fija
Otra técnica que se puede utilizar para mejorar la pertinencia de los datos recuperados es dividir los artículos en fragmentos. En lugar de ingerir todo el artículo en la misma entrada del índice, se divide en trozos e se inserta en varias entradas del índice.
De esta manera, una sola entrada debe contener un solo concepto en lugar de un artículo completo, lo que facilita el cálculo de su relevancia para la consulta del usuario. Puede encontrar este enfoque utilizado en el archivo firecrawl_get_data_with_chunks.py En el repositorio de GitHub del laboratorio.
Soy muy consciente de que esto está lejos de ser perfecto. Simplemente estoy dividiendo el contenido en trozos de longitud fija e ignorando el contenido de los trozos. El mismo párrafo podría dividirse en diferentes trozos, lo cual es bastante aproximado.
Un enfoque más inteligente podría ser leer el artículo con ChatGPT, haciéndolo resumir los diferentes párrafos y luego cargar cada resumen en una fragmentación diferente. De esta manera, podemos obtener datos y fragmentos limpios que tienen un párrafo completo en el inside.
Dividirse en trozos con gpt4-o
Eso es exactamente lo que hice en mi último intento: di los archivos de Markdown del artículo en entrada a GPT4-O y pedí que los reescribiera, usando diferentes párrafos por publicación única.
Cada párrafo se convirtió en un trozo en Pinecone. En este caso, tiene un comienzo y un last, siendo un concepto completamente desarrollado en lugar de una cadena de tokens X.
Puede encontrar este método de fragmentación en el archivo del repositorio Firecrawl_get_data_with_chunks_openai.py.
Me tomó varias horas desarrollar y probar estas concepts, que no formaban parte del artículo inicial, por eso este episodio se publica el viernes en lugar del jueves routine.
Consulta de la base de datos de Pinecone
Al last de las pruebas de fragmentación, tenemos tres índices de piña diferentes que usaron los mismos datos de entrada pero los dividen de una manera diferente:
-
índice de artículocon una entrada por artículo
-
Artículo-índice con chunkscon los artículos divididos en diferentes trozos basados en el número de tokens utilizados
-
artículo-index-with-chunks-openaicon los artículos divididos por capítulos escritos por OpenAi
Los tres índices tienen la misma estructura en su lugar:
-
a valores campo, donde tenemos la representación vectorial del texto que pasamos. Esto se utilizará para encontrar el texto más relevante para la consulta de entrada utilizando un algoritmo de proximidad.
-
a chunk_text campo, donde almacenamos el texto que se utilizará como salida de la consulta (el artículo completo o la parte del artículo seleccionado)
-
tres campos de metadatos (autor, título y URL) que usaremos para citar los artículos utilizados para responder a la consulta
Pero, ¿cómo podemos consultar estos índices para recuperar los resultados?
La teoría es bastante easy, al menos en un nivel superficial. Cuando escribimos un aviso, básicamente estamos escribiendo una consulta en un lenguaje pure. Esta consulta se incrusta con el mismo algoritmo utilizado cuando incrustamos los artículos insertados en Pinecone. Nuestra consulta en sí se convierte en una serie de números para que Pinecone (u otras bases de datos vectoriales) pueda realizar una búsqueda de proximidad entre los valores de la consulta y los valores de los artículos. Los resultados más cercanos se devuelven con un cierto grado de proximidad y podemos filtrar los registros devueltos utilizando solo los más cercanos.
def retrieve_articles(question, top_k=3, confidence_threshold=0.3):
"""Retrieve probably the most related articles from Pinecone for a person question."""
# Generate question embedding
query_embedding = computer.inference.embed(
mannequin="llama-text-embed-v2",
inputs=[query],
parameters={"input_type": "question"}
)[0]["values"]
# Question Pinecone
outcomes = index.question(
vector=query_embedding,
top_k=top_k,
namespace="articles",
include_metadata=True
)
# Extract related articles
retrieved_docs = []
for match in outcomes["matches"]:
rating = match["score"]
metadata = match["metadata"]
# Add article particulars
retrieved_docs.append({
"title": metadata["title"],
"url": metadata["url"],
"creator": metadata["author"],
"content material": metadata["chunk_text"],
"rating": rating
})
# Compute highest confidence rating
max_score = max([doc["score"] for doc in retrieved_docs], default=0)
# Determine whether or not to make use of Pinecone or fallback to GPT-4o
use_pinecone = max_score >= confidence_threshold
return retrieved_docs if use_pinecone else None, use_pinecone
Una vez que se devuelven los registros, es solo una cuestión de ingeniería rápida. Necesitamos agregar los valores contenidos en el campo Chunk_Text de los registros a las ventanas de contexto de la solicitud e intentar encontrar la mejor manera de describir la salida deseada.
def generate_answer(question):
"""Generates a long-form tutorial reply utilizing retrieved articles."""
retrieved_docs, use_pinecone = retrieve_articles(question)
if use_pinecone:
# Extract full textual content from related articles
context_text = "nn".be part of([
f"Title: {doc['title']}nAuthor: {doc['author']}nContent:n{doc['content']}..."
for doc in retrieved_docs
])
# Assemble the GPT immediate
immediate = (
"Utilizing the next extracted content material from expert-written articles, "
"present a long-form, step-by-step, detailed reply with sensible directions. "
"Ensure to extract key data and construction the reply correctly.nn"
f"{context_text}nn"
f"📌 **Consumer's Query**: {question}nn"
f"💡 **Detailed Reply**:"
)
else:
# No related articles, fall again to GPT-4o common information
immediate = f"Present a long-form, detailed reply with step-by-step directions based mostly in your common information:nn📌 **Consumer's Query**: {question}nn💡 **Detailed Reply**:"
# Question GPT-4o
response = consumer.chat.completions.create(
mannequin="gpt-4o",
messages=[{"role": "user", "content": prompt}]
)
# Extract paragraphs from the response
return response.decisions[0].message.content material.strip(), use_pinecone, retrieved_docs
Este aviso probablemente se puede mejorar, pero los resultados son bastante buenos con los tres índices, incluso si creo que estoy obteniendo las mejores respuestas con el índice que usó GPT para fragmentar los artículos.
Pruebas
Después de toda esta introducción, es hora de probar a nuestro asistente y ver qué índice ofrece las mejores respuestas. Las respuestas son bastante largas
Prueba 1 – índice de artículo
¿Cómo puedo pasar por alto los sitios internet protegidos de Datadome?
Esta respuesta utiliza artículos más antiguos para responderlo y no menciona a Camufox, la última solución que utilicé para esta tarea, mientras menciona el cursor fantasma.
Otras partes de la respuesta son bastante buenas pero un poco genéricas y no tan interesantes, en un estilo GPT puro.
### Step 2: Detect Datadome on Goal Web site
- **Wappalyzer**: Use this software to examine the web site's tech stack and detect the presence of Datadome.
- **Cookie Inspection**: Acknowledge Datadome by searching for particular cookies within the web site's response headers, e.g., a "Datadome" cookie.
### Step 3: Preliminary Scraping Makes an attempt
- **Keep away from Primary Instruments**: Primary HTTP libraries like 'requests' or easy Scrapy setups will seemingly be blocked resulting from lack of JavaScript execution and human-like habits.
2. **Human-like Interactions**:
- Use instruments like `python_ghost_cursor` to simulate human-like mouse actions (not appropriate with Firefox).
- Randomize waits between actions to imitate human shopping patterns.
- Keep away from direct navigation to deep hyperlinks; as a substitute, simulate a person's path by the location.
### Step 5: Experiment with Completely different Browsers
- **Swap to Courageous Browser**: If Firefox doesn't work, attempt utilizing Courageous (a Chromium-based browser) with Playwright and see if it bypasses detection higher than Chrome.
### Step 6: Business Proxy Options
- **Proxy Rotation**: Use a service like Proxyempire to rotate IPs ceaselessly. Proxies will help bypass IP-based detection by altering your obvious origin.
- **Guarantee High quality Proxies**: Use residential proxies for a extra pure shopping fingerprint.
📚 **Sources:**
🔗 [How to scrape Datadome protected websites (early 2023 version)]( - Pierluigi Vinciguerra
🔗 [Bypassing Datadome with Web Scraping - End of 2023 Version]( - Pierluigi Vinciguerra
🔗 [THE LAB #2: scraping data from a website with Datadome and xsrf tokens]( - Pierluigi Vinciguerra
¿Cuáles son las mejores herramientas de código abierto para raspar en 2025?
Esto es bastante preciso. La respuesta comienza con herramientas tradicionales como Scrapy y Playwright y luego pasa a RapeGraphai, Nodriver y Camoufox.
La misma pregunta hecha al estándar GPT-4O proporciona una respuesta mucho menos relevante.
¿Cómo puedo cambiar la huella digital de mi navegador? ¿Qué herramientas debo usar?
Nuevamente, esta es una buena respuesta, no perfecta, pero al menos se refiere a los artículos correctos.
Prueba 2 – Artículo-índice con chunks
Veamos cómo cambian las respuestas (si lo hacen) utilizando este índice hecho con artículos divididos.
¿Cómo puedo pasar por alto los sitios internet protegidos de Datadome?
Esto es bastante interesante. Además de la introducción sobre la detección de Datadome, la respuesta no proviene de mis artículos. De hecho, hay algún código de nodo que no escribí, que es bastante genérico y no funcionará para la tarea. No es una buena respuesta.
¿Cuáles son las mejores herramientas de código abierto para raspar en 2025?
Nuevamente, es una mezcla de conocimiento common de GPT y algo agregado por mis artículos. Creo que la parte de Scrapoxy fue tomada de mis artículos, pero definitivamente no recomiendo Selenium y BeautifoUssoup en ellos.
¿Cómo puedo cambiar la huella digital de mi navegador? ¿Qué herramientas debo usar?
La respuesta volvió de The GPT Data y de los trozos de mi último artículo sobre las huellas digitales del navegador.
En la parte superior, también agregó un poco de autopromoción
Keep Knowledgeable and Adaptive:
Perceive that modifying fingerprints is an ongoing arms race. Preserve up to date on new fingerprinting ways, and usually adapt your methods.
Subscribing to assets like The Net Scraping Membership can present ongoing insights into the most recent developments in internet scraping and browser fingerprinting.
Veamos si el tercer índice funciona mejor.
Prueba 3 – artículo-index-with-chunks-openai
Dada la ilusión sobre las respuestas del índice anterior, esperemos que estas pruebas produzcan mejores resultados.
¿Cómo puedo pasar por alto los sitios internet protegidos de Datadome?
La respuesta está bien, comparable a la de la primera prueba. Agregó el enfoque de la ingeniería inversa de las llamadas del sitio internet, pero no mencionó GhostCursor o Camoufox.
Probablemente debería mejorar el aviso y usar más elementos en el resultado.
¿Cuáles son las mejores herramientas de código abierto para raspar en 2025?
Nuevamente, la respuesta está bien pero no tan buena como la primera prueba. Echando un vistazo a los artículos mencionados, supongo que ha extraído algunos trozos que no son realmente acertados.
¿Cómo puedo cambiar la huella digital de mi navegador? ¿Qué herramientas debo usar?
Manteniendo el límite de veinte trozos, obtuvimos nuevamente una respuesta brillante.
Seguí probando durante algún tiempo, aumentando el número de fragmentos utilizados con el primer índice, el que tiene un artículo completo por registro, pero los resultados no fueron excelentes; Parece que agregué más confusión al contexto. Seguiré jugando con esta configuración, y pronto escribiré el artículo last de la serie, en el que veremos cómo agregar una interfaz UX a nuestro asistente.