Todos os produtos
Search
Central de documentação

Tair (Redis® OSS-Compatible):Use Tair (Redis OSS-compatible) for AI agent short-term memory

Última atualização: Jun 26, 2026

Agentes de IA com múltiplas interações exigem memória de baixa latência e alta concorrência para rastrear o contexto entre os turnos de conversa. Este tópico demonstra como o Tair (compatível com Redis OSS) sustenta a camada de memória de curto prazo no agente do Taobao Flash Shopping, abordando o design do modelo de dados, locks distribuídos e dimensionamento elástico.

Contexto

Quando um usuário diz "Peça um latte grande com leite de aveia, sem açúcar, entregue no escritório", o agente de IA precisa concluir o reconhecimento de intenção, a resolução de endereço, a busca de produtos, a correspondência de especificações, a adição ao carrinho e a finalização do pedido em segundos. Cada etapa depende da retenção precisa das interações anteriores.

No projeto de "pedido por frase única" do Taobao Flash Shopping, desenvolvido com Qwen, o Tair atua como núcleo da camada de memória de curto prazo do agente.

Caso de uso

O agente do Taobao Flash Shopping permite que os usuários concluam um fluxo de pedido ponta a ponta por linguagem natural, reduzindo um processo típico de 3 a 5 minutos para menos de 30 segundos. Entre as interações, o agente retém todo o contexto: a primeira captura a localização, a segunda recomenda produtos e a terceira confirma o carrinho e envia o pedido. Toda a memória reside no Tair.

Por que usar o Tair para a camada de memória

A memória de agentes de IA é extremamente sensível à latência. Pela Lei de Little, concorrência ≈ QPS × latência. Quando a latência da memória aumenta de 5 ms para 50 ms, as requisições em trânsito crescem dez vezes, esgotando conexões, threads e filas. Como cada turno envolve múltiplas leituras e gravações, a latência se acumula e pode desencadear falhas em cascata.

A diferença entre 5 ms e 50 ms determina se o sistema consegue escalar de forma confiável, não apenas a rapidez percebida. O kernel multithread proprietário do Tair oferece latência consistentemente baixa, mantém o acesso à memória dentro de limites seguros e evita que a concorrência saia do controle sob carga.

Visão geral da arquitetura

O serviço de memória fica entre o orquestrador do agente e os serviços de ferramentas downstream. O Tair fornece gerenciamento de estado no nível da sessão.

image

Tipos de memória e design do modelo de dados

O agente do Taobao Flash Shopping utiliza o Tair como armazenamento de memória de curto prazo pelos seguintes motivos:

  • Baixa latência: O kernel multithread do Tair proporciona leituras e gravações no nível de microssegundos e atende aos rigorosos requisitos de tempo de resposta do pipeline do agente.

  • Estruturas de dados diversificadas: Cada tipo de memória é mapeado para a estrutura de dados mais adequada, o que simplifica o desenvolvimento.

  • Dimensionamento elástico: O dimensionamento transparente de cluster e a largura de banda burst permitem que o sistema expanda durante picos de tráfego sem impacto nos negócios.

  • Gerenciamento de ciclo de vida baseado em TTL: A memória de sessão expira naturalmente. O mecanismo de TTL limpa automaticamente dados obsoletos.

A memória de curto prazo divide-se em duas categorias, cada uma mapeada para uma estrutura de dados diferente do Tair:

Memória do modelo - List

A memória do modelo armazena o histórico de conversas para o LLM. A entrada do usuário e a resposta do agente de cada turno são registradas e passadas como contexto no próximo ciclo de inferência.

Esses dados ficam armazenados em uma List do Tair, com uma chave por sessão:

Key:  memory:model:{sessionId}
Type: List

Sample data:
[
  {"role": "user",      "content": "Order me a milk tea"},
  {"role": "assistant", "content": "Found 3 nearby milk tea shops...", "cards": [...]},
  {"role": "user",      "content": "That one, less sugar, no ice"},
  {"role": "assistant", "content": "Selected: Jasmine Milk Tea, less sugar, no ice, large..."}
]

Principais operações:

# Append a new conversation record after each turn
RPUSH memory:model:{sessionId} "{conversation_record_JSON}"

# Read the last N turns of conversation as context before model inference
LRANGE memory:model:{sessionId} -{N} -1

# Set the session expiration time (for example, 30 minutes)
EXPIRE memory:model:{sessionId} 1800
Nota

Antes da gravação, o sistema converte dados brutos (texto e rich media, como cards) em formato de linguagem natural para interpretação mais eficiente pelo modelo, o que reduz o consumo de tokens.

Memória de contexto de negócios - Hash

