Spring AI Model 领域划分分析
请关注微信公众号:阿呆-bot
1. 工程结构概览
spring-ai-model 是 Spring AI 的核心抽象模块,它定义了所有 AI 模型能力的统一接口。从 DDD(领域驱动设计)的角度来看,这个模块清晰地划分了不同的领域边界。
spring-ai-model/
├── model/ # 核心模型抽象层
│ ├── Model.java # 通用模型接口
│ ├── ModelRequest.java # 模型请求抽象
│ ├── ModelResponse.java # 模型响应抽象
│ └── tool/ # 工具调用管理(与模型隔离)
│
├── chat/ # 对话领域
│ ├── model/ # ChatModel 接口
│ ├── messages/ # 消息类型(UserMessage、AssistantMessage 等)
│ ├── prompt/ # Prompt 构建
│ └── memory/ # 对话记忆
│
├── embedding/ # 嵌入领域
│ ├── EmbeddingModel.java
│ └── DocumentEmbeddingModel.java
│
├── image/ # 图像生成领域
│ └── ImageModel.java
│
├── audio/ # 音频处理领域
│ ├── transcription/ # 语音转文字
│ └── tts/ # 文字转语音
│
├── tool/ # 工具调用领域(独立于模型)
│ ├── ToolCallback.java
│ ├── ToolDefinition.java
│ └── annotation/
│
└── converter/ # 输出转换领域└── StructuredOutputConverter.java
2. DDD 领域划分
从领域驱动设计的角度看,spring-ai-model 模块清晰地划分了以下几个领域:
2.1 核心模型领域(Model Domain)
这是最基础的领域,定义了所有 AI 模型的通用抽象。Model<TReq, TRes> 接口使用泛型,让不同类型的模型(Chat、Embedding、Image 等)都能统一在这个抽象下。
2.2 对话领域(Chat Domain)
对话领域包含了完整的对话能力:
- ChatModel:对话模型接口
- Message:消息抽象(UserMessage、AssistantMessage、SystemMessage 等)
- Prompt:提示词构建,包含消息列表和选项
- ChatMemory:对话记忆管理
2.3 嵌入领域(Embedding Domain)
专门处理文本向量化:
- EmbeddingModel:嵌入模型接口
- DocumentEmbeddingModel:文档级别的嵌入
- 支持批量处理和批处理策略
2.4 图像领域(Image Domain)
图像生成能力:
- ImageModel:图像生成模型接口
- 支持文本到图像的转换
2.5 音频领域(Audio Domain)
音频处理分为两个子领域:
- TranscriptionModel:语音转文字
- TextToSpeechModel:文字转语音
2.6 工具调用领域(Tool Domain)
工具调用是一个独立的领域,与模型领域完全隔离。这体现了 Spring AI 的设计智慧:模型负责推理,工具负责执行。
3. 领域模型关系图

4. 关键代码实现分析
4.1 Chat 领域实现
Chat 领域的核心是 ChatModel 接口,它继承了通用的 Model 接口:
public interface ChatModel extends Model<Prompt, ChatResponse>, StreamingChatModel {ChatResponse call(Prompt prompt);default Flux<ChatResponse> stream(Prompt prompt) { ... }
}
Prompt 是对话领域的核心值对象,它封装了消息列表和选项:
public class Prompt implements ModelRequest<List<Message>> {private final List<Message> messages;private ChatOptions chatOptions;// 支持消息增强,比如 RAG 场景下注入上下文public Prompt augmentSystemMessage(String newSystemText) { ... }public Prompt augmentUserMessage(String newUserText) { ... }
}
4.2 Embedding 领域实现
Embedding 模型的设计很巧妙,支持单文本、批量文本和文档级别的嵌入:
public interface EmbeddingModel extends Model<EmbeddingRequest, EmbeddingResponse> {// 单文本嵌入default float[] embed(String text) { ... }// 批量嵌入default List<float[]> embed(List<String> texts) { ... }// 文档嵌入(支持批处理策略)default List<float[]> embed(List<Document> documents, EmbeddingOptions options, BatchingStrategy strategy) { ... }
}
4.3 Audio 领域实现
音频领域分为转录和语音合成两个独立的模型:
// 语音转文字
public interface TranscriptionModel extends Model<AudioTranscriptionPrompt, AudioTranscriptionResponse> {default String transcribe(Resource resource) { ... }
}// 文字转语音
public interface TextToSpeechModel extends Model<TextToSpeechPrompt, TextToSpeechResponse> {// 生成语音资源
}
4.4 Image 领域实现
图像生成模型接口非常简洁:
@FunctionalInterface
public interface ImageModel extends Model<ImagePrompt, ImageResponse> {ImageResponse call(ImagePrompt request);
}
5. Model 和 Tool 的隔离机制
这是 Spring AI 设计的一个亮点:模型和工具完全隔离。这种设计有几个好处:
5.1 职责分离
- Model:负责与 AI 模型交互,处理推理请求
- Tool:负责执行具体的业务逻辑(比如调用 API、查询数据库)
5.2 通过 ToolCallingManager 协调
ToolCallingManager 是模型和工具之间的桥梁:
public interface ToolCallingManager {// 从模型的工具调用选项中解析工具定义List<ToolDefinition> resolveToolDefinitions(ToolCallingChatOptions chatOptions);// 执行模型请求的工具调用ToolExecutionResult executeToolCalls(Prompt prompt, ChatResponse chatResponse);
}
5.3 工具注册机制
工具通过 ToolCallback 接口定义,可以来自:
@Tool注解的方法- 手动注册的
ToolCallback实例 - 函数式接口
这种设计让模型不知道工具的具体实现,工具也不知道模型的具体类型,实现了完美的解耦。
6. 入口类与关键类关系

7. 外部依赖
spring-ai-model 模块的依赖非常精简:
- Spring Framework:基础框架支持
- Reactor Core:响应式流式处理支持
- Jackson:JSON 处理(用于工具调用的 Schema 生成)
- 无其他 Spring AI 模块依赖:保持核心抽象的纯净性
8. 工程总结
spring-ai-model 模块的设计有几个值得学习的地方:
领域划分清晰。Chat、Embedding、Image、Audio 各自独立,互不干扰。每个领域都有自己的请求/响应类型,避免了类型混乱。这样设计的好处是,想加新功能时不会影响现有代码。
抽象层次合理。Model<TReq, TRes> 作为最基础的抽象,所有具体模型都继承它。这样既保证了统一性,又保持了灵活性。新模型只需要实现接口,就能无缝集成。
工具与模型完全隔离。这是 Spring AI 设计的一个亮点。模型只负责推理,工具负责执行,通过 ToolCallingManager 协调。这种设计让系统既灵活又易于扩展,想加新工具?实现 ToolCallback 接口就行。
支持流式处理。通过 StreamingModel 接口,所有模型都可以支持流式响应,这对于大模型的实时交互非常重要。用户不需要等完整响应,可以边生成边显示。
总的来说,spring-ai-model 模块是一个设计得不错、职责清晰的核心抽象层。它为整个 Spring AI 框架提供了坚实的基础,让上层的实现可以专注于具体的业务逻辑,而不需要关心底层的抽象细节。