全部产品
Search
文档中心

云数据库 Tair(兼容 Redis®):Tair在AI Agent短期记忆中的最佳实践

更新时间:Mar 24, 2026

AI Agent在多轮对话中需要持续追踪上下文,对记忆层的延迟和并发能力要求极高。本文以淘宝闪购"一句话点外卖"场景为例,介绍如何使用Tair的数据结构、分布式锁和弹性扩展能力构建高性能的Agent短期记忆系统。

业务背景

淘宝闪购Agent支持用户通过自然语言完成从导购到下单支付的完整点单流程,目标是将传统3-5分钟的点单耗时压缩至30秒以内。

当用户说"帮我点杯霸王茶姬的伯牙绝弦,少糖去冰,送到公司",背后的AI Agent需要在数秒内完成意图识别、地址解析、商品搜索、规格匹配、加购下单等一系列操作,每一步都依赖对"之前发生了什么"的准确记忆。

在淘宝闪购与千问合作的"一句话点外卖"项目中,Tair承担了Agent短期记忆层的核心角色。本文将从这一真实业务场景出发,介绍Tair在AI Agent记忆管理中的数据模型设计与并发控制等关键实践。

适用场景

本文的设计模式适用于以下AI Agent场景:

  • 需要维护多轮对话上下文的会话式Agent(如客服、导购、助手)

  • 对话链路延迟敏感、需要毫秒级记忆读写的实时交互场景

  • 存在并发写入风险的多工具调用场景(如Agent同时调用多个工具)

  • 流量波动大、需要弹性扩展的线上业务

为什么记忆系统需要Tair

AI Agent的记忆系统对延迟极度敏感。根据Little定律"并发数 ≈ QPS × 延迟",记忆访问延迟从5ms上升到50ms,系统在途请求数就会膨胀10倍,这可能迅速耗尽连接、线程和队列资源。而Agent每轮对话涉及多次记忆读写,延迟会被反复叠加放大,最终可能引发排队、超时乃至雪崩。

5ms和50ms的差别,不是体验上的优化,而是系统能否稳定扩展的分水岭。这正是淘宝闪购Agent选用Tair作为记忆层的核心原因——通过自研多线程内核提供稳定的低延迟,将记忆访问稳定在安全水位,从根本上避免高并发下的恶性循环。

整体架构

淘宝闪购Agent的记忆层(Memory Service)位于Agent中枢与底层工具服务之间,通过Tair提供会话级的状态管理能力。

image

记忆分类与Tair数据模型设计

淘宝闪购Agent选择Tair作为短期记忆存储引擎,核心考量包括:

  • 低延迟:Agent对话链路对响应时间极度敏感,Tair自研多线程内核提供微秒级读写能力,可满足实时交互需求。

  • 丰富的数据结构:不同类型的记忆数据可以选用最匹配的数据结构,简化业务开发。

  • 弹性扩展能力:支持集群无感扩缩容和突发弹性带宽,在流量洪峰期快速扩展、业务无感。

  • TTL生命周期管理:会话记忆具有自然过期属性,TTL机制可自动清理过期数据。

短期记忆被划分为两大类,分别对应不同的Tair数据结构:

模型记忆(Model Memory)— List

模型记忆存储供大语言模型消费的对话历史。每轮对话中用户的输入和Agent的回复,都会被记录并在下一轮推理时作为上下文传入模型。

使用Tair的List结构存储,每个会话一个Key:

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

示例数据:
[
  {"role": "user",      "content": "帮我点杯奶茶"},
  {"role": "assistant", "content": "为你找到附近3家奶茶店...", "cards": [...]},
  {"role": "user",      "content": "就这个,少糖去冰"},
  {"role": "assistant", "content": "已选择:伯牙绝弦 少糖去冰 大杯..."}
]

核心操作:

# 每轮对话结束后,追加新的对话记录
RPUSH memory:model:{sessionId} "{对话记录JSON}"

# 模型推理前,读取最近N轮对话作为上下文
LRANGE memory:model:{sessionId} -{N} -1

# 设置会话过期时间(如30分钟)
EXPIRE memory:model:{sessionId} 1800
说明

