diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmPromptController.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmPromptController.java new file mode 100644 index 00000000..36f69fc9 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmPromptController.java @@ -0,0 +1,144 @@ +package com.xueyi.nlt.nlt.controller; + +import cn.hutool.core.util.IdUtil; +import com.xueyi.common.core.web.result.AjaxResult; +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.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.nlt.nlt.domain.query.DmPromptQuery; +import com.xueyi.nlt.nlt.service.IDmPromptService; +import org.springframework.cloud.commons.util.IdUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.Serializable; +import java.util.List; + +/** + * 提示词管理管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/prompt") +public class DmPromptController extends BaseController { + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "提示词管理" ; + } + + /** + * 查询提示词管理列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_PROMPT_LIST) + public AjaxResult list(DmPromptQuery prompt) { + return super.list(prompt); + } + + /** + * 查询提示词管理详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_PROMPT_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 提示词管理导出 + */ + @Override + @PostMapping("/export") + @RequiresPermissions(Auth.DM_PROMPT_EXPORT) + @Log(title = "提示词管理管理", businessType = BusinessType.EXPORT) + public void export(HttpServletResponse response, DmPromptQuery prompt) { + super.export(response, prompt); + } + + /** + * 提示词管理新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_PROMPT_ADD) + @Log(title = "提示词管理管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmPromptDto prompt) { + return super.add(prompt); + } + + /** + * 提示词管理修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_PROMPT_EDIT) + @Log(title = "提示词管理管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmPromptDto prompt) { + return super.edit(prompt); + } + + /** + * 提示词管理修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_PROMPT_EDIT, Auth.DM_PROMPT_ES}, logical = Logical.OR) + @Log(title = "提示词管理管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmPromptDto prompt) { + return super.editStatus(prompt); + } + + /** + * 提示词管理批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_PROMPT_DEL) + @Log(title = "提示词管理管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取提示词管理选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 提示词管理管理 - 列表 */ + String DM_PROMPT_LIST = "nlt:prompt:list"; + /** 系统 - 提示词管理管理 - 详情 */ + String DM_PROMPT_SINGLE = "nlt:prompt:single"; + /** 系统 - 提示词管理管理 - 新增 */ + String DM_PROMPT_ADD = "nlt:prompt:add"; + /** 系统 - 提示词管理管理 - 修改 */ + String DM_PROMPT_EDIT = "nlt:prompt:edit"; + /** 系统 - 提示词管理管理 - 修改状态 */ + String DM_PROMPT_ES = "nlt:prompt:es"; + /** 系统 - 提示词管理管理 - 删除 */ + String DM_PROMPT_DEL = "nlt:prompt:delete"; + /** 系统 - 提示词管理管理 - 导出 */ + String DM_PROMPT_EXPORT = "nlt:prompt:export"; + /** 系统 - 提示词管理管理 - 缓存 */ + String DM_PROMPT_CACHE = "nlt:prompt:cache"; + } + + public static void main(String[] args) { + System.out.println(IdUtil.getSnowflakeNextId()); + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmPromptDto.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmPromptDto.java new file mode 100644 index 00000000..1e765a96 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmPromptDto.java @@ -0,0 +1,52 @@ +package com.xueyi.nlt.nlt.domain.dto; + +import com.alibaba.fastjson2.JSONArray; +import com.xueyi.nlt.nlt.domain.merge.DmPromptParamMerge; +import com.xueyi.nlt.nlt.domain.po.DmPromptPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.List; + +/** + * 提示词管理 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmPromptDto extends DmPromptPo { + + @Serial + private static final long serialVersionUID = 1L; + + protected List paramList; + + /** + * 拼接获取好的提示词 + */ + public String getPrompt(List params) { + StringBuilder prompt = new StringBuilder(); + 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())); + } + } + prompt.append(this.getSuffix()); + return prompt.toString(); + } + + /** + * 格式化字符串 + * @param str + * @return + */ + private String formatStr(String str) { + if (str == null) { + return ""; + } + return str; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/merge/DmPromptParamMerge.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/merge/DmPromptParamMerge.java new file mode 100644 index 00000000..7b3c1b65 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/merge/DmPromptParamMerge.java @@ -0,0 +1,41 @@ +package com.xueyi.nlt.nlt.domain.merge; + +import com.baomidou.mybatisplus.annotation.*; +import com.xueyi.common.core.web.entity.base.BasisEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * 提示词-参数关系 持久化对象 + * + * @author xueyi + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("dm_prompt_param_merge") +public class DmPromptParamMerge extends BasisEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** id */ + @TableId + protected Long id; + + /** 提示词id */ + protected Long promptId; + + /** 前置词 */ + protected String prefix; + + /** 后置词 */ + protected String suffix; + + /** 排序顺序 */ + protected Integer order; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmPromptConverter.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmPromptConverter.java new file mode 100644 index 00000000..5d9da136 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmPromptConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.nlt.nlt.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.nlt.nlt.domain.po.DmPromptPo; +import com.xueyi.nlt.nlt.domain.query.DmPromptQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 提示词管理 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmPromptConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/po/DmPromptPo.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/po/DmPromptPo.java new file mode 100644 index 00000000..95e1552b --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/po/DmPromptPo.java @@ -0,0 +1,51 @@ +package com.xueyi.nlt.nlt.domain.po; + +import com.xueyi.common.core.web.entity.base.BaseEntity; +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.StringReader; + + +/** + * 提示词管理 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("dm_prompt") +public class DmPromptPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 前置词 */ + @Excel(name = "前置词") + protected String prefix; + + /** 后置词 */ + @Excel(name = "后置词") + protected String suffix; + + /** 状态(0:使用;1:停用) */ + @Excel(name = "状态", readConverterExp = "0=:使用;1:停用") + protected String status; + + /** 备注 */ + @Excel(name = "备注") + protected String remark; + + /** 角色 */ + @Excel(name = "角色") + protected String role; + + /** 错误消息 */ + @Excel(name = "错误消息") + protected String errMsg; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/query/DmPromptQuery.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/query/DmPromptQuery.java new file mode 100644 index 00000000..aebd9b70 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/query/DmPromptQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.nlt.nlt.domain.query; + +import com.xueyi.nlt.nlt.domain.po.DmPromptPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 提示词管理 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmPromptQuery extends DmPromptPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmPromptManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmPromptManager.java new file mode 100644 index 00000000..bc67efb8 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmPromptManager.java @@ -0,0 +1,21 @@ +package com.xueyi.nlt.nlt.manager; + +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.nlt.nlt.domain.query.DmPromptQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 提示词管理管理 数据封装层 + * + * @author xueyi + */ +public interface IDmPromptManager extends IBaseManager { + + /** + * 根据提示词模板名称查询提示词管理对象 | 数据权限 + * + * @param name 提示词模板名称 + * @return 提示词对象 + */ + DmPromptDto selectByName(String name); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmPromptManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmPromptManager.java new file mode 100644 index 00000000..23b2377a --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmPromptManager.java @@ -0,0 +1,58 @@ +package com.xueyi.nlt.nlt.manager.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.nlt.nlt.domain.merge.DmPromptParamMerge; +import com.xueyi.nlt.nlt.domain.po.DmIntentPo; +import com.xueyi.nlt.nlt.domain.po.DmPromptPo; +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.nlt.nlt.domain.query.DmPromptQuery; +import com.xueyi.nlt.nlt.domain.model.DmPromptConverter; +import com.xueyi.nlt.nlt.mapper.DmIntentMapper; +import com.xueyi.nlt.nlt.mapper.DmPromptMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.nlt.nlt.manager.IDmPromptManager; +import com.xueyi.nlt.nlt.mapper.merge.DmPromptParamMergeMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.sql.Wrapper; + +/** + * 提示词管理管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmPromptManager extends BaseManagerImpl implements IDmPromptManager { + + @Autowired + DmPromptParamMergeMapper dmPromptParamMergeMapper; + + @Autowired + DmIntentMapper dmIntentMapper; + + /** + * 根据提示词模板名称查询提示词管理对象 | 数据权限 + * + * @param name 提示词模板名称 + * @return 提示词对象 + */ + @Override + public DmPromptDto selectByName(String name) { + DmPromptQuery prompt = new DmPromptQuery(); + prompt.setName(name); + // 根据name字段查询dto + DmPromptPo po = baseMapper.selectOne(Wrappers.query().lambda().eq(DmPromptPo::getName, name)); + if (po != null) { + // 转化成dto对象 + DmPromptDto dto = baseConverter.mapperDto(po); + // 根据order顺序获取DmPromptParamMerge对象列表 + dto.setParamList(dmPromptParamMergeMapper.selectList(Wrappers.query().lambda().eq(DmPromptParamMerge::getPromptId, dto.getId()).orderByAsc(DmPromptParamMerge::getOrder))); + return dto; + } else { + return null; + } + + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/DmPromptMapper.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/DmPromptMapper.java new file mode 100644 index 00000000..13bd7238 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/DmPromptMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.nlt.nlt.mapper; + +import com.xueyi.nlt.nlt.domain.query.DmPromptQuery; +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.nlt.nlt.domain.po.DmPromptPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Master; + +/** + * 提示词管理管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmPromptMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/merge/DmPromptParamMergeMapper.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/merge/DmPromptParamMergeMapper.java new file mode 100644 index 00000000..83854384 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/merge/DmPromptParamMergeMapper.java @@ -0,0 +1,14 @@ +package com.xueyi.nlt.nlt.mapper.merge; + +import com.xueyi.common.datasource.annotation.Master; +import com.xueyi.common.web.entity.mapper.BasicMapper; +import com.xueyi.nlt.nlt.domain.merge.DmPromptParamMerge; + +/** + * 提示词-参数关系 数据层 + * + * @author xueyi + */ +@Master +public interface DmPromptParamMergeMapper extends BasicMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmPromptService.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmPromptService.java new file mode 100644 index 00000000..9938cf47 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmPromptService.java @@ -0,0 +1,14 @@ +package com.xueyi.nlt.nlt.service; + +import com.xueyi.nlt.nlt.domain.query.DmPromptQuery; +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 提示词管理管理 服务层 + * + * @author xueyi + */ +public interface IDmPromptService extends IBaseService { + DmPromptDto selectByName(String name); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmPromptServiceImpl.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmPromptServiceImpl.java new file mode 100644 index 00000000..82c981da --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmPromptServiceImpl.java @@ -0,0 +1,45 @@ +package com.xueyi.nlt.nlt.service.impl; + +import com.xueyi.nlt.nlt.domain.dto.DmPromptDto; +import com.xueyi.nlt.nlt.domain.query.DmPromptQuery; +import com.xueyi.nlt.nlt.service.IDmPromptService; +import com.xueyi.nlt.nlt.manager.IDmPromptManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 提示词管理管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmPromptServiceImpl extends BaseServiceImpl implements IDmPromptService { + + + + /** + * 查询提示词管理对象列表 | 数据权限 + * + * @param prompt 提示词管理对象 + * @return 提示词管理对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmPromptMapper"}) + public List selectListScope(DmPromptQuery prompt) { + return baseManager.selectList(prompt); + } + + /** + * 根据提示词模板名称查询提示词管理对象 | 数据权限 + * + * @param name 提示词模板名称 + * @return 提示词对象 + */ + @Override + public DmPromptDto selectByName(String name) { + return baseManager.selectByName(name); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java index c82cf513..8367e923 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java @@ -11,6 +11,8 @@ import com.xueyi.nlt.nlt.context.TerminalSecurityContextHolder; 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.IDmPromptService; import com.xueyi.nlt.nlt.service.ISysLlmService; import com.yomahub.tlog.core.annotation.TLogAspect; import org.slf4j.Logger; @@ -36,6 +38,9 @@ public class FreeChatTemplate implements BaseTemplate{ @Autowired private RedisTemplate redisTemplate; + @Autowired + private IDmPromptService dmPromptService; + @Autowired private RemoteQAService remoteQAService; @@ -104,8 +109,11 @@ public class FreeChatTemplate implements BaseTemplate{ redisTemplate.opsForList().leftPop(redisKey,2); } size = redisTemplate.opsForList().size(redisKey); + // 获取prompt对象 + DmPromptDto promptDto = dmPromptService.selectByName("free-chat"); + List context = new ArrayList<>(); - context.add("你是缔智元公司的前台,你叫小智,你是一位数字人,你们公司在北京,你的职能是负责做会议预定和访客预约。"); + context.add(promptDto.getRole()); // 中航信领导来访临时对策 // 判断如果content包含correctWordsMap中的key,则替换为value for (String key : correctWordsMap.keySet()) { @@ -115,6 +123,7 @@ public class FreeChatTemplate implements BaseTemplate{ } //context.addAll(redisTemplate.opsForList().range(redisKey,size-2,size)); + content = promptDto.getPrefix() + content; content = generatePrompts(content); context.add(content); //使用stream去除context列表中所有字符串中的引号 diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeKnowledgeTemplate.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeKnowledgeTemplate.java index 0173f2db..1733a47a 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeKnowledgeTemplate.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeKnowledgeTemplate.java @@ -7,6 +7,8 @@ import com.xueyi.nlt.netty.client.WebSocketClientManager; 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.IDmPromptService; import com.xueyi.nlt.nlt.service.ISysLlmService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,6 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + @Service("generative-knowledge") public class GenerativeKnowledgeTemplate implements BaseTemplate{ @@ -25,17 +30,26 @@ public class GenerativeKnowledgeTemplate implements BaseTemplate{ @Autowired private ISysLlmService sysLlmService; + @Autowired + private IDmPromptService dmPromptService; + @Autowired private RedisTemplate redisTemplate; @Override public JSONObject handle(String devId, String content) { JSONObject jsonObject = new JSONObject(); + DmPromptDto promptDto = dmPromptService.selectByName("generative-knowledge"); // 根据content内容调用模版并返回结果 - String prefix = "你的任务是[针对给定的文段提出" + (content.length() /100 + 1 ) + "个问题并回答]。文段为:[\""; - String suffix = "\"]。输出为一个JSON数组[{}],每个元素是一个JSON:{“question”:,”answer”:}。不要给出任何解释说明。"; - log.info(prefix + content + suffix); - LlmContext llmContext = new LlmContext(prefix + content + suffix); + List paramList = new ArrayList<>(); + paramList.add(String.valueOf(content.length() /100 + 1)); + paramList.add(content); + String prompt = promptDto.getPrompt(paramList); +// String prefix = "你的任务是[针对给定的文段提出" + (content.length() /100 + 1 ) + "个问题并回答]。文段为:[\""; +// String suffix = "\"]。输出为一个JSON数组[{}],每个元素是一个JSON:{“question”:,”answer”:}。不要给出任何解释说明。"; +// log.info(prefix + content + suffix); + + LlmContext llmContext = new LlmContext(prompt); llmContext.setDevId(devId); LlmParam llmParam = new LlmParam(); LlmResponse response = sysLlmService.chat(llmContext,llmParam); diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/MovieChatTemplate.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/MovieChatTemplate.java index 8a77bfaf..343187a8 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/MovieChatTemplate.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/MovieChatTemplate.java @@ -8,6 +8,8 @@ import com.xueyi.nlt.nlt.context.TerminalSecurityContextHolder; 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.IDmPromptService; import com.xueyi.nlt.nlt.service.ISysLlmService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,6 +28,8 @@ public class MovieChatTemplate implements BaseTemplate{ @Autowired WebSocketClientManager webSocketClientManager; + @Autowired + IDmPromptService dmPromptService; @Autowired ISysLlmService sysLlmService; @@ -35,11 +39,8 @@ public class MovieChatTemplate implements BaseTemplate{ @Override public JSONObject handle(String devId, String content) { // 判断content如果小于5五个字,返回msg:对不起,能否再描述清除一些。 - if(content.length() < 5){ - JSONObject resultJson = new JSONObject(); - resultJson.put("msg","对不起,能否再描述清楚一些。"); - return resultJson; - } + DmPromptDto promptDto = dmPromptService.selectByName("movie-chat"); + Long operatorId = TerminalSecurityContextHolder.getOperatorId(); String redisKey = "group:nlp:" + SecurityContextHolder.getLocalMap().get("enterprise_id") + ":" + operatorId; // 根据content内容调用模版并返回结果 @@ -50,7 +51,7 @@ public class MovieChatTemplate implements BaseTemplate{ } size = redisTemplate.opsForList().size(redisKey); List context = new ArrayList<>(); - context.add("你是一位电影领域的专家。你来自于缔智元公司。你的名字叫小智"); + context.add(promptDto.getRole()); context.addAll(redisTemplate.opsForList().range(redisKey,size-6,size)); context.add(content); @@ -67,7 +68,7 @@ public class MovieChatTemplate implements BaseTemplate{ if(!StringUtils.isEmpty(result)){ if (result.equals("-1")) { - result = "这个问题超出了我的能力,您可以提出更多关于公司相关问题。"; + result = promptDto.getErrMsg(); } else { redisTemplate.opsForList().rightPush(redisKey,content); redisTemplate.opsForList().rightPush(redisKey,result); diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmQAndAController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmQAndAController.java index 73159543..7bf14265 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmQAndAController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmQAndAController.java @@ -128,6 +128,16 @@ public class DmQAndAController extends BaseController idList) { + return AjaxResult.success(baseService.deleteLlmByIds(idList)); + } + /** * 企业知识库问答修改 */ diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQAndADto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQAndADto.java index 80fc5ae2..286e6fcf 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQAndADto.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQAndADto.java @@ -22,4 +22,6 @@ public class DmQAndADto extends DmQAndAPo { private String creator; + private String fileId; + } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQAndAService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQAndAService.java index ab3cac85..2ca6c922 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQAndAService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQAndAService.java @@ -4,6 +4,8 @@ import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; import com.xueyi.common.web.entity.service.IBaseService; +import java.io.Serializable; +import java.util.Collection; import java.util.List; /** @@ -13,4 +15,6 @@ import java.util.List; */ public interface IDmQAndAService extends IBaseService { Integer batchInsert(List queryList); + + Integer deleteLlmByIds(Collection idList); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQAndAServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQAndAServiceImpl.java index aa4ee63a..245edddc 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQAndAServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQAndAServiceImpl.java @@ -1,5 +1,8 @@ package com.xueyi.system.digitalmans.service.impl; +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.common.core.utils.ServletUtil; +import com.xueyi.nlt.api.nlt.feign.RemoteLandingLlmService; import com.xueyi.system.api.organize.domain.dto.SysUserDto; import com.xueyi.system.api.organize.domain.query.SysUserQuery; import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; @@ -8,12 +11,18 @@ import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; import com.xueyi.system.digitalmans.service.IDmQAndAService; import com.xueyi.system.digitalmans.manager.IDmQAndAManager; import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.system.digitalmans.service.IDmQuestionsService; import com.xueyi.system.organize.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import static com.xueyi.common.core.web.page.TableSupport.PAGE_NUM; +import static com.xueyi.common.core.web.page.TableSupport.PAGE_SIZE; /** * 企业知识库问答管理 服务层处理 * @@ -24,6 +33,11 @@ public class DmQAndAServiceImpl extends BaseServiceImpl selectListScope(DmQAndAQuery qAndA) { - + // 根据knowledgeId获取知识库信息 + DmQuestionsDto questionsDto = dmQuestionsService.selectById(qAndA.getKnowledgeId()); + if (questionsDto != null && questionsDto.getType() != null && questionsDto.getType() == 1) { + System.out.println(ServletUtil.getParameterToInt(PAGE_SIZE)); + System.out.println(ServletUtil.getParameterToInt(PAGE_NUM)); +// System.out.println(page.getPageNum() + " " + page.getPageSize()); + // 根据name获取上传文档列表 + JSONObject jsonObject = remoteLandingLlmService.getUploadFileList(questionsDto.getName(), String.valueOf(ServletUtil.getParameterToInt(PAGE_SIZE)),String.valueOf(ServletUtil.getParameterToInt(PAGE_NUM))); + System.out.println(jsonObject.toJSONString()); + if (jsonObject != null) { + List dmQAndADtos = new ArrayList<>(); + int totalRow = jsonObject.getInteger("totalRow"); + for (int i = 0;i < jsonObject.getJSONArray("data").size(); i++) { + DmQAndADto dmQAndADto = new DmQAndADto(); + dmQAndADto.setFileId(jsonObject.getJSONArray("data").getJSONObject(i).getString("fileId")); + dmQAndADto.setKnowledgeId(qAndA.getKnowledgeId()); + dmQAndADto.setName(jsonObject.getJSONArray("data").getJSONObject(i).getString("filename")); + dmQAndADtos.add(dmQAndADto); + } + return dmQAndADtos; + } + } SysUserQuery userQuery = new SysUserQuery(); List userDtos = iSysUserService.selectList(userQuery); @@ -53,4 +88,15 @@ public class DmQAndAServiceImpl extends BaseServiceImpl queryList) { return baseManager.insertBatch(queryList); } + + @Override + public Integer deleteLlmByIds(Collection idList) { + //idList转换成List + List ids = new ArrayList<>(); + idList.forEach(id -> { + ids.add(String.valueOf(id)); + }); + remoteLandingLlmService.deleteFile(ids); + return ids.size(); + } } \ No newline at end of file