1.5.2后端

完善AI部分
master
xs 4 months ago
parent 6e269354ac
commit 8f04077a44

@ -39,7 +39,7 @@ public class AiBaseModel {
/** /**
* ai_model_type * ai_model_type
*/ */
private Long modelTypeCode; private String modelTypeCode;
/** /**
* : DeepSeek-V3, Qwen1.5-72B, ChatGLM3 * : DeepSeek-V3, Qwen1.5-72B, ChatGLM3

@ -42,7 +42,7 @@ public class AiBaseModelBo {
* ai_model_type * ai_model_type
*/ */
@NotNull(message = "模型类型编码不能为空", groups = { AddGroup.class, EditGroup.class }) @NotNull(message = "模型类型编码不能为空", groups = { AddGroup.class, EditGroup.class })
private Long modelTypeCode; private String modelTypeCode;
/** /**
* : DeepSeek-V3, Qwen1.5-72B, ChatGLM3 * : DeepSeek-V3, Qwen1.5-72B, ChatGLM3

@ -53,7 +53,7 @@ public class AiBaseModelVo implements Serializable {
* ai_model_type * ai_model_type
*/ */
@ExcelProperty(value = "模型类型编码") @ExcelProperty(value = "模型类型编码")
private Long modelTypeCode; private String modelTypeCode;
/** /**
* : DeepSeek-V3, Qwen1.5-72B, ChatGLM3 * : DeepSeek-V3, Qwen1.5-72B, ChatGLM3

@ -1,21 +1,27 @@
package org.dromara.ai.process.enums; package org.dromara.ai.process.enums;
public enum AIProviderEnum { public enum AIProviderEnum {
DEEPSEEK("DeepSeek"), DEEPSEEK("DeepSeek", 1L),
TONGYI_QIANWEN("TongYi-QianWen"),//阿里通义千问 TENCENT_LKE("Tencent-LKE", 2L),//腾讯云智能体开发平台
TENCENT_LKE("Tencent-LKE"),//腾讯云智能体开发平台 TONGYI_QIANWEN("TongYi-QianWen", 3L);//阿里通义千问
WENXIN_YIYAN("WenXin-YiYan");//百度文心一言
private final String name; 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.name = name;
this.code = code;
} }
public String getName() { public String getName() {
return name; return name;
} }
public Long getCode() {
return code;
}
/** /**
* *
*/ */
@ -28,4 +34,16 @@ public enum AIProviderEnum {
} }
throw new IllegalArgumentException("未知的大模型提供商: " + text); 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);
}
} }

@ -38,4 +38,12 @@ public class AIProviderProcessorFactory {
AIProviderEnum provider = AIProviderEnum.fromString(providerName); AIProviderEnum provider = AIProviderEnum.fromString(providerName);
return getProcessor(provider); return getProcessor(provider);
} }
/**
* base_model_idAPI
*/
public IUnifiedAIProviderProcessor getProcessor(Long baseModelId) {
AIProviderEnum provider = AIProviderEnum.fromCode(baseModelId);
return getProcessor(provider);
}
} }

