当前位置: 首页 > news >正文

【SpringAI 12】对话机器人进阶

我们都前面知道了,简单的机器人有两种方式:流式调用和同步调用

importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importreactor.core.publisher.Flux;@RestControllerpublicclassChatController{privatefinalChatClientchatClient;// 注入配置好的 ChatClientpublicChatController(ChatClientchatClient){this.chatClient=chatClient;}/** * 同步调用:获取完整回复 */@GetMapping("/chat")publicStringchat(@RequestParam(value="message",defaultValue="你好!")Stringmessage){returnchatClient.prompt().user(message).call().content();}/** * 流式调用:实时返回生成内容(适合前端打字机效果) */@GetMapping("/chat/stream")publicFlux<String>chatStream(@RequestParam(value="message",defaultValue="你好!")Stringmessage){returnchatClient.prompt().user(message).stream().content();}}

我们这里讲一点就是上一篇.defaultSystem(“…”)‌: 设置全局默认的系统提示词。这意味着每次使用该 ChatClient 发起对话时,都会隐含地带上这条指令,让模型扮演“可爱的助手毛毛虫”。

packagecom.example.chatai.config;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.ollama.OllamaChatModel;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassChatClientConfig{@BeanpublicChatClientchatClient(OllamaChatModelmodel){returnChatClient.builder(model).defaultSystem("你是可爱的助手,名字叫毛毛虫").build();}}

但是有个点要注意

A. 动态覆盖系统提示词

虽然配置中设置了默认 System Prompt,但在某些场景下可能需要临时修改。可以在调用时动态指定:

chatClient.prompt().system("你现在是一个专业的Java工程师")// 覆盖默认的“毛毛虫”设定.user("如何优化 Netty 的性能?").call().content();

B. 添加记忆功能(Message History)

ChatClient 本身是无状态的。如果需要实现多轮对话记忆,需要手动维护 Message 列表或使用 Spring AI 提供的 ChatMemory 机制。

C. 异常处理与超时

在生产环境中,建议为 ChatClient 配置重试机制或超时控制,可以通过底层的 RestTemplate 或 WebClient 配置来实现,或者在 Service 层包裹调用逻辑。

总结

ChatClientConfig 是一个标准且简洁的 Spring AI 配置方式。它利用了 Spring 的依赖注入和 Spring AI 的构建者模式,将模型细节与业务逻辑解耦。只需确保 Ollama 服务正常运行且依赖配置正确,即可快速构建基于本地大模型的 AI 应用。

http://www.jsqmd.com/news/1191341/

相关文章:

  • 带标注的饮料瓶罐分类,可识别玻璃瓶,塑料瓶,水壶易拉罐,识别率95% ,15645张图,支持yolo,coco json,voc xml,文末有模型训练代码
  • SAML2.0 HTTP绑定方式详解:Redirect、POST与Artifact的选型指南
  • 围棋AI分析工具:识别定式陷阱与双虎变化实战指南
  • DFM是什么?为什么PCB/SMT下单前要做可制造性检查
  • Obsidian 同步的最优方法:Nutstore Sync 免费同步教程
  • 抖大侠适合哪些商家_从新手单店到多店的使用边界 - 抖大侠
  • Alpha Vantage美股日线数据稳定下载实战指南
  • 【逗老师的无线电】BI1FQO手搓笔记:STM32直驱4G模组,打造极致精简MMDVM热点
  • 家装电线选型指南:BVR软线参数解读与金环宇ZC-BVR4实测
  • OpenCV.FindImgAll函数详解:移动端自动化图片匹配技术实战
  • 基于NLP的内容安全检测系统:从语义分析到工程实践
  • Grok4双模态实时对齐:语音与视频毫秒级协同技术解析
  • TMS320F28xx ADC优先级与突发模式实战解析
  • 【C++】类和对象--友元机制
  • 腾讯混元Hy3 MoE架构解析:2小时开发完整APP的Agent编程实战
  • 汽车电源设计实战:LM51501-Q1升压控制器在启停与紧急呼叫系统中的应用
  • 4G模块AT指令实战:从Text到PDU模式发送中文短信的避坑指南
  • 抖大侠与抖店是什么关系_第三方服务身份说明 - 抖大侠
  • 实时双语字幕系统底层原理与工程实践
  • Claude Code 模板:AI 开发的认知卸载与金融工程实践
  • 【51单片机】点阵LED的创意表白:从跳动爱心到滚动字母
  • Python基础语法速成:100分钟掌握核心编程概念与实战应用
  • Apple登录后端验证:从JWT解析到公钥缓存的实战优化
  • 交通事故技术取证与责任认定:视频分析与证据链构建实践
  • UABEA:Unity资源包分析与编辑的跨平台利器
  • TRAE SOLO:面向独立开发者的三端联动智能协作操作系统
  • 竹席点钻机机架刚性分析与胶量控制精度实测
  • 40克AI眼镜如何实现无感实时翻译?唇动识别+骨导+单色显示三重突破
  • (2026最新)德阳漏水检测维修师傅上门-正规防水补漏公司本地居民实测推荐五家-卫生间/屋顶/厨房/阳台/外墙/地下室专业仪器精准检测漏水点 - 安佳防水
  • AI智能体如何通过具身化在特定环境中实现价值