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),仅供参考

相关新闻

Kotlin+Compose实战:趣味校园Android应用从零到可运行

Kotlin+Compose实战:趣味校园Android应用从零到可运行

简介:这是一份面向Android初学者与校园社交应用开发者的Java实战项目源码,以贴近校园生活的移动社交应用为主题,围绕信息分享与即时聊天展开,适合作为课程设计、毕业设计或自学练手的参考案例。资源包共629个文件,包含…

2026/10/13 12:33:36 阅读更多 →
ShardingSphere分库分表实战:从数据膨胀事故到核心原理与踩坑复盘

ShardingSphere分库分表实战:从数据膨胀事故到核心原理与踩坑复盘

1. 从一次数据膨胀事故说起:为什么我要啃ShardingSphere去年下半年,我负责维护的一套业务系统出了一次不大不小的事故。单表数据量在三个月内从两千万飙到一亿两千万,慢查询告警一天响几十次,最夸张的一条统计SQL跑了四十多秒&…

2026/10/13 12:33:36 阅读更多 →
订单状态机实战:通用表驱动状态流转引擎的设计与落地

订单状态机实战:通用表驱动状态流转引擎的设计与落地

先把状态机这事的来龙去脉讲清楚。 干电商后台这几年,订单状态这堆逻辑是我见过最容易写成一坨翔的地方。一个订单从待支付到已支付,再到已发货、已完成,听起来就是一条直线,可真到了代码里,你会看到支付回调里判断状…

2026/10/13 12:33:36 阅读更多 →

最新新闻

React Native鸿蒙适配实战:RN页面与鸿蒙提醒服务的系统能力桥接

React Native鸿蒙适配实战:RN页面与鸿蒙提醒服务的系统能力桥接

做鸿蒙适配做到第七个页面,CareTipsScreen算是我这轮项目里最头疼、也最有收获的一个。先说清楚它是什么:这是一款健康管理应用里的“每日护理建议”聚合页,用户每天打开应用,能看到系统按时间段推荐的护理建议,比如下…

2026/10/13 13:15:36 阅读更多 →
驱动工具收费怎么办?显卡驱动修复免费替代方案与卸载清理指南

驱动工具收费怎么办?显卡驱动修复免费替代方案与卸载清理指南

前两年我装完系统,第一件事就是找一款驱动管理工具,跑一遍自动检测,网卡、显卡、声卡一次性装齐,整个过程免费,体验也算顺畅。直到前两天,我打开这款老牌驱动工具的新版本,界面确实变干净了&…

2026/10/13 13:15:36 阅读更多 →
DeepSeek Harness:Agent框架的全插件化设计与可回放日志实践

DeepSeek Harness:Agent框架的全插件化设计与可回放日志实践

这两年做 Agent 工程化,我最大的感受是:光有一个能跑通 demo 的工作流远远不够,真正让人头疼的是框架耦合、排查困难、扩展两难。团队内部折腾了大半年,最终沉淀出一套叫 DeepSeek Harness 的 Agent 运行框架。名字里带 Harness&a…

2026/10/13 13:15:36 阅读更多 →
构建帧率无关的时钟可视化内核:requestAnimationFrame与时间流映射

构建帧率无关的时钟可视化内核:requestAnimationFrame与时间流映射

1. 项目概述:这不是一个普通时钟,而是一次视觉逻辑的重新校准“炫酷的时钟效果”——这五个字在前端开发、数字艺术、交互设计甚至新媒体运营的日常沟通中,出现频率远超表面看起来的那么简单。它从来不是指“把时间显示出来”,而是…

2026/10/13 13:15:36 阅读更多 →
免费搭建本地AI知识库:用Cherry Studio和开源模型实现私有文档智能检索

免费搭建本地AI知识库:用Cherry Studio和开源模型实现私有文档智能检索

最近整理资料时我一直在想一个问题:手头文档越堆越多,光是项目方案、会议纪要、行业报告、个人笔记就占了几个文件夹,想快速找出某个结论时经常得翻半天。后来我尝试把常用的云上AI助手当检索工具,但每次都要上传文档、担心隐私、…

2026/10/13 13:15:36 阅读更多 →
个人主页置顶帖与投稿汇总实操指南:打造内容导航体系

个人主页置顶帖与投稿汇总实操指南:打造内容导航体系

1. 先搞清楚:置顶帖和投稿汇总到底在解决什么问题1.1 置顶帖是主页的第一屏,也是你的数字名片我见过太多创作者陷入同一个困境:内容发了几百条,主页却像一个乱糟糟的仓库,新访客点进来根本不知道你擅长什么、写过哪些代…

2026/10/13 13:14:25 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →