## Что делает post-processing в RAG: После retriever’а у нас есть **список документов** (чанков), а в промпт модели нужно передать **одну строку контекста**. Post-processing – это этап, на котором мы: - форматируем каждый документ (добавляем заголовки, источники и т.п.); - соединяем их в одну строку; - при необходимости чистим/режем, чтобы контекст не разъехался по токенам. В LangChain это делает так называемая _“stuff documents chain”_: она форматирует каждый документ по шаблону `document_prompt`, соединяет их через `document_separator` и кладёт в переменную `context`, которая дальше уходит в промпт. Post-processing не ограничивается простым `"\\n\\n".join(...)`. Вокруг retrieved-документов можно делать много полезных вещей: **Типичные приёмы:** | Приём | Что делает | Когда полезен | | ---------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------ | | Простое объединение | Склеивает `page_content` через разделитель | Самый простой baseline | | Добавление заголовков | Печатает `Source`, `Page`, тип документа | Для дебага, пояснения пользователю, ссылок на источник | | Ограничение длины | Обрезает общий размер контекста (по символам/токенам) | Чтобы не переполнить контекст модели | | Удаление дубликатов | Убирает повторяющиеся/почти идентичные чанки | При агрессивных retriever-настройках | | Контекстная компрессия | Через отдельный retriever/компрессор выжимает из документов только релевантные части | Когда документы длинные, а окно контекста ограничено | LangChain прямо выделяет post-processing как важный шаг: например, `ContextualCompressionRetriever` специально создан для того, чтобы **обрезать из retrieved-доков всё нерелевантное**, прежде чем они попадут в промпт.