Spring AI:ChatClient实现对话效果

在之前文章中,我们通过注入 DeepSeekChatModel 实例的方式,实现了对 DeepSeek 官方提供的两个不同大模型的调用(V3 和 R1 推理模型):Spring AI:对接官方 DeepSeek-R1 模型 ------ 实现推理效果Spring AI:对接DeepSeek实战

点击进入到 DeepSeekChatModel 的源码中,会发现它实现了 ChatModel 接口,此接口用于和具体的大语言模型(如 DeepSeek、OpenAI等)交互,提供对模型生成能力的细粒度控制,如设置模型的相关参数(如 temperature、topP、maxTokens 等等)。

除了上述方式外,我们还可以使用 Spring AI 提供的另一个接口 ------ ChatClient。此接口属于更上层的封装,它隐藏了底层模型的差异,能够简化调用。

ChatClient 与 ChatModel 对比

对比一下两个接口,如下:

使用 ChatClient 实现对话

接下来,我们通过 ChatClient 来实现一下之前一样的对话效果,看看使用方式上,有何不同。首先,编辑 application.yml 文件,将模型切换回 deepseek-chat 模型,V3 模型相较于 R1 模型,收费更低,不需要测试推理的话,用这个省点钱:

java 复制代码
spring:
  ai:
    deepseek:
      // 省略...
      chat:
        options:
          model: deepseek-chat # 使用哪个模型
          // 省略...

配置 ChatClient 客户端

新建一个 /config 包,添加 ChatClient 客户端的配置类 ChatClientConfig(相较于 ChatModel 能够通过 starter 自动装配,ChatClient 需要我们手动配置,并注入到 Spring 容器中):

java 复制代码
@Configuration
public class ChatClientConfig {

    /**
     * 初始化 ChatClient 客户端
     * @param chatModel
     * @return
     */
    @Bean
    public ChatClient chatClient(DeepSeekChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .build();
    }
}

解释一下:

  • 方法参数 DeepSeekChatModel chatModel:依赖注入 starter 自动装配的 DeepSeekChatModel 实例,它是 ChatModel 接口的具体实现类,表示底层对接的 DeepSeek 大语言模型;
  • ChatClient.builder(chatModel).build(): 使用 ChatClient 的建造者模式(Builder),将 DeepSeekChatModel 实例作为底层模型绑定到 ChatClient 客户端;

新增 Controller

然后,我们在 /controller 包下,新建一个 ChatClientController 控制器,专门放置 ChatClient 使用示例代码:

并在其中定义一个 /v2/ai/generate 接口,用于实现普通类型对话,这次我们改为注入 ChatClient 来使用, 代码如下:

java 复制代码
@RestController
@RequestMapping("/v2/ai")
public class ChatClientController {

    @Resource
    private ChatClient chatClient;

    /**
     * 普通对话
     * @param message
     * @return
     */
    @GetMapping("/generate")
    public String generate(@RequestParam(value = "message", defaultValue = "你是谁?") String message) {
        // 一次性返回结果
        return chatClient.prompt()
                .user(message)
                .call()
                .content();
    }


}

重启项目。访问: http://localhost:8080/v2/ai/generate?message=你是谁

指定一个系统角色

另外,在初始化 ChatClient 的时候,还可以通过 .defaultSystem() 方法,为模型设定一个角色,如 "扮演一个智能客服":

java 复制代码
@Configuration
public class ChatClientConfig {

    /**
     *
     * @param chatModel
     * @return
     */
    @Bean
    public ChatClient chatClient(DeepSeekChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem("请你扮演一个智能客服")
                .build();
    }
}

重启项目,再次测试接口,会发现这次的回答结果,不再说自己是 DeepSeek Chat 模型了,而是带入了客服的角色。

流式对话

再来通过 ChatClient 实现一波流式对话的效果。编辑 ChatClientController 控制器,添加接口如下:

java 复制代码
@RestController
@RequestMapping("/v2/ai")
public class ChatClientController {

    @Resource
    private ChatClient chatClient;

    // 省略...

    /**
     * 流式对话
     * @param message
     * @return
     */
    @GetMapping(value = "/generateStream", produces = "text/html;charset=utf-8")
    public Flux<String> generateStream(@RequestParam(value = "message", defaultValue = "你是谁?") String message) {
        return chatClient.prompt()
                .user(message) // 提示词
                .stream() // 流式输出
                .content();

    }

}
相关推荐
编程牛马姐2 分钟前
并发、多线程和HTTP连接之间有什么关系?
人工智能
羑悻的小杀马特1 小时前
把随身WiFi改成网盘聚合器:中兴F50挂载本地存储+夸克网盘实战
运维·服务器·人工智能·网盘·openlist
meilindehuzi_a1 小时前
从跑分到生产力:重新理解大模型基准测试与分层协作
人工智能
蜜桃味女焊匠人2 小时前
焊接生产线优化思路:解决手工焊、机器人焊气体浪费问题
人工智能·经验分享·其他·机器人
Georgeviewer7 小时前
商业落地评测|实体门店GEO优化性价比与服务体系深度复盘
大数据·人工智能
GuWenyue7 小时前
分不清AI Workflow与Agent?3个实战案例彻底讲透,做AI应用不再踩选型坑
人工智能
彩讯股份3006348 小时前
彩讯股份与心洲科技签署战略合作协议,共建企业级模型后训练能力
人工智能·科技
迅易科技8 小时前
从场景验证到Agent上线:迅易 × WorkBuddy如何帮助企业建设AI能力?
人工智能·ai·腾讯云
腻害兔8 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
PNP Robotics8 小时前
多伦多大学机器人峰会|物理AI与具身智能落地新趋势
人工智能·深度学习·机器学习·机器人