From a41dbe55590a274d85e89078996c614965a3f6a4 Mon Sep 17 00:00:00 2001 From: limin Date: Fri, 3 Jan 2025 12:42:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E5=9E=8B=E8=AF=84?= =?UTF-8?q?=E4=BC=B0=E4=BA=BA=E5=B7=A5=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ManualModelAnswerSaveReqVO.java | 4 +- .../vo/ManualAssessmentPageRespVO.java | 19 +----- .../ManualModelAnswerDO.java | 4 ++ .../backend/config/MyBatisConfig.java | 17 +++++- .../llm/handler/ListHashMapTypeHandler.java | 56 ++++++++++++++++++ .../ManualModelAnswerServiceImpl.java | 59 ++++++++----------- 6 files changed, 105 insertions(+), 54 deletions(-) create mode 100644 yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/handler/ListHashMapTypeHandler.java diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/manualAnnoVo/ManualModelAnswerSaveReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/manualAnnoVo/ManualModelAnswerSaveReqVO.java index fde034cc3..2d86914dd 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/manualAnnoVo/ManualModelAnswerSaveReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/manualAnnoVo/ManualModelAnswerSaveReqVO.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.manua import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import java.util.HashMap; import java.util.List; @Schema(description = "管理后台 - 模型评估人工标注 模型回答新增/修改 Request VO") @@ -26,8 +27,7 @@ public class ManualModelAnswerSaveReqVO { @Schema(description = "模型回答内容") private String modelAnswer; - @Schema(description = "模型评估人工标注列表") - private List annoReqRespVo; + private List> reqRespVos; } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/vo/ManualAssessmentPageRespVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/vo/ManualAssessmentPageRespVO.java index be13551cb..d6b747a7a 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/vo/ManualAssessmentPageRespVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelassesstaskmanual/vo/ManualAssessmentPageRespVO.java @@ -26,19 +26,6 @@ public class ManualAssessmentPageRespVO { @ExcelProperty("评估任务ID") private Long id; - @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - @ExcelProperty("任务名称") - private String taskName; - - @Schema(description = "任务描述") - @ExcelProperty("任务描述") - private String taskInfro; - - @Schema(description = "CPU类型,使用字典(llm_cpu_type)", example = "2") - @ExcelProperty(value = "CPU类型,使用字典(llm_cpu_type)", converter = DictConvert.class) - @DictFormat("llm_cpu_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 - private Integer cpuType; - @Schema(description = "模型服务") @ExcelProperty("模型服务") private Long modelService; @@ -47,14 +34,10 @@ public class ManualAssessmentPageRespVO { @ExcelProperty("数据集") private Long dataset; - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - @Schema(description = "人工评估列表") private List dimensions; - @Schema(description = "模型评估任务状态,使用字典(llm_model_assess_task_status)") + @Schema(description = "模型评估任务状态,人工标注状态(0未标注 2标注完成)") private Integer status; @Schema(description = "任务进度") diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/modelassesstaskmanual/ManualModelAnswerDO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/modelassesstaskmanual/ManualModelAnswerDO.java index 2af0eed15..38765e6eb 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/modelassesstaskmanual/ManualModelAnswerDO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/modelassesstaskmanual/ManualModelAnswerDO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual; +import cn.iocoder.yudao.module.llm.handler.ListHashMapTypeHandler; import lombok.*; import java.util.*; import java.time.LocalDateTime; @@ -48,4 +49,7 @@ public class ManualModelAnswerDO extends BaseDO { */ private String modelAnswer; + @TableField(typeHandler = ListHashMapTypeHandler.class) + private List> reqRespVos; + } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/MyBatisConfig.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/MyBatisConfig.java index cc17de8a6..15fb103cf 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/MyBatisConfig.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/MyBatisConfig.java @@ -2,14 +2,18 @@ package cn.iocoder.yudao.module.llm.framework.backend.config; import cn.hutool.json.JSONObject; import cn.iocoder.yudao.module.llm.handler.JSONObjectTypeHandler; +import cn.iocoder.yudao.module.llm.handler.ListHashMapTypeHandler; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import org.apache.ibatis.type.TypeHandlerRegistry; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.HashMap; +import java.util.List; + @Configuration -@MapperScan("cn.iocoder.yudao.module.llm.dal.mysql.dataprocesstask") +@MapperScan("cn.iocoder.yudao.module.llm.dal.mysql.*") public class MyBatisConfig { @Bean @@ -17,6 +21,11 @@ public class MyBatisConfig { return new JSONObjectTypeHandler(); } + @Bean + public ListHashMapTypeHandler listHashMapTypeHandler() { + return new ListHashMapTypeHandler(); + } + @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> { @@ -24,6 +33,12 @@ public class MyBatisConfig { if (!typeHandlerRegistry.hasTypeHandler(JSONObject.class)) { typeHandlerRegistry.register(JSONObject.class, jsonObjectTypeHandler()); } + // 注册 List> 类型的处理器 + if (!typeHandlerRegistry.hasTypeHandler(List.class)){ + typeHandlerRegistry.register(List.class, listHashMapTypeHandler()); + } }; } + + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/handler/ListHashMapTypeHandler.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/handler/ListHashMapTypeHandler.java new file mode 100644 index 000000000..792bbe055 --- /dev/null +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/handler/ListHashMapTypeHandler.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.llm.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; + +public class ListHashMapTypeHandler extends BaseTypeHandler>> { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List> parameter, JdbcType jdbcType) throws SQLException { + try { + String jsonString = objectMapper.writeValueAsString(parameter); + ps.setString(i, jsonString); + } catch (Exception e) { + throw new SQLException("Failed to convert List> to JSON string", e); + } + } + + @Override + public List> getNullableResult(ResultSet rs, String columnName) throws SQLException { + String jsonStr = rs.getString(columnName); + return getListFromJson(jsonStr); + } + + @Override + public List> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String jsonStr = rs.getString(columnIndex); + return getListFromJson(jsonStr); + } + + @Override + public List> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String jsonStr = cs.getString(columnIndex); + return getListFromJson(jsonStr); + } + + private List> getListFromJson(String jsonStr) { + if (jsonStr == null) { + return null; + } + try { + return objectMapper.readValue(jsonStr, objectMapper.getTypeFactory().constructCollectionType(List.class, HashMap.class)); + } catch (Exception e) { + return null; + } + } +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelassesstaskmanual/ManualModelAnswerServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelassesstaskmanual/ManualModelAnswerServiceImpl.java index c092016e4..0387970df 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelassesstaskmanual/ManualModelAnswerServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelassesstaskmanual/ManualModelAnswerServiceImpl.java @@ -83,26 +83,21 @@ public class ManualModelAnswerServiceImpl implements ManualModelAnswerService { resp.setQuestion(datasetQuestionDO.getQuestion()); resp.setAnswers(BeanUtils.toBean(datasetAnswerDOS, DatasetAnswerRespVO.class)); resp.setModelAnswer(modelAnswerDO.getModelAnswer()); - List manualModelAnnoDOS = manualModelAnnoMapper.selectList(new LambdaQueryWrapper<>(ManualModelAnnoDO.class) - .eq(ManualModelAnnoDO::getModelAnswerId, modelAnswerDO.getId())); - List dimensions = resp.getDimensions(); - Map longModelServiceDOMap = cn.iocoder.yudao.framework.common.util.collection. - CollectionUtils.convertMap(manualModelAnnoDOS, ManualModelAnnoDO::getDimensionId); - if (!CollectionUtils.isAnyEmpty(dimensions)){ - List> annoList= new ArrayList<>(); - dimensions.forEach(dimension -> { - HashMap map = new HashMap<>(); - if (longModelServiceDOMap.containsKey(dimension.getDimensionId())){ - map.put("label",dimension.getDimensionName()); - map.put("score",longModelServiceDOMap.get(dimension.getDimensionId()).getScore()); - annoList.add(map); - }else { - map.put("label",dimension.getDimensionName()); - map.put("score",0); - annoList.add(map); - } - }); - resp.setReqRespVos(annoList); + resp.setId(modelAnswerDO.getId()); + resp.setStatus(modelAnswerDO.getStatus()); + if (!CollectionUtils.isAnyEmpty(modelAnswerDO.getReqRespVos())){ + resp.setReqRespVos(modelAnswerDO.getReqRespVos()); + }else { + if (!CollectionUtils.isAnyEmpty(modelAssessTaskManual.getDimensions())){ + List> map = new ArrayList<>(); + modelAssessTaskManual.getDimensions().forEach(dimension -> { + HashMap map1 = new HashMap<>(); + map1.put("dimension", dimension.getDimensionName()); + map1.put("score", 0); + map.add(map1); + }); + resp.setReqRespVos(map); + } } res.add(resp); }); @@ -119,25 +114,23 @@ public class ManualModelAnswerServiceImpl implements ManualModelAnswerService { @Override public void annoManualModelAnswer(List reqRespVo) { List modelAnswerDOS = BeanUtils.toBean(reqRespVo, ManualModelAnswerDO.class); - if (reqRespVo.size() > 0){ - Long modelAnswerId = modelAnswerDOS.get(0).getManalTaskId(); - reqRespVo.forEach(modelAnswerDO -> { - if (!CollectionUtils.isAnyEmpty(modelAnswerDO.getAnnoReqRespVo())){ - List modelAnnoDOS = BeanUtils.toBean(modelAnswerDO.getAnnoReqRespVo(), ManualModelAnnoDO.class); - manualModelAnnoMapper.insertOrUpdate(modelAnnoDOS); - manualModelAnswerMapper.updateStatus(modelAnswerDO.getId(),2); - } + if (!CollectionUtils.isAnyEmpty(modelAnswerDOS)) { + modelAnswerDOS.forEach(modelAnswerDO -> { + modelAnswerDO.setStatus(2); + manualModelAnswerMapper.updateById(modelAnswerDO); + }); // 标注进度修改 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .eq(ManualModelAnswerDO::getManalTaskId, modelAnswerId); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ManualModelAnswerDO::getManalTaskId, reqRespVo.get(0).getManalTaskId()); Long sumCount = manualModelAnswerMapper.selectCount(wrapper); - wrapper.eq(ManualModelAnswerDO::getStatus,2); + wrapper.eq(ManualModelAnswerDO::getStatus, 2); Long annoCount = manualModelAnswerMapper.selectCount(wrapper); - double ratio = sumCount == 0 ? 0 : ((double) annoCount / sumCount) *100; + double ratio = sumCount == 0 ? 0 : ((double) annoCount / sumCount) * 100; Integer formattedRatio = ratio == 0 ? 0 : (int) ratio; Integer status = formattedRatio == 100 ? 4 : 2; - modelAssessTaskManualMapper.updateStatus(modelAnswerId,formattedRatio,status); + modelAssessTaskManualMapper.updateStatus(reqRespVo.get(0).getManalTaskId(), formattedRatio, status); + } }