聊天模型 API 为开发者提供了将 AI 驱动的聊天完成能力集成到其应用程序中的能力。它利用预训练的语言模型,如 GPT(生成式预训练变换器),以生成对用户输入的自然语言的人类般的响应。
API 通常通过向 AI 模型发送提示或部分对话来工作,AI 模型根据其训练数据和对自然语言模式的理解生成对话的完成或继续。完成的响应随后返回给应用程序,应用程序可以将其呈现给用户或用于进一步处理。
Spring AI Chat Model API
旨在提供一个简单且可移植的接口,以便与各种 AI 模型 进行交互,使开发者能够在不同模型之间进行切换,代码更改最小化。这一设计与 Spring 的模块化和可互换性的理念相一致。
此外,借助于像 Prompt
这样的伴随类用于输入封装,以及 ChatResponse
用于输出处理,聊天模型 API 统一了与 AI 模型的通信。它管理请求准备和响应解析的复杂性,提供了直接和简化的 API 交互。
本节提供了 Spring AI 聊天模型 API 接口及相关类的指南。
这里是聊天模型接口定义:
public interface ChatModel extends Model<Prompt, ChatResponse> {
默认字符串 call(字符串 消息) {...}
@Override
聊天响应 调用(提示 提示);
}
call()
方法使用 String
参数简化了初始使用,避免了更复杂的 Prompt
和 ChatResponse
类的复杂性。在实际应用中,使用接受 Prompt
实例并返回 ChatResponse
的 call()
方法更为常见。
这里是流式聊天模型接口定义:
public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {
默认 Flux<String> stream(String message) {...}
@Override
Flux<ChatResponse> stream(Prompt prompt);
}
stream()
方法接受一个类似于 ChatModel
的 String
或 Prompt
参数,但它使用反应式 Flux API 流式传输响应。
public class Prompt implements ModelRequest<List<Message>> {
private final List<Message> messages;
private ChatOptions 模型选项;
@Override
public ChatOptions getOptions() {...}
@Override
public List<Message> getInstructions() {...}
// 构造函数和工具方法省略
}
Message
接口封装了 Prompt
文本内容、一组元数据属性,以及称为 MessageType
的分类。
接口定义如下:
public interface 内容 {
String getText();
Map<String, Object> 获取元数据();
}
public interface 消息 extends 内容 {
获取消息类型();
}
多模态消息类型还实现了 MediaContent
接口,提供了一系列 Media
内容对象。
public interface 媒体内容 extends 内容 {
集合<媒体> 获取媒体();
}
Message
接口有多种实现,分别对应于 AI 模型可以处理的消息类别:
聊天完成端点,根据对话角色区分消息类别,使用 MessageType
有效映射。
例如,OpenAI 识别不同对话角色的消息类别,如 system
、user
、function
或 assistant
。
虽然术语 MessageType
可能暗示特定的消息格式,但在此上下文中,它实际上指定了消息在对话中所扮演的角色。
对于不使用特定角色的 AI 模型,UserMessage
实现充当标准类别,通常代表用户生成的询问或指令。要理解 Prompt
和 Message
之间的实际应用及其关系,特别是在这些角色或消息类别的上下文中,请参阅 Prompts 部分中的详细说明。
表示可以传递给 AI 模型的选项。ChatOptions
类是 ModelOptions
的子类,用于定义可以传递给 AI 模型的少量可移植选项。ChatOptions
类定义如下:
public interface 聊天选项 extends 模型选项 {
String getModel();
Float getFrequencyPenalty();
Integer getMaxTokens();
Float getPresencePenalty();
List<String> getStopSequences();
Float getTemperature();
Integer getTopK();
Float getTopP();
ChatOptions copy();
}
此外,每个特定模型的 ChatModel/StreamingChatModel 实现可以有自己的选项,这些选项可以传递给 AI 模型。例如,OpenAI 聊天完成模型有自己的选项,如 logitBias
、seed
和 user
。
这是一个强大的功能,允许开发者在启动应用程序时使用特定于模型的选项,然后在运行时使用 Prompt
请求覆盖它们。
Spring AI 提供了一个复杂的系统,用于配置和使用聊天模型。它允许在启动时设置默认配置,同时也提供了在每个请求基础上覆盖这些设置的灵活性。这种方法使开发人员能够轻松地使用不同的 AI 模型,并根据需要调整参数,所有这些都在 Spring AI 框架提供的一致接口内。
以下流程图说明了 Spring AI 如何处理聊天模型的配置和执行,结合了启动和运行时选项:
- 启动配置 - ChatModel/StreamingChatModel 使用 "启动" 聊天选项进行初始化。这些选项在 ChatModel 初始化时设置,旨在提供默认配置。
- 运行时配置 - 对于每个请求,提示可以包含运行时聊天选项:这些可以覆盖启动选项。
- 选项合并过程 - “合并选项”步骤结合了启动选项和运行时选项。如果提供了运行时选项,则它们优先于启动选项。
- 输入处理 - "转换输入"步骤将输入指令转换为本地的、特定于模型的格式。
- 输出处理 - “转换输出”步骤将模型的响应转换为标准化的
ChatResponse
格式。
启动和运行时选项的分离允许进行全局配置和请求特定的调整。
ChatResponse
类的结构如下:
public class ChatResponse implements ModelResponse<Generation> {
private final ChatResponseMetadata 聊天响应元数据;
private final List<Generation> 生成列表;
@Override
public ChatResponseMetadata getMetadata() {...}
@Override
public List<Generation> getResults() {...}
// 其他方法省略
}
The 聊天响应 class holds the AI Model’s output, with each Generation
instance containing one of potentially multiple outputs resulting from a single prompt.
ChatResponse
类还携带有关 AI 模型响应的 ChatResponseMetadata
元数据。
最后,生成 类继承自 ModelResult
,用于表示模型输出(助手消息)及相关元数据:
public class Generation implements ModelResult<AssistantMessage> {
private final 助手消息 assistantMessage;
private 聊天生成元数据 chatGenerationMetadata;
@Override
public AssistantMessage getOutput() {...}
@Override
public ChatGenerationMetadata getMetadata() {...}
// 其他方法省略
}
Spring AI 聊天模型 API 构建在 Spring AI 通用模型 API
之上,提供特定于聊天的抽象和实现。这允许在不同的 AI 服务之间轻松集成和切换,同时为客户端应用程序保持一致的 API。以下类图说明了 Spring AI 聊天模型 API 的主要类和接口。