对话记录在写入前,会将原始数据(包含文本和卡片等富媒体内容)转换为模型更易理解的自然语言格式,减少Token消耗。

业务上下文记忆(Business Context Memory)— Hash

业务上下文记忆记录业务流程中的结构化状态信息,供Agent的工具层和意图处理器在执行业务逻辑时查询和更新。

按业务领域拆分为6个子模块,使用Tair的Hash结构存储:

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

Field 结构:
{
  "session":      "{会话元信息: 用户ID、渠道、会话阶段等}",
  "search":       "{搜索状态: 当前query、搜索结果、推荐商品列表等}",
  "order":        "{订单状态: 购物车内容、已选SKU、商品数量等}",
  "conversation": "{对话状态: 当前意图、上一轮意图、意图切换标记等}",
  "coupon":       "{优惠信息: 可用优惠券列表、已选优惠等}",
  "bizState":     "{业务状态: 收货地址、配送方式、支付状态等}"
}

核心操作:

# 单独更新某个子模块(如用户确认了收货地址)
HSET memory:context:{sessionId} bizState "{更新后的业务状态JSON}"

# 读取特定子模块
HGET memory:context:{sessionId} order

# 一次性读取所有上下文(用于意图识别等需要全局信息的场景)
HGETALL memory:context:{sessionId}

# 设置过期时间
EXPIRE memory:context:{sessionId} 1800
说明

使用Hash的field级读写能力,各业务模块可以独立更新,互不干扰,避免了读取完整JSON再回写的竞争问题。例如搜索模块更新商品推荐结果时,不会影响订单模块正在写入的购物车数据。

数据结构选型对比

记忆类型

Redis数据结构

选型理由

对话历史

List

对话是有序时间序列,List支持有序追加(RPUSH)和范围读取(LRANGE)

业务上下文

Hash

按领域拆分为多个字段,支持field级独立读写,避免读写竞争

会话状态标记

String

原子性状态标记(如会话阶段),操作简单

分布式锁

String

基于SET NX EX实现,保障并发安全

并发安全:分布式锁

在实际业务中,同一会话可能存在并发写入。例如用户快速连续发送消息,或流式响应过程中用户再次输入,都会导致多个请求同时修改同一会话的记忆数据。

淘宝闪购Agent使用Tair分布式锁保护记忆的读写一致性,锁粒度为单个会话:

# 获取会话级分布式锁(锁超时3秒,防止异常阻塞)
SET lock:memory:{sessionId} {requestId} NX EX 3

# 成功获取锁后,执行记忆读写操作
HSET memory:context:{sessionId} order "{更新后的订单状态}"
RPUSH memory:model:{sessionId} "{新对话记录}"

# 操作完成后释放锁(通过Lua脚本确保只释放自己持有的锁)
EVAL
  if redis.call('GET', KEYS[1]) == ARGV[1] then
    return redis.call('DEL', KEYS[1])
  else
    return 0
  end
说明

锁粒度为会话级(sessionId),而非全局锁。不同用户的会话之间完全无锁竞争,不会影响系统整体吞吐。锁超时设置为秒级,避免持锁进程异常退出时造成长时间阻塞。

应对流量洪峰

在千问春节红包活动期间,淘宝闪购Agent承受了超过10倍于预估峰值的并发压力。每次用户对话可能触发数十次Tair操作(读取历史、更新状态、锁操作等),Agent的并发请求量会被放大为数量级更高的Tair操作量。

淘宝闪购Agent的记忆层底层使用的是云数据库 Tair(兼容 Redis)。相比自建Redis,Tair在内核性能、弹性扩展和运维方面的能力是应对此次流量洪峰的关键支撑。

Tair自研内核的性能优势

Tair(企业版)内存型采用多线程模型,读写性能达到同规格Redis开源版实例的3倍。这意味着在相同的实例规格下,Tair能够承载3倍于开源Redis的操作吞吐量。

在AI Agent场景中,这一性能优势尤为关键。一次用户对话可能触发数十次Tair操作(读取对话历史、更新业务上下文、分布式锁获取释放等),如果使用开源Redis的单线程模型,在高并发场景下很容易成为瓶颈。Tair的多线程内核使得单个节点可以充分利用多核CPU资源,在不增加节点数量的前提下即可承载更高的并发量。

