- 人工智能
- AI Agent
- Agent 框架
- 工具调用
- Agent 工作流
- RAG
- MCP Clients
- 强化学习
【免费下载链接】agent-core-java
openJiuwen agent core Java是 openJiuwen Core的 Java版本,提供AI Agent开发、运行、调优与演进相关的全套SDK能力。
UpdateEmbeddingDimensionOperation是 openJiuwen agent-core-java 记忆迁移框架(com.openjiuwen.memory.migration.operation)中用于更新向量字段 embedding 维度的迁移操作,对应仓库中 UpdateEmbeddingDimensionOperation.java 的实现,其 Python 原型位于openjiuwen/core/memory/migration/operation/operations.py。本文围绕该类的字段、构造方法与公开方法展开,并结合VectorMigrator、VectorStoreUtils与测试用例,讲解如何将记忆库中已持久化的 embedding 向量从旧维度平滑迁移到新维度(扩大、缩减或零填充重建),覆盖完整调用链、批处理参数、recompute 回调的底层行为与最佳实践。
一、类定位:向量 Schema 迁移中的"维度变更"操作
1.1 为什么需要更新 embedding 维度
在长期记忆(Long-Term Memory)场景中,向量数据以FloatVector类型字段(如embedding)存储在向量集合(collection)中,其维度在创建集合时即被固定。当出现以下情况时,需要原地升级维度:
- 切换了 embedding 模型(如从 4 维升级到 768 维),新旧模型产出的向量维度不一致;
- 需要压缩向量存储成本(将维度下调);
- 需要在保留既有记忆数据的前提下重算向量。
直接重建集合会丢失历史记忆,而手动逐条改写向量既慢又容易出错。UpdateEmbeddingDimensionOperation正是为此设计的声明式迁移操作:它只描述"目标数据类型、目标字段、新维度、批大小"这组变更意图,实际执行由向量迁移器完成。
1.2 类声明与继承关系
public class UpdateEmbeddingDimensionOperation extends BaseOperation该类继承自 BaseOperation.java。BaseOperation是所有迁移操作的抽象基类,持有OperationMetadata metadata字段,并提供:
int getSchemaVersion():返回本次操作对应的 schema 版本号;String getDescription():返回元数据中的描述;为空时回退到当前类名(如UpdateEmbeddingDimensionOperation)。
也就是说,每一个维度更新操作都必须绑定一个schemaVersion,迁移框架据此判断集合当前版本与目标版本之间需要执行哪些操作。
二、字段与构造方法:一条"维度更新"操作包含什么
2.1 字段一览
| 字段 | 类型 | 说明 |
|---|---|---|
dataType | String | 目标向量数据类型(记忆类型),用于定位要迁移的集合。 |
fieldName | String | 目标向量字段名,通常是embedding。 |
newDimension | int | 更新后的 embedding 维度。 |
recomputeEmbeddingFunc | Function<Object, Object> | 可选:逐文档重算 embedding 的回调函数。 |
batchSize | int | 批量迁移时使用的批大小。 |
说明:API 文档中的字段表列出的四个字段是操作的核心配置项;源码中还额外持有可选的
recomputeEmbeddingFunc(见 UpdateEmbeddingDimensionOperation.java),用于自定义向量重算逻辑,下文会重点展开。
2.2 两个构造方法
// 简洁构造:不提供 recompute 回调,batchSize 默认 1000 public UpdateEmbeddingDimensionOperation( OperationMetadata metadata, String dataType, String fieldName, int newDimension ) // 完整构造:自定义向量重算回调 + 自定义批大小 public UpdateEmbeddingDimensionOperation( OperationMetadata metadata, String dataType, String fieldName, int newDimension, Function<Object, Object> recomputeEmbeddingFunc, int batchSize )- 第一个构造方法内部委托给完整构造,
recomputeEmbeddingFunc传null、batchSize默认1000; - 第二个构造方法把四个核心配置原样保存,并通过
super(metadata)将元数据交给BaseOperation。
2.3 公开方法
| 签名 | 说明 |
|---|---|
String getDataType() | 返回目标记忆数据类型(如vector_summary)。 |
String getFieldName() | 返回目标向量字段名(如embedding)。 |
int getNewDimension() | 返回新的 embedding 维度。 |
Function<Object, Object> getRecomputeEmbeddingFunc() | 返回重算回调,未提供时为null。 |
int getBatchSize() | 返回批处理大小。 |
需要强调的是,UpdateEmbeddingDimensionOperation是一个纯 DTO(数据传输对象),自身不包含任何执行逻辑——正如BaseOperation源码注释所声明的 "Pure DTO, no execution logic"。它只是把迁移意图描述清楚,真正的执行由迁移器负责。
三、数据流向:从注册到执行的完整调用链
要理解batchSize、dataType等字段如何生效,需要把它放进整个记忆迁移框架中看。
3.1 注册:按实体键维护严格递增的版本链
迁移操作先注册进 OperationRegistry.java,按entityKey(实体键)组织成有序操作链。register(entityKey, operation)会校验同一实体下新操作的schemaVersion必须严格大于当前已注册的最大版本,否则抛出MEMORY_REGISTER_OPERATION_VALIDATION_INVALID异常。getOperations(entityKey, fromVersion, toVersion)返回闭区间[fromVersion, toVersion]内的操作列表,供迁移器按版本区间提取要执行的操作。
3.2 执行:VectorMigrator 按集合版本增量应用
VectorMigrator.java 负责向量集合的迁移,其执行过程:
findCollections(entityKey):对dataType做规范化(去掉vector_前缀)并校验其属于 SupportMemoryType.java 中定义的记忆类型(当前为user_profile、summary),然后按_<类型>后缀匹配集合名(如user1_scope1_summary);- 读取集合元数据中的
schema_version,过滤出schemaVersion > currentVersion的操作; - 调用
vectorStore.updateSchema(collectionName, operationsToApply)应用 schema 变更; - 把最大版本号写回集合元数据
schema_version。
在 ChromaVectorMigratorMissingTest.java 中可以看到多版本连续迁移的验证:v1 加字段、v2 重命名字段、v3 通过UpdateEmbeddingDimensionOperation把embedding维度从 4 升到 6,最终断言schema_version == 3、schema 中embedding字段的dim等于 6、每条文档的 embedding 长度均为 6。
3.3 统一入口:RunMigrations
RunMigrations.java 是迁移的统一执行入口,从MigrationPlan中读取各注册表(SQL、向量、KV、消息、索引五类),按实体键逐个调度对应迁移器;任一实体失败则抛MEMORY_MIGRATE_MEMORY_EXECUTION_ERROR。典型的启动流程是:
// 应用启动阶段执行向量迁移(示例代码示意) RunMigrations.runVectorMigrations(vectorStore).join();四、recomputeEmbeddingFunc 与 batchSize 的底层行为
batchSize与recomputeEmbeddingFunc不会在 DTO 内部生效,而是被底层的向量存储工具消费,理解这一点才能真正用好这两个参数。
4.1 逐文档重算与零向量兜底
VectorStoreUtils.java 中的buildTransformFuncForOperations(...)会把操作列表编译成一个逐文档转换函数,其中对UpdateEmbeddingDimensionOperation的处理逻辑(applyEmbeddingDimensionUpdate,见 VectorStoreUtils.java)是:
- 若
recomputeEmbeddingFunc为null:直接生成newDimension长度的全0.0d零向量(zeroVector); - 若提供了
Function:调用该函数基于原文档计算新向量; - 长度校验:无论哪种方式,生成向量的长度必须等于
newDimension,否则抛出STORE_VECTOR_SCHEMA_INVALID,错误信息形如Generated vector length X does not match new_dim Y。
对应的测试用例在 VectorStoreUtilsTest.java 中覆盖了三种行为:
- 无回调时默认生成
[0.0, 0.0, 0.0]; - 回调返回正确长度时直接采用;
- 回调返回错误长度(如 3 维却返回 2 维)时抛出
BaseError。
4.2 三种典型维度变换模式(来自测试的实战证据)
ChromaVectorMigratorMissingTest.java 给出了三种可直接借鉴的模式:
维度扩大:用concat(oldEmbedding, oldEmbedding)把 4 维扩到 8 维:
new UpdateEmbeddingDimensionOperation( new OperationMetadata(1), "vector_summary", "embedding", 8, doc -> concat(embedding(doc), embedding(doc)), 1000)维度缩减:subList(0, 2)取前 2 维:
new UpdateEmbeddingDimensionOperation( new OperationMetadata(1), "vector_summary", "embedding", 2, doc -> embedding(doc).subList(0, 2), 1000)零填充重建:不传回调,4 维向量原地变成全 0 的 6 维向量:
new UpdateEmbeddingDimensionOperation( new OperationMetadata(1), "vector_summary", "embedding", 6)4.3 batchSize 的约定
从源码看,batchSize默认值为1000,由简洁构造方法固定传入(UpdateEmbeddingDimensionOperation.java)。测试代码中的典型取值是1000或128,例如 UpdateEmbeddingDimensionOperationTest.java 用batchSize = 128验证了取值会被原样保存并读取。当数据量较大时,可结合后端实际吞吐能力适当调小该值,避免单批处理过大造成内存压力。
五、实操示例:注册一条 embedding 维度升级迁移
5.1 基本用法
// 1. 构造元数据:schema 版本 3,附描述 OperationMetadata metadata = new OperationMetadata(3, "update embedding dimension"); // 2. 构造维度更新操作:将 vector_summary 的 embedding 从旧维度升到 768 UpdateEmbeddingDimensionOperation operation = new UpdateEmbeddingDimensionOperation( metadata, "vector_summary", "embedding", 768 ); // 3. 注册到向量注册表(entityKey 通常与 dataType 保持一致) MigrationPlan.getVectorRegistry().register("vector_summary", operation); // 4. 启动迁移 RunMigrations.runVectorMigrations(vectorStore).join();5.2 带重算回调的完整用法
UpdateEmbeddingDimensionOperation operation = new UpdateEmbeddingDimensionOperation( new OperationMetadata(3, "rebuild embedding with new model"), "vector_summary", "embedding", 768, doc -> callNewEmbeddingModel(doc), // 用新模型逐文档重算向量 128 // 自定义批大小 ); MigrationPlan.getVectorRegistry().register("vector_summary", operation);5.3 单元测试验证
UpdateEmbeddingDimensionOperationTest.java 是最直接的验证参考,覆盖了两类关键行为:
- 完整构造:所有字段原样保存,
getRecomputeEmbeddingFunc()返回同一函数实例(assertSame),getBatchSize()返回传入值; - 简洁构造:
getRecomputeEmbeddingFunc()为null,getBatchSize()默认1000。
六、注意事项与约束
- 版本必须严格递增:同一实体下注册操作的
schemaVersion必须大于当前最大值,否则注册阶段直接报错(见 OperationRegistry.java)。 - dataType 必须合法:
VectorMigrator会校验dataType(支持带vector_前缀),不在SupportMemoryType枚举(user_profile、summary)内会抛MEMORY_MIGRATE_MEMORY_EXECUTION_ERROR。 - 目标字段必须是向量字段:schema 层校验要求
fieldName指向FloatVector类型字段,字段不存在或不是向量字段都会抛STORE_VECTOR_SCHEMA_INVALID(见 VectorStoreUtils.java)。 - 重算结果长度必须精确匹配:回调产出的向量长度不等于
newDimension会直接失败,务必在回调内保证长度一致;不传回调则自动零填充。 - 失败场景有回滚保障:测试用例验证了迁移过程中 recompute 抛异常时,schema、集合元数据版本与文档数据均保持原样,不会留下
_migration_残留集合(见 ChromaVectorMigratorMissingTest.java)。 - 操作是纯声明式 DTO:它本身不执行任何逻辑,必须配合
VectorMigrator/RunMigrations使用;超出迁移器支持范围的操作类型会在运行期报错。
七、小结
UpdateEmbeddingDimensionOperation用一组简洁字段(dataType、fieldName、newDimension、batchSize及可选recomputeEmbeddingFunc)把"记忆库 embedding 维度升级"这一高频迁移诉求声明化,配合OperationRegistry的版本管理、VectorMigrator的增量应用与VectorStoreUtils的逐文档变换,形成了一条完整、可回滚、可验证的迁移链路。无论是切换 embedding 模型、压缩向量成本还是零填充重建,都可以用它快速落地,并借助仓库中 UpdateEmbeddingDimensionOperationTest.java、ChromaVectorMigratorMissingTest.java 与 VectorStoreUtilsTest.java 完成行为验证。
- 人工智能
- AI Agent
- Agent 框架
- 工具调用
- Agent 工作流
- RAG
- MCP Clients
- 强化学习
【免费下载链接】agent-core-java
openJiuwen agent core Java是 openJiuwen Core的 Java版本,提供AI Agent开发、运行、调优与演进相关的全套SDK能力。
相关推荐
RenameColumnOperation 深度解析:openJiuwen agent-core-java 记忆库 SQL 列重命名迁移实战
RenameColumnOperation 深度解析:openJiuwen agent core java 记忆库 SQL 列重命名迁移实战 本文围绕 open
人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习openJiuwen 记忆引擎 SQL 迁移:AddColumnOperation 新增列操作实战指南
openJiuwen 记忆引擎 SQL 迁移:AddColumnOperation 新增列操作实战指南 AddColumnOperation 是 openJiu
人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习openJiuwen 记忆存储迁移框架深度解析:从 MigrationPlan 注册到 RunMigrations 执行
openJiuwen 记忆存储迁移框架深度解析:从 MigrationPlan 注册到 RunMigrations 执行 导读 openJiuwen(openJ
人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考