聊天模型 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方法简化了初始使用,避免了更复杂的PromptChatResponse类的复杂性。在实际应用中,使用带有Prompt实例并返回ChatResponsecall方法更为常见。

StreamingChatModel

以下是 StreamingChatModel 接口定义

public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {
    @Override
	Flux<ChatResponse> stream(Prompt prompt);
}

stream方法接受类似于ChatModelPrompt请求,但它使用响应式 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 识别不同对话角色的消息类别,例如systemuserfunctionassistant

虽然术语MessageType可能暗示着特定的消息格式,但在这种情况下,它实际上指的是消息在对话中所扮演的角色。

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

聊天选项

表示可以传递给 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 模型有自己的选项,如presencePenaltyfrequencyPenaltybestOf等。

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

chat options flow

聊天响应

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
}

可用实现

以下模型提供程序提供了ChatModelStreamingChatModel实现:

spring ai chat completions clients

对话模型 API

Spring AI 对话模型 API 基于 Spring AI 通用模型 API 构建,提供对话特定的抽象和实现。以下类图展示了 Spring AI 对话模型 API 的主要类和接口。

spring ai chat api