弹性扩展与无感扩缩容

在Agent对话链路中,记忆数据呈现典型的读多写少特征:每轮推理前需要读取完整的对话历史和业务上下文(读操作),而写操作仅在每轮对话结束后追加一条记录。读写比通常在5:1到10:1之间。

Tair支持集群架构开启读写分离功能,主节点挂载只读副本(Read Replica),读请求自动分发到只读节点,写请求路由到主节点。只读副本支持1~9个灵活调整,集群分片支持2~256个水平扩展。在流量高峰前增加只读副本或分片即可线性提升吞吐,峰值过后缩减节点降低成本。

示例

日常流量:集群 8 分片,每分片 1 只读副本 → 满足日常业务需求

春节活动(5~10 倍峰值):

  • 方案一:每分片扩展至 5 只读副本 → 读吞吐线性提升

  • 方案二:集群扩至 16 分片 + 每分片 3 只读副本 → 读写能力同步翻倍

这些扩缩容操作对业务完全透明。传统Redis集群在Slot迁移过程中可能产生-ASK-TRYAGAIN等错误,对Agent对话场景来说,任何一次请求失败都可能导致对话中断或记忆丢失。Tair云原生版通过内核级优化实现了无感扩缩容——数据以Slot为单位原子性整体迁移(而非逐Key迁移),不会造成Slot分裂;同时通过中心化的控制组件协调集群行为,迁移效率更高、决策更精准。

说明

在数据迁移的最终阶段,对应Slot的写请求时延会略有增加,但不会失败。对于Agent记忆服务而言,表现为个别请求延迟略升,但不会出现数据丢失或请求报错。

带宽弹性扩展

除了QPS压力,活动期间还面临显著的带宽挑战。AI Agent每次记忆读取涉及对话历史和业务上下文的传输,单次请求的数据量远大于传统缓存场景中的简单KV读写。在业务高峰期,带宽很可能先于CPU和内存成为瓶颈。

Tair云原生架构提供了两层弹性机制:

  • 集群带宽水平扩展:集群架构可以通过增加LB数量来扩展实例总带宽,单个LB带宽上限20Gbps,当分片数超过8个时,可按需新增LB,新增过程中不会中断现有连接。

  • 突发弹性带宽:当瞬时流量超过固定带宽时,系统会秒级自动扩展带宽(单节点最高可达288MB/s),流量回落后自动回收,按实际突发量计费。突发弹性带宽以分片为粒度独立生效。当某个分片因热点Key出现带宽瓶颈时,仅该分片的带宽会被自动扩展,不会影响其他分片。

    说明

    突发弹性带宽特别适合Agent场景中不可预测的流量尖峰。相比提前购买高规格的固定带宽包,按需突发在成本上更省。

TTL自动回收

所有会话Key设置合理的TTL(如30分钟),流量高峰过后内存自动回落,无需人工干预。结合Tair的弹性扩缩容能力,实现了"高峰扩、低谷缩、过期自动清理"的全自动资源管理。

最终,整套记忆服务在春节流量洪峰期间保持稳定运行,P99延迟始终控制在毫秒级。

总结与展望

在淘宝闪购"一句话点外卖"场景中,Tair作为AI Agent短期记忆层的核心存储,提供了以下关键能力:

能力

实现方式

解决的问题

低延迟访问

Tair内存读写

匹配Agent对话链路的实时性要求

灵活的数据建模

List + Hash + String组合

适配对话历史、业务上下文等不同记忆类型

生命周期管理

TTL自动过期

会话结束后自动清理,降低运维成本

并发安全

分布式锁(SET NX EX)

保障多请求并发写入时的数据一致性

弹性抗压

读写分离 + 突发弹性带宽

支撑春节活动10倍峰值流量,业务无感弹性

随着AI Agent技术的演进,记忆管理正在向更深层次发展。短期记忆之外,长期记忆(用户偏好、历史行为模式)的建设已在规划之中,让Agent不仅记住"这次对话说了什么",更记住"这个用户是谁、喜欢什么"。

AI Agent的记忆系统,正在从"对话级"走向"用户级",Tair在这一演进过程中将持续扮演关键角色。