openJiuwen agent-core-java InMemoryVectorStore 使用指南:内存向量存储适配器详解 人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载导读InMemoryVectorStore是 openJiuwen agent-core-java 中 foundation 层提供的内存向量存储适配器它让开发者无需部署任何外部服务即可在进程内完成向量数据的写入、搜索与删除同时复用统一的BaseVectorStore标准 API。本文将从构造方式、默认选项、父类适配器能力、底层检索实现到测试用例系统讲解该组件的工作原理与实战用法帮助你在原型验证、单元测试和小规模知识检索场景中快速落地。一、类定位与继承关系InMemoryVectorStore位于com.openjiuwen.core.foundation.store.vector包是 foundation 层对外暴露的内存向量存储实现。它的完整继承结构如下public class InMemoryVectorStore extends AbstractRetrievalVectorStoreAdapter类文件InMemoryVectorStore.java父类适配器AbstractRetrievalVectorStoreAdapter.java从继承关系可以看出InMemoryVectorStore本身是一个薄壳它只负责把构造参数解析为统一的VectorStoreConfig并委托给底层真正存储引擎com.openjiuwen.core.retrieval.vector_store.InMemoryVectorStore而标准 collection 生命周期、写入、搜索和删除能力全部由父类适配器AbstractRetrievalVectorStoreAdapter统一提供。这种适配器 委托的分层设计使内存存储与 Chroma、Milvus、PGVector 等存储共享同一套 foundation 层 API业务代码无需感知后端差异。二、构造方式与选项详解2.1 两种构造方法签名说明public InMemoryVectorStore()使用默认选项构造内存向量存储public InMemoryVectorStore(MapString, Object options)使用自定义选项构造内存向量存储无参构造等价于this(Map.of())即传入空配置。带参构造将 options 解析后委托给底层存储public InMemoryVectorStore(MapString, Object options) { super(new com.openjiuwen.core.retrieval.vector_store.InMemoryVectorStore(config(chroma, options), indexType(options))); }2.2 默认选项按照 API 文档与源码见 InMemoryVectorStore.java默认选项如下选项默认值含义database_namedefault逻辑数据库名用于隔离不同数据空间collection_namedefault_collection集合名对应一组向量数据distance_metriccosine向量相似度度量方式index_typehybrid索引类型可选vector/sparse/hybrid2.3 选项键名支持 snake_case 与 camelCase 双写法源码中的stringOption方法对每个配置项都同时接受下划线风格与驼峰风格的键名InMemoryVectorStore.javasnake_casecamelCase默认值database_namedatabaseNamedefaultcollection_namecollectionNamedefault_collectiondistance_metricdistanceMetriccosineindex_typeindexTypehybrid键值解析遵循优先 snake_case、其次 camelCase、最后回退默认值的规则options 为null时同样安全回退到默认值。2.4 参数校验约束底层配置类 VectorStoreConfig.java 对参数做了严格校验database_name必须匹配正则^[A-Za-z0-9_]*$否则抛出IllegalArgumentException(database_name must match ^[A-Za-z0-9_]*$)collection_name为必填项不能为nulldistance_metric仅允许cosine、euclidean、dot三者之一其余值直接抛异常index_type在底层存储初始化时校验仅允许vector、sparse、hybrid否则抛出IllegalArgumentException(indexType must be one of vector, sparse, hybrid)见 retrieval/vector_store/InMemoryVectorStore.java。三、创建内存向量存储的三种方式3.1 通过工厂 SPI 创建推荐InMemoryVectorStoreProvider以 SPI 方式注册了类型名in_memory见 InMemoryVectorStoreProvider.java通过 VectorStoreFactory.java 即可统一创建import com.openjiuwen.spi.store.vector.BaseVectorStore; import com.openjiuwen.spi.store.vector.VectorStoreFactory; // 默认配置 BaseVectorStore store VectorStoreFactory.create(in_memory); // 自定义配置同时支持别名 memory BaseVectorStore store2 VectorStoreFactory.create(in_memory, Map.of( database_name, demo_db, collection_name, news_collection, distance_metric, cosine, index_type, hybrid ));要点工厂通过ServiceLoader自动发现内置 provider无需手动注册in_memory的短别名memory会被自动注册hasProvider判断不区分大小写IN_MEMORY、In_Memory均可识别多次create(in_memory, ...)返回互不相同的实例create对storeType null抛IllegalArgumentException对未注册类型抛UnsupportedOperationException。3.2 直接构造 foundation 层类import com.openjiuwen.core.foundation.store.vector.InMemoryVectorStore; // 默认选项 InMemoryVectorStore store new InMemoryVectorStore(); // 自定义选项camelCase 写法 InMemoryVectorStore store2 new InMemoryVectorStore(Map.of( databaseName, kb, collectionName, docs, distanceMetric, euclidean, indexType, vector ));3.3 通过VectorStoreFactory.register扩展如果希望把内存存储注册为自定义类型名可以直接向工厂注册 Provider参考 VectorStoreFactorySpiTest.java 的用法VectorStoreFactory.register(mock_weaviate, new VectorStoreProvider() { Override public String typeName() { return mock_weaviate; } Override public BaseVectorStore create(MapString, Object conf) { return new InMemoryVectorStore(Map.of()); } }); BaseVectorStore store VectorStoreFactory.create(mock_weaviate, Map.of());四、父类适配器统一提供的完整能力AbstractRetrievalVectorStoreAdapter将底层VectorStore接口暴露为 foundation 层的BaseVectorStoreAPI涵盖 collection 生命周期、写入、搜索、删除与 schema 管理见 AbstractRetrievalVectorStoreAdapter.java4.1 Collection 生命周期管理方法说明createCollection(String collectionName, Object schema, MapString, Object kwargs)创建集合并缓存 schemadeleteCollection(String collectionName, kwargs)删除集合底层删除表 清除缓存 schemacollectionExists(String collectionName, kwargs)判断集合是否存在底层表存在或本地缓存命中listCollectionNames()列出全部集合名getSchema(String collectionName, kwargs)获取集合 schema优先读后端失败时回退缓存或默认 schemacreateCollection的 schema 参数支持三种形态直接传入CollectionSchema、传入Map自动转换为CollectionSchema、或null自动套用默认 schema。4.2 默认 Schema 定义当未显式提供 schema 时适配器使用如下默认结构AbstractRetrievalVectorStoreAdapter.java字段类型约束idVARCHAR主键isPrimarytruemaxLength256embeddingFLOAT_VECTOR维度 1536textVARCHARmaxLength65535metadataJSON任意元数据注意默认 embedding 维度为 1536如果你的向量维度不同例如 768 或 1024建议显式创建 collection 并传入自定义 schema避免维度不匹配。4.3 数据写入、搜索与删除// 写入addDocs 支持通过 kwargs 的 batch_size 控制批量大小 store.addDocs(news_collection, List.of( Map.of(id, doc-1, text, openJiuwen 内存向量存储, embedding, List.of(0.1f, 0.2f, ...), metadata, Map.of(category, tech)), Map.of(id, doc-2, text, 向量检索入门, embedding, List.of(...), metadata, Map.of(category, tech)) ), Map.of(batch_size, 128)); // 搜索返回 ListVectorSearchResult包含 score 与 fields ListVectorSearchResult results store.search( news_collection, List.of(0.1f, 0.2f, ...), // 查询向量 embedding, // 向量字段名 10, // topK Map.of(category, tech), // 过滤条件可为 null Map.of() // 扩展参数 ); // 按 ID 删除 store.deleteDocsByIds(news_collection, List.of(doc-1), Map.of()); // 按过滤条件删除 store.deleteDocsByFilters(news_collection, Map.of(category, tech), Map.of());实现细节见适配器 search 方法搜索时若指定vectorField且非空会被写入扩展参数vector_field查询向量会从Float转为Double后调用底层search过滤条件经VectorStoreFilter.ofMap(filters)转换无过滤时使用VectorStoreFilter.none()返回结果统一映射为VectorSearchResultid、text、metadata展开到fieldsscore单独承载。4.4 Schema 变更与集合元数据适配器还透传了两类高级能力updateSchema(collectionName, operations)支持AddScalarFieldOperation、RenameScalarFieldOperation、UpdateScalarFieldTypeOperation、UpdateEmbeddingDimensionOperation等操作同时更新后端记录与本地缓存 schemaupdateCollectionMetadata/getCollectionMetadata维护集合级元数据后端更新失败时仅记录 WARN 日志通过Loggers.STORE不影响本地缓存一致性。五、底层检索实现原理真正的数据与检索逻辑位于 retrieval/vector_store/InMemoryVectorStore.java该实现镜像了 Python 端chroma_store.py的内存回退行为。5.1 存储结构数据以静态ConcurrentHashMapString, Backend按databaseName分组DATABASES进程内所有实例共享该静态区每个Backend内含collections集合名 → 记录 Map与collectionMetadata两张ConcurrentHashMap记录StoredRecord保存id、text、vector、metadata与原始fields写入时 ID 的取值优先级为idchunk_idmetadata.chunk_id 随机 UUID文本字段优先级为textcontent向量字段优先级为vectorembeddingaddSync 方法。5.2 三种索引类型与距离度量index_type决定可用的检索能力index_type支持的检索说明vectorsearch稠密向量检索仅基于向量相似度sparsesparseSearch稀疏文本检索基于 BM25 词法匹配hybridsearchsparseSearchhybridSearch向量与稀疏得分加权融合distance_metric决定稠密相似度的计算方式对应vectorScore的 switch 分支L520-L534distance_metric计算公式cosine余弦相似度dot / (|a|·|b|)模长趋零时返回 0euclidean欧氏距离的负值距离越小得分越高dot内积hybrid 检索的融合公式为alpha * vectorScore (1 - alpha) * sparseScore其中向量得分会被归一化到统一量纲euclidean 映射为1 / (1 距离)其他度量映射为(score 1) / 2见 normalizedVectorScore。5.3 稀疏检索的 BM25 实现稀疏检索在进程内实现了完整 BM25 算法sparseScore常数BM25_K1 1.5、BM25_B 0.75与标准 BM25 默认参数一致分词使用正则[^\p{IsAlphabetic}\p{IsDigit}_]切分并统一转小写IDF 采用平滑形式ln(1 (N - df 0.5) / (df 0.5))词频与文档长度归一化结合K1、B参数计算最终按得分降序返回 topK。5.4 过滤与删除检索前会先按过滤条件筛选记录过滤值为Collection时使用包含判断否则做等值比较matches 方法删除支持按 ID 列表删除或按过滤表达式删除过滤表达式为ComparisonExpr且操作符为时可转换为等值过滤deleteFilterMapbatch_size默认值为 128kwargs 中显式传入大于 0 的数值时优先使用。六、测试用例与适用场景6.1 测试验证仓库中对内存向量存储的覆盖体现在两类测试SPI 工厂测试VectorStoreFactorySpiTest.java 验证了in_memoryprovider 可被 ServiceLoader 自动发现、memory别名生效、大小写不敏感、多次create返回不同实例以及create(null)/ 未知类型 / 空字符串等异常路径。检索器测试VectorRetrieverTest、SparseRetrieverTest、HybridRetrieverTest、GraphRetrieverTest位于 retrieval/src/test/java/com/openjiuwen/retrieval/retriever均引入InMemoryVectorStore作为测试后端印证了它承担着检索模块默认测试存储的角色。6.2 适用场景与限制从 InMemoryVectorStoreProvider.java 的注释可以确认其定位将向量与元数据保存在本地内存中适用于测试和小规模场景不需要持久化与分布式访问。使用注意事项无持久化进程退出后数据全部丢失不适合生产级数据资产进程内共享同一 JVM 内相同database_name的实例共享底层存储区跨实例可见单机容量受限全量数据驻留内存集合规模受堆内存约束默认维度 1536使用默认 schema 时请确保 embedding 维度为 1536适合的落地位置单元测试、原型验证、本地开发调试以及作为 RAG 检索链路VectorRetriever/HybridRetriever/SparseRetriever的零依赖启动后端。七、小结InMemoryVectorStore以最小的部署成本零外部依赖提供了完整的向量存储标准能力默认database_namedefault、collection_namedefault_collection、distance_metriccosine、index_typehybrid的四项默认值开箱即用通过VectorStoreFactory.create(in_memory, options)或new InMemoryVectorStore(options)两种方式即可创建collection 生命周期、写入、搜索、删除与 schema 管理由AbstractRetrievalVectorStoreAdapter统一供给底层则是一套支持 cosine/euclidean/dot 距离度量、BM25 稀疏检索与 alpha 融合混合检索的进程内实现。无论你是想快速跑通一条 RAG 链路还是为检索算法编写测试它都是 openJiuwen agent-core-java 中最便捷的起点。赞分享人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载相关推荐openJiuwen Agent Core Java 向量存储工厂 StoreFactory 全解析内建向量存储适配器的创建、配置与 SPI 扩展openJiuwen Agent Core Java 向量存储工厂 StoreFactory 全解析内建向量存储适配器的创建、配置与 SPI 扩展 本文以 c人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习openJiuwen agent-core-java 图存储字段容量配置详解GraphStoreStorageConfig 使用指南openJiuwen agent core java 图存储字段容量配置详解GraphStoreStorageConfig 使用指南 GraphStoreSt人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习ElasticsearchVectorStore 实战指南openJiuwen agent-core 基于 Elasticsearch 的向量存储使用详解ElasticsearchVectorStore 实战指南openJiuwen agent core 基于 Elasticsearch 的向量存储使用详解 o人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习上一篇Apache Beam TextIO 本地文本文件读写实战从 Read/Write 到源码级解析下一篇OptiScaler终极指南让所有显卡都能畅享AI超分辨率的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考