聊天完成 API
聊天完成 API 提供了开发者将基于人工智能的聊天完成能力集成到他们的应用程序中的能力。它利用了预训练的语言模型,如 GPT(生成式预训练转换器),以生成类似人类的响应,以自然语言对用户输入做出响应。
该 API 通常通过将提示或部分对话发送到 AI 模型,然后根据其训练数据和对自然语言模式的理解生成对话的完成或延续。然后将完成的响应返回到应用程序,该应用程序可以向用户呈现它或将其用于进一步处理。
Spring AI 聊天完成 API
旨在成为与各种 AI 模型 交互的简单和可移植的界面,允许开发人员在最小的代码更改之间切换不同的模型。这种设计与 Spring 的模块化和可互换性理念一致。
同时借助像 Prompt
(用于输入封装)和 ChatResponse
(用于输出处理)等配套类的帮助,聊天完成 API 统一了与 AI 模型的通信。它管理了请求准备和响应解析的复杂性,提供了直接和简化的 API 交互。
API 概述
本节提供了 Spring AI 聊天完成 API 接口及相关类的指南。
聊天客户端
这里是 ChatClient 接口定义:
public interface ChatClient extends ModelClient<Prompt, ChatResponse> {
default String call(String message) {// implementation omitted
}
@Override
ChatResponse call(Prompt prompt);
}
call
方法带有一个 String
参数,简化了初始使用,避免了更复杂的 Prompt
和 ChatResponse
类的复杂性。在实际应用中,更常见的是使用接受 Prompt
实例并返回 ChatResponse
的 call
方法。
流式聊天客户端
这里是 StreamingChatClient 接口定义:
public interface StreamingChatClient extends StreamingModelClient<Prompt, ChatResponse> {
@Override
Flux<ChatResponse> stream(Prompt prompt);
}
stream
方法接受类似 ChatClient
的 Prompt
请求,但使用反应式 Flux API 流式传输响应。
提示
提示是封装了一系列 Message 对象和可选模型请求选项的 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
接口封装了文本消息、作为 Map
的属性集合和称为 MessageType
的分类。该接口定义如下:
public interface Message {
String getContent();
Map<String, Object> getProperties();
MessageType getMessageType();
}
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);
}
此外,每个模型特定的 ChatClient/StreamingChatClient 实现都可以有自己的选项,这些选项可以传递给 AI 模型。例如,OpenAI 聊天完成模型具有自己的选项,如 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
类还携带有关 AI 模型响应的 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
}
可用实现
提供了以下模型提供程序的ChatClient
和StreamingChatClient
实现:
-
OpenAI Chat Completion (支持流式和函数调用)
-
Microsoft Azure Open AI Chat Completion (支持流式和函数调用)
-
HuggingFace Chat Completion (不支持流式)
-
Google Vertex AI Gemini Chat Completion (支持流式,多模态和函数调用)
-
Mistral AI Chat Completion (支持流式和函数调用)