背景:技术框架转型,将Langchain4j实现的功能转为Spring AI实现,方便升级、维护框架:Ruoyi-Vue-Plus版本:5.3.1Spring-boot版本:3.4.4JDK:17spring-ai版本:1.0.0
需安装Ollama,且具备模型"nomic-embed-text"
ai_knowledge,ai_knowledge_document,ai_knowledge_segment,ai_model,ai_api_key 需要具备Docker环境,此次采用Docker Desktop搭建milvus服务Docker Desktop怎么安装,此篇博客不演示,如遇到问题,可以加技术群咨询 version:'3.5'services:etcd:container_name:milvus-etcdimage:quay.io/coreos/etcd:v3.5.18environment:-ETCD_AUTO_COMPACTION_MODE=revision-ETCD_AUTO_COMPACTION_RETENTION=1000-ETCD_QUOTA_BACKEND_BYTES=4294967296-ETCD_SNAPSHOT_COUNT=50000volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcdcommand:etcd-advertise-client-urls=http://etcd:2379-listen-client-urlshttp://0.0.0.0:2379--data-dir/etcdhealthcheck:test:["CMD","etcdctl","endpoint","health"]interval:30stimeout:20sretries:3minio:container_name:milvus-minioimage:minio/minio:RELEASE.2025-04-22T22-12-26Zenvironment:MINIO_ACCESS_KEY:minioadminMINIO_SECRET_KEY:minioadminports:-"9000:9000"-"9001:9001"volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_datacommand:minioserver/minio_data--console-address":9001"healthcheck:test:["CMD","curl","-f","http://localhost:9000/minio/health/live"]interval:30stimeout:20sretries:3standalone:container_name:milvus-standaloneimage:milvusdb/milvus:v2.5.13command:["milvus","run","standalone"]security_opt:-seccomp:unconfinedenvironment:ETCD_ENDPOINTS:etcd:2379MINIO_ADDRESS:minio:9000volumes:-${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvushealthcheck:test:["CMD","curl","-f","http://localhost:9091/healthz"]interval:30sstart_period:90stimeout:20sretries:3ports:-"19530:19530"-"9091:9091"depends_on:-"etcd"-"minio"attu:container_name:attuimage:zilliz/attu:v2.5.7environment:MILVUS_URL:milvus-standalone:19530ports:-"19500:3000"depends_on:-"standalone"networks:default:name:milvusLinux/Windows如果具备Docker环境,在某一个目录下新建文件docker-compose.yml,执行以下命令即可如果执行"docker ps"显示为空,则按照以下步骤执行dockerrestartetcd容器iddockerrestartminio容器iddockerrestartmilvus容器iddockerrestartattu容器id eg:其中attu是一个可视化访问milvus的界面#浏览器访问miniolocalhost:9000 #浏览器访问milvuslocalhost:19500 <tika.version>3.0.0</tika.version><spring-ai.version>1.0.0</spring-ai.version><commons-io.version>2.16.1</commons-io.version> <!--Tika提取文件必须--><dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>${tika.version}</version><exclusions><exclusion><artifactId>commons-io</artifactId><groupId>commons-io</groupId></exclusion></exclusions></dependency><!--解析文档必须--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-tika-document-reader</artifactId><version>${spring-ai.version}</version></dependency><!--解析文档必须--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons-io.version}</version></dependency>spring:application:name:RuoYi-Vue-Plusai:vectorstore:milvus:initialize-schema:truedatabase-name:defaultcollection-name:testclient:host:milvus服务ip地址port:19530username:rootpassword:milvus 此时需要在milvus中default数据库新建集合"test"#字段1doc_id:文档id,也就是表ai_knowledge_segment中对应的字段vector_id,方便验证、查询 #字段2embedding:向量维度,利用向量模型nomic-embed-text解析成向量,需要指定维度768,如果是1024或其它会报错! #字段3content:文档内容,利用tika解析文档 #字段4metadata:元数据,需要存储业务数据,如知识库id、文档id 其中Document对象具备metadata,存储数据时需对应![1]AiKnowledgeDocumentController/***上传文档列表**@parambo*@return*/@PostMapping("/createKnowledgeDocumentList")publicR<List<Long>>createKnowledgeDocumentList(@RequestBodyAiKnowledgeDocumentListBobo){returnR.ok(aiKnowledgeDocumentService.createKnowledgeDocumentList(bo));}[2]IAiKnowledgeDocumentService/***上传文档列表**@parambo*@return*/List<Long>createKnowledgeDocumentList(AiKnowledgeDocumentListBobo); [3]AiKnowledgeDocumentServiceImpl /** * 上传文档列表 * *@parambo *@return */ @Override @Transactional(rollbackFor =Exception.class) publicList<Long>createKnowledgeDocumentList(AiKnowledgeDocumentListBo bo) { // 校验 aiKnowledgeService.validateKnowledgeExists(bo.getKnowledgeId());
if(ObjectUtil.isEmpty(bo.getList())) { thrownewServiceException("至少上传一个文件"); }
// 批量读取文档内容 List<AiKnowledgeDocument> aiKnowledgeDocuments =prepareDocuments(bo);
baseMapper.insertBatch(aiKnowledgeDocuments); // 切片 processDocumentSegment(aiKnowledgeDocuments);
returnextractDocumentIds(aiKnowledgeDocuments); }
VectorStoregetOrCreateVectorStore(Class<?extendsVectorStore>type,EmbeddingModelembeddingModel,Map<String,Class<?>>metadataFields); @Override publicVectorStoregetOrCreateVectorStore(Long embedModelId, Map<String, Class<?>> metadataFields){ // 获取模型信息 AiModelVoaiModelVo=validateModel(embedModelId); AiApiKeyVoaiApiKeyVo=aiApiKeyService.validateApiKey(aiModelVo.getKeyId()); AiPlatformEnumaiPlatformEnum=AiPlatformEnum.validatePlatform(aiApiKeyVo.getPlatform());
// 创建或获取嵌入模型 EmbeddingModelembeddingModel=modelFactoryService.getOrCreateEmbeddingModel( aiPlatformEnum, aiApiKeyVo.getApiKey(), aiApiKeyVo.getUrl(), aiModelVo.getModel() );
returnmodelFactoryService.getOrCreateVectorStore(MilvusVectorStore.class, embeddingModel, metadataFields); } 此时指定的是milvus存储,看过我文档spring-ai存储向量数据可将其改为SimpleVectorStore.class至此,Spring AI实现知识库demo版结束啦,需要资料可以加技术群获取!ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;letter-spacing: 0.544px;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">本人正在打造技术交流群,欢迎志同道合的朋友一起探讨,一起努力,通过自己的努力,在技术岗位这条道路上走得更远。QQ群号:925317809 备注:技术交流 即可通过!加入技术群可以获取资料,含AI资料、Spring AI中文文档等,等你加入~
|