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-M6
chromadb # 0.5.23,要和springai匹配,所以不能选高版本
有两种方案:
1、python安装的也能用 # 这里用的这种
安装: pip install chromadb==0.5.23# 版本要和springai版本兼容启动: chroma run--host0.0.0.0--port8000验证: http://localhost:8000/docs# 这个地址可以看到chromadb的接口即可2、docker安装windows本地版
略
使用
maven依赖
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-chroma-store-spring-boot-starter</artifactId><version>1.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,Map<String,Object>metadata){super(id,content,metadata);}/** * 将 Spring AI 的 Document 转为我们的业务实体 */publicstaticKnowledgeDocumentfrom(Documentdoc){// 直接使用包含 ID 的构造方法,避免调用不存在的 setId 方法returnnewKnowledgeDocument(doc.getId(),doc.getText(),doc.getMetadata());}}KnowledgeService接口类
publicinterfaceKnowledgeService{/** * 上传并解析文档入库 */voiduploadAndIndex(MultipartFilefile)throwsException;/** * 根据内容检索相关文档 */List<KnowledgeDocument>search(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;@Service@RequiredArgsConstructorpublicclassKnowledgeServiceImplimplementsKnowledgeService{privatefinalVectorStorevectorStore;privatefinalTokenTextSplittertokenTextSplitter=newTokenTextSplitter();@OverridepublicvoiduploadAndIndex(MultipartFilefile)throwsException{// 1. 读取文件内容Stringcontent=newString(file.getBytes(),StandardCharsets.UTF_8);// 2. 创建原始 DocumentDocumentrawDoc=newKnowledgeDocument(content,file.getOriginalFilename());// 3. 文本分块 (Chunking)List<Document>chunks=tokenTextSplitter.apply(List.of(rawDoc));// 4. 存入 ChromaDBvectorStore.add(chunks);}@OverridepublicList<KnowledgeDocument>search(Stringquery,inttopK){SearchRequestrequest=SearchRequest.builder().query(query).topK(topK).similarityThreshold(0.7).build();List<Document>results=vectorStore.similaritySearch(request);// 将底层 Document 转换回我们的业务实体returnresults.stream().map(KnowledgeDocument::from).collect(Collectors.toList());}}controller
importcom.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="知识库文档上传";JsonResultresult=JsonResult.ok();try{log.info(methodName+"_操作开始, fileName={}",file.getOriginalFilename());// 参数校验if(file.isEmpty()){thrownewIllegalArgumentException("上传的文件不能为空");}knowledgeService.uploadAndIndex(file);result=JsonResult.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(value="topK",defaultValue="3")IntegertopK){StringmethodName="知识库内容检索";JsonResultresult=JsonResult.ok();try{log.info(methodName+"_查询操作开始, query={}, topK={}",query,topK);// 参数校验if(StringUtils.isEmpty(query)){thrownewIllegalArgumentException("检索关键词不能为空");}List<KnowledgeDocument>documents=knowledgeService.search(query,topK);result=JsonResult.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 apis
chromadb和springai的版本问题。
一开始chromadb用的是1.5.9,和springai不匹配,改为0.5.23版本,是兼容v1版本的,问题解决。
