spring-ai-alibaba 1.0.0.2 学习(三)——配置

与spring-ai接入的其他大模型一样,spring-ai-alibaba也有大模型的通用配置和个性化配置

最小化样例

我们如果想要进行模型配置,有三种方式

第一种:通过配置文件自动装配

spring.ai.dashscope.chat.options.model=qwen-plus

通过上述配置,我们指定大模型型号为qwen-plus,生效的前提是在相关AutoConfiguration包中使用该属性进行了Bean属性声明

第二种:创建ChatClient时配置

    
        chatClient = builder.defaultOptions(
                DashScopeChatOptions.builder()
                        .withModel("qwen-plus")
                        .build()
        ).build();
    

第三种:调用大模型时配置

    @GetMapping("/option")
    public String chat(String input) {
        return chatClient.prompt()
                .options(
                        DashScopeChatOptions.builder()
                                .withModel("qwen-plus")
                                .build()   
                )
                .user(input)
                .call()
                .content();
    }

上述三种方法优先级依次提高,调用大模型时的配置最高,会覆盖其他配置

进阶知识

配置查找

那么知道了如何使用配置,我们如何确定spring-ai-alibaba中是否存在某个配置呢?

1)查看相关Options类

例如我们想对百炼大模型进行配置,找到DashScopeChatModel类中的配置类DashScopeChatOptions,可以查看其中有哪些配置项

但是此方法只适用于前面提到的第二种和第三种配置方法(defaultOptions和options),如果想要使用第一种配置方法(配置文件),如何找到类似spring.ai.dashscope.chat.options.model的配置名称?可以通过后面这两种方法

2)查看spring-configuration-metadata.json文件

我们可以查看相关AutoConfiguration包中的spring-configuration-metadata.json文件,该文件包含了此包用到的配置属性

例如,我们可以在spring-ai-alibaba-autoconfigure-dashscope包中的spring-configuration-metadata.json,通过搜索DashScopeChatOptions类找到spring.ai.dashscope.chat.options.model的配置

    {
      "name": "spring.ai.dashscope.chat.options.model",
      "type": "java.lang.String",
      "sourceType": "com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions"
    }

ps:双击shift,然后输入配置名也可以跳转到spring-configuration-metadata.json文件对应的位置

3)跟踪自动配置类

我们可以通过自动配置类的创建方法,跟踪其参数来源,结合ConfigurationProperties注解,确认其配置名称

例如,我们可以在spring-ai-alibaba-autoconfigure-dashscope包中的DashScopeChatAutoConfiguration类中找到百炼大模型DashScopeChatModel的创建方法,其入参中包含DashScopeConnectionProperties和DashScopeChatProperties两个参数类

DashScopeChatProperties上注解@ConfigurationProperties("spring.ai.dashscope.chat")表明其属性前缀为spring.ai.dashscope.chat,然后在其options属性中找到model,确认其最终配置名称为spring.ai.dashscope.chat.options.model

路线为:对应自动配置包 -> 对应自动配置类 -> 对应自动配置方法 -> 参数类 -> 注解+属性名

存在问题

文档较少:spring-ai-alibaba相比spring-ai增加了一些配置,然而在spring-ai-alibaba官方网站中,底层功能的相关教程仍然使用的spring-ai进行教学,并没有太多关于这些配置项的说明,我们只能类比其他模型的配置来估计这些配置的作用或通过源码查看

api-key问题:api-key尽量直接配置spring.ai.dashscope.api-key

如果只配置spring.ai.dashscope.chat.api-key,会报错提示spring.ai.dashscope.audio.synthesis.api-key未配置,即使你并不想使用这个模型(该模型配置没有enabled配置项)

而且即使是配置了spring.ai.dashscope.embedding.enabled=false,不配置spring.ai.dashscope.embedding.api-key的话也会报错

DashScopeChatOptions常用配置

model:模型型号,如qwen-plus、qwen-turbo、qwen-max等

temperature:温度,代表大模型生成的随机性和多样性,取值范围0-2,默认0.85,越接近0则大模型自由发挥越少,适合确定性高的操作,比如检索事实性内容,越接近2则大模型自由发挥越多,适合创作型的操作,比如生成优美文案

top_p:作用与temperature相似,取值范围0-1,默认0.8,越接近1则大模型自由发挥越多,越接近0则大模型自由发挥越少

enable_search: 是否开启联网搜索,默认false,用过deepseek的应该都知道,与页面中的“联网搜索”按钮功能一样,开启联网搜索功能后,大模型会根据用户输入联网搜索相关内容,然后生成回答

enable_thinking: 是否开启深度思考模式,默认false,同样类比deepseek应用的深度思考按钮

responseFormat:响应格式,目前支持文本和json:{"type":"text"}  {"type":"json_object"}

org.springframework.ai.retry.NonTransientAiException: HTTP 400 - {"requestId":"e7086b88-920b-97cf-b5a0-5b325342240f","code":"InvalidParameter","message":"No static resource api-openai/v1/embeddings/api/v1/services/embeddings/text-embedding/text-embedding."} at org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration$2.handleError(SpringAiRetryAutoConfiguration.java:109) ~[spring-ai-autoconfigure-retry-1.0.0.jar:1.0.0] at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.StatusHandler.lambda$fromErrorHandler$1(StatusHandler.java:71) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.StatusHandler.handle(StatusHandler.java:146) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.applyStatusHandlers(DefaultRestClient.java:680) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:200) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.readBody(DefaultRestClient.java:667) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntityInternal(DefaultRestClient.java:637) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntity(DefaultRestClient.java:626) ~[spring-web-6.1.6.jar:6.1.6] at com.alibaba.cloud.ai.dashscope.api.DashScopeApi.embeddings(DashScopeApi.java:344) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel.lambda$call$1(DashScopeEmbeddingModel.java:143) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:335) ~[spring-retry-2.0.5.jar:na] at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:211) ~[spring-retry-2.0.5.jar:na] at com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel.lambda$call$3(DashScopeEmbeddingModel.java:141) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at io.micrometer.observation.Observation.observe(Observation.java:565) ~[micrometer-observation-1.12.5.jar:1.12.5] at com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel.call(DashScopeEmbeddingModel.java:140) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at org.springframework.ai.embedding.EmbeddingModel.embed(EmbeddingModel.java:67) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.embedding.EmbeddingModel.embed(EmbeddingModel.java:49) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.embedding.AbstractEmbeddingModel.dimensions(AbstractEmbeddingModel.java:70) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.embedding.AbstractEmbeddingModel.dimensions(AbstractEmbeddingModel.java:95) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.vectorstore.redis.RedisVectorStore.createObservationContextBuilder(RedisVectorStore.java:461) ~[spring-ai-redis-store-1.0.0.jar:1.0.0] at org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore.add(AbstractObservationVectorStore.java:79) ~[spring-ai-vector-store-1.0.0.jar:1.0.0] at com.serviceai.config.CommonConfiguration.lambda$vectorStoreInitializer$0(CommonConfiguration.java:72) ~[classes/:na] at org.springframework.boot.SpringApplication.lambda$callRunner$4(SpringApplication.java:786) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:83) ~[spring-core-6.1.6.jar:6.1.6] at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60) ~[spring-core-6.1.6.jar:6.1.6] at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:88) ~[spring-core-6.1.6.jar:6.1.6] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:786) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:774) ~[spring-boot-3.2.5.jar:3.2.5] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na] at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[na:na] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[na:na] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na] at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:774) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:341) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.5.jar:3.2.5] at com.serviceai.ServiceAiApplication.main(ServiceAiApplication.java:10) ~[classes/:na] 这个报错
09-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxsy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值