一站式AI Agent长记忆方案

大型语言模型(LLM)常因上下文限制而遗忘对话历史,导致服务不连贯。PolarDB PostgreSQL提供了一种长期记忆解决方案,该方案基于Mem0框架,整合了向量数据库引擎与图数据库引擎,使得AI Agent能够在跨会话中持久化存储与检索用户的偏好与历史,从而实现真正的长期记忆智能体验。

功能简介

本方案的核心是利用Mem0框架为AI Agent构建一个统一的记忆层。Mem0能够将对话信息转化为结构化或非结构化的记忆,并存储在后端的数据库中。PolarDB PostgreSQL作为底层数据引擎,为此提供了两种实现路径:

  • 纯向量数据库方案 利用PolarDB PostgreSQL内置的pgvector(向量数据库引擎),将对话中的关键信息转换为向量并存储。当AI Agent需要回忆时,通过向量相似度搜索快速检索相关记忆。此方案实现简单且成本较低,适合在线客服、实时聊天机器人等需要快速语义检索的场景。

  • 向量数据库+图数据库方案 结合PolarDB PostgreSQL内置的pgvector(向量数据库引擎)和polar_age(图数据库引擎)插件,不仅存储对话的语义信息,还通过图结构的三元组(实体1-关系-实体2)存储实体间的复杂关系。例如,在用户说“我喜欢诺兰导演的《星际穿越》”时,系统不仅记住这句话,还会建立“我-喜欢-《星际穿越》”和“诺兰-导演-《星际穿越》”的实体关系。此方案适用于需要长期个性化服务的场景(如智能座仓AI助手、AI伴侣等)、复杂关系推理场景(如医疗诊断、旅行规划等)以及追踪复杂实体演变与关联场景(如企业知识库、金融风控动态规则库等)。

两种方案的互补性体现在:向量数据库+图数据库方案虽能处理复杂关系,但在检索效率上带来了更大的挑战,而纯向量数据库方案在简单场景中表现出更高的效率,但缺乏对深层关系的建模能力。在实际部署过程中,应根据业务复杂度和实时性需求进行混合架构设计。

方案架构

PolarDB PostgreSQL的一站式的长期记忆解决方案包含以下五个主要部分:

image
  • 记忆体引擎:建议采用Mem0框架,该框架是一个为AI Agent设计的先进记忆框架,它不仅能融合长短期记忆,还能将信息分层为工作、事实、情景等多种类型,并已支持了PolarDB的向量数据库引擎与图数据引擎能力。

  • 基础数据引擎:PolarDB PostgreSQL在产品内原生集成了PGVector向量引擎和兼容Apache AGE的图引擎,这种一站式架构避免了多系统拼接的复杂性,并依托云原生能力确保了卓越的性能与扩展性。

  • 模型服务:大语言模型在方案中负责自动从对话中提取、转换和向量化关键信息,您可在PolarDB中直接添加带GPU规格的AI节点,实现数据与模型推理的紧密耦合,从而大幅提升处理效率。

  • AI应用构建平台:Mem0框架可以作为插件轻松集成到Dify、LangChain等主流AI应用开发框架中,从而构建功能更强大的整体解决方案。

  • KV缓存增强:对于实时性要求极高的场景,PolarDB PostgreSQL支持开启分布式KVCache作为上下文缓存加速层,此举能有效减少重复计算,显著稳定并降低推理延迟。

优势

  • 一站式解决方案PolarDB PostgreSQL在单一产品内同时提供高性能的向量数据库引擎和图数据库引擎。相比需要采购和维护多个独立数据库产品的方案,本方案可将您的采购成本降低至少50%,并显著简化系统架构,降低运维复杂度和项目风险。

  • 高可扩展性:基于云原生分布式架构,向量存储和图数据管理均支持百亿级规模,能够有效应对业务增长。向量索引的创建和搜索过程中无内存溢出(OOM)风险,图数据库引擎具备百亿级(点+边)大图管理的能力,并支持万级以上的高QPS图搜索可扩展性。此外,系统还支持TTL记录的生命周期自动回收,并提供控制台功能以开启图管理节点进行可视化管理。

  • 高性能:支持向量与图数据的实时写入与查询(写入即可查),查询RT(响应时间)最低可优于50毫秒。若结合AI节点进行本地模型推理,效率可提升1-2倍,再配合分布式KVCache缓存,推理速度可进一步提升5倍以上,同时降低30%-50%的显存占用。

