Галоўная / Артыкулы

Працюе па перыях стрымуванне LLM з Redis Streams як месца саўершэння кожнага перыя

Адмініструемая стрымінгаванне LLM: публікацыя запісей дзеяння агента ў Redis Stream, прызначаны для кожнага раунду, ў якім кліенты можаць продовжыць працу пасля перэрываў з’яўлення з’ўязку і довгачасных пауз у працы інструменту.

Выдавец: REACTAPP.TOP9 хв чытання2049 слоў

Крыніцы: Building Resumable Real-Time LLM Streaming with Redis Streams

Што мы хацелілі

Адказы агента можу дзейсніцца за дзесяткі секунд: разумаванне, запуск навыку, вызов інструментаў, чаканне, перэдача токенаў. У дэмантах застаецца адна відкладзеная з’язнанне. У працоўным рэжыме перэдача зупіняецца ў серэдзіне адказу, паўтарна настаёць разгрузка шлюзоў, і выхадзіць пауза на час, калі інструменты вяртаюцца за мінуты. Мета — возможнае паўторныя перэдачы у рэальны час, каб кліент могаў знову наступіць у з’язнанне і продактуваць той самы крок.

Парадокс

Ітэрацыя 1: кліент размовляе безпосерэдна з агентам

Проста, але кранічна нестойкая. Будзь-якія проблемы сеткі завершаюць перэдачу. Горызонтальная масштабаванне значыць абавязковую паставу сесій або втрату падзеяў.

Ітэрацыя 2: стрымінг gRPC между службамі

Лепшыя внутрашнія контракты, але яна ўсё такі некомфортная для кліентаў у браузерах і застаецца слабай пад час мнагачысткавых пауз пасля перэзапуску падмножын.

Чаму не Kafka?

Чудова для стойкіх лог-файлам; важка, чым трэба для зустрочэй за кожны раунд з короткім зберагчыць часам і групамі спожывачаў, якія паслаба падходзяць пад «адну вікно браузера».

Ітэрацыя 3 (што працавало): адна названая зустроч за раунд

// Agent output
{
  "type": "tool_result",
  "tool": "product_search",
  "data": {
    "items": [...]
  }
}

// Gateway -> TV
{
  "type": "product_carousel",
  "items": [...]
}

// Gateway -> Mobile
{
  "type": "product_list",
  "items": [...]
}
cursor = last_event_id or "0-0"

while True:
    entries = xread({key: cursor}, block=30_000)

    if not entries:          # the only timeout check point
        check_timeouts()
        continue

    for entry_id, event in entries:
        # writes to the socket; not an ack that the client received it
        sse.send(id=entry_id, data=event.payload)
        cursor = entry_id
        if event.type in TERMINAL:
            return
id: 1755600000123-0
data: {"type":"tool_selected","tool":"search"}

id: 1755600000871-0
data: {"type":"response_block","block":{...}}
GET /sessions/{sid}/turns/{tid}/stream
Last-Event-ID: 1755600000871-0
# turn starts: one atomic step (MULTI/EXEC, or a Lua script)
xadd(key, first_event)
expire(key, GENEROUS_TTL)

# producer finishes: bring it in
expire(key, RECONNECT_TTL)

Кожны раунд корыстніка атрымлеў Redis Stream (альбо шаблон stream+група спожывачаў), ключаваны turn_id. Агент публікуе запісы пра токены/інструменты; гейтвэй керуеся последнім id кліента. Павторныя з’ўязкі ведуцца ад гэтага курсора. Падмножынкі можу згінуць; стрым захоўвае достатню колькасць історыі для данага раунда.

