springai使用chroma向量数据库

发布时间:2026/9/25 17:00:43

springai使用chroma向量数据库 文章目录使用maven依赖创建实体类KnowledgeService接口类KnowledgeServiceImpl接口实现类controller报错报错 Error creating bean with name vectorStore defined in class path resource [org/springframework/ai/autoconfigure/vectorstore/chroma/ChromaVectorStoreAutoConfiguration.class]: The v1 API is deprecated. Please use /v2 apis开发环境用chromadb。版本springai # 1.0.0-M6chromadb # 0.5.23要和springai匹配所以不能选高版本有两种方案1、python安装的也能用 # 这里用的这种安装 pip install chromadb0.5.23# 版本要和springai版本兼容启动 chroma run--host0.0.0.0--port8000验证 http://localhost:8000/docs# 这个地址可以看到chromadb的接口即可2、docker安装windows本地版略使用maven依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-chroma-store-spring-boot-starter/artifactIdversion1.0.0-M6/version/dependency创建实体类springai的Document已经支持chromadb直接继承就行。importorg.springframework.ai.document.Document;importjava.util.Map;publicclassKnowledgeDocumentextendsDocument{/** * 业务创建时的构造方法自动生成 ID */publicKnowledgeDocument(Stringcontent,StringsourceFile){super(content);this.getMetadata().put(source,sourceFile);this.getMetadata().put(created_at,System.currentTimeMillis());}/** * 内部全参构造方法支持传入指定的 ID用于从数据库/向量库还原对象 */privateKnowledgeDocument(Stringid,Stringcontent,MapString,Objectmetadata){super(id,content,metadata);}/** * 将 Spring AI 的 Document 转为我们的业务实体 */publicstaticKnowledgeDocumentfrom(Documentdoc){// 直接使用包含 ID 的构造方法避免调用不存在的 setId 方法returnnewKnowledgeDocument(doc.getId(),doc.getText(),doc.getMetadata());}}KnowledgeService接口类publicinterfaceKnowledgeService{/** * 上传并解析文档入库 */voiduploadAndIndex(MultipartFilefile)throwsException;/** * 根据内容检索相关文档 */ListKnowledgeDocumentsearch(Stringquery,inttopK);}KnowledgeServiceImpl接口实现类importcom.example.demo.entity.KnowledgeDocument;importcom.example.demo.service.KnowledgeService;importlombok.RequiredArgsConstructor;importorg.springframework.ai.document.Document;importorg.springframework.ai.transformer.splitter.TokenTextSplitter;importorg.springframework.ai.vectorstore.SearchRequest;importorg.springframework.ai.vectorstore.VectorStore;importorg.springframework.stereotype.Service;importorg.springframework.web.multipart.MultipartFile;importjava.nio.charset.StandardCharsets;importjava.util.List;importjava.util.stream.Collectors;ServiceRequiredArgsConstructorpublicclassKnowledgeServiceImplimplementsKnowledgeService{privatefinalVectorStorevectorStore;privatefinalTokenTextSplittertokenTextSplitternewTokenTextSplitter();OverridepublicvoiduploadAndIndex(MultipartFilefile)throwsException{// 1. 读取文件内容StringcontentnewString(file.getBytes(),StandardCharsets.UTF_8);// 2. 创建原始 DocumentDocumentrawDocnewKnowledgeDocument(content,file.getOriginalFilename());// 3. 文本分块 (Chunking)ListDocumentchunkstokenTextSplitter.apply(List.of(rawDoc));// 4. 存入 ChromaDBvectorStore.add(chunks);}OverridepublicListKnowledgeDocumentsearch(Stringquery,inttopK){SearchRequestrequestSearchRequest.builder().query(query).topK(topK).similarityThreshold(0.7).build();ListDocumentresultsvectorStore.similaritySearch(request);// 将底层 Document 转换回我们的业务实体returnresults.stream().map(KnowledgeDocument::from).collect(Collectors.toList());}}controllerimportcom.example.demo.entity.JsonResult;importcom.example.demo.entity.KnowledgeDocument;importcom.example.demo.service.KnowledgeService;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.lang3.StringUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importjava.util.List;/* * 知识库管理表 */RestController()RequestMapping(/api)Slf4jpublicclassKnowledgeController{AutowiredprivateKnowledgeServiceknowledgeService;/** * 上传并解析文档入库 */PostMapping(/knowledge/upload)publicJsonResultupload(RequestParam(file)MultipartFilefile){StringmethodName知识库文档上传;JsonResultresultJsonResult.ok();try{log.info(methodName_操作开始, fileName{},file.getOriginalFilename());// 参数校验if(file.isEmpty()){thrownewIllegalArgumentException(上传的文件不能为空);}knowledgeService.uploadAndIndex(file);resultJsonResult.ok(文档上传并解析成功);log.info(methodName_操作完成, fileName{},file.getOriginalFilename());returnresult;}catch(IllegalArgumentExceptione){log.error(methodName_操作失败, error,e);returnJsonResult.fail(-1,操作失败,e.getMessage());}catch(Exceptione){log.error(methodName_操作异常, error,e);returnJsonResult.fail(-1,操作异常,请联系系统管理员);}}/** * 根据内容检索相关文档 */GetMapping(/knowledge/search)publicJsonResultsearch(RequestParam(query)Stringquery,RequestParam(valuetopK,defaultValue3)IntegertopK){StringmethodName知识库内容检索;JsonResultresultJsonResult.ok();try{log.info(methodName_查询操作开始, query{}, topK{},query,topK);// 参数校验if(StringUtils.isEmpty(query)){thrownewIllegalArgumentException(检索关键词不能为空);}ListKnowledgeDocumentdocumentsknowledgeService.search(query,topK);resultJsonResult.ok(documents);log.info(methodName_操作完成, 检索到 {} 条结果,documents.size());returnresult;}catch(IllegalArgumentExceptione){log.error(methodName_操作失败, error,e);returnJsonResult.fail(-1,操作失败,e.getMessage());}catch(Exceptione){log.error(methodName_操作异常, error,e);returnJsonResult.fail(-1,操作异常,请联系系统管理员);}}}报错报错 Error creating bean with name ‘vectorStore’ defined in class path resource [org/springframework/ai/autoconfigure/vectorstore/chroma/ChromaVectorStoreAutoConfiguration.class]: The v1 API is deprecated. Please use /v2 apischromadb和springai的版本问题。一开始chromadb用的是1.5.9和springai不匹配改为0.5.23版本是兼容v1版本的问题解决。
延伸阅读

