Context - это полная история вашего взаимодействия с моделью. Т.к. API LLM - это stateless сервис, то вам нужно передавать весь контекст на каждый запрос.
Поэтому диалог в ChatGPT изнутри выглядит как-то так
User -- {
"role": "user",
"content": "Привет!"
} --> LLM
User <-- {
"role": "assistant",
"content": "Господи, ну что опять!?"
} -- LLM
User -- [
// history
{"role": "user", "content": "Привет!" },
{"role": "assistant", "content": "Господи, ну что опять!?"},
// new message
{"role": "user", "content": "Да так, заскучал" }
] --> LLM
Все, что вы запихнули в запрос к модели и есть контекст. Контекстное окно - это то, насколько большую JSONнину модель в принципе способна переварить.
И вот тут мы сталкиваемся с основной проблемой контекста - он растет.
500t
| user |
300t | agent |
| user | user |
100t | agent | agent |
| user | user | user |
| system | system | system |
И растет он экспоненциально. Т.е. на каждый следующий запрос в модель, вы отправляет все более и более жирный JSON. А это токены и бабки.
Хорошо, что контекст кешируется. Т.е. на самом деле вы отправляете что-то такое
50t
| user |
50t | |
| user | |
100t | | |
| user | 250ct | 450ct |
| system | cached | cached |
Кешированные токены могут или просто стоить дешевле, или вообще быть бесплатными (в подписке Claude Max). Но даже так они активнее сжигают ваши лимиты, так что общее правило - если закончили с текущей задачей, новую начинайте в другом чате. И модель умнее будет, и токены сильно сэкономите
Context Compaction - это самый базовый функционал, который необходим агенту. Если контекст слишком разросся, надо его как-то сжимать. А т.к. это просто JSON, то сжимать его можно каким угодно образом - учитывать только последние N сообщений, выкидывать определенные или случайные. Или сжимать весь текущий диалог в одно
<summary></summary> сообщение с помощью той же LLM - и поехали дальше. Последний вариант самый простой и популярный.Да, к слову: здесь вы уже способны написать ChatGPT (веб-приложение, не модель)
#Agents
