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

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

Выжывайце падзеях з’ўязку і кількамінутных паузах у прыборах, публікуючы запускаючыя падзеі ў Redis Stream з дапамогай функцыі turn-scoped, каб кліенты маглі продактываць роботу.

2049 слоў

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

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

Парадокс

Ітерацыя 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 стрыму ў кукі сесіі чыраўца або ў памяці чыраўца, а таксама на станове сервера для можлівасці перагляду. Калі корыстнік кажа, што «всё зацяглася», служба падтрымкі должна восстановіць ход разговору з стрыму, не прасячы яго чакаць дзесять хвілін. Дадзіце панелі керування для адстаўкі шчылу, колькасці пакінутых ходоў і сярэжнага часу паузы, ўпрымкі продукту бачыць, чы робіць агенты роботу медленна чы сеті нестабільныя.