Cargando

Recuperación contextual

Lección 427 min

La recuperación contextual es una técnica que mejora la precisión de los pipelines de RAG al resolver un problema fundamental: cuando divides un documento en fragmentos, cada fragmento pierde su conexión con el contexto más amplio del documento.

El problema con la fragmentación estándar

Cuando tomas un documento fuente y lo divides en fragmentos para tu base de datos vectorial, cada pieza individual ya no sabe de dónde proviene ni cómo se relaciona con el resto del documento. Esto puede perjudicar la precisión de la recuperación porque los fragmentos carecen de información contextual importante.

Fragmentos de texto, dos de ellos citando el incidente INC-2023-Q4-011, y el documento fuente alimentan una indicación que le pide a Claude que sitúe el fragmento.

Cómo funciona la recuperación contextual

La recuperación contextual agrega un paso de preprocesamiento antes de insertar los fragmentos en tu base de datos de recuperación. Este es el proceso:

  • Toma cada fragmento individual y el documento fuente original
  • Envía ambos a Claude con una indicación específica pidiéndole que agregue contexto
  • Claude genera un breve fragmento que "sitúa" el fragmento dentro del documento más amplio
  • Combina este contexto con el fragmento original para crear un "fragmento contextualizado"
  • Usa el fragmento contextualizado en tus índices vectoriales y BM25

El fragmento de contexto de Claude más un fragmento de entrada encabezado "Sección 1: Ingeniería de software" se combinan en un fragmento contextualizado.

Por ejemplo, si tienes una sección sobre ingeniería de software que menciona un incidente de 2023, Claude podría generar un contexto como: "Esta sección proviene de un informe más amplio sobre un grupo multidisciplinario. Incluye una mención a INC-2023-04-011, que también se menciona en la sección de Análisis de Ciberseguridad".

El fragmento de contexto de Claude más un fragmento de entrada encabezado "Sección 1: Ingeniería de software" se combinan en un fragmento contextualizado.

Manejo de documentos grandes

Un problema común es cuando tu documento fuente es demasiado grande para caber en la ventana de contexto de Claude. Aún puedes usar la recuperación contextual proporcionando un conjunto reducido de contexto:

Nueve fragmentos de un documento, con solo los fragmentos 1 a 3 y 7 y 8 dados como contexto para el fragmento objetivo 9, descrito a continuación.

En lugar de incluir el documento completo, proporciona:

  • Algunos fragmentos del inicio del documento (que a menudo contienen resúmenes o extractos)
  • Fragmentos inmediatamente anteriores al fragmento que estás contextualizando

Este enfoque le da a Claude suficiente información para comprender la estructura del documento y el contexto inmediato sin sobrecargar la indicación.

Ejemplo de implementación

Aquí tienes una función básica para agregar contexto a los fragmentos:

python
def add_context(text_chunk, source_text):
    prompt = f"""
Write a short and succinct snippet of text to situate this chunk within the
overall source document for the purposes of improving search retrieval of the chunk.

Here is the original source document:
<document>
{source_text}
</document>

Here is the chunk we want to situate within the whole document:
<chunk>
{text_chunk}
</chunk>

Answer only with the succinct context and nothing else.
"""
    
    messages = []
    add_user_message(messages, prompt)
    result = chat(messages)
    
    return text_from_message(result) + "\n" + text_chunk

Para documentos grandes, puedes implementar una estrategia que seleccione fragmentos de contexto relevantes:

python
# Agrega contexto a cada fragmento y luego agrégalo al retriever
num_start_chunks = 2
num_prev_chunks = 2

for i, chunk in enumerate(chunks):
    context_parts = []
    
    # Conjunto inicial de fragmentos desde el inicio del documento
    context_parts.extend(chunks[: min(num_start_chunks, len(chunks))])
    
    # Fragmentos adicionales antes del fragmento actual que estamos contextualizando
    start_idx = max(0, i - num_prev_chunks)
    context_parts.extend(chunks[start_idx:i])
    
    context = "\n".join(context_parts)
    
    contextualized_chunk = add_context(chunk, context)
    retriever.add_document({"content": contextualized_chunk})

Cuándo usar la recuperación contextual

Esta técnica es más valiosa cuando:

  • Tus documentos tienen relaciones internas complejas entre secciones
  • Los fragmentos hacen referencia a conceptos definidos en otra parte del documento
  • Comprender la estructura del documento es importante para una recuperación precisa
  • Estás trabajando con documentos técnicos, informes o artículos académicos

Aunque la recuperación contextual agrega tiempo de procesamiento y costo (ya que realizas llamadas adicionales a la API), puede mejorar significativamente la precisión de la recuperación para documentos complejos donde el contexto importa.