Spring AI文档学习:多聊天模型配置

前置:application.yml(阿里云百炼作为 OpenAI 兼容端点)

yaml 复制代码
spring:
  ai:
    openai:
      api-key: ${DASHSCOPE_API_KEY}
      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
      chat:
        options:
          model: qwen-plus

说明:api-key 使用百炼控制台里的 API Key;model 用百炼里在「OpenAI 兼容」下支持的模型名(如 qwen-plusqwen-max 等,以控制台为准)。

方法一:同一模型类型(都是 OpenAiChatModel / 百炼),多个 ChatClient

差别只在 ChatClient 层默认行为(例如不同系统提示),底层仍是同一个注入的 OpenAiChatModel

kotlin 复制代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BailianMultiClientConfig {

    @Bean
    public ChatClient conciseBailianClient(OpenAiChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem("你是简洁助手,回答尽量短。")
                .build();
    }

    @Bean
    public ChatClient detailedBailianClient(OpenAiChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem("你是详细助手,先列要点再展开。")
                .build();
    }
}

@Qualifier("conciseBailianClient") / @Qualifier("detailedBailianClient") 注入即可。

方法二:不同模型类型,多个 ChatClient(百炼 OpenAI 兼容 + 另一家)

这里 第一类仍是百炼(OpenAiChatModel + 上面 yml)。第二类换厂商时用另一种 ChatModel(示例用 Anthropic;需引入对应 Spring AI starter 并配置密钥)。

kotlin 复制代码
import org.springframework.ai.anthropic.AnthropicChatModel;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MultiVendorChatClientConfig {

    /** 百炼:OpenAI 兼容,底层是 OpenAiChatModel */
    @Bean
    public ChatClient bailianChatClient(OpenAiChatModel openAiChatModel) {
        return ChatClient.builder(openAiChatModel)
                .defaultSystem("你通过阿里云百炼(OpenAI 兼容)回答问题。")
                .build();
    }

    /** 另一家:原生 Anthropic API */
    @Bean
    public ChatClient anthropicChatClient(AnthropicChatModel anthropicChatModel) {
        return ChatClient.builder(anthropicChatModel)
                .defaultSystem("你通过 Anthropic API 回答问题。")
                .build();
    }
}

要点:百炼走 OpenAI 兼容 → OpenAiChatModel;Anthropic 走自己的 AnthropicChatModel,这是「不同模型类型」在 Spring AI 里的典型拆法。

方法三:多个 OpenAI 兼容端点(百炼 + 另一个 OpenAI 兼容服务)

仍只用 OpenAiApi / OpenAiChatModel,通过 mutate()baseUrlapiKey、默认 model。第二个端点可以是:官方 OpenAI、Groq、其它国内兼容网关等,协议形状与 OpenAI 一致即可。

scss 复制代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MultiOpenAiCompatibleEndpointsService {

    @Autowired
    private OpenAiChatModel baseChatModel;

    @Autowired
    private OpenAiApi baseOpenAiApi;

    public void compareTwoEndpoints(String userMessage) {
        // 端点 A:阿里云百炼(北京 OpenAI 兼容)
        OpenAiApi bailianApi = baseOpenAiApi.mutate()
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .build();

        OpenAiChatModel bailianModel = baseChatModel.mutate()
                .openAiApi(bailianApi)
                .defaultOptions(OpenAiChatOptions.builder()
                        .model("qwen-plus")
                        .temperature(0.3)
                        .build())
                .build();

        // 端点 B:另一个 OpenAI 兼容服务(示例:请换成你真实的 URL / Key / 模型名)
        OpenAiApi otherApi = baseOpenAiApi.mutate()
                .baseUrl("https://api.openai.com/v1")  // 或其它兼容网关
                .apiKey(System.getenv("OPENAI_API_KEY"))
                .build();

        OpenAiChatModel otherModel = baseChatModel.mutate()
                .openAiApi(otherApi)
                .defaultOptions(OpenAiChatOptions.builder()
                        .model("gpt-4o-mini")
                        .temperature(0.3)
                        .build())
                .build();

        String r1 = ChatClient.builder(bailianModel).build()
                .prompt(userMessage).call().content();
        String r2 = ChatClient.builder(otherModel).build()
                .prompt(userMessage).call().content();

        // 使用 r1 / r2
    }
}

若两个都是百炼,只是 地域或模型不同,把「端点 B」改成例如新加坡兼容地址,并只改 model 即可

相关推荐
陈随易3 小时前
pm2 替代品,nodejs&bun 线上部署必备工具
前端·后端·程序员
ZGIAI3 小时前
ZGI Skill Loop:给工具调用设边界
人工智能·架构
ZGIAI3 小时前
ZGI 工作区权限:用户为何看不到资源
人工智能·架构
FlagOS智算系统软件栈3 小时前
Qwen3.8-Flash-Next发布首日适配 8 款AI芯片,众智FlagOS跑通并优化新一代混合注意力架构
人工智能·架构
丘山一郎4 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野4 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
Hrain-AI4 小时前
Qwen4 架构预览解读:GDN+QSA 混合注意力如何把激活参数压到 6B
人工智能·架构·开源
MetaLite4 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
许彰午4 小时前
14-字段级SM4加密与SM2签名
java·低代码·架构
数智启示录4 小时前
Flink CDC 机制精讲(二):Checkpoint Barrier 如何形成一致快照 【面试宝典】
大数据·经验分享·面试·flink