W
AI-Wiki
ENTITY

Tablestore

定义与本文语境

Tablestore 是阿里云的表格存储产品。在本文中,它不是被当作通用数据库泛泛介绍,而是被明确作为 Agent Memory 框架的底层存储基础设施,用来同时支撑两类 AI 场景:Memory 与 Knowledge

原文将 AI Agent 概括为:LLM(大型语言模型)+ 记忆(Memory)+ 规划技能(Planning skills)+ 工具使用(Tool use)。在这一结构里,Tablestore 主要承担“记忆”和“知识”两类数据底座角色。

AI Agent 的“感知-决策-行动”闭环需要两类核心存储能力:

  • Memory:作为“回忆”,负责情景记录、情景摘要、实时数据抽取等,要求毫秒级响应、高并发、动态 Schema 扩展,典型场景包括用户与大模型的会话上下文管理、实时状态信息同步。
  • Knowledge:作为“知识”,负责知识库原文、摘要等内容的存储与检索,核心是语义检索效果,同时也关注规模、性能和成本,典型场景包括 RAG 知识库与多模态搜索。

原文指出,传统数据库如 MySQL 和 PostgreSQL 虽然在许多场景表现良好,但在“大规模数据集下的低成本、稳定性能、扩展性、灵活检索能力”这些要求同时成立时,会出现一定瓶颈。因此作者基于 Tablestore 在这些方面“天然适合”的特性,总结客户经验,提出了基于 Tablestore 的轻量级 Agent Memory 框架。

在 Agent Memory 框架中的角色职责

在该框架中,Agent Memory SDK 位于上层,负责屏蔽底层实现细节;Tablestore 位于底层,负责真正承载 Memory 与 Knowledge 两类数据。其职责可以拆成两部分:

1. 作为 Memory 的存储底座

用于承载会话管理、历史消息存储等情景记忆场景。原文强调,这类场景最常见的是会话管理和历史消息存储,并以此设计了两个核心数据对象:

  • Session:表示会话
  • Message:表示消息

开发者通过 SDK 操作 MemoryStore,但底层实际由 Tablestore 负责数据落库、更新和查询。

2. 作为 Knowledge 的检索底座

用于承载文档、向量、全文内容与元数据过滤,并服务于 RAG、语义搜索等长期知识检索场景。开发者通过 SDK 操作 KnowledgeStore,底层则依赖 Tablestore 的全文检索、向量索引与多元索引能力完成查询。

关键能力与设计信息

Memory 场景下的适配能力

原文认为 Tablestore 天然适合 Memory 场景,主要因为这类场景对以下能力要求很高:

  • 毫秒级响应
  • 高并发读写
  • 动态 Schema 扩展
  • 大规模数据下的低成本
  • 稳定性能
  • 可扩展性
  • 灵活检索能力

在具体产品能力上,原文多次点名其用于 Memory 的关键特性包括:

  • 宽表模型
  • 二级索引
  • 多元索引

这些能力被用于支撑聊天记录、会话管理、日志、交互等核心数据的高效存储与管理。

Memory 的典型访问方式

原文给出了聊天场景示例:

  • 先创建 Session,并记录 user_idsession_idupdate_time 以及模型名等元数据。
  • 用户每次发言,写入一条 Message;同时更新 Session 的 update_time
  • 大模型每次回复,也写入一条新的 Message。
  • 当用户继续追问如“再来一个”时,可以按条件查询最近若干条历史消息,再把这些消息传给大模型,用作上下文。

示例中明确展示了一个重要约束:记录用户消息时,需要同时更新 session 信息,文中示例仅以更新 update_time 为例。

另外,消息检索支持按元数据过滤。示例中通过 Filters.eq("message_type", "用户") 过滤,只取用户消息,再分页取最近 3 条历史消息。

Knowledge 场景下的适配能力

Knowledge 场景中,原文强调 Tablestore 主要依赖以下三类能力:

  • 向量检索
  • 全文检索
  • 多租户设计

表设计与主键设计

原文给出了较明确的设计原则:

  • DocumentID 作为表的分区键。
  • 这样可以把所有文档离散到各个分区。
  • 因为“全文 + 向量”会导致单行较大,所以把 DocumentID 放在第一个主键作为分区键,以便均衡各分区的读写压力。
  • DocumentIDTenantID 组合起来作为唯一主键。
  • 如果用户不是多租户场景,TenantID 填默认值即可。

多租户路由能力

原文特别强调了多租户特性并说明了其边界:

  • 当用户开启多租户特性后,会把 TenantID 设置为多元索引的路由键。
  • 这样同一租户的数据可以落到指定分区上。
  • 查询时就不需要访问所有分区。
  • 结果是降低查询消耗,并减少“毛刺”。

这说明多租户不是抽象概念,而是直接影响路由方式、查询范围与稳定性的具体实现机制。

全文与向量索引能力

原文给出的细节包括:

  • 文本字段 text 在多元索引中会自动创建“最大语义分词”。
  • 如果需要其他分词方式,可以随时修改。
  • 向量字段 embedding 会自动创建向量索引。
  • 内部会自动选择合适的索引结构进行索引。
  • 用户无需手工调优和优化。

检索方式与过滤能力

示例代码展示了两种典型查询:

  • 向量搜索:给定 query_vector,设置 top_k=20,并可带 tenant_id 与元数据过滤条件。
  • 全文搜索:给定查询词如 "abc hi",设置 limit=50,同样可带 tenant_id 与元数据过滤条件。

元数据过滤支持逻辑组合。示例中使用了:

  • Filters.eq("meta_string", "hi")
  • Filters.gt("meta_long", 1)
  • 再用 Filters.logical_and([...]) 组合

这表明 Tablestore 在 Knowledge 场景中不只是“向量库”,而是支持全文、向量、标量过滤联合使用的数据底座。

性能、规模、成本与可用性

Memory 场景指标

原文给出的 Memory 场景数据比较具体:

  • 理论上的写入和查询 QPS 很容易支持到几百万甚至千万级别。
  • 受限于真实业务情况,目前 Memory 场景最大的线上真实业务查询和写入大概在“十几万 QPS”量级。
  • 在单行较大的情况下,写入延时为 1~8ms。
  • 查询延时为 1~4ms。
  • 单个 Memory 表最大规模可到 PB 级别。

在成本与可用性方面,原文还给出两个明确表述:

  • 成本按实际用量计费。
  • 对于存储型业务,在指标对齐情况下,有信心做到成本最低。
  • 默认提供 3AZ,即同城 3 可用区部署的容灾能力。
  • 目标是把可用性做到最高。

Knowledge / RAG 场景指标

原文对向量检索场景也给出了具体边界:

  • 单向量表理论最大规模可到千亿级别。
  • 目前线上最大向量单表已到百亿级别。
  • 查询 QPS 峰值在 2K+。
  • 向量检索延时在 10ms~120ms。
  • 同样按量付费。
  • 同样默认提供 3AZ 容灾能力。

这些数字说明,Tablestore 在本文中被定位为同时覆盖“极高吞吐的 Memory”与“高规模向量/全文检索的 Knowledge”两种不同负载模型。

典型业务与行业案例

通义 App