计费说明

本方案涉及的阿里云产品均为付费服务,具体费用说明如下:

使用说明

本教程将引导您结合PolarDB PostgreSQL纯向量数据库和向量数据库+图数据库方案,以及阿里云大模型服务平台百炼,并基于Mem0框架,构建一个AI Agent长期记忆系统。

说明

开源的Mem0框架版本目前已适配PolarDB PostgreSQLpgvector(向量数据库引擎),但尚未适配polar_age(图数据库引擎)。如需体验一站式AI Agent长记忆方案,请提交工单与我们联系,以获取经过适配的Mem0框架。

准备工作

  1. 一台PolarDB PostgreSQL 16版本集群和一台ECS实例。为确保最佳性能,建议两者位于同一专有网络VPC与交换机内。

  2. PolarDB PostgreSQL集群内获取连接地址与端口,并创建对应的数据库账号。

  3. 开通阿里云大模型服务平台百炼,并获取API Key

步骤一:配置ECS环境

  1. 登录ECS实例,您可按需选择合适的工具连接实例

  2. 检查Python环境及版本,本方案需使用Python 3.11或更高版本,以下内容以Alibaba Cloud Linux 3.2104 LTS 64操作系统为例进行说明。

    1. 检查您的环境中是否有Python环境以及Python版本。

      python --version
    2. 若未安装或版本过低,可执行下述命令安装或更新

      1. 更新系统软件包。

        sudo yum update -y
      2. 列出所有可用但尚未安装的Python软件包。

        sudo yum list available | grep '^python3\([0-9]\|\.[0-3]\+\)\.\(x86_64|aarch64\)*'
      3. 从可用的Python软件包中,选择符合Python 3.11的版本进行安装。

        sudo yum install python3.11.x86_64 -y
      4. 验证环境。

        python3.11 --version
  3. 将您通过工单获取的Mem0框架(适配PolarDB PostgreSQL)上传至ECS实例并解压。此处以上传至/home目录为例,您可按需选择上传ZIP包的方式

    说明

    若您的ECS环境中未安装zip解压工具,请先执行sudo yum install -y unzip命令安装zip解码工具。

    cd /home
    unzip mem0.zip 
  4. 将阿里云大模型服务平台百炼的API Key配置到环境变量。其中,<YOUR_DASHSCOPE_API_KEY>为您的API Key。

    echo "export DASHSCOPE_API_KEY='<YOUR_DASHSCOPE_API_KEY>'" >> ~/.bashrc
    source ~/.bashrc
  5. Python环境配置到环境变量。其中,<mem0_src>为您的代码目录,依照上述第三步的示例,应设置为/home/mem0

    export PYTHONPATH=<mem0_src>:<mem0_src>/mem0:/home/postgres/.local/lib/python3.11/site-packages/

步骤二:初始化PolarDB数据库

  1. 登录PolarDB PostgreSQL集群。在ECS实例中,请使用PolarDB提供PolarDB-Tools连接您的集群。

    说明

    如需在ECS实例中登录集群,需要先将ECS实例的IP或者所属安全组加入到集群的白名单中。

  2. 进入默认的postgres数据库,执行以下SQL语句,创建测试数据库和所需插件。

    1. 创建测试数据库mem0

      CREATE DATABASE mem0;
      ALTER DATABASE mem0 SET session_preload_libraries TO 'polar_age';
    2. 切换至数据库mem0

      \c mem0
    3. 创建所需插件。

      -- 创建图数据库插件
      CREATE EXTENSION polar_age;
      
      -- 创建向量数据库插件
      CREATE EXTENSION vector;
    4. 创建图(Graph)。

      -- 创建一个名为mem0的图
      SELECT ag_catalog.create_graph('mem0');
      
      -- 为图中的顶点(vertex)表增加一个1536维的向量列,用于混合检索
      -- 注意:1536维需要与您选用的Embedding模型输出维度一致(如百炼的text-embedding-v2)
      ALTER TABLE mem0._ag_label_vertex ADD COLUMN embedding vector(1536);
      说明

      PolarDB PostgreSQL在图(Graph)的点表中增加了向量字段,在底层实现了图+向量混合检索。

    5. 设置永久加载插件。

      ALTER DATABASE mem0 SET search_path = public,ag_catalog,mem0;
      ALTER DATABASE mem0 SET session_preload_libraries TO 'polar_age';
      说明

      请注意,使用数据管理 DMS(Data Management)客户端设置search_path时,可能会存在兼容性问题。

  3. 使用exit;命令退出数据库。

