Commit 20eb3013f273d018f84715b64bf10c30d022b8e4
1 parent
3a3607e1
【功能新增】AI:新增 QianFanEmbeddingModel 向量模型
Showing
1 changed file
with
26 additions
and
4 deletions
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) { |