news 2026/10/23 2:52:30

openJiuwen agent-core-java 记忆类型枚举 SupportMemoryType 全解析:用户画像与摘要记忆的标识约定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
openJiuwen agent-core-java 记忆类型枚举 SupportMemoryType 全解析:用户画像与摘要记忆的标识约定
  • 人工智能
  • AI Agent
  • Agent 框架
  • 工具调用
  • Agent 工作流
  • RAG
  • MCP Clients
  • 强化学习

【免费下载链接】agent-core-java

openJiuwen agent core Java是 openJiuwen Core的 Java版本,提供AI Agent开发、运行、调优与演进相关的全套SDK能力。

项目地址:https://gitcode.com/openJiuwen/agent-core-java
点击查看免费下载

SupportMemoryType是 openJiuwen agent-core-java 记忆引擎(com.openjiuwen.memory)中用于标识「受支持的记忆类型」的公开枚举,位于 mem_model 数据模型包 之下。它只定义了两个值:USER_PROFILE(用户画像)与SUMMARY(摘要记忆),但这两个值贯穿了长期记忆的写入、检索与向量库 schema 迁移全链路。读完本文,你将掌握该枚举的源码结构、与MemoryType的职责差异,以及它在向量迁移白名单校验中的实际用法,能够准确理解记忆引擎中"用户画像 / 摘要记忆"两种记忆类型的标识约定。

一、枚举定位:管理层支持的记忆类型

在 SupportMemoryType.java 中,枚举被定义为com.openjiuwen.memory.manage.mem_model包下的公开类型,其 Javadoc 明确说明它的用途:

"Memory types supported by summary/vector-specific paths."

即:它是摘要记忆 / 向量专用路径所支持的记忆类型清单。从源码结构看,该枚举与 Python 版openjiuwen/core/memory/manage/mem_model/memory_unit.py中的SupportMemoryType一一对应(注释中注明 "Mirrors Python's ..."),是 Java 版对 Python 实现的对齐镜像。

完整源码如下:

package com.openjiuwen.memory.manage.mem_model; public enum SupportMemoryType { USER_PROFILE("user_profile"), SUMMARY("summary"); private final String value; SupportMemoryType(String value) { this.value = value; } public String getValue() { return value; } }

二、枚举值:两个成员与原始值约定

SupportMemoryType仅包含两个枚举成员,每个成员都绑定一个字符串原始值(value),该原始值是与 Python 版保持一致的底层标识,用于存储层与迁移层的匹配。

枚举值原始值(getValue())说明
USER_PROFILEuser_profile用户画像记忆。对应长期记忆中描述用户偏好、身份等画像类信息的记忆类型。
SUMMARYsummary摘要记忆。对应跨多轮会话压缩生成的历史摘要记忆类型。

两个原始值均为小写蛇形命名(snake_case),与存储层使用的字符串标识完全一致,而不是 Java 惯例的USER_PROFILE大写形式——这一点在对接 SQL / 向量 / KV 存储时至关重要。

三、字段与公开方法:单字段枚举的标准形态

成员类型说明
字段valueString枚举的原始值,构造时通过私有构造器注入,不可变更。
方法public String getValue()String返回当前枚举对应的原始值字符串。

这是一个非常标准的"值绑定"枚举模式:私有构造器接收字符串参数,getValue()暴露给外部使用。由于枚举实例本身是单例且value为final,因此getValue()返回的值在 JVM 生命周期内恒定不变,可以安全地作为存储键、集合名后缀或校验白名单使用。

与 MemoryType 的职责差异

同包下还有一个更完整的枚举 MemoryType.java,它定义了 7 个成员:FRAGMENT_MEMORY、USER_PROFILE、SEMANTIC_MEMORY、EPISODIC_MEMORY、VARIABLE、SUMMARY、UNKNOWN,并提供了fromValue(String)的字符串反查方法。

两者的关系可以这样理解:

  • MemoryType是全量记忆类型枚举,覆盖长期记忆引擎中出现的所有记忆分类,并负责"字符串 → 枚举"的反向解析(未知值回退为UNKNOWN);
  • SupportMemoryType是受支持类型白名单,只列出向量 / 摘要专用路径允许出现的两种类型。

从 LongTermMemory.java 的管理器装配代码可以看到,五种MemoryType值被映射到三类管理器:

