聊天完成 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 参数,简化了初始使用,避免了更复杂的 PromptChatResponse 类的复杂性。在实际应用中,更常见的是使用接受 Prompt 实例并返回 ChatResponsecall 方法。

流式聊天客户端

这里是 StreamingChatClient 接口定义:

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

stream 方法接受类似 ChatClientPrompt 请求,但使用反应式 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 识别出用于不同对话角色的消息类别,如 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);
}

此外,每个模型特定的 ChatClient/StreamingChatClient 实现都可以有自己的选项,这些选项可以传递给 AI 模型。例如,OpenAI 聊天完成模型具有自己的选项,如 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 类还携带有关 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
}
assistant:

可用实现

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

spring ai聊天自动补全客户端

聊天模型API

Spring AI聊天自动补全API是建立在Spring AI 通用模型API之上,提供了特定于聊天的抽象和实现。以下类图说明了Spring AI聊天自动补全API的主要类和接口。

spring ai聊天API