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 接口使用泛型,让不同类型的模型(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 {
- 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 作为最基础的抽象,所有具体模型都继承它。这样既保证了统一性,又保持了灵活性。新模型只需要实现接口,就能无缝集成。
工具与模型完全隔离。这是 Spring AI 设计的一个亮点。模型只负责推理,工具负责执行,通过 ToolCallingManager 协调。这种设计让系统既灵活又易于扩展,想加新工具?实现 ToolCallback 接口就行。
支持流式处理。通过 StreamingModel 接口,所有模型都可以支持流式响应,这对于大模型的实时交互非常重要。用户不需要等完整响应,可以边生成边显示。
总的来说,spring-ai-model 模块是一个设计得不错、职责清晰的核心抽象层。它为整个 Spring AI 框架提供了坚实的基础,让上层的实现可以专注于具体的业务逻辑,而不需要关心底层的抽象细节。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |