Ver código fonte

修改

1、修改提示词框架
    2、修改热点推荐相关逻辑
dev_news
10710 1 ano atrás
pai
commit
31ff56baba
11 arquivos alterados com 127 adições e 106 exclusões
  1. +2
    -2
      xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteIntentService.java
  2. +4
    -1
      xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteQAService.java
  3. +5
    -2
      xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteQAFallbackFactory.java
  4. +17
    -45
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmIntentController.java
  5. +3
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmPromptDto.java
  6. +1
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/merge/DmPromptParamMerge.java
  7. +1
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmPromptManager.java
  8. +7
    -2
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmHotspotService.java
  9. +52
    -9
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmHotspotServiceImpl.java
  10. +13
    -33
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java
  11. +22
    -9
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeWelcomeTemplate.java

+ 2
- 2
xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteIntentService.java Ver arquivo

@@ -31,9 +31,9 @@ public interface RemoteIntentService {
@PostMapping("/intent/inner/generateContextTask")
public AjaxResult generateContextTask();

@PostMapping("/intent/inner/syncHotspot")
@PostMapping("/intent/syncHotspot")
public AjaxResult syncHotspot();

@PostMapping("/intent/inner/collectHotspot")
@PostMapping("/intent/collectHotspot")
public AjaxResult collectHotspot(@RequestBody List<HotspotVo> hotspotVo);
}

+ 4
- 1
xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteQAService.java Ver arquivo

@@ -3,6 +3,7 @@ package com.xueyi.nlt.api.nlt.feign;
import com.alibaba.fastjson.JSONObject;
import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.result.R;
import com.xueyi.nlt.api.nlt.domain.vo.HotspotVo;
import com.xueyi.nlt.api.nlt.domain.vo.KnowledgeVo;
import com.xueyi.nlt.api.nlt.domain.vo.response.DmKnowledgeResponse;
import com.xueyi.nlt.api.nlt.feign.factory.RemoteQAFallbackFactory;
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
* 问答服务
* @Param man_id 机器人id
@@ -30,6 +33,6 @@ public interface RemoteQAService {
R<DmKnowledgeResponse> query(@RequestBody KnowledgeVo vo);

@PostMapping("/searchHotspot")
AjaxResult searchHotspot(@RequestBody KnowledgeVo vo);
R<List<HotspotVo>> searchHotspot(@RequestBody KnowledgeVo vo);

}

+ 5
- 2
xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteQAFallbackFactory.java Ver arquivo

@@ -2,6 +2,7 @@ package com.xueyi.nlt.api.nlt.feign.factory;

import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.result.R;
import com.xueyi.nlt.api.nlt.domain.vo.HotspotVo;
import com.xueyi.nlt.api.nlt.domain.vo.KnowledgeVo;
import com.xueyi.nlt.api.nlt.domain.vo.response.DmKnowledgeResponse;
import com.xueyi.nlt.api.nlt.feign.RemoteQAService;
@@ -9,6 +10,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.List;

