1. 问题背景与核心挑战
在基于Spring AI框架开发智能应用时,多AI服务集成是一个常见需求。许多开发者会遇到一个典型的技术障碍:当项目中同时引入多个AI服务提供商的依赖(如Ollama、DeepSeek等)后,直接使用Spring AI官方文档推荐的ChatClient初始化方式会导致Bean冲突异常。
这个问题的本质在于Spring框架的依赖注入机制。ChatClient.Builder在构建时会自动查找并绑定上下文中的ChatModel实现类。当存在多个ChatModel实现时(每个AI服务提供商通常都会提供自己的实现),Spring无法确定应该注入哪一个,从而抛出NoUniqueBeanDefinitionException异常。
提示:这个问题不仅出现在AI服务集成场景,任何基于Spring的多实现类注入场景都可能遇到类似的冲突问题。理解这个问题的解决思路对Spring开发者具有普遍参考价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案设计思路
2.1 传统方案的局限性
最简单的"解决方案"是保持项目中只包含一个AI服务依赖。这种方法虽然能避免冲突,但存在明显缺陷:
- 灵活性丧失:无法根据业务场景(如成本、响应速度、功能特性)动态切换AI服务
- 扩展性差:每次切换服务都需要修改pom.xml并重新部署
- 测试困难:难以进行多服务的结果对比测试
2.2 最优解:显式声明多ChatClient Bean
更专业的解决方案是为每个AI服务显式声明独立的ChatClient Bean。这种设计模式的核心优势在于:
- 明确绑定:每个
ChatClient显式绑定到特定的ChatModel实现 - 按需注入:在业务代码中可以通过Bean名称精确指定要使用的服务
- 解耦设计:新增或移除AI服务不会影响现有代码
3. 详细实现步骤
3.1 项目依赖配置
首先确保pom.xml中包含所需的AI服务依赖。以下是典型配置示例:
xml复制<!-- Spring AI基础依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>0.8.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Ollama服务支持 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
<!-- DeepSeek服务支持 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-deepseek-spring-boot-starter</artifact
