Ver código fonte

聊天切片分页展示

S0025136190 6 meses atrás
pai
commit
ddae493d8f

+ 111 - 58
takai-admin/src/main/java/com/takai/web/controller/takaiai/TakaiAiController.java

@@ -24,10 +24,8 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Slf4j
 @RestController
@@ -39,6 +37,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 对话聊天
+     *
      * @param response
      * @param request
      * @param sseParams
@@ -46,25 +45,23 @@ public class TakaiAiController extends BaseController {
      */
     @PostMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
     public SseEmitter chat(HttpServletResponse response, HttpServletRequest request, @RequestBody TakaiSseInfoParams sseParams)
-    throws Exception
-    {
+            throws Exception {
         return takaiAisService.sseInvoke(sseParams);
     }
 
     @PostMapping("/async/completions")
-    public AjaxResult asyncCompletions(@RequestBody TakaiCompletionsParams params)
-    {
+    public AjaxResult asyncCompletions(@RequestBody TakaiCompletionsParams params) {
         return success(takaiAisService.asyncCompletions(params));
     }
 
     /**
      * 应用列表
+     *
      * @param params
      * @return
      */
     @PostMapping("/getApplicationList")
-    public TableDataInfo getApplicationList(@RequestBody TakaiPageParams params)
-    {
+    public TableDataInfo getApplicationList(@RequestBody TakaiPageParams params) {
         List<TakaiApplication> s = takaiAisService.getApplicationList();
         PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
         List<TakaiApplication> list = takaiAisService.getApplicationList();
@@ -73,60 +70,61 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 创建应用
+     *
      * @param params
      * @return
      */
     @PostMapping("/createApplication")
-    public AjaxResult addApplication(@RequestBody TakaiApplicationParams params)
-    {
+    public AjaxResult addApplication(@RequestBody TakaiApplicationParams params) {
         int i = takaiAisService.createApplication(params);
         return AjaxResult.success(i);
     }
 
     /**
      * 查询应用详情
+     *
      * @param appId
      * @return
      */
     @GetMapping("/selectApplication/{appId}")
-    public AjaxResult selectApplication(@PathVariable String appId)
-    {
+    public AjaxResult selectApplication(@PathVariable String appId) {
         JSONObject application = takaiAisService.selectApplication(appId);
         return AjaxResult.success(application);
     }
 
     /**
      * 修改应用
+     *
      * @param params
      * @param appId
      * @return
      */
     @PutMapping("/updateApplication/{appId}")
-    public AjaxResult updateApplication(@RequestBody TakaiApplicationParams params, @PathVariable String appId)
-    {
+    public AjaxResult updateApplication(@RequestBody TakaiApplicationParams params, @PathVariable String appId) {
         int application = takaiAisService.updateApplication(params, appId);
         return AjaxResult.success(application);
     }
 
     /**
      * 删除应用
+     *
      * @param appId
      * @return
      */
     @DeleteMapping("/delApplication/{appId}")
-    public AjaxResult delApplication(@PathVariable String appId)
-    {
+    public AjaxResult delApplication(@PathVariable String appId) {
         int application = takaiAisService.delApplication(appId);
         return AjaxResult.success(application);
     }
 
     /**
      * 首页
+     *
      * @param params
      * @return
      */
     @PostMapping("/index")
-    public AjaxResult index(@RequestBody PageParams params){
+    public AjaxResult index(@RequestBody PageParams params) {
         // 问答应用总数
         List<TakaiApplication> appList = takaiAisService.getApplicationList();
         // 知识库总数
@@ -139,22 +137,23 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 获取知识库下拉列表
+     *
      * @return
      */
     @GetMapping("/knowledgeList")
-    public AjaxResult getKnowledgeList(){
+    public AjaxResult getKnowledgeList() {
         return success(takaiAisService.queryKnowledgeList());
     }
 
 
     /**
      * 知识库列表
+     *
      * @param params
      * @return
      */
     @PostMapping("/getKnowledgeList")
-    public TableDataInfo getKnowledgeList(@RequestBody TakaiPageParams params)
-    {
+    public TableDataInfo getKnowledgeList(@RequestBody TakaiPageParams params) {
         List<TakaiKnowledge> s = takaiAisService.queryKnowledgeList();
         PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
         List<TakaiKnowledge> list = takaiAisService.queryKnowledgeList();
@@ -163,6 +162,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 创建知识库
+     *
      * @param knowledge
      * @return
      */
@@ -174,17 +174,19 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 知识库详情
+     *
      * @param knowledgeId
      * @return
      */
     @GetMapping("/detailKnowledge/{knowledgeId}")
-    public AjaxResult detailKnowledge(@PathVariable String knowledgeId){
+    public AjaxResult detailKnowledge(@PathVariable String knowledgeId) {
         TakaiKnowledge result = takaiAisService.detailKnowledge(knowledgeId);
         return success(result);
     }
 
     /**
      * 修改知识库
+     *
      * @param knowledge
      * @param knowledgeId
      * @return
@@ -197,6 +199,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 删除知识库
+     *
      * @param knowledgeId
      * @return
      */
@@ -208,6 +211,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 知识列表
+     *
      * @param params
      * @return
      */
@@ -221,16 +225,18 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 知识详情
+     *
      * @param documentId
      * @return
      */
     @GetMapping("/documentDetail/{documentId}")
-    public AjaxResult documentDetail(@PathVariable String documentId){
+    public AjaxResult documentDetail(@PathVariable String documentId) {
         return success(takaiAisService.documentDetail(documentId));
     }
 
     /**
      * 更新知识
+     *
      * @param params
      * @param documentId
      * @return
@@ -243,6 +249,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 删除知识
+     *
      * @param documentId
      * @return
      */
@@ -254,6 +261,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 上传知识文件
+     *
      * @param files
      * @param knowledgeId
      * @return
@@ -262,17 +270,17 @@ public class TakaiAiController extends BaseController {
     @PostMapping("/uploadDocument/{knowledgeId}") //@RequestPart DocumentParams documentParams,
     public AjaxResult uploadDocument(@RequestParam("files") MultipartFile[] files,
                                      @PathVariable String knowledgeId) throws Exception {
-        try{
+        try {
             int i = takaiAisService.uploadDocument(files, knowledgeId);
             return success(i);
-        }catch (Exception e){
+        } catch (Exception e) {
             return error("0");
         }
     }
 
     /**
-     *
      * 获取知识配置信息
+     *
      * @param documentId
      * @return
      */
@@ -284,6 +292,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 更新知识配置详情
+     *
      * @param documentSetting
      * @param documentId
      * @return
@@ -296,6 +305,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 获取切片列表
+     *
      * @param params
      * @return
      */
@@ -313,16 +323,18 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 删除切片
+     *
      * @param sliceId
      * @param knowledgeId
      */
     @DeleteMapping("/deleteSlice/{sliceId}/{knowledgeId}/{documentId}")
     public AjaxResult deleteSlice(@PathVariable String sliceId, @PathVariable String knowledgeId, @PathVariable String documentId) {
-        return success (takaiAisService.deleteSlice(sliceId, knowledgeId, documentId));
+        return success(takaiAisService.deleteSlice(sliceId, knowledgeId, documentId));
     }
 
     /**
      * 切片详情
+     *
      * @param sliceId
      * @param knowledgeId
      * @return
@@ -335,29 +347,30 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 更新切片信息
+     *
      * @param params
      * @return
      */
     @PutMapping("/updateSliceInfo")
-    public AjaxResult updateSliceInfo(@RequestBody TakaiSliceUpdateParams params)
-    {
+    public AjaxResult updateSliceInfo(@RequestBody TakaiSliceUpdateParams params) {
         return success(takaiAisService.updateSliceInfo(params));
     }
 
     /**
      * 获取聊天列表
+     *
      * @param params
      * @return
      */
     @PostMapping("/chatHistory/list")
-    public TableDataInfo dataExportList(@RequestBody TakaiPageParams params){
-        if(StringUtils.isNotBlank(params.getAppId())){
+    public TableDataInfo dataExportList(@RequestBody TakaiPageParams params) {
+        if (StringUtils.isNotBlank(params.getAppId())) {
             //获取应用聊天列表
             List<Object> s = takaiAisService.selectDialogListByAppId(params.getAppId(), params.getUserId());
             PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
             List<Object> list = takaiAisService.selectDialogListByAppId(params.getAppId(), params.getUserId());
             return getDataTableResultTotal(list, Long.valueOf(s.size()));
-        }else{
+        } else {
             //获取所有列表
             List<Object> s = takaiAisService.selectDialogListByAppId(null, null);
             PageHelper.startPage(params.getPageNumber(), params.getPageSize(), "").setReasonable(true);
@@ -369,6 +382,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 导出聊天记录
+     *
      * @param response
      * @param id
      */
@@ -383,110 +397,149 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 应用列表
+     *
      * @return
      */
     @GetMapping("/application/list")
-    public AjaxResult index(){
+    public AjaxResult index() {
         List<TakaiApplication> appList = takaiAisService.getApplicationList();
         return success(appList);
     }
 
     /**
      * 保存聊天记录
+     *
      * @param dialogReqDTO
      * @return
      */
     @PostMapping("/dialog/save")
-    public AjaxResult saveDialog(@RequestBody TakaiDialogReqDTO dialogReqDTO)
-    {
+    public AjaxResult saveDialog(@RequestBody TakaiDialogReqDTO dialogReqDTO) {
         takaiAisService.saveDialog(dialogReqDTO);
         return success();
     }
 
     /**
      * 聊天集合
+     *
      * @return
      */
     @GetMapping("/dialog/list/{appId}")
-    public AjaxResult dialogList(@PathVariable String appId)
-    {
+    public AjaxResult dialogList(@PathVariable String appId) {
         List<Object> dialogs = takaiAisService.getDialogList(appId);
         return success(dialogs);
     }
 
     /**
      * 聊天详情
+     *
      * @param dialogId
      * @return
      */
     @GetMapping("/dialog/detail/{dialogId}")
-    public AjaxResult dialogDetail(@PathVariable String dialogId)
-    {
+    public AjaxResult dialogDetail(@PathVariable String dialogId) {
         List<TakaiDialogRespDTO> detail = takaiAisService.getDialogDetail(dialogId);
         return success(detail);
     }
 
     /**
      * 删除聊天记录
+     *
      * @param id
      * @return
      */
     @DeleteMapping("/dialog/del/{id}")
-    public AjaxResult delDialog(@PathVariable String id)
-    {
+    public AjaxResult delDialog(@PathVariable String id) {
         takaiAisService.DelDialogDetail(id);
         return success();
     }
 
     /**
      * 聊天标题重命名
+     *
      * @param dialogReqDTO
      * @return
      */
     @PutMapping("/dialog/update")
-    public AjaxResult updateDialog(@RequestBody TakaiDialogReqDTO dialogReqDTO)
-    {
+    public AjaxResult updateDialog(@RequestBody TakaiDialogReqDTO dialogReqDTO) {
         takaiAisService.updateDialog(dialogReqDTO);
         return success();
     }
 
     /**
      * 预设问题
+     *
      * @param appId
      * @return
      */
     @GetMapping("/presets/{appId}")
-    public AjaxResult presets(@PathVariable String appId){
+    public AjaxResult presets(@PathVariable String appId) {
         List<TakaiQuestionDTO> list = takaiAisService.selectQuestionByAppId(appId);
         List<String> strList = new ArrayList();
-        for (TakaiQuestionDTO vo: list){
+        for (TakaiQuestionDTO vo : list) {
             strList.add(vo.getQuestion());
         }
         return success(strList);
     }
 
+    /**
+     * 新增切片
+     *
+     * @param params
+     * @return
+     */
     @PostMapping("/add/slice")
     public AjaxResult addSlice(@RequestBody TakaiSliceUpdateParams params) {
         return success(takaiAisService.addSlice(params));
     }
 
-    @GetMapping("/test")
-    public AjaxResult test(){
-        TakaiMediaReplacement vo = takaiAisService.getTakaiMediaReplacement();
-        return success(vo);
-    }
-
-
-
-
-
-
-
+    /**
+     * 获取聊天切片列表
+     *
+     * @param params
+     * @return
+     */
+    @PostMapping("/slicePage")
+    public TableDataInfo dataExportList(@RequestBody SlicePageInfo params) {
+        DocumentInfo chunkInfo = params.getChunk_info();
+        List<ChunkList> chunkList = chunkInfo.getChunk_list();
+        // 1. 先按 rerank_score 降序排序所有chunk
+        List<ChunkList> sortedChunks = chunkList.stream()
+                .sorted(Comparator.comparingDouble(
+                        (ChunkList s) -> Double.parseDouble(s.getRerank_score())
+                ).reversed())
+                .collect(Collectors.toList());
 
+        // 2. 提取排序后的chunk_ids(此时已按分数排序)
+        List<String> sortedChunkIds = sortedChunks.stream()
+                .map(ChunkList::getChunk_id)
+                .collect(Collectors.toList());
 
+        int fromIndex = (params.getPageNum() - 1) * params.getPageSize();
 
+        int toIndex = Math.min(fromIndex + params.getPageSize(), chunkList.size());
 
+        List<String> ids = sortedChunkIds.subList(fromIndex, toIndex);
 
+        PageHelper.startPage(params.getPageNum(), params.getPageSize(), "").setReasonable(true);
+        List<SliceInfo> list = takaiAisService.slicePageInfoList(ids);
+        list.forEach(sliceInfo -> {
+            chunkList.forEach(chunk -> {
+                if (sliceInfo.getSliceId().equals(chunk.getChunk_id())) {
+                    sliceInfo.setRerankScore(chunk.getRerank_score());
+                    sliceInfo.setChunkLength(chunk.getChunk_len());
+                }
+            });
+        });
+        List<SliceInfo> sliceList = list.stream()
+                .sorted(Comparator.comparingDouble((SliceInfo s) -> Double.parseDouble(s.getRerankScore())).reversed())
+                .collect(Collectors.toList());
+        return getDataTableResultTotal(sliceList, sortedChunkIds.size());
+    }
+    @GetMapping("/test")
+    public AjaxResult test() {
+        TakaiMediaReplacement vo = takaiAisService.getTakaiMediaReplacement();
+        return success(vo);
+    }
 
 
     @GetMapping("/download/{fileName}")

+ 14 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/ChunkList.java

@@ -0,0 +1,14 @@
+package com.takai.ai.domain.entity;
+
+import lombok.Data;
+
+@Data
+public class ChunkList {
+
+    private String chunk_id;
+
+    private String rerank_score;
+
+    private Integer chunk_len;
+
+}

+ 18 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/DocumentInfo.java

@@ -0,0 +1,18 @@
+package com.takai.ai.domain.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DocumentInfo {
+
+    private String doc_id;
+
+    private String doc_name;
+
+    private Integer chunk_nums;
+
+    private List<ChunkList> chunk_list;
+
+}

+ 25 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/SliceInfo.java

@@ -0,0 +1,25 @@
+package com.takai.ai.domain.entity;
+
+import com.takai.common.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SliceInfo extends BaseEntity {
+
+    private String sliceId;
+
+    private String knowledgeId;
+
+    private String documentId;
+
+    private int sliceIndex;
+
+    private int sliceType;
+
+    private String sliceText;
+
+    private String rerankScore;
+
+    private Integer chunkLength;
+
+}

+ 17 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/SlicePageInfo.java

@@ -0,0 +1,17 @@
+package com.takai.ai.domain.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SlicePageInfo {
+
+    private String knowledge_id;
+
+    private DocumentInfo chunk_info;
+
+    private Integer pageNum;
+
+    private Integer pageSize;
+}

+ 3 - 0
takai-ai/src/main/java/com/takai/ai/mapper/TakaiSliceInfoMapper.java

@@ -1,6 +1,7 @@
 package com.takai.ai.mapper;
 
 
+import com.takai.ai.domain.entity.SliceInfo;
 import com.takai.ai.domain.entity.TakaiSliceInfo;
 import org.apache.ibatis.annotations.Param;
 
@@ -12,4 +13,6 @@ public interface TakaiSliceInfoMapper {
 
     TakaiSliceInfo selectBySliceId(@Param("sliceId") String sliceId);
 
+    List<SliceInfo> slicePageInfoList(List<String> list);
+
 }

+ 2 - 1
takai-ai/src/main/java/com/takai/ai/service/ITakaiAiService.java

@@ -9,7 +9,6 @@ import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * 高井 业务层
@@ -93,4 +92,6 @@ public interface ITakaiAiService
 
     TakaiSliceInfo selectBySliceId(String sliceId);
 
+    List<SliceInfo> slicePageInfoList(List<String> list);
+
 }

+ 5 - 0
takai-ai/src/main/java/com/takai/ai/service/impl/TakaiAiServiceImpl.java

@@ -1003,6 +1003,11 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         return takaiSliceInfoMapper.selectBySliceId(sliceId);
     }
 
+    @Override
+    public List<SliceInfo> slicePageInfoList(List<String> list) {
+        return takaiSliceInfoMapper.slicePageInfoList(list);
+    }
+
     private JSONObject analysisFile(List<UploadDocumentParams> result, TakaiDocumentSettings settings, String flag) {
         String url = deepseekConfig.getBaseurl() + deepseekConfig.getUploadKnowledge();
         JSONObject json = new JSONObject();

+ 22 - 0
takai-ai/src/main/resources/mapper/takaiai/TakaiSliceInfoMapper.xml

@@ -17,6 +17,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="updateTime" column="update_time" />
 	</resultMap>
 
+	<resultMap type="com.takai.ai.domain.entity.SliceInfo" id="SliceInfoScoreResult" >
+		<id property="sliceId" column="slice_id"/>
+		<result property="knowledgeId" column="knowledge_id"/>
+		<result property="documentId" column="document_id"/>
+		<result property="sliceIndex" column="slice_index"/>
+		<result property="sliceType" column="slice_type"/>
+		<result property="sliceText" column="slice_text"/>
+		<result property="createBy"   column="create_by"   />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy"   column="update_by"   />
+		<result property="updateTime" column="update_time" />
+	</resultMap>
+
 	<sql id="Base_Column">
 		slice_id, knowledge_id, document_id, slice_index, slice_type, slice_text, create_by, create_time, update_by, update_time
 	</sql>
@@ -36,5 +49,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			where slice_id = #{sliceId}
 	</select>
 
+	<select id="slicePageInfoList" resultMap="SliceInfoScoreResult">
+		select
+		<include refid="Base_Column"/>
+		from slice_info
+		where slice_id in
+		<foreach collection="list" item="sliceId" open="(" separator="," close=")">
+			#{sliceId}
+		</foreach>
+	</select>
 	
 </mapper>