/**
* 会议室服务 降级处理
*
@@ -33,8 +36,8 @@ public class RemoteQAFallbackFactory implements FallbackFactory<RemoteQAService>
}

@Override
public AjaxResult searchHotspot(KnowledgeVo vo) {
return AjaxResult.error("查询失败");
public R<List<HotspotVo>> searchHotspot(KnowledgeVo vo) {
return R.fail("查询失败");
}
};
}

+ 17
- 45
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmIntentController.java Ver arquivo

@@ -38,15 +38,13 @@ 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.*;
import com.xueyi.nlt.nlt.mapper.DmRegularMapper;
import com.xueyi.nlt.nlt.service.IDmHotspotService;
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;
@@ -1122,25 +1120,6 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
return AjaxResult.error(res);
}

@PostMapping("/api/testforwelcome")
public AjaxResult test(){
LocalDateTime dateTime = LocalDateTime.now();
String date = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
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());
}
return AjaxResult.success();
}

@PostMapping("/inner/generateContextTask")
@ResponseBody
public AjaxResult generateContextTask() {
@@ -1166,38 +1145,31 @@ public class DmIntentController extends BaseController<DmIntentQuery, DmIntentDt
log.error("生成任务失败:{}",e.getMessage());
return AjaxResult.error("生成任务失败");
}
return success();
return AjaxResult.success();
}

@PostMapping("/inner/syncHotspot")
@PostMapping("/syncHotspot")
@ResponseBody
public AjaxResult syncHotspot(){
return dmHotspotService.syncHotspot();
}

@PostMapping("/inner/collectHotspot")
@ResponseBody
public AjaxResult collectHotspot(@RequestBody List<HotspotVo> hotspotVo){
return dmHotspotService.collectHotspot(hotspotVo);
Integer result = dmHotspotService.syncHotspot();
if(result.equals(0)){
return AjaxResult.success("同步成功");
}else {
return AjaxResult.error("同步失败");
}
}

@PostMapping("/api/updateHotspot")
@PostMapping("/collectHotspot")
@ResponseBody
public AjaxResult updateHotspot(@RequestBody JSONObject hotspotData){
if(hotspotData == null||hotspotData.isEmpty()||!hotspotData.containsKey("data")){
return AjaxResult.error("上传热点新闻失败");
public AjaxResult collectHotspot(){
Integer result = dmHotspotService.collectHotspot();
if(result.equals(0)){
return AjaxResult.success("热点收集成功");
}else {
return AjaxResult.error("热点收集失败");
}
log.info(hotspotData.getString("data"));
List<HotspotVo> hotspotVoList = hotspotData.getList("data",HotspotVo.class);
return dmHotspotService.collectHotspot(hotspotVoList);
}

@PostMapping("/api/testForHotspot")
public AjaxResult testForHotspot(){
return dmHotspotService.syncHotspot();
}


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


+ 3
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmPromptDto.java Ver arquivo

@@ -31,7 +31,9 @@ public class DmPromptDto extends DmPromptPo {
prompt.append(this.getPrefix());
if (params != null && paramList != null && paramList.size() == params.size()) {
for (int i = 0; i < paramList.size(); i++) {
prompt.append(formatStr(paramList.get(i).getPrefix()) + formatStr(params.get(i)) + formatStr(paramList.get(i).getSuffix()));
if(params.get(i) != null && !"".equals(params.get(i))){
prompt.append(formatStr(paramList.get(i).getPrefix()) + formatStr(params.get(i)) + formatStr(paramList.get(i).getSuffix()));
}
}
}
prompt.append(this.getSuffix());


+ 1
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/merge/DmPromptParamMerge.java Ver arquivo

@@ -36,6 +36,6 @@ public class DmPromptParamMerge extends BasisEntity {
protected String suffix;

/** 排序顺序 */
protected Integer order;
protected Integer orders;

}

+ 1
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmPromptManager.java Ver arquivo

