手把手教你实现AgentScope内存持久化:自定义存储扩展全攻略

【免费下载链接】agentscope 【免费下载链接】agentscope 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope

你是否还在为AgentScope智能体重启后丢失上下文而烦恼?是否需要将用户偏好、任务经验永久保存?本文将带你从零开始构建自定义内存存储解决方案,让智能体真正拥有"长期记忆"能力。

读完本文你将掌握:

  • 内存存储扩展的核心接口设计
  • 3种自定义存储实现方案(文件/数据库/云存储)
  • 完整集成测试与性能优化指南
  • 生产环境部署最佳实践

核心概念:AgentScope内存架构

AgentScope的内存系统采用分层设计,通过抽象基类实现灵活扩展。核心模块位于src/agentscope/memory目录,主要包含:

内存架构

  • 基础接口LongTermMemoryBase定义了内存操作标准
  • 内置实现:Mem0和ReMe两种记忆系统(支持向量存储和语义检索)
  • 扩展点:通过重写抽象方法实现自定义存储逻辑

内存类型与应用场景

内存类型 典型应用 数据特点 推荐存储方案
对话记忆 多轮对话上下文 时序性强,短期有效 内存数据库
个人记忆 用户偏好、属性 变更频率低,长期有效 文件/关系型数据库
任务记忆 执行轨迹、解决方案 结构化强,可复用 向量数据库
工具记忆 调用记录、使用指南 元数据丰富,需检索 文档数据库

开发实战:自定义存储实现步骤

1. 接口实现:继承抽象基类

所有自定义内存存储必须实现LongTermMemoryBase的核心方法:

from agentscope.memory import LongTermMemoryBase
from agentscope.message import Msg
from agentscope.tool import ToolResponse

class FileSystemLongTermMemory(LongTermMemoryBase):
    async def record(self, msgs: list[Msg | None], **kwargs) -> None:
        """将消息记录到文件系统"""
        # 实现文件写入逻辑
        pass
        
    async def retrieve(self, msg: Msg | list[Msg] | None, **kwargs) -> str:
        """从文件系统检索相关记忆"""
        # 实现文件读取和匹配逻辑
        pass
        
    async def record_to_memory(self, thinking: str, content: list[str],** kwargs) -> ToolResponse:
        """提供给智能体的记忆记录工具"""
        # 实现工具调用接口
        pass
        
    async def retrieve_from_memory(self, keywords: list[str], **kwargs) -> ToolResponse:
        """提供给智能体的记忆检索工具"""
        # 实现工具调用接口
        pass

2. 存储设计:数据持久化方案

文件系统实现示例

文件系统存储适合个人记忆等变更不频繁的数据,示例实现位于examples/functionality/long_term_memory/reme

import json
import os
from pathlib import Path
from datetime import datetime

class FileSystemLongTermMemory(LongTermMemoryBase):
    def __init__(self, storage_path: str = "./memory_data"):
        self.storage_path = Path(storage_path)
        self.storage_path.mkdir(parents=True, exist_ok=True)
        
    async def record(self, msgs: list[Msg | None],** kwargs) -> None:
        # 创建唯一文件名(基于时间戳)
        timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
        file_path = self.storage_path / f"{timestamp}.json"
        
        # 序列化消息内容
        data = [msg.to_dict() if msg else None for msg in msgs]
        with open(file_path, "w", encoding="utf-8") as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
数据库集成要点

关系型数据库适合结构化的任务记忆存储,需注意:

  • 使用ORM框架简化操作(SQLAlchemy/Prisma)
  • 设计消息元数据表和内容表分离结构
  • 添加索引优化检索性能

数据模型

3. 智能体集成:工具注册与使用

自定义内存存储需注册为工具才能被智能体调用,参考examples/functionality/long_term_memory/mem0的集成方式:

from agentscope.agent import ReActAgent
from agentscope.tool import Toolkit

# 初始化自定义内存
memory = FileSystemLongTermMemory()

