添加多模态数据集相关功能
This commit is contained in:
parent
6604a24e30
commit
5981928b40
@ -110,7 +110,6 @@ public class ConversationController {
|
||||
public SseEmitter streamChat (@Valid @RequestBody ChatReqVO chatReqVO, HttpServletResponse response) {
|
||||
log.info("收到对话推理请求,请求参数: {}", chatReqVO);
|
||||
SseEmitter emitter = new SseEmitter(120_0000L);
|
||||
|
||||
// 异步处理,避免阻塞主线程
|
||||
CompletableFuture.runAsync(() -> {
|
||||
try {
|
||||
@ -129,6 +128,29 @@ public class ConversationController {
|
||||
return emitter;
|
||||
}
|
||||
|
||||
@PostMapping("/stream-chat-modal")
|
||||
public SseEmitter streamChatModal (@Valid @RequestBody ChatReqVO chatReqVO, HttpServletResponse response) {
|
||||
log.info("收到对话推理请求,请求参数: {}", chatReqVO);
|
||||
SseEmitter emitter = new SseEmitter(120_0000L);
|
||||
|
||||
// 异步处理,避免阻塞主线程
|
||||
CompletableFuture.runAsync(() -> {
|
||||
try {
|
||||
conversationService.chatStreamModal(chatReqVO, emitter, response);
|
||||
emitter.complete();
|
||||
} catch (Exception e) {
|
||||
log.error("处理对话推理请求时发生异常:{}", e.getMessage());
|
||||
try {
|
||||
emitter.completeWithError(e);
|
||||
} catch (Exception ex) {
|
||||
log.error("无法完成 SseEmitter 错误处理", ex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return emitter;
|
||||
}
|
||||
|
||||
@GetMapping("/paragraphHitRate")
|
||||
@Operation(summary = "获得大模型对话记录分页")
|
||||
@PreAuthorize("@ss.hasPermission('llm:conversation:query')")
|
||||
|
@ -5,6 +5,7 @@ import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "管理后台 - 大模型对话推理聊天 Request VO")
|
||||
@Data
|
||||
@ -35,4 +36,6 @@ public class ChatReqVO {
|
||||
private Double topP;
|
||||
@Schema(description = "分组id")
|
||||
private String groupId;
|
||||
|
||||
private List<String> imagesList;
|
||||
}
|
||||
|
@ -171,6 +171,8 @@ public class DatasetController {
|
||||
return new FileInfoVO("dataset_example_csv.csv", "text/csv");
|
||||
case 4:
|
||||
return new FileInfoVO("dataset_example_json.json", "application/json");
|
||||
case 5:
|
||||
return new FileInfoVO("VL_test.zip", "application/zip");
|
||||
default:
|
||||
throw new IllegalArgumentException("无效的 type 参数");
|
||||
}
|
||||
|
@ -68,4 +68,6 @@ public class DatasetRespVO {
|
||||
private String jobId;
|
||||
|
||||
private String fileUrl;
|
||||
|
||||
private Integer datasetParentType;
|
||||
}
|
||||
|
@ -108,7 +108,13 @@ public class ModelServiceController {
|
||||
// @PreAuthorize("@ss.hasPermission('llm:model-service:query')")
|
||||
public CommonResult<List<ModelServiceRespVO>> getModelServiceList() {
|
||||
List<ModelServiceDO> list = modelServiceService.getModelServiceList();
|
||||
return success(BeanUtils.toBean(list, ModelServiceRespVO.class));
|
||||
List<ModelServiceRespVO> modelServiceRespVOS = BeanUtils.toBean(list, ModelServiceRespVO.class);
|
||||
modelServiceRespVOS.stream().forEach(result ->{
|
||||
Long id=result.getFineTuningTask();
|
||||
BaseModelDO basemodel = baseModelService.getById(id);
|
||||
result.setModelType(basemodel.getModelType());
|
||||
});
|
||||
return success(modelServiceRespVOS);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
|
@ -75,6 +75,8 @@ public class LLMBackendProperties {
|
||||
|
||||
@NotNull(message = "创建微调任务 POST")
|
||||
private String finetuningCreate;
|
||||
@NotNull(message = "创建微调任务多模态 POST")
|
||||
private String finetuningCreateModal;
|
||||
|
||||
@NotNull(message = "停止微调任务 POST")
|
||||
private String stopFinetuning;
|
||||
@ -145,4 +147,6 @@ public class LLMBackendProperties {
|
||||
* 获取调优检查点列表
|
||||
*/
|
||||
private String checkFileList;
|
||||
|
||||
private String datasetMoreModalApi;
|
||||
}
|
||||
|
@ -1,14 +1,20 @@
|
||||
package cn.iocoder.yudao.module.llm.service.async;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetQuestionRespVO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetFilesDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetFilesMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetMapper;
|
||||
import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties;
|
||||
import cn.iocoder.yudao.module.llm.service.dataset.DatasetFilesService;
|
||||
import cn.iocoder.yudao.module.llm.service.dataset.vo.AigcDatasetVo;
|
||||
import cn.iocoder.yudao.module.llm.service.http.TrainHttpService;
|
||||
import cn.iocoder.yudao.module.llm.service.http.vo.AigcDatasetFileRespV0;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -32,6 +38,9 @@ public class AsyncDataSetService {
|
||||
|
||||
@Resource
|
||||
private LLMBackendProperties llmBackendProperties;
|
||||
|
||||
@Resource
|
||||
private DatasetFilesMapper datasetFilesMapper;
|
||||
private static final Logger log = LoggerFactory.getLogger(AsyncKnowledgeBase.class);
|
||||
|
||||
@Async
|
||||
@ -75,6 +84,17 @@ public class AsyncDataSetService {
|
||||
}
|
||||
}
|
||||
|
||||
@Async
|
||||
public void sendDatasetModal(Long datasetid,String datasetName){
|
||||
List<DatasetFilesDO> datasetFilesDOS = datasetFilesMapper.selectList(Wrappers.<DatasetFilesDO>lambdaQuery().eq(DatasetFilesDO::getDatasetId, datasetid));
|
||||
JSONObject param=new JSONObject();
|
||||
param.put("url",datasetFilesDOS.get(0).getDatasetFileUrl());
|
||||
param.put("dataset_name",datasetName);
|
||||
HttpUtils.post(llmBackendProperties.getDatasetMoreModalApi(),null,param.toString());
|
||||
//llmBackendProperties.getDatasetMoreModalApi()
|
||||
|
||||
}
|
||||
|
||||
|
||||
public String JsonFileWriteFine (String hostUrl, DatasetDO datasetDO, List<DatasetQuestionRespVO> datasetQuestionList) {
|
||||
try {
|
||||
|
@ -122,7 +122,14 @@ public class AsyncFineTuningTaskService {
|
||||
|
||||
// 调用模型服务创建微调任务
|
||||
log.info("正在调用模型服务创建微调任务...");
|
||||
AigcFineTuningCreateRespVO resp = fineTuningTaskHttpService.finetuningCreate(new HashMap<>(), serverNameDO.getHost(), req);
|
||||
AigcFineTuningCreateRespVO resp=null;
|
||||
String modelType = baseModelDO.getModelType();
|
||||
if("1".equals(modelType)){
|
||||
resp = fineTuningTaskHttpService.finetuningCreate(new HashMap<>(), serverNameDO.getHost(), req);
|
||||
}else{
|
||||
resp = fineTuningTaskHttpService.finetuningCreateModal(new HashMap<>(), serverNameDO.getHost(), req);
|
||||
}
|
||||
|
||||
|
||||
// 更新任务状态
|
||||
FineTuningTaskDO updateObj = new FineTuningTaskDO();
|
||||
|
@ -75,6 +75,8 @@ public interface ConversationService {
|
||||
*/
|
||||
void chatStream (@Valid ChatReqVO chatReqVO, SseEmitter emitter, HttpServletResponse response);
|
||||
|
||||
void chatStreamModal(ChatReqVO chatReqVO, SseEmitter emitter, HttpServletResponse response);
|
||||
|
||||
/**
|
||||
* 获取段落命中率
|
||||
* @param uuid
|
||||
|
@ -13,11 +13,9 @@ import cn.iocoder.yudao.module.llm.controller.admin.application.vo.ApplicationSa
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.conversation.vo.*;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.conversation.vo.ChatReqVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.datarefluxdata.vo.DataRefluxDataSaveReqVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.knowledgebase.vo.KnowledgeBaseSaveReqVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.knowledgebase.vo.KnowledgeHitRateTestReqVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.knowledgebase.vo.KnowledgeHitRateTestResultVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo.PromptTemplatesRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo.PromptTemplatesSaveReqVO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.conversation.ConversationDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.knowledgedocuments.KnowledgeDocumentsDO;
|
||||
@ -341,6 +339,49 @@ public class ConversationServiceImpl implements ConversationService {
|
||||
publicModelChatStream(chatReqVO, emitter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void chatStreamModal(ChatReqVO chatReqVO, SseEmitter emitter, HttpServletResponse response) {
|
||||
log.info("开始处理对话请求,请求参数: {}", chatReqVO);
|
||||
// 检查系统提示信息,如果为空则尝试从应用中获取
|
||||
if (chatReqVO.getSystemPrompt() == null || chatReqVO.getSystemPrompt().isEmpty()) {
|
||||
if (chatReqVO.getApplicationId() != null) {
|
||||
log.info("系统提示信息为空,尝试从应用中获取,应用 ID: {}", chatReqVO.getApplicationId());
|
||||
ApplicationRespVO application = applicationService.getApplication(chatReqVO.getApplicationId());
|
||||
List<String> messageHistoryList = stringRedisTemplate.opsForList().range(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), 0, -1);
|
||||
if (CollectionUtils.isEmpty(messageHistoryList)) {
|
||||
log.info("聊天历史记录为空,更新应用聊天计数");
|
||||
application.setChatCount(application.getChatCount() + 1);
|
||||
ApplicationSaveReqVO applicationSaveReqVO = BeanUtil.toBean(application, ApplicationSaveReqVO.class);
|
||||
applicationService.updateApplication(applicationSaveReqVO);
|
||||
}
|
||||
|
||||
|
||||
// 知识库ID
|
||||
if (application.getModelServiceId() != null) {
|
||||
chatReqVO.setKnowledge(application.getModelServiceId());
|
||||
}
|
||||
|
||||
if (!org.apache.commons.lang3.StringUtils.isBlank(application.getPrompt())) {
|
||||
chatReqVO.setSystemPrompt(application.getPrompt());
|
||||
if (chatReqVO.getSystemPrompt() == null || chatReqVO.getSystemPrompt().isEmpty()) {
|
||||
log.info("应用中未找到系统提示信息,使用默认提示信息");
|
||||
chatReqVO.setSystemPrompt(PROMPT);
|
||||
}
|
||||
}
|
||||
|
||||
Optional.ofNullable(application.getPromptId()).ifPresent(promptId -> {
|
||||
PromptTemplatesRespVO promptTemplates = promptTemplatesService.getPromptTemplates(promptId);
|
||||
int count = Math.max(1, Optional.ofNullable(promptTemplates.getUseCount()).orElse(0) + 1);
|
||||
promptTemplatesService.updatePromptTemplatesUseCount(Math.toIntExact(promptId),count);
|
||||
});
|
||||
|
||||
log.info("已更新系统提示信息为: {}", chatReqVO.getSystemPrompt());
|
||||
}
|
||||
}
|
||||
// 调用公共模型聊天流式处理方法
|
||||
publicModelChatStreamModal(chatReqVO, emitter);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取段落命中率
|
||||
*
|
||||
@ -547,6 +588,180 @@ public class ConversationServiceImpl implements ConversationService {
|
||||
log.info("数据回流信息保存完成");
|
||||
}
|
||||
|
||||
public void publicModelChatStreamModal(ChatReqVO chatReqVO, SseEmitter emitter) {
|
||||
log.info("开始公共模型聊天流式处理,请求参数: {}", chatReqVO);
|
||||
// 检查 UUID 是否为空,若为空则生成一个
|
||||
String uuid = chatReqVO.getUuid();
|
||||
if (StrUtil.isBlank(uuid)) {
|
||||
log.info("UUID 为空,生成新的 UUID");
|
||||
uuid = UUID.randomUUID().toString();
|
||||
chatReqVO.setUuid(uuid);
|
||||
}
|
||||
|
||||
// 为每一次对话设置ID
|
||||
String groupId = UUID.randomUUID().toString();
|
||||
chatReqVO.setGroupId(groupId);
|
||||
|
||||
String model = null;
|
||||
String selfModelUrl = "";
|
||||
// 根据模型类型获取模型信息
|
||||
if (Objects.equals(1, chatReqVO.getModelType())) {
|
||||
log.info("使用预制模型,模型 ID: {}", chatReqVO.getModelId());
|
||||
BaseModelDO baseModelDO = baseModelService.getBaseModel(chatReqVO.getModelId());
|
||||
if (baseModelDO == null) {
|
||||
log.error("预制模型不存在,模型 ID: {}", chatReqVO.getModelId());
|
||||
try {
|
||||
emitter.completeWithError(new RuntimeException("BASE_MODEL_NOT_EXISTS"));
|
||||
} catch (Exception e) {
|
||||
log.error("无法完成 SseEmitter 错误处理", e);
|
||||
}
|
||||
return;
|
||||
}
|
||||
selfModelUrl = baseModelDO.getChatUrl();
|
||||
model = baseModelDO.getAigcModelName();
|
||||
log.info("获取到预制模型信息,模型名称: {}, 聊天 URL: {}", model, selfModelUrl);
|
||||
} else if (Objects.equals(0, chatReqVO.getModelType())) {
|
||||
log.info("使用自定义模型,模型 ID: {}", chatReqVO.getModelId());
|
||||
ModelServiceDO modelServiceDO = modelServiceMapper.selectById(chatReqVO.getModelId());
|
||||
if (modelServiceDO == null) {
|
||||
log.error("自定义模型服务不存在,模型 ID: {}", chatReqVO.getModelId());
|
||||
try {
|
||||
emitter.completeWithError(new RuntimeException("MODEL_SERVICE_NOT_EXISTS"));
|
||||
} catch (Exception e) {
|
||||
log.error("无法完成 SseEmitter 错误处理", e);
|
||||
}
|
||||
return;
|
||||
}
|
||||
model = modelServiceDO.getBaseModelName();
|
||||
selfModelUrl = modelServiceDO.getModelUrl();
|
||||
log.info("获取到自定义模型信息,模型名称: {}, 模型 URL: {}", model, selfModelUrl);
|
||||
} else {
|
||||
log.error("无效的模型类型,模型类型: {}", chatReqVO.getModelType());
|
||||
try {
|
||||
emitter.completeWithError(new RuntimeException("BASE_MODEL_NOT_EXISTS"));
|
||||
} catch (Exception e) {
|
||||
log.error("无法完成 SseEmitter 错误处理", e);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
List<ModelCompletionsModalReqVO.ModelCompletionsMessageModal> messages = new ArrayList<>();
|
||||
String systemPrompt = "";
|
||||
String knowledgeBaseString = "";
|
||||
if (chatReqVO.getKnowledge() != null) {
|
||||
StringBuilder knowledgeBase = getKnowledgeBase(chatReqVO);
|
||||
knowledgeBaseString = knowledgeBase.toString();
|
||||
|
||||
// 处理 knowledgeBaseString
|
||||
if (StringUtils.isNotBlank(knowledgeBaseString)) {
|
||||
knowledgeBaseString = "<context>" + knowledgeBaseString + "</context>";
|
||||
} else {
|
||||
knowledgeBaseString = "<context>" + "</context>";
|
||||
}
|
||||
|
||||
// 处理 systemPrompt
|
||||
systemPrompt = StringUtils.isBlank(chatReqVO.getSystemPrompt())
|
||||
? PROMPT
|
||||
: chatReqVO.getSystemPrompt() + " \n " + PROMPT;
|
||||
}
|
||||
String mess = systemPrompt + " \n " + knowledgeBaseString;
|
||||
|
||||
if (chatReqVO.getKnowledge() != null) {
|
||||
log.info("不存在聊天历史记录,创建新的系统消息");
|
||||
ModelCompletionsModalReqVO.ModelCompletionsMessageModal systemMessage = new ModelCompletionsModalReqVO.ModelCompletionsMessageModal();
|
||||
systemMessage.setRole("system");
|
||||
com.alibaba.fastjson.JSONArray jsonarray=new com.alibaba.fastjson.JSONArray();
|
||||
jsonarray.add(mess);
|
||||
systemMessage.setContent(jsonarray);
|
||||
stringRedisTemplate.opsForList().rightPush(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), JsonUtils.toJsonString(systemMessage));
|
||||
// messages.add(systemMessage);
|
||||
} else {
|
||||
// 查询历史记录消息,并将查询出来的知识信息放入到 role = system 的消息中
|
||||
List<String> messageHistoryList = stringRedisTemplate.opsForList().range(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), 0, -1);
|
||||
if (messageHistoryList != null && !messageHistoryList.isEmpty()) {
|
||||
log.info("存在聊天历史记录,处理历史记录消息");
|
||||
for (String messageHistory : messageHistoryList) {
|
||||
ModelCompletionsModalReqVO.ModelCompletionsMessageModal modelCompletionsMessage = JsonUtils.parseObject(messageHistory, ModelCompletionsModalReqVO.ModelCompletionsMessageModal.class);
|
||||
if ("system".equals(modelCompletionsMessage.getRole())) {
|
||||
com.alibaba.fastjson.JSONArray jsonarray=new com.alibaba.fastjson.JSONArray();
|
||||
jsonarray.add(mess);
|
||||
modelCompletionsMessage.setContent(jsonarray);
|
||||
stringRedisTemplate.opsForList().set(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), 0, JsonUtils.toJsonString(modelCompletionsMessage));
|
||||
}
|
||||
// messages.add(modelCompletionsMessage);
|
||||
}
|
||||
}
|
||||
// else {
|
||||
// log.info("不存在聊天历史记录,创建新的系统消息");
|
||||
// ModelCompletionsReqVO.ModelCompletionsMessage systemMessage = new ModelCompletionsReqVO.ModelCompletionsMessage();
|
||||
// systemMessage.setRole("system");
|
||||
// systemMessage.setContent(mess);
|
||||
// stringRedisTemplate.opsForList().rightPush(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), JsonUtils.toJsonString(systemMessage));
|
||||
// messages.add(systemMessage);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
// 创建用户消息
|
||||
ModelCompletionsModalReqVO.ModelCompletionsMessageModal message = new ModelCompletionsModalReqVO.ModelCompletionsMessageModal();
|
||||
message.setRole("user");
|
||||
com.alibaba.fastjson.JSONArray contentJsonArray=new com.alibaba.fastjson.JSONArray();
|
||||
JSONObject textcontentJson=new JSONObject();
|
||||
textcontentJson.put("type","text");
|
||||
String msg="";
|
||||
if(!"".equals(systemPrompt)){
|
||||
msg=msg+systemPrompt;
|
||||
}
|
||||
if(!"".equals(knowledgeBaseString)){
|
||||
msg=msg+"知识信息:{"+knowledgeBaseString+"}";
|
||||
}
|
||||
textcontentJson.put("text",msg+chatReqVO.getPrompt());
|
||||
contentJsonArray.add(textcontentJson);
|
||||
List<String> imagesList = chatReqVO.getImagesList();
|
||||
if(imagesList!=null&&imagesList.size()>0){
|
||||
JSONObject imagecontentJson=new JSONObject();
|
||||
imagecontentJson.put("type","image_url");
|
||||
JSONObject imageurljson=new JSONObject();
|
||||
imageurljson.put("url",imagesList.get(0));
|
||||
imagecontentJson.put("image_url",imageurljson);
|
||||
contentJsonArray.add(imagecontentJson);
|
||||
}
|
||||
message.setContent(contentJsonArray);
|
||||
messages.add(message);
|
||||
|
||||
// 构建模型补全请求对象
|
||||
ModelCompletionsModalReqVO modelCompletionsReqVO = new ModelCompletionsModalReqVO();
|
||||
modelCompletionsReqVO.setMessages(messages);
|
||||
modelCompletionsReqVO.setModel(model);
|
||||
modelCompletionsReqVO.setTemperature(chatReqVO.getTemperature());
|
||||
modelCompletionsReqVO.setTop_p(chatReqVO.getTopP());
|
||||
modelCompletionsReqVO.setMax_tokens(chatReqVO.getMaxTokens());
|
||||
// log.info("构建模型补全请求对象,请求参数1: {}", modelCompletionsReqVO);
|
||||
System.out.println("-----------------整体请求参数"+JSONObject.toJSON(modelCompletionsReqVO));
|
||||
// 调用模型服务进行流式处理
|
||||
ModelCompletionsRespVO modelCompletionsRespVO = modelService.modelCompletionsStreamModal(selfModelUrl, modelCompletionsReqVO, emitter, chatReqVO.getUuid(), chatReqVO.getGroupId(), knowledgeBaseString);
|
||||
if (modelCompletionsRespVO == null) {
|
||||
throw exception(MODEL_COMPLETIONS_ERROR);
|
||||
}
|
||||
// 将用户消息存入缓存
|
||||
stringRedisTemplate.opsForList().rightPush(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), JsonUtils.toJsonString(message));
|
||||
ModelCompletionsReqVO.ModelCompletionsMessage responseMessage = new ModelCompletionsReqVO.ModelCompletionsMessage();
|
||||
responseMessage.setRole("assistant");
|
||||
responseMessage.setContent(modelCompletionsRespVO.getAnswer());
|
||||
stringRedisTemplate.opsForList().rightPush(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), JsonUtils.toJsonString(responseMessage));
|
||||
// 保存数据回流信息
|
||||
DataRefluxDataSaveReqVO dataRefluxDataSaveReqVO = new DataRefluxDataSaveReqVO();
|
||||
dataRefluxDataSaveReqVO.setModelServiceId(chatReqVO.getModelId());
|
||||
dataRefluxDataSaveReqVO.setModelType(chatReqVO.getModelType());
|
||||
dataRefluxDataSaveReqVO.setPrompt(chatReqVO.getPrompt());
|
||||
dataRefluxDataSaveReqVO.setSystem(modelCompletionsRespVO.getSystem());
|
||||
dataRefluxDataSaveReqVO.setResponse(modelCompletionsRespVO.getAnswer().replaceAll("(?s)<think>.*?</think>", "").trim());
|
||||
dataRefluxDataSaveReqVO.setMaxTokens(chatReqVO.getMaxTokens());
|
||||
dataRefluxDataSaveReqVO.setTemperature(chatReqVO.getTemperature());
|
||||
dataRefluxDataService.saveDataRefluxData(dataRefluxDataSaveReqVO);
|
||||
log.info("数据回流信息保存完成");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private StringBuilder getKnowledgeBase(ChatReqVO chatReqVO) {
|
||||
final String LOG_PREFIX = "[KnowledgeBase]";
|
||||
@ -582,7 +797,9 @@ public class ConversationServiceImpl implements ConversationService {
|
||||
|
||||
log.info("{} 知识库构建完成,内容长度: {}", LOG_PREFIX, knowledgeBase.length());
|
||||
} catch (Exception e) {
|
||||
|
||||
log.error("{} 知识库处理异常: {}", LOG_PREFIX, e.getMessage(), e);
|
||||
e.printStackTrace();
|
||||
throw new ServiceException(100, "知识库处理失败,请稍后重试");
|
||||
}
|
||||
|
||||
|
@ -199,6 +199,7 @@ public class DatasetServiceImpl implements DatasetService {
|
||||
List<DatasetFilesSaveReqVO> datasetFiles = createReqVO.getDatasetFiles();
|
||||
// 插入
|
||||
DatasetDO dataset = BeanUtils.toBean(createReqVO, DatasetDO.class);
|
||||
dataset.setStatus(2);
|
||||
datasetMapper.insert(dataset);
|
||||
|
||||
if (CollectionUtils.isNotEmpty(datasetFiles)) {
|
||||
@ -288,6 +289,7 @@ public class DatasetServiceImpl implements DatasetService {
|
||||
qdo.setQuestion(question);
|
||||
qdo.setCreateTime(LocalDateTime.now());
|
||||
qdo.setQuestionFrom(questionFrom);
|
||||
qdo.setStatus(2);
|
||||
datasetQuestionMapper.insert(qdo);
|
||||
//获取回答数据
|
||||
JSONObject conversationsAnswerJson=conversationsJsonArray.getJSONObject(j+1);
|
||||
|
@ -34,8 +34,17 @@ public class DatasetTaskSyncService {
|
||||
List<DatasetDO> datasetList = datasetMapper.selectList(wrapper);
|
||||
log.info("[syncDatasetAigcTask][开始同步任务,数据集数量:{}]", datasetList.size());
|
||||
datasetList.forEach(datasetDO -> {
|
||||
List<DatasetQuestionRespVO> datasetQuestionList = datasetQuestionService.getDatasetQuestionList(datasetDO.getId());
|
||||
dataSetService.JsonFileWrite(datasetDO,datasetQuestionList);
|
||||
Integer datasetParentType = datasetDO.getDatasetParentType();
|
||||
//文本数据集
|
||||
if(datasetParentType==1){
|
||||
List<DatasetQuestionRespVO> datasetQuestionList = datasetQuestionService.getDatasetQuestionList(datasetDO.getId());
|
||||
dataSetService.JsonFileWrite(datasetDO,datasetQuestionList);
|
||||
}else{
|
||||
String dataname=datasetDO.getDatasetName();
|
||||
//获取多模态数据集上传zip文件的路径地址
|
||||
dataSetService.sendDatasetModal(datasetDO.getId(),dataname);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -103,6 +103,42 @@ public class FineTuningTaskHttpService {
|
||||
|
||||
// 发起 HTTP 请求
|
||||
log.debug("正在发起 HTTP POST 请求...");
|
||||
System.out.println("---------------请求参数"+JSON.toJSONString(req));
|
||||
String res = HttpUtils.post(requestUrl, headers, JSON.toJSONString(req));
|
||||
log.info("HTTP 请求完成。响应内容: {}", res);
|
||||
|
||||
// 解析响应
|
||||
log.debug("正在解析响应内容...");
|
||||
AigcRespVO aigcRespVO = JSON.parseObject(res, AigcRespVO.class);
|
||||
AigcFineTuningCreateRespVO aigcFineTuningCreateRespVO = JSON.parseObject(res, AigcFineTuningCreateRespVO.class);
|
||||
log.info("响应解析完成。微调任务创建结果: {}", JSON.toJSONString(aigcFineTuningCreateRespVO));
|
||||
|
||||
// 返回结果
|
||||
return aigcFineTuningCreateRespVO;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("创建微调任务时发生异常。请求URL: {}", requestUrl, e);
|
||||
handleHttpException(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public AigcFineTuningCreateRespVO finetuningCreateModal (Map<String, String> headers, String url, AigcFineTuningCreateReqVO req) {
|
||||
// login(headers);
|
||||
// TODO: 在上个方法中已经将数据集的文件id赋予,调试时需要写死再放开
|
||||
// String fileId = "6237ed4d-a046-479c-80d6-8579a0283994";
|
||||
// req.setFileId(fileId);
|
||||
String requestUrl = url + llmBackendProperties.getFinetuningCreateModal();
|
||||
try {
|
||||
// 记录请求信息
|
||||
log.info("开始创建微调任务,请求URL: {}", requestUrl);
|
||||
log.info("请求头: {}", headers);
|
||||
log.info("请求体: {}", JSON.toJSONString(req));
|
||||
|
||||
// 发起 HTTP 请求
|
||||
log.debug("正在发起 HTTP POST 请求...");
|
||||
log.debug("请求参数为:---------------------------------"+JSON.toJSONString(req));
|
||||
System.out.println("请求参数为:---------------------------------"+JSON.toJSONString(req));
|
||||
String res = HttpUtils.post(requestUrl, headers, JSON.toJSONString(req));
|
||||
log.info("HTTP 请求完成。响应内容: {}", res);
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
@ -777,14 +777,14 @@ public class RagHttpService {
|
||||
|
||||
// 遍历 JSON 数组
|
||||
for (int i = 0; i < jsonArray.size(); i++) {
|
||||
JSONArray pairArray = jsonArray.getJSONArray(i);
|
||||
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
||||
|
||||
// 解析文档信息
|
||||
JSONObject documentJson = pairArray.getJSONObject(0);
|
||||
DocumentInfoVO document = JSON.parseObject(documentJson.toJSONString(), DocumentInfoVO.class);
|
||||
// JSONObject documentJson = jsonArray.getJSONObject(0);
|
||||
DocumentInfoVO document = JSON.parseObject(jsonObject.toJSONString(), DocumentInfoVO.class);
|
||||
|
||||
// 解析命中率
|
||||
Double rate = pairArray.getDoubleValue(1);
|
||||
Double rate = jsonObject.getDoubleValue("score");
|
||||
|
||||
if (rate >= score) {
|
||||
QueryResultPairVO pair = new QueryResultPairVO();
|
||||
@ -805,6 +805,61 @@ public class RagHttpService {
|
||||
|
||||
return results;
|
||||
}
|
||||
// private static List<QueryResultPairVO> parseHitRateTestResults (String json, Double score) {
|
||||
// boolean array = json.trim().startsWith("[");
|
||||
// // 先判断 JSON 是否是一个数组
|
||||
//
|
||||
// if (!array) {
|
||||
// // 判断是否存在 detail 字段
|
||||
// JSONObject jsonObject = JSON.parseObject(json);
|
||||
// if (jsonObject.containsKey("detail")) {
|
||||
// String detail = jsonObject.getString("detail");
|
||||
//
|
||||
// if (detail.contains("No documents found for the given query")) {
|
||||
// throw exception(new ErrorCode(100_100_1, "未找到符合条件的文档,请检查查询条件!"));
|
||||
// }
|
||||
// return new ArrayList<>();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// // 将 JSON 转换为 List<QueryResultPair>
|
||||
// // 解析 JSON 数组
|
||||
// JSONArray jsonArray = JSON.parseArray(json);
|
||||
//
|
||||
// // 创建结果列表
|
||||
// List<QueryResultPairVO> results = new ArrayList<>();
|
||||
//
|
||||
// // 遍历 JSON 数组
|
||||
// for (int i = 0; i < jsonArray.size(); i++) {
|
||||
// JSONArray pairArray = jsonArray.getJSONArray(i);
|
||||
//
|
||||
// // 解析文档信息
|
||||
// JSONObject documentJson = pairArray.getJSONObject(0);
|
||||
// DocumentInfoVO document = JSON.parseObject(documentJson.toJSONString(), DocumentInfoVO.class);
|
||||
//
|
||||
// // 解析命中率
|
||||
// Double rate = pairArray.getDoubleValue(1);
|
||||
//
|
||||
// if (rate >= score) {
|
||||
// QueryResultPairVO pair = new QueryResultPairVO();
|
||||
// pair.setDocument(document);
|
||||
// pair.setHitRate(rate);
|
||||
// results.add(pair);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// // // 访问数据
|
||||
// // for (QueryResultPairVO pair : results) {
|
||||
// // System.out.println("Page Content: " + pair.getDocument().getPageContent());
|
||||
// // System.out.println("Hit Rate: " + pair.getHitRate());
|
||||
// // System.out.println("File ID: " + pair.getDocument().getMetadata().getFileId());
|
||||
// // System.out.println("----------------------");
|
||||
// // }
|
||||
//
|
||||
// return results;
|
||||
// }
|
||||
|
||||
public static void main (String[] args) {
|
||||
List<String> ids = new ArrayList<>();
|
||||
|
@ -0,0 +1,35 @@
|
||||
package cn.iocoder.yudao.module.llm.service.http.vo;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
public class ModelCompletionsModalReqVO {
|
||||
|
||||
private String model;
|
||||
private List<ModelCompletionsMessageModal> messages;
|
||||
private Integer max_tokens;
|
||||
private Double temperature;
|
||||
private Double top_p;
|
||||
private Boolean stream;
|
||||
|
||||
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class ModelCompletionsMessageModal {
|
||||
|
||||
private String role;
|
||||
private JSONArray content;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package cn.iocoder.yudao.module.llm.service.http.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ModelCompletionsModalRespVO {
|
||||
|
||||
private String system;
|
||||
private String question;
|
||||
private String answer;
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package cn.iocoder.yudao.module.llm.service.http.vo;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
Binary file not shown.
@ -54,13 +54,12 @@ spring:
|
||||
url: jdbc:mysql://221.238.217.216:4156/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
|
||||
redis:
|
||||
host: 127.0.0.1 # 地址
|
||||
port: 6379 # 端口
|
||||
database: 0 # 数据库索引
|
||||
# password: dev # 密码,建议生产环境开启
|
||||
password: 123456 # 密码,建议生产环境开启
|
||||
|
||||
--- #################### 定时任务相关配置 ####################
|
||||
|
||||
@ -247,6 +246,7 @@ justauth:
|
||||
llm:
|
||||
backend:
|
||||
#################### 8123: RAG服务、训练集和标注相关API。 ###################
|
||||
dataset_more_modal_api: http://221.238.217.216:4143/api/VL_files
|
||||
### RAG服务
|
||||
request_address: http://221.238.217.216:4143
|
||||
#RAG健康检查 GET
|
||||
@ -307,6 +307,7 @@ llm:
|
||||
# 微调文件上传
|
||||
aigc_file_upload: /api/files
|
||||
finetuning_create: /llm/finetuning
|
||||
finetuning_create_modal: /llm/finetuning-mm
|
||||
# 日志获取
|
||||
finetuning_log: /llm/get_log
|
||||
# 开始部署
|
||||
|
Loading…
x
Reference in New Issue
Block a user