Packaging & Context Handling
Packaging & Context Handling — совокупность приёмов отбора, сжатия, раскладки и подачи извлечённых фрагментов знаний в контекст LLM в составе Retrieval‑Augmented Generation (RAG). Цель — максимизировать полезность ограниченного токен‑бюджета, повысить точность и устойчивость ответов и обеспечить трассируемое цитирование источников. Под «упаковкой» понимается не только формирование списка фрагментов, но и их компрессия, порядок, группировка и инструкции модели, включая стратегии stuff, map‑reduce, refine и tree‑of‑chunks.[1][2]
Определение и мотивация
В RAG‑системах качество конечного ответа определяется не только ретривом, но и тем, как отобранные фрагменты попадают в промпт. Ограничения контекста и стоимость токенов заставляют балансировать между полнотой и точностью: лишние фрагменты повышают риск «потеряться в середине» (lost‑in‑the‑middle) и удлиняют латентность, а агрессивная фильтрация/компрессия может удалить ключевые доказательства.[3] В классическом RAG источники служат внешней «непараметрической памятью», обеспечивая актуальность и цитируемость, если упаковка позволяет LLM надёжно оперировать фактами и ссылками.[1]
Чанкование и извлечение контента
Политика сегментации (chunking) определяет размер/перекрытие чанков, нормализацию и гранулярность (document→passage→sentence). Типовые подходы:
- Правило фиксированного размера (по символам/токенам) с перекрытием для сохранения связности между чанками;[4][5]
- Семантическое чанкование (границы по близости эмбеддингов), уменьшающее «разрывы смысла».[6]
- Sentence‑window retrieval — изначально индексируются предложения; при ретриве извлекаются релевантные предложения с окном соседних предложений до/после для восстановления локального контекста.[7]
- Passage‑level индексация — разбиение Википедии на ~100‑словные пассажи стало стандартом в открытом QA (DPR), что отражает пользу мелкой гранулярности для первых стадий.[8]
- Нормализация и очистка (удаление мусора, заголовков/футеров, унификация пробелов), трекинг исходников/страниц/смещений на уровне метаданных для трассировки.[9]
- Дедупликация кандидатных чанков (точные и near‑duplicate): шинглы + MinHash/LSH для уменьшения повторов.[10]
Диверсификация и отбор (MMR и др.)
При формировании набора контекста требуется высокая релевантность и низкая избыточность. Классическая функция Maximal Marginal Relevance выбирает следующий фрагмент с учётом близости к запросу и наибольшему сходству с уже выбранными (штраф за дубликаты):
.[11]
Комбинирование сигналов: гибридный ретрив (BM25 + dense) → фьюжн (например, Reciprocal Rank Fusion, RRF) → переранжирование кросс‑энкодером/ColBERT:
- RRF: простая и эффективная несупервизорная схема слияния ранжировок разнородных ретриверов.[12]
- Кросс‑энкодерные реранкеры (BERT/MonoT5/совр. коммерческие API) значительно повышают точность топ‑k, но добавляют латентность.[13][14]
- Мультивекторный ретривер ColBERT (late interaction) часто служит эффективным реранкером/ретривером первого уровня на больших корпусах.[15]
- Гибридный поиск (BM25F+вектор) реализован в промышленных движках и библиотеках с настраиваемым весом/фьюжном (альфа, RRF и т. п.).[16][17]
Компрессия контекста
Сокращение объёма контекста без потери фактов критично для стоимости и латентности:
- Экстрактивная компрессия (извлечение ключевых предложений/фраз); абстрактивная суммаризация (перефразирование/сжатие). Классическая перспектива — Nenkova & McKeown.[18]
- Query‑guided / instruction‑guided сжатие: суммирование под запрос/задачу (выделение доказательств и удаления нерелевантного).
- Prompt/context compression средствами LLM‑фильтрации/прюнинга токенов (напр., LLMLingua/LLMLingua‑2) уменьшает токен‑бюджет при малой потере качества, но требует аккуратной валидации faithfulness.[19]
- Компрессия — это компромисс качество↔стоимость↔латентность: агрессивное сжатие повышает риск пропуска нюансов/предпосылок и ухудшает атрибуцию фактов.[20]
Стратегии упаковки (stuff/map‑reduce/refine/tree)
Ниже — четыре базовые схемы раскладки источников в промпте и типовые сценарии их применения (см. также таблицу сравнения).
- Stuff (прямая подача)
- Склеить выбранные фрагменты (после возможной компрессии) и подать их целиком. Просто и быстро, но ограничено объёмом и подвержено lost‑in‑the‑middle на длинном вводе.[2]
- Map‑Reduce
- На этапе map локально ответить/суммировать по каждому фрагменту/документу, затем reduce агрегирует (сравнение, голосование, слияние). Хорошо масштабируется по числу источников, снижая нагрузку на единичный промпт; риск потери перекрёстных связей между источниками при наивной агрегации.[2][21]
- Refine
- Последовательное улучшение: начальный ответ по первому фрагменту, затем итеративное refine с учётом следующего фрагмента (добавление/исправление). Удобно, когда важен порядок источников; риск «залипнуть» на ранних ошибках и накопить искажения.[22]
- Tree‑of‑chunks
- Иерархическое сжатие/сводка: локальные резюме по чанкам → свёртки на уровне разделов → итоговая сводка. Полезно для длинных документов; требует аккуратной передачи идентификаторов источников между уровнями для корректной атрибуции.[23]
| Стратегия | Идея | Стоимость/латентность | Риск потери контекста | Когда применять | Источники |
|---|---|---|---|---|---|
| Stuff | Все фрагменты сразу в один промпт | Низкая (до лимита контекста) | Высокий на длинных вводах (lost‑in‑the‑middle) | Небольшой объём, простые вопросы | [2][3] |
| Map‑Reduce | Локальные ответы → агрегация | Средняя/высокая (много вызовов) | Средний (зависит от качества reduce) | Много источников, нужна масштабируемость | [2][21] |
| Refine | Последовательное улучшение ответа | Средняя | Зависимость от порядка, риск закрепления ошибок | Когда важен порядок/эволюция ответа | [22] |
| Tree‑of‑chunks | Иерархические сводки | Средняя/высокая | Потеря деталей на верхних уровнях | Длинные документы/сборники | [23] |
Порядок и позиционирование источников
LLM хуже используют сведения из середины длинного контекста; полезные факты лучше располагать в начале/конце, группировать по темам/источникам и маркировать заголовками и ID. Переранжирование с учётом query‑aware важности и диверсификации помогает выносить ключевые фрагменты ближе к началу.[3][13]
Интеграция в пайплайн RAG (fusion → rerank → packaging)
Типичный многостадийный конвейер: hybrid retrieval (BM25 + dense) → fusion (RRF/взвешенная смесь) → rerank (Cross‑Encoder/ColBERT) → packaging (одна из стратегий) → генерация + цитирование. Гибридный поиск и RRF устойчивы к несопоставимости скорингов разных ретриверов; кросс‑энкодер повышает прецизионность входа в LLM, экономя токены.[16][12][14][15]
Оценка качества и абляции
Оценивание проводят на уровнях ретрива, упаковки и генерации:
- Ретрив: Recall@k, nDCG@k, MRR — стандартные метрики ИП.[24]
- Faithfulness/groundedness: доля утверждений, поддержанных цитатами; автоматические фреймворки (RAGAS, TruLens) + ручная валидация атрибуции.[25][26][27]
- End‑to‑end QA: EM/F1/ROUGE в зависимости от задачи/датасета (NQ/HotpotQA и т. д.).[1]
- Эффективность: latency p50/p95, число токенов, $‑стоимость; сравнение стратегий упаковки и уровней компрессии по качество↔стоимость.
- Абляции: отключение MMR/дедупликации/компрессии/изменение порядка для измерения вклада каждого компонента (по состоянию на 2025‑09‑10 практика RAG‑исследований рекомендует отчётливо фиксировать k, λ, размеры чанков и лимиты токенов).[28]
Практические рекомендации и чек‑лист
- k и диверсификация: начинайте с k=20–40 кандидатов из гибридного ретрива; применяйте MMR с \lambda≈0.5–0.8; жёстко штрафуйте дубликаты по URL/ID/хешу текста.[11][16]
- Чанкование: 200–400 токенов с 10–20% overlap при фиксированном чанковании; для юридико‑технических документов чаще помогает sentence/window схема.[4][7]
- Компрессия: используйте экстрактивную фильтрацию по запросу и осторожную абстракцию; LLMLingua‑подобные методы снижайте/повышайте в зависимости от faithfulness на ваших данных (обязательно A/B‑валидация).[19][27]
- Порядок: важные/высокоуверенные фрагменты — в начале промпта; группируйте по источникам/темам, явно помечайте ID и заголовки; учитывайте эффект lost‑in‑the‑middle (дублирование ключевого факта в начале и конце может помочь).[3]
- Реранк: если разрешает бюджет, добавляйте Cross‑Encoder/ColBERT на топ‑k (k≈50–200) перед упаковкой — это экономит токены генерации и повышает точность.[13][15]
- Fallback‑стратегии: (1) нехватка фактов → запрос дополнительных источников; (2) превышение лимита токенов → переключение stuff→refine или включение компрессии; (3) низкая уверенность/противоречия → ответ‑отказ с явным списком недостающих ID (см. шаблон ниже).
Псевдокод конвейера упаковки
# Input: query q cands = retrieve(q, K_sparse, K_dense) # поиск BM25, DPR etc. cands = diversify_MMR(cands, lambda=0.7) # диверсификация (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 с цитатами
Скелет prompt‑шаблона (фрагмент)
[ЗАПРОС ПОЛЬЗОВАТЕЛЯ]
{q}
[ИСТОЧНИКИ]
{# Каждый фрагмент с ID, названием и ссылкой #}
- [{id}] {title} — {url}
{content_snippet}
[ТРЕБОВАНИЯ]
1) Используй только факты из источников, ссылайся на [ID].
2) Если данных недостаточно, скажи об этом и попроси уточнения/доп.источники.
3) Сохраняй структуру ответа и укажи список использованных [ID].
Ограничения и открытые вопросы
- Галлюцинации и агрегация в map‑reduce/refine: абстрактивные сводки могут вводить новые факты; критичны чёткие инструкции об атрибуции и механизмы проверки цитат.[20][27]
- Потеря деталей при агрессивной компрессии/иерархическом сжатии; важно хранить обратные ссылки до первоисточника/страницы/смещения.
- Доменная переносимость ретриверов/реранкеров и компрессоров; требуется адаптация/тонкая настройка на доменных корпусах.[28]
- Приватность/PII и меморизация LLM: при генерации без строгого grounding возможна утечка приватных строк; применяйте фильтры, приватные хранилища и политику отказа.[29][30]
- Тренируемые «упаковщики», адаптивный порядок/раскладка, RLHF/feedback‑петли для повышения faithfulness, мультиязычный и сверхдлинный контекст — активные направления исследований.[28][3]
Ссылки
- 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]
Литература
- 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.
Примечания
- ↑ 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). (доступ: 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). (доступ: 2025‑09‑10). [4]
- ↑ LlamaIndex Docs. SentenceSplitter / TokenTextSplitter / SemanticSplitter. (доступ: 2025‑09‑10). [5] [6] [7]
- ↑ LlamaIndex Docs. SemanticSplitterNodeParser. (доступ: 2025‑09‑10). [8]
- ↑ 7,0 7,1 Haystack Docs. SentenceWindowRetriever. (доступ: 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. (доступ: 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. (доступ: 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). (доступ: 2025‑09‑10). [17]
- ↑ Pinecone Docs. Hybrid search. (доступ: 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. (доступ: 2025‑09‑10). [21]
- ↑ 23,0 23,1 LlamaIndex Docs. Tree Summarize. (доступ: 2025‑09‑10). [22]
- ↑ Manning, C. D., Raghavan, P., Schütze, H. (2008). Introduction to Information Retrieval. Cambridge Univ. Press. (см. главы о 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). (доступ: 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]