managers.put(MemoryType.USER_PROFILE.getValue(), fragmentMemoryManager); managers.put(MemoryType.EPISODIC_MEMORY.getValue(), fragmentMemoryManager); managers.put(MemoryType.SEMANTIC_MEMORY.getValue(), fragmentMemoryManager); managers.put(MemoryType.VARIABLE.getValue(), variableManager); managers.put(MemoryType.SUMMARY.getValue(), summaryManager);

其中USER_PROFILE走fragmentMemoryManager(分片记忆管理器),SUMMARY走summaryManager(摘要记忆管理器)。可以看到,user_profile与summary这两个字符串值正是管理器注册表、向量集合命名与检索类型过滤所使用的底层标识。

四、实战场景一:向量迁移白名单校验

SupportMemoryType最直接的生产级用法出现在向量存储迁移器 VectorMigrator.java 中。向量迁移流程会先根据记忆类型字符串查找对应的集合,再用枚举构建合法类型白名单进行校验:

private void validateMemoryType(String memTypeStr) { List<String> supportedTypes = Arrays.stream(SupportMemoryType.values()) .map(SupportMemoryType::getValue) .sorted() .toList(); if (!supportedTypes.contains(memTypeStr)) { throw ErrorHelper.buildError( StatusCode.MEMORY_MIGRATE_MEMORY_EXECUTION_ERROR, "error_msg", "Unsupported memory type: '" + memTypeStr + "'. Supported types: " + supportedTypes ); } }

这段逻辑说明了两点关键行为:

  1. 集合命名约定:向量集合通过"_" + normalized后缀匹配,即user_profile对应形如xxx_user_profile的集合,summary对应形如xxx_summary的集合;实体键允许带vector_前缀(会被normalizeMemoryType剥离),最终以后缀匹配集合名;
  2. 非法类型拦截:如果传入的记忆类型不在SupportMemoryType白名单中,会抛出MEMORY_MIGRATE_MEMORY_EXECUTION_ERROR错误码,并列出当前支持的类型,避免迁移器对未知类型的集合执行 schema 更新。

迁移流程由 RunMigrations.java 统一驱动,通过MigrationPlan.getVectorRegistry()注册的操作逐实体执行tryMigrate,因此SupportMemoryType实质上充当了向量迁移的输入合法性闸门。

五、实战场景二:与记忆单元的固定类型约束联动

SupportMemoryType的两个成员在记忆单元模型中也有一一对应的落地载体:

  • 摘要记忆单元 SummaryUnit.java:构造时强制super(MemoryType.SUMMARY, memId),且setMemType(...)被重写为总是写回MemoryType.SUMMARY,确保摘要单元的类型不可被篡改;
  • 用户画像类记忆则通过 FragmentMemoryUnit.java 承载,允许显式指定MemoryType(包括USER_PROFILE),配合OperationType(如ADD)记录记忆变更操作。

这种"枚举常量 + 固定类型单元"的组合,使记忆类型标识(user_profile/summary)在写入、存储、检索与迁移各环节保持一致。

六、测试验证:原始值契约被测试固化

仓库中的单元测试 MemoryUnitModelsTest.java 明确固化了SupportMemoryType的原始值契约:

assertThat(SupportMemoryType.SUMMARY.getValue()).isEqualTo("summary");

同一条测试方法还断言了MemoryType.USER_PROFILE.getValue()等于"user_profile"、SEMANTIC_MEMORY等于"semantic_memory"等,说明user_profile/summary等字符串值是被测试锁定的稳定契约,任何改动都会导致测试失败。

七、记忆引擎中的使用背景

从整体功能定位看(参见 记忆引擎指南),openJiuwen agent-core-java 的长期记忆以LongTermMemory单例为唯一公开入口,通过registerStore(kvStore, vectorStore, dbStore, embeddingModel)注册 KV、向量、SQL 三类存储后,按userId + scopeId + sessionId边界写入与检索。AgentMemoryConfig中的enableLongTermMem、enableFragmentMemory、enableSummaryMemory、memVariables四个开关分别对应长期记忆总开关、片段(画像)记忆、摘要记忆与变量记忆——其中前两者正是SupportMemoryType覆盖的范围。因此,SupportMemoryType可以理解为:在长期记忆的两条专用路径(用户画像分片路径、摘要路径)上,唯一被允许出现的记忆类型集合。