更多相关文章

2026/9/25 11:57:18

生产级多维聚合:pandas groupby的五大工程化陷阱与实战

1. 项目概述:为什么多维聚合不是“加个groupby”就完事了?我在银行数据平台组干了八年,从最早用SQL写几十行嵌套子查询做客户分层,到现在每天在Jupyter里调试pandas的agg链式调用,最深的体会是:真正的业务分…

2026/9/25 19:31:27

2026最新英语教学APP挑选指南 3个实用方法帮你避开选购误区

说实话我当初19年帮合作校选第一批英语数字化教学工具的时候踩过巨坑,当时贪功能全,选了个号称覆盖全学科的平台,结果英语口语批改不准,学生读错的重音识别不出来,后台学情数据还导不出来,老师改作业反而要…

2026/9/25 0:59:25

vCenter SSO密码忘记完整重置教程:网页+命令行兜底实操

运维工作中经常遗忘vCenter SSO管理员密码(administratorvsphere.local),导致无法登录vSphere Web Client管理虚拟化集群,影响日常运维、备份、集群配置等操作。很多人遇到网页解析报错、找不到重置入口的问题,本文基于…

2026/9/26 8:29:52

FDE能力模型:从入门到独当一面的八个维度

上个月陪一个朋友做上线支持,凌晨的客户机房里,一排系统日志刷着报错,远程那头是研发团队隔着内网边界指挥。站在旁边的我又一次确认:FDE(解决方案工程师/解决方案部署工程师)这个角色,从来不是…

2026/9/26 8:29:52

ChatGPT订阅接入本地开发工具链:无限token方案原理与实操

1. 从“无限 token”这个说法说起“ChatGPT 开启无限 token”这个标题,第一次看到的时候我愣了一下。因为从技术底层讲,任何基于 Transformer 架构的大模型,上下文窗口都是有硬上限的,不存在真正意义上的“无限”。但如果你最近在…

2026/9/26 8:29:52

Agent记忆体系实战:从上下文缓存到长期记忆与用户画像构建

最近在做Agent项目的时候,我发现自己大部分精力不是花在规划、工具调用这些看起来更"智能"的模块上,反而被一个特别基础的问题反复折磨:Agent记不住之前说过什么。用户前一句刚说完"我喜欢简洁的回答风格",下…

2026/9/26 8:29:52

Agent记忆系统实战:从上下文管理到落地设计

有人说 Agent 最难的不是让它“会做事”,而是让它“记得事”。我自己在本地搭过好几个智能体项目,最崩溃的体验就是:明明上一轮刚告诉它我的服务器是 2C4G 的配置,让它写部署脚本时别开大内存应用,结果下一轮它又给我生…

2026/9/26 8:24:52

Qwen-Image-2.1本地部署指南:ComfyUI整合包实战与GGUF量化优化

1. 项目概述:这不是“装个软件”,而是重建本地AI图像生成的控制权 Qwen-Image-2.1不是一张静态图片,它是一套具备多模态理解与高保真图像生成能力的开源模型体系。当标题里出现“本地无限制版本”和“ComfyUI整合包”这两个词时,…

2026/9/25 21:00:17

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/25 20:59:52

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/26 0:04:28

画质修复APP怎么选?Wink影像修复能力与产品实力解析

现如今手机拍摄场景愈发丰富,演唱会直拍、漫展记录、老视频翻新、日常vlog录制,都会遇到画面模糊、噪点多、曝光失衡等问题,不少用户在挑选工具时比较在意一款画质修复APP能够兼顾修复效果与自然质感。Wink作为美图公司推出的全球化AI影像增强…

2026/9/26 0:04:28

超低能耗建筑K值要求能否满足?浙东铝业建筑型材解析

核心摘要浙东铝业的超低能耗系统门窗产品,资料显示保温性能可达 K≤1.4W/(㎡K),能够对应上海地区超低能耗住宅对门窗保温性能的应用需求。判断建筑是否满足超低能耗要求,不能只看铝型材本身,还需要结合玻璃、隔热条、密封系统、开…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/25 18:41:36

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/25 18:34:56

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