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

posted @ 2025-12-16 11:19  0xCAFEBABE_001  阅读(1)  评论(0)    收藏  举报