# 创建工具包并注册内存工具
toolkit = Toolkit()
toolkit.register_tool_function(memory.record_to_memory)
toolkit.register_tool_function(memory.retrieve_from_memory)

# 创建带长期记忆的智能体
agent = ReActAgent(
    name="MemoryAgent",
    sys_prompt="你是一个拥有长期记忆能力的智能助手...",
    model=DashScopeChatModel(...),
    toolkit=toolkit,
    long_term_memory=memory,
    long_term_memory_mode="both"  # 同时启用记录和检索工具
)

高级特性:优化与扩展

1. 缓存策略:减少存储开销

实现内存缓存可显著提升性能,参考src/agentscope/embedding/_cache_base.py的设计:

from functools import lru_cache

class CachedLongTermMemory(FileSystemLongTermMemory):
    @lru_cache(maxsize=100)
    async def retrieve(self, msg: Msg | list[Msg] | None, **kwargs) -> str:
        # 先查缓存,未命中再查存储
        return await super().retrieve(msg,** kwargs)

2. 加密存储:保护敏感数据

对于用户隐私等敏感信息,需实现数据加密:

from cryptography.fernet import Fernet

class SecureFileSystemLongTermMemory(FileSystemLongTermMemory):
    def __init__(self, key: str, **kwargs):
        super().__init__(** kwargs)
        self.cipher = Fernet(key)
        
    async def record(self, msgs: list[Msg | None], **kwargs) -> None:
        data = [msg.to_dict() if msg else None for msg in msgs]
        encrypted_data = self.cipher.encrypt(json.dumps(data).encode())
        # 写入加密数据...

3. 多模态支持:处理复杂内容

扩展内存系统支持图片、音频等多模态数据,需实现内容解析器:

class MultimodalLongTermMemory(FileSystemLongTermMemory):
    async def record(self, msgs: list[Msg | None],** kwargs) -> None:
        for msg in msgs:
            if msg and "image" in msg.content:
                # 处理图片内容...
            elif msg and "audio" in msg.content:
                # 处理音频内容...

测试与部署

功能验证:测试用例编写

# 测试代码示例
import asyncio
from agentscope.message import Msg

async def test_memory():
    memory = FileSystemLongTermMemory()
    test_msg = Msg(role="user", content="我喜欢杭州的民宿", name="user")
    
    # 测试记录功能
    await memory.record([test_msg])
    
    # 测试检索功能
    result = await memory.retrieve_from_memory(keywords=["杭州", "住宿"])
    assert "民宿" in result.content

asyncio.run(test_memory())

完整测试用例可参考tests/memory_reme_test.py的结构设计。

性能基准:评估存储方案

使用examples/evaluation/ace_bench进行性能评估,重点关注:

  • 记录延迟(平均写入时间)
  • 检索准确率(相关记忆召回率)
  • 存储效率(数据压缩比)

应用案例:企业级部署方案

某客服智能体系统采用三级存储架构:

  1. 内存缓存:存储最近对话(Redis)
  2. 文件存储:用户画像数据(MinIO)
  3. 向量数据库:知识图谱(Milvus)

部署架构

关键指标:

  • 对话记忆检索延迟 < 100ms
  • 用户数据持久化成功率 100%
  • 知识更新实时性 < 5分钟

总结与展望

自定义内存存储是AgentScope扩展智能体能力的关键途径,本文介绍的实现框架可满足大多数场景需求。未来发展方向包括:

  1. 自适应存储:根据数据类型自动选择最优存储方案
  2. 记忆演化:实现记忆的老化、强化和遗忘机制
  3. 分布式存储:支持大规模集群部署

查看docs/roadmap.md了解内存系统的官方发展计划,欢迎通过CONTRIBUTING.md参与开发贡献。

点赞收藏本文,关注项目更新,下期将带来《智能体工具开发实战》!

【免费下载链接】agentscope 【免费下载链接】agentscope 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