diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java index c5a956b6..b0be3130 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java @@ -39,7 +39,7 @@ public class AiBaseModel { /** * 模型类型编码,同ai_model_type中的编码 */ - private Long modelTypeCode; + private String modelTypeCode; /** * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3 diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java index 65727f7f..bd40a2e0 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java @@ -42,7 +42,7 @@ public class AiBaseModelBo { * 模型类型编码,同ai_model_type中的编码 */ @NotNull(message = "模型类型编码不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long modelTypeCode; + private String modelTypeCode; /** * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3 diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java index 5d5bb357..dac9a41f 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java @@ -53,7 +53,7 @@ public class AiBaseModelVo implements Serializable { * 模型类型编码,同ai_model_type中的编码 */ @ExcelProperty(value = "模型类型编码") - private Long modelTypeCode; + private String modelTypeCode; /** * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3 diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java index 0dee18e9..77ab4402 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java @@ -1,21 +1,27 @@ package org.dromara.ai.process.enums; public enum AIProviderEnum { - DEEPSEEK("DeepSeek"), - TONGYI_QIANWEN("TongYi-QianWen"),//阿里通义千问 - TENCENT_LKE("Tencent-LKE"),//腾讯云智能体开发平台 - WENXIN_YIYAN("WenXin-YiYan");//百度文心一言 + DEEPSEEK("DeepSeek", 1L), + TENCENT_LKE("Tencent-LKE", 2L),//腾讯云智能体开发平台 + TONGYI_QIANWEN("TongYi-QianWen", 3L);//阿里通义千问 private final String name; - AIProviderEnum(String name) { + private final Long code;//等于ai_base_model表的base_model_id + + AIProviderEnum(String name, Long code) { this.name = name; + this.code = code; } public String getName() { return name; } + public Long getCode() { + return code; + } + /** * 从字符串转换为枚举 */ @@ -28,4 +34,16 @@ public enum AIProviderEnum { } throw new IllegalArgumentException("未知的大模型提供商: " + text); } + + /** + * 从code(baseModeId)转换为枚举 + */ + public static AIProviderEnum fromCode(Long code) { + for (AIProviderEnum provider : AIProviderEnum.values()) { + if (provider.getCode().equals(code)) { + return provider; + } + } + throw new IllegalArgumentException("未知的大模型提供商: " + code); + } } diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java index b03f9d2c..223bffc4 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java @@ -38,4 +38,12 @@ public class AIProviderProcessorFactory { AIProviderEnum provider = AIProviderEnum.fromString(providerName); return getProcessor(provider); } + + /** + * 根据base_model_id获取对应的API实现 + */ + public IUnifiedAIProviderProcessor getProcessor(Long baseModelId) { + AIProviderEnum provider = AIProviderEnum.fromCode(baseModelId); + return getProcessor(provider); + } } diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java index bba240d3..5cd9ee63 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java @@ -259,8 +259,8 @@ public class DeepSeekProcessor extends BaseAIProviderProcessor { AiChatMessageDetail aiChatMessageDetail = new AiChatMessageDetail(); aiChatMessageDetail.setChatMessageId(aiChatMessage.getChatMessageId()); aiChatMessageDetail.setSessionId(request.getSessionId()); - aiChatMessageDetail.setQuestionContent(objectMapper.writeValueAsString(messages.get(messages.size() - 1).getContent())); - aiChatMessageDetail.setAnswerContent(fullResponse); + aiChatMessageDetail.setQuestionContent(objectMapper.writeValueAsString(request.getQuestionContent())); + aiChatMessageDetail.setAnswerContent(objectMapper.writeValueAsString(fullResponse)); // aiChatMessageDetail.setPromptToken(1L); // aiChatMessageDetail.setCompletionToken(1L); // aiChatMessageDetail.setTotalToken(1L); diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java index 2006e515..8983bf2c 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java @@ -1,11 +1,10 @@ package org.dromara.ai.service.impl; import com.fasterxml.jackson.core.JsonProcessingException; -import org.dromara.ai.service.IAiChatMessageDetailService; -import org.dromara.ai.service.IAiChatMessageService; -import org.dromara.ai.service.IAiModelService; +import org.dromara.ai.domain.AiModel; +import org.dromara.ai.mapper.AiModelMapper; import org.dromara.ai.test.vectorization.process.IEmbeddingProcessor; -import org.dromara.ai.mapper.DatabaseMetaMapper; +import org.dromara.ai.mapper.SQLServerDatabaseMetaMapper; import org.dromara.ai.process.dto.AIMessage; import org.dromara.ai.process.dto.AIRequest; import org.dromara.ai.process.dto.AIResponse; @@ -33,7 +32,10 @@ import java.util.*; public class AIAssistantServiceImpl implements IAIAssistantService { @Autowired - private DatabaseMetaMapper databaseMetaMapper; + private SQLServerDatabaseMetaMapper databaseMetaMapper; + + @Autowired + private AiModelMapper aiModelMapper; @Autowired private Map aiProviderProcessorMap; @@ -70,7 +72,8 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } final String messageTopic = messages.get(messages.size() - 1).getContent(); - finalAiRequest.setMessageTopic(messageTopic); + finalAiRequest.setMessageTopic(messageTopic);//暂时跟提问的内容相同,后续可以总结 + finalAiRequest.setQuestionContent(messageTopic); // 尝试获取处理器,如果找不到则抛出异常 return Flux.defer(() -> { @@ -96,6 +99,12 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } + /** + * 知识库检索 + * + * @param aiRequest + * @return + */ private AIRequest knowledgeChatInfo(AIRequest aiRequest) { try { List messages = aiRequest.getMessages(); @@ -110,13 +119,22 @@ public class AIAssistantServiceImpl implements IAIAssistantService { aiRequest.setText(messageContent); StringBuilder sb = new StringBuilder(messageContent); - String embeddingProcessor = "Tencent-LKE"; - aiRequest.setApiKey("AKIDyvlTyJTRDmCTXs56uUvDJNK6h9SZVDlB"); - aiRequest.setApiSecret("IOXloeHrCLH4iw30lKjxynPq7rPlwugF"); - IUnifiedAIProviderProcessor tencentLkeProcessor = aiProviderProcessorFactory.getProcessor(embeddingProcessor); + Long embeddingModelId = aiRequest.getEmbeddingModelId(); + AiModel aiModel = aiModelMapper.selectById(embeddingModelId); + if (aiModel == null) { + throw new RuntimeException("未找到对应的模型信息"); + } + +// String embeddingProcessor = "Tencent-LKE"; + //todo:后续从redis中获取 + aiRequest.setApiKey(EncryptUtils.decryptByBase64(aiModel.getApiKey())); + aiRequest.setApiSecret(EncryptUtils.decryptByBase64(aiModel.getApiSecret())); + IUnifiedAIProviderProcessor tencentLkeProcessor = aiProviderProcessorFactory.getProcessor(aiModel.getBaseModelId()); List queryEmbedding = tencentLkeProcessor.getEmbedding(aiRequest); - int topK = 5; + int topK = aiRequest.getRetrieveLimit() == null || aiRequest.getRetrieveLimit() <= 0 ? + 5 : aiRequest.getRetrieveLimit();//retrieveLimit,检索限制 + List searchResultList = vectorDBService. search(queryEmbedding, aiRequest.getKnowledgeBaseId(), topK); @@ -170,26 +188,6 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } } - - public String aiFillForm() { - String aiClient = "deepSeek"; - IUnifiedAIProviderProcessor service = aiProviderProcessorMap.get(aiClient); - if (service == null) { - throw new IllegalArgumentException("Unsupported payment type"); - } - - return ""; - } - - - public String uploadContent() { - String embeddingProcessor = "tencentlke"; - IEmbeddingProcessor service = embeddingProcessorMap.get(embeddingProcessor); - - return ""; - } - - @Override public boolean testAIModel(String provider, AIRequest aiRequest) { IUnifiedAIProviderProcessor processor = aiProviderProcessorMap.get(provider); @@ -215,4 +213,17 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } + + public String aiFillForm() { + String aiClient = "deepSeek"; + IUnifiedAIProviderProcessor service = aiProviderProcessorMap.get(aiClient); + if (service == null) { + throw new IllegalArgumentException("Unsupported payment type"); + } + + return ""; + } + + + } diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java index 723f1478..823bc132 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java @@ -86,7 +86,8 @@ public class AiChatMessageServiceImpl implements IAiChatMessageService { .eq(bo.getDeductCost() != null, AiChatMessage::getDeductCost, bo.getDeductCost()) .eq(bo.getTotalToken() != null, AiChatMessage::getTotalToken, bo.getTotalToken()) .eq(bo.getModelId() != null, AiChatMessage::getModelId, bo.getModelId()) - .eq(bo.getKnowledgeBaseId() != null, AiChatMessage::getKnowledgeBaseId, bo.getKnowledgeBaseId()) + .eq(bo.getKnowledgeBaseId() != null && !bo.getKnowledgeBaseId().equals(-1L), AiChatMessage::getKnowledgeBaseId, bo.getKnowledgeBaseId()) + .isNull(bo.getKnowledgeBaseId() != null && bo.getKnowledgeBaseId().equals(-1L), AiChatMessage::getKnowledgeBaseId) .eq(StringUtils.isNotBlank(bo.getMessageType()), AiChatMessage::getMessageType, bo.getMessageType()) .orderByDesc(AiChatMessage::getCreateTime); return lqw;