该API通常通过向AI模型发送提示或部分对话内容来工作,模型随后基于其训练数据和对自然语言模式的理解生成对话的补全或延续内容。生成的回复将返回给应用程序,供其向用户展示或进行进一步处理。
Spring AI聊天模型API旨在提供一个与各类AI模型交互的简洁且可移植的接口,使开发者能够以最小的代码改动切换不同模型。该设计理念与Spring框架的模块化和可替换性哲学保持一致。
通过使用Prompt(输入封装)和ChatResponse(输出处理)等配套类,聊天模型API统一了与AI模型的通信流程。它管理请求准备和响应解析的复杂性,提供直接简化的API交互方式。
您可在可用实现部分查看详细实施方案,并在聊天模型对比部分获得各模型的详细比较分析。
本节提供 Spring AI 聊天模型 API 接口及相关类的使用指南。
以下是 ChatModel 接口的定义:
public interface ChatModel extends Model<Prompt, ChatResponse> {
default String call(String message) {...}
@Override
ChatResponse call(Prompt prompt);
}
带 String 参数的 call() 方法简化了初始使用,避免了复杂的 Prompt 和 ChatResponse 类的直接操作。在实际应用中,更常用的是接收 Prompt 实例并返回 ChatResponse 的 call() 方法 。
以下是 StreamingChatModel 接口的定义:
public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {
default Flux<String> stream(String message) {...}
@Override
Flux<ChatResponse> stream(Prompt prompt);
}
stream() 方法接受 String 或 Prompt 参数(与 ChatModel 类似),但通过响应式 Flux API 流式传输响应 。
Prompt 是 ModelRequest 的实现类,封装了 Message 对象列表及可选的模型请求配置。以下是 Prompt 类的简化版本(省略构造函数和其他工具方法):
public class Prompt implements ModelRequest<List<Message>> {
private final List<Message> messages;
private ChatOptions modelOptions;
@Override
public ChatOptions getOptions() {...}
@Override
public List<Message> getInstructions() {...}
// 构造函数和其他工具方法已省略
}
Message 接口封装了 Prompt 的文本内容、元数据属性集合以及称为 MessageType 的分类。
接口定义如下:
public interface Content {
String getContent();
Map<String, Object> getMetadata();
}
public interface Message extends Content {
MessageType getMessageType();
}
多模态消息类型还实现了 MediaContent 接口,提供媒体内容对象列表:
public interface MediaContent extends Content {
Collection<Media> getMedia();
}
Message 接口有多种实现,对应 AI 模型可处理的消息类别:
Spring AI 消息 API
聊天补全端点根据对话角色区分消息类别,这些角色通过 MessageType 映射。
例如,OpenAI 为不同对话角色(如系统、用户、函数、助手)定义了消息类别。
尽管术语 MessageType 可能暗示特定消息格式,但在此上下文中,它实际表示消息在对话中扮演的角色 。
对于不使用特定角色的 AI 模型,UserMessage 实现作为标准类别,通常代表用户生成的查询或指令。有关 Prompt 与 Message 的实际应用及角色关系,请参阅 Prompts 章节。
ChatOptions 类表示可传递给 AI 模型的配置项,是 ModelOptions 的子类,定义了可移植的通用参数:
public interface ChatOptions extends ModelOptions {
String getModel();
Float getFrequencyPenalty();
Integer getMaxTokens();
Float getPresencePenalty();
List<String> getStopSequences();
Float getTemperature();
Integer getTopK();
Float getTopP();
ChatOptions copy();
}
此外,每个模型特定的 ChatModel/StreamingChatModel 实现可定义专属选项。例如,OpenAI 聊天补全模型支持 logitBias、seed 和 user 等参数。
此设计允许开发者在启动时配置模型默认参数,并在运行时通过 Prompt 动态覆盖,提升灵活性。
Spring AI 通过分层配置系统管理聊天模型:
流程图说明
ChatResponse 类的结构如下:
public class ChatResponse implements ModelResponse<Generation> {
private final ChatResponseMetadata chatResponseMetadata;
private final List<Generation> generations;
@Override
public ChatResponseMetadata getMetadata() {...}
@Override
public List<Generation> getResults() {...}
// 其他方法省略
}
ChatResponse 类保存 AI 模型的输出,每个 Generation 实例包含由单个提示生成的多个可能输出之一 。
ChatResponse 类还携带与 AI 模型响应相关的元数据 ChatResponseMetadata 。
Generation 类继承自 ModelResult,用于表示模型输出(助手消息)及相关元数据:
public class Generation implements ModelResult<AssistantMessage> {
private final AssistantMessage assistantMessage;
private ChatGenerationMetadata chatGenerationMetadata;
@Override
public AssistantMessage getOutput() {...}
@Override
public ChatGenerationMetadata getMetadata() {...}
// 其他方法省略
}
下图展示了统一的接口 ChatModel 和 StreamingChatModel 如何与不同供应商的 AI 聊天模型交互,支持轻松集成和切换各类 AI 服务,同时为客户端应用提供一致的 API。
Spring AI 聊天补全客户端支持列表
Spring AI 聊天模型 API 基于 Spring AI 通用模型 API 构建,提供针对聊天场景的抽象和实现。它支持无缝集成和切换不同 AI 服务,同时为客户端应用保持统一的 API。以下类图展示了 Spring AI 聊天模型 API 的核心类与接口: