Packaging & Context Handling (ES)
Packaging & Context Handling es el conjunto de técnicas para la selección, compresión, organización y presentación de fragmentos de conocimiento extraídos en el contexto de un LLM como parte de la Generación Aumentada por Recuperación (RAG). El objetivo es maximizar la utilidad del presupuesto de tokens limitado, aumentar la precisión y la robustez de las respuestas, y garantizar la citación rastreable de las fuentes. Por "empaquetado" se entiende no solo la creación de una lista de fragmentos, sino también su compresión, orden, agrupación e instrucciones para el modelo, incluyendo estrategias como stuff, map‑reduce, refine y tree‑of‑chunks.[1][2]
Definición y motivación
En los sistemas RAG, la calidad de la respuesta final no solo está determinada por la recuperación (retrieval), sino también por cómo los fragmentos seleccionados se incorporan al prompt. Las limitaciones del contexto y el costo de los tokens obligan a encontrar un equilibrio entre la completitud y la precisión: los fragmentos innecesarios aumentan el riesgo de "perderse en el medio" (lost‑in‑the‑middle) y prolongan la latencia, mientras que un filtrado o compresión agresivos pueden eliminar evidencia clave.[3] En el RAG clásico, las fuentes actúan como una "memoria no paramétrica" externa, garantizando la actualidad y la capacidad de citación, siempre que el empaquetado permita al LLM operar de manera fiable con hechos y referencias.[1]
Segmentación (chunking) y extracción de contenido
La política de segmentación (chunking) define el tamaño/solapamiento de los segmentos (chunks), la normalización y la granularidad (document→passage→sentence). Los enfoques típicos son:
- Regla de tamaño fijo (por caracteres/tokens) con solapamiento para preservar la coherencia entre los segmentos;[4][5]
- Segmentación semántica (límites basados en la proximidad de los embeddings), que reduce las "rupturas de significado".[6]
- Recuperación por ventana de oración (Sentence‑window retrieval) — inicialmente se indexan oraciones; durante la recuperación, se extraen las oraciones relevantes junto con una ventana de oraciones vecinas (anteriores y posteriores) para restaurar el contexto local.[7]
- Indexación a nivel de pasaje (Passage‑level) — la división de Wikipedia en pasajes de ~100 palabras se ha convertido en un estándar en el QA de dominio abierto (DPR), lo que refleja la utilidad de una granularidad fina en las primeras etapas.[8]
- Normalización y limpieza (eliminación de contenido basura, encabezados/pies de página, unificación de espacios), seguimiento de fuentes/páginas/desplazamientos a nivel de metadatos para la trazabilidad.[9]
- Deduplicación de segmentos candidatos (exactos y near‑duplicate): shingles + MinHash/LSH para reducir repeticiones.[10]
Diversificación y selección (MMR y otros)
Al formar el conjunto de contexto, se requiere una alta relevancia y una baja redundancia. La función clásica de Relevancia Marginal Máxima (Maximal Marginal Relevance) selecciona el siguiente fragmento teniendo en cuenta su proximidad a la consulta y su mayor similitud con los ya seleccionados (penalización por duplicados):
.[11]
Combinación de señales: recuperación híbrida (BM25 + dense) → fusión (por ejemplo, Reciprocal Rank Fusion, RRF) → reordenamiento (reranking) con un cross‑encoder/ColBERT:
- RRF: un esquema no supervisado simple y eficaz para fusionar los rankings de diversos recuperadores.[12]
- Rerankers de tipo cross‑encoder (BERT/MonoT5/APIs comerciales modernas) aumentan significativamente la precisión del top‑k, pero añaden latencia.[13][14]
- Recuperador multivectorial ColBERT (late interaction) a menudo sirve como un reranker/recuperador de primer nivel eficaz en corpus grandes.[15]
- Búsqueda híbrida (BM25F+vector) se implementa en motores y bibliotecas industriales con pesos/fusión configurables (alfa, RRF, etc.).[16][17]
Compresión de contexto
Reducir el volumen del contexto sin perder hechos es crucial para el costo y la latencia:
- Compresión extractiva (extracción de oraciones/frases clave); resumen abstractivo (parafraseo/condensación). Una perspectiva clásica es la de Nenkova & McKeown.[18]
- Compresión guiada por consulta (query‑guided) / por instrucción (instruction‑guided): resumen adaptado a una consulta/tarea (resaltando evidencia y eliminando lo irrelevante).
- Compresión de prompt/contexto mediante filtrado/poda de tokens por LLM (p. ej., LLMLingua/LLMLingua‑2) reduce el presupuesto de tokens con una mínima pérdida de calidad, pero requiere una validación cuidadosa de la fidelidad (faithfulness).[19]
- La compresión es un compromiso entre calidad↔costo↔latencia: una compresión agresiva aumenta el riesgo de omitir matices/premisas y empeora la atribución de hechos.[20]
Estrategias de empaquetado (stuff/map‑reduce/refine/tree)
A continuación se presentan cuatro esquemas básicos para organizar las fuentes en el prompt y sus escenarios de aplicación típicos (ver también la tabla comparativa).
- Stuff (alimentación directa)
- Concatenar los fragmentos seleccionados (después de una posible compresión) y presentarlos en su totalidad. Es simple y rápido, pero está limitado por el volumen y es propenso al efecto lost‑in‑the‑middle en entradas largas.[2]
- Map‑Reduce
- En la etapa map, se responde/resume localmente para cada fragmento/documento, y luego la etapa reduce agrega los resultados (comparación, votación, fusión). Escala bien con el número de fuentes, reduciendo la carga en un único prompt; riesgo de perder conexiones cruzadas entre fuentes con una agregación ingenua.[2][21]
- Refine
- Mejora secuencial: una respuesta inicial basada en el primer fragmento, seguida de un refine iterativo que considera el siguiente fragmento (añadiendo/corrigiendo). Es útil cuando el orden de las fuentes es importante; riesgo de "atascarse" en errores tempranos y acumular distorsiones.[22]
- Tree‑of‑chunks
- Compresión/resumen jerárquico: resúmenes locales de los segmentos (chunks) → resúmenes a nivel de sección → resumen final. Útil para documentos largos; requiere una transferencia cuidadosa de los identificadores de las fuentes entre niveles para una atribución correcta.[23]
| Estrategia | Idea | Costo/Latencia | Riesgo de pérdida de contexto | Cuándo aplicar | Fuentes |
|---|---|---|---|---|---|
| Stuff | Todos los fragmentos a la vez en un solo prompt | Bajo (hasta el límite del contexto) | Alto en entradas largas (lost‑in‑the‑middle) | Volumen pequeño, preguntas simples | [2][3] |
| Map‑Reduce | Respuestas locales → agregación | Medio/Alto (muchas llamadas) | Medio (depende de la calidad del reduce) | Muchas fuentes, se necesita escalabilidad | [2][21] |
| Refine | Mejora secuencial de la respuesta | Medio | Dependencia del orden, riesgo de consolidar errores | Cuando el orden/evolución de la respuesta es importante | [22] |
| Tree‑of‑chunks | Resúmenes jerárquicos | Medio/Alto | Pérdida de detalles en los niveles superiores | Documentos/colecciones largos | [23] |
Orden y posicionamiento de las fuentes
Los LLM utilizan peor la información que se encuentra en el medio de un contexto largo; es mejor colocar los hechos útiles al principio/final, agruparlos por temas/fuentes y marcarlos con encabezados e IDs. El reordenamiento (reranking) que tiene en cuenta la importancia consciente de la consulta (query‑aware) y la diversificación ayuda a mover los fragmentos clave más cerca del principio.[3][13]
Integración en el pipeline de RAG (fusion → rerank → packaging)
Un pipeline típico de múltiples etapas es: recuperación híbrida (BM25 + dense) → fusión (RRF/mezcla ponderada) → reordenamiento (Cross‑Encoder/ColBERT) → empaquetado (una de las estrategias) → generación + citación. La búsqueda híbrida y el RRF son robustos a la incomparabilidad de las puntuaciones de diferentes recuperadores; un cross‑encoder aumenta la precisión de la entrada al LLM, ahorrando tokens.[16][12][14][15]
Evaluación de calidad y ablaciones
La evaluación se realiza a nivel de recuperación, empaquetado y generación:
- Recuperación (Retrieval): Recall@k, nDCG@k, MRR — métricas estándar de la recuperación de información (IR).[24]
- Fidelidad (Faithfulness/groundedness): proporción de afirmaciones respaldadas por citas; frameworks automáticos (RAGAS, TruLens) + validación manual de la atribución.[25][26][27]
- QA de extremo a extremo (End‑to‑end QA): EM/F1/ROUGE dependiendo de la tarea/dataset (NQ/HotpotQA, etc.).[1]
- Eficiencia: latencia p50/p95, número de tokens, costo en $; comparación de estrategias de empaquetado y niveles de compresión en términos de calidad↔costo.
- Ablaciones: desactivación de MMR/deduplicación/compresión/cambio de orden para medir la contribución de cada componente (a fecha del 2025‑09‑10, la práctica de investigación en RAG recomienda registrar claramente k, λ, tamaños de segmento y límites de tokens).[28]
Recomendaciones prácticas y lista de verificación
- k y diversificación: comience con k=20–40 candidatos de una recuperación híbrida; aplique MMR con λ≈0.5–0.8; penalice fuertemente los duplicados por URL/ID/hash de texto.[11][16]
- Segmentación (Chunking): 200–400 tokens con un 10–20% de solapamiento (overlap) para la segmentación de tamaño fijo; para documentos técnico-jurídicos, el esquema de oración/ventana suele ser más útil.[4][7]
- Compresión: utilice filtrado extractivo basado en la consulta y una abstracción cuidadosa; los métodos tipo LLMLingua deben ajustarse (reducirse/aumentarse) según la fidelidad (faithfulness) en sus datos (la validación A/B es obligatoria).[19][27]
- Orden: los fragmentos importantes/de alta confianza deben ir al principio del prompt; agrupe por fuente/tema, marque explícitamente los IDs y títulos; tenga en cuenta el efecto lost‑in‑the‑middle (duplicar un hecho clave al principio y al final puede ayudar).[3]
- Reordenamiento (Rerank): si el presupuesto lo permite, añada un Cross‑Encoder/ColBERT sobre el top‑k (k≈50–200) antes del empaquetado — esto ahorra tokens de generación y aumenta la precisión.[13][15]
- Estrategias de fallback: (1) falta de hechos → solicitar fuentes adicionales; (2) exceder el límite de tokens → cambiar de stuff→refine o activar la compresión; (3) baja confianza/contradicciones → respuesta de rechazo con una lista explícita de los IDs faltantes (ver plantilla a continuación).
Pseudocódigo del pipeline de empaquetado
# Input: query q cands = retrieve(q, K_sparse, K_dense) # búsqueda BM25, DPR, etc. cands = diversify_MMR(cands, lambda=0.7) # diversificación (MMR) snips = compress(query=q, items=cands, mode="extractive|abstractive", budget=tokens) pkg = package(snips, strategy="stuff|map_reduce|refine|tree") resp = generate(prompt=build_prompt(q, pkg), citations=True) # LLM con citas
Esqueleto de una plantilla de prompt (fragmento)
[CONSULTA DEL USUARIO]
{q}
[FUENTES]
{# Cada fragmento con ID, título y enlace #}
- [{id}] {title} — {url}
{content_snippet}
[REQUISITOS]
1) Utiliza únicamente hechos de las fuentes, citando por [ID].
2) Si los datos son insuficientes, indícalo y solicita aclaraciones o fuentes adicionales.
3) Mantén la estructura de la respuesta e indica la lista de [ID] utilizados.
Limitaciones y preguntas abiertas
- Alucinaciones y agregación en map‑reduce/refine: los resúmenes abstractivos pueden introducir nuevos hechos; son cruciales las instrucciones claras sobre la atribución y los mecanismos de verificación de citas.[20][27]
- Pérdida de detalles con compresión agresiva/jerárquica; es importante mantener enlaces inversos a la fuente original/página/desplazamiento.
- Portabilidad de dominio de los recuperadores/rerankers y compresores; se requiere adaptación/ajuste fino en corpus de dominio.[28]
- Privacidad/PII y memorización de los LLM: durante la generación sin un grounding estricto, es posible la fuga de cadenas de texto privadas; aplique filtros, almacenamientos privados y políticas de rechazo.[29][30]
- "Empaquetadores" entrenables, orden/organización adaptativa, bucles de RLHF/feedback para aumentar la fidelidad (faithfulness), contexto multilingüe y ultralargo — son áreas de investigación activas.[28][3]
Enlaces externos
- LangChain: Summarization (stuff/map_reduce/refine). [29]
- LangChain: Text splitters. [30]
- LlamaIndex: Response Synthesizers (refine/tree). [31]
- LlamaIndex: Node Parsers / SentenceSplitter / SemanticSplitter. [32]
- Haystack: SentenceWindowRetriever. [33]
- Haystack: PreProcessors / DocumentSplitter. [34]
- Weaviate: Hybrid search. [35]
- Pinecone: Hybrid search. [36]
- Cohere: Rerank API. [37]
- RAGAS (repo/docs). [38] [39]
- TruLens (docs). [40]
Bibliografía
- Manning, C. D., Raghavan, P., Schütze, H. (2008). Introduction to Information Retrieval. Cambridge University Press. ISBN 978‑0521865715.
- Nenkova, A., McKeown, K. (2011). Automatic Summarization. FnT IR, 5(2–3), 103–233. DOI:10.1561/1500000015.
- Lewis, P., et al. (2020). Retrieval‑Augmented Generation for Knowledge‑Intensive NLP Tasks. NeurIPS. arXiv:2005.11401.
- Khattab, O., Zaharia, M. (2020). ColBERT. SIGIR’20. DOI:10.1145/3397271.3401075.
- Izacard, G., Grave, E. (2021). Fusion‑in‑Decoder. EACL. arXiv:2007.01282.
- Ji, Z., et al. (2023). Survey of Hallucination in NLG. ACM CS. DOI:10.1145/3571730.
- Gao, S., et al. (2024). RAG for LLM: A Survey. arXiv:2312.10997.
Referencias
- ↑ 1.0 1.1 1.2 Lewis, P., Perez, E., Piktus, A., Petroni, F., Karpukhin, V., et al. (2020). Retrieval‑Augmented Generation for Knowledge‑Intensive NLP Tasks. NeurIPS. arXiv:2005.11401. [1]
- ↑ 2.0 2.1 2.2 2.3 2.4 LangChain Docs. Summarization (stuff/map_reduce/refine/map_rerank). (consultado el 2025‑09‑10). [2]
- ↑ 3.0 3.1 3.2 3.3 3.4 Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F., Liang, P. (2024). Lost in the Middle: How Language Models Use Long Contexts. TACL. arXiv:2307.03172. [3]
- ↑ 4.0 4.1 LangChain Docs. Text splitters (RecursiveCharacter/TokenTextSplitter). (consultado el 2025‑09‑10). [4]
- ↑ LlamaIndex Docs. SentenceSplitter / TokenTextSplitter / SemanticSplitter. (consultado el 2025‑09‑10). [5] [6] [7]
- ↑ LlamaIndex Docs. SemanticSplitterNodeParser. (consultado el 2025‑09‑10). [8]
- ↑ 7.0 7.1 Haystack Docs. SentenceWindowRetriever. (consultado el 2025‑09‑10). [9]
- ↑ Karpukhin, V., Oguz, B., Min, S., Lewis, P., Wu, L., Edunov, S., Chen, D., Yih, W.‑T. (2020). Dense Passage Retrieval for Open‑Domain Question Answering. EMNLP. arXiv:2004.04906. [10]
- ↑ Haystack Docs. PreProcessors / DocumentSplitter. (consultado el 2025‑09‑10). [11] [12]
- ↑ Broder, A. Z. (1997). On the Resemblance and Containment of Documents. Compression and Complexity of Sequences. [13]
- ↑ 11.0 11.1 Carbonell, J., Goldstein, J. (1998). The Use of MMR, Diversity‑Based Reranking for Reordering Documents and Producing Summaries. SIGIR’98, pp. 335–336. DOI:10.1145/290941.291025.
- ↑ 12.0 12.1 Cormack, G. V., Clarke, C. L. A., Büttcher, S. (2009). Reciprocal Rank Fusion outperforms Condorcet and Individual Rank Learning Methods. SIGIR’09, pp. 758–759. DOI:10.1145/1571941.1572114. [14]
- ↑ 13.0 13.1 13.2 Nogueira, R., Cho, K. (2019). Passage Re‑ranking with BERT. arXiv:1901.04085. [15]
- ↑ 14.0 14.1 Cohere Docs. Rerank API overview. (consultado el 2025‑09‑10). [16]
- ↑ 15.0 15.1 15.2 Khattab, O., Zaharia, M. (2020). ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT. SIGIR’20, pp. 39–48. DOI:10.1145/3397271.3401075. arXiv:2004.12832.
- ↑ 16.0 16.1 16.2 Weaviate Docs. Hybrid search (BM25F + vector). (consultado el 2025‑09‑10). [17]
- ↑ Pinecone Docs. Hybrid search. (consultado el 2025‑09‑10). [18]
- ↑ Nenkova, A., McKeown, K. (2011). Automatic Summarization. Foundations and Trends in Information Retrieval, 5(2–3), 103–233. DOI:10.1561/1500000015.
- ↑ 19.0 19.1 Zhu, Y., Shao, Z., Li, M., et al. (2023). LLMLingua: Compressing Prompts for Accelerating LLM Inference. arXiv:2310.05736. [19]
- ↑ 20.0 20.1 Ji, Z., Lee, N., Frieske, R., et al. (2023). Survey of Hallucination in Natural Language Generation. ACM Computing Surveys, 55(12), Art.248. DOI:10.1145/3571730.
- ↑ 21.0 21.1 Izacard, G., Grave, E. (2021). Leveraging Passage Retrieval with Generative Models for Open‑Domain QA (Fusion‑in‑Decoder). EACL. arXiv:2007.01282. [20]
- ↑ 22.0 22.1 LlamaIndex Docs. Response Synthesizers: refine. (consultado el 2025‑09‑10). [21]
- ↑ 23.0 23.1 LlamaIndex Docs. Tree Summarize. (consultado el 2025‑09‑10). [22]
- ↑ Manning, C. D., Raghavan, P., Schütze, H. (2008). Introduction to Information Retrieval. Cambridge Univ. Press. (ver capítulos sobre nDCG/MRR). [23]
- ↑ Es, S., et al. (2023). RAGAS: Automated Evaluation of Retrieval‑Augmented Generation. arXiv:2309.15217. [24]
- ↑ TruLens Docs. Evaluating RAG (groundedness, relevance). (consultado el 2025‑09‑10). [25]
- ↑ 27.0 27.1 27.2 Rashkin, H., Nakov, P., et al. (2023). Measuring Attribution in Natural Language Generation. Computational Linguistics, 49(4), 1207–1261. DOI:10.1162/coli_a_00486.
- ↑ 28.0 28.1 28.2 Gao, S., et al. (2024). Retrieval‑Augmented Generation for Large Language Models: A Survey. arXiv:2312.10997. [26]
- ↑ Carlini, N., Tramèr, F., et al. (2021). Extracting Training Data from Large Language Models. USENIX Security. [27]
- ↑ Shokri, R., Stronati, M., Song, C., Shmatikov, V. (2017). Membership Inference Attacks Against ML Models. IEEE S&P. [28]