@@ -47,7 +47,7 @@ public class DmPromptManager extends BaseManagerImpl<DmPromptQuery, DmPromptDto,
// 转化成dto对象
DmPromptDto dto = baseConverter.mapperDto(po);
// 根据order顺序获取DmPromptParamMerge对象列表
dto.setParamList(dmPromptParamMergeMapper.selectList(Wrappers.<DmPromptParamMerge>query().lambda().eq(DmPromptParamMerge::getPromptId, dto.getId()).orderByAsc(DmPromptParamMerge::getOrder)));
dto.setParamList(dmPromptParamMergeMapper.selectList(Wrappers.<DmPromptParamMerge>query().lambda().eq(DmPromptParamMerge::getPromptId, dto.getId()).orderByAsc(DmPromptParamMerge::getOrders)));
return dto;
} else {
return null;


+ 7
- 2
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmHotspotService.java Ver arquivo

@@ -7,7 +7,12 @@ import java.util.List;


public interface IDmHotspotService {
public AjaxResult syncHotspot();
//向数字人下发热点
public Integer syncHotspot();

public AjaxResult collectHotspot(List<HotspotVo> hotspotVo);
//生成热点
public Integer collectHotspot();

//生成相应的提示词
public String generateHotspotPrompt(String content);
}

+ 52
- 9
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmHotspotServiceImpl.java Ver arquivo

@@ -3,9 +3,14 @@ package com.xueyi.nlt.nlt.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.result.R;
import com.xueyi.common.mqtt.connection.MqttTemplate;
import com.xueyi.nlt.api.nlt.domain.vo.HotspotVo;
import com.xueyi.nlt.api.nlt.domain.vo.KnowledgeVo;
import com.xueyi.nlt.api.nlt.feign.RemoteQAService;
import com.xueyi.nlt.nlt.domain.dto.DmPromptDto;
import com.xueyi.nlt.nlt.service.IDmHotspotService;
import com.xueyi.nlt.nlt.service.IDmPromptService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +21,7 @@ import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@@ -31,11 +37,17 @@ public class DmHotspotServiceImpl implements IDmHotspotService {
@Autowired
MqttTemplate mqttTemplate;

@Autowired
private RemoteQAService remoteQAService;

@Autowired
private IDmPromptService dmPromptService;

@Value("${spring.profiles.active}")
private String activeProfile;

@Override
public AjaxResult syncHotspot() {
public Integer syncHotspot() {
LocalDateTime dateTime = LocalDateTime.now();
String date = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String result = (String) redisTemplate.opsForHash().get("group:task:hotspot", date);
@@ -46,16 +58,47 @@ public class DmHotspotServiceImpl implements IDmHotspotService {
for(Object devId:devices.keySet()){
mqttTemplate.sendToMqtt("/" + activeProfile + "/" + "digital_man" + "/" + devId.toString() + "/" + "notify" + "/" + "generate-hotspot", true, AjaxResult.success(resultArray).toJson().toJSONString());
}
return AjaxResult.success();
return 0;
}

@Override
public AjaxResult collectHotspot(List<HotspotVo> hotspotVoList) {
LocalDateTime dateTime = LocalDateTime.now();
String date = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Long timestamp = System.currentTimeMillis();
hotspotVoList.stream().forEach(hotspotVo -> hotspotVo.setTimestamp(timestamp));
redisTemplate.opsForHash().put("group:task:hotspot", date, JSONArray.from(hotspotVoList).toJSONString());
return AjaxResult.success();
public Integer collectHotspot() {
//Todo 通过智谱大模型收集热点,并保存到redis中。
return 0;
}

private String retrievalHotspot(String content) {
KnowledgeVo vo = new KnowledgeVo();
String result = "";
vo.setQuestion(content);
R<List<HotspotVo>> hotspotResult = remoteQAService.searchHotspot(vo);
log.info("hotspotResult:{}",hotspotResult);
if(hotspotResult.getData() == null){
return "";
}
try{
List<HotspotVo> voList = hotspotResult.getData();
StringBuilder prompt = new StringBuilder();
for(HotspotVo hotspotVo:voList){
prompt.append(hotspotVo.getContent());
prompt.append("\n");
}
result = prompt.toString();
}catch (Exception e){
log.error("查询热点词失败",e);
return "";
}
log.info("result:{}",result);
return result;
}

@Override
public String generateHotspotPrompt(String content) {
String result = retrievalHotspot(content);
DmPromptDto dmPromptDto = dmPromptService.selectByName("hotspot-chat");
List<String> promptList = new ArrayList<>();
promptList.add(result);
promptList.add(content);
return dmPromptDto.getPrompt(promptList);
}
}

+ 13
- 33
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java Ver arquivo

@@ -12,6 +12,7 @@ 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.DmPromptDto;
import com.xueyi.nlt.nlt.service.IDmHotspotService;
import com.xueyi.nlt.nlt.service.IDmPromptService;
import com.xueyi.nlt.nlt.service.ISysLlmService;
import com.yomahub.tlog.core.annotation.TLogAspect;
@@ -44,6 +45,9 @@ public class FreeChatTemplate implements BaseTemplate{
@Autowired
private RemoteQAService remoteQAService;

@Autowired
private IDmHotspotService dmHotspotService;

private Map<String,String> correctWordsMap = new HashMap<>();

// 中航信领导来访临时对策
@@ -65,10 +69,13 @@ public class FreeChatTemplate implements BaseTemplate{
redisTemplate.opsForList().leftPop(redisKey,2);
}
size = redisTemplate.opsForList().size(redisKey);

// 获取prompt对象
DmPromptDto promptDto = dmPromptService.selectByName("free-chat");
List<String> context = new ArrayList<>();
context.add("你是缔智元公司的前台,你叫小智,你是一位数字人。");
context.add(promptDto.getRole());
context.addAll(redisTemplate.opsForList().range(redisKey,size-6,size));
content = generatePrompts(content);
content = promptDto.getPrefix() + content + promptDto.getSuffix();
context.add(content);

//webSocketClient.sendMsg(context);
@@ -110,7 +117,7 @@ public class FreeChatTemplate implements BaseTemplate{
}
size = redisTemplate.opsForList().size(redisKey);
// 获取prompt对象
DmPromptDto promptDto = dmPromptService.selectByName("free-chat");
DmPromptDto promptDto = dmPromptService.selectByName("hotspot-chat");

List<String> context = new ArrayList<>();
context.add(promptDto.getRole());
@@ -123,8 +130,7 @@ public class FreeChatTemplate implements BaseTemplate{
}

//context.addAll(redisTemplate.opsForList().range(redisKey,size-2,size));
content = promptDto.getPrefix() + content;
content = generatePrompts(content);
content = dmHotspotService.generateHotspotPrompt(content);
context.add(content);
//使用stream去除context列表中所有字符串中的引号
context = context.stream().map(s -> s.replaceAll("\"", "")).collect(java.util.stream.Collectors.toList());
@@ -149,38 +155,12 @@ public class FreeChatTemplate implements BaseTemplate{
return null;
}

private String addHotspot(String content) {
KnowledgeVo vo = new KnowledgeVo();
String result = "";
vo.setQuestion(content);
AjaxResult hotspotResult = remoteQAService.searchHotspot(vo);
log.info("hotspotResult:{}",hotspotResult);
if(hotspotResult.get("data") == null){
return result;
}
try{
List<String> hotspotList = (List<String>) hotspotResult.get("data");
for(String hotspot : hotspotList){
result = result + hotspot + "\n";
if(result.length() >= 1000){
break;
}
}
//去除末尾的换行符

}catch (Exception e){
log.error("查询热点词失败",e);
return result;
}
return result;
}

private String generatePrompts(String content){
String msg = addHotspot(content);
String msg = content;
if(msg.equals("")){
return "请用简短的话回答下面的问题:" + content;
}
String result = "根据下面的信息:'''\n" + msg + "\n'''请用简短的话回答下面的问题:" + content;
String result = "根据下面的信息:'''\n" + msg + "\n'''请用简短的话回答下面的问题:" + content;
return result;
}
}

+ 22
- 9
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeWelcomeTemplate.java Ver arquivo

@@ -12,7 +12,9 @@ import com.xueyi.nlt.nlt.constant.PromptsConstants;
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.DmPromptDto;
import com.xueyi.nlt.nlt.domain.vo.WelcomeLabelVo;
import com.xueyi.nlt.nlt.service.IDmPromptService;
import com.xueyi.nlt.nlt.service.ISysLlmService;
import com.xueyi.system.api.holiday.domain.po.DmHolidayPo;
import com.xueyi.system.api.holiday.feign.FeignHolidayService;
@@ -53,7 +55,7 @@ public class GenerativeWelcomeTemplate implements BaseTemplate{
private RemoteSolarService remoteSolarService;

@Autowired
private RedisTemplate<String,String> redisTemplate;
private IDmPromptService dmPromptService;

@Override
public JSONObject handle(String devId, String content) {
@@ -88,10 +90,10 @@ public class GenerativeWelcomeTemplate implements BaseTemplate{
holiday = po.getName();
}
List<WelcomeLabelVo> resultList = new ArrayList<>();
String prefix = "假设你是公司前台,";
String suffix = "请根据以上信息生成简短的话对他打招呼。生成十句打招呼内容,输出为一个JSON数组[{}],每个元素是一个JSON:{“content”:}。不要给出任何解释说明,不要带人名。";
DmPromptDto promptDto = dmPromptService.selectByName("generative-welcome");

//按照时间生成特殊招呼语
for(String time:timeType.keySet()) {
String timeString = getTimeTypeFormat(timeType.getString(time));
WelcomeLabelVo labelVo = new WelcomeLabelVo();
labelVo.setLabelName(time);
List<WelcomeLabelVo> welcomeLabelVoList = new ArrayList<>();
@@ -100,8 +102,14 @@ public class GenerativeWelcomeTemplate implements BaseTemplate{
if(StringUtils.isNotBlank(holiday) || StringUtils.isNotBlank(term)){
WelcomeLabelVo festivalWelcomeLabelVo = new WelcomeLabelVo();
festivalWelcomeLabelVo.setLabelName("festival");
log.info(prefix + getFestivalFormat(holiday) + getSolarTermFormat(term) + timeString + "看到员工时," + suffix);
LlmContext llmContext = new LlmContext(prefix + getFestivalFormat(holiday) + getSolarTermFormat(term) + timeString + "看到员工时," + suffix);
List<String> paramList = new ArrayList<>();
paramList.add(holiday);
paramList.add(term);
paramList.add(timeType.getString(time));
paramList.add("员工");
String prompt = promptDto.getPrompt(paramList);
log.info(prompt);
LlmContext llmContext = new LlmContext(prompt);
llmContext.setDevId(devId);
LlmParam llmParam = new LlmParam();
LlmResponse response = sysLlmService.chat(llmContext, llmParam);
@@ -118,9 +126,14 @@ public class GenerativeWelcomeTemplate implements BaseTemplate{
for (String people : peopleType.keySet()) {
WelcomeLabelVo welcomeLabelVo = new WelcomeLabelVo();
welcomeLabelVo.setLabelName(people);
String peopleString = getPeopleTypeFormat(peopleType.getString(people));
log.info(prefix + timeString + peopleString + suffix);
LlmContext llmContext = new LlmContext(prefix + timeString + peopleString + suffix);
List<String> paramList = new ArrayList<>();
paramList.add("");
paramList.add("");
paramList.add(timeType.getString(time));
paramList.add(peopleType.getString(people));
String prompt = promptDto.getPrompt(paramList);
log.info(prompt);
LlmContext llmContext = new LlmContext(prompt);
llmContext.setDevId(devId);
LlmParam llmParam = new LlmParam();
LlmResponse response = sysLlmService.chat(llmContext, llmParam);


Carregando…
Cancelar
Salvar