Я пытался добавить ИИ-чат в свое приложение и зашел в тупик
Я пытался добавить ИИ-ассистента в свой инструмент для управления проектами. Я хотел, чтобы пользователи могли задавать вопросы о просроченных задачах или заметках с совещаний. Это казалось простым. Я думал, что просто вызову API и дело с концом. Я ошибался.
После 15 сообщений ИИ стал работать медленно и выдавать бессвязные ответы. API начал выдавать ошибки, потому что диалог стал слишком длинным. Я использовал GPT-4 с лимитом в 8k токенов. Каждое сообщение включало длинные описания и заметки. История росла слишком быстро.
Я попробовал три разных решения:
- Усечение истории: я оставлял только последние несколько сообщений. Это ускорило работу, но ИИ забывал всё остальное.
- Суммаризация: я просил ИИ резюмировать чат каждые 5 сообщений. Это помогло с памятью, но увеличило расходы и задержку.
- Оценка релевантности: я пытался оставлять только самые важные сообщения. Это потребовало использования векторного хранилища и слишком усложнило систему.
Я понял, что мне нужна более эффективная стратегия. Я остановился на двух методах: стриминг и фиксированное окно контекста.
Стриминг делает приложение визуально быстрым. Пользователи видят, как текст появляется мгновенно, вместо того чтобы ждать полного ответа. Я использовал Server-Sent Events для отправки фрагментов текста по мере их поступления.
Я также разделил свой контекст на три части:
- Системный промпт: фиксированный набор инструкций.
- Динамический контекст: последние обновления проекта и статусы задач.
- История диалога: скользящее окно последних сообщений.
Я не отправляю всю историю каждый раз. Я отправляю ровно столько, сколько нужно для ответа на текущий вопрос. Это сократило размер полезной нагрузки на 40%. Это сэкономило мне деньги и повысило скорость работы.
Если вы создаете функции с ИИ, помните: Стриминг дает вам скорость. Хорошая стратегия контекста дает вам интеллект.
Как вы управляете памятью диалогов в своих приложениях? Используете ли вы скользящие окна или суммаризацию?