Commit b9e8495712de03b9c7e215b43f772c0c9b85ef0a

Authored by YunaiV
1 parent 20eb3013

【功能新增】AI:新增 AzureOpenAiEmbeddingModel、OpenAiEmbeddingModel 向量模型

yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiModelFactoryImpl.java
@@ -35,6 +35,7 @@ import lombok.SneakyThrows; @@ -35,6 +35,7 @@ import lombok.SneakyThrows;
35 import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; 35 import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration;
36 import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiChatProperties; 36 import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiChatProperties;
37 import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiConnectionProperties; 37 import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiConnectionProperties;
  38 +import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiEmbeddingProperties;
38 import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration; 39 import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration;
39 import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; 40 import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration;
40 import org.springframework.ai.autoconfigure.qianfan.QianFanAutoConfiguration; 41 import org.springframework.ai.autoconfigure.qianfan.QianFanAutoConfiguration;
@@ -49,6 +50,7 @@ import org.springframework.ai.autoconfigure.vectorstore.redis.RedisVectorStorePr @@ -49,6 +50,7 @@ import org.springframework.ai.autoconfigure.vectorstore.redis.RedisVectorStorePr
49 import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiAutoConfiguration; 50 import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiAutoConfiguration;
50 import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiConnectionProperties; 51 import org.springframework.ai.autoconfigure.zhipuai.ZhiPuAiConnectionProperties;
51 import org.springframework.ai.azure.openai.AzureOpenAiChatModel; 52 import org.springframework.ai.azure.openai.AzureOpenAiChatModel;
  53 +import org.springframework.ai.azure.openai.AzureOpenAiEmbeddingModel;
52 import org.springframework.ai.chat.model.ChatModel; 54 import org.springframework.ai.chat.model.ChatModel;
53 import org.springframework.ai.document.MetadataMode; 55 import org.springframework.ai.document.MetadataMode;
54 import org.springframework.ai.embedding.BatchingStrategy; 56 import org.springframework.ai.embedding.BatchingStrategy;
@@ -59,6 +61,8 @@ import org.springframework.ai.ollama.OllamaEmbeddingModel; @@ -59,6 +61,8 @@ import org.springframework.ai.ollama.OllamaEmbeddingModel;
59 import org.springframework.ai.ollama.api.OllamaApi; 61 import org.springframework.ai.ollama.api.OllamaApi;
60 import org.springframework.ai.ollama.api.OllamaOptions; 62 import org.springframework.ai.ollama.api.OllamaOptions;
61 import org.springframework.ai.openai.OpenAiChatModel; 63 import org.springframework.ai.openai.OpenAiChatModel;
  64 +import org.springframework.ai.openai.OpenAiEmbeddingModel;
  65 +import org.springframework.ai.openai.OpenAiEmbeddingOptions;
62 import org.springframework.ai.openai.OpenAiImageModel; 66 import org.springframework.ai.openai.OpenAiImageModel;
63 import org.springframework.ai.openai.api.OpenAiApi; 67 import org.springframework.ai.openai.api.OpenAiApi;
64 import org.springframework.ai.openai.api.OpenAiImageApi; 68 import org.springframework.ai.openai.api.OpenAiImageApi;
@@ -227,6 +231,7 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -227,6 +231,7 @@ public class AiModelFactoryImpl implements AiModelFactory {
227 } 231 }
228 232
229 @Override 233 @Override
  234 + @SuppressWarnings("EnhancedSwitchMigration")
