1. 项目概述:为AI智能体构建一个安全、隔离的共享记忆服务

最近在折腾AI智能体(Agent)的协作,发现一个挺有意思的痛点:不同的智能体实例,比如OpenClaw、KimiClaw,它们之间如何安全、高效地共享“记忆”?想象一下,一个智能体学会了用户喜欢用深色模式,另一个智能体在处理UI配置时如果能直接读取这个偏好,体验就无缝衔接了。但直接把记忆数据存在某个公共数据库,安全和隔离就成了大问题。最近看到siddontang开源的 claw-memory 项目,它用Cloudflare Workers和TiDB Cloud搭建了一个专门的服务,完美解决了这个需求。它不是简单地提供一个数据库端点,而是设计了一套包含自动资源分配、多层加密和完整生命周期的解决方案,特别适合我们这些搞AI应用开发的。今天我就结合自己的部署和测试经验,把这个项目的里里外外拆解清楚,包括架构设计、安全考量、实操步骤以及我踩过的那些坑。

2. 架构深度解析:为什么选择Worker + TiDB Cloud Zero?

这个项目的核心架构非常清晰,目标明确:为每一个独立的智能体小组(由同一个Token标识)提供一个完全隔离、即开即用、且安全的数据存储空间。整个系统可以看作一个智能的“记忆空间”分发与管理平台。

2.1 核心组件与数据流

整个系统围绕两个核心后端和一个前端接入层构建:

  1. Cloudflare Worker (claw-memory) :这是整个服务的大脑和网关。所有来自OpenClaw、KimiClaw等智能体的API请求都首先到达这里。它不直接存储业务数据,而是负责三件关键事: 身份认证与路由 (验证Token并转发到正确的数据库)、 安全处理 (执行加密解密逻辑)、 资源调度 (按需创建新的TiDB Cloud Zero实例)。

  2. 注册表数据库 (Registry DB) :这是一个中心化的TiDB Serverless集群,用来保存整个系统的“户口本”。它存储所有已签发的Token与其对应的TiDB Cloud Zero实例连接信息之间的映射关系。这里的设计关键是,存储的连接信息(主机、用户、密码)是经过AES-256-GCM加密的,即使有人直接访问这个数据库,也无法直接获取到下游业务数据库的凭据。

  3. TiDB Cloud Zero实例 (业务数据库) :这是真正存储每个智能体小组“记忆”数据的地方。核心设计在于 “一个Token,一个独立数据库实例” 。当服务接收到创建新Token的请求时,它会通过TiDB Cloud API实时(约2秒)创建一个全新的Zero实例。这个实例与其他Token的实例在物理和逻辑上都是隔离的,从根本上杜绝了数据跨组泄露的可能性。

数据流转的路径是这样的:智能体带着Token访问Worker;Worker解密Token,从注册表查出对应的加密连接串,再用密钥解密,获得真实的数据库连接信息;最后,Worker作为代理,将智能体的CRUD操作转发到那个完全属于该Token组的TiDB Zero实例中执行。整个过程对智能体来说是透明的,它只需要认准一个Token即可。

2.2 关键设计决策背后的逻辑

为什么这么设计?我们逐条分析其优势:

  • 完全的数据隔离 :这是最核心的安全边界。传统的多租户方案可能在同一个数据库里用不同表或Schema来区分用户,但这存在误操作或漏洞导致越权的风险。 claw-memory 直接为每个租户分配一个独立的数据库实例,实现了物理隔离,安全性提升了一个数量级。对于AI智能体这种可能处理不同用户、不同项目敏感上下文的应用,这种隔离是必需的。

  • 加密的注册表 :注册表成了“钥匙保管员”。即使最坏的情况发生——注册表数据库被攻破,攻击者拿到的也是一堆密文。加密密钥 ENCRYPTION_KEY 独立存储在Cloudflare Worker的Secret中,与数据库分离,符合安全实践中的“密钥与数据分离存储”原则。

  • 可选的客户端加密 :这是一个为高安全场景设计的“杀手级”特性。智能体在创建Token时可以提供一个自己的 X-Encryption-Key 。这个密钥会与服务器密钥一起,对数据库连接信息进行二次加密。结果是, 连服务器都无法单独解密出连接信息 。每次请求,智能体都必须携带这个客户端密钥,Worker用它完成部分解密后才能访问数据库。这适用于对云服务提供商本身也不完全信任的场景,实现了“端到端”加密的存储层。

  • 零摩擦资源供给 :TiDB Cloud Zero的“零配置、秒级创建”特性是这个项目能成立的基础。它让按需分配独立数据库实例从成本和技术上变得可行。开发者无需预先购买、配置数据库,系统在用户无感的情况下自动完成,体验非常流畅。

  • 30天生命周期与认领机制 :TiDB Cloud Zero实例免费提供30天。这实际上是一个很巧妙的“试用转正”漏斗。项目提供了 claim_url ,引导用户在30天内将临时Zero实例认领为永久的TiDB Cloud Starter实例(目前也是免费套餐)。这既降低了用户初次使用的门槛,又为TiDB Cloud提供了潜在的转化路径。认领后,原有Token和连接完全不变,对智能体无影响,设计得很贴心。

注意 :虽然TiDB Cloud Starter目前免费,但其资源规格(如存储空间、吞吐量)是有限的。如果你的智能体记忆数据量增长非常快,需要关注用量,并考虑升级到付费计划。

3. 从零开始部署:一步步搭建你的记忆服务

理论讲完了,我们动手把它跑起来。部署过程主要分三步:准备注册表数据库、配置Worker、部署。我会补充一些官方文档里没细说的细节。

3.1 环境准备与依赖安装

首先,确保你的开发环境已经就绪:

# 1. 克隆项目代码
git clone https://github.com/siddontang/claw-memory.git
cd claw-memory

# 2. 安装项目依赖 (Node.js环境)
npm install

# 3. 安装并登录Wrangler (Cloudflare Workers命令行工具)
npm install -g wrangler
wrangler login

执行 wrangler login 会打开浏览器,让你授权CLI工具访问你的Cloudflare账户。确保你拥有一个Cloudflare账户,并且有权限在某个账户下创建Worker。

3.2 设置注册表数据库(TiDB Serverless)

这是整个服务的“总控中心”,需要一个长期稳定的TiDB集群。我们使用TiDB Cloud Serverless,因为它免费且易于管理。

  1. 创建Serverless集群 :登录 TiDB Cloud控制台 ,进入项目后点击“Create Cluster”,选择“Serverless”套餐。填写集群名称(如 claw-memory-registry ),选择提供商和区域(建议选一个离你的用户或Cloudflare Worker较近的区域,如 ap-northeast-1 ),点击创建。几分钟后集群就绪。

  2. 获取连接信息 :在集群详情页,点击“Connect”按钮,选择“General”方式,你会看到 Host (网关地址)、 Port User Password 。记录下这些信息。 Database 名字可以自己定,比如 claw_memory_registry

  3. 初始化注册表结构 :项目提供了数据库初始化脚本。通过环境变量传入连接信息来运行它:

    REGISTRY_HOST=gateway01.ap-northeast-1.prod.aws.tidbcloud.com \
    REGISTRY_USER=your_username \
    REGISTRY_PASSWORD='your_password' \
    REGISTRY_DATABASE=claw_memory_registry \
    npm run db:init
    

    实操心得 :这里有个小坑,如果密码包含特殊字符(如 ! , @ , # ),在Bash中最好用单引号包裹整个密码,防止被Shell解析。执行成功后,脚本会在指定的数据库中创建 token_registry 等必要的表。

3.3 配置Cloudflare Worker密钥

Worker需要访问注册表数据库和进行加密,这些敏感信息不能写死在代码里,必须通过Cloudflare的Secret管理。

  1. 生成加密密钥 :首先,为服务器端加密生成一个强密钥:

    openssl rand -hex 32
    

    这会输出一个64位的十六进制字符串(如 a1b2c3... ),复制下来,这就是你的 ENCRYPTION_KEY

  2. 设置Secret :在项目根目录下,使用Wrangler命令将敏感信息设置为Secret。这些值会被加密存储,仅在Worker运行时注入。

    # 设置注册表数据库连接信息
    npx wrangler secret put REGISTRY_HOST
    # 在弹出的交互窗口中粘贴你的TiDB Serverless主机地址
    
    npx wrangler secret put REGISTRY_USER
    # 粘贴数据库用户名
    
    npx wrangler secret put REGISTRY_PASSWORD
    # 粘贴数据库密码
    
    npx wrangler secret put REGISTRY_DATABASE
    # 粘贴数据库名,如`claw_memory_registry`
    
    # 设置服务器加密密钥
    npx wrangler secret put ENCRYPTION_KEY
    # 粘贴刚才用openssl生成的64位密钥
    

    注意事项 wrangler secret put 命令是交互式的,你也可以通过管道传递值,如 echo “your_value” | npx wrangler secret put SECRET_NAME 。确保所有Secret一次性正确设置,否则部署后Worker会因缺少配置而启动失败。

3.4 部署与验证

配置完成后,部署就很简单了:

npm run deploy

部署脚本会构建项目并将Worker发布到Cloudflare。成功后,你会看到Worker的访问地址,格式类似 https://claw-memory.<你的子域>.workers.dev 。记下这个地址,它就是你的记忆服务的API入口。

验证部署是否成功

# 使用curl测试创建Token的端点
curl -X POST https://claw-memory.<你的子域>.workers.dev/api/tokens

如果返回类似 {"ok":true,"data":{"token":"clawmem_...", ...}} 的JSON,恭喜你,服务已经正常运转了!如果报错(如500 Internal Error),需要检查:

  1. Cloudflare Worker的日志(在Cloudflare仪表板的Workers部分查看)。
  2. 所有Secret是否都已正确设置。
  3. 注册表数据库的网络连通性(TiDB Cloud Serverless默认允许所有IP访问,但最好在控制台确认一下)。

4. API使用详解与智能体集成实战

服务跑起来了,我们来看看怎么用它。API设计得很RESTful,主要围绕 /api/tokens /api/memories 两个核心资源。

4.1 创建与管理记忆空间

记忆空间由Token唯一标识。创建Token的同时,系统就在后台为你分配了一个全新的TiDB Cloud Zero数据库。

基础创建

curl -X POST https://你的worker地址/api/tokens

这是最简单的用法,适用于大多数场景。服务器会用它自己的密钥加密存储数据库连接信息。

高安全模式创建(客户端加密)

curl -X POST https://你的worker地址/api/tokens \
  -H "X-Encryption-Key: your-super-secret-client-key-here"

请务必将 your-super-secret-client-key-here 替换为一个你自己生成并妥善保管的强密码。 重要 :一旦使用此模式, 你必须记住这个客户端密钥 ,因为后续所有使用此Token的请求都必须携带相同的 X-Encryption-Key 头,否则服务器无法解密连接信息,请求会失败。这个密钥不会存储在服务器端。

创建成功后,响应中 claim_url 字段至关重要。务必在30天内打开这个链接,登录TiDB Cloud并完成认领,将临时数据库转为永久免费的Starter实例,否则数据会丢失。

查询Token信息

curl -H "Authorization: Bearer clawmem_你的token" \
  https://你的worker地址/api/tokens/clawmem_你的token/info

这个端点可以查看该记忆空间的基本信息、统计(如记忆条数)以及再次获取认领链接。

4.2 记忆的存储、检索与管理

这才是智能体交互的核心。假设我们有一个Token: clawmem_a1b2c3d4

存储一条记忆

curl -X POST https://你的worker地址/api/memories \
  -H "Authorization: Bearer clawmem_a1b2c3d4" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "用户在当前对话中透露,他计划下周去上海出差,需要预订浦东机场附近的酒店。",
    "source": "openclaw",
    "tags": ["travel", "schedule", "user-preference"],
    "key": "upcoming_business_trip_shanghai",
    "metadata": {
      "priority": "high",
      "extracted_date": "2023-10-27"
    }
  }'
  • content : 记忆的主要内容,支持长文本。
  • source : 标识是哪个智能体写入的,便于后续过滤和溯源。
  • tags : 标签数组,是高效的过滤维度。设计良好的标签体系能让检索事半功倍。
  • key : 可选,为一个记忆设定一个唯一键名。如果你需要存储和更新类似“用户偏好”这种单例信息,用 key 就非常方便,可以通过 key 直接定位,无需搜索。
  • metadata : 可选,一个JSON对象,可以存放任何结构化的附加信息,如置信度分数、原始消息ID等,非常灵活。

搜索记忆 : 这是智能体“回忆”的关键。API支持多条件组合搜索。

# 1. 关键词全文搜索 (在content字段中搜索)
curl "https://你的worker地址/api/memories?q=上海+酒店" \
  -H "Authorization: Bearer clawmem_a1b2c3d4"

# 2. 按标签过滤
curl "https://你的worker地址/api/memories?tags=travel&tags=schedule" \
  -H "Authorization: Bearer clawmem_a1b2c3d4"

# 3. 按来源过滤
curl "https://你的worker地址/api/memories?source=openclaw" \
  -H "Authorization: Bearer clawmem_a1b2c3d4"

# 4. 按key精确查找
curl "https://你的worker地址/api/memories?key=upcoming_business_trip_shanghai" \
  -H "Authorization: Bearer clawmem_a1b2c3d4"

# 5. 组合查询 + 分页
curl "https://你的worker地址/api/memories?q=出差&tags=travel&source=openclaw&limit=10&offset=0" \
  -H "Authorization: Bearer clawmem_a1b2c3d4"

搜索结果是按相关性或时间排序的列表,非常直观。

更新与删除

# 更新一条记忆 (需要知道记忆的ID)
curl -X PUT https://你的worker地址/api/memories/记忆ID \
  -H "Authorization: Bearer clawmem_a1b2c3d4" \
  -H "Content-Type: application/json" \
  -d '{"content": "更新后的内容...", "tags": ["updated"]}'

