聊天模型API
聊天模型API为开发者提供了将AI驱动的聊天补全能力集成到其应用程序中的能力。它利用预训练语言模型(如GPT)生成类人化的自然语言响应。
该API通常通过向AI模型发送提示或部分对话来工作,然后模型根据其训练数据和对自然语言模式的理解生成对话的补全或延续。完成的响应随后返回给应用程序,应用程序可以将其呈现给用户或用于进一步处理。
Spring AI Chat Model API旨在成为一个简单且可移植的接口,用于与各种AI模型交互,允许开发者以最少的代码更改在不同模型之间切换。这种设计符合Spring的模块化和可互换性理念。
此外,借助Prompt用于输入封装和ChatResponse用于输出处理等配套类,聊天模型API统一了与AI模型的通信。它管理请求准备和响应解析的复杂性,提供了直接且简化的API交互。
API 概述
本节提供了Spring AI聊天模型API接口及相关类的指南。
ChatModel
以下是ChatModel接口定义
public interface ChatModel extends Model<Prompt, ChatResponse>, StreamingChatModel {
default String call(String message) {...}
@Override
ChatResponse call(Prompt prompt);
}
带有String参数的call()方法简化了初始使用,避免了更复杂的Prompt和ChatResponse类的复杂性。在实际应用中,更常见的是使用接受Prompt实例并返回ChatResponse的call()方法。
StreamingChatModel
以下是StreamingChatModel接口定义
public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {
default Flux<String> stream(String message) {...}
@Override
Flux<ChatResponse> stream(Prompt prompt);
}
stream()方法接受一个String或Prompt参数,类似于ChatModel,但它使用响应式Flux API流式传输响应。
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 getText();
Map<String, Object> getMetadata();
}
public interface Message extends Content {
MessageType getMessageType();
}
多模态消息类型也实现了MediaContent接口,提供了Media内容对象的列表。
public interface MediaContent extends Content {
Collection<Media> getMedia();
}
Message接口有多种实现,对应于AI模型可以处理的消息类别
聊天补全端点根据对话角色区分消息类别,通过MessageType有效地映射。
例如,OpenAI识别针对不同对话角色的消息类别,例如system、user、function或assistant。
虽然术语MessageType可能暗示特定的消息格式,但在这种情况下,它有效地指定了消息在对话中扮演的角色。
对于不使用特定角色的AI模型,UserMessage实现作为标准类别,通常表示用户生成的查询或指令。要理解Prompt和Message之间的实际应用和关系,尤其是在这些角色或消息类别的上下文中,请参阅Prompt部分的详细解释。
聊天选项
表示可以传递给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聊天补全模型有自己的选项,如logitBias、seed和user。
这是一个强大的功能,允许开发者在启动应用程序时使用模型特定的选项,然后使用Prompt请求在运行时覆盖它们。
Spring AI提供了一个复杂的系统来配置和使用聊天模型。它允许在启动时设置默认配置,同时还提供了在每次请求的基础上覆盖这些设置的灵活性。这种方法使开发者能够轻松地使用不同的AI模型并根据需要调整参数,所有这些都在Spring AI框架提供的一致接口中进行。
以下流程图说明了Spring AI如何处理聊天模型的配置和执行,结合了启动和运行时选项
-
启动配置 - ChatModel/StreamingChatModel使用“启动”聊天选项进行初始化。这些选项在ChatModel初始化期间设置,旨在提供默认配置。
-
运行时配置 - 对于每个请求,Prompt可以包含运行时聊天选项:这些可以覆盖启动选项。
-
选项合并过程 - “合并选项”步骤结合了启动和运行时选项。如果提供了运行时选项,它们将优先于启动选项。
-
输入处理 - “转换输入”步骤将输入指令转换为本机、模型特定的格式。
-
输出处理 - “转换输出”步骤将模型的响应转换为标准化的
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类还带有关于AI模型响应的ChatResponseMetadata元数据。
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
}
可用实现
此图说明了统一接口ChatModel和StreamingChatModel如何用于与不同提供商的各种AI聊天模型进行交互,从而允许轻松集成和在不同AI服务之间切换,同时为客户端应用程序保持一致的API。
-
OpenAI聊天补全(流式传输、多模态和函数调用支持)
-
Microsoft Azure Open AI聊天补全(流式传输和函数调用支持)
-
Ollama聊天补全(流式传输、多模态和函数调用支持)
-
Hugging Face聊天补全(不支持流式传输)
-
Google Vertex AI Gemini聊天补全(流式传输、多模态和函数调用支持)
-
Mistral AI聊天补全(流式传输和函数调用支持)
-
Anthropic聊天补全(流式传输和函数调用支持)
| 在聊天模型比较部分查找可用聊天模型的详细比较。 |