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 64 import org.springframework.ai.openai.api.OpenAiImageApi;
65 65 import org.springframework.ai.openai.api.common.OpenAiApiConstants;
66 66 import org.springframework.ai.qianfan.QianFanChatModel;
  67 +import org.springframework.ai.qianfan.QianFanEmbeddingModel;
  68 +import org.springframework.ai.qianfan.QianFanEmbeddingOptions;
67 69 import org.springframework.ai.qianfan.QianFanImageModel;
68 70 import org.springframework.ai.qianfan.api.QianFanApi;
69 71 import org.springframework.ai.qianfan.api.QianFanImageApi;
... ... @@ -78,6 +80,7 @@ import org.springframework.ai.vectorstore.qdrant.QdrantVectorStore;
78 80 import org.springframework.ai.vectorstore.redis.RedisVectorStore;
79 81 import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
80 82 import org.springframework.ai.zhipuai.ZhiPuAiEmbeddingModel;
  83 +import org.springframework.ai.zhipuai.ZhiPuAiEmbeddingOptions;
81 84 import org.springframework.ai.zhipuai.ZhiPuAiImageModel;
82 85 import org.springframework.ai.zhipuai.api.ZhiPuAiApi;
83 86 import org.springframework.ai.zhipuai.api.ZhiPuAiImageApi;
... ... @@ -230,11 +233,16 @@ public class AiModelFactoryImpl implements AiModelFactory {
230 233 switch (platform) {
231 234 case TONG_YI:
232 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 238 case ZHI_PU:
237 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 246 default:
239 247 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform));
240 248 }
... ... @@ -443,7 +451,21 @@ public class AiModelFactoryImpl implements AiModelFactory {
443 451 private ZhiPuAiEmbeddingModel buildZhiPuEmbeddingModel(String apiKey, String url, String model) {
444 452 url = StrUtil.blankToDefault(url, ZhiPuAiConnectionProperties.DEFAULT_BASE_URL);
445 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 471 private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) {
... ...