230 public EmbeddingModel getOrCreateEmbeddingModel(AiPlatformEnum platform, String apiKey, String url, String model) { 235 public EmbeddingModel getOrCreateEmbeddingModel(AiPlatformEnum platform, String apiKey, String url, String model) {
231 String cacheKey = buildClientCacheKey(EmbeddingModel.class, platform, apiKey, url, model); 236 String cacheKey = buildClientCacheKey(EmbeddingModel.class, platform, apiKey, url, model);
232 return Singleton.get(cacheKey, (Func0<EmbeddingModel>) () -> { 237 return Singleton.get(cacheKey, (Func0<EmbeddingModel>) () -> {
@@ -237,10 +242,10 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -237,10 +242,10 @@ public class AiModelFactoryImpl implements AiModelFactory {
237 return buildYiYanEmbeddingModel(apiKey, model); 242 return buildYiYanEmbeddingModel(apiKey, model);
238 case ZHI_PU: 243 case ZHI_PU:
239 return buildZhiPuEmbeddingModel(apiKey, url, model); 244 return buildZhiPuEmbeddingModel(apiKey, url, model);
240 -// case OPENAI:  
241 -// return buildOpenAiChatModel(apiKey, url);  
242 -// case AZURE_OPENAI:  
243 -// return buildAzureOpenAiChatModel(apiKey, url); 245 + case OPENAI:
  246 + return buildOpenAiEmbeddingModel(apiKey, url, model);
  247 + case AZURE_OPENAI:
  248 + return buildAzureOpenAiEmbeddingModel(apiKey, url, model);
244 case OLLAMA: 249 case OLLAMA:
245 return buildOllamaEmbeddingModel(url, model); 250 return buildOllamaEmbeddingModel(url, model);
246 default: 251 default:
@@ -474,6 +479,33 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -474,6 +479,33 @@ public class AiModelFactoryImpl implements AiModelFactory {
474 return OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build(); 479 return OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build();
475 } 480 }
476 481
  482 + /**
  483 + * 可参考 {@link OpenAiAutoConfiguration} 的 openAiEmbeddingModel 方法
  484 + */
  485 + private OpenAiEmbeddingModel buildOpenAiEmbeddingModel(String openAiToken, String url, String model) {
  486 + url = StrUtil.blankToDefault(url, OpenAiApiConstants.DEFAULT_BASE_URL);
  487 + OpenAiApi openAiApi = OpenAiApi.builder().baseUrl(url).apiKey(openAiToken).build();
  488 + OpenAiEmbeddingOptions openAiEmbeddingProperties = OpenAiEmbeddingOptions.builder().model(model).build();
  489 + return new OpenAiEmbeddingModel(openAiApi, MetadataMode.EMBED, openAiEmbeddingProperties);
  490 + }
  491 +
  492 + // TODO @芋艿:手头暂时没密钥,使用建议再测试下
  493 + /**
  494 + * 可参考 {@link AzureOpenAiAutoConfiguration} 的 azureOpenAiEmbeddingModel 方法
  495 + */
  496 + private AzureOpenAiEmbeddingModel buildAzureOpenAiEmbeddingModel(String apiKey, String url, String model) {
  497 + AzureOpenAiAutoConfiguration azureOpenAiAutoConfiguration = new AzureOpenAiAutoConfiguration();
  498 + // 创建 OpenAIClient 对象
  499 + AzureOpenAiConnectionProperties connectionProperties = new AzureOpenAiConnectionProperties();
  500 + connectionProperties.setApiKey(apiKey);
  501 + connectionProperties.setEndpoint(url);
  502 + OpenAIClientBuilder openAIClient = azureOpenAiAutoConfiguration.openAIClientBuilder(connectionProperties, null);
  503 + // 获取 AzureOpenAiChatProperties 对象
  504 + AzureOpenAiEmbeddingProperties embeddingProperties = SpringUtil.getBean(AzureOpenAiEmbeddingProperties.class);
  505 + return azureOpenAiAutoConfiguration.azureOpenAiEmbeddingModel(openAIClient, embeddingProperties,
  506 + null, null);
  507 + }
  508 +
477 // ========== 各种创建 VectorStore 的方法 ========== 509 // ========== 各种创建 VectorStore 的方法 ==========
478 510
479 /** 511 /**