feat: 添加自动获取高优先级模型和服务的逻辑;

This commit is contained in:
likunlong
2025-08-18 14:30:08 +08:00
committed by Administrator
parent b696fde881
commit 4f7ad59e46
5 changed files with 186 additions and 63 deletions

View File

@@ -76,6 +76,11 @@ public class ChatModel extends BaseEntity {
*/
private String apiKey;
/**
* 优先级
*/
private Integer priority;
/**
* 备注
*/

View File

@@ -74,6 +74,11 @@ public class ChatModelBo extends BaseEntity {
@NotBlank(message = "请求地址不能为空", groups = { AddGroup.class, EditGroup.class })
private String apiHost;
/**
* 优先级
*/
private Integer priority;
/**
* 密钥
*/

View File

@@ -57,6 +57,12 @@ public interface IChatModelService {
* 通过模型分类获取模型信息
*/
ChatModelVo selectModelByCategory(String image);
/**
* 通过模型分类获取优先级最高的模型信息
*/
ChatModelVo selectModelByCategoryWithHighestPriority(String category);
/**
* 获取ppt模型信息
*/

View File

@@ -136,6 +136,19 @@ public class ChatModelServiceImpl implements IChatModelService {
public ChatModelVo selectModelByCategory(String category) {
return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getCategory, category));
}
/**
* 通过模型分类获取优先级最高的模型信息
*/
@Override
public ChatModelVo selectModelByCategoryWithHighestPriority(String category) {
return baseMapper.selectVoOne(
Wrappers.<ChatModel>lambdaQuery()
.eq(ChatModel::getCategory, category)
.orderByDesc(ChatModel::getPriority)
.last("LIMIT 1")
);
}
@Override
public ChatModel getPPT() {

View File

@@ -114,8 +114,8 @@ public class SseServiceImpl implements ISseService {
chatRequest.setSessionId(chatSessionBo.getId());
}
}
// 根据模型分类调用不同的处理逻辑
IChatService chatService = chatServiceFactory.getChatService(chatModelVo.getCategory());
// 自动选择模型并获取对应的聊天服务
IChatService chatService = autoSelectModelAndGetService(chatRequest);
chatService.chat(chatRequest, sseEmitter);
} catch (Exception e) {
log.error(e.getMessage(),e);
@@ -124,6 +124,45 @@ public class SseServiceImpl implements ISseService {
return sseEmitter;
}
/**
* 自动选择模型并获取对应的聊天服务
*/
private IChatService autoSelectModelAndGetService(ChatRequest chatRequest) {
try {
// 处理特殊模型类型
if ("gpt-image".equals(chatRequest.getModel())) {
chatModelVo = selectModelByCategory("image");
return chatServiceFactory.getChatService(chatModelVo.getCategory());
}
// 根据模型名称获取模型分类,然后获取该分类下优先级最高的模型
ChatModelVo tempModel = chatModelService.selectModelByName(chatRequest.getModel());
if (tempModel == null) {
throw new IllegalStateException("未找到模型名称:" + chatRequest.getModel());
}
chatModelVo = selectModelByCategory(tempModel.getCategory());
// 直接返回对应的聊天服务
return chatServiceFactory.getChatService(chatModelVo.getCategory());
} catch (Exception e) {
log.error("模型选择和服务获取失败: {}", e.getMessage(), e);
throw new IllegalStateException("模型选择和服务获取失败: " + e.getMessage());
}
}
/**
* 根据分类选择优先级最高的模型
*/
private ChatModelVo selectModelByCategory(String category) {
ChatModelVo model = chatModelService.selectModelByCategoryWithHighestPriority(category);
if (model == null) {
throw new IllegalStateException("未找到" + category + "分类的模型配置");
}
return model;
}
/**
* 获取对话标题
*
@@ -145,66 +184,20 @@ public class SseServiceImpl implements ISseService {
* 构建消息列表
*/
private void buildChatMessageList(ChatRequest chatRequest){
String sysPrompt;
// 矫正模型名称 如果是gpt-image 则查询image类型模型 获取模型名称
if(chatRequest.getModel().equals("gpt-image")) {
chatModelVo = chatModelService.selectModelByCategory("image");
if (chatModelVo == null) {
log.error("未找到image类型的模型配置");
throw new IllegalStateException("未找到image类型的模型配置");
}
}else{
chatModelVo = chatModelService.selectModelByName(chatRequest.getModel());
}
// 获取对话消息列表
List<Message> messages = chatRequest.getMessages();
// 查询向量库相关信息加入到上下文
if(StringUtils.isNotEmpty(chatRequest.getKid())){
List<Message> knMessages = new ArrayList<>();
String content = messages.get(messages.size() - 1).getContent().toString();
// 通过kid查询知识库信息
KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(chatRequest.getKid()));
// 查询向量模型配置信息
ChatModelVo chatModel = chatModelService.selectModelByName(knowledgeInfoVo.getEmbeddingModelName());
QueryVectorBo queryVectorBo = new QueryVectorBo();
queryVectorBo.setQuery(content);
queryVectorBo.setKid(chatRequest.getKid());
queryVectorBo.setApiKey(chatModel.getApiKey());
queryVectorBo.setBaseUrl(chatModel.getApiHost());
queryVectorBo.setVectorModelName(knowledgeInfoVo.getVectorModelName());
queryVectorBo.setEmbeddingModelName(knowledgeInfoVo.getEmbeddingModelName());
queryVectorBo.setMaxResults(knowledgeInfoVo.getRetrieveLimit());
List<String> nearestList = vectorStoreService.getQueryVector(queryVectorBo);
for (String prompt : nearestList) {
Message userMessage = Message.builder().content(prompt).role(Message.Role.USER).build();
knMessages.add(userMessage);
}
messages.addAll(knMessages);
// 设置知识库系统提示词
sysPrompt = knowledgeInfoVo.getSystemPrompt();
if(StringUtils.isEmpty(sysPrompt)){
sysPrompt ="###角色设定\n" +
"你是一个智能知识助手,专注于利用上下文中的信息来提供准确和相关的回答。\n" +
"###指令\n" +
"当用户的问题与上下文知识匹配时,利用上下文信息进行回答。如果问题与上下文不匹配,运用自身的推理能力生成合适的回答。\n" +
"###限制\n" +
"确保回答清晰简洁,避免提供不必要的细节。始终保持语气友好" +
"当前时间:"+ DateUtils.getDate();
}
}else {
sysPrompt = chatModelVo.getSystemPrompt();
if(StringUtils.isEmpty(sysPrompt)){
sysPrompt ="你是一个由RuoYI-AI开发的人工智能助手名字叫熊猫助手。你擅长中英文对话能够理解并处理各种问题提供安全、有帮助、准确的回答。" +
"当前时间:"+ DateUtils.getDate()+
"#注意:回复之前注意结合上下文和工具返回内容进行回复。";
}
}
// 设置系统默认提示词
Message sysMessage = Message.builder().content(sysPrompt).role(Message.Role.SYSTEM).build();
messages.add(0,sysMessage);
// 处理知识库相关逻辑
String sysPrompt = processKnowledgeBase(chatRequest, messages);
// 设置系统提示词
Message sysMessage = Message.builder()
.content(sysPrompt)
.role(Message.Role.SYSTEM)
.build();
messages.add(0, sysMessage);
chatRequest.setSysPrompt(sysPrompt);
// 用户对话内容
String chatString = null;
// 获取用户对话信息
@@ -213,12 +206,113 @@ public class SseServiceImpl implements ISseService {
if (CollectionUtil.isNotEmpty(listContent)) {
chatString = listContent.get(0).toString();
}
} else if (content instanceof String) {
chatString = (String) content;
} else {
chatString = content.toString();
}
// 设置对话信息
chatRequest.setPrompt(chatString);
}
/**
* 处理知识库相关逻辑
*/
private String processKnowledgeBase(ChatRequest chatRequest, List<Message> messages) {
if (StringUtils.isEmpty(chatRequest.getKid())) {
return getDefaultSystemPrompt();
}
try {
// 查询知识库信息
KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(chatRequest.getKid()));
if (knowledgeInfoVo == null) {
log.warn("知识库信息不存在kid: {}", chatRequest.getKid());
return getDefaultSystemPrompt();
}
// 查询向量模型配置信息
ChatModelVo chatModel = chatModelService.selectModelByName(knowledgeInfoVo.getEmbeddingModelName());
if (chatModel == null) {
log.warn("向量模型配置不存在,模型名称: {}", knowledgeInfoVo.getEmbeddingModelName());
return getDefaultSystemPrompt();
}
// 构建向量查询参数
QueryVectorBo queryVectorBo = buildQueryVectorBo(chatRequest, knowledgeInfoVo, chatModel);
// 获取向量查询结果
List<String> nearestList = vectorStoreService.getQueryVector(queryVectorBo);
// 添加知识库消息到上下文
addKnowledgeMessages(messages, nearestList);
// 返回知识库系统提示词
return getKnowledgeSystemPrompt(knowledgeInfoVo);
} catch (Exception e) {
log.error("处理知识库信息失败: {}", e.getMessage(), e);
return getDefaultSystemPrompt();
}
}
/**
* 构建向量查询参数
*/
private QueryVectorBo buildQueryVectorBo(ChatRequest chatRequest, KnowledgeInfoVo knowledgeInfoVo, ChatModelVo chatModel) {
String content = chatRequest.getMessages().get(chatRequest.getMessages().size() - 1).getContent().toString();
QueryVectorBo queryVectorBo = new QueryVectorBo();
queryVectorBo.setQuery(content);
queryVectorBo.setKid(chatRequest.getKid());
queryVectorBo.setApiKey(chatModel.getApiKey());
queryVectorBo.setBaseUrl(chatModel.getApiHost());
queryVectorBo.setVectorModelName(knowledgeInfoVo.getVectorModelName());
queryVectorBo.setEmbeddingModelName(knowledgeInfoVo.getEmbeddingModelName());
queryVectorBo.setMaxResults(knowledgeInfoVo.getRetrieveLimit());
return queryVectorBo;
}
/**
* 添加知识库消息到上下文
*/
private void addKnowledgeMessages(List<Message> messages, List<String> nearestList) {
for (String prompt : nearestList) {
Message userMessage = Message.builder()
.content(prompt)
.role(Message.Role.USER)
.build();
messages.add(userMessage);
}
}
/**
* 获取知识库系统提示词
*/
private String getKnowledgeSystemPrompt(KnowledgeInfoVo knowledgeInfoVo) {
String sysPrompt = knowledgeInfoVo.getSystemPrompt();
if (StringUtils.isEmpty(sysPrompt)) {
sysPrompt = "###角色设定\n" +
"你是一个智能知识助手,专注于利用上下文中的信息来提供准确和相关的回答。\n" +
"###指令\n" +
"当用户的问题与上下文知识匹配时,利用上下文信息进行回答。如果问题与上下文不匹配,运用自身的推理能力生成合适的回答。\n" +
"###限制\n" +
"确保回答清晰简洁,避免提供不必要的细节。始终保持语气友好\n" +
"当前时间:" + DateUtils.getDate();
}
return sysPrompt;
}
/**
* 获取默认系统提示词
*/
private String getDefaultSystemPrompt() {
String sysPrompt = chatModelVo != null ? chatModelVo.getSystemPrompt() : null;
if (StringUtils.isEmpty(sysPrompt)) {
sysPrompt = "你是一个由RuoYI-AI开发的人工智能助手名字叫熊猫助手。你擅长中英文对话能够理解并处理各种问题提供安全、有帮助、准确的回答。" +
"当前时间:" + DateUtils.getDate() +
"#注意:回复之前注意结合上下文和工具返回内容进行回复。";
}
return sysPrompt;
}
/**