SpringAI中的ChatClient是啥

张开发
2026/4/13 11:18:47 15 分钟阅读

分享文章

SpringAI中的ChatClient是啥
SpringAI中的ChatClient是啥1. ChatClient2. ChatClient 的 default3. ChatClient的functions4. System 和 User5. Advisor6. SimpleLoggerAdvisor1. ChatClient除了直接用 ChatModel 和大模型对话Spring AI 还提供了更好用的 ChatClient—— 它就是为了简化使用做的「高级封装」门面类比 ChatModel 用起来更简洁、更顺手不用写复杂的调用逻辑。ChatClient包括一些基础功能如 定制和组装模型的输入Prompt 格式化解析模型的输出Structured Output 调整模型交互参数ChatOptions还支持更多高级功能 聊天记忆Chat Memory 工具/函数调用Function Calling RAG下面是一段测试代码RestControllerRequestMapping(/a5/chatClientTest)publicclassA5ChatClientTestControllerimplementsInitializingBean{ResourceprivateChatModelollamaChatModel;privateChatClientchatClient;MyQuickTestFlux(uri/a5/chatClientTest/test1/{message},desc使用ChatClient实现非流式输出)GetMapping(/test1/{message})publicStringtest1(PathVariableStringmessage){returnchatClient.prompt(message).call().content();}MyQuickTestFlux(uri/a5/chatClientTest/test2/{message},desc使用ChatClient实现流式输出)RequestMapping(/test2/{message})publicFluxStringtest2(HttpServletResponseresponse,PathVariableStringmessage){response.setContentType(text/event-stream);response.setCharacterEncoding(UTF-8);returnchatClient.prompt(message).stream().content();}/** * 当依赖的属性全已设置时会自动调用该方法初始化 ChatClient */OverridepublicvoidafterPropertiesSet(){this.chatClientChatClient.builder(ollamaChatModel).defaultAdvisors(newSimpleLoggerAdvisor())// 实现 Logger 的 Advisor.defaultSystem(你是一个翻译大师你会把用户的输入翻译为英文。在每次回复用户之前你都会先自报家门告诉用户你是谁)// 默认系统提示词.defaultOptions(DashScopeChatOptions.builder()// 设置 ChatClient 中 ChatModel 的 Options 参数.topP(0.7).build()).build();}}2. ChatClient 的 defaultChatClient在初始化的时候可以指定很多defalut的配置ChatClient 在创建时可以设置很多默认配置。这些默认值后面调用时不用重复写会自动生效。比如我们提前设置 defaultSystem 让模型用英语回答之后不管问什么它都会自动用英文回复。但是如果后面使用 ChatClient 时重新指定了 system那么之前设置的 defaultSystem 就会被覆盖以新设置的为准。如果是在 Prompt 中设置的 SystemMessage则会追加而不是覆盖。MyQuickTestFlux(uri/a5/chatClientTest/test4/{message},desc使用SystemMessage的时候不会覆盖默认系统提示词而是追加)RequestMapping(/test4/{message})publicFluxStringtest4(HttpServletResponseresponse,PathVariableStringmessage){response.setContentType(text/event-stream);response.setCharacterEncoding(UTF-8);UserMessageuserMessagenewUserMessage(message);SystemMessagesystemMessagenewSystemMessage(再过了两年);returnchatClient.prompt().messages(List.of(systemMessage,userMessage)).stream().content();}/** * 当依赖的属性全已设置时会自动调用该方法初始化 ChatClient */OverridepublicvoidafterPropertiesSet(){this.chatClientChatClient.builder(ollamaChatModel).defaultAdvisors(newSimpleLoggerAdvisor())// 实现 Logger 的 Advisor.defaultSystem(已知小明今年9岁)// 默认系统提示词.defaultOptions(DashScopeChatOptions.builder()// 设置 ChatClient 中 ChatModel 的 Options 参数.topP(0.7).enableThinking(false).build()).build();}3. ChatClient的functions定义function call/** * 定义function call */ConfigurationpublicclassFunctionCallConfiguration{Description(根据用户的city获取天气)BeanpublicFunctionWeatherRequest,WeatherResponseweather(){returnrequest-newWeatherResponse(北京,晴天25℃);}DataAllArgsConstructorNoArgsConstructorpublicstaticclassWeatherRequest{JsonPropertyDescription(要查询的城市)privateStringcity;}DataAllArgsConstructorNoArgsConstructorpublicstaticclassWeatherResponse{privateStringcity;privateStringinfo;}}大模型根据用户输入判断假如有必要的话就调用functionRestControllerRequestMapping(/a6/test)publicclassA6FunctionCallTestControllerimplementsInitializingBean{ResourceprivateDashScopeChatModeldashScopeChatModel;privateChatClientchatClient;MyQuickTestFlux(uri/a6/test/test1/{message},descfunction call获取天气)GetMapping(/test1/{message})publicStringtest1(PathVariableStringmessage){returnchatClient.prompt(message).call().content();}OverridepublicvoidafterPropertiesSet(){this.chatClientChatClient.builder(dashScopeChatModel).defaultAdvisors(newSimpleLoggerAdvisor()).defaultToolNames(weather).defaultOptions(DashScopeChatOptions.builder().topP(0.7).build()).build();}}4. System 和 UserSystem 和 User 其实就是提示词的两类核心 System系统提示词通常提前用 default 配置好比如 “你是 Java 讲师回答要简洁” User用户提示词少数初始化内容可设默认但绝大部分都是运行时根据用户实际输入动态设置。5. AdvisorAdvisors 就是 AI 调用链路的「拦截器 / 切面」和 Spring AOP 的 Advisor 原理一样在调用大模型的前后能拦截、修改、增强 Prompt输入或 Response输出也能做日志记录。比如可以统一给所有 Prompt 加系统提示词或给 Response 做内容过滤。RAG、聊天记忆这些核心功能都得靠 Advisor 来实现。比如 SimpleLoggerAdvisor就是最基础的例子 —— 它本质就是一个日志扩展通过 Advisor 拦截 AI 调用的输入输出实现日志记录。6. SimpleLoggerAdvisorRestControllerRequestMapping(/a7/testLogger)publicclassA7SimpleLoggerAdvisorControllerimplementsInitializingBean{ResourceprivateChatModelollamaChatModel;privateChatClientchatClient;MyQuickTestFlux(uri/a7/testLogger/test/{message},desc查看打印日志)GetMapping(/test/{message})publicStringtest(PathVariableStringmessage){returnchatClient.prompt(message).call().content();}/** * 当依赖的属性全已设置时会自动调用该方法初始化 ChatClient */OverridepublicvoidafterPropertiesSet(){this.chatClientChatClient.builder(ollamaChatModel).defaultAdvisors(newSimpleLoggerAdvisor())// 实现 Logger 的 Advisor.defaultSystem(你是一个专业的ai)// 默认系统提示词.defaultOptions(DashScopeChatOptions.builder()// 设置 ChatClient 中 ChatModel 的 Options 参数.build()).build();}}

更多文章