Patrón de Recuperación Iterativa
Resuelve el "problema de contexto" en flujos de trabajo multi-agente donde los subagentes no saben qué contexto necesitan hasta que empiezan a trabajar.
Cuándo Activarlo
- Al generar subagentes que necesitan contexto del código base que no pueden predecir de antemano
- Al construir flujos de trabajo multi-agente donde el contexto se refina progresivamente
- Al encontrar fallos de "contexto demasiado grande" o "contexto faltante" en tareas de agentes
- Al diseñar pipelines de recuperación tipo RAG para exploración de código
- Al optimizar el uso de tokens en la orquestación de agentes
El Problema
Los subagentes se generan con contexto limitado. No saben:
- Qué archivos contienen el código relevante
- Qué patrones existen en el código base
- Qué terminología usa el proyecto
Los enfoques estándar fallan:
- Enviarlo todo: Supera los límites de contexto
- No enviar nada: El agente carece de información crítica
- Adivinar lo necesario: A menudo es incorrecto
La Solución: Recuperación Iterativa
Un bucle de 4 fases que refina progresivamente el contexto:
┌────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ DESPACHO │─────│ EVALUAR │ │
│ └──────────┘ └──────────┘ │
│ ▲ │ │
│ │ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ REPETIR │─────│ REFINAR │ │
│ └──────────┘ └──────────┘ │
│ │
│ Máximo 3 ciclos, luego continuar │
└────────────────────────────────────────────────────────────────┘
Fase 1: DESPACHO
Consulta inicial amplia para reunir archivos candidatos:
// Comenzar con intención de alto nivel
const initialQuery = {
patterns: ['src/**/*.ts', 'lib/**/*.ts'],
keywords: ['authentication', 'user', 'session'],
excludes: ['*.test.ts', '*.spec.ts']
};
// Despachar al agente de recuperación
const candidates = await retrieveFiles(initialQuery);
Fase 2: EVALUAR
Evaluar el contenido recuperado por relevancia:
function evaluateRelevance(files, task) {
return files.map(file => ({
path: file.path,
relevance: scoreRelevance(file.content, task),
reason: explainRelevance(file.content, task),
missingContext: identifyGaps(file.content, task)
}));
}
Criterios de puntuación:
- Alta (0.8-1.0): Implementa directamente la funcionalidad objetivo
- Media (0.5-0.7): Contiene patrones o tipos relacionados
- Baja (0.2-0.4): Tangencialmente relacionado
- Ninguna (0-0.2): No relevante, excluir
Fase 3: REFINAR
Actualizar criterios de búsqueda según la evaluación:
function refineQuery(evaluation, previousQuery) {
return {
// Añadir nuevos patrones descubiertos en archivos de alta relevancia
patterns: [...previousQuery.patterns, ...extractPatterns(evaluation)],
// Añadir terminología encontrada en el código base
keywords: [...previousQuery.keywords, ...extractKeywords(evaluation)],
// Excluir rutas confirmadas como irrelevantes
excludes: [...previousQuery.excludes, ...evaluation
.filter(e => e.relevance < 0.2)
.map(e => e.path)
],
// Apuntar a vacíos específicos
focusAreas: evaluation
.flatMap(e => e.missingContext)
.filter(unique)
};
}
Fase 4: REPETIR
Repetir con criterios refinados (máximo 3 ciclos):
async function iterativeRetrieve(task, maxCycles = 3) {
let query = createInitialQuery(task);
let bestContext = [];
for (let cycle = 0; cycle < maxCycles; cycle++) {
const candidates = await retrieveFiles(query);
const evaluation = evaluateRelevance(candidates, task);
// Verificar si tenemos suficiente contexto
const highRelevance = evaluation.filter(e => e.relevance >= 0.7);
if (highRelevance.length >= 3 && !hasCriticalGaps(evaluation)) {
return highRelevance;
}
// Refinar y continuar
query = refineQuery(evaluation, query);
bestContext = mergeContext(bestContext, highRelevance);
}
return bestContext;
}
Ejemplos Prácticos
Ejemplo 1: Contexto para Corrección de Errores
Tarea: "Corregir el error de caducidad del token de autenticación"
Ciclo 1:
DESPACHO: Buscar "token", "auth", "expiry" en src/**
EVALUAR: Encontrado auth.ts (0.9), tokens.ts (0.8), user.ts (0.3)
REFINAR: Añadir palabras clave "refresh", "jwt"; excluir user.ts
Ciclo 2:
DESPACHO: Buscar términos refinados
EVALUAR: Encontrado session-manager.ts (0.95), jwt-utils.ts (0.85)
REFINAR: Contexto suficiente (2 archivos de alta relevancia)
Resultado: auth.ts, tokens.ts, session-manager.ts, jwt-utils.ts
Ejemplo 2: Implementación de Funcionalidad
Tarea: "Añadir limitación de tasa a los endpoints de la API"
Ciclo 1:
DESPACHO: Buscar "rate", "limit", "api" en routes/**
EVALUAR: Sin coincidencias - el código base usa terminología "throttle"
REFINAR: Añadir palabras clave "throttle", "middleware"
Ciclo 2:
DESPACHO: Buscar términos refinados
EVALUAR: Encontrado throttle.ts (0.9), middleware/index.ts (0.7)
REFINAR: Se necesitan patrones de router
Ciclo 3:
DESPACHO: Buscar patrones "router", "express"
EVALUAR: Encontrado router-setup.ts (0.8)
REFINAR: Contexto suficiente
Resultado: throttle.ts, middleware/index.ts, router-setup.ts
Integración con Agentes
Usar en indicaciones para agentes:
Al recuperar contexto para esta tarea:
1. Comience con una búsqueda amplia de palabras clave
2. Evalúe la relevancia de cada archivo (escala 0-1)
3. Identifique qué contexto aún falta
4. Refine los criterios de búsqueda y repita (máximo 3 ciclos)
5. Devuelva archivos con relevancia >= 0.7
Mejores Prácticas
- Comience amplio, reduzca progresivamente - No sobre-especifique las consultas iniciales
- Aprenda la terminología del código base - El primer ciclo a menudo revela convenciones de nomenclatura
- Rastree lo que falta - La identificación explícita de vacíos impulsa el refinamiento
- Deténgase con "suficientemente bueno" - 3 archivos de alta relevancia superan a 10 mediocres
- Excluya con confianza - Los archivos de baja relevancia no se volverán relevantes
Relacionados
- The Longform Guide - Sección de orquestación de subagentes
- skill
continuous-learning- Para patrones que mejoran con el tiempo - Definiciones de agente incluidas con ECC (ruta de instalación manual:
agents/)