聊天模型 API 使开发人员能够将人工智能驱动的聊天完成功能集成到他们的应用程序中。它利用 GPT(生成预训练转换器)等预训练语言模型,对用户输入的自然语言生成类人回复。
该应用程序接口的典型工作方式是向人工智能模型发送提示或部分对话,然后人工智能模型根据其训练数据和对自然语言模式的理解,生成对话的完成或继续。完成后的响应将返回给应用程序,应用程序可将其呈现给用户或用于进一步处理。
Spring AI 聊天模型 API 被设计为与各种 AI 模型交互的简单、可移植的接口,允许开发人员以最小的代码改动在不同模型之间切换。这种设计符合 Spring 的模块化和互换性理念。
此外,在用于输入封装的 Prompt 和用于输出处理的 ChatResponse 等辅助类的帮助下,聊天模型 API 统一了与人工智能模型的通信。它可以管理请求准备和响应解析的复杂性,提供直接和简化的 API 交互。
API 接口概述
本节介绍 Spring AI 聊天模型 API 接口和相关类。
聊天模型
下面是 ChatModel 接口定义:
public interface ChatModel extends Model<Prompt, ChatResponse> {
default String call(String message) {// implementation omitted
}
@Override
ChatResponse call(Prompt prompt);
}
带有字符串参数的调用方法简化了初始使用,避免了更复杂的 Prompt 和 ChatResponse 类的复杂性。在实际应用中,使用接收 Prompt 实例并返回 ChatResponse 的调用方法更为常见。
流媒体聊天模型
以下是 StreamingChatModel 接口定义:
public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {
@Override
Flux<ChatResponse> stream(Prompt prompt);
}
流方法接收 Prompt 请求,与 ChatModel 类似,但它使用反应式 Flux API 对响应进行流式处理。
Prompt
Prompt 是一个 ModelRequest,它封装了一个消息对象和可选模型请求选项的列表。下面的列表显示了 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
消息 "接口封装了文本消息、作为 "地图 "的属性集合以及称为 "消息类型 "的分类。接口定义如下
public interface Message extends Node<String> {
String getContent();
List<Media> getMedia();
MessageType getMessageType();
}
节点接口为
public interface Node<T> {
T getContent();
Map<String, Object> getMetadata();
}
消息接口有多种实现方式,与人工智能模型可以处理的消息类别相对应。有些模型(如 OpenAI 的聊天完成端点)会根据会话角色来区分消息类别,而 MessageType 可以有效地映射这些角色。
例如,OpenAI 可以识别不同对话角色的消息类别,如系统、用户、功能或助手。
虽然术语 MessageType 可能意味着特定的信息格式,但在这种情况下,它实际上指定了信息在对话中所扮演的角色。
对于不使用特定角色的人工智能模型来说,UserMessage(用户消息)的实现是一个标准类别,通常代表用户生成的询问或指令。要了解 "提示 "和 "消息 "之间的实际应用和关系,尤其是在这些角色或消息类别的上下文中,请参阅 "提示 "部分的详细解释。
聊天选项
代表可传递给人工智能模型的选项。ChatOptions 类是 ModelOptions 的子类,用于定义一些可传递给人工智能模型的可移植选项。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 实现都有自己的选项,可以传递给人工智能模型。例如,OpenAI Chat Completion 模型有自己的选项,如 presencePenalty、frequencyPenalty、bestOf 等。
这是一个强大的功能,允许开发人员在启动应用程序时使用模型特定的选项,然后在运行时使用提示请求覆盖这些选项:
聊天回复
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 类保存着人工智能模型的输出,每个 Generation 实例都包含一个提示可能产生的多个输出中的一个。
ChatResponse 类还包含有关人工智能模型响应的 ChatResponseMetadata 元数据。
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 (streaming & function-calling support)
-
Microsoft Azure Open AI Chat Completion (streaming & function-calling support)
-
HuggingFace Chat Completion (no streaming support)
-
Google Vertex AI PaLM2 Chat Completion (no streaming support)
-
Google Vertex AI Gemini Chat Completion (streaming, multi-modality & function-calling support)
-
Mistral AI Chat Completion (streaming & function-calling support)
-
Anthropic Chat Completion (streaming)
聊天模型 API
Spring AI 聊天模型 API 构建在 Spring AI 通用模型 API 的基础之上,提供聊天特定的抽象和实现。下面的类图说明了 Spring AI Chat Model API 的主要类和接口。
下一节:Spring AI 第二讲 之 Chat Model API 第一节OpenAI Chat