## Что делает 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-доков всё нерелевантное**, прежде чем они попадут в промпт.