# 删除一条记忆
curl -X DELETE https://你的worker地址/api/memories/记忆ID \
  -H "Authorization: Bearer clawmem_a1b2c3d4"

批量导入 : 如果你有历史数据需要迁移,或者智能体一次性产生大量记忆,可以使用批量接口,最高支持200条一次。

curl -X POST https://你的worker地址/api/memories/bulk \
  -H "Authorization: Bearer clawmem_a1b2c3d4" \
  -H "Content-Type: application/json" \
  -d '{
    "memories": [
      {"content": "记忆1", "source": "claw1", "tags": ["tag1"]},
      {"content": "记忆2", "source": "claw2", "tags": ["tag2"]}
      // ... 最多200条
    ]
  }'

4.3 在智能体项目中集成

以OpenClaw为例,集成 claw-memory 主要是在智能体需要持久化或查询记忆时,调用对应的REST API。你可以在智能体的工具(Tools)或技能(Skills)中增加一个 MemoryManager 类。

一个简化的Python示例:

import requests
from typing import List, Optional, Dict, Any

class ClawMemoryClient:
    def __init__(self, base_url: str, token: str, client_encryption_key: Optional[str] = None):
        self.base_url = base_url.rstrip('/')
        self.token = token
        self.headers = {
            'Authorization': f'Bearer {token}',
            'Content-Type': 'application/json'
        }
        if client_encryption_key:
            self.headers['X-Encryption-Key'] = client_encryption_key

    def store(self, content: str, source: str, tags: List[str] = None,
              key: Optional[str] = None, metadata: Optional[Dict] = None) -> bool:
        """存储一条记忆"""
        data = {
            'content': content,
            'source': source,
            'tags': tags or [],
        }
        if key:
            data['key'] = key
        if metadata:
            data['metadata'] = metadata

        resp = requests.post(f'{self.base_url}/api/memories',
                             json=data, headers=self.headers)
        return resp.status_code == 200

    def search(self, query: Optional[str] = None, tags: List[str] = None,
               source: Optional[str] = None, key: Optional[str] = None,
               limit: int = 10) -> List[Dict[str, Any]]:
        """搜索记忆"""
        params = {}
        if query:
            params['q'] = query
        if tags:
            params['tags'] = tags
        if source:
            params['source'] = source
        if key:
            params['key'] = key
        params['limit'] = limit

        resp = requests.get(f'{self.base_url}/api/memories',
                            params=params, headers=self.headers)
        if resp.status_code == 200:
            return resp.json().get('data', [])
        return []

# 在OpenClaw的配置或初始化阶段
memory_client = ClawMemoryClient(
    base_url='https://你的worker地址',
    token='clawmem_a1b2c3d4'
    # client_encryption_key='你的密钥' # 如果创建时用了客户端加密
)

# 当智能体需要记住某事时
memory_client.store(
    content="用户说他不喜欢弹出式广告。",
    source="openclaw_dialogue",
    tags=["user-preference", "ui", "advertisement"]
)

# 当智能体需要回忆时
related_memories = memory_client.search(query="广告", tags=["user-preference"])
for memory in related_memories:
    print(f"Recall: {memory['content']} (from {memory['source']})")

