Почему ChatGPT превращается в слайд-шоу после 500 сообщений?
Вы ведете долгий диалог с ChatGPT - обсуждение проекта, дебаггинг кода, планирование - и через какое-то время интерфейс начинает отвечать с задержкой в секунды. Прокрутка дергается, кнопки реагируют не сразу. Это не ваше интернет-соединение и не серверы OpenAI. Это фронтенд, который не справляется с объемом DOM.
Почему так происходит? Каждое сообщение в диалоге - это сложный React-компонент с кучей div'ов, стилями, обработчиками. После 500 сообщений браузер вынужден отслеживать тысячи узлов DOM. Маппинг состояний, обновления интерфейса - всё это съедает ресурсы.
OpenAI, конечно, оптимизирует интерфейс, но они ориентируются на среднего пользователя. Если вы работаете с ChatGPT как с инструментом для длинных сессий (например, для совместной работы над BPMN-схемами), то вы сталкиваетесь с этой проблемой регулярно.
И самое неприятное: даже если вы очистите историю в настройках, это не поможет текущему диалогу. Нужно перезагрузить страницу, потеряв контекст. Но что если я скажу, что можно обрезать историю на лету, сохранив контекст для модели и разгрузив фронтенд?
Решение: хирургическое вмешательство в API и DOM
Мы пойдем в обход официальных ограничений. Вместо того чтобы ждать, пока OpenAI починит фронтенд, мы сами оптимизируем его. План:
- Перехватываем fetch-запросы, которые отправляются при отправке сообщения.
- Анализируем тело запроса, находим историю диалога.
- Обрезаем историю, оставляя только последние N сообщений (достаточно для контекста).
- Параллельно чистим DOM от старых сообщений, чтобы разгрузить браузер.
- Наслаждаемся плавной работой интерфейса.
Этот подход не требует бэкенд-доступа или модификации серверного кода. Мы работаем только на клиенте, через расширение браузера или userscript. И да, это полностью обратимо и безопасно, если делать аккуратно.
1Анализируем структуру запросов ChatGPT
Первым делом нужно понять, как ChatGPT отправляет сообщения. Открываем инструменты разработчика (F12) во вкладке Network, отправляем сообщение и смотрим на запросы.
На 28.02.2026 интерфейс ChatGPT может измениться, но принцип остается: отправляется POST-запрос на endpoint, похожий на https://chat.openai.com/backend-api/conversation. В теле запроса есть JSON с полем messages, которое содержит массив сообщений.
Пример тела запроса (упрощенно):
{
"action": "next",
"messages": [
{
"id": "msg_001",
"role": "user",
"content": "Привет"
},
{
"id": "msg_002",
"role": "assistant",
"content": "Здравствуйте!"
},
// ... сотни таких объектов
],
"model": "gpt-4o",
"parent_message_id": "..."
}Наша задача - перехватить этот запрос и обрезать массив messages, оставив, скажем, последние 50 сообщений. Этого достаточно для контекста, но избавит от лагов.
Внимание: Не обрезайте слишком агрессивно. Если оставить меньше 10 сообщений, модель может потерять важный контекст. Я рекомендую оставлять 30-50 последних сообщений. Также учтите, что конфиденциальность данных может быть затронута, если вы передаете историю третьим лицам, но мы работаем локально.
2Создаем content script для перехвата fetch
Мы будем использовать расширение для браузера (Manifest V3) или userscript (Tampermonkey). Я предпочитаю расширение, так как оно дает больше контроля. Но для простоты покажу userscript.
Создайте новый скрипт в Tampermonkey и добавьте следующий код:
// ==UserScript==
// @name ChatGPT History Optimizer
// @namespace http://tampermonkey.net/
// @version 2026.02.28
// @description Обрезает историю сообщений в запросах ChatGPT для борьбы с лагами
// @author Ваше Имя
// @match https://chat.openai.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// Сохраняем оригинальный fetch
const originalFetch = window.fetch;
// Переопределяем fetch
window.fetch = function(...args) {
const [resource, config] = args;
// Проверяем, что запрос идет к backend-api ChatGPT и это POST
if (typeof resource === 'string' && resource.includes('/backend-api/conversation') && config && config.method === 'POST') {
try {
// Парсим тело запроса
const body = JSON.parse(config.body);
// Если есть messages и это массив
if (body.messages && Array.isArray(body.messages)) {
// Оставляем только последние 50 сообщений
const originalLength = body.messages.length;
if (originalLength > 50) {
body.messages = body.messages.slice(-50);
console.log(`ChatGPT Optimizer: обрезано ${originalLength - 50} сообщений. Осталось: 50`);
// Обновляем тело запроса
config.body = JSON.stringify(body);
}
}
} catch (error) {
console.error('ChatGPT Optimizer: ошибка при обработке запроса', error);
}
}
// Вызываем оригинальный fetch с модифицированными аргументами
return originalFetch.apply(this, [resource, config]);
};
console.log('ChatGPT History Optimizer загружен и активен.');
})();Этот скрипт перехватывает все fetch-запросы, находит те, что идут к conversation endpoint, и обрезает историю сообщений до 50 последних. Вы можете настроить число 50 под свои нужды.
3Оптимизируем DOM: удаляем старые сообщения
Перехват API уменьшает объем данных в запросах, но DOM все еще содержит все старые сообщения. Нужно почистить и их.
Добавим в скрипт функцию, которая будет удалять старые сообщения из интерфейса. Мы будем ориентироваться на структуру DOM ChatGPT.
На 28.02.2026 структура может измениться, но принцип тот же: находим контейнер сообщений, выбираем все элементы сообщений, кроме последних N, и удаляем их.
// Функция для очистки старых сообщений из DOM
function cleanupOldMessages(keepLast = 30) {
// Селектор для контейнера сообщений - может потребоваться адаптация
const messageContainer = document.querySelector('[data-testid="conversation"]') || document.querySelector('main div div div div div');
if (!messageContainer) {
console.warn('ChatGPT Optimizer: не найден контейнер сообщений');
return;
}
// Находим все сообщения (примерные селекторы)
const messages = messageContainer.querySelectorAll('div[class*="message"]:not(:empty)');
if (messages.length > keepLast) {
const toRemove = messages.length - keepLast;
for (let i = 0; i < toRemove; i++) {
messages[i].remove();
}
console.log(`ChatGPT Optimizer: удалено ${toRemove} старых сообщений из DOM`);
}
}
// Вызываем очистку периодически или при событии
setInterval(cleanupOldMessages, 5000); // Каждые 5 секунд
// Также можно привязать к событию прокрутки или отправки сообщения
document.addEventListener('scroll', () => {
if (window.scrollY === 0) {
cleanupOldMessages();
}
});Этот код удаляет старые сообщения из DOM, оставляя только последние 30. Интервал в 5 секунд - компромисс между производительностью и актуальностью. Вы можете настроить его.
Важно: Селекторы DOM могут сломаться после обновления ChatGPT. Нужно быть готовым к этому. Если скрипт перестал работать, проверьте структуру DOM и обновите селекторы. Также учтите, что удаление элементов DOM может повлиять на функциональность, если интерфейс полагается на эти элементы. Протестируйте на нескольких диалогах.
4Тестируем и отлаживаем
После установки скрипта откройте длинный диалог с ChatGPT. Откройте консоль разработчика (F12) и посмотрите логи. Должны появиться сообщения от нашего оптимизатора.
Отправьте новое сообщение и проверьте, что запрос ушел с обрезанной историей. Также убедитесь, что интерфейс стал отзывчивее.
Если что-то пошло не так, отключите скрипт и проверьте, не сломал ли он функциональность. Всегда делайте бэкап важных диалогов, прежде чем экспериментировать. Кстати, для автоматического ревью диалогов есть инструменты, о которых я писал в статье "Ревью диалогов с ИИ".
Нюансы и возможные ошибки
1. Совместимость с обновлениями ChatGPT. OpenAI регулярно обновляет интерфейс. Селекторы DOM и endpoint'ы могут измениться. Будьте готовы обновлять скрипт.
2. Потеря контекста. Если обрезать слишком много, модель может потерять нить разговора. Начните с 50 сообщений и отрегулируйте под свои задачи. Помните, что модель имеет ограничение на длину контекста (например, 128K токенов у GPT-4o), но фронтенд может отправлять больше.
3. Безопасность. Скрипт имеет доступ к вашим сообщениям. Убедитесь, что вы доверяете источнику скрипта. Лучше писать свой или использовать проверенные. В свете последних атак, таких как ZombieAgent и ShadowLeak, безопасность данных должна быть на первом месте.
4. Производительность скрипта. Интервал очистки DOM может нагружать браузер. Если заметите подтормаживания, увеличьте интервал или привяжите очистку к событиям (например, отправке сообщения).
5. Взаимодействие с другими расширениями. Если у вас установлены другие расширения для ChatGPT (например, для экспорта диалогов), могут быть конфликты. Проверяйте.
FAQ
| Вопрос | Ответ |
|---|---|
| Это нарушает условия использования ChatGPT? | Модификация клиентского кода может нарушать условия. Однако мы не взламываем сервер, не обходим оплату и не крадем данные. Скрипт просто оптимизирует производительность на вашей стороне. Используйте на свой страх и риск. |
| Работает ли это с ChatGPT Plus и Enterprise? | Да, поскольку интерфейс тот же. Но если у Enterprise есть кастомные функции, возможны конфликты. |
| Можно ли использовать для других моделей, например, Qwen 2.5? | Принцип тот же, но endpoint'ы и структура запросов отличаются. Нужно адаптировать скрипт. Кстати, о проблемах с памятью у агентов я писал в статье "Почему ваш Qwen 2.5-агент забывает всё". |
| Что делать, если скрипт сломал ChatGPT? | Отключите скрипт (в Tampermonkey или расширении) и перезагрузите страницу. Если проблема осталась, очистите кеш браузера. |
Что дальше?
Этот метод - временное решение. В идеале OpenAI сами оптимизируют фронтенд для длинных диалогов. Но пока этого не произошло, мы можем взять дело в свои руки.
Если вы не хотите возиться со скриптами, есть альтернатива: использовать клиенты для ChatGPT с лучшей оптимизацией. Некоторые сторонние приложения, например, Chatbot UI, предлагают более легковесный интерфейс. Но они требуют настройки и могут не поддерживать все функции.
Еще один совет: регулярно архивируйте старые диалоги. Не держите в активной истории то, что не нужно. Это не только разгрузит интерфейс, но и снизит риски для приватности.
И помните: технологии меняются. То, что работает сегодня, может не работать завтра. Будьте готовы адаптироваться. Удачи в оптимизации!