diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java index 6af8deb6e..c5ca4c47e 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java @@ -419,11 +419,16 @@ public class ConversationServiceImpl implements ConversationService { log.info("构建模型补全请求对象,请求参数1: {}", modelCompletionsReqVO); // 调用模型服务进行流式处理 - modelService.modelCompletionsStream(selfModelUrl, modelCompletionsReqVO, emitter); - + ModelCompletionsRespVO modelCompletionsRespVO = modelService.modelCompletionsStream(selfModelUrl, modelCompletionsReqVO, emitter,chatReqVO.getUuid()); + 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()); diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java index c73558473..267e75a4b 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java @@ -146,17 +146,63 @@ public class ModelService { * @param url 模型服务的 URL * @param req 模型补全请求对象 */ - public void modelCompletionsStream (String url, ModelCompletionsReqVO req, SseEmitter emitter) { + public ModelCompletionsRespVO modelCompletionsStream (String url, ModelCompletionsReqVO req, SseEmitter emitter, String uuid) { req.setStream(true); - log.info("开始处理模型补全请求,参数2: {}", req); + log.info("开始处理模型补全请求"); + + // 检查模型是否为空,若为空则设置默认模型 + if (StringUtils.isBlank(req.getModel())) { + log.debug("模型ID为空,设置为默认模型: {}", DEFAULT_MODEL_ID); + req.setModel(DEFAULT_MODEL_ID); + } + + // 记录请求信息 + log.info("请求参数: {}", JSON.toJSONString(req)); + if (StringUtils.isBlank(url)) { + log.info("URL为空,使用默认URL: {}", llmBackendProperties.getModelCompletions()); + url = llmBackendProperties.getModelCompletions(); + } else { + log.info("使用指定URL: {}", url); + } + try { String jsonString = JSON.toJSONString(req); log.info("开始处理模型补全请求,参数3: {}", jsonString); - sendPostRequest(url, jsonString, emitter); + sendPostRequest(url, jsonString, emitter, uuid); } catch (Exception e) { emitter.completeWithError(e); } + + // 解析响应内容 +// log.info("正在解析响应内容..."); +// ChatCompletion chatCompletion = JSON.parseObject(result, ChatCompletion.class); +// +// // 检查响应内容是否包含错误信息 +// if (StringUtils.isBlank(chatCompletion.getDetail())) { +// log.info("响应内容无错误信息,提取回答内容..."); +// +// // 提取回答内容 +// String respContent = chatCompletion.getChoices().get(0).getMessage().getContent(); +// String patternString = "(.*?)"; +// Pattern pattern = Pattern.compile(patternString, Pattern.DOTALL); +// Matcher matcher = pattern.matcher(respContent); +// String answerContent = matcher.replaceAll(""); +// +// // 构建返回对象 +// ModelCompletionsRespVO respVO = new ModelCompletionsRespVO(); +// respVO.setSystem("助手"); +// respVO.setQuestion(req.getMessages().get(req.getMessages().size() - 1).getContent()); +// respVO.setAnswer(answerContent); +// +// log.info("模型补全请求处理成功。返回结果: {}", JSON.toJSONString(respVO)); +// return respVO; +// +// } else { +// log.warn("响应内容包含错误信息,返回 null"); +// return null; +// } + return null; } /** @@ -166,7 +212,7 @@ public class ModelService { * @param requestBody 请求体内容 * @throws IOException 发送请求或处理响应时可能抛出的 IO 异常 */ - private void sendPostRequest (String apiUrl, String requestBody, SseEmitter emitter) throws IOException { + private void sendPostRequest (String apiUrl, String requestBody, SseEmitter emitter, String uuid) throws IOException { // 创建 HttpClient 实例 HttpClient httpClient = HttpClients.createDefault(); @@ -180,7 +226,7 @@ public class ModelService { HttpResponse response = httpClient.execute(httpPost); // 处理响应实体 - handleResponseEntity(response, emitter); + handleResponseEntity(response, emitter, uuid); } /** @@ -199,7 +245,7 @@ public class ModelService { // 设置请求体 httpPost.setEntity(entity); // 设置请求头,指定请求体的内容类型为 JSON -// httpPost.setHeader("Content-Type", "application/json"); + // httpPost.setHeader("Content-Type", "application/json"); httpPost.setHeader("Accept-Encoding", "gzip, deflate, br"); httpPost.setHeader("Accept", "*/*"); httpPost.setHeader("Connection", "keep-alive"); @@ -209,9 +255,8 @@ public class ModelService { * 处理响应实体 * * @param response HttpResponse 对象 - * @throws IOException 读取响应实体输入流时可能抛出的 IO 异常 */ - private void handleResponseEntity (HttpResponse response, SseEmitter emitter) throws IOException { + private void handleResponseEntity (HttpResponse response, SseEmitter emitter, String uuid) { // 获取响应实体 HttpEntity responseEntity = response.getEntity(); @@ -223,10 +268,10 @@ public class ModelService { if (StringUtils.isBlank(line)) { continue; } - line = line.replaceAll("\n", " "); + log.info("接收到的响应行数据: {}", line); line = line.replaceAll("\n", " "); - String content = parseStreamLine(line); + String content = parseStreamLine(line, uuid); if (content != null) { emitter.send(SseEmitter.event() .data(content, MediaType.TEXT_EVENT_STREAM) @@ -250,7 +295,7 @@ public class ModelService { * @param line 流式响应中的单行JSON数据 * @return 处理后的文本内容(若无有效内容返回null) */ - private String parseStreamLine (String line) { + private String parseStreamLine (String line, String uuid) { if (StringUtils.isNotBlank(line)) { if (line.startsWith("data: ")) { String dataString = extractJsonFromDataString(line); @@ -266,11 +311,21 @@ public class ModelService { if (delta != null) { // 获取 content 的值 String content = delta.getString("content"); - return "{\"content\":\"" + content + "\",\"finish_reason\":\"" + false + "\"}"; + content = content.replaceAll("\n", " "); + ChatReqVO chatReqVO = new ChatReqVO(); + chatReqVO.setUuid(""); + chatReqVO.setContent(content); + chatReqVO.setFinish_reason(false); + return JSON.toJSONString(chatReqVO); } } } else { - return "{\"content\":\"" + "\",\"finish_reason\":\"" + true + "\"}"; + + ChatReqVO chatReqVO = new ChatReqVO(); + chatReqVO.setUuid(uuid); + chatReqVO.setContent(""); + chatReqVO.setFinish_reason(true); + return JSON.toJSONString(chatReqVO); } } }