@ -259,8 +259,8 @@ public class DeepSeekProcessor extends BaseAIProviderProcessor {
AiChatMessageDetail aiChatMessageDetail = new AiChatMessageDetail(); AiChatMessageDetail aiChatMessageDetail = new AiChatMessageDetail();
aiChatMessageDetail.setChatMessageId(aiChatMessage.getChatMessageId()); aiChatMessageDetail.setChatMessageId(aiChatMessage.getChatMessageId());
aiChatMessageDetail.setSessionId(request.getSessionId()); aiChatMessageDetail.setSessionId(request.getSessionId());
aiChatMessageDetail.setQuestionContent(objectMapper.writeValueAsString(messages.get(messages.size() - 1).getContent())); aiChatMessageDetail.setQuestionContent(objectMapper.writeValueAsString(request.getQuestionContent()));
aiChatMessageDetail.setAnswerContent(fullResponse); aiChatMessageDetail.setAnswerContent(objectMapper.writeValueAsString(fullResponse));
// aiChatMessageDetail.setPromptToken(1L); // aiChatMessageDetail.setPromptToken(1L);
// aiChatMessageDetail.setCompletionToken(1L); // aiChatMessageDetail.setCompletionToken(1L);
// aiChatMessageDetail.setTotalToken(1L); // aiChatMessageDetail.setTotalToken(1L);

@ -1,11 +1,10 @@
package org.dromara.ai.service.impl; package org.dromara.ai.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import org.dromara.ai.service.IAiChatMessageDetailService; import org.dromara.ai.domain.AiModel;
import org.dromara.ai.service.IAiChatMessageService; import org.dromara.ai.mapper.AiModelMapper;
import org.dromara.ai.service.IAiModelService;
import org.dromara.ai.test.vectorization.process.IEmbeddingProcessor; 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.AIMessage;
import org.dromara.ai.process.dto.AIRequest; import org.dromara.ai.process.dto.AIRequest;
import org.dromara.ai.process.dto.AIResponse; import org.dromara.ai.process.dto.AIResponse;
@ -33,7 +32,10 @@ import java.util.*;
public class AIAssistantServiceImpl implements IAIAssistantService { public class AIAssistantServiceImpl implements IAIAssistantService {
@Autowired @Autowired
private DatabaseMetaMapper databaseMetaMapper; private SQLServerDatabaseMetaMapper databaseMetaMapper;
@Autowired
private AiModelMapper aiModelMapper;
@Autowired @Autowired
private Map<String, IUnifiedAIProviderProcessor> aiProviderProcessorMap; private Map<String, IUnifiedAIProviderProcessor> aiProviderProcessorMap;
@ -70,7 +72,8 @@ public class AIAssistantServiceImpl implements IAIAssistantService {
} }
final String messageTopic = messages.get(messages.size() - 1).getContent(); final String messageTopic = messages.get(messages.size() - 1).getContent();
finalAiRequest.setMessageTopic(messageTopic); finalAiRequest.setMessageTopic(messageTopic);//暂时跟提问的内容相同,后续可以总结
finalAiRequest.setQuestionContent(messageTopic);
// 尝试获取处理器,如果找不到则抛出异常 // 尝试获取处理器,如果找不到则抛出异常
return Flux.defer(() -> { return Flux.defer(() -> {
@ -96,6 +99,12 @@ public class AIAssistantServiceImpl implements IAIAssistantService {
} }
/**
*
*
* @param aiRequest
* @return
*/
private AIRequest knowledgeChatInfo(AIRequest aiRequest) { private AIRequest knowledgeChatInfo(AIRequest aiRequest) {
try { try {
List<AIMessage> messages = aiRequest.getMessages(); List<AIMessage> messages = aiRequest.getMessages();
@ -110,13 +119,22 @@ public class AIAssistantServiceImpl implements IAIAssistantService {
aiRequest.setText(messageContent); aiRequest.setText(messageContent);
StringBuilder sb = new StringBuilder(messageContent); StringBuilder sb = new StringBuilder(messageContent);
String embeddingProcessor = "Tencent-LKE"; Long embeddingModelId = aiRequest.getEmbeddingModelId();
aiRequest.setApiKey("AKIDyvlTyJTRDmCTXs56uUvDJNK6h9SZVDlB"); AiModel aiModel = aiModelMapper.selectById(embeddingModelId);
aiRequest.setApiSecret("IOXloeHrCLH4iw30lKjxynPq7rPlwugF"); if (aiModel == null) {
IUnifiedAIProviderProcessor tencentLkeProcessor = aiProviderProcessorFactory.getProcessor(embeddingProcessor); 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<Double> queryEmbedding = tencentLkeProcessor.getEmbedding(aiRequest); List<Double> queryEmbedding = tencentLkeProcessor.getEmbedding(aiRequest);
int topK = 5; int topK = aiRequest.getRetrieveLimit() == null || aiRequest.getRetrieveLimit() <= 0 ?
5 : aiRequest.getRetrieveLimit();//retrieveLimit检索限制
List<String> searchResultList = vectorDBService. List<String> searchResultList = vectorDBService.
search(queryEmbedding, aiRequest.getKnowledgeBaseId(), topK); 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 @Override
public boolean testAIModel(String provider, AIRequest aiRequest) { public boolean testAIModel(String provider, AIRequest aiRequest) {
IUnifiedAIProviderProcessor processor = aiProviderProcessorMap.get(provider); 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 "";
}
} }

@ -86,7 +86,8 @@ public class AiChatMessageServiceImpl implements IAiChatMessageService {
.eq(bo.getDeductCost() != null, AiChatMessage::getDeductCost, bo.getDeductCost()) .eq(bo.getDeductCost() != null, AiChatMessage::getDeductCost, bo.getDeductCost())
.eq(bo.getTotalToken() != null, AiChatMessage::getTotalToken, bo.getTotalToken()) .eq(bo.getTotalToken() != null, AiChatMessage::getTotalToken, bo.getTotalToken())
.eq(bo.getModelId() != null, AiChatMessage::getModelId, bo.getModelId()) .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()) .eq(StringUtils.isNotBlank(bo.getMessageType()), AiChatMessage::getMessageType, bo.getMessageType())
.orderByDesc(AiChatMessage::getCreateTime); .orderByDesc(AiChatMessage::getCreateTime);
return lqw; return lqw;

Loading…
Cancel
Save