SpringAI-ChatClient
官网地址:https://docs.spring.io/spring-ai/reference/api/chatclient.html#_prompt_templates
1、描述
ChatClient用来与LLM交互,提供了构建传递给LLM作为输入的Prompt的方法。
2、创建ChatClient
可以使用统一配置,使用的ChatModel为OllamaChatModel,OllamaChatModel为自动装配
配置:
spring.ai.ollama.base-url = http://localhost:11434
spring.ai.ollama.chat.options.model = qwen3:8b
代码:
package com.example.ai.config;
import com.example.ai.tools.DateTimeTools;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepository;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.vectorstore.milvus.MilvusVectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OllamaConfig {
@Autowired
private DateTimeTools dateTimeTools;
@Autowired
private JdbcChatMemoryRepository jdbcChatMemoryRepository;
@Autowired
private MilvusVectorStore milvusVectorStore;
@Bean
public ChatClient chatClient(OllamaChatModel ollamaChatModel) {
MessageWindowChatMemory messageWindowChatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(jdbcChatMemoryRepository).maxMessages(10).build();
return ChatClient.builder(ollamaChatModel)
.defaultSystem("你是一个专家,请用{voice}语气回答问题")
// .defaultTools(dateTimeTools)
// advisors的执行是有顺序的
.defaultAdvisors(MessageChatMemoryAdvisor.builder(messageWindowChatMemory).build(),
QuestionAnswerAdvisor.builder(milvusVectorStore).build(), new SimpleLoggerAdvisor())
.build();
}
}
3、三个重载方法
- prompt()
- prompt(Prompt prompt)
- prompt(String content)
4、响应
4.1、返回ChatResponse
ChatResponse chatResponse = chatClient.prompt()
.user("Tell me a joke")
.call()
.chatResponse();
4.2、返回实体
ActorFilms actorFilms = chatClient.prompt()
.user("Generate the filmography for a random actor.")
.call()
.entity(ActorFilms.class);
4.3、流式响应
Flux<String> output = chatClient.prompt()
.user("Tell me a joke")
.stream()
.content();
5、提示词模板
可以将用户和系统文本作为模板提供,其中变量在运行时被替换
String answer = ChatClient.create(chatModel).prompt()
.user(u -> u
.text("Tell me the names of 5 movies whose soundtrack was composed by {composer}")
.param("composer", "John Williams"))
.call()
.content();
可以使用自定义分隔符渲染模板,使用StTemplateRenderer,如果模板使用JSON格式,那么避免与JSON语法冲突,可以自定义分隔符
String answer = ChatClient.create(chatModel).prompt()
.user(u -> u
.text("Tell me the names of 5 movies whose soundtrack was composed by <composer>")
.param("composer", "John Williams"))
.templateRenderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build())
.call()
.content();
6、call返回值
- String content():返回响应的字符串内容
- ChatResponse chatResponse():返回ChatResponse对象,该对象包含多个生成以及有关响应的元数据,例如用户创建响应的令牌数量
- ChatClientResponse() chatClientResponse():: 返回一个 ChatClientResponse 对象,该对象包含 ChatResponse 对象和 ChatClient 执行上下文,使您可以访问 Advisor 执行期间使用的额外数据(例如,RAG 流中检索到的相关文档)。
- entity() 返回Java类型
- responseEntity() 返回ChatResponse和Java类型,可以在一次调用中同时访问完整的 AI 模型响应(带元数据和生成)和结构化输出实体时
7、stream返回值
- Flux
content(): 返回 AI 模型正在生成的字符串的 Flux。 - Flux
chatResponse(): 返回 ChatResponse 对象的 Flux,该对象包含有关响应的其他元数据。 - Flux
chatClientResponse(): 返回 ChatClientResponse 对象的 Flux,该对象包含 ChatResponse 对象和 ChatClient 执行上下文,使您可以访问 Advisor 执行期间使用的额外数据(例如,RAG 流中检索到的相关文档)。
8、默认值
8.1、系统默认文本
@Bean
ChatClient chatClient(ChatClient.Builder builder) {
return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a Pirate")
.build();
}
8.2、带参数的默认系统文本
@Bean
ChatClient chatClient(ChatClient.Builder builder) {
return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a {voice}")
.build();
}
@GetMapping("/ai")
Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message, String voice) {
return Map.of("completion",
this.chatClient.prompt()
.system(sp -> sp.param("voice", voice))
.user(message)
.call()
.content());
}
9、Advisor
详情:Advisors API
10、聊天记忆
可以实现JdbcChatMemoryRepository,将聊天记忆存储到mysql
详情:ChatMemory
本文来自博客园,作者:0xCAFEBABE_001,转载请注明原文链接:https://www.cnblogs.com/0xcafebabe001/p/19356180

浙公网安备 33010602011771号