Bläddra i källkod

yinruoxi

添加:
    1.引入Tlog框架
    2.标注NLTlog
tags/B.2.8.3_20240316_release
kira 1 år sedan
förälder
incheckning
8c3093321f
8 ändrade filer med 154 tillägg och 10 borttagningar
  1. +1
    -0
      pom.xml
  2. +4
    -0
      xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/response/DmIntentResponse.java
  3. +6
    -0
      xueyi-common/xueyi-common-log/pom.xml
  4. +2
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebSocketClientManager.java
  5. +2
    -0
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/listener/LlmWebSocketListener.java
  6. +130
    -6
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmIntentController.java
  7. +7
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/MarkRecordVo.java
  8. +2
    -2
      xueyi-modules/xueyi-nlt/src/main/resources/logback.xml

+ 1
- 0
pom.xml Visa fil

@@ -48,6 +48,7 @@
<sonar.password>Digimeta@2023</sonar.password>
<jakarta-json.version>2.0.1</jakarta-json.version>
<elasticsearch.version>8.3.3</elasticsearch.version>
<tlog.version>1.5.1</tlog.version>
</properties>

<!-- 依赖声明 -->


+ 4
- 0
xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/response/DmIntentResponse.java Visa fil

@@ -24,6 +24,10 @@ public class DmIntentResponse implements Serializable {

private String motion;

private String type;

private String hit;

public void clear() {
this.msg = null;
this.skillCode = null;


+ 6
- 0
xueyi-common/xueyi-common-log/pom.xml Visa fil

@@ -22,6 +22,12 @@
<groupId>com.xueyi</groupId>
<artifactId>xueyi-common-security</artifactId>
</dependency>

<dependency>
<groupId>com.yomahub</groupId>
<artifactId>tlog-all-spring-boot-starter</artifactId>
<version>${tlog.version}</version>
</dependency>
</dependencies>
</project>

+ 2
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebSocketClientManager.java Visa fil

@@ -3,6 +3,7 @@ package com.xueyi.nlt.netty.client;
import com.xueyi.nlt.netty.client.listener.LlmWebSocketListener;
import com.xueyi.nlt.nlt.domain.LlmContext;
import com.xueyi.nlt.nlt.domain.LlmParam;
import com.yomahub.tlog.okhttp.TLogOkHttpInterceptor;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,7 +48,7 @@ public class WebSocketClientManager {
@PostConstruct
public void init() {
ConnectionPool okHttpConnectionPool = new ConnectionPool(MAX_CONCURRENT_CONNECTIONS, KEEP_ALIVE_TIME, TimeUnit.SECONDS);
client = new OkHttpClient.Builder().connectionPool(okHttpConnectionPool).build();
client = new OkHttpClient.Builder().connectionPool(okHttpConnectionPool).addInterceptor(new TLogOkHttpInterceptor()).build();
connectionPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
}



+ 2
- 0
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/listener/LlmWebSocketListener.java Visa fil

@@ -12,6 +12,7 @@ import com.xueyi.nlt.netty.server.config.ServerConfig;
import com.xueyi.nlt.nlt.domain.LlmContent;
import com.xueyi.nlt.nlt.domain.LlmContext;
import com.xueyi.nlt.nlt.domain.LlmParam;
import com.yomahub.tlog.core.annotation.TLogAspect;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import okhttp3.Response;
@@ -118,6 +119,7 @@ public class LlmWebSocketListener extends WebSocketListener {
).start();
}

@TLogAspect(str = "DGMAN-NLT")
@Override
public void onMessage(WebSocket webSocket, String text) {
super.onMessage(webSocket, text);


+ 130
- 6
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmIntentController.java Visa fil

@@ -18,11 +18,13 @@ import com.xueyi.common.core.web.validate.V_A;
import com.xueyi.common.core.web.validate.V_E;
import com.xueyi.common.log.annotation.Log;
import com.xueyi.common.log.enums.BusinessType;
import com.xueyi.common.mqtt.connection.MqttTemplate;
import com.xueyi.common.security.annotation.Logical;
import com.xueyi.common.security.annotation.RequiresPermissions;
import com.xueyi.common.security.utils.SecurityUtils;
import com.xueyi.common.web.entity.controller.BaseController;
import com.xueyi.nlt.api.netty.domain.vo.DmWebSocketMessageVo;
import com.xueyi.nlt.api.nlt.domain.vo.*;
import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse;
import com.xueyi.nlt.api.nlt.domain.vo.CoversationSessionVo;
import com.xueyi.nlt.api.nlt.domain.vo.DmIntentVo;
@@ -42,16 +44,16 @@ import com.xueyi.nlt.nlt.domain.LlmContext;
import com.xueyi.nlt.nlt.domain.LlmParam;
import com.xueyi.nlt.nlt.domain.LlmResponse;
import com.xueyi.nlt.nlt.domain.dto.DmIntentDto;
import com.xueyi.nlt.nlt.domain.dto.DmPromptDto;
import com.xueyi.nlt.nlt.domain.dto.DmSensitiveWordDto;
import com.xueyi.nlt.nlt.domain.po.DmRegularPo;
import com.xueyi.nlt.nlt.domain.query.DmIntentQuery;
import com.xueyi.nlt.nlt.domain.vo.DmKnowledgeLibAskVo;
import com.xueyi.nlt.nlt.domain.vo.IntentTemplateVo;
import com.xueyi.nlt.nlt.domain.vo.MarkRecordVo;
import com.xueyi.nlt.nlt.domain.vo.*;
import com.xueyi.nlt.nlt.mapper.DmRegularMapper;
import com.xueyi.nlt.nlt.service.IDmIntentService;
import com.xueyi.nlt.nlt.service.ISensitiveService;
import com.xueyi.nlt.nlt.service.ISysLlmService;
import com.xueyi.nlt.nlt.service.*;
import com.xueyi.nlt.nlt.service.impl.DmSensitiveWordServiceImpl;
import com.xueyi.nlt.nlt.template.*;
import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto;
@@ -65,9 +67,11 @@ import com.xueyi.system.api.model.LoginUser;
import com.xueyi.system.api.model.Source;
import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto;
import com.xueyi.system.api.organize.feign.RemoteEnterpriseService;
import com.yomahub.tlog.core.annotation.TLogAspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.validation.annotation.Validated;
@@ -88,9 +92,13 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.time.LocalDateTime;
import java.util.*;
import java.time.format.DateTimeFormatter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.time.LocalDateTime;

import static com.xueyi.common.core.constant.digitalman.MessageConstants.SYS_DICT_DATA_SPLITED;

@@ -135,6 +143,9 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
@Autowired
private GenerativeKnowledgeTemplate generativeKnowledgeTemplate;

@Autowired
private GenerativeWelcomeTemplate generativeWelcomeTemplate;

@Autowired
private FreeChatTemplate freeChatTemplate;

@@ -172,6 +183,15 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt

@Autowired
private ISysLlmService sysLlmService;

@Autowired
private IDmHotspotService dmHotspotService;

@Autowired
MqttTemplate mqttTemplate;

@Value("${spring.profiles.active}")
private String activeProfile;
/**
* 意图请求
列表
@@ -209,6 +229,7 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
return AjaxResult.success(jsonObjectR.getData());
}

@TLogAspect(str="DGMAN-NLT")
@PostMapping("/api/skill-intent")
@ResponseBody
public AjaxResult skillIntentApi(@RequestBody DmIntentVo intent) {
@@ -347,10 +368,19 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
/**
* 联动北方大模型请求
*/
@TLogAspect(str="DGMAN-NLT")
@PostMapping("/api/searchQuestionAnswer")
@ResponseBody
public AjaxResult searchQuestionAnswer(@RequestBody DmIntentVo intent) {
log.info("交互对象:{}",intent.toString());
// 定义标注日志对象
MarkRecordVo recordVo = new MarkRecordVo();
recordVo.setDevId(intent.getDevId());
recordVo.setId(IdUtil.getSnowflakeNextId());
recordVo.setCreateTime(LocalDateTime.now());
recordVo.setQuestion(intent.getContent());
recordVo.setHit(1);

redisTemplate.opsForValue().increment("dashboard:server", 1);
R<DmManDeviceDto> manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId());
if (manDeviceDtoR.isFail()) {
@@ -362,8 +392,8 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
if (enterpriseDtoR.isOk()) {
enterpriseName = enterpriseDtoR.getData().getName();
}
recordVo.setTenantId(Long.valueOf(manDeviceDtoR.getData().getTId()));
DmIntentResponse response = new DmIntentResponse();

//先调用意图
//根据技能调用知识库或大模型
CoversationSessionVo sessionObject = (CoversationSessionVo) redisTemplate2.opsForValue().get("group:device" + ":" + intent.getDevId() + ":" +"session");
@@ -371,6 +401,13 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
response.setMsg("");
response.setSkillCode("34");
response.setH5(flightMessageTemplate.handle(intent.getDevId(),intent.getContent()));
recordVo.setType(2);
recordVo.setSkillCode("34"); // 航班查询
List answers = new ArrayList();
answers.add(response.getH5().toJSONString());
recordVo.setAnswers(answers);
// 记录log
log.info(recordVo.toString());
return AjaxResult.success(response);

}
@@ -380,6 +417,12 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
redisTemplate.opsForValue().increment("dashboard:flight", 1);
pushIntoDashboardRedis(enterpriseName, "查询航班信息", "skill");
response.setH5(flightMessageTemplate.handle(intent.getDevId(), intent.getContent()));
recordVo.setType(2);
recordVo.setSkillCode("34"); // 航班查询
List answers = new ArrayList();
answers.add(response.getH5().toJSONString());
recordVo.setAnswers(answers);
log.info(recordVo.toString());
return AjaxResult.success(response);
}
}
@@ -396,6 +439,12 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
content = qaAjax.getResult().get(0).getKnowledgeLib();
pushIntoDashboardRedis(enterpriseName,content,"knowledge");
response.setH5(JSONObject.from(qaAjax));
recordVo.setType(0);
recordVo.setSkillCode("34"); // 航班查询
List answers = new ArrayList();
answers.add(response.getH5().getJSONArray("result").getJSONObject(0).getString("answer"));
recordVo.setAnswers(answers);
log.info(recordVo.toString());
return AjaxResult.success(response);
}
}
@@ -454,6 +503,14 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
joImage.put("msg","抱歉,您的问题我无法解答。");
response.setH5(joImage);
}
// 记录日志
recordVo.setType(1);
recordVo.setSkillCode("30"); // 航班查询
recordVo.setLlm("lagi");
List answers = new ArrayList();
answers.add(response.getH5().getString("msg"));
recordVo.setAnswers(answers);
log.info(recordVo.toString());
return AjaxResult.success(response);
}

@@ -510,6 +567,7 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
jo.put("content",knowledgeLibAskVo.getQuestion());
ja1.add(jo);
testJ.put("messages",ja1);
log.info("北方大请求:{}",testJ.toJSONString());
String gatewayheader = LagiConfig.tenantLlmMap.get(enterpriseDtoR.getData().getName());
gatewayheader = StringUtils.isEmpty(gatewayheader) ? "": gatewayheader;
log.info("北方大请求:{}",gatewayheader);
@@ -557,11 +615,20 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
/**
* 意图请求列表
*/
@TLogAspect(str="DGMAN-NLT")
@PostMapping("/inner/conversation")
@ResponseBody
public R<DmIntentResponse> conversationInner(@RequestBody DmIntentVo intent) {
DmIntentResponse response = new DmIntentResponse();

// 记录
// 定义标注日志对象
MarkRecordVo recordVo = new MarkRecordVo();
recordVo.setDevId(intent.getDevId());
recordVo.setId(IdUtil.getSnowflakeNextId());
recordVo.setCreateTime(LocalDateTime.now());
recordVo.setQuestion(intent.getContent());
recordVo.setHit(1);

String enterpriseId = (String)SecurityContextHolder.getLocalMap().get("enterprise_id");
String enterpriseName = "";
@@ -580,6 +647,11 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
if (response == null || StringUtils.isEmpty(response.getSkillCode())) {
// 做场景1、2处理
if (!StringUtils.isEmpty(response.getMsg())) {
// 记录log
recordVo.setType(2);
List answers = new ArrayList();
answers.add(response.getMsg());
recordVo.setAnswers(answers); // 航班查询
return R.ok(response);
}
else {
@@ -594,6 +666,11 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
content = qaAjax.getResult().get(0).getKnowledgeLib();
pushIntoDashboardRedis(enterpriseName,content,"knowledge");
response.setH5(JSONObject.from(qaAjax));
// 记录log
recordVo.setType(2);
List answers = new ArrayList();
answers.add(response.getMsg());
recordVo.setAnswers(answers); // 航班查询
return R.ok(response);
}
else {
@@ -734,8 +811,6 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
return R.ok();
}



/**
* 意图请求
列表
@@ -1054,6 +1129,55 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
return AjaxResult.error(res);
}

@PostMapping("/inner/generateContextTask")
@ResponseBody
public AjaxResult generateContextTask() {
LocalDateTime dateTime = LocalDateTime.now();
String date = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List<JSONObject> contentList = new ArrayList<>();
GenerativeWelcomeTemplate.lunar = "";
GenerativeWelcomeTemplate.term = null;
try {
JSONObject jo = generativeWelcomeTemplate.handle("1", "");
JSONArray ja = jo.getJSONArray("data");
Long timeStamp = System.currentTimeMillis();
JSONObject timeJson = new JSONObject();
timeJson.put("timestamp", timeStamp);
ja.add(timeJson);
log.info(ja.toJSONString());
redisTemplate2.opsForHash().put("group:task" + ":generate", date, AjaxResult.success(ja).toJson().toJSONString());
Map<Object, Object> devices = redisTemplate2.opsForHash().entries("group:dgman:device:");
for(Object devId:devices.keySet()){
mqttTemplate.sendToMqtt("/" + activeProfile + "/" + "digital_man" + "/" + devId.toString() + "/" + "notify" + "/" + "generate-welcome", true, AjaxResult.success(ja).toJson().toJSONString());
}
} catch (Exception e) {
log.error("生成任务失败:{}",e.getMessage());
return AjaxResult.error("生成任务失败");
}
return AjaxResult.success();
}

@PostMapping("/syncHotspot")
@ResponseBody
public AjaxResult syncHotspot(){
Integer result = dmHotspotService.syncHotspot();
if(result.equals(0)){
return AjaxResult.success("同步成功");
}else {
return AjaxResult.error("同步失败");
}
}

@PostMapping("/collectHotspot")
@ResponseBody
public AjaxResult collectHotspot(){
Integer result = dmHotspotService.collectHotspot();
if(result.equals(0)){
return AjaxResult.success("热点收集成功");
}else {
return AjaxResult.error("热点收集失败");
}
}

interface Auth {
/** 系统 - 意图管理


+ 7
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/MarkRecordVo.java Visa fil

@@ -1,5 +1,6 @@
package com.xueyi.nlt.nlt.domain.vo;

import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -17,7 +18,7 @@ public class MarkRecordVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

// 唯一id
protected Long id;
protected String devId;
/** 标注来源
@@ -48,6 +49,11 @@ public class MarkRecordVo implements Serializable {
/** 问题 */
protected String question;

/** 是否命中 */
protected Integer hit;

/** 命中的技能 */
protected String skillCode;
/** 答案 */
protected List<String> answers;



+ 2
- 2
xueyi-modules/xueyi-nlt/src/main/resources/logback.xml Visa fil

@@ -22,7 +22,7 @@
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
@@ -44,7 +44,7 @@
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">


Laddar…
Avbryt
Spara