当前位置: 首页 > 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.rkmt.cn/news/54493.html

相关文章:

  • Mars项目与TensorFlow集成指南
  • Luogu P6234 [eJOI 2019] T 形覆盖 题解 [ 紫 ] [ 图论建模 ] [ 分类讨论 ] [ 基环树 ]
  • gemini3-思考模式 测评
  • ssh登录报错Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password
  • 人工智能之编程进阶 Python高级:第六章 文件类模块
  • 国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照框架中的深度应用
  • 用USB BLASTER II 下载sof文件没有问题,debug波形也没有问题。但是下载jic问题异常?
  • AI浪潮下的机遇与挑战:从巨头动态看未来趋势
  • linux for 死循环
  • 注册表禁用/启用Windows系统更新
  • PID 文件不一致导致 REDIS 一直重启
  • Linux for OneNote
  • linux for in seq
  • 高级程序语言设计第6次
  • 深入解析:Flink 实验性特性把“已预分区”的 DataStream 重新解释为 KeyedStream
  • 2025密炼机厂家实力榜:大连华韩领衔 四大品牌凭技术与口碑领跑橡塑机械行业
  • 2025矿物铸件厂家推荐排行榜:头部企业实力领跑,四星厂商凭细分优势站稳脚跟
  • Python 中 pymysql 操作 MySQL 数据库实操指南
  • 如何优雅地看着电脑为你打工? - Magic
  • 告别内网限制!用StirlingPDF+cpolar打造可远程访问的PDF程序站
  • 用localStorage 模拟SharedWorker
  • 千问快速review评审Java工程代码与异步代码智能体
  • 石油天然气行业OT/ICS安全:守护全球经济命脉的关键防线
  • trae编译器前端agent提示词
  • 2025 年最新http 代理服务商权威推荐排行榜:百万级 IP 资源 + 国际认证高可用率,爬虫 / 动态 / 高匿代理优选指南不限量 http 代理/独享 http 代理平台推荐
  • 安装部署opengauss
  • 视频汇聚平台EasyCVR如何通过可视化管理与远程运维赋能安防“一张网”
  • 单向循环链表接口设计
  • 2025 年 11 月高温老化房厂家推荐排行榜,老化室、高温老化室、高温房、熟化房、固化房、恒温恒湿室、恒温房、恒温恒湿房公司推荐
  • 2025 年 11 月耐磨板厂家推荐排行榜,国产耐磨板,悍达耐磨板,堆焊耐磨板,进口耐磨板,MN13耐磨板,NM360-NM600高强度耐磨板,高铬合金耐磨板公司推荐!