Commit 20eb3013f273d018f84715b64bf10c30d022b8e4

Authored by YunaiV
1 parent 3a3607e1

【功能新增】AI:新增 QianFanEmbeddingModel 向量模型

yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiModelFactoryImpl.java
@@ -64,6 +64,8 @@ import org.springframework.ai.openai.api.OpenAiApi; @@ -64,6 +64,8 @@ import org.springframework.ai.openai.api.OpenAiApi;
64 import org.springframework.ai.openai.api.OpenAiImageApi; 64 import org.springframework.ai.openai.api.OpenAiImageApi;
65 import org.springframework.ai.openai.api.common.OpenAiApiConstants; 65 import org.springframework.ai.openai.api.common.OpenAiApiConstants;
66 import org.springframework.ai.qianfan.QianFanChatModel; 66 import org.springframework.ai.qianfan.QianFanChatModel;
  67 +import org.springframework.ai.qianfan.QianFanEmbeddingModel;
  68 +import org.springframework.ai.qianfan.QianFanEmbeddingOptions;
67 import org.springframework.ai.qianfan.QianFanImageModel; 69 import org.springframework.ai.qianfan.QianFanImageModel;
68 import org.springframework.ai.qianfan.api.QianFanApi; 70 import org.springframework.ai.qianfan.api.QianFanApi;
69 import org.springframework.ai.qianfan.api.QianFanImageApi; 71 import org.springframework.ai.qianfan.api.QianFanImageApi;
@@ -78,6 +80,7 @@ import org.springframework.ai.vectorstore.qdrant.QdrantVectorStore; @@ -78,6 +80,7 @@ import org.springframework.ai.vectorstore.qdrant.QdrantVectorStore;
78 import org.springframework.ai.vectorstore.redis.RedisVectorStore; 80 import org.springframework.ai.vectorstore.redis.RedisVectorStore;
79 import org.springframework.ai.zhipuai.ZhiPuAiChatModel; 81 import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
80 import org.springframework.ai.zhipuai.ZhiPuAiEmbeddingModel; 82 import org.springframework.ai.zhipuai.ZhiPuAiEmbeddingModel;
  83 +import org.springframework.ai.zhipuai.ZhiPuAiEmbeddingOptions;
81 import org.springframework.ai.zhipuai.ZhiPuAiImageModel; 84 import org.springframework.ai.zhipuai.ZhiPuAiImageModel;
82 import org.springframework.ai.zhipuai.api.ZhiPuAiApi; 85 import org.springframework.ai.zhipuai.api.ZhiPuAiApi;
83 import org.springframework.ai.zhipuai.api.ZhiPuAiImageApi; 86 import org.springframework.ai.zhipuai.api.ZhiPuAiImageApi;
@@ -230,11 +233,16 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -230,11 +233,16 @@ public class AiModelFactoryImpl implements AiModelFactory {
230 switch (platform) { 233 switch (platform) {
231 case TONG_YI: 234 case TONG_YI:
232 return buildTongYiEmbeddingModel(apiKey, model); 235 return buildTongYiEmbeddingModel(apiKey, model);
233 - case OLLAMA:  
234 - return buildOllamaEmbeddingModel(url, model);  
235 - // TODO @芋艿:yiyan 236 + case YI_YAN:
  237 + return buildYiYanEmbeddingModel(apiKey, model);
236 case ZHI_PU: 238 case ZHI_PU:
237 return buildZhiPuEmbeddingModel(apiKey, url, model); 239 return buildZhiPuEmbeddingModel(apiKey, url, model);
  240 +// case OPENAI:
  241 +// return buildOpenAiChatModel(apiKey, url);
  242 +// case AZURE_OPENAI:
  243 +// return buildAzureOpenAiChatModel(apiKey, url);
  244 + case OLLAMA:
  245 + return buildOllamaEmbeddingModel(url, model);
238 default: 246 default:
239 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); 247 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform));
240 } 248 }
@@ -443,7 +451,21 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -443,7 +451,21 @@ public class AiModelFactoryImpl implements AiModelFactory {
443 private ZhiPuAiEmbeddingModel buildZhiPuEmbeddingModel(String apiKey, String url, String model) { 451 private ZhiPuAiEmbeddingModel buildZhiPuEmbeddingModel(String apiKey, String url, String model) {
444 url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL); 452 url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL);
445 ZhiPuAiApi zhiPuAiApi = new ZhiPuAiApi(url, apiKey); 453 ZhiPuAiApi zhiPuAiApi = new ZhiPuAiApi(url, apiKey);
446 - return new ZhiPuAiEmbeddingModel(zhiPuAiApi); 454 + ZhiPuAiEmbeddingOptions zhiPuAiEmbeddingOptions = ZhiPuAiEmbeddingOptions.builder().model(model).build();
  455 + return new ZhiPuAiEmbeddingModel(zhiPuAiApi, MetadataMode.EMBED, zhiPuAiEmbeddingOptions);
  456 + }
  457 +
  458 + /**
  459 + * 可参考 {@link QianFanAutoConfiguration} 的 qianFanEmbeddingModel 方法
  460 + */
  461 + private QianFanEmbeddingModel buildYiYanEmbeddingModel(String key, String model) {
  462 + List<String> keys = StrUtil.split(key, '|');
  463 + Assert.equals(keys.size(), 2, "YiYanChatClient 的密钥需要 (appKey|secretKey) 格式");
  464 + String appKey = keys.get(0);
  465 + String secretKey = keys.get(1);
  466 + QianFanApi qianFanApi = new QianFanApi(appKey, secretKey);
  467 + QianFanEmbeddingOptions qianFanEmbeddingOptions = QianFanEmbeddingOptions.builder().model(model).build();
  468 + return new QianFanEmbeddingModel(qianFanApi, MetadataMode.EMBED, qianFanEmbeddingOptions);
447 } 469 }
448 470
449 private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) { 471 private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) {