Contextual Retrieval
La recuperación contextual antepone a cada fragmento una nota redactada por un LLM que indica dónde se encuentra dentro del documento, para que los embeddings y BM25 encuentren los pasajes adecuados.
La recuperación contextual es una técnica de indexación para la generación aumentada por recuperación (RAG) en la que un modelo de lenguaje grande (LLM) lee cada documento completo y redacta una nota breve, normalmente de 50 a 100 tokens, que sitúa un fragmento dentro del documento. La nota se antepone al fragmento antes de generar su embedding y añadirlo a un índice de palabras clave, lo que permite que las búsquedas encuentren información que el fragmento por sí solo nunca menciona. Anthropic presentó la recuperación contextual en septiembre de 2024.
El problema que resuelve#
Las canalizaciones RAG dividen los documentos en fragmentos lo bastante pequeños como para generar embeddings precisos y para incluir varios en la ventana de contexto de un modelo, y los fragmentos extraídos de su documento suelen perder los datos que permitirían encontrarlos. El ejemplo de Anthropic es un fragmento de un informe financiero que dice: «Los ingresos de la empresa crecieron un 3 % con respecto al trimestre anterior». No indica el nombre de la empresa ni el trimestre, así que una pregunta sobre los ingresos de ACME en el segundo trimestre de 2023 no tiene nada con lo que coincidir, ni en los embeddings ni en la búsqueda por palabras clave. La recuperación contextual lo almacena así: «Este fragmento procede de un informe presentado ante la SEC sobre los resultados de ACME Corp en el segundo trimestre de 2023; los ingresos del trimestre anterior fueron de 314 millones de dólares. Los ingresos de la empresa crecieron un 3 % con respecto al trimestre anterior».
Los recortes de objetos pierden contexto igual que los fragmentos de texto. La solución de recorte de objetos de Ultralytics ejecuta YOLO26 en imágenes o vídeos y guarda cada detección en su propio archivo, crop_1.jpg, crop_2.jpg y así sucesivamente, de modo que un recorte muestra un camión, pero no indica de qué cámara, ubicación o escena procede. Indexar cada recorte con un prefijo breve que describa su fotograma de origen, como el nombre de la cámara, la hora y los demás objetos detectados a su alrededor, restablece ese contexto para la búsqueda por palabras clave y la búsqueda semántica.
Cómo funciona la recuperación contextual#
Para cada fragmento, el LLM recibe el documento completo y el fragmento, y se le pide que «proporcione un contexto breve y conciso que sitúe este fragmento dentro del documento completo con el fin de mejorar su recuperación en las búsquedas». Anthropic utilizó Claude 3 Haiku con almacenamiento en caché de prompts, que procesa cada documento una vez y lo reutiliza para todos sus fragmentos, y calculó un coste único de 1,02 $ por millón de tokens de documento. Los fragmentos contextualizados se añaden a un índice de embeddings («embeddings contextuales») y a un índice de palabras clave BM25 («BM25 contextual»). En el momento de la consulta se buscan resultados en ambos índices y se combinan, como en la búsqueda híbrida; después, un reordenador puntúa los 150 candidatos principales y los 20 mejores fragmentos se incluyen en el prompt.
Incorporar el fragmento de ejemplo a los embeddings, con y sin contexto, muestra el efecto en la búsqueda vectorial:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# Anthropic's example chunk and the context an LLM wrote for it from the full filing
chunk = "The company's revenue grew by 3% over the previous quarter."
context = "This chunk is from an SEC filing on ACME corp's performance in Q2 2023; the previous quarter's revenue was $314 million."
other = "Globex Corporation reported that Q2 2023 revenue fell 2% on weaker demand."
query = "How did ACME's revenue change in Q2 2023?"
candidates = {"plain chunk": chunk, "contextual chunk": f"{context} {chunk}", "Globex chunk": other}
# Cosine similarity of the query to each indexed text
scores = model.similarity(model.encode(query), model.encode(list(candidates.values())))[0]
for name, score in zip(candidates, scores):
print(f"{name}: {score:.2f}")El fragmento sin contexto obtiene una puntuación de 0,49 respecto a la pregunta, igual que un fragmento sobre otra empresa. Al anteponerle su contexto, obtiene una puntuación de 0,83 y queda en primer lugar por un amplio margen.
Recuperación contextual frente a técnicas relacionadas#
- Fragmentación tardía: Aporta a la incrustación de cada fragmento el contexto del documento mediante la atención del modelo de incrustación, sin realizar una llamada al LLM por fragmento. El texto almacenado del fragmento no cambia, por lo que la búsqueda por palabras clave no mejora.
- Fragmentación semántica: Decide dónde empiezan y terminan los fragmentos. Se combina con la recuperación contextual, que completa lo que cada fragmento deja sin decir.
- Prefijos de títulos y encabezados: La práctica más antigua y económica de anteponer el mismo título del documento o encabezado de sección a cada fragmento. La recuperación contextual escribe una nota distinta para cada fragmento.
- Ingeniería del contexto: La práctica más amplia de decidir qué se incluye en la ventana de contexto de un modelo durante la inferencia. La recuperación contextual actúa un paso antes, sobre lo que se indexa.
Mejoras medidas#
Anthropic midió los fallos de recuperación como 1 menos recall@20, es decir, la proporción de consultas cuyo fragmento pertinente no aparecía entre los 20 primeros resultados. La canalización de referencia falló en el 5,7 % de las consultas. Las incrustaciones contextuales redujeron esa cifra al 3,7 %, una reducción del 35 %, y al añadir BM25 contextual bajó al 2,9 %, una reducción del 49 %. Al volver a clasificar los resultados combinados, la tasa de fallos quedó en el 1,9 %, un 67 % menos que en la referencia.