步骤三:配置并运行Mem0示例代码

  1. 安装PostgreSQL开发工具包。

    # 这个命令会安装 pg_config 等构建psycopg2所需的工具
    sudo yum install -y postgresql-devel
  2. /home/mem0代码目录中,创建虚拟环境(venv)隔离项目依赖,避免全局污染。

    cd /home/mem0
    python3.11 -m venv myenv
  3. 激活虚拟环境

    source myenv/bin/activate
  4. 升级pip到最新版本

    python -m pip install --upgrade pip
  5. 安装Mem0框架及其所需的Python依赖库。

    pip install .
    pip install rank_bm25
    pip install psycopg2-binary
  6. 体验长期记忆方案。

    实时问答记忆体验

    纯向量数据库

    1. 在项目根目录直接创建一个run_memory_test.py文件。

      touch run_memory_test.py
      vi run_memory_test.py
    2. 将以下代码复制到文件中。其中,请将代码中的占位符(如<polardb-host><polardb-port><polardb-username><polardb-password>)替换为您的集群信息。

      from mem0 import Memory
      
      # This example must connect to a neptune-graph instance with 1536 vector dimensions specified.
      config = {
          "llm": {
              "provider": "bailian",
              "config": {"model": "qwen-plus"},
          },
          "embedder": {
              "provider": "bailian",
              "config": {"model": "text-embedding-v4", "embedding_dims": 1536},
          },
          "vector_store": {
              "provider": "pgvector",
              "config": {
                  "host": "<polardb-host>",
                  "port": <polardb-port>,
                  "dbname": "mem0",
                  "user": "<polardb-username>",
                  "password": "<polardb-password>",
                  "collection_name": "memories"
              }
          }
      }
      
      m = Memory.from_config(config_dict=config)
      
      debug = True
      # Using only user_id
      result = m.add("I like pizza", user_id="alice")
      if debug:
          print(result)
      
      result = m.add("I hate pizza", user_id="alice")
      if debug:
          print(result)
      
      result = m.add("I like football", user_id="alice", metadata={"category": "hobbies"})
      if debug:
          print(result)
      
      # Using both user_id and agent_id
      result = m.add("I like pizza", user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
      
      # Get all memories for a user
      result = m.get_all(user_id="alice")
      if debug:
          print(result)
      
      # Get all memories for a specific agent belonging to a user
      result = m.get_all(user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
      
      # Search memories for a user
      result = m.search("tell me my name.", user_id="alice")
      if debug:
          print(result)
      
      # Search memories for a specific agent belonging to a user
      result = m.search("tell me my name.", user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
      
      # Search memories for a user
      result = m.search("what food do you like.", user_id="alice")
      if debug:
          print(result)
      
      # Search memories for a user
      result = m.search("what sport do you like.", user_id="alice")
      if debug:
          print(result)
      
      # Delete all memories for a user
      result = m.delete_all(user_id="alice")
      if debug:
          print(result)
      
      # Delete all memories for a specific agent belonging to a user
      result = m.delete_all(user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
    3. 保存文件并运行脚本。

      python run_memory_test.py
    4. 观察命令行输出,您将看到记忆被添加、搜索、查询和删除的全过程。

      {'results': []}
      {'results': [{'id': '7f5af484-e8a5-4cae-b53e-e8be53beaa76', 'memory': 'I like pizza', 'event': 'DELETE'}]}
      {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'event': 'ADD'}]}
      {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'event': 'ADD'}]}
      {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]}
      {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]}
      {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.696223974227903, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.707332858224723, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]}
      {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.707332858224723, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]}
      {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.413298897746297, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}, {'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.458641203722873, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}]}
      {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.278534250172033, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.483608051645996, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]}
      {'message': 'Memories deleted successfully!'}
      {'message': 'Memories deleted successfully!'}

    向量数据库+图数据库

    1. 在项目根目录直接创建一个run_memory_graph_test.py文件。

      touch run_memory_graph_test.py
      vi run_memory_graph_test.py
    2. 将以下代码复制到文件中。其中,请将代码中的占位符(如<polardb-host><polardb-port><polardb-username><polardb-password>)替换为您的集群信息。

      from mem0 import Memory
      
      # This example must connect to a neptune-graph instance with 1536 vector dimensions specified.
      config = {
          "llm": {
              "provider": "bailian",
              "config": {"model": "qwen-plus"},
          },
          "embedder": {
              "provider": "bailian",
              "config": {"model": "text-embedding-v4", "embedding_dims": 1536},
          },
          "vector_store": {
              "provider": "pgvector",
              "config": {
                  "host": "<polardb-host>",
                  "port": <polardb-port>,
                  "dbname": "mem0",
                  "user": "<polardb-username>",
                  "password": "<polardb-password>",
                  "collection_name": "memories"
              }
          },
          "graph_store": {
              "provider": "polardb",
              "config": {
                  "url": "<polardb-host>",
                  "port": <polardb-port>,
                  "database": "mem0",
                  "username": "<polardb-username>",
                  "password": "<polardb-password>",
                  "graphname": "mem0",
              },
          }
      }
      
      m = Memory.from_config(config_dict=config)
      
      debug = True
      # Using only user_id
      result = m.add("I like pizza", user_id="alice")
      if debug:
          print(result)
      
      result = m.add("I hate pizza", user_id="alice")
      if debug:
          print(result)
      
      result = m.add("I like football", user_id="alice", metadata={"category": "hobbies"})
      if debug:
          print(result)
      
      # Using both user_id and agent_id
      result = m.add("I like pizza", user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
      
      # Get all memories for a user
      result = m.get_all(user_id="alice")
      if debug:
          print(result)
      
      # Get all memories for a specific agent belonging to a user
      result = m.get_all(user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
      
      # Search memories for a user
      result = m.search("tell me my name.", user_id="alice")
      if debug:
          print(result)
      
      # Search memories for a specific agent belonging to a user
      result = m.search("tell me my name.", user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
      
      # Search memories for a user
      result = m.search("what food do you like.", user_id="alice")
      if debug:
          print(result)
      
      # Search memories for a user
      result = m.search("what sport do you like.", user_id="alice")
      if debug:
          print(result)
      
      # Delete all memories for a user
      result = m.delete_all(user_id="alice")
      if debug:
          print(result)
      
      # Delete all memories for a specific agent belonging to a user
      result = m.delete_all(user_id="alice", agent_id="food-assistant")
      if debug:
          print(result)
    3. 保存文件并运行脚本。

      python run_memory_graph_test.py
    4. 观察命令行输出。您将看到记忆被添加、搜索、查询和删除的全过程,以及每次操作后返回的包含向量搜索结果(results)和图关系(relations)的JSON数据。这直观地展示了AI Agent如何存储和回忆信息。

      {'results': [{'id': '5d2007c2-b5b7-4632-a6c7-7f3672f6bf8f', 'memory': 'I like pizza', 'event': 'ADD'}], 'relations': {'deleted_entities': [], 'added_entities': [[{'source': 'user_id:_alice', 'relationship': 'likes', 'target': 'pizza', 'source_id': '3_53', 'destination_id': '3_54', 'relationship_id': '31_1'}]]}}
      {'results': [{'id': '5d2007c2-b5b7-4632-a6c7-7f3672f6bf8f', 'memory': 'Hate pizza', 'event': 'DELETE'}], 'relations': {'deleted_entities': [[{'source': 'user_id:_alice', 'target': 'pizza', 'relationship': 'likes'}]], 'added_entities': [[{'source': 'user_id:_alice', 'relationship': 'hates', 'target': 'pizza'}]]}}
      {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'event': 'ADD'}], 'relations': {'deleted_entities': [], 'added_entities': [[{'source': 'alice', 'relationship': 'likes', 'target': 'football', 'source_id': '3_55', 'destination_id': '3_56', 'relationship_id': '31_2'}]]}}
      {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'event': 'ADD'}], 'relations': {'deleted_entities': [], 'added_entities': [[{'source': 'i', 'relationship': 'likes', 'target': 'pizza', 'source_id': '3_57', 'destination_id': '3_58', 'relationship_id': '31_3'}]]}}
      {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': [{'source': 'user_id:_alice', 'relationship': 'hates', 'target': 'pizza'}, {'source': 'alice', 'relationship': 'likes', 'target': 'football'}, {'source': 'i', 'relationship': 'likes', 'target': 'pizza'}]}
      {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': []}
      {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.6962242450914439, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.7073326554295456, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': [{'source': '"alice"', 'relationship': 'likes', 'destination': '"football"'}]}
      {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.7073326554295456, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': []}
      {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.4132988460683351, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}, {'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.45864128080397715, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}], 'relations': []}
      {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.27853412116386245, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.4836079842249751, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': [{'source': '"alice"', 'relationship': 'likes', 'destination': '"football"'}]}
      {'message': 'Memories deleted successfully!'}
      {'message': 'Memories deleted successfully!'}

    记忆分类与标签体验

    纯向量数据库

    1. 在项目根目录直接创建一个run_memory_category_test.py文件。

      touch run_memory_category_test.py
      vi run_memory_category_test.py
    2. 将以下代码复制到文件中。其中,请将代码中的占位符(如<polardb-host><polardb-port><polardb-username><polardb-password>)替换为您的集群信息。

      import json
      from mem0 import Memory
      from mem0.configs.base import MemoryConfig, LlmConfig, EmbedderConfig
      
      # This example must connect to a neptune-graph instance with 1536 vector dimensions specified.
      config = {
          "llm" : {
              "provider": "bailian",
              "config": {"model": "qwen-plus",  "temperature": 0.2, "max_tokens": 2000, "top_p": 1.0},
          },
          "embedder": {
              "provider": "bailian",
              "config": {"model": "text-embedding-v4", "embedding_dims": 1536},
          },
          "vector_store": {
              "provider": "pgvector",
              "config": {
                  "host": "<polardb-host>",
                  "port": <polardb-port>,
                  "dbname": "mem0",
                  "user": "<polardb-username>",
                  "password": "<polardb-password>",
                  "collection_name": "memories"
              },
          },
          "reset_vector_store": True
      }
      
      m = Memory.from_config(config_dict=config)
      
      # 添加对话记忆
      messages = [
          {"role": "user", "content": "我喜欢科幻电影,尤其是星际穿越。"},
          {"role": "assistant", "content": "星际穿越确实是一部经典的科幻电影!我会记住你喜欢这类电影。"},
          {"role": "user", "content": "我也喜欢克里斯托弗·诺兰的其他电影。"},
          {"role": "assistant", "content": "诺兰的作品确实很出色!除了《星际穿越》,他还导演了《盗梦空间》、《信条》、《记忆碎片》等经典作品。您对这些电影有什么特别的看法吗?"},
      ]
      
      # 添加记忆,并附加元数据
      m.add(messages, user_id="alice", metadata={"category": "movies", "tags": ["sci-fi", "preferences"], "importance": "high"})
      
      # 检索记忆
      memories = m.search(query="帮我推荐喜欢的电影", user_id="alice", filters={"category": "movies"})
      print(json.dumps(memories, indent=2, ensure_ascii=False))
      
      # 获取所有记忆
      all_memories = m.get_all(user_id="alice")
      print(json.dumps(all_memories, indent=2, ensure_ascii=False))
      
      # Delete all memories for a user
      result = m.delete_all(user_id="alice")
      print(result)
      
    3. 保存文件并运行脚本。

      python run_memory_category_test.py
    4. 观察命令行输出,您将看到对话记忆被分类以及标签后的搜索、查询和删除的全过程。

      {
        "results": [
          {
            "id": "5e4a357a-ca3e-4769-9f80-06c9e74c53f3",
            "memory": "我喜欢科幻电影,尤其是星际穿越",
            "hash": "d3747e8081810fc535f641ee28207d90",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "score": 0.366387451646842,
            "created_at": "2025-08-07T18:43:39.167113-07:00",
            "updated_at": null,
            "user_id": "alice"
          },
          {
            "id": "68393dda-e498-430d-bfdb-af4552196478",
            "memory": "我也喜欢克里斯托弗·诺兰的其他电影",
            "hash": "77408cade088bfad20138a6b405f9e65",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "score": 0.451759159564968,
            "created_at": "2025-08-07T18:43:39.178665-07:00",
            "updated_at": null,
            "user_id": "alice"
          }
        ]
      }
      {
        "results": [
          {
            "id": "5e4a357a-ca3e-4769-9f80-06c9e74c53f3",
            "memory": "我喜欢科幻电影,尤其是星际穿越",
            "hash": "d3747e8081810fc535f641ee28207d90",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "created_at": "2025-08-07T18:43:39.167113-07:00",
            "updated_at": null,
            "user_id": "alice"
          },
          {
            "id": "68393dda-e498-430d-bfdb-af4552196478",
            "memory": "我也喜欢克里斯托弗·诺兰的其他电影",
            "hash": "77408cade088bfad20138a6b405f9e65",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "created_at": "2025-08-07T18:43:39.178665-07:00",
            "updated_at": null,
            "user_id": "alice"
          }
        ]
      }
      {'message': 'Memories deleted successfully!'}

    向量数据库+图数据库

    1. 在项目根目录直接创建一个run_memory_category_graph_test.py文件。

      touch run_memory_category_graph_test.py
      vi run_memory_category_graph_test.py
    2. 将以下代码复制到文件中。其中,请将代码中的占位符(如<polardb-host><polardb-port><polardb-username><polardb-password>)替换为您的集群信息。

      import json
      from mem0 import Memory
      from mem0.configs.base import MemoryConfig, LlmConfig, EmbedderConfig
      
      # This example must connect to a neptune-graph instance with 1536 vector dimensions specified.
      config = {
          "llm" : {
              "provider": "bailian",
              "config": {"model": "qwen-plus",  "temperature": 0.2, "max_tokens": 2000, "top_p": 1.0},
          },
          "embedder": {
              "provider": "bailian",
              "config": {"model": "text-embedding-v4", "embedding_dims": 1536},
          },
          "vector_store": {
              "provider": "pgvector",
              "config": {
                  "host": "<polardb-host>",
                  "port": <polardb-port>,
                  "dbname": "mem0",
                  "user": "<polardb-username>",
                  "password": "<polardb-password>",
                  "collection_name": "memories"
              },
          },
          "graph_store": {
              "provider": "polardb",
              "config": {
                  "url": "<polardb-host>",
                  "port": <polardb-port>,
                  "database": "mem0",
                  "username": "<polardb-username>",
                  "password": "<polardb-password>",
                  "graphname": "mem0",
              },
          },
          "reset_vector_store": True
      }
      
      m = Memory.from_config(config_dict=config)
      
      # 添加对话记忆
      messages = [
          {"role": "user", "content": "我喜欢科幻电影,尤其是星际穿越。"},
          {"role": "assistant", "content": "星际穿越确实是一部经典的科幻电影!我会记住你喜欢这类电影。"},
          {"role": "user", "content": "我也喜欢克里斯托弗·诺兰的其他电影。"},
          {"role": "assistant", "content": "诺兰的作品确实很出色!除了《星际穿越》,他还导演了《盗梦空间》、《信条》、《记忆碎片》等经典作品。您对这些电影有什么特别的看法吗?"}
      ]
      
      # 添加记忆,并附加元数据
      m.add(messages, user_id="alice", metadata={"category": "movies", "tags": ["sci-fi", "preferences"], "importance": "high"})
      
      # 检索记忆
      memories = m.search(query="帮我推荐喜欢的电影", user_id="alice", filters={"category": "movies"})
      print(json.dumps(memories, indent=2, ensure_ascii=False))
      
      # 获取所有记忆
      all_memories = m.get_all(user_id="alice")
      print(json.dumps(all_memories, indent=2, ensure_ascii=False))
      
      # Delete all memories for a user
      result = m.delete_all(user_id="alice")
      print(result)
    3. 保存文件并运行脚本。

      python run_memory_category_graph_test.py
    4. 观察命令行输出。您将看到对话记忆被分类和标签后的搜索、查询和删除的全过程,以及每次操作后返回的包含向量搜索结果(results)和图关系(relations)的JSON数据。这直观地展示了AI Agent如何存储和回忆信息。

      {
        "results": [
          {
            "id": "ec8d0528-35f0-43ae-9ff1-ef1a93e6a017",
            "memory": "我喜欢科幻电影,尤其是星际穿越",
            "hash": "d3747e8081810fc535f641ee28207d90",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "score": 0.36638870038909743,
            "created_at": "2025-08-05T23:22:16.354730-07:00",
            "updated_at": null,
            "user_id": "alice"
          },
          {
            "id": "d55c9188-e2a4-402b-b59c-658f640ab01b",
            "memory": "我也喜欢克里斯托弗·诺兰的其他电影",
            "hash": "77408cade088bfad20138a6b405f9e65",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "score": 0.4517598055411187,
            "created_at": "2025-08-05T23:22:16.367098-07:00",
            "updated_at": null,
            "user_id": "alice"
          }
        ],
        "relations": []
      }
      {
        "results": [
          {
            "id": "ec8d0528-35f0-43ae-9ff1-ef1a93e6a017",
            "memory": "我喜欢科幻电影,尤其是星际穿越",
            "hash": "d3747e8081810fc535f641ee28207d90",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "created_at": "2025-08-05T23:22:16.354730-07:00",
            "updated_at": null,
            "user_id": "alice"
          },
          {
            "id": "d55c9188-e2a4-402b-b59c-658f640ab01b",
            "memory": "我也喜欢克里斯托弗·诺兰的其他电影",
            "hash": "77408cade088bfad20138a6b405f9e65",
            "metadata": {
              "tags": [
                "sci-fi",
                "preferences"
              ],
              "category": "movies",
              "importance": "high"
            },
            "created_at": "2025-08-05T23:22:16.367098-07:00",
            "updated_at": null,
            "user_id": "alice"
          }
        ],
        "relations": [
          {
            "source": "user_id:_alice",
            "relationship": "喜欢",
            "target": "克里斯托弗·诺兰的电影"
          },
          {
            "source": "user_id:_alice",
            "relationship": "喜欢",
            "target": "科幻电影"
          },
          {
            "source": "星际穿越",
            "relationship": "属于",
            "target": "科幻电影"
          },
          {
            "source": "user_id:_alice",
            "relationship": "喜欢",
            "target": "克里斯托弗·诺兰的其他电影"
          },
          {
            "source": "user_id:_alice",
            "relationship": "喜欢",
            "target": "星际穿越"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "星际穿越"
          },
          {
            "source": "user_id:_alice",
            "relationship": "喜欢",
            "target": "科幻电影"
          },
          {
            "source": "星际穿越",
            "relationship": "属于",
            "target": "科幻电影"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "星际穿越"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "盗梦空间"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "盗梦空间"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "信条"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "信条"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "记忆碎片"
          },
          {
            "source": "克里斯托弗·诺兰",
            "relationship": "导演了",
            "target": "记忆碎片"
          }
        ]
      }
      {'message': 'Memories deleted successfully!'}

结语

本文详细阐述了基于PolarDB PostgreSQLMem0框架构建的AI Agent长记忆融合方案。该方案不仅整合了短期记忆的即时性与长期记忆的持久性,更凭借PolarDB的独特优势,在激烈的市场竞争中脱颖而出。与同类方案相比,本方案的核心优势体现在:

  • 架构统一,无缝集成:将向量数据库与图数据库能力集于一身,彻底告别了复杂的多系统拼接方案,显著降低了开发与运维成本。

  • 云原生高性能:深度融合云原生弹性、模型推理加速及分布式KVCache技术,确保了AI Agent在处理复杂任务时,依然能提供毫秒级的低延迟响应。

  • 企业级扩展性与成熟度:依托PolarDB久经考验的稳定性和卓越的水平扩展能力,为AI应用的规模化落地提供了坚实与可靠的基础。