八、使用建议

  • 取原始值用getValue():对接存储或迁移时,永远通过SupportMemoryType.USER_PROFILE.getValue()/SupportMemoryType.SUMMARY.getValue()获取字符串,不要硬编码,避免与 Python 版契约脱节;
  • 区分两个枚举:需要全量类型判断(含UNKNOWN兜底、fromValue反查)时使用MemoryType;需要"受支持类型白名单"语义(如迁移校验)时使用SupportMemoryType;
  • 保持值的小写蛇形:user_profile、summary同时充当集合名后缀与管理器注册键,变更需同步评估存储层兼容性。

参考入口

  • 枚举源码:SupportMemoryType.java
  • 全量类型枚举:MemoryType.java
  • 摘要记忆单元:SummaryUnit.java
  • 向量迁移器(白名单校验):VectorMigrator.java
  • 迁移调度入口:RunMigrations.java
  • 长期记忆主入口:LongTermMemory.java
  • 单元测试(值契约):MemoryUnitModelsTest.java
  • 包索引文档:mem_model.README.md
  • 使用背景:记忆引擎.md
  • 人工智能
  • AI Agent
  • Agent 框架
  • 工具调用
  • Agent 工作流
  • RAG
  • MCP Clients
  • 强化学习

【免费下载链接】agent-core-java

openJiuwen agent core Java是 openJiuwen Core的 Java版本,提供AI Agent开发、运行、调优与演进相关的全套SDK能力。

项目地址:https://gitcode.com/openJiuwen/agent-core-java
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 3:52:49

华为MetaERP Excel 已生成,公式零错误。下面是这份分类的核心逻辑与分析(文件含汇总页 + 三个分类工作表,共 68 张表)。一、分类总览分类 数量 含义[特殊字符] 接口可写​

Excel 已生成&#xff0c;公式零错误。下面是这份分类的核心逻辑与分析&#xff08;文件含汇总页 三个分类工作表&#xff0c;共 68 张表&#xff09;。一、分类总览分类数量含义&#x1f7e1; 接口可写​6只能通过标准接口表 INSERT&#xff0c;由并发程序消费并清空&#x1…

作者头像 李华
网站建设 2026/10/19 0:39:19

声音震动分析中英文概念对照:从基础术语到工程实践

1. 从一次音频调试翻车说起&#xff1a;为什么概念对照表比想象中重要去年帮一个做智能硬件的朋友排查问题&#xff0c;设备录到的声音总带着一种“嗡嗡”的低频干扰&#xff0c;算法同事说是“底噪”&#xff0c;硬件同事说是“共振”&#xff0c;结构工程师又说是“腔体驻波”…

作者头像 李华
网站建设 2026/10/22 14:29:15

MySQL JSON_EXTRACT详解:用法、路径规则与性能优化

从第一次在MySQL 5.7里见到JSON_EXTRACT这个函数&#xff0c;到后来在业务系统里频繁用它取数据&#xff0c;我一直觉得这个函数属于"看上去简单、用起来全是细节"的类型。很多同事问我的第一句话往往是"这个函数到底返回的是啥&#xff0c;带不带引号"&am…

作者头像 李华
网站建设 2026/10/19 5:08:43

AI无法处理请求?解析常见原因与应对方案

简介&#xff1a;E4A魔改版v1.5.2压缩包提供了一整套基于E4A&#xff08;Easy4Android&#xff09;的Android快速开发资源&#xff0c;面向想借助中文式低代码环境编写应用、同时需要更强事件监听与类库扩展能力的开发者。包体约5.14MB&#xff0c;内含.e4a源工程、.elb类库、.…

作者头像 李华
网站建设 2026/10/19 15:25:27

从口令实验到KV cache:共享状态与隔离问题的通用解法

1. 从一次口令实验说起&#xff1a;为什么共享状态会变成问题源头第一次让我真正意识到“共享状态”和“隔离问题”之间张力的&#xff0c;不是什么复杂的分布式系统&#xff0c;而是一个看起来人畜无害的口令生成实验。当时的需求很简单&#xff1a;给定一组字符集和长度约束&…

作者头像 李华