ChatClient
提供了一个流畅的 API 用于与 AI 模型进行通信。
它同时支持同步和流式编程模型。
ChatClient
中命令式和响应式编程模型结合使用的相关信息。Prompt
包含指导 AI 模型输出和行为的指令文本。从 API 的角度来看,提示由消息集合组成。
AI 模型处理两种主要类型的消息:用户消息(来自用户的直接输入)和系统消息(由系统生成以指导对话)。
这些消息通常包含占位符,这些占位符在运行时根据用户输入进行替换,以根据用户输入自定义 AI 模型的响应。
还有一些可以指定的提示选项,例如要使用的 AI 模型的名称和控制生成输出随机性或创造性的温度设置。
ChatClient
使用 ChatClient.Builder
对象创建。
您可以为任何 ChatModel Spring Boot 自动配置获取自动配置的 ChatClient.Builder
实例,或以编程方式创建一个。
ChatClient.Builder
bean,您可以将其注入到您的类中。
以下是一个简单的示例,展示如何获取简单用户请求的 String
响应:
call()
方法向 AI 模型发送请求,content()
方法将 AI 模型的响应作为 String
返回。
多模型场景
ChatClient.Builder
bean。但是,您可能需要在应用程序中使用多个聊天模型。以下是处理这种情况的方法:
在所有情况下,您都需要通过设置属性 spring.ai.chat.client.enabled=false
来禁用 ChatClient.Builder
自动配置。
这允许您手动创建多个 ChatClient
实例。
ChatClient
bean:
@Qualifier
注解将这些 bean 注入到应用程序组件中:
OpenAiApi
和 OpenAiChatModel
类提供了 mutate()
方法,允许您创建具有不同属性的现有实例的变体。这在需要处理多个 OpenAI 兼容 API 时特别有用。
ChatClient
流畅 API 允许您使用重载的 prompt
方法以三种不同的方式创建提示:
Prompt
参数,让您传入使用 Prompt 的非流畅 API 创建的 Prompt
实例。ChatClient
API 提供了几种使用流畅 API 格式化 AI 模型响应的方法。
call()
方法后的 chatResponse()
方法展示了返回包含元数据的 ChatResponse
对象的示例:
String
映射的实体类。
entity()
方法提供了这个功能。
例如,给定 Java 记录:
entity()
方法轻松地将 AI 模型的输出映射到这个记录,如下所示:
entity
方法,签名为 entity(ParameterizedTypeReference<T> type)
,允许您指定泛型列表等类型:
stream()
方法让您获得异步响应,如下所示:
Flux<ChatResponse> chatResponse()
流式传输 ChatResponse
。
在未来,我们将提供一个便捷方法,让您使用响应式 stream()
方法返回 Java 实体。
同时,您应该使用 结构化输出转换器 显式转换聚合响应,如下所示。
这也演示了流畅 API 中参数的使用,这将在文档的后面部分详细讨论。
ChatClient
流畅 API 允许您提供带有变量的用户和系统文本作为模板,这些变量在运行时被替换。
PromptTemplate
类来处理用户和系统文本,并使用给定的 TemplateRenderer
实现替换变量。
默认情况下,Spring AI 使用 StTemplateRenderer
实现,它基于 Terence Parr 开发的开源 StringTemplate 引擎。
Spring AI 还为不需要模板处理的情况提供了 NoOpTemplateRenderer
。
ChatClient
上配置的 TemplateRenderer
(通过 .templateRenderer()
)仅适用于直接在 ChatClient
构建器链中定义的提示内容(例如,通过 .user()
、.system()
)。
它不会影响 Advisors 内部使用的模板,如 QuestionAnswerAdvisor
,它们有自己的模板自定义机制(参见自定义 Advisor 模板)。TemplateRenderer
接口的自定义实现。您也可以继续使用默认的 StTemplateRenderer
,但使用自定义配置。
例如,默认情况下,模板变量由 {}
语法标识。如果您计划在提示中包含 JSON,您可能想使用不同的语法以避免与 JSON 语法冲突。例如,您可以使用 <
和 >
分隔符。
ChatClient
上指定 call()
方法后,响应类型有几种不同的选项:
ChatResponse
对象,例如用于创建响应的令牌数量ChatClientResponse
对象,其中包含 ChatResponse
对象和 ChatClient 执行上下文,让您可以访问在执行 advisors 期间使用的其他数据(例如,在 RAG 流程中检索的相关文档)entity(ParameterizedTypeReference<T> type)
:用于返回实体类型的 Collection
entity(Class<T> type)
:用于返回特定的实体类型entity(StructuredOutputConverter<T> structuredOutputConverter)
:用于指定 StructuredOutputConverter
的实例,将 String
转换为实体类型stream()
方法而不是 call()
。
ChatClient
上指定 stream()
方法后,响应类型有几种选项:
Flux<String>
Flux<ChatResponse>
对象,其中包含有关响应的其他元数据Flux<ChatClientResponse>
对象,其中包含 ChatResponse
对象和 ChatClient 执行上下文,让您可以访问在执行 advisors 期间使用的其他数据(例如,在 RAG 流程中检索的相关文档)@Configuration
类中创建带有默认系统文本的 ChatClient
可以简化运行时代码。
通过设置默认值,您只需要在调用 ChatClient
时指定用户文本,无需在运行时代码路径中为每个请求设置系统文本。
@Configuration
类中创建一个 ChatClient
实例。
@RestController
:
ChatClient.Builder
级别,您可以指定默认提示配置。
defaultOptions(ChatOptions chatOptions)
ChatOptions
类中定义的便携选项或特定于模型的选项,如 OpenAiChatOptions
中的选项。有关特定于模型的 ChatOptions
实现的更多信息,请参阅 JavaDocs。defaultFunction(String name, String description, java.util.function.Function<I, O> function)
name
用于在用户文本中引用函数。description
解释函数的用途,帮助 AI 模型选择正确的函数以获得准确的响应。function
参数是模型在需要时将执行的 Java 函数实例。defaultFunctions(String... functionNames)
java.util.Function
的 bean 名称。defaultUser(...)
defaultUser(String text)
defaultUser(Resource text)
defaultUser(Consumer<UserSpec> userSpecConsumer)
:Consumer<UserSpec>
允许您使用 lambda 来指定用户文本和任何默认参数。defaultAdvisors(Advisor... advisor)
Prompt
的数据。QuestionAnswerAdvisor
实现通过附加与用户文本相关的上下文信息来启用 Retrieval Augmented Generation
模式。defaultAdvisors(Consumer<AdvisorSpec> advisorSpecConsumer)
Consumer
来使用 AdvisorSpec
配置多个 advisors。Advisors 可以修改用于创建最终 Prompt
的数据。Consumer<AdvisorSpec>
让您指定一个 lambda 来添加 advisors,如 QuestionAnswerAdvisor
,它通过附加与用户文本相关的相关上下文信息来支持 Retrieval Augmented Generation
。default
前缀的相应方法在运行时覆盖这些默认值。
AdvisorSpec
接口用于配置 advisors。这个接口提供了添加参数、一次设置多个参数以及向链中添加一个或多个 advisors 的方法。
MessageChatMemoryAdvisor
将首先执行,将对话历史添加到提示中。然后,QuestionAnswerAdvisor
将基于用户的问题和添加的对话历史执行其搜索,可能会提供更相关的结果。
了解 Question Answer Advisor
SimpleLoggerAdvisor
是一个记录 ChatClient
的 request
和 response
数据的 advisor。
这对于调试和监控您的 AI 交互很有用。
SimpleLoggerAdvisor
添加到 advisor 链中。
建议将其添加到链的末尾:
DEBUG
:
application.properties
或 application.yaml
文件中。
您可以通过使用以下构造函数自定义从 AdvisedRequest
和 ChatResponse
记录的哪些数据:
ChatMemory
接口表示聊天对话内存的存储。它提供了向对话添加消息、从对话中检索消息以及清除对话历史的方法。
目前有一个内置实现:MessageWindowChatMemory
。
MessageWindowChatMemory
是一个聊天内存实现,它维护一个最多指定最大大小(默认:20 条消息)的消息窗口。当消息数量超过此限制时,较旧的消息会被逐出,但系统消息会被保留。如果添加了新的系统消息,所有先前的系统消息都会从内存中删除。这确保了对话始终可以使用最新的上下文,同时保持内存使用有界。
MessageWindowChatMemory
由 ChatMemoryRepository
抽象支持,它提供了聊天对话内存的存储实现。有几种实现可用,包括 InMemoryChatMemoryRepository
、JdbcChatMemoryRepository
、CassandraChatMemoryRepository
和 Neo4jChatMemoryRepository
。
有关更多详细信息和用法示例,请参阅聊天内存文档。
ChatClient
中命令式和响应式编程模型的结合使用是 API 的一个独特方面。
通常,应用程序要么是响应式的,要么是命令式的,但不是两者都是。
HTTP 客户端配置
流式支持
工具调用
Advisors