Дэталі, якія мелі значэнне

  • Дысцыпліна курсора — кліенты падтверджуюць последні ID стрыма; ніколі не пачынаюць з 0 пасля першага з’ўязку.
  • Пады скарбнічкага рыту — запобегае промежуцельным элементам закрыць некарыстаўчыя з’ёднанні пад час чакання ад інструмента.
  • Цыкл жыцця — чыстае выказванне turn_started / turn_paused / turn_completed / turn_failed.
  • TTL — выгасінне стрымоў пасля таго, як рыт завершыцца, каб Redis не стаў бесканечным архівам.
  • Автарызацыя — turn_id не ўжо автарызацыя; рыты прыязджаюць да аўтэнтыфікованай сесіі.
  • Случак, які гэта выявіў: пауза на калькі мінут

    Інструмент перадаў заданне іншаму пайплайну, які адпавязаў за калькі мінут. Прымітны HTTP-стрыймінг занік. За дапамогай Redis Streams агент публікуў запаведзь паузы, кліент паказваў “вядома працуе”, а пасля таго токены продаважваліся пад час перыяднання без неабходнасці перзапуску всіго плану.

    Што мы адправляем кліенту

    Тэкставаныя запускі: токены, tool_start, аптакты tool_result (ніколі не таёмныя даны), адзінакі і завершэнне. Робіце паданыя маленькімі; большыя даны зберагаюцеся ў сховішчы об’ектаў, а прыкладнік адправляе толькі ўскарыстыцья да іх.

    Косты, ліміты, на чым звернуць увагу

    Сачыце за памяцю Redis, максымальным дзействуючым дужэй і колькасцю розгалоўкаў, якія выходзяць з аднаго запуску, калі многі шлюзы працуюць адночасна. Встановіце ліміт на канкурэнтныя запускі на адного карыстальніка. Апрацаваце тэсты на навантажэнне пасля перадпускання шлюза, каб выявіць проблемы з павтаральным падключэнням.

    Канечны стан

    Шлюз являе сабою чытальнік, які ведае пра стан запуску; агент — пісьменнік; Redis Streams служыць месца зустрэчы. Рэальнага часу інтэрфейс корыстніка застойваеся нават пад час нудных адзінакоў, якія разрушаюць архітэктуры дэманстрацый.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроіцаваць стрым. Калі корыстнік кажа, што “усё зацяглася”, служба падтрымкі должна восстановіць практыку на адпаведным стрыме, не прасіўшы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу часткі практык, якія былі перыявлены, а таксама сярэдней трываласі пауз, ўпрымкі, каб можна было бачыць, чы робяцья працююць медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроіцаваць стрым. Калі корыстнік кажа, што “усё зацяглася”, служба падтрымкі должна восстановіць практыку на адпаведным стрыме, не прасіўшы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу часткі практык, якія былі перыявлены, а таксама сярэдней трываласі пауз, упрымкі, каб можна было бачыць, чы робяцья працююць медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход пераказу з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку пераказаў занова, пераказаў, якія былі застоўлены, і сярэдней трываласці пауз, ўпрымкі продукту зможаць бачыць, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход пераказу з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку пераказаў занова, пераказаў, якія былі застоўлены, і сярэдней трываласці пауз, ўпрымкі продукту зможаць бачыць, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна відтворыць стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна відновіць ход розмовы з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты відновлення розмов, колькасці незавершаных ходоў і сярэжнага часу паузы, ўпрымкі продукту зрозумець, чы робіць агенты все повольна чы меркантызуюцца сеткі.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна відтворыць стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна відновіць ход розмовы з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты відновлення розмов, колькасці незавершаных ходоў і сярэжнага часу паузы, упрымкі продукту зрозумець, чы робіць агенты все повольна чы меркантызуюцца сеткі.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроізвесты стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты павторнага запуску, разговораў, якія былі заставлены, і сярэжнага часу паўзы, ўпрымкі продукту зрозумець, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроізвесты стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты павторнага запуску, разговораў, якія былі заставлены, і сярэжнага часу паўзы, упрымкі продукту зрозумець, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход пераказу з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку пераказаў занова, пераказаў, якія былі застоўлены, і сярэдней трываласці пауз, ўпрымкі продукту зможаць бачыць, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход пераказу з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку пераказаў занова, пераказаў, якія былі застоўлены, і сярэдней трываласці пауз, ўпрымкі продукту зможаць бачыць, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроізвесты стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту зрозумець, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроізвесты стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту зрозумець, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроіцаваць стрым. Калі корыстнік кажа, што “усё зацяглася”, служба падтрымкі должна восстановіць практыку на адпаведным стрыме, не прасіўшы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку практык, практык, якія былі заўмерлены, і сярэжнага часу паузы, ўпрымкі продукту зможаць бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроіцаваць стрым. Калі корыстнік кажа, што “усё зацяглася”, служба падтрымкі должна восстановіць практыку на адпаведным стрыме, не прасіўшы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку практык, практык, якія былі заўмерлены, і сярэжнага часу паузы, ўпрымкі продукту зможаць бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроізвесты стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту зрозумець, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыста ў памяці кліента, а таксама на серверэ, каб было можна воспроізвесты стрым для падтрымкі. Калі корыстнік кажа, што “усё зацяглася”, падтрымка должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для аналізу частоты пачатку разговора занова, разговораў, якія былі завернуты, і сярэжнага часу паўзы, ўпрымкі продукту зрозумець, чы робяць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыраўца або ў памяці чыраўца, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для адстаўкі шчылу, колькасці пакінутых ходоў і сярэжнага часу паузы, ўпрымкі продукту бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.

    Практычны савет: зберагаюце апошні ID стрыму ў кукі сесіі чыраўца або ў памяці чыраўца, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «усё зацяглася», служба падтрымкі должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесяць хвілін. Дадзіце панелі керування для адстаўкі шчылу, колькасці пакінутых ходоў і сярэжнага часу паузы, ўпрымкі продукту бачыць, чы робіць агенты працу медленна чы сеткі нестабільныя.