refactor(yudao-module-llm): 重构模型补全请求处理逻辑
- 修改 modelCompletionsStream 方法返回类型为 ModelCompletionsRespVO -增加对空模型和 URL 的处理 - 记录请求和响应信息 - 优化 SseEmitter 发送数据格式 -重构 parseStreamLine 方法,增加 UUID 参数
This commit is contained in:
parent
d1cb2c2b5a
commit
1a320c6260
@ -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());
|
||||
|
@ -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 = "(<think>.*?</think>)";
|
||||
// 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();
|
||||
|
||||
@ -226,7 +271,7 @@ public class ModelService {
|
||||
|
||||
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);
|
||||
@ -267,11 +312,20 @@ public class ModelService {
|
||||
// 获取 content 的值
|
||||
String content = delta.getString("content");
|
||||
content = content.replaceAll("\n", " ");
|
||||
return "{\"content\":\"" + content + "\",\"finish_reason\":\"" + false + "\"}";
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user