66import com .datamate .common .infrastructure .exception .KnowledgeBaseErrorCode ;
77import com .datamate .common .interfaces .PagedResponse ;
88import com .datamate .common .interfaces .PagingQuery ;
9+ import com .datamate .common .setting .domain .entity .ModelConfig ;
910import com .datamate .common .setting .domain .repository .ModelConfigRepository ;
11+ import com .datamate .common .setting .infrastructure .client .ModelClient ;
1012import com .datamate .rag .indexer .domain .model .FileStatus ;
1113import com .datamate .rag .indexer .domain .model .KnowledgeBase ;
1214import com .datamate .rag .indexer .domain .model .RagChunk ;
1618import com .datamate .rag .indexer .infrastructure .event .DataInsertedEvent ;
1719import com .datamate .rag .indexer .infrastructure .milvus .MilvusService ;
1820import com .datamate .rag .indexer .interfaces .dto .*;
19- import io .milvus .param .collection .DropCollectionParam ;
20- import io .milvus .param .dml .DeleteParam ;
21+ import dev .langchain4j .data .embedding .Embedding ;
22+ import dev .langchain4j .model .embedding .EmbeddingModel ;
23+ import io .milvus .v2 .service .collection .request .DropCollectionReq ;
24+ import io .milvus .v2 .service .collection .request .RenameCollectionReq ;
25+ import io .milvus .v2 .service .vector .request .DeleteReq ;
26+ import io .milvus .v2 .service .vector .request .QueryReq ;
27+ import io .milvus .v2 .service .vector .response .QueryResp ;
28+ import io .milvus .v2 .service .vector .response .SearchResp ;
2129import lombok .RequiredArgsConstructor ;
2230import org .jetbrains .annotations .NotNull ;
2331import org .springframework .beans .BeanUtils ;
2634import org .springframework .transaction .annotation .Transactional ;
2735import org .springframework .util .StringUtils ;
2836
37+ import java .util .Collections ;
2938import java .util .List ;
3039import java .util .Optional ;
3140
@@ -63,10 +72,15 @@ public String create(KnowledgeBaseCreateReq request) {
6372 * @param knowledgeBaseId 知识库 ID
6473 * @param request 知识库更新请求
6574 */
75+ @ Transactional (rollbackFor = Exception .class )
6676 public void update (String knowledgeBaseId , KnowledgeBaseUpdateReq request ) {
6777 KnowledgeBase knowledgeBase = Optional .ofNullable (knowledgeBaseRepository .getById (knowledgeBaseId ))
6878 .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
6979 if (StringUtils .hasText (request .getName ())) {
80+ milvusService .getMilvusClient ().renameCollection (RenameCollectionReq .builder ()
81+ .collectionName (knowledgeBase .getName ())
82+ .newCollectionName (request .getName ())
83+ .build ());
7084 knowledgeBase .setName (request .getName ());
7185 }
7286 if (StringUtils .hasText (request .getDescription ())) {
@@ -75,13 +89,19 @@ public void update(String knowledgeBaseId, KnowledgeBaseUpdateReq request) {
7589 knowledgeBaseRepository .updateById (knowledgeBase );
7690 }
7791
78- @ Transactional
92+
93+ /**
94+ * 删除知识库
95+ *
96+ * @param knowledgeBaseId 知识库 ID
97+ */
98+ @ Transactional (rollbackFor = Exception .class )
7999 public void delete (String knowledgeBaseId ) {
80100 KnowledgeBase knowledgeBase = Optional .ofNullable (knowledgeBaseRepository .getById (knowledgeBaseId ))
81101 .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
82102 knowledgeBaseRepository .removeById (knowledgeBaseId );
83103 ragFileRepository .removeByKnowledgeBaseId (knowledgeBaseId );
84- milvusService .getMilvusClient ().dropCollection (DropCollectionParam . newBuilder ().withCollectionName (knowledgeBase .getName ()).build ());
104+ milvusService .getMilvusClient ().dropCollection (DropCollectionReq . builder ().collectionName (knowledgeBase .getName ()).build ());
85105 }
86106
87107 public KnowledgeBaseResp getById (String knowledgeBaseId ) {
@@ -147,14 +167,65 @@ public void deleteFiles(String knowledgeBaseId, DeleteFilesReq request) {
147167 KnowledgeBase knowledgeBase = Optional .ofNullable (knowledgeBaseRepository .getById (knowledgeBaseId ))
148168 .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
149169 ragFileRepository .removeByIds (request .getIds ());
150- milvusService .getMilvusClient ().delete (DeleteParam . newBuilder ()
151- .withCollectionName (knowledgeBase .getName ())
152- .withExpr ("metadata[\" rag_file_id\" ] in [" + org .apache .commons .lang3 .StringUtils .join (request .getIds ().stream ().map (id -> "\" " + id + "\" " ).toArray (), "," ) + "]" )
170+ milvusService .getMilvusClient ().delete (DeleteReq . builder ()
171+ .collectionName (knowledgeBase .getName ())
172+ .filter ("metadata[\" rag_file_id\" ] in [" + org .apache .commons .lang3 .StringUtils .join (request .getIds ().stream ().map (id -> "\" " + id + "\" " ).toArray (), "," ) + "]" )
153173 .build ());
154174 }
155175
156176 public PagedResponse <RagChunk > getChunks (String knowledgeBaseId , String ragFileId , PagingQuery pagingQuery ) {
157- IPage <RagChunk > page = new Page <>(pagingQuery .getPage (), pagingQuery .getSize ());
158- return PagedResponse .of (page .getRecords (), page .getCurrent (), page .getTotal (), page .getPages ());
177+ KnowledgeBase knowledgeBase = Optional .ofNullable (knowledgeBaseRepository .getById (knowledgeBaseId ))
178+ .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
179+ QueryResp results = milvusService .getMilvusClient ().query (QueryReq .builder ()
180+ .collectionName (knowledgeBase .getName ())
181+ .filter ("metadata[\" rag_file_id\" ] == \" " + ragFileId + "\" " )
182+ .outputFields (Collections .singletonList ("*" ))
183+ .limit (Long .valueOf (pagingQuery .getSize ()))
184+ .offset ((long ) (pagingQuery .getPage () - 1 ) * pagingQuery .getSize ())
185+ .build ());
186+ List <QueryResp .QueryResult > queryResults = results .getQueryResults ();
187+ List <RagChunk > ragChunks = queryResults .stream ()
188+ .map (QueryResp .QueryResult ::getEntity )
189+ .map (item -> new RagChunk (
190+ item .get ("id" ).toString (),
191+ item .get ("text" ).toString (),
192+ item .get ("metadata" ).toString ()
193+ )).toList ();
194+
195+ // 获取总数
196+ QueryResp countResults = milvusService .getMilvusClient ().query (QueryReq .builder ()
197+ .collectionName (knowledgeBase .getName ())
198+ .filter ("metadata[\" rag_file_id\" ] == \" " + ragFileId + "\" " )
199+ .outputFields (Collections .singletonList ("count(*)" ))
200+ .build ());
201+
202+ long totalCount = Long .parseLong (countResults .getQueryResults ().getFirst ().getEntity ().get ("count(*)" ).toString ());
203+ return PagedResponse .of (ragChunks , pagingQuery .getPage (), totalCount , (int ) Math .ceil ((double ) totalCount / pagingQuery .getSize ()));
204+ }
205+
206+ /**
207+ * 检索知识库内容
208+ *
209+ * @param request 检索请求
210+ * @return 检索结果
211+ */
212+ public SearchResp retrieve (RetrieveReq request ) {
213+ KnowledgeBase knowledgeBase = Optional .ofNullable (knowledgeBaseRepository .getById (request .getKnowledgeBaseIds ().getFirst ()))
214+ .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
215+ ModelConfig modelConfig = modelConfigRepository .getById (knowledgeBase .getEmbeddingModel ());
216+ EmbeddingModel embeddingModel = ModelClient .invokeEmbeddingModel (modelConfig );
217+ Embedding embedding = embeddingModel .embed (request .getQuery ()).content ();
218+ SearchResp searchResp = milvusService .hybridSearch (knowledgeBase .getName (), request .getQuery (), embedding .vector (), request .getTopK ());
219+ return searchResp ;
220+
221+ // request.getKnowledgeBaseIds().forEach(knowledgeId -> {
222+ // KnowledgeBase knowledgeBase = Optional.ofNullable(knowledgeBaseRepository.getById(knowledgeId))
223+ // .orElseThrow(() -> BusinessException.of(KnowledgeBaseErrorCode.KNOWLEDGE_BASE_NOT_FOUND));
224+ // ModelConfig modelConfig = modelConfigRepository.getById(knowledgeBase.getEmbeddingModel());
225+ // EmbeddingModel embeddingModel = ModelClient.invokeEmbeddingModel(modelConfig);
226+ // Embedding embedding = embeddingModel.embed(request.getQuery()).content();
227+ // searchResp = milvusService.hybridSearch(knowledgeBase.getName(), request.getQuery(), embedding.vector(), request.getTopK());
228+ // });
229+ // return searchResp;
159230 }
160231}
0 commit comments