当前位置: 首页 > news >正文

Spring AI 代码分析(二)--Model 领域

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. 领域模型关系图

ZLTVRnj547_VJx6a3xoGql97oaEmMb9Rug4ImaOy81xMTslxbBlTOtUjj08aa34IYak55102WQ6e8XAefN9G2stfbydvd2U-0dlMvjYvkREmfIGxlz_CpMzdPsvpHHkcp3Y92NdEZ7Z2QHgpI12z7ucKAPPG8KEkUKelN_ACYedzmlYIRqnPiC-6l6jknfmg7XWcXZ77XDVjhw6I.png

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. 入口类与关键类关系

image.png

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 框架提供了坚实的基础,让上层的实现可以专注于具体的业务逻辑,而不需要关心底层的抽象细节。

http://www.jsqmd.com/news/44900/

相关文章:

  • gdb实践((2510更新)
  • Mars项目与TensorFlow集成指南
  • win10/win11系统默认应用或文件打开方式重启后被自动重置的解决办法
  • 详细介绍:第八节_PySide6基本窗口控件_按钮类控件(QAbstractButton)
  • 哪里有免费的编程体验课?2025国内外优质平台与真实体验价值分析
  • 2025 上海办公室 商铺装修核心服务商 TOP5 解析报告:双场景适配能力与品质选型全景指南
  • Luogu P6234 [eJOI 2019] T 形覆盖 题解 [ 紫 ] [ 图论建模 ] [ 分类讨论 ] [ 基环树 ]
  • gemini3-思考模式 测评
  • AI Compass前沿速览:Gemini 3、Grok 4.1、GPT-5.1、千问、Lumine-3D开世界AI智能体
  • 人工智能之编程进阶 Python高级:第八章 网络并发类模块
  • 2025CCPC济南站游记
  • ssh登录报错Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password
  • Bisq交易协议全解析:从多签到MuSig的技术演进
  • 十六岁的断章
  • 浅谈 fhq-treap —— 或是 Splay 的不二选择?
  • vba 处理特定段落前的表观空行中的分页符
  • 人工智能之编程进阶 Python高级:第六章 文件类模块
  • PQ v.Next Alpha阶段发布
  • 国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照框架中的深度应用
  • 三分稀疏图染色的多项式时间证明
  • 251119
  • 实用指南:分布式架构未来趋势:从云原生到智能边缘的演进之路
  • 人工智能之编程进阶 Python高级:第七章 数据库类模块
  • linux for 跳出循环
  • 用USB BLASTER II 下载sof文件没有问题,debug波形也没有问题。但是下载jic问题异常?
  • Linux用户管理相关知识
  • AI浪潮下的机遇与挑战:从巨头动态看未来趋势
  • CCF GESP 五级真题考频与知识点速查表
  • 推迟win11更新137年的方法
  • linux for 死循环