这样,智能体就具备了跨会话、跨实例的长期记忆能力。

5. 安全、性能与生产环境考量

将这样一个服务用于生产环境,除了功能,我们更需要关注安全、可靠性和性能。

5.1 安全加固建议

  1. 客户端加密的密钥管理 :如果启用了客户端加密, X-Encryption-Key 的管理是重中之重。 绝对不要 硬编码在智能体代码或配置文件中。应该通过环境变量注入,或者使用专门的密钥管理服务(如云厂商的KMS)。密钥丢失意味着对应的记忆空间将永久无法访问。

  2. Token的保密与轮转 :Token相当于数据库的访问凭证。应在智能体间安全地共享(例如通过安全的配置下发渠道)。考虑定期轮转Token的可行性(目前API不支持直接轮转,但可以创建一个新Token,让智能体迁移到新空间,再废弃旧的)。

  3. Worker访问限制 :可以在Cloudflare Worker的触发器中设置路由规则,或使用Cloudflare的防火墙(WAF)规则,限制只有你的智能体后端IP或特定域名可以调用该Worker,减少公开暴露的风险。

  4. 注册表数据库访问控制 :确保TiDB Serverless注册表数据库的访问密码足够复杂,并且仅允许从Cloudflare Worker的IP范围(如果需要)或你的管理IP访问。定期审计数据库操作日志。

5.2 性能优化与监控

  1. 数据库连接池 :Worker是无状态的,每次请求都可能创建新的数据库连接。TiDB Cloud Serverless和Zero实例对连接数有限制。虽然项目本身可能做了基础连接管理,但在高并发下需要注意。可以考虑在Worker内使用更高效的连接池库,并设置合理的空闲超时。

  2. 记忆内容的长度与索引 content 字段被定义为 TEXT 类型,适合存储长文本。TiDB Cloud的全文搜索功能可以加速 q 参数的搜索。但对于 tags source 这类等值查询,确保数据库表上有合适的索引(项目初始化脚本可能已创建,部署后最好确认一下)。

  3. 响应缓存 :对于频繁读取且不常变化的记忆(例如通过 key 查询的用户配置),可以在Worker层添加简单的内存缓存(如使用Cloudflare的Cache API),但要注意缓存失效和内存使用。

  4. 监控与告警

    • Cloudflare Worker Metrics :在Cloudflare仪表板监控Worker的请求量、错误率、CPU时间。
    • TiDB Cloud Metrics :在TiDB Cloud控制台监控注册表数据库和各个Zero/Starter实例的查询延迟、连接数、存储空间使用情况。设置存储空间接近上限的告警。
    • 业务日志 :在Worker代码中增加关键操作(如创建Token、认领实例)的日志输出,方便问题追踪。

5.3 扩展性与成本

  1. 从Zero升级到Starter及更高版本 :认领后的Starter实例是免费的,但有资源限制。如果智能体数量或数据量极大,需要监控TiDB Cloud的控制台,关注存储用量和请求单元(RCU)消耗。超出免费额度后,需要升级到付费计划,TiDB Cloud支持弹性扩缩容。

  2. 多区域部署 :如果智能体用户遍布全球,可以考虑在多个地理区域(如北美、欧洲、亚洲)分别部署一套 claw-memory Worker和对应的注册表数据库,让智能体连接最近的端点,降低延迟。这需要管理多套配置和Token体系。

  3. 自定义扩展 :当前API是通用的。你可以根据智能体的特定需求,在Worker上扩展新的API端点。例如,增加一个 /api/summarize 端点,自动对某个Tag下的记忆进行摘要总结;或者增加一个 /api/cleanup 端点,按规则清理过期记忆。

6. 常见问题与故障排查实录

在实际部署和测试中,我遇到了一些典型问题,这里汇总一下排查思路。

6.1 部署阶段问题

问题现象 可能原因 排查步骤与解决方案
npm run db:init 失败,提示连接被拒绝或超时。 1. TiDB Serverless集群未创建或状态不是“Available”。
2. 连接信息(主机、端口、用户名、密码)错误。
3. 本地网络或防火墙阻止访问TiDB Cloud的公共端点。
1. 登录TiDB Cloud控制台确认集群状态。
2. 仔细核对 Connect 对话框中的信息,注意密码中的特殊字符。
3. 尝试用 mysql 客户端或数据库管理工具(如DBeaver)直接连接,验证网络和凭据。
npm run deploy 失败,或部署后Worker返回5xx错误。 1. Cloudflare Wrangler未登录或没有项目写入权限。
2. 未设置或错误设置了必需的Secret ( REGISTRY_* , ENCRYPTION_KEY )。
3. Worker代码运行时无法连接到注册表数据库。
1. 运行 wrangler whoami 确认登录状态。
2. 运行 npx wrangler secret list 查看已设置的Secret,确保没有遗漏。
3. 查看Cloudflare Worker的实时日志,通常会有更详细的数据库连接错误信息。
创建Token时返回500错误,日志显示“Failed to provision Zero instance”。 1. TiDB Cloud API调用失败(配额不足、区域资源售罄、临时故障)。
2. 用于调用TiDB Cloud API的凭据问题(但此项目似乎未直接集成此API,需确认架构)。
1. 稍后重试。
2. 检查项目代码中关于TiDB Cloud Zero实例创建的部分,确认其实现方式。可能需要检查相关的环境变量或配置。

6.2 运行时API问题

问题现象 可能原因 排查步骤与解决方案
使用Token调用 /api/memories 时返回 401 Unauthorized 403 Forbidden 1. Token拼写错误或已失效(如对应的Zero实例已过期且未认领)。
2. 使用了客户端加密模式创建Token,但后续请求未提供或提供了错误的 X-Encryption-Key 头。
1. 确认Token字符串完全正确。调用 /api/tokens/:token/info 查看Token状态。
2. 务必确保 :如果创建Token时提供了 X-Encryption-Key ,那么之后所有使用此Token的请求都必须携带 完全相同 的Key。
搜索记忆时结果不符合预期,或速度慢。 1. 搜索条件过于宽泛或模糊。
2. 数据库表缺少有效索引。
3. 记忆数据量非常大。
1. 尽量使用 tags source 等精确字段进行过滤,结合 q 关键词搜索。
2. 连接到你的业务数据库(通过认领后的TiDB Cloud控制台),检查 memories 表上是否有 idx_tags , idx_source , idx_key 等索引。如果没有,可以考虑在低峰期添加。
3. 对结果进行分页( limit & offset )。
存储记忆时返回“Payload too large”或类似错误。 单条记忆的 content 字段超出了数据库列或API设置的大小限制。 项目文档说明 content 字段支持最多约50KB。检查你写入的内容长度。如果确实需要存储更长的内容,可以考虑压缩后再存储,或者将大内容拆分成多条关联的记忆。
认领链接( claim_url )点击后无效或提示“Already claimed”。 1. 认领链接已过期(可能有时效性)。
2. 该Zero实例已被其他TiDB Cloud账户认领。
3. 你已经认领过该实例。
1. 重新调用 POST /api/tokens/:token/claim 获取新的认领链接。
2. 确保你用于点击链接的浏览器已登录正确的TiDB Cloud账户。
3. 在TiDB Cloud控制台查看你的集群列表,确认是否已存在该实例。

6.3 数据迁移与备份

虽然TiDB Cloud提供了高可用性,但主动备份重要数据是好习惯。

  1. 备份单个记忆空间的数据 :由于每个Token对应一个独立的TiDB实例,你可以直接通过TiDB Cloud控制台对你认领后的Starter实例进行数据导出(Dumpling)或使用其备份功能。
  2. 迁移记忆空间 :如果需要将记忆从一个Token迁移到另一个(例如切换到客户端加密模式),目前没有内置工具。你需要写一个脚本:用旧Token读出所有记忆(可能需要分页),然后用新Token的API逐条或批量写入。
  3. 注册表数据库备份 :这个数据库存储了所有Token的映射关系,至关重要。务必定期为这个TiDB Serverless集群启用自动备份或手动导出表结构及数据。

这个项目为AI智能体的记忆共享提供了一个非常优雅且安全的解决方案。它巧妙地将无服务器函数、云原生数据库和精心的安全设计结合在一起,把复杂的多租户、资源隔离问题简化成了一个简单的API调用。在实际集成到智能体项目中时,最需要花心思的是设计记忆的结构(如何设置 tags key metadata )以及制定记忆的更新与淘汰策略,避免存储空间无限增长。对于中小规模的智能体应用来说,这套方案几乎是开箱即用、成本可控的优选。

更多推荐