聊天模型 API
聊天模型 API 为开发者提供了将 AI 驱动的聊天完成功能集成到其应用程序中的能力。它利用预训练的语言模型,例如 GPT(生成式预训练变换器),以自然语言生成类似人类的响应来回应用户输入。
API 通常通过将提示或部分对话发送到 AI 模型来工作,然后该模型根据其训练数据和对自然语言模式的理解生成对话的完成或延续。完成的响应然后返回到应用程序,应用程序可以将其呈现给用户或将其用于进一步处理。
Spring AI 聊天模型 API
旨在成为一个简单且可移植的接口,用于与各种 AI 模型 交互,允许开发者在不同的模型之间切换,而代码更改最少。这种设计符合 Spring 的模块化和可互换性理念。
借助于诸如用于输入封装的Prompt
和用于输出处理的ChatResponse
等配套类,Chat Model API 统一了与 AI 模型的通信。它管理着请求准备和响应解析的复杂性,提供了一种直接且简化的 API 交互方式。
API 概述
本节提供 Spring AI Chat Model API 接口和相关类的指南。
ChatModel
以下是 ChatModel 接口定义
public interface ChatModel extends Model<Prompt, ChatResponse> {
default String call(String message) {// implementation omitted
}
@Override
ChatResponse call(Prompt prompt);
}
带有String
参数的call
方法简化了初始使用,避免了更复杂的Prompt
和ChatResponse
类的复杂性。在实际应用中,使用带有Prompt
实例并返回ChatResponse
的call
方法更为常见。
StreamingChatModel
以下是 StreamingChatModel 接口定义
public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {
@Override
Flux<ChatResponse> stream(Prompt prompt);
}
stream
方法接受类似于ChatModel
的Prompt
请求,但它使用响应式 Flux API 流式传输响应。
Prompt
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() {...}
// constructors and utility methods omitted
}
Message
Message
接口封装了一个文本消息、一个作为Map
的属性集合以及一个称为MessageType
的分类。该接口定义如下
public interface Message extends Node<String> {
String getContent();
List<Media> getMedia();
MessageType getMessageType();
}
而 Node 接口为
public interface Node<T> {
T getContent();
Map<String, Object> getMetadata();
}
Message
接口具有各种实现,对应于 AI 模型可以处理的消息类别。某些模型,例如 OpenAI 的聊天完成端点,根据对话角色区分消息类别,有效地由MessageType
映射。
例如,OpenAI 识别不同对话角色的消息类别,例如system
、user
、function
或assistant
。
虽然术语MessageType
可能暗示着特定的消息格式,但在这种情况下,它实际上指的是消息在对话中所扮演的角色。
对于不使用特定角色的 AI 模型,UserMessage
实现充当标准类别,通常代表用户生成的查询或指令。要了解Prompt
和Message
之间的实际应用和关系,特别是在这些角色或消息类别的情况下,请参阅提示部分中的详细说明。
聊天选项
表示可以传递给 AI 模型的选项。ChatOptions
类是ModelOptions
的子类,用于定义一些可以传递给 AI 模型的可移植选项。ChatOptions
类的定义如下:
public interface ChatOptions extends ModelOptions {
Float getTemperature();
void setTemperature(Float temperature);
Float getTopP();
void setTopP(Float topP);
Integer getTopK();
void setTopK(Integer topK);
}
此外,每个特定模型的 ChatModel/StreamingChatModel 实现都可以有自己的选项,这些选项可以传递给 AI 模型。例如,OpenAI Chat Completion 模型有自己的选项,如presencePenalty
、frequencyPenalty
、bestOf
等。
这是一个强大的功能,允许开发人员在启动应用程序时使用特定模型的选项,然后在运行时使用 Prompt 请求覆盖它们。
聊天响应
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() {...}
// other methods omitted
}
ChatResponse
类保存了 AI 模型的输出,每个Generation
实例包含一个可能来自单个提示的多个输出之一。
ChatResponse
类还包含一个ChatResponseMetadata
,其中包含有关 AI 模型响应的元数据。
生成
最后,Generation
类继承自ModelResult
,用于表示输出助手消息响应以及有关此结果的相关元数据。
public class Generation implements ModelResult<AssistantMessage> {
private AssistantMessage assistantMessage;
private ChatGenerationMetadata chatGenerationMetadata;
@Override
public AssistantMessage getOutput() {...}
@Override
public ChatGenerationMetadata getMetadata() {...}
// other methods omitted
}
可用实现
以下模型提供程序提供了ChatModel
和StreamingChatModel
实现:
-
OpenAI Chat Completion(支持流式传输和函数调用)
-
Microsoft Azure Open AI Chat Completion(支持流式传输和函数调用)
-
HuggingFace Chat Completion(不支持流式传输)
-
Google Vertex AI Gemini Chat Completion(支持流式传输、多模态和函数调用)
-
Mistral AI 对话完成 (支持流式传输和函数调用)
-
Anthropic 对话完成 (支持流式传输)