【Spring AI】01. 聊天 API

embedded/2024/9/25 23:24:51/

文章目录

  • 聊天 API
    • API 概览
      • ChatClient
      • StreamingChatClient
      • Prompt
        • Message
        • ChatOptions
      • ChatResponse
      • Generation
      • Available Implementations
      • Chat Model API

聊天 API


聊天 API 允许开发人员将 AI 驱动的聊天功能整合到其应用程序中。它利用预训练的语言模型,如 GPT(生成式预训练转换器),以自然语言根据用户输入生成类似人类的响应。
API 通常通过向 AI 模型发送提示词或部分对话来工作,AI 模型会根据其训练数据和自然语言理解,生成或继续对话的完整内容。然后,完成的响应将返回给应用程序,应用程序可以将其呈现给用户或将其用于进一步处理。
它被Spring AI Chat Completion API设计成一个简单且可移植的接口,用于与各种 AI 模型进行交互,允许开发人员以最少的代码在不同模型之间切换。这种设计符合Spring的模块化和可互换性理念。
此外,在 输入封装 和ChatResponse输出处理 等Prompt配套类 的帮助下,聊天 API 统一了与 AI 模型的通信。它管理 请求预处理 和 响应解析 的复杂性,提供直接和简化的 API 交互。

API 概览


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

ChatClient

以下是 ChatClient 接口定义:

java">public interface ChatClient extends ModelClient<Prompt, ChatResponse> {default String call(String message) {// implementation omitted}@OverrideChatResponse call(Prompt prompt);
}

带有 String 参数 default call 方法简化了使用,避免了 Prompt 类的 ChatResponse 复杂性。在实际应用程序中,更常见的是使用复写的 call 方法,接受 Prompt 实例并返回 ChatResponse

StreamingChatClient

下面是 StreamingChatClient 接口定义:

java">public interface StreamingChatClient extends StreamingModelClient<Prompt, ChatResponse> {@OverrideFlux<ChatResponse> stream(Prompt prompt);
}

该stream方法接受类似于ChatClient的Prompt请求,但它使用 Reactive Flux API 流式传输响应。

Prompt

Prompt 是 ModelRequest 接口的实现对象,包含 modelOptions 和 messages。下面的列表显示了 Prompt 类的截断版本,不包括构造函数和其他实用工具方法:

java">public class Prompt implements ModelRequest<List<Message>> {private final List<Message> messages;private ChatOptions modelOptions;@Overridepublic ChatOptions getOptions() {..}@Overridepublic List<Message> getInstructions() {...}// constructors and utility methods omitted
}
Message

该 Message 接口封装了 获取文本消息、属性集合 Map对象 和 消息类型MessageType 的方法 。接口定义如下:

java">public interface Message {String getContent();Map<String, Object> getProperties();MessageType getMessageType();
}

该 Message 接口具有各种实现,这些实现对应处理不同消息类别的 AI 模型。一些模型,如 OpenAI 的聊天,根据对话角色区分消息类别,有效对 MessageType 做了相应的映射。
例如,OpenAI 可识别不同对话角色的消息类别,例如system、user或functionassistant。
虽然MessageType可能意味着特定的消息格式,但在这种情况下,它有效地指定了消息在对话中扮演的角色。
对于不使用特定角色的 AI 模型,UserMessage是标准实现,通常表示用户生成的查询或指令。若要了解Prompt和Message之间的实际应用和关系,尤其是在这些角色或消息类别的上下文中,请参阅 Prompts 章节中的详细说明。

ChatOptions

表示可以传递给 AI 模型的 Chat 配置项。该 ChatOptions 类是 ModelOptions 子类,用于定义可传递给 AI 模型的几个可移植配置项。该 ChatOptions 类定义如下:

java">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

ChatResponse 的结构如下:

java">public class ChatResponse implements ModelResponse<Generation> {private final ChatResponseMetadata chatResponseMetadata;private final List<Generation> generations;@Overridepublic ChatResponseMetadata getMetadata() {...}@Overridepublic List<Generation> getResults() {...}// other methods omitted
}

ChatResponse 类存储了 AI 模型的输出结果,每个Generation实例都包含回答单个提示词的多个输出结果中的一条。
该ChatResponse类还包含有关 AI 模型响应的ChatResponseMetadata元数据。

Generation

Generation 类是 ModelResult 接口的实现,输出 助手消息 和 相关元数据:

java">public class Generation implements ModelResult<AssistantMessage> {private AssistantMessage assistantMessage;private ChatGenerationMetadata chatGenerationMetadata;@Overridepublic AssistantMessage getOutput() {...}@Overridepublic ChatGenerationMetadata getMetadata() {...}// other methods omitted
}

Available Implementations

下图表示ChatClient和StreamingChatClient的实现类:
在这里插入图片描述

Chat Model API

Spring AI Chat Completion API 建立在 Spring AI Generic Model API 之上,提供 Chat 的抽象和实现。以下类图说明了 Spring AI Chat Completion API 的主要类和接口。
在这里插入图片描述


http://www.ppmy.cn/embedded/31696.html

相关文章

数据结构===散列表

文章目录 概要散列思想散列函数散列冲突开放寻址法装载因子 链表法 代码Java小结 概要 散列表是一种很有趣的数据结构。 散列表是一个很有用的数据结构。它是数组演练而来的&#xff0c;又是一个基于数组的扩展的数据结构。接下来看看。 散列思想 散列表用的是数组支持按照下…

手写一个uart协议——rs232

先了解一下关于uart和rs232的基础知识 文章目录 一、RS232的回环测试1.1模块整体架构1.2 rx模块设计1.2.1 波形设计1.2.2代码实现与tb1.2.4 仿真 1.3 tx模块设计1.3.1 波形设计1.3.2 代码实现与tb1.3.4 顶层设计1.3.3 仿真 本篇内容&#xff1a; 一、RS232的回环测试 上位机…

【DevOps】掌控云端:Google Cloud SDK 快速上手

一、Google Cloud SDK Google Cloud SDK (Software Development Kit) 是一组工具,包括 gcloud、gsutil 和 bq,用于通过命令行或自动化脚本访问和管理 Google Cloud 资源和服务。以下是 Cloud SDK 的详细介绍: 1、gcloud 命令行工具 gcloud 是 Cloud SDK 的核心组件,用于管理…

访问网站提示502 Bad Gateway的原因和解决方法

"502 Bad Gateway"错误通常表示服务器作为网关或代理服务器尝试访问上游服务器(如应用服务器或其他代理服务器)&#xff0c;但未能从上游服务器接收到有效的响应。以下是可能导致此错误的一些常见原因以及相应的解决方法&#xff1a; 1. 服务器端问题&#xff1a; 服…

Springboot基于健康检查服务预热

文章目录 用于服务启动之后&#xff0c;健康检查完成才会给服务流量 /*** http://localhost:8080/actuator/health* 服务启动后&#xff0c;服务健康状态为DOWN&#xff0c;等待执行完成warmup()之后变为UP** author batman*/ Component public class MyHealthIndicator implem…

【前端项目——分页器】手写分页器实现(JS / React)

组件介绍 用了两种方式实现&#xff0c;注释详细~ 可能代码写的不够简洁&#xff0c;见谅&#x1f641; 1. 包含内容显示的分页器 网上看了很多实现&#xff0c;很多只有分页器部分&#xff0c;没和内容显示联动。 因此我增加了模拟content的显示&#xff0c;这里模拟了32条数…

这是一个简单的照明材料网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>爱德照明网站首页</title><style>/*外部样式*/charset "utf-8";*{margin: 0;padding: 0;box-sizing: border-box;}a{text-dec…

Typescript语法

常量声明 let用于声明变量&#xff0c;而const用于声明常量。两者的区别是变量在赋值后可以修改&#xff0c;而常量在赋值后便不能修改。 const b:number 200; 类型判断 如果一个变量或常量的声明包含了初始值&#xff0c;TS便可以根据初始值进行类型判断&#xff0c;此时…