聊天模型 API

聊天模型 API 为开发者提供了将 AI 驱动的聊天完成功能集成到其应用程序中的能力。它利用预训练的语言模型,例如 GPT(生成式预训练变换器),以自然语言生成类似人类的响应来回应用户输入。

API 通常的工作原理是将提示或部分对话发送到 AI 模型,然后 AI 模型根据其训练数据和对自然语言模式的理解生成对话的完成或延续。然后将完成的响应返回到应用程序,应用程序可以将其呈现给用户或将其用于进一步处理。

Spring AI 聊天模型 API 旨在成为一个简单且可移植的接口,用于与各种AI 模型交互,允许开发者在不同的模型之间切换,而只需进行最少的代码更改。这种设计符合 Spring 的模块化和可互换性理念。

此外,在 Prompt 用于输入封装和 ChatResponse 用于输出处理等配套类的帮助下,聊天模型 API 统一了与 AI 模型的通信。它管理请求准备和响应解析的复杂性,提供了一个直接且简化的 API 交互。

您可以在可用实现部分找到有关可用实现的更多信息,以及在聊天模型比较部分找到详细的比较。

API 概述

本节提供了 Spring AI 聊天模型 API 接口和相关类的指南。

ChatModel

以下是ChatModel 接口定义

public interface ChatModel extends Model<Prompt, ChatResponse> {

	default String call(String message) {...}

    @Override
	ChatResponse call(Prompt prompt);
}

带有 String 参数的 call() 方法简化了初始使用,避免了更复杂的 PromptChatResponse 类的复杂性。在实际应用中,更常见的是使用接收 Prompt 实例并返回 ChatResponsecall() 方法。

StreamingChatModel

以下是StreamingChatModel 接口定义

public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {

    default Flux<String> stream(String message) {...}

    @Override
	Flux<ChatResponse> stream(Prompt prompt);
}

stream() 方法类似于 ChatModel,接收 StringPrompt 参数,但它使用响应式 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 接口封装了 Prompt 的文本内容、一组元数据属性以及称为 MessageType 的分类。

接口定义如下:

public interface Content {

	String getContent();

	Map<String, Object> getMetadata();
}

public interface Message extends Content {

	MessageType getMessageType();
}

多模态消息类型也实现了 MediaContent 接口,提供了一个 Media 内容对象列表。

public interface MediaContent extends Content {

	Collection<Media> getMedia();

}

Message 接口有多个实现,对应于 AI 模型可以处理的消息类别。

Spring AI Message API

聊天完成端点根据对话角色区分消息类别,有效地由 MessageType 映射。

例如,OpenAI 识别不同对话角色的消息类别,例如 systemuserfunctionassistant

虽然术语 MessageType 可能暗示特定的消息格式,但在这种情况下,它有效地指定了消息在对话中扮演的角色。

对于不使用特定角色的 AI 模型,UserMessage 实现充当标准类别,通常代表用户生成的查询或指令。要了解实际应用以及 PromptMessage 之间的关系,尤其是在这些角色或消息类别的上下文中,请参阅提示词部分的详细说明。

聊天选项

表示可以传递给 AI 模型的选项。ChatOptions 类是 ModelOptions 的子类,用于定义一些可以传递给 AI 模型的可移植选项。ChatOptions 类定义如下:

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 实现都可以有自己的选项,这些选项可以传递给 AI 模型。例如,OpenAI 聊天完成模型有自己的选项,例如 logitBiasseeduser

这是一个强大的功能,允许开发者在启动应用程序时使用特定于模型的选项,然后使用 Prompt 请求在运行时覆盖它们。

Spring AI 提供了一个用于配置和使用聊天模型的复杂系统。它允许在启动时设置默认配置,同时还提供灵活性以根据每个请求覆盖这些设置。这种方法使开发人员能够轻松地使用不同的 AI 模型并根据需要调整参数,所有这些都在 Spring AI 框架提供的统一界面中进行。

以下流程图说明了 Spring AI 如何处理聊天模型的配置和执行,结合了启动和运行时选项

chat options flow
  1. 启动配置 - ChatModel/StreamingChatModel 使用“启动”聊天选项进行初始化。这些选项是在 ChatModel 初始化期间设置的,旨在提供默认配置。

  2. 运行时配置 - 对于每个请求,提示符可以包含运行时聊天选项:这些选项可以覆盖启动选项。

  3. 选项合并过程 - “合并选项”步骤结合了启动和运行时选项。如果提供了运行时选项,则优先于启动选项。

  4. 输入处理 - “转换输入”步骤将输入指令转换为本机、特定于模型的格式。

  5. 输出处理 - “转换输出”步骤将模型的响应转换为标准化的ChatResponse格式。

启动选项和运行时选项的分离允许进行全局配置和特定于请求的调整。

ChatResponse

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

最后,该Generation类扩展自ModelResult以表示模型输出(助手消息)和相关元数据

public class Generation implements ModelResult<AssistantMessage> {

	private final AssistantMessage assistantMessage;
	private ChatGenerationMetadata chatGenerationMetadata;

	@Override
	public AssistantMessage getOutput() {...}

	@Override
	public ChatGenerationMetadata getMetadata() {...}

    // other methods omitted
}

可用实现

此图说明了统一的接口ChatModelStreamingChatModel,用于与来自不同提供商的各种 AI 聊天模型进行交互,允许在不同的 AI 服务之间轻松集成和切换,同时为客户端应用程序维护一致的 API。

spring ai chat completions clients
聊天模型比较部分找到可用聊天模型的详细比较。

聊天模型 API

Spring AI 聊天模型 API 建立在 Spring AI 通用模型 API之上,提供了特定于聊天的抽象和实现。这允许在不同的 AI 服务之间轻松集成和切换,同时为客户端应用程序维护一致的 API。以下类图说明了 Spring AI 聊天模型 API 的主要类和接口。

spring ai chat api