Spring AI Alibaba ChatClient使用

一、ChatClient简介

Chat Client:https://java2ai.com/docs/1.0.0-M5.1/tutorials/chat-client/

1、ChatClient 简介

ChatClient 提供了与 AI 模型通信的 Fluent API,它支持同步和反应式(Reactive)编程模型。与 ChatModel、Message、ChatMemory 等原子 API 相比,使用 ChatClient 可以将与 LLM 及其他组件交互的复杂性隐藏在背后。

因为基于 大型语言模型 (LLM) 的应用程序通常要多个组件协同工作(例如,提示词模板、聊天记忆、LLM Model、输出解析器、RAG 组件:嵌入模型和存储),并且通常涉及多个交互,因此协调它们会让编码变得繁琐。

当然使用 ChatModel 等原子 API 可以为应用程序带来更多的灵活性,成本就是您需要编写大量样板代码。

ChatClient 类似于应用程序开发中的服务层,它为应用程序直接提供 AI 服务,开发者可以使用 ChatClient Fluent API 快速完成一整套 AI 交互流程的组装。

2、创建 ChatClient

使用 ChatClient.Builder 对象创建 ChatClient 实例,有两种方式:

  • 可以自动注入由Spring Boot 自动配置创建的默认 ChatClient.Builder 实例。
  • 也可以通过编程方式自行创建一个 ChatClient.Builder 实例并用它来得到 ChatClient 实例。
    @RestController
    public class ChatController {

      private final ChatClient chatClient;

      public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
      }

      @GetMapping("/chat")
      public String chat(String input) {
        return this.chatClient.prompt()
            .user(input)
            .call()
            .content();
      }
    }

3、处理 ChatClient 响应

ChatClient API 提供了多种方法来格式化来自 AI 模型的响应。

3.1 call()返回值

ChatClient.call() 方法支持几种不同类型的响应格式。

响应类型有几个选项:

  • String content():返回响应的字符串内容
  • ChatResponse chatResponse():返回ChatResponse包含多个代以及有关响应的元数据的对象,例如,使用了多少个令牌来创建响应。
  • entity 返回 Java 类型
    • entity(ParameterizedTypeReference type):用于返回实体类型的集合。
    • entity(Class type): 用于返回特定的实体类型。
    • entity(StructuredOutputConverter structuredOutputConverter): 用于指定一个实例 StructuredOutputConverter,将 String 转换为实体类型。

3.2 stream() 返回值

流式响应:ChatClient.stream() 方法是一种异步的、持续的获得模型响应的方式。

响应类型有几个选项:

  • Flux content():返回由AI模型生成的字符串的Flux。
  • Flux chatResponse():返回对象的 Flux ChatResponse,其中包含有关响应的附加元数据。

4、定制 ChatClient 默认值

使用 ChatClient.Builder.build() 快速创建了一个 ChatClient 实例,开发者还可以通过修改 ChatClient.Builder 定制 ChatClient 实例。

注意:

  • 全局设置:创建 ChatClient 时指定的配置将作为与模型交互时的默认参数,这样可以避免每次调用都重复设置。
  • 每次请求设置:每次调用也可以设置与模型交互时的参数,每次会覆盖系统默认值。

4.1 角色预设

角色预设:我们为 ChatClient 设置了一个默认的 system message(角色预设,比如:以海盗风格回答所有问题),这样,当 ChatClient 与模型交互时都会自动携带这条 system message,用户只需要指定 user message 即可。

@Configuration
pubic class Config {

        @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();
        }

}

除了 defaultSystem 之外,还可以在 ChatClient.Builder 级别上指定其他默认提示。同时,在运行时使用 ChatClient 提供的不带 default 前缀的相应方法覆盖这些默认值。

二、ChatClient使用

Spring AI Alibaba快速使用:https://blog.csdn.net/qq_42402854/article/details/146350253

1、编写 Controller接口

在普通 Controller Bean 中注入 ChatClient 实例,实现下面几个功能:

  • 简单调用
  • 流式调用
  • 角色预设流式|简单调用。
@Slf4j
@RestController
@RequestMapping("/dashscope/chat-client")
public class DashScopeChatClientController {

    private static final String DEFAULT_PROMPT = "你好,介绍下你自己!";


    private final ChatClient dashScopeChatClient;

    /**
     * 使用如下的方式自动注入 ChatClient
     *
     * @param chatClientBuilder
     */
    //public DashScopeChatClientController(ChatClient.Builder chatClientBuilder) {
    //
    //    this.dashScopeChatClient = chatClientBuilder.build();
    //}

    private final ChatModel chatModel;

    /**
     * 编程方式自行创建一个 ChatClient.Builder 实例.
     * 使用自动注入 ChatModel
     *
     * @param chatModel
     */
    public DashScopeChatClientController(ChatModel chatModel) {

        this.chatModel = chatModel;

        // 构造时,可以设置 ChatClient 的参数
        // {@link org.springframework.ai.chat.client.ChatClient};
        this.dashScopeChatClient = ChatClient.builder(chatModel)
                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(new InMemoryChatMemory())
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        DashScopeChatOptions.builder()
                                .withTopP(0.7)
                                .build()
                )
                // 设置默认 System Message
                //.defaultSystem("你是一个AI搞笑段子手,以搞笑,幽默,风趣的风格回答所有的问题。")
                .build();
    }


    /**
     * ChatClient 简单调用
     */
    @GetMapping("/simple/chat")
    public String simpleChat(String userInputPrompt) {
        if (StringUtils.isBlank(userInputPrompt)) {
            userInputPrompt = DEFAULT_PROMPT;
        }
        String aiOutput = dashScopeChatClient.prompt(userInputPrompt).call().content();
        log.info("\nsimpleChat --> userInputPrompt ={}, \n aiOutput = {}", userInputPrompt, aiOutput);
        return aiOutput;
    }

    /**
     * ChatClient 流式调用。
     * 可以使大模型的输出信息实现打字机效果。
     */
    @GetMapping("/stream/chat")
    public Flux<String> streamChat(HttpServletResponse response, String userInputPrompt) {
        if (StringUtils.isBlank(userInputPrompt)) {
            userInputPrompt = DEFAULT_PROMPT;
        }
        // 避免接口返回乱码
        response.setCharacterEncoding("UTF-8");
        log.info("\n streamChat -->  userInputPrompt ={},", userInputPrompt);
        Flux<String> aiOutput = dashScopeChatClient.prompt(DEFAULT_PROMPT).stream().content();
        return aiOutput;
    }

    /**
     * 角色预设 ChatClient 流式调用。
     * 可以使大模型的输出信息实现打字机效果。
     */
    @GetMapping("/stream/chatByRole")
    public Flux<String> streamChatByRole(HttpServletResponse response, String userInputPrompt) {
        if (StringUtils.isBlank(userInputPrompt)) {
            userInputPrompt = DEFAULT_PROMPT;
        }
        // 避免接口返回乱码
        response.setCharacterEncoding("UTF-8");
        log.info("\n streamChatByRole -->  userInputPrompt ={},", userInputPrompt);
        Flux<String> aiOutput = dashScopeChatClient
                .prompt()
                .system("你是一个AI搞笑段子手,以搞笑,幽默,风趣的风格回答所有的问题。")
                .user(userInputPrompt)
                .stream().content();
        return aiOutput;
    }


}

在这里插入图片描述

– 求知若饥,虚心若愚。

Spring Boot AI ChatClient 是一个基于Spring Boot框架构建的聊天机器人客户端。它可以与各种AI聊天引擎进行集成,提供智能对话服务。以下是一些关键特点和功能: 1. **易于集成**:Spring Boot的模块化和自动化配置使得与AI聊天引擎的集成变得非常简单。开发者可以通过添加依赖和少量配置来快速启动。 2. **可扩展性**:Spring Boot的微服务架构使得系统可以轻松扩展。通过添加更多的微服务实例,可以处理更多的并发请求。 3. **安全性**:Spring Boot提供了多种安全机制,如Spring Security,可以确保聊天数据的安全性。 4. **丰富的生态系统**:Spring Boot有庞大的生态系统,提供了许多有用的工具和库,可以加速开发过程。 5. **高性能**:Spring Boot的异步处理和响应式编程模型使得系统能够高效地处理大量并发请求。 6. **监控和管理**:Spring Boot Actuator提供了对应用程序的监控和管理功能,可以实时监控系统状态和性能。 以下是一个简单的示例,展示如何使用Spring Boot创建一个AI ChatClient: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class ChatClientApplication { public static void main(String[] args) { SpringApplication.run(ChatClientApplication.class, args); } @GetMapping("/chat") public String chat(String message) { // 这里可以集成AI聊天引擎的API return "AI回复: " + message; } } ``` 在这个示例中,我们创建了一个简单的Spring Boot应用程序,定义了一个`/chat`端点来处理聊天请求。实际应用中,你可以在`chat`方法中集成AI聊天引擎的API。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值