Commit 6b8fd9bc authored by 赵啸非's avatar 赵啸非

修改配置文件

parent d77ca5b1
...@@ -193,13 +193,9 @@ ...@@ -193,13 +193,9 @@
<artifactId>poi-tl</artifactId> <artifactId>poi-tl</artifactId>
<version>1.12.0</version> <version>1.12.0</version>
</dependency> </dependency>
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.18</version>
<scope>provided</scope>
</dependency>-->
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId> <artifactId>junit-jupiter</artifactId>
...@@ -217,7 +213,11 @@ ...@@ -217,7 +213,11 @@
<version>2.2</version> <version>2.2</version>
</dependency> </dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies> </dependencies>
......
package com.mortals.xhx.base.system.message.impl; package com.mortals.xhx.base.system.message.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.mortals.framework.service.ICacheService; import com.mortals.framework.service.ICacheService;
import com.mortals.xhx.base.system.message.MessageService; import com.mortals.xhx.base.system.message.MessageService;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.webflux.req.RobotTransReq; import com.mortals.xhx.webflux.req.RobotTransReq;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.Delta;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
......
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
/**
* @author karlhoo
*/
@Data
public class ApiResp<T> {
/**
* 结果编码
*/
private int code;
/**
* 结果描述
*/
private String msg;
/**
* 响应数据
*/
private T data;
}
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class AudioItem{
private String src;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class ButtonItem{
private String link;
private String text;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class CustomItem{
private String type;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import java.util.List;
import lombok.Data;
@Data
public class Feed{
private List<ButtonItem> button;
private List<ImageItem> image;
private List<RelateItem> relate;
private String confidence;
private List<CustomItem> custom;
private String source;
private List<VideoItem> video;
private List<AudioItem> audio;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class ImageItem{
private String src;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class NlpItem{
private Feed feed;
private Slots slots;
private String agent;
private String domain;
private String action;
private String source;
private String intent;
private String englishDomain;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class RelateItem{
private String score;
private String src;
private String text;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import java.util.List;
import lombok.Data;
@Data
public class RobotTransResp{
private List<NlpItem> nlp;
private String query;
private String sn;
private int status;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class Slots{
private String answer;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class VideoItem{
private String src;
}
\ No newline at end of file
package com.mortals.xhx.thread;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.webflux.factory.FlowChatContext;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
/**
* 机器人响应消息
*
* @author: zxfei
* @date: 2025/3/19 20:36
*/
@AllArgsConstructor
@Slf4j
public class ChatMsgRspThread implements Runnable {
private FlowChatContext context;
/**
* 最大重试次数
*/
public final Integer MAX_RETRY_COUNT = 10;
@Override
public void run() {
log.info("快速响应线程开始,msgId:{}", context.getMsgId());
StringBuilder answer = context.getAnswer();
int reCount = 0;
while (reCount < MAX_RETRY_COUNT) {
if (!answer.toString().isEmpty()) {
log.info("快速响应线程结束 answer:{}", answer);
break;
}
//创建一个初始化的answer
JSONObject rspJson = new JSONObject();
rspJson.put("id", context.getMsgId());
rspJson.put("created", new Date().getTime());
rspJson.put("model", "");
JSONArray jsonArray = new JSONArray();
JSONObject obj = new JSONObject();
JSONObject delta = new JSONObject();
delta.put("role", "");
if(reCount == 0){
delta.put("role", "assistant");
}
delta.put("content", "");
obj.put("delta", delta);
obj.put("index", 0);
obj.put("finish_reason", "null");
jsonArray.add(obj);
rspJson.put("choices", jsonArray);
rspJson.put("object", "");
context.getEmitter().next(rspJson.toJSONString());
reCount++;
try {
Thread.sleep(1000);
} catch (InterruptedException interruptedException) {
}
}
}
}
...@@ -56,12 +56,40 @@ public class FlowChatSubscriber implements Subscriber<String>, Disposable { ...@@ -56,12 +56,40 @@ public class FlowChatSubscriber implements Subscriber<String>, Disposable {
@Override @Override
public void onNext(String data) { public void onNext(String data) {
String rsp = "";
try {
rsp = callBack.onNext(data, context);
if (ObjectUtils.isEmpty(rsp)) {
this.stopFlag = true;
}
// log.info(" onNext rsp:{}", rsp);
} catch (Exception e) {
log.error("流式问答异常:{}", e.getMessage());
} finally {
// todo 临时打印日志
// log.info("=============== data: {}", data);
if (stopFlag) {
log.info("stopFlag is true");
subscription.cancel();
onComplete();
} else {
// emitter.(msg);
// 将数据发送给前端 如果是起始包 需要要处理一下
emitter.next(rsp);
// 继续请求接收下一个数据项
subscription.request(1);
}
}
/* new Thread(() -> { // 需要异步执行,否则会阻塞
String rsp = "";
try { try {
data = callBack.onNext(data, context); rsp = callBack.onNext(data, context);
if(ObjectUtils.isEmpty(data)){ if (ObjectUtils.isEmpty(rsp)) {
this.stopFlag=true; this.stopFlag = true;
} }
log.info(" onNext data:{}", data); log.info(" onNext rsp:{}", rsp);
} catch (Exception e) { } catch (Exception e) {
log.error("流式问答异常:{}", e.getMessage()); log.error("流式问答异常:{}", e.getMessage());
} finally { } finally {
...@@ -72,12 +100,17 @@ public class FlowChatSubscriber implements Subscriber<String>, Disposable { ...@@ -72,12 +100,17 @@ public class FlowChatSubscriber implements Subscriber<String>, Disposable {
subscription.cancel(); subscription.cancel();
onComplete(); onComplete();
} else { } else {
// emitter.(msg);
// 将数据发送给前端 如果是起始包 需要要处理一下 // 将数据发送给前端 如果是起始包 需要要处理一下
emitter.next(data); emitter.next(rsp);
// 继续请求接收下一个数据项 // 继续请求接收下一个数据项
subscription.request(1); subscription.request(1);
} }
} }
}).start();*/
} }
@Override @Override
......
...@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Value; ...@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
...@@ -54,15 +55,14 @@ public class BaseChatService extends AbstractFlowChatTemplate { ...@@ -54,15 +55,14 @@ public class BaseChatService extends AbstractFlowChatTemplate {
if (StrUtil.equals("[DONE]", data)) {//[DONE]是消息结束标识 if (StrUtil.equals("[DONE]", data)) {//[DONE]是消息结束标识
return null; return null;
} }
// 解析响应数据项 // 解析响应数据项
JSONObject bodyJson = JSONObject.parseObject(data); JSONObject bodyJson = JSONObject.parseObject(data);
if (bodyJson == null) { if (bodyJson == null) {
return data; return data;
} }
// String id = bodyJson.getString("id");
if (num == 0) { /*if(ObjectUtils.isEmpty(context.getAnswer())){
//创建一个初始化的answer
JSONObject rspJson = new JSONObject(); JSONObject rspJson = new JSONObject();
rspJson.put("id", context.getMsgId()); rspJson.put("id", context.getMsgId());
rspJson.put("created", new Date().getTime()); rspJson.put("created", new Date().getTime());
...@@ -83,17 +83,22 @@ public class BaseChatService extends AbstractFlowChatTemplate { ...@@ -83,17 +83,22 @@ public class BaseChatService extends AbstractFlowChatTemplate {
rspJson.put("choices", jsonArray); rspJson.put("choices", jsonArray);
rspJson.put("object", ""); rspJson.put("object", "");
num++; context.getAnswer().append(".");
context.getEmitter().next(rspJson.toJSONString()); context.getEmitter().next(rspJson.toJSONString());
} }
/* String status = bodyJson.getString("status"); */
if ("running".equals(status)) {
//计数器重置 // context.getAnswer().append(answer);
//this.num=0;
//构建第一个数据响应包 // String id = bodyJson.getString("id");
/* if (num == 0) {
JSONObject rspJson = new JSONObject(); JSONObject rspJson = new JSONObject();
rspJson.put("id", context.getMsgId()); rspJson.put("id", context.getMsgId());
rspJson.put("created", new Date().getTime()); rspJson.put("created", new Date().getTime());
rspJson.put("model", "");
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
JSONObject obj = new JSONObject(); JSONObject obj = new JSONObject();
...@@ -102,9 +107,15 @@ public class BaseChatService extends AbstractFlowChatTemplate { ...@@ -102,9 +107,15 @@ public class BaseChatService extends AbstractFlowChatTemplate {
delta.put("role", "assistant"); delta.put("role", "assistant");
delta.put("content", ""); delta.put("content", "");
obj.put("delta", delta); obj.put("delta", delta);
obj.put("index", 0);
obj.put("finish_reason", "null");
jsonArray.add(obj); jsonArray.add(obj);
rspJson.put("delta", jsonArray); rspJson.put("choices", jsonArray);
return rspJson.toJSONString(); rspJson.put("object", "");
num++;
context.getEmitter().next(rspJson.toJSONString());
}*/ }*/
JSONArray choices = bodyJson.getJSONArray("choices"); JSONArray choices = bodyJson.getJSONArray("choices");
......
package com.mortals.xhx.webflux.template; package com.mortals.xhx.webflux.template;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.thread.ChatMsgRspThread;
import com.mortals.xhx.webflux.common.CommonError; import com.mortals.xhx.webflux.common.CommonError;
import com.mortals.xhx.webflux.common.JsonUtils; import com.mortals.xhx.webflux.common.JsonUtils;
import com.mortals.xhx.webflux.factory.*; import com.mortals.xhx.webflux.factory.*;
...@@ -57,6 +59,11 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal ...@@ -57,6 +59,11 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal
log.info("subscriberMap in AbstractChatService after put: " + JsonUtils.toJson(subscriberMap)); log.info("subscriberMap in AbstractChatService after put: " + JsonUtils.toJson(subscriberMap));
response.subscribe(subscriber); response.subscribe(subscriber);
emitter.onDispose(subscriber); emitter.onDispose(subscriber);
ChatMsgRspThread chatMsgRspThread = new ChatMsgRspThread(context);
ThreadPool.getInstance().execute(chatMsgRspThread);
}); });
} }
...@@ -104,7 +111,7 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal ...@@ -104,7 +111,7 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal
*/ */
private Flux<String> doRequest(FlowChatContext context, FLowChatRequest request, HttpHeaders headers) { private Flux<String> doRequest(FlowChatContext context, FLowChatRequest request, HttpHeaders headers) {
log.info("请求大模型开始,URL:{}, 参数:{}", request.getUrl(), request.getJsonBody()); log.info("请求大模型开始,URL:{}, 参数:{}", request.getUrl(), request.getJsonBody());
return webClient.post() Flux<String> flux = webClient.post()
.uri(request.getUrl()) .uri(request.getUrl())
.accept(MediaType.TEXT_EVENT_STREAM) .accept(MediaType.TEXT_EVENT_STREAM)
.headers(httpHeaders -> httpHeaders.addAll(headers)) .headers(httpHeaders -> httpHeaders.addAll(headers))
...@@ -121,6 +128,11 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal ...@@ -121,6 +128,11 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal
log.error("系统异常", ex); log.error("系统异常", ex);
return Flux.just(JsonUtils.toJson(buildAnswer(CommonError.GLOBAL_ERROR.getMsg()))); return Flux.just(JsonUtils.toJson(buildAnswer(CommonError.GLOBAL_ERROR.getMsg())));
}); });
//如果一定时间未收到响应,则模拟响应数据回写
return flux;
} }
/** /**
......
...@@ -32,7 +32,7 @@ public class TestRot { ...@@ -32,7 +32,7 @@ public class TestRot {
" \"messages\": [\n" + " \"messages\": [\n" +
" {\n" + " {\n" +
" \"role\": \"user\",\n" + " \"role\": \"user\",\n" +
" \"content\": \"今天天气怎么样?\"\n" + " \"content\": \"你有什么能力?\"\n" +
" }\n" + " }\n" +
" ],\n" + " ],\n" +
" \"max_tokens\": 2048,\n" + " \"max_tokens\": 2048,\n" +
...@@ -51,7 +51,7 @@ public class TestRot { ...@@ -51,7 +51,7 @@ public class TestRot {
Request request = new Request.Builder() Request request = new Request.Builder()
.url("http://localhost:18006/chat/base") .url("http://localhost:18006/chat/base")
// .url("http://robot.scsmile.cn/chat/base") //.url("http://robot.scsmile.cn/chat/base")
.headers(headers) .headers(headers)
.post(requestBody) .post(requestBody)
.build(); .build();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment