Сжатие сессии¶
Долгие чаты рано или поздно упираются в контекстное окно. Pipeline
решает это, периодически заменяя самые старые ходы vector-friendly
блоком-выжимкой.
Стратегии¶
HeuristicStrategy¶
Чистый Python, без затрат на LLM. Делит сессию на три области:
- head — первые
head_countсообщений (якорят намерение). - tail — последние
tail_countсообщений (недавний контекст). - important — сообщения из середины, содержащие ключевое слово
и достигающие
min_lengthсимволов.
Подходит для: маленьких моделей, чат-ботов с жёсткими задержками, предсказуемого поведения.
from protoprompt import HeuristicStrategy
strat = HeuristicStrategy(head_count=3, tail_count=5, min_length=80)
LLMSummaryStrategy¶
Вызывает LLM по разу на каждое скользящее окно, чтобы получить
компактную выжимку. Длина каждого окна ограничена target_chars_per_block
символами.
from protoprompt import LLMSummaryStrategy
strat = LLMSummaryStrategy(
model="llama3.1",
window_size=8,
max_blocks=3,
target_chars_per_block=600,
language="ru",
fallback=HeuristicStrategy(),
)
Откат при ошибке
LLMSummaryStrategy глотает ошибки LLM и делегирует стратегии
fallback. Это сделано намеренно: чат не должен ломаться из-за
тайм-аута модели. Настройте fallback явно, чтобы контролировать
поведение в деградировавшем режиме.
Подходит для: разговорчивых ассистентов, code-review-ботов, всего, где середина диалога несёт реальный сигнал, который ключевые слова пропускают.
Подключение¶
from protoprompt import Pipeline
pipeline = Pipeline(
store, llm,
strategy=strat,
compress_every_n=12,
embedding_model="nomic-embed-text",
)
# В конце каждого хода чата:
if pipeline.should_compress(len(session.messages)):
await pipeline.compress_and_store(session)
Внутри pipeline использует шаблон «сначала пишем, потом удаляем», чтобы при крэше хранилище не осталось в полуобновлённом состоянии.
Выбор compress_every_n¶
| Длина сессии | Рекомендация |
|---|---|
| ≤ 20 ходов | никогда |
| 20–60 ходов | 10 |
| 60+ ходов | 8 |
| Code-review-бот | 6 |
Меньшие числа — чаще сжатие (больше затрат на LLM), но плотнее рабочий контекст. Большие числа — дешевле, но выше риск переполнения.