A memória de contexto de negócios armazena o estado estruturado do fluxo de trabalho. A camada de ferramentas do agente e os manipuladores de intenção consultam e atualizam esses dados durante a execução da lógica de negócios.

Esses dados dividem-se em seis submódulos por domínio de negócios e ficam armazenados em um Hash do Tair:

Key:  memory:context:{sessionId}
Type: Hash

Field structure:
{
  "session":      "{Session metadata: user ID, channel, session stage, etc.}",
  "search":       "{Search state: current query, search results, recommended product list, etc.}",
  "order":        "{Order state: cart contents, selected SKUs, item quantities, etc.}",
  "conversation": "{Conversation state: current intent, previous intent, intent switch flag, etc.}",
  "coupon":       "{Coupon info: available coupon list, selected coupons, etc.}",
  "bizState":     "{Business state: delivery address, shipping method, payment status, etc.}"
}

Operações principais:

# Update a specific submodule (for example, the user confirmed a delivery address)
HSET memory:context:{sessionId} bizState "{updated_business_state_JSON}"

# Read a specific submodule
HGET memory:context:{sessionId} order

# Read all context at once (for scenarios that need global information, such as intent recognition)
HGETALL memory:context:{sessionId}

# Set the expiration time
EXPIRE memory:context:{sessionId} 1800
Nota

As operações no nível de campo do Hash permitem que cada módulo seja atualizado independentemente, eliminando a condição de corrida de ler e regravar um blob JSON inteiro. Por exemplo, o módulo de busca pode atualizar recomendações sem afetar os dados do carrinho gravados simultaneamente pelo módulo de pedidos.

Comparação de estruturas de dados

Tipo de memória

Estrutura de dados do Redis

Justificativa

Histórico de conversas

List

As conversas formam uma série temporal ordenada. A List suporta anexação ordenada (RPUSH) e leituras por intervalo (LRANGE).

Contexto de negócios

Hash

Dividido em vários campos por domínio. Suporta operações independentes de leitura/gravação no nível de campo, prevenindo condições de corrida.

Flags de status de sessão

String

Fornece marcadores de status atômicos (como estágio da sessão) com operações simples.

Lock distribuído

String

Implementado com SET NX EX para garantir segurança na concorrência.

Segurança na concorrência: locks distribuídos

Em produção, gravações simultâneas na mesma sessão são comuns: um usuário pode enviar mensagens em rápida sucessão ou submeter entradas enquanto uma resposta em streaming ainda está em andamento.

O agente do Taobao Flash Shopping usa locks distribuídos do Tair para proteger a consistência de leitura/gravação da memória no nível da sessão:

# Acquire a session-level distributed lock (3-second timeout to prevent blocking)
SET lock:memory:{sessionId} {requestId} NX EX 3

# After acquiring the lock, perform memory read/write operations
HSET memory:context:{sessionId} order "{updated_order_state}"
RPUSH memory:model:{sessionId} "{new_conversation_record}"

# Release the lock after operations complete (use a Lua script to release only the lock you hold)
EVAL
  if redis.call('GET', KEYS[1]) == ARGV[1] then
    return redis.call('DEL', KEYS[1])
  else
    return 0
  end
Nota

A granularidade do lock é por sessão (sessionId), não global. Usuários diferentes têm zero contenção de lock. O tempo limite curto evita bloqueios prolongados caso o detentor do lock encerre anormalmente.

Gerenciamento de picos de tráfego

Durante a campanha de envelopes vermelhos do Festival da Primavera com Qwen, o agente do Taobao Flash Shopping enfrentou tráfego superior a 10 vezes o pico estimado. Cada conversa aciona dezenas de operações no Tair (leitura de histórico, atualização de estado, lock), amplificando o volume de requisições em uma ordem de magnitude.

Em comparação com o Redis autogerenciado, o desempenho do kernel, o dimensionamento elástico e as capacidades operacionais do Tair foram fundamentais para lidar com esse pico.

Vantagens de desempenho do kernel proprietário do Tair

As instâncias baseadas em DRAM do Tair (Enterprise Edition) usam um modelo multithread que entrega 3 vezes mais throughput de leitura/gravação do que o Redis Open-Source Edition nas mesmas especificações.

Isso é crucial para cargas de trabalho de agentes de IA, em que uma única conversa dispara dezenas de operações. O modelo single-thread do Redis open source torna-se gargalo sob alta concorrência. O kernel multithread do Tair utiliza totalmente CPUs multicore em um único nó e lida com maior concorrência sem adicionar nós.

Dimensionamento elástico e operações transparentes de cluster

A memória do agente apresenta padrão de muita leitura e pouca escrita. Antes de cada ciclo de inferência, o agente lê todo o histórico de conversas e contexto, enquanto as gravações ocorrem apenas uma vez por turno. A proporção de leitura para escrita geralmente varia de 5:1 a 10:1.

O Tair suporta separação de leitura/gravação no modo cluster, roteia automaticamente leituras para réplicas e gravações para masters. Configure de 1 a 9 réplicas de leitura por shard e escale de 2 a 256 shards. Adicione réplicas ou shards antes de um pico para aumentar o throughput linearmente; reduza-os depois para diminuir custos.

Normal traffic:
  8-shard cluster, 1 read replica per shard -> meets daily business requirements

Spring Festival campaign (5x - 10x peak):
  Option 1: Scale to 5 read replicas per shard -> linear increase in read throughput
  Option 2: Scale to 16 shards + 3 read replicas per shard -> double both read and write capacity

Essas operações são transparentes para a aplicação. A migração de slots tradicional de clusters Redis pode produzir erros -ASK e -TRYAGAIN: qualquer requisição com falha pode interromper uma conversa do agente ou causar perda de memória. As instâncias cloud-native do Tair usam dimensionamento transparente no nível do kernel: os dados migram atomicamente no nível do slot, prevenindo fragmentação. Um componente de controle centralizado coordena a migração para maior eficiência e precisão.

Nota

Durante a fase final de migração, a latência de escrita para os slots afetados pode aumentar ligeiramente, mas as requisições não falham: não há perda de dados ou erros.

Dimensionamento elástico de largura de banda

A campanha também trouxe desafios de largura de banda. Cada leitura de memória do agente transfere histórico de conversas e contexto de negócios, gerando payloads muito maiores do que leituras de cache típicas. Durante picos, a largura de banda pode tornar-se gargalo antes da CPU ou da memória.

A arquitetura cloud-native do Tair fornece dois níveis de largura de banda elástica:

  • Dimensionamento horizontal de largura de banda via balanceadores de carga: Adicione balanceadores de carga (LBs) no modo cluster para aumentar a largura de banda total. Cada LB suporta até 20 Gbps. Para clusters com mais de 8 shards, adicione LBs sob demanda sem interromper conexões.

  • Largura de banda burst: Quando o tráfego excede a largura de banda fixa, o sistema escala automaticamente em segundos (até 288 MB/s por nó) e retorna ao normal após o pico. Pague apenas pelo uso real do burst. O burst opera no nível do shard: quando uma hot key causa gargalo em um shard, apenas esse shard escala verticalmente.

Nota

A largura de banda burst é ideal para picos imprevisíveis comuns em cenários de agentes e custa menos do que provisionar alta largura de banda fixa antecipadamente.

Limpeza automática baseada em TTL

Todas as chaves de sessão usam TTL (por exemplo, 30 minutos). Após um pico, o uso de memória cai automaticamente. Combinado com o dimensionamento elástico, isso oferece gerenciamento de recursos totalmente automático: escale para cima no pico, escale para baixo fora do pico e limpe dados expirados.

Com essa abordagem, o serviço de memória permaneceu estável durante todo o pico de tráfego do Festival da Primavera, com latência P99 consistentemente na faixa de milissegundos de um dígito.

Resumo e perspectivas

No cenário de "pedido por frase única" do Taobao Flash Shopping, o Tair serve como armazenamento principal para a camada de memória de curto prazo do agente de IA. A tabela a seguir resume as principais capacidades:

Capacidade

Implementação

Problema resolvido

Acesso de baixa latência

Leitura/gravação em memória do Tair

Atende aos requisitos de tempo real do pipeline de conversas do agente

Modelagem flexível de dados

Combinação de List + Hash + String

Suporta diferentes tipos de memória, como histórico de conversas e contexto de negócios

Gerenciamento de ciclo de vida

Expiração automática baseada em TTL

Limpa dados automaticamente após o término das sessões, reduzindo custos operacionais

Segurança na concorrência

Lock distribuído (SET NX EX)

Mantém a consistência dos dados quando múltiplas requisições gravam simultaneamente

Resiliência elástica

Separação de leitura/gravação + largura de banda burst

Sustentou 10 vezes o tráfego de pico durante a campanha do Festival da Primavera com elasticidade transparente

À medida que a tecnologia de agentes de IA evolui, capacidades de memória de longo prazo (preferências do usuário e padrões comportamentais) estão no roadmap. O objetivo: agentes que lembrem não apenas "o que foi dito", mas "quem é este usuário e o que ele prefere".

Conforme a memória do agente evolui do nível de conversa para o nível de usuário, o Tair continuará a desempenhar papel crítico.