Trucos de context engineering para RAG más precisos

By Carlos Montiel | Especialista en IA Empresarial
Publicado: 2026-07-28 | Por: Carlos Montiel | Lectura: ~5 minutos

Un sistema RAG que recupera los documentos correctos pero se los presenta mal al modelo tiene el mismo resultado que uno que recupera mal: respuestas imprecisas. El retrieval es la mitad del problema — cómo estructuras lo recuperado es la otra mitad, y es la que menos equipos cuidan.

El problema de "lost in the middle"

Los modelos de lenguaje no le prestan atención uniforme a todo el contexto. La evidencia consistente en la industria es que la información al principio y al final del contexto se procesa con más fidelidad que la que queda en el medio. Si tu RAG mete 10 documentos y el dato crítico está en el documento número 6, el modelo tiene más probabilidad de perderlo que si estuviera en el 1 o el 10.

La implicación práctica: no basta con recuperar los documentos correctos por relevancia bruta — el **orden** en que los presentas importa. Pon el documento más relevante (según tu reranker) al principio y al final, no en medio de una lista larga.

def ordenar_para_contexto(documentos_rankeados): # Los más relevantes van a los extremos, no todos en orden # descendente simple n = len(documentos_rankeados) orden = [None] * n for i, doc in enumerate(documentos_rankeados): if i % 2 == 0: orden[i // 2] = doc # llena desde el inicio else: orden[n - 1 - i // 2] = doc # llena desde el final return orden

Reranking: el retrieval vectorial no es suficiente

La búsqueda por similitud de embeddings recupera documentos "semánticamente parecidos", pero eso no es lo mismo que "los documentos que realmente responden la pregunta". Un paso de reranking — un modelo (o incluso el mismo LLM) que reordena por relevancia real a la query específica — reduce drásticamente el ruido que llega al contexto final.

# Patrón típico: retrieval amplio, reranking estrecho candidatos = buscar_vectorial(query, k=30) # recall amplio, barato top_k = rerank(query, candidatos, top_k=5) # precisión, más caro pero # sobre 30 candidatos, no # sobre toda la base

El patrón "recall amplio + reranking estrecho" es más barato y más preciso que subir el `k` del retrieval vectorial directamente, porque el reranker opera sobre un set pequeño ya pre-filtrado.

Estructura el contexto, no lo concatenes crudo

Un error común: concatenar los chunks recuperados como texto plano, sin marcar dónde empieza y termina cada fuente. Esto hace que el modelo no pueda distinguir de dónde viene cada afirmación, lo cual dificulta tanto la precisión como la capacidad de citar fuentes.

contexto_estructurado = "\n\n".join( f'<documento id="{doc.id}" fuente="{doc.fuente}">\n{doc.texto}\n</documento>' for doc in documentos_recuperados ) prompt = f""" Responde la pregunta usando únicamente los documentos provistos. Cita el id del documento que respalda cada afirmación. {contexto_estructurado} Pregunta: {pregunta_usuario} """

Delimitar cada fuente con XML o markdown no es cosmético — mejora medible mente la capacidad del modelo de atribuir correctamente cada dato a su origen, y hace posible pedir citas verificables.

Usa citations nativas cuando el modelo las soporte

Algunos modelos soportan un modo de citations nativo: en vez de pedirle al modelo que "cite la fuente" en texto libre (que puede alucinar la cita), el sistema devuelve automáticamente qué fragmento exacto del documento respalda cada parte de la respuesta.

response = client.messages.create( model="claude-opus-4-8", max_tokens=1024, messages=[{ "role": "user", "content": [ { "type": "document", "source": {"type": "text", "media_type": "text/plain", "data": texto_documento}, "citations": {"enabled": True}, }, {"type": "text", "text": pregunta_usuario}, ], }], ) for block in response.content: if block.type == "text" and block.citations: for cita in block.citations: print(cita.cited_text, cita.document_title)

Esto elimina una clase entera de alucinación: la cita "inventada" que suena plausible pero no corresponde al texto real.

Deduplica antes de meter todo al contexto

Es común que el retrieval devuelva múltiples chunks que dicen esencialmente lo mismo (el mismo dato repetido en distintas secciones de un documento, o en documentos casi duplicados). Meter los tres al contexto no mejora la respuesta — infla tokens y aumenta la superficie para contradicciones si las versiones tienen matices distintos.

Una deduplicación simple por similitud entre chunks recuperados, antes de construir el prompt final, suele reducir el tamaño del contexto sin perder cobertura.

Cachea el contexto recuperado cuando sea reutilizable

Si múltiples usuarios preguntan sobre el mismo documento base, o el mismo usuario hace varias preguntas sobre el mismo contexto recuperado en una sesión, ese bloque de contexto es candidato directo para `cache_control` — exactamente el mismo principio del artículo de prompt caching, aplicado específicamente al contenido recuperado por RAG en vez del system prompt.

messages = [{ "role": "user", "content": [ { "type": "text", "text": contexto_estructurado, # el bloque de documentos recuperados "cache_control": {"type": "ephemeral"}, }, {"type": "text", "text": pregunta_usuario}, # varía, sin cache_control ], }]

Mide precisión de retrieval por separado de precisión de generación

El error final más común: cuando el RAG falla, se asume que es un problema del modelo generando mal la respuesta. Antes de tocar el prompt, verifica si el problema es que el retrieval nunca trajo el documento correcto en primer lugar. Un set de evaluación con preguntas cuya respuesta correcta conoces, y el documento que la contiene identificado de antemano, te permite medir por separado:

- **Recall del retrieval:** ¿el documento correcto estuvo entre los recuperados? - **Precisión de generación:** dado que el documento correcto estuvo presente, ¿el modelo lo usó bien?

Mezclar estas dos métricas es la razón número uno por la que los equipos "arreglan" el prompt cuando el problema real estaba en el índice de búsqueda.

Carlos Montiel
Arquitecto de Soluciones IA Empresarial
Especialista en LLMs, Agentes y Orquestación
guatemalia.com/#contacto · info@guatemalia.com

¿Necesitas implementar IA en tu empresa?

Carlos Montiel es arquitecto de soluciones IA empresarial. Implementa LLMs, Agentes, RAG y orquestadores en empresas de Guatemala y Latinoamérica. Contáctalo para una consultoría.

Contactar a Carlos Montiel

info@guatemalia.com