{"id":8646,"date":"2025-09-30T11:43:18","date_gmt":"2025-09-30T03:43:18","guid":{"rendered":"https:\/\/www.legendkiller.xyz\/?p=8646"},"modified":"2025-10-03T20:39:25","modified_gmt":"2025-10-03T12:39:25","slug":"spring-ai-alibaba","status":"publish","type":"post","link":"https:\/\/www.legendkiller.xyz\/index.php\/2025\/09\/30\/spring-ai-alibaba\/","title":{"rendered":"\u901f\u901aSpring AI Alibaba \u5b8c\u7ed3"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1.Spring AI Alibaba\u7406\u8bba\u6982\u8ff0<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-271.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"970\" height=\"598\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-271.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8656\"  sizes=\"(max-width: 970px) 100vw, 970px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u4ec0\u4e48\u662f Spring AI Alibaba<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-273.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"803\" height=\"612\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-273.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8658\"  sizes=\"(max-width: 803px) 100vw, 803px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-272.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"762\" height=\"112\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-272.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8657\"  sizes=\"(max-width: 762px) 100vw, 762px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">SAA\u516c\u5f0f\u5316\u4e00\u53e5\u8bdd\u8868\u8fbe<\/h4>\n\n\n\n<p>Spring AI Alibaba \u5f00\u6e90\u9879\u76ee\u57fa\u4e8e Spring AI \u6784\u5efa\uff0c\u662f\u963f\u91cc\u4e91\u901a\u4e49\u7cfb\u5217\u6a21\u578b\u53ca\u670d\u52a1\u5728 Java AI \u5e94\u7528\u5f00\u53d1\u9886\u57df\u7684\u6700\u4f73\u5b9e\u8df5\uff0c\u63d0\u4f9b\u9ad8\u5c42\u6b21\u7684 AI API \u62bd\u8c61\u4e0e\u4e91\u539f\u751f\u57fa\u7840\u8bbe\u65bd\u96c6\u6210\u65b9\u6848\u548c\u4f01\u4e1a\u7ea7 AI \u5e94\u7528\u751f\u6001\u96c6\u6210\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b98\u7f51\u77e5\u8bc6\u51fa\u5904<\/h4>\n\n\n\n<p>SpringAI\u5b98\u7f51\uff1a<a href=\"https:\/\/spring.io\/projects\/spring-ai#learn\">https:\/\/spring.io\/projects\/spring-ai#learn<\/a><\/p>\n\n\n\n<p>Spring AI Alibaba 1.0 GA \u6b63\u5f0f\u53d1\u5e03\uff1a<a href=\"https:\/\/java2ai.com\/\">https:\/\/java2ai.com\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/blog\/spring-ai-alibaba-10-ga-release\/?spm=5176.29160081.0.0.2856aa5cww2t9D\">https:\/\/java2ai.com\/blog\/spring-ai-alibaba-10-ga-release\/?spm=5176.29160081.0.0.2856aa5cww2t9D<\/a><\/p>\n\n\n\n<p>\u963f\u91cc\u4e91\u767e\u70bc\u5e73\u53f0\uff1a<a href=\"https:\/\/bailian.console.aliyun.com\/console?tab=model#\/model-market\">https:\/\/bailian.console.aliyun.com\/console?tab=model#\/model-market<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u80fd\u5e72\u561b<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-274-1024x286.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"286\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-274-1024x286.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8659\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>Spring AI Alibaba \u57fa\u4e8e Spring AI \u6784\u5efa\uff0c\u56e0\u6b64SAA\u7ee7\u627f\u4e86SpringAI \u7684\u6240\u6709\u539f\u5b50\u80fd\u529b\u62bd\u8c61\u5e76\u5728\u6b64<br>\u57fa\u7840\u4e0a\u6269\u5145\u4e30\u5bcc\u4e86\u6a21\u578b\u3001\u5411\u91cf\u5b58\u50a8\u3001\u8bb0\u5fc6\u3001RAG \u7b49\u6838\u5fc3\u7ec4\u4ef6\u9002\u914d\uff0c\u8ba9\u5176\u80fd\u591f\u63a5\u5165\u963f\u91cc\u4e91\u7684 AI \u751f\u6001\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.\u53bb\u54ea\u4e0b<\/h3>\n\n\n\n<p>Spring AI \u5b98\u7f51\uff1ahttps:\/\/spring.io\/projects\/spring-ai#overview<br>Spring AI Alibaba \u5b98\u7f51\uff1ahttps:\/\/java2ai.com<br>Spring AI Alibaba \u4ed3\u5e93\uff1ahttps:\/\/github.com\/alibaba\/spring-ai-alibaba<br>Spring AI Alibaba \u5b98\u65b9\u793a\u4f8b\u4ed3\u5e93\uff1ahttps:\/\/github.com\/springaialibaba\/spring-ai-alibaba-examples<br>Spring AI 1.0 GA \u6587\u7ae0\uff1ahttps:\/\/java2ai.com\/blog\/spring-ai-100-ga-released<br>Spring AI \u4ed3\u5e93\uff1ahttps:\/\/github.com\/spring-projects\/spring-ai<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u600e\u4e48\u7528<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-276-1024x580.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"580\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-276-1024x580.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8661\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">5.SpringAI VS SpringAI Alibaba VS LangChain4J<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-278.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"746\" height=\"609\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-278.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8663\"  sizes=\"(max-width: 746px) 100vw, 746px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-277.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"750\" height=\"523\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-277.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8662\"  sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">2.\u6c38\u8fdc\u7684HelloWorld<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u524d\u7f6e\u7ea6\u5b9a<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-279.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"713\" height=\"583\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-279.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8664\"  sizes=\"(max-width: 713px) 100vw, 713px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">SpringAI Alibaba \u4e0e SpringAI\u3001SpringBoot\u7248\u672c\u4f9d\u8d56\u5173\u7cfb<\/h4>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/faq\/?spm=4347728f.6d9f13c1.0.0.17177187POpLHJ#%E6%80%8E%E4%B9%88%E7%A1%AE%E5%AE%9A-spring-ai-alibaba-%E4%B8%8E-spring-aispring-boot-%E7%89%88%E6%9C%AC%E7%9A%84%E5%85%BC%E5%AE%B9%E5%85%B3%E7%B3%BB\">https:\/\/java2ai.com\/docs\/1.0.0.2\/faq\/?spm=4347728f.6d9f13c1.0.0.17177187POpLHJ#%E6%80%8E%E4%B9%88%E7%A1%AE%E5%AE%9A-spring-ai-alibaba-%E4%B8%8E-spring-aispring-boot-%E7%89%88%E6%9C%AC%E7%9A%84%E5%85%BC%E5%AE%B9%E5%85%B3%E7%B3%BB<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-280.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"809\" height=\"405\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-280.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8665\"  sizes=\"(max-width: 809px) 100vw, 809px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u914d\u7f6e\u95e8\u9053\u548c\u5173\u952e\u70b9<\/h4>\n\n\n\n<p>\u901a\u8fc7\u540e\u7eed\u8bb2\u89e3\u914d\u7f6e\u89c4\u5219\uff0c\u6240\u6709\u8c03\u7528\u5747\u57fa\u4e8e OpenAI\u534f\u8bae\u6807\u51c6\u6216\u8005SpringAI Aalibaba\u5b98\u65b9\u63a8\u8350\u6a21\u578b\u670d\u52a1\u7075\u79ef(DashScope)\u6574\u5408\u89c4\u5219\uff0c\u5b9e\u73b0\u4e00\u81f4\u7684\u63a5\u53e3\u8bbe\u8ba1\u4e0e\u89c4\u8303\uff0c\u786e\u4fdd\u591a\u6a21\u578b\u5207\u6362\u7684\u4fbf\u5229\u6027\uff0c\u63d0\u4f9b\u9ad8\u5ea6\u53ef\u6269\u5c55\u7684\u5f00\u53d1\u652f\u6301<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u963f\u91cc\u4e91\u767e\u70bc\u5e73\u53f0\u5165\u53e3\u5b98\u7f51<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u63a5\u5165\u963f\u91cc\u767e\u70bc\u5e73\u53f0\u7684\u901a\u4e49\u6a21\u578b<\/h4>\n\n\n\n<p><a href=\"https:\/\/bailian.console.aliyun.com\">https:\/\/bailian.console.aliyun.com<\/a><\/p>\n\n\n\n<p>\u5927\u6a21\u578b\u8c03\u7528\u4e09\u4ef6\u5957<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-281.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"441\" height=\"246\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-281.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8666\"  sizes=\"(max-width: 441px) 100vw, 441px\" \/><\/div><\/figure>\n\n\n\n<p>\u5c0f\u603b\u7ed3<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-282.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"828\" height=\"180\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-282.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8667\"  sizes=\"(max-width: 828px) 100vw, 828px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3.IDEA\u5de5\u5177\u4e2d\u5efaproject\u7236\u5de5\u7a0b<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-283-645x1024.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"645\" height=\"1024\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-283-645x1024.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8668\"  sizes=\"(max-width: 645px) 100vw, 645px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/starters-and-quick-guide\/?spm=5176.29160081.0.0.2856aa5c0l3sEA#%E4%BD%BF%E7%94%A8-bom-%E7%AE%A1%E7%90%86%E4%BE%9D%E8%B5%96%E7%89%88%E6%9C%AC\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/starters-and-quick-guide\/?spm=5176.29160081.0.0.2856aa5c0l3sEA#%E4%BD%BF%E7%94%A8-bom-%E7%AE%A1%E7%90%86%E4%BE%9D%E8%B5%96%E7%89%88%E6%9C%AC<\/a><\/p>\n\n\n\n<p>\u521d\u59cb\u603bPOM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;groupId&gt;com.atguigu.study&lt;\/groupId&gt;\n    &lt;artifactId&gt;SpringAIAlibaba-atguiguV1&lt;\/artifactId&gt;\n    &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;packaging&gt;pom&lt;\/packaging&gt;\n    &lt;name&gt;SpringAIAlibaba-Maven\u7236\u5de5\u7a0bPOM\u914d\u7f6e&lt;\/name&gt;\n\n    \n    &lt;properties&gt;\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n        &lt;project.reporting.outputEncoding&gt;UTF-8&lt;\/project.reporting.outputEncoding&gt;\n        &lt;maven.compiler.source&gt;21&lt;\/maven.compiler.source&gt;\n        &lt;maven.compiler.target&gt;21&lt;\/maven.compiler.target&gt;\n        &lt;java.version&gt;21&lt;\/java.version&gt;\n        &lt;!-- Spring Boot \u65b0\u5efa2025.9--&gt;\n        &lt;spring-boot.version&gt;3.5.5&lt;\/spring-boot.version&gt;\n        &lt;!-- Spring AI \u65b0\u5efa2025.9--&gt;\n        &lt;spring-ai.version&gt;1.0.0&lt;\/spring-ai.version&gt;\n        &lt;!-- Spring AI Alibaba \u65b0\u5efa2025.9--&gt;\n        &lt;SpringAIAlibaba.version&gt;1.0.0.2&lt;\/SpringAIAlibaba.version&gt;\n    &lt;\/properties&gt;\n\n    &lt;dependencyManagement&gt;\n        &lt;dependencies&gt;\n            &lt;!-- Spring Boot --&gt;\n            &lt;dependency&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-dependencies&lt;\/artifactId&gt;\n                &lt;version&gt;${spring-boot.version}&lt;\/version&gt;\n                &lt;type&gt;pom&lt;\/type&gt;\n                &lt;scope&gt;import&lt;\/scope&gt;\n            &lt;\/dependency&gt;\n            &lt;!-- Spring AI Alibaba --&gt;\n            &lt;dependency&gt;\n                &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-ai-alibaba-bom&lt;\/artifactId&gt;\n                &lt;version&gt;${SpringAIAlibaba.version}&lt;\/version&gt;\n                &lt;type&gt;pom&lt;\/type&gt;\n                &lt;scope&gt;import&lt;\/scope&gt;\n            &lt;\/dependency&gt;\n            &lt;!-- Spring AI --&gt;\n            &lt;dependency&gt;\n                &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-ai-bom&lt;\/artifactId&gt;\n                &lt;version&gt;${spring-ai.version}&lt;\/version&gt;\n                &lt;type&gt;pom&lt;\/type&gt;\n                &lt;scope&gt;import&lt;\/scope&gt;\n            &lt;\/dependency&gt;\n        &lt;\/dependencies&gt;\n    &lt;\/dependencyManagement&gt;\n\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;${spring-boot.version}&lt;\/version&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-milestones&lt;\/id&gt;\n            &lt;name&gt;Spring Milestones&lt;\/name&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/milestone&lt;\/url&gt;\n            &lt;snapshots&gt;\n                &lt;enabled&gt;false&lt;\/enabled&gt;\n            &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u5efaModule<\/h4>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;com.atguigu.study&lt;\/groupId&gt;\n        &lt;artifactId&gt;SpringAIAlibaba-atguiguV1&lt;\/artifactId&gt;\n        &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;artifactId&gt;SAA-01HelloWorld&lt;\/artifactId&gt;\n\n    &lt;properties&gt;\n        &lt;maven.compiler.source&gt;21&lt;\/maven.compiler.source&gt;\n        &lt;maven.compiler.target&gt;21&lt;\/maven.compiler.target&gt;\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n    &lt;\/properties&gt;\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!-- \u5f15\u5165 springai alibaba DashScope \u6a21\u578b\u9002\u914d\u7684 Starter --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-alibaba-starter-dashscope&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--lombok--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;!--hutool--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.8.22&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;3.11.0&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;compilerArgs&gt;\n                        &lt;arg&gt;-parameters&lt;\/arg&gt;\n                    &lt;\/compilerArgs&gt;\n                    &lt;source&gt;21&lt;\/source&gt;\n                    &lt;target&gt;21&lt;\/target&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-milestones&lt;\/id&gt;\n            &lt;name&gt;Spring Milestones&lt;\/name&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/milestone&lt;\/url&gt;\n            &lt;snapshots&gt;\n                &lt;enabled&gt;false&lt;\/enabled&gt;\n            &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3.\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8001\n\n#\u5927\u6a21\u578b\u5bf9\u8bdd\u4e2d\u6587\u4e71\u7801UTF8\u7f16\u7801\u5904\u7406\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-01HelloWorld\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}\nspring.ai.dashscope.base-url=https:\/\/dashscope.aliyuncs.com\/compatible-mode\/v1\nspring.ai.dashscope.chat.options.model=qwen-plus<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">4.\u4e3b\u542f\u52a8<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa01HelloWorldApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa01HelloWorldApplication.class, args);\n    }\n\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u4e1a\u52a1\u7c7b<\/h3>\n\n\n\n<p>ApiKey\u4e0d\u53ef\u4ee5\u660e\u6587\u9700\u914d\u7f6e\u8fdb\u73af\u5883\u53d8\u91cf<\/p>\n\n\n\n<p>\u914d\u7f6e\u7c7bSaaLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyy\n * @create 2025-07-22 0:51\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/*\u65b9\u5f0f1\n\n    1.1\n    yml\u6587\u4ef6\u914d\u7f6e\uff1aspring.ai.dashscope.api-key=${aliQwen-api}\n\n    1.2\n    @Value(\"${spring.ai.dashscope.api-key}\")\n    private String apiKey;\u3001\n\n    1.3\n    @Bean\n    public DashScopeApi dashScopeApi()\n    {\n        return DashScopeApi.builder().apiKey(apiKey).build();\n    }\n    *\/\n\n    \/**\n     * \u65b9\u5f0f2\n     * yml\u6587\u4ef6\u914d\u7f6e\uff1aspring.ai.dashscope.api-key=${aliQwen-api}\n     * @return\n     *\/\n    @Bean\n    public DashScopeApi dashScopeApi()\n    {\n        return DashScopeApi.builder()\n                    .apiKey(System.getenv(\"aliQwen-api\"))\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u65b9\u5f0f1\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-22 0:51\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n\n    \/**\n     * \u65b9\u5f0f1:${}\n     * \u6301\u6709yml\u6587\u4ef6\u914d\u7f6e\uff1aspring.ai.dashscope.api-key=${aliQwen-api}\n     *\/\n    @Value(\"${spring.ai.dashscope.api-key}\")\n    private String apiKey;\n\n    @Bean\n    public DashScopeApi dashScopeApi()\n    {\n        return DashScopeApi.builder().apiKey(apiKey).build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u65b9\u5f0f2\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-22 0:51\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/**\n     * \u65b9\u5f0f2:System.getenv(\"\u73af\u5883\u53d8\u91cf\")\n     * \u6301\u6709yml\u6587\u4ef6\u914d\u7f6e\uff1aspring.ai.dashscope.api-key=${aliQwen-api}\n     * @return\n     *\/\n    @Bean\n    public DashScopeApi dashScopeApi()\n    {\n        return DashScopeApi.builder()\n                    .apiKey(System.getenv(\"aliQwen-api\"))\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u5bf9\u8bdd\u6a21\u578b(Chat Model)<\/h4>\n\n\n\n<p>ChatModel\uff0c\u6587\u672c\u804a\u5929\u4ea4\u4e92\u6a21\u578b<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-284.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1002\" height=\"53\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-284.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8669\"  sizes=\"(max-width: 1002px) 100vw, 1002px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-285.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"824\" height=\"355\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-285.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8670\"  sizes=\"(max-width: 824px) 100vw, 824px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-model\/?spm=5176.29160081.0.0.2856aa5ctpxysy\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-model\/?spm=5176.29160081.0.0.2856aa5ctpxysy<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2.controller<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-22 0:47\n *\/\n@RestController\npublic class ChatHelloController\n{\n    @Resource \/\/\u963f\u91cc\u4e91\u767e\u70bc\n    private ChatModel dashScopeChatModel;\n\n    \/**\n     * http:\/\/localhost:8001\/hello\/dochat\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/hello\/dochat\")\n    public String doChat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\") String msg)\n    {\n        String result = dashScopeChatModel.call(msg);\n        System.out.println(\"\u54cd\u5e94\uff1a\" + result);\n        return result;\n    }\n\n    \/**\n     *  http:\/\/localhost:8001\/hello\/streamchat\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/hello\/streamchat\")\n    public Flux&lt;String&gt; streamChat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\") String msg)\n    {\n        return dashScopeChatModel.stream(msg);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3.\u6d4b\u8bd5<\/h4>\n\n\n\n<p>http:\/\/localhost:8001\/hello\/dochat<\/p>\n\n\n\n<p><a href=\"http:\/\/localhost:8001\/hello\/streamchat\">http:\/\/localhost:8001\/hello\/streamchat<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4.\u5207\u6362\u5927\u6a21\u578b<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8001\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-01HelloWorld\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}\nspring.ai.dashscope.chat.options.model=deepseek-v3<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5.\u548cOpenAI\u534f\u8bae\u5bf9\u6bd4\u4e0b<\/h4>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-286-1024x727.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"727\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-286-1024x727.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8671\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3.Ollama\u79c1\u6709\u5316\u90e8\u7f72\u548c\u5bf9\u63a5\u672c\u5730\u5927\u6a21\u578b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.Ollama\u672c\u5730\u5927\u6a21\u578b\u90e8\u7f72<\/h3>\n\n\n\n<p>\u7565<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u5fae\u670d\u52a1\u5bf9\u63a5\u672c\u5730\u5927\u6a21\u578b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;com.atguigu.study&lt;\/groupId&gt;\n        &lt;artifactId&gt;SpringAIAlibaba-atguiguV1&lt;\/artifactId&gt;\n        &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;artifactId&gt;SAA-02Ollama&lt;\/artifactId&gt;\n\n\n    &lt;properties&gt;\n        &lt;maven.compiler.source&gt;21&lt;\/maven.compiler.source&gt;\n        &lt;maven.compiler.target&gt;21&lt;\/maven.compiler.target&gt;\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n    &lt;\/properties&gt;\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--spring-ai-alibaba dashscope--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-alibaba-starter-dashscope&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--ollama--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-starter-model-ollama&lt;\/artifactId&gt;\n            &lt;version&gt;1.0.0&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;!--lombok--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;!--hutool--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.8.22&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;3.11.0&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;compilerArgs&gt;\n                        &lt;arg&gt;-parameters&lt;\/arg&gt;\n                    &lt;\/compilerArgs&gt;\n                    &lt;source&gt;21&lt;\/source&gt;\n                    &lt;target&gt;21&lt;\/target&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-milestones&lt;\/id&gt;\n            &lt;name&gt;Spring Milestones&lt;\/name&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/milestone&lt;\/url&gt;\n            &lt;snapshots&gt;\n                &lt;enabled&gt;false&lt;\/enabled&gt;\n            &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8002\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-02Ollama\n\n# ====ollama Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}\nspring.ai.ollama.base-url=http:\/\/localhost:11434\nspring.ai.ollama.chat.\tmodel=qwen2.5:latest <\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\/**\n * @auther zzyy\n * @create 2025-07-22 18:50\n *\/\n@SpringBootApplication\npublic class Saa02OllamaApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa02OllamaApplication.class,args);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyy\n * @create 2025-07-22 18:56\n *\/\n@RestController\npublic class OllamaController\n{\n    @Resource(name = \"oll\tamaChatModel\")\n    private ChatModel chatModel;\n\n    \/**\n     * http:\/\/localhost:8002\/ollama\/chat?msg=\u4f60\u662f\u8c01\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/ollama\/chat\")\n    public String chat(@RequestParam(name = \"msg\") String msg)\n    {\n        String result = chatModel.call(msg);\n        System.out.println(\"---\u7ed3\u679c\uff1a\" + result);\n        return result;\n    }\n\n    @GetMapping(\"\/ollama\/streamchat\")\n    public Flux&lt;String&gt; streamchat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\") String msg)\n    {\n        return chatModel.stream(msg);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6216\u8005<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyy\n * @create 2025-07-22 18:56\n *\/\n@RestController\npublic class OllamaController\n{\n    \/*@Resource(name = \"ollamaChatModel\")\n    private ChatModel chatModel;*\/\n\n    \/\/\u65b9\u5f0f2\n    @Resource\n    @Qualifier(\"ollamaChatModel\")\n    private ChatModel chatModel;\n\n    \/**\n     * http:\/\/localhost:8002\/ollama\/chat?msg=\u4f60\u662f\u8c01\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/ollama\/chat\")\n    public String chat(@RequestParam(name = \"msg\") String msg)\n    {\n        String result = chatModel.call(msg);\n        System.out.println(\"---\u7ed3\u679c\uff1a\" + result);\n        return result;\n    }\n\n    @GetMapping(\"\/ollama\/streamchat\")\n    public Flux&lt;String&gt; streamchat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\") String msg)\n    {\n        return chatModel.stream(msg);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4.ChatClient VS ChatModel<\/h2>\n\n\n\n<p>1.\u95ee\u9898\u56de\u987e\uff1a<\/p>\n\n\n\n<p>\u4e4b\u524d\u7684\u8c03\u7528\u90fd\u662f\u4f7f\u7528ChatModel\u8fdb\u884c<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-287.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1002\" height=\"53\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-287.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8672\"  sizes=\"(max-width: 1002px) 100vw, 1002px\" \/><\/div><\/figure>\n\n\n\n<p>\u8ba4\u8bc6\u4e00\u4e2a\u65b0\u7684\u63a5\u53e3ChatClient<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-288.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"945\" height=\"430\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-288.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8673\"  sizes=\"(max-width: 945px) 100vw, 945px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-289.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"784\" height=\"644\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-289.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8674\"  sizes=\"(max-width: 784px) 100vw, 784px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">1.ChatModel<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b98\u7f51<\/h4>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-model\/?spm=5176.29160081.0.0.2856aa5cmUTyXC\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-model\/?spm=5176.29160081.0.0.2856aa5cmUTyXC<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-290.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"961\" height=\"472\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-290.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8675\"  sizes=\"(max-width: 961px) 100vw, 961px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u8bf4\u660e<\/h4>\n\n\n\n<p>\u5bf9\u8bdd\u6a21\u578b(ChatModel)\u662f\u5e95\u5c42\u63a5\u53e3\uff0c\u76f4\u63a5\u4e0e\u5177\u4f53\u5927\u8bed\u8a00\u6a21\u578b\u4ea4\u4e92\uff0c<br>\u63d0\u4f9bcall()\u548cstream()\u65b9\u6cd5\uff0c<strong>\u9002\u5408\u7b80\u5355\u5927\u6a21\u578b\u4ea4\u4e92\u573a\u666f<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.ChatClient<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b98\u7f51<\/h4>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-client\/?spm=5176.29160081.0.0.2856aa5cmUTyXC\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-client\/?spm=5176.29160081.0.0.2856aa5cmUTyXC<\/a><\/p>\n\n\n\n<p>\u4f55\u4e3a\u6837\u677f\u4ee3\u7801\uff1f<br>ChatClient\u5bf9ChatModel\u5410\u69fd<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-291.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1008\" height=\"678\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-291.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8676\"  sizes=\"(max-width: 1008px) 100vw, 1008px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u8bf4\u660e<\/h4>\n\n\n\n<p>ChatClient\u662f\u9ad8\u7ea7\u5c01\u88c5\uff0c\u57fa\u4e8eChatModel\u6784\u5efa\uff0c\u9002\u5408\u5feb\u901f\u6784\u5efa\u6807\u51c6\u5316\u590d\u6742AI\u670d\u52a1\uff0c\u652f\u6301\u540c\u6b65\u548c\u6d41\u5f0f\u4ea4\u4e92\uff0c\u96c6\u6210\u591a\u79cd\u9ad8\u7ea7\u529f\u80fd\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u7f16\u7801\u6848\u4f8b<\/h4>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;com.atguigu.study&lt;\/groupId&gt;\n        &lt;artifactId&gt;SpringAIAlibaba-atguiguV1&lt;\/artifactId&gt;\n        &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;artifactId&gt;SAA-03ChatModelChatClient&lt;\/artifactId&gt;\n\n\n    &lt;properties&gt;\n        &lt;maven.compiler.source&gt;21&lt;\/maven.compiler.source&gt;\n        &lt;maven.compiler.target&gt;21&lt;\/maven.compiler.target&gt;\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n    &lt;\/properties&gt;\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--spring-ai-alibaba dashscope--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-alibaba-starter-dashscope&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--lombok--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;!--hutool--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.8.22&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;3.11.0&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;compilerArgs&gt;\n                        &lt;arg&gt;-parameters&lt;\/arg&gt;\n                    &lt;\/compilerArgs&gt;\n                    &lt;source&gt;21&lt;\/source&gt;\n                    &lt;target&gt;21&lt;\/target&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-milestones&lt;\/id&gt;\n            &lt;name&gt;Spring Milestones&lt;\/name&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/milestone&lt;\/url&gt;\n            &lt;snapshots&gt;\n                &lt;enabled&gt;false&lt;\/enabled&gt;\n            &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8003\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-03ChatModelChatClient\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n@SpringBootApplication\npublic class Saa03ChatModelChatClientApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa03ChatModelChatClientApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b\u7b2c1\u7248<\/h5>\n\n\n\n<p>Only ChatModel<\/p>\n\n\n\n<p>\u65b0\u5efa\u914d\u7f6e\u7c7b SaaLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyy\n * @create 2025-07-22 0:51\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    @Bean\n    public DashScopeApi dashScopeApi()\n    {\n        return DashScopeApi.builder().apiKey(System.getenv(\"aliQwen-api\")).build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n\/**\n * @auther zzyy\n * @create 2025-07-23 18:20\n *\/\n@RestController\npublic class ChatModelController\n{\n    @Resource \/\/\u963f\u91cc\u4e91\u767e\u70bc\n    private ChatModel dashScopeChatModel;\n\n    @GetMapping(\"\/chatmodel\/dochat\")\n    public String doChat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\") String msg)\n    {\n        String result = dashScopeChatModel.call(msg);\n        System.out.println(\"\u54cd\u5e94\uff1a\" + result);\n        return result;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u8fdb\u4e00\u6b65\u65b0\u589eChatClient<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-292.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"590\" height=\"201\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-292.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8679\"  sizes=\"(max-width: 590px) 100vw, 590px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-293-1024x277.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"277\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-293-1024x277.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8680\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-294.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"565\" height=\"40\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-294.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8681\"  sizes=\"(max-width: 565px) 100vw, 565px\" \/><\/div><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b\u7b2c2\u7248<\/h5>\n\n\n\n<p>\u77e5\u8bc6\u51fa\u5904<\/p>\n\n\n\n<p>chat\u6e90\u7801\uff1a<a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/spring-ai-sourcecode-explained\/chapter-1-chat-first-experience\/?spm=5176.29160081.0.0.2856aa5cbeDVer\">https:\/\/java2ai.com\/docs\/1.0.0.2\/spring-ai-sourcecode-explained\/chapter-1-chat-first-experience\/?spm=5176.29160081.0.0.2856aa5cbeDVer<\/a><\/p>\n\n\n\n<p>ChatClient\u4f7f\u7528\uff1a<a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-client\/?spm=5176.29160081.0.0.2856aa5cmUTyXC#%E5%88%9B%E5%BB%BA-chatclient\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-client\/?spm=5176.29160081.0.0.2856aa5cmUTyXC#%E5%88%9B%E5%BB%BA-chatclient<\/a><\/p>\n\n\n\n<p>Only ChatClient<\/p>\n\n\n\n<p>\u65b0\u5efaChatClientController<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-23 19:22\n * \u77e5\u8bc6\u51fa\u5904\uff1a\n * https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-client\/?spm=5176.29160081.0.0.2856aa5cmUTyXC#%E5%88%9B%E5%BB%BA-chatclient\n *\/\n@RestController\npublic class ChatClientController\n{\n    private final ChatClient dashScopechatClient;\n\n    \/**\n     * \u4f7f\u7528\u81ea\u52a8\u914d\u7f6e\u7684 ChatClient.Builder\n     * @param dashscopeChatModel\n     *\/\n    public ChatClientController(ChatModel dashscopeChatModel)\n    {\n        this.dashScopechatClient = ChatClient.builder(dashscopeChatModel).build();\n    }\n\n    \/**\n     * http:\/\/localhost:8003\/chatclient\/dochat\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/chatclient\/dochat\")\n    public String doChat(@RequestParam(name = \"msg\",defaultValue = \"2\u52a04\u7b49\u4e8e\u51e0\") String msg)\n    {\n        String result = dashScopechatClient.prompt().user(msg).call().content();\n        System.out.println(\"\u54cd\u5e94\uff1a\" + result);\n        return result;\n    }\n}<\/code><\/pre>\n\n\n\n<p>ChatModel\u5bf9ChatClient\u5410\u69fd\uff1a\u79bb\u5f00\u6211\u4f60\u4ec0\u4e48\u90fd\u4e0d\u662f\uff0cChatModel\u662fChatClient\u7684\u5e95\u5c42<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b\u7b2c3\u7248<\/h5>\n\n\n\n<p>ChatModel + ChatClient\u6df7\u5408\u4f7f\u7528<\/p>\n\n\n\n<p>\u4fee\u6539\u914d\u7f6e\u7c7bSaaLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyy\n * @create 2025-07-22 0:51\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    @Bean\n    public DashScopeApi dashScopeApi()\n    {\n        return DashScopeApi.builder()\n                    .apiKey(System.getenv(\"aliQwen-api\"))\n                .build();\n    }\n\n    \/**\n     * \u77e5\u8bc6\u51fa\u5904\uff1a\n     * https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/chat-client\/?spm=5176.29160081.0.0.2856aa5cmUTyXC#%E5%88%9B%E5%BB%BA-chatclient\n     * @param dashscopeChatModel\n     * @return\n     *\/\n    @Bean\n    public ChatClient chatClient(ChatModel dashscopeChatModel)\n    {\n        return ChatClient.builder(dashscopeChatModel).build();\n    }\n}\n \n<\/code><\/pre>\n\n\n\n<p>\u65b0\u5efaChatClientControllerV2<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n\/**\n * @auther zzyy\n * @create 2025-07-23 19:31\n *\/\n@RestController\npublic class ChatClientControllerV2\n{\n    \/**\n     * chatModel + ChatClient \u6df7\u5408\u4f7f\u7528\n     *\/\n    @Resource\n    private ChatModel chatModel;\n\n    @Resource\n    private ChatClient dashScopechatClientv2;\n\n    \/**\n     * http:\/\/localhost:8003\/chatclientv2\/dochat\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/chatclientv2\/dochat\")\n    public String doChat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\") String msg)\n    {\n        String result = dashScopechatClientv2.prompt().user(msg).call().content();\n        System.out.println(\"ChatClient\u54cd\u5e94\uff1a\" + result);\n        return result;\n    }\n\n    \/**\n     * http:\/\/localhost:8003\/chatmodelv2\/dochat\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/chatmodelv2\/dochat\")\n    public String doChat2(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\") String msg)\n    {\n        String result = chatModel.call(msg);\n        System.out.println(\"ChatModel\u54cd\u5e94\uff1a\" + result);\n        return result;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5c0f\u603b\u7ed3<\/p>\n\n\n\n<p>\u751f\u4ea7\u63a8\u8350\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-295.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"362\" height=\"111\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-295.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8682\"  sizes=\"(max-width: 362px) 100vw, 362px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">5.Server-SentEvents(SSE)\u5b9e\u73b0Stream\u6d41\u5f0f\u8f93\u51fa\u53ca\u591a\u6a21\u578b\u5171\u5b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.Response Streaming\u6d41\u5f0f\u8f93\u51fa<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6d41\u5f0f\u8f93\u51fa(StreamingOutput)<\/h4>\n\n\n\n<p>\u662f\u4e00\u79cd<strong>\u9010\u6b65\u8fd4\u56de\u5927\u6a21\u578b\u751f\u6210\u7ed3\u679c<\/strong>\u7684\u6280\u672f\uff0c\u751f\u6210\u4e00\u70b9\u8fd4\u56de\u4e00\u70b9\uff0c\u5141\u8bb8\u670d\u52a1\u5668\u5c06\u54cd\u5e94\u5185\u5bb9<br><strong>\u5206\u6279\u6b21\u5b9e\u65f6\u4f20\u8f93\u7ed9\u5ba2\u6237\u7aef<\/strong>\uff0c\u800c\u4e0d\u662f\u7b49\u5f85\u5168\u90e8\u5185\u5bb9\u751f\u6210\u5b8c\u6bd5\u540e\u518d\u4e00\u6b21\u6027\u8fd4\u56de\u3002<\/p>\n\n\n\n<p>\u8fd9\u79cd\u673a\u5236\u80fd\u663e\u8457\u63d0\u5347\u7528\u6237\u4f53\u9a8c\uff0c<strong>\u5c24\u5176\u9002\u7528\u4e8e\u5927\u6a21\u578b\u54cd\u5e94\u8f83\u6162\u7684\u573a\u666f<\/strong>\uff08\u5982\u751f\u6210\u957f\u6587\u672c\u6216\u590d\u6742\u63a8\u7406\u7ed3\u679c\uff09\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">SpringAI Alibaba\u6d41\u5f0f\u8f93\u51fa\u6709\u4e24\u79cd<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7ChatModel\u5b9e\u73b0stream\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa<\/li>\n\n\n\n<li>\u901a\u8fc7ChatClient\u5b9e\u73b0stream\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.SSE(Server-Sent Events)\u670d\u52a1\u5668\u53d1\u9001\u4e8b\u4ef6<\/h3>\n\n\n\n<p>Server-Sent\uff1a\u7531\u670d\u52a1\u5668\u53d1\u9001\u3002<\/p>\n\n\n\n<p>Events\uff1a\u4e8b\u4ef6\uff0c\u6307\u670d\u52a1\u5668\u4e3b\u52a8\u63a8\u9001\u7ed9\u5ba2\u6237\u7aef\u7684\u6570\u636e\u6216\u6d88\u606f<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Server-SentEvents(SSE)\u670d\u52a1\u5668\u53d1\u9001\u4e8b\u4ef6\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa<\/h4>\n\n\n\n<p>Server-Sent Events (SSE) \u662f\u4e00\u79cd\u5141\u8bb8<strong>\u670d\u52a1\u7aef\u53ef\u4ee5\u6301\u7eed\u63a8\u9001\u6570\u636e\u7247\u6bb5\uff08\u5982\u9010\u8bcd\u6216\u9010\u53e5\uff09\u5230\u524d\u7aef<\/strong>\u7684 Web \u6280\u672f\u3002<strong>\u901a\u8fc7\u5355\u5411\u7684HTTP\u957f\u8fde\u63a5<\/strong>\uff0c\u4f7f\u7528\u4e00\u4e2a\u957f\u671f\u5b58\u5728\u7684\u8fde\u63a5\uff0c\u8ba9\u670d\u52a1\u5668\u53ef\u4ee5\u4e3b\u52a8\u5c06\u6570\u636e&#8221;\u63a8&#8221;\u7ed9\u5ba2\u6237\u7aef\uff0cSSE\u662f\u8f7b\u91cf\u7ea7\u7684\u5355\u5411\u901a\u4fe1\u534f\u8bae\uff0c\u9002\u5408AI\u5bf9\u8bdd\u8fd9\u7c7b\u670d\u52a1\u7aef\u4e3b\u5bfc\u7684\u573a\u666f<\/p>\n\n\n\n<p>\u6838\u5fc3\u6982\u5ff5<br>SSE \u7684\u6838\u5fc3\u601d\u60f3\u662f\uff1a\u5ba2\u6237\u7aef\u53d1\u8d77\u4e00\u4e2a\u8bf7\u6c42\uff0c\u670d\u52a1\u5668\u4fdd\u6301\u8fd9\u4e2a\u8fde\u63a5\u6253\u5f00\u5e76\u5728\u6709\u65b0\u6570\u636e\u65f6\uff0c\u901a\u8fc7\u8fd9\u4e2a\u8fde\u63a5\u5c06\u6570\u636e\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002\u8fd9\u4e0e\u4f20\u7edf\u7684\u8bf7\u6c42-\u54cd\u5e94\u6a21\u5f0f\uff08\u5ba2\u6237\u7aef\u8bf7\u6c42\u4e00\u6b21\uff0c\u670d\u52a1\u5668\u54cd\u5e94\u4e00\u6b21\uff0c\u8fde\u63a5\u5173\u95ed\uff09\u6709\u672c\u8d28\u533a\u522b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-296.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"641\" height=\"412\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-296.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8685\"  sizes=\"(max-width: 641px) 100vw, 641px\" \/><\/div><\/figure>\n\n\n\n<p>\u603b\u7ed3\u6765\u8bf4\uff1aSSE\u5c31\u662f\u4e00\u79cd\u8ba9\u670d\u52a1\u5668\u80fd\u591f\u4e3b\u52a8\u3001\u6301\u7eed\u5730\u5411\u5ba2\u6237\u7aef\uff08\u6bd4\u5982\u4f60\u7684\u7f51\u9875\u6d4f\u89c8\u5668\uff09\u63a8\u9001\u6570\u636e\u7684\u6280\u672f<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">SSE\u9002\u7528\u573a\u666f<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-297.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"762\" height=\"274\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-297.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8686\"  sizes=\"(max-width: 762px) 100vw, 762px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<p>\u76ee\u6807\uff1a\u8981\u6c42\u540c\u65f6\u5b58\u5728\u591a\u79cd\u5927\u6a21\u578b\u4ea7\u54c1\u5728\u7cfb\u7edf\u91cc\u5171\u5b58\u4f7f\u7528<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;com.atguigu.study&lt;\/groupId&gt;\n        &lt;artifactId&gt;SpringAIAlibaba-atguiguV1&lt;\/artifactId&gt;\n        &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;artifactId&gt;SAA-04StreamingOutput&lt;\/artifactId&gt;\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--spring-ai-alibaba dashscope--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-alibaba-starter-dashscope&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--lombok--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;version&gt;1.18.38&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;!--hutool--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.8.22&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;3.11.0&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;compilerArgs&gt;\n                        &lt;arg&gt;-parameters&lt;\/arg&gt;\n                    &lt;\/compilerArgs&gt;\n                    &lt;source&gt;21&lt;\/source&gt;\n                    &lt;target&gt;21&lt;\/target&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-milestones&lt;\/id&gt;\n            &lt;name&gt;Spring Milestones&lt;\/name&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/milestone&lt;\/url&gt;\n            &lt;snapshots&gt;\n                &lt;enabled&gt;false&lt;\/enabled&gt;\n            &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8004\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-04StreamingOutput\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${a\tliQwen-api} <\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e3b\u542f\u52a8<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description \u6d41\u5f0f\u8f93\u51fa\n *\/\n@SpringBootApplication\npublic class Saa04StreamingOutputApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa04StreamingOutputApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7ChatModel\u5b9e\u73b0stream\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa<\/li>\n<\/ul>\n\n\n\n<p>1.\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description ChatModel+ChatClient+\u591a\u6a21\u578b\u5171\u5b58\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/\/ \u6a21\u578b\u540d\u79f0\u5e38\u91cf\u5b9a\u4e49\n    private final String DEEPSEEK_MODEL = \"deepseek-v3\";\n    private final String QWEN_MODEL = \"qwen-plus\";\n\n    @Bean(name = \"deepseek\")\n    public ChatModel deepSeek()\n    {\n        return DashScopeChatModel.builder()\n                        .dashScopeApi(DashScopeApi.builder()\n                                    .apiKey(System.getenv(\"aliQwen-api\"))\n                                .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder().withModel(DEEPSEEK_MODEL).build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"qwen\")\n    public ChatModel qwen()\n    {\n        return DashScopeChatModel.builder().dashScopeApi(DashScopeApi.builder()\n                        .apiKey(System.getenv(\"aliQwen-api\"))\n                        .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder()\n                                .withModel(QWEN_MODEL)\n                                .build()\n                )\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>2.controller\u7b2c1\u7248<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description \u6d41\u5f0f\u8f93\u51fa\n *\/\n@RestController\npublic class StreamOutputController\n{\n    \/\/V1 \u901a\u8fc7ChatModel\u5b9e\u73b0stream\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n\n    @GetMapping(value = \"\/stream\/chatflux1\")\n    public Flux&lt;String&gt; chatflux(@RequestParam(name = \"question\",defaultValue = \"\u4f60\u662f\u8c01\") String question)\n    {\n        return deepseekChatModel.stream(question);\n    }\n\n    @GetMapping(value = \"\/stream\/chatflux2\")\n    public Flux&lt;String&gt; chatflux2(@RequestParam(name = \"question\",defaultValue = \"\u4f60\u662f\u8c01\") String question)\n    {\n        return qwenChatModel.stream(question);\n    }\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7ChatClient\u5b9e\u73b0stream\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa<\/li>\n<\/ul>\n\n\n\n<p>1.\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description ChatModel+ChatClient+\u591a\u6a21\u578b\u5171\u5b58\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/\/ \u6a21\u578b\u540d\u79f0\u5e38\u91cf\u5b9a\u4e49\n    private final String DEEPSEEK_MODEL = \"deepseek-v3\";\n    private final String QWEN_MODEL = \"qwen-plus\";\n\n    @Bean(name = \"deepseek\")\n    public ChatModel deepSeek()\n    {\n        return DashScopeChatModel.builder()\n                        .dashScopeApi(DashScopeApi.builder()\n                                    .apiKey(System.getenv(\"aliQwen-api\"))\n                                .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder().withModel(DEEPSEEK_MODEL).build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"qwen\")\n    public ChatModel qwen()\n    {\n        return DashScopeChatModel.builder().dashScopeApi(DashScopeApi.builder()\n                        .apiKey(System.getenv(\"aliQwen-api\"))\n                        .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder()\n                                .withModel(QWEN_MODEL)\n                                .build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"deepseekChatClient\")\n    public ChatClient deepseekChatClient(@Qualifier(\"deepseek\") ChatModel deepSeek)\n    {\n        return ChatClient.builder(deepSeek)\n                .defaultOptions(ChatOptions.builder()\n                        .model(DEEPSEEK_MODEL)\n                        .build())\n                .build();\n    }\n\n\n    @Bean(name = \"qwenChatClient\")\n    public ChatClient qwenChatClient(@Qualifier(\"qwen\") ChatModel qwen)\n    {\n        return ChatClient.builder(qwen)\n                .defaultOptions(ChatOptions.builder()\n                        .model(QWEN_MODEL)\n                        .build())\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>2.controller\u7b2c2\u7248<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description \u6d41\u5f0f\u8f93\u51fa\n *\/\n@RestController\npublic class StreamOutputController\n{\n    \/\/V1 \u901a\u8fc7ChatModel\u5b9e\u73b0stream\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    \/\/V2 \u901a\u8fc7ChatClient\u5b9e\u73b0stream\u5b9e\u73b0\u6d41\u5f0f\u8f93\u51fa\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    @GetMapping(value = \"\/stream\/chatflux1\")\n    public Flux&lt;String&gt; chatflux(@RequestParam(name = \"question\",defaultValue = \"\u4f60\u662f\u8c01\") String question)\n    {\n        return deepseekChatModel.stream(question);\n    }\n\n    @GetMapping(value = \"\/stream\/chatflux2\")\n    public Flux&lt;String&gt; chatflux2(@RequestParam(name = \"question\",defaultValue = \"\u4f60\u662f\u8c01\") String question)\n    {\n        return qwenChatModel.stream(question);\n    }\n\n    @GetMapping(value = \"\/stream\/chatflux3\")\n    public Flux&lt;String&gt; chatflux3(@RequestParam(name = \"question\",defaultValue = \"\u4f60\u662f\u8c01\") String question)\n    {\n        return deepseekChatClient.prompt(question).stream().content();\n    }\n\n    @GetMapping(value = \"\/stream\/chatflux4\")\n    public Flux&lt;String&gt; chatflux4(@RequestParam(name = \"question\",defaultValue = \"\u4f60\u662f\u8c01\") String question)\n    {\n        return qwenChatClient.prompt(question).stream().content();\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u65b0\u589e\u524d\u7aef\u4ee3\u7801<\/h4>\n\n\n\n<p>\u6548\u679c\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-298-1024x300.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"300\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-298-1024x300.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8687\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>SSE<\/p>\n\n\n\n<p>index.html<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;SSE\u6d41\u5f0fchat&lt;\/title&gt;\n    &lt;style&gt;\n        body {\n            font-family: Arial, sans-serif;\n            background-color: #f4f4f4;\n            margin: 0;\n            padding: 20px;\n        }\n\n        #messageInput {\n            width: 90%;\n            padding: 10px;\n            font-size: 16px;\n            border: 1px solid #ccc;\n            border-radius: 4px;\n            margin-bottom: 10px;\n        }\n\n        button {\n            padding: 10px 20px;\n            font-size: 16px;\n            background-color: #007bff;\n            color: white;\n            border: none;\n            border-radius: 4px;\n            cursor: pointer;\n        }\n\n        button:hover {\n            background-color: #0056b3;\n        }\n\n        #messages {\n            margin-top: 20px;\n            padding: 15px;\n            background-color: #f9f9f9;\n            border: 1px solid #ddd;\n            border-radius: 8px;\n            max-height: 300px;\n            overflow-y: auto;\n            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n        }\n\n        #messages div {\n            padding: 8px 0;\n            border-bottom: 1px solid #eee;\n            font-size: 14px;\n            color: #333;\n        }\n\n        #messages div:last-child {\n            border-bottom: none;\n        }\n    &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;textarea id=\"messageInput\" rows=\"4\" cols=\"50\" placeholder=\"\u8bf7\u8f93\u5165\u4f60\u7684\u95ee\u9898...\"&gt;&lt;\/textarea&gt;&lt;br&gt;\n&lt;button onclick=\"sendMsg()\"&gt;\u53d1\u9001\u63d0\u95ee&lt;\/button&gt;\n&lt;div id=\"messages\"&gt;&lt;\/div&gt;\n&lt;script&gt;\n    function sendMsg() {\n        \/\/ \u83b7\u53d6\u7528\u6237\u8f93\u5165\u7684\u6d88\u606f\n        const message = document.getElementById('messageInput').value;\n        if (message == \"\") return false;\n\n        \/\/1 \u5ba2\u6237\u7aef\u4f7f\u7528 JavaScript \u7684 EventSource \u5bf9\u8c61\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u7684\u4e00\u4e2a\u7279\u5b9a\u7aef\u70b9\uff08URL\uff09\n        const eventSource = new EventSource('stream\/chatflux2?question=' + message);\n        \/\/2 \u76d1\u542c\u6d88\u606f\u4e8b\u4ef6\n        eventSource.onmessage = function (event) {\n            \/\/ \u83b7\u53d6\u6d41\u5f0f\u8fd4\u56de\u7684\u6570\u636e\n            const data = event.data;\n            \/\/ \u5c06\u63a5\u6536\u5230\u7684\u6570\u636e\u5c55\u793a\u5230\u9875\u9762\u4e0a\n            const messagesDiv = document.getElementById('messages');\n            messagesDiv.innerHTML += event.data;\n        };\n\n        \/\/3 \u76d1\u542c\u9519\u8bef\u4e8b\u4ef6\n        eventSource.onerror = function (error) {\n            console.error('EventSource \u53d1\u751f\u9519\u8bef\uff1a', error);\n            eventSource.close(); \/\/ \u5173\u95ed\u8fde\u63a5\n        };\n    }\n&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\uff1a<a href=\"http:\/\/localhost:8004\/index.html\">http:\/\/localhost:8004\/index.html<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6.\u63d0\u793a\u8bcdPrompt<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.DeepSeek\u63d0\u793a\u8bcd\u6837\u4f8b<\/h3>\n\n\n\n<p><a href=\"https:\/\/api-docs.deepseek.com\/zh-cn\/prompt-library\">https:\/\/api-docs.deepseek.com\/zh-cn\/prompt-library<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-299-1024x620.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"620\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-299-1024x620.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8688\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<p>\u5b98\u7f51<\/p>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=5176.29160081.0.0.2856aa5cdeol7a\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=5176.29160081.0.0.2856aa5cdeol7a<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-300.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"846\" height=\"359\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-300.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8689\"  sizes=\"(max-width: 846px) 100vw, 846px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u5148\u4ece\u6700\u7b80\u5355\u7684API\u8c03\u7528\u8bf4\u8d77<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-301.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"638\" height=\"83\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-301.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8690\"  sizes=\"(max-width: 638px) 100vw, 638px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-302.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"868\" height=\"121\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-302.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8691\"  sizes=\"(max-width: 868px) 100vw, 868px\" \/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u8fd1\u4f3c\u7684\u7406\u89e3<br>Prompt &gt; Message &gt; String\u7b80\u5355\u7684\u5b57\u7b26\u4e32<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-303.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"765\" height=\"522\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-303.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8692\"  sizes=\"(max-width: 765px) 100vw, 765px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u518d\u4ece\u6e90\u7801Prompt\u8bf4\u8d77<\/h4>\n\n\n\n<p>1.String<\/p>\n\n\n\n<p>\u6700\u521d\u7684Prompt\u53ea\u662f\u7b80\u5355\u7684\u6587\u672c\u5b57\u7b26\u4e32\u63d0\u95ee<\/p>\n\n\n\n<p>2.Message<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-304.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"994\" height=\"488\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-304.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8693\"  sizes=\"(max-width: 994px) 100vw, 994px\" \/><\/div><\/figure>\n\n\n\n<p>enum MessageType<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-305-1024x540.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"540\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-305-1024x540.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8694\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e0a\u8ff0\u4e5f\u79f0\u4e3a<\/p>\n\n\n\n<p>Prompt \u4e2d\u7684\u56db\u5927\u89d2\u8272\uff08Role\uff09<\/p>\n\n\n\n<p>3.Prompt<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-306-1024x568.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"568\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-306-1024x568.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8695\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-307.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"868\" height=\"121\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-307.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8696\"  sizes=\"(max-width: 868px) 100vw, 868px\" \/><\/div><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u8fd1\u4f3c\u7684\u7406\u89e3<br>Prompt &gt; Message &gt; String \u7b80\u5355\u7684\u6587\u672c\u5b57\u7b26\u4e32\u63d0\u95ee<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.Prompt\u4e2d\u7684\u56db\u5927\u89d2\u8272\uff08Role\uff09<\/h3>\n\n\n\n<p>\u603b\u4f53\u6982\u8ff0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-308.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"781\" height=\"633\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-308.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8699\"  sizes=\"(max-width: 781px) 100vw, 781px\" \/><\/div><\/figure>\n\n\n\n<p>\u6e90\u7801\u8bf4\u660e<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-309-1024x381.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"381\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-309-1024x381.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8700\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>4\u5927\u89d2\u8272\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">system<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-310.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"60\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-310.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8701\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u8bbe\u5b9aAI\u884c\u4e3a\u8fb9\u754c\/\u89d2\u8272\/\u5b9a\u4f4d\u3002\u6307\u5bfcAI\u7684\u884c\u4e3a\u548c\u54cd\u5e94\u65b9\u5f0f\uff0c\u8bbe\u7f6eAI\u5982\u4f55\u89e3\u91ca\u548c\u56de\u590d\u8f93\u5165\u7684<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">user<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-311.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"889\" height=\"57\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-311.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8702\"  sizes=\"(max-width: 889px) 100vw, 889px\" \/><\/div><\/figure>\n\n\n\n<p>\u7528\u6237\u539f\u59cb\u63d0\u95ee\u8f93\u5165\u3002\u4ee3\u8868\u7528\u6237\u7684\u8f93\u5165\u4ed6\u4eec\u5411AI\u63d0\u51fa\u7684\u95ee\u9898\u3001\u547d\u4ee4\u6216\u9648\u8ff0\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">assistant<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-312.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"857\" height=\"98\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-312.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8703\"  sizes=\"(max-width: 857px) 100vw, 857px\" \/><\/div><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AI\u8fd4\u56de\u7684\u54cd\u5e94\u4fe1\u606f\uff0c\u5b9a\u4e49\u4e3a\u201d\u52a9\u624b\u89d2\u8272\u201d\u6d88\u606f\u3002\u7528\u5b83\u53ef\u4ee5\u786e\u4fdd\u4e0a\u4e0b\u6587\u80fd\u591f\u8fde\u8d2f\u7684\u4ea4\u4e92\u3002<\/li>\n\n\n\n<li>\u8bb0\u5fc6\u5bf9\u8bdd\uff0c\u79ef\u7d2f\u56de\u7b54<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-313.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"963\" height=\"476\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-313.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8704\"  sizes=\"(max-width: 963px) 100vw, 963px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">tool<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-314.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"737\" height=\"82\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-314.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8705\"  sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/div><\/figure>\n\n\n\n<p>\u6865\u63a5\u5916\u90e8\u670d\u52a1\uff0c\u53ef\u4ee5\u8fdb\u884c\u51fd\u6570\u8c03\u7528\u5982\uff0c\u652f\u4ed8\/\u6570\u636e\u67e5\u8be2\u7b49\u64cd\u4f5c\uff0c\u7c7b\u4f3c\u8c03\u7528\u7b2c3\u65b9util\u5de5\u5177\u7c7b\uff0c\u540e\u9762\u7ae0\u8282\u8be6\u7ec6\u4ecb\u7ecd<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u603b\u7ed3<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-315.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"778\" height=\"365\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-315.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8706\"  sizes=\"(max-width: 778px) 100vw, 778px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;com.zzyy.stduy&lt;\/groupId&gt;\n        &lt;artifactId&gt;SpringAI-zyfanV1&lt;\/artifactId&gt;\n        &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;artifactId&gt;springAI-05chat-Prompt&lt;\/artifactId&gt;\n\n\n    &lt;properties&gt;\n        &lt;maven.compiler.source&gt;17&lt;\/maven.compiler.source&gt;\n        &lt;maven.compiler.target&gt;17&lt;\/maven.compiler.target&gt;\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n    &lt;\/properties&gt;\n\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--spring-ai-openai--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-starter-model-openai&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--hutool--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.8.22&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;!--lombok--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;version&gt;1.18.34&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;3.11.0&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;compilerArgs&gt;\n                        &lt;arg&gt;-parameters&lt;\/arg&gt;\n                    &lt;\/compilerArgs&gt;\n                    &lt;source&gt;17&lt;\/source&gt;\n                    &lt;target&gt;17&lt;\/target&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8005\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-05Prompt\n\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3.\u4e3b\u542f\u52a8<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 20:56\n * @Description \u77e5\u8bc6\u51fa\u5904\uff0chttps:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=5176.29160081.0.0.2856aa5cdeol7a\n *\/\n@SpringBootApplication\npublic class Saa05PromptApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa05PromptApplication.class,args);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">4.\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<p>\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description ChatModel+ChatClient+\u591a\u6a21\u578b\u5171\u5b58\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/\/ \u6a21\u578b\u540d\u79f0\u5e38\u91cf\u5b9a\u4e49\n    private final String DEEPSEEK_MODEL = \"deepseek-v3\";\n    private final String QWEN_MODEL = \"qwen-plus\";\n\n    @Bean(name = \"deepseek\")\n    public ChatModel deepSeek()\n    {\n        return DashScopeChatModel.builder()\n                        .dashScopeApi(DashScopeApi.builder()\n                                    .apiKey(System.getenv(\"aliQwen-api\"))\n                                .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder().withModel(DEEPSEEK_MODEL).build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"qwen\")\n    public ChatModel qwen()\n    {\n        return DashScopeChatModel.builder().dashScopeApi(DashScopeApi.builder()\n                        .apiKey(System.getenv(\"aliQwen-api\"))\n                        .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder()\n                                .withModel(QWEN_MODEL)\n                                .build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"deepseekChatClient\")\n    public ChatClient deepseekChatClient(@Qualifier(\"deepseek\") ChatModel deepSeek)\n    {\n        return ChatClient.builder(deepSeek)\n                .defaultOptions(ChatOptions.builder()\n                        .model(DEEPSEEK_MODEL)\n                        .build())\n                .build();\n    }\n\n\n    @Bean(name = \"qwenChatClient\")\n    public ChatClient qwenChatClient(@Qualifier(\"qwen\") ChatModel qwen)\n    {\n        return ChatClient.builder(qwen)\n                .defaultOptions(ChatOptions.builder()\n                        .model(QWEN_MODEL)\n                        .build())\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller\u7b2c1\u7248<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.model.ChatResponse;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 21:25\n * @Description \u77e5\u8bc6\u51fa\u5904\uff0chttps:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=5176.29160081.0.0.2856aa5cdeol7a\n *\/\n@RestController\npublic class PromptController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    \/\/ http:\/\/localhost:8005\/prompt\/chat?question=\u706b\u9505\u4ecb\u7ecd\u4e0b\n    @GetMapping(\"\/prompt\/chat\")\n    public Flux&lt;String&gt; chat(String question)\n    {\n        return deepseekChatClient.prompt()\n                \/\/ AI \u80fd\u529b\u8fb9\u754c\n                              .system(\"\u4f60\u662f\u4e00\u4e2a\u6cd5\u5f8b\u52a9\u624b\uff0c\u53ea\u56de\u7b54\u6cd5\u5f8b\u95ee\u9898\uff0c\u5176\u5b83\u95ee\u9898\u56de\u590d\uff0c\u6211\u53ea\u80fd\u56de\u7b54\u6cd5\u5f8b\u76f8\u5173\u95ee\u9898\uff0c\u5176\u5b83\u65e0\u53ef\u5949\u544a\")\n                .user(question)\n                .stream()\n                .content();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u901a\u8fc7ChatClient\u5b9e\u73b0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-316.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"335\" height=\"53\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-316.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8707\"  sizes=\"(max-width: 335px) 100vw, 335px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-317.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"280\" height=\"50\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-317.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8708\"\/><\/div><\/figure>\n\n\n\n<p>\u6d4b\u8bd5<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-318.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"672\" height=\"208\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-318.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8709\"  sizes=\"(max-width: 672px) 100vw, 672px\" \/><\/div><\/figure>\n\n\n\n<p>controller\u7b2c2\u7248<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.model.ChatResponse;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 21:25\n * @Description \u77e5\u8bc6\u51fa\u5904\uff0chttps:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=5176.29160081.0.0.2856aa5cdeol7a\n *\/\n@RestController\npublic class PromptController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    \/\/ http:\/\/localhost:8005\/prompt\/chat?question=\u706b\u9505\u4ecb\u7ecd\u4e0b\n    @GetMapping(\"\/prompt\/chat\")\n    public Flux&lt;String&gt; chat(String question)\n    {\n        return deepseekChatClient.prompt()\n                \/\/ AI \u80fd\u529b\u8fb9\u754c\n                .system(\"\u4f60\u662f\u4e00\u4e2a\u6cd5\u5f8b\u52a9\u624b\uff0c\u53ea\u56de\u7b54\u6cd5\u5f8b\u95ee\u9898\uff0c\u5176\u5b83\u95ee\u9898\u56de\u590d\uff0c\u6211\u53ea\u80fd\u56de\u7b54\u6cd5\u5f8b\u76f8\u5173\u95ee\u9898\uff0c\u5176\u5b83\u65e0\u53ef\u5949\u544a\")\n                .user(question)\n                .stream()\n                .content();\n    }\n\n\n    @GetMapping(\"\/prompt\/chat2\")\n    public Flux&lt;ChatResponse&gt; chat2(String question)\n    {\n        \/\/ \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n        \/\/ \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2a\u8bb2\u6545\u4e8b\u7684\u52a9\u624b,\u6bcf\u4e2a\u6545\u4e8b\u63a7\u5236\u5728300\u5b57\u4ee5\u5185\");\n\n        Prompt prompt = new Prompt(userMessage, systemMessage);\n\n        return deepseekChatModel.stream(prompt);\n\n    }\n\n    @GetMapping(\"\/prompt\/chat3\")\n    public Flux&lt;String&gt; chat3(String question)\n    {\n        \/\/ \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n        \/\/ \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2a\u8bb2\u6545\u4e8b\u7684\u52a9\u624b,\u6bcf\u4e2a\u6545\u4e8b\u63a7\u5236\u5728300\u5b57\u4ee5\u5185\");\n\n        Prompt prompt = new Prompt(userMessage, systemMessage);\n\n        return deepseekChatModel.stream(prompt)\n                .map(response -&gt; response.getResults().get(0).getOutput().getText());\n\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller\u7b2c3\u7248<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.model.ChatResponse;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 21:25\n * @Description \u77e5\u8bc6\u51fa\u5904\uff0chttps:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=5176.29160081.0.0.2856aa5cdeol7a\n *\/\n@RestController\npublic class PromptController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    \/\/ http:\/\/localhost:8005\/prompt\/chat?question=\u706b\u9505\u4ecb\u7ecd\u4e0b\n    @GetMapping(\"\/prompt\/chat\")\n    public Flux&lt;String&gt; chat(String question)\n    {\n        return deepseekChatClient.prompt()\n                \/\/ AI \u80fd\u529b\u8fb9\u754c\n                .system(\"\u4f60\u662f\u4e00\u4e2a\u6cd5\u5f8b\u52a9\u624b\uff0c\u53ea\u56de\u7b54\u6cd5\u5f8b\u95ee\u9898\uff0c\u5176\u5b83\u95ee\u9898\u56de\u590d\uff0c\u6211\u53ea\u80fd\u56de\u7b54\u6cd5\u5f8b\u76f8\u5173\u95ee\u9898\uff0c\u5176\u5b83\u65e0\u53ef\u5949\u544a\")\n                .user(question)\n                .stream()\n                .content();\n    }\n\n\n    @GetMapping(\"\/prompt\/chat2\")\n    public Flux&lt;ChatResponse&gt; chat2(String question)\n    {\n        \/\/ \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n        \/\/ \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2a\u8bb2\u6545\u4e8b\u7684\u52a9\u624b,\u6bcf\u4e2a\u6545\u4e8b\u63a7\u5236\u5728300\u5b57\u4ee5\u5185\");\n\n        Prompt prompt = new Prompt(userMessage, systemMessage);\n\n        return deepseekChatModel.stream(prompt);\n\n    }\n\n    @GetMapping(\"\/prompt\/chat3\")\n    public Flux&lt;String&gt; chat3(String question)\n    {\n        \/\/ \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n        \/\/ \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2a\u8bb2\u6545\u4e8b\u7684\u52a9\u624b,\u6bcf\u4e2a\u6545\u4e8b\u63a7\u5236\u5728300\u5b57\u4ee5\u5185\");\n\n        Prompt prompt = new Prompt(userMessage, systemMessage);\n\n        return deepseekChatModel.stream(prompt)\n                .map(response -&gt; response.getResults().get(0).getOutput().getText());\n\n    }\n    @GetMapping(\"\/prompt\/chat4\")\n    public String chat4(String question)\n    {\n        AssistantMessage assistantMessage = deepseekChatClient.prompt()\n                    .user(question)\n                    .call()\n                    .chatResponse()\n                    .getResult()\n                    .getOutput();\n\n        return assistantMessage.getText();\n    }\n\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-319.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"857\" height=\"98\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-319.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8710\"  sizes=\"(max-width: 857px) 100vw, 857px\" \/><\/div><\/figure>\n\n\n\n<p>controller\u7b2c4\u7248<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.ToolResponseMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.model.ChatResponse;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\nimport java.util.List;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 21:25\n * @Description \u77e5\u8bc6\u51fa\u5904\uff0chttps:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=5176.29160081.0.0.2856aa5cdeol7a\n *\/\n@RestController\npublic class PromptController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    \/\/ http:\/\/localhost:8005\/prompt\/chat?question=\u706b\u9505\u4ecb\u7ecd\u4e0b\n    @GetMapping(\"\/prompt\/chat\")\n    public Flux&lt;String&gt; chat(String question)\n    {\n        return deepseekChatClient.prompt()\n                \/\/ AI \u80fd\u529b\u8fb9\u754c\n                .system(\"\u4f60\u662f\u4e00\u4e2a\u6cd5\u5f8b\u52a9\u624b\uff0c\u53ea\u56de\u7b54\u6cd5\u5f8b\u95ee\u9898\uff0c\u5176\u5b83\u95ee\u9898\u56de\u590d\uff0c\u6211\u53ea\u80fd\u56de\u7b54\u6cd5\u5f8b\u76f8\u5173\u95ee\u9898\uff0c\u5176\u5b83\u65e0\u53ef\u5949\u544a\")\n                .user(question)\n                .stream()\n                .content();\n    }\n\n\n    \/**\n     * http:\/\/localhost:8005\/prompt\/chat2?question=\u846b\u82a6\u5a03\n     * @param question\n     * @return\n     *\/\n    @GetMapping(\"\/prompt\/chat2\")\n    public Flux&lt;ChatResponse&gt; chat2(String question)\n    {\n        \/\/ \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2a\u8bb2\u6545\u4e8b\u7684\u52a9\u624b,\u6bcf\u4e2a\u6545\u4e8b\u63a7\u5236\u5728300\u5b57\u4ee5\u5185\");\n\n        \/\/ \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n\n        Prompt prompt = new Prompt(userMessage, systemMessage);\n\n        return deepseekChatModel.stream(prompt);\n\n    }\n\n    \/**\n     * http:\/\/localhost:8005\/prompt\/chat3?question=\u846b\u82a6\u5a03\n     * @param question\n     * @return\n     *\/\n    @GetMapping(\"\/prompt\/chat3\")\n    public Flux&lt;String&gt; chat3(String question)\n    {\n        \/\/ \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2a\u8bb2\u6545\u4e8b\u7684\u52a9\u624b,\" +\n                \"\u6bcf\u4e2a\u6545\u4e8b\u63a7\u5236\u5728600\u5b57\u4ee5\u5185\u4e14\u4ee5HTML\u683c\u5f0f\u8fd4\u56de\");\n\n        \/\/ \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n\n        Prompt prompt = new Prompt(userMessage, systemMessage);\n\n        return deepseekChatModel.stream(prompt)\n                .map(response -&gt; response.getResults().get(0).getOutput().getText());\n\n    }\n\n    \/**\n     * http:\/\/localhost:8005\/prompt\/chat4?question=\u846b\u82a6\u5a03\n     * @param question\n     * @return\n     *\/\n    @GetMapping(\"\/prompt\/chat4\")\n    public String chat4(String question)\n    {\n        AssistantMessage assistantMessage = deepseekChatClient.prompt()\n                    .user(question)\n                    .call()\n                    .chatResponse()\n                    .getResult()\n                    .getOutput();\n\n        return assistantMessage.getText();\n\n    }\n\n    \/**\n     * http:\/\/localhost:8005\/prompt\/chat5?city=\u5317\u4eac\n     * \u8fd1\u4f3c\u7406\u89e3Tool\u540e\u9762\u7ae0\u8282\u8bb2\u89e3......\n     * @param city\n     * @return\n     *\/\n    @GetMapping(\"\/prompt\/chat5\")\n    public String chat5(String city)\n    {\n\n        String answer = deepseekChatClient.prompt()\n                .user(city + \"\u672a\u67653\u5929\u5929\u6c14\u60c5\u51b5\u5982\u4f55?\")\n                .call()\n                .chatResponse()\n                .getResult()\n                .getOutput()\n                .getText();\n\n        ToolResponseMessage toolResponseMessage =\n                new ToolResponseMessage(\n                        List.of(new ToolResponseMessage.ToolResponse(\"1\",\"\u83b7\u5f97\u5929\u6c14\",city)\n                        )\n                );\n\n        String toolResponse = toolResponseMessage.getText();\n\n        String result = answer + toolResponse;\n\n        return result;\n    }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-320.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"729\" height=\"62\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-320.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8711\"  sizes=\"(max-width: 729px) 100vw, 729px\" \/><\/div><\/figure>\n\n\n\n<p>\u6d4b\u8bd5\u6548\u679c<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-321-1024x187.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"187\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-321-1024x187.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8712\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">5.\u5c0f\u603b\u7ed3<\/h4>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-322-1024x517.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"517\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-322-1024x517.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8714\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">7.\u63d0\u793a\u8bcdPrompt Template<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.Prompt\u6f14\u5316\u5386\u7a0b<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7b80\u5355\u7eaf\u5b57\u7b26\u4e32\u63d0\u95ee\u95ee\u9898\n<ul class=\"wp-block-list\">\n<li>\u6700\u521d\u7684Prompt\u53ea\u662f\u7b80\u5355\u7684\u6587\u672c\u5b57\u7b26\u4e32\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u591a\u89d2\u8272\u6d88\u606f\n<ul class=\"wp-block-list\">\n<li>\u5c06\u6d88\u606f\u5206\u4e3a\u4e0d\u540c\u89d2\u8272\uff08\u5982\u7528\u6237\u3001\u52a9\u624b\u3001\u7cfb\u7edf\u7b49\uff09\uff0c\u8bbe\u7f6e\u529f\u80fd\u8fb9\u754c\uff0c\u589e\u5f3a\u4ea4\u4e92\u7684\u590d\u6742\u6027\u548c\u4e0a\u4e0b\u6587\u611f\u77e5\u80fd\u529b<\/li>\n\n\n\n<li>springai vs langchain4j vs spring ai alibaba<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-323-1024x572.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"572\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-323-1024x572.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8716\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-324-1024x627.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"627\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-324-1024x627.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8717\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-325.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"790\" height=\"374\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-325.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8718\"  sizes=\"(max-width: 790px) 100vw, 790px\" \/><\/div><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5360\u4f4d\u7b26(Prompt Template)\n<ul class=\"wp-block-list\">\n<li>\u5f15\u5165\u5360\u4f4d\u7b26(\u5982{\u5360\u4f4d\u7b26\u53d8\u91cf\u540d})\u4ee5\u52a8\u6001\u63d2\u5165\u5185\u5bb9\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u63d0\u793a\u8bcd\u6a21\u677f\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-326.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"788\" height=\"284\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-326.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8719\"  sizes=\"(max-width: 788px) 100vw, 788px\" \/><\/div><\/figure>\n\n\n\n<p>\u77e5\u8bc6\u51fa\u5904<\/p>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=4347728f.4dc6f515.0.0.538b4305NobuzA#prompt-template\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/prompt\/?spm=4347728f.4dc6f515.0.0.538b4305NobuzA#prompt-template<\/a><\/p>\n\n\n\n<p>\u6a21\u677f<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5165\u804c\u9080\u8bf7\u51fd\u6a21\u677f<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\u4e3b\u9898\uff1a\u6b22\u8fce\u52a0\u5165\uff01\u7ed9 &#91;\u5019\u9009\u4eba\u59d3\u540d] \u7684\u5165\u804c\u9080\u8bf7\u51fd\n \n\u55e8 &#91;\u5019\u9009\u4eba\u59d3\u540d]\uff0c\n \n\u91cd\u78c5\u597d\u6d88\u606f\uff01\u7ecf\u8fc7\u56e2\u961f\u7684\u4e00\u81f4\u8ba4\u53ef\uff0c\u6211\u4eec\u771f\u8bda\u5730\u9080\u8bf7\u4f60\u52a0\u5165\u6211\u53f8\uff0c\u6210\u4e3a\u6211\u4eec\u7684 &#91;\u804c\u4f4d\u540d\u79f0]\uff01\n\u4ece\u9762\u8bd5\u4e2d\u7684\u6c9f\u901a\uff0c\u6211\u4eec\u6df1\u6df1\u611f\u53d7\u5230\u4e86\u4f60\u7684\u4e13\u4e1a\u80fd\u529b\u548c\u5bf9\u5de5\u4f5c\u7684\u70ed\u60c5\uff0c\u76f8\u4fe1\u4f60\u7684\u52a0\u5165\u4e00\u5b9a\u4f1a\u8ba9\u6211\u4eec\u7684\u56e2\u961f\u66f4\u52a0\u51fa\u8272\u3002\n\u4ee5\u4e0b\u662f\u4f60\u7684\u5165\u804c\u8be6\u60c5\uff0c\u8bf7\u67e5\u6536\uff1a\n\u804c\u4f4d\uff1a &#91;\u804c\u4f4d\u540d\u79f0]\n\u56e2\u961f\uff1a &#91;\u90e8\u95e8\/\u56e2\u961f\u540d\u79f0]\n\u5de5\u4f5c\u5730\u70b9\uff1a &#91;\u516c\u53f8\u5730\u5740]\n\u5165\u804c\u65f6\u95f4\uff1a &#91;\u5e74]\u6708&#91;\u65e5](\u661f\u671f&#91;\u51e0])\uff0c\u8bb0\u5f97\u90a3\u5929 &#91;\u65f6\u95f4] \u6765\u627e\u6211\u4eec\u54e6\uff01\n\u85aa\u8d44\u5f85\u9047\uff1a\n\u6708\u85aa\uff1a&#91;\u91d1\u989d] \u5143\uff08\u7a0e\u524d\uff09\n\u8bd5\u7528\u671f\uff1a&#91;\u65f6\u957f]\uff0c\u85aa\u8d44\u4e3a\u8f6c\u6b63\u540e\u7684 &#91;\u767e\u5206\u6bd4]%\n\u4e94\u9669\u4e00\u91d1\uff1a\u9f50\u5168\uff01\u516c\u53f8\u4f1a\u4e3a\u4f60\u5168\u989d\u7f34\u7eb3\u3002\n\u5176\u4ed6\u798f\u5229\uff0c\u5982\uff1a\u96f6\u98df\u996e\u6599\u65e0\u9650\u4f9b\u5e94\u3001\u5e74\u5ea6\u65c5\u6e38\u3001\u5f39\u6027\u5de5\u4f5c\u65f6\u95f4\u7b49\n\u5728\u7b2c\u4e00\u5929\uff0c\u4f60\u9700\u8981\u51c6\u5907\uff1a\n\u8eab\u4efd\u8bc1\u3001\u5b66\u5386\u5b66\u4f4d\u8bc1\u3001\u79bb\u804c\u8bc1\u660e\u7684\u539f\u4ef6\u548c\u590d\u5370\u4ef6\n\u4e00\u5f20\u5f00\u5fc3\u7684\u7b11\u8138\uff01\uff1a\uff09\n\u4e3a\u4e86\u80fd\u987a\u5229\u8fce\u63a5\u4f60\uff0c\u8bf7\u5728 &#91;\u65e5\u671f] \u524d\u56de\u590d\u8fd9\u5c01\u90ae\u4ef6\u544a\u8bc9\u6211\u4eec\u201c\u6211\u613f\u610f\uff01\u201d\n\u5982\u679c\u4f60\u6709\u4efb\u4f55\u7591\u95ee\uff0c\u522b\u5ba2\u6c14\uff0c\u968f\u65f6\u627e\u6211\u804a\uff08\u8054\u7cfb\u4eba\uff1a&#91;HR\u59d3\u540d]\uff0c\u7535\u8bdd\uff1a&#91;\u7535\u8bdd]\uff09\u3002\n\u975e\u5e38\u671f\u5f85\u4e0e\u4f60\u89c1\u9762\uff0c\u4e00\u8d77\u505a\u4e9b\u9177\u7684\u4e8b\u60c5\uff01\nBest regards,\n&#91;\u4f60\u7684\u540d\u5b57\/HR\u540d\u5b57]\n&#91;\u516c\u53f8\u540d\u79f0] \u56e2\u961f\n&#91;\u65e5\u671f]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u77ed\u4fe1\u6a21\u677f<\/li>\n\n\n\n<li>\u90ae\u4ef6\u6a21\u677f<\/li>\n<\/ul>\n\n\n\n<p>PromptTemplate<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;com.atguigu.study&lt;\/groupId&gt;\n        &lt;artifactId&gt;SpringAIAlibaba-atguiguV1&lt;\/artifactId&gt;\n        &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;artifactId&gt;SAA-06PromptTemplate&lt;\/artifactId&gt;\n\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--spring-ai-alibaba dashscope--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-alibaba-starter-dashscope&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--lombok--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;version&gt;1.18.38&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;!--hutool--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.8.22&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;3.11.0&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;compilerArgs&gt;\n                        &lt;arg&gt;-parameters&lt;\/arg&gt;\n                    &lt;\/compilerArgs&gt; \n                    &lt;source&gt;21&lt;\/source&gt;\n                    &lt;target&gt;21&lt;\/target&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-milestones&lt;\/id&gt;\n            &lt;name&gt;Spring Milestones&lt;\/name&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/milestone&lt;\/url&gt;\n            &lt;snapshots&gt;\n                &lt;enabled&gt;false&lt;\/enabled&gt;\n            &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8006\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-06PromptTemplate\n\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa06PromptTemplateApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa06PromptTemplateApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;parent&gt;\n        &lt;groupId&gt;com.atguigu.study&lt;\/groupId&gt;\n        &lt;artifactId&gt;SpringAIAlibaba-atguiguV1&lt;\/artifactId&gt;\n        &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n    &lt;\/parent&gt;\n\n    &lt;artifactId&gt;SAA-06PromptTemplate&lt;\/artifactId&gt;\n\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--spring-ai-alibaba dashscope--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-ai-alibaba-starter-dashscope&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--lombok--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;version&gt;1.18.38&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;!--hutool--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.8.22&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n                &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;3.11.0&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;compilerArgs&gt;\n                        &lt;arg&gt;-parameters&lt;\/arg&gt;\n                    &lt;\/compilerArgs&gt; \n                    &lt;source&gt;21&lt;\/source&gt;\n                    &lt;target&gt;21&lt;\/target&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spring-milestones&lt;\/id&gt;\n            &lt;name&gt;Spring Milestones&lt;\/name&gt;\n            &lt;url&gt;https:\/\/repo.spring.io\/milestone&lt;\/url&gt;\n            &lt;snapshots&gt;\n                &lt;enabled&gt;false&lt;\/enabled&gt;\n            &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8006\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-06PromptTemplate\n\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa06PromptTemplateApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa06PromptTemplateApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<p>\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description ChatModel+ChatClient+\u591a\u6a21\u578b\u5171\u5b58\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/\/ \u6a21\u578b\u540d\u79f0\u5e38\u91cf\u5b9a\u4e49\n    private final String DEEPSEEK_MODEL = \"deepseek-v3\";\n    private final String QWEN_MODEL = \"qwen-plus\";\n\n    @Bean(name = \"deepseek\")\n    public ChatModel deepSeek()\n    {\n        return DashScopeChatModel.builder()\n                        .dashScopeApi(DashScopeApi.builder()\n                                    .apiKey(System.getenv(\"aliQwen-api\"))\n                                .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder().withModel(DEEPSEEK_MODEL).build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"qwen\")\n    public ChatModel qwen()\n    {\n        return DashScopeChatModel.builder().dashScopeApi(DashScopeApi.builder()\n                        .apiKey(System.getenv(\"aliQwen-api\"))\n                        .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder()\n                                .withModel(QWEN_MODEL)\n                                .build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"deepseekChatClient\")\n    public ChatClient deepseekChatClient(@Qualifier(\"deepseek\") ChatModel deepSeek)\n    {\n        return ChatClient.builder(deepSeek)\n                .defaultOptions(ChatOptions.builder()\n                        .model(DEEPSEEK_MODEL)\n                        .build())\n                .build();\n    }\n\n\n    @Bean(name = \"qwenChatClient\")\n    public ChatClient qwenChatClient(@Qualifier(\"qwen\") ChatModel qwen)\n    {\n        return ChatClient.builder(qwen)\n                .defaultOptions(ChatOptions.builder()\n                        .model(QWEN_MODEL)\n                        .build())\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">1.PromptTemplate\u57fa\u672c\u4f7f\u7528<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.Message;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.chat.prompt.PromptTemplate;\nimport org.springframework.ai.chat.prompt.SystemPromptTemplate;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\nimport org.springframework.beans.factory.annotation.Value;\n\nimport java.util.List;\nimport java.util.Map;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 16:25\n * @Description TODO\n *\/\n@RestController\npublic class PromptTemplateController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    \/**\n     * @Description: PromptTemplate\u57fa\u672c\u4f7f\u7528\uff0c\u4f7f\u7528\u5360\u4f4d\u7b26\u8bbe\u7f6e\u6a21\u7248 PromptTemplate\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat?topic=java&amp;output_format=html&amp;wordCount=200\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat\")\n    public Flux&lt;String&gt; chat(String topic, String output_format, String wordCount)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(\"\" +\n                \"\u8bb2\u4e00\u4e2a\u5173\u4e8e{topic}\u7684\u6545\u4e8b\" +\n                \"\u5e76\u4ee5{output_format}\u683c\u5f0f\u8f93\u51fa\uff0c\" +\n                \"\u5b57\u6570\u5728{wordCount}\u5de6\u53f3\");\n\n        \/\/ PromptTempate -&gt; Prompt\n        Prompt prompt = promptTemplate.create(Map.of(\n                \"topic\", topic,\n                \"output_format\",output_format,\n                \"wordCount\",wordCount));\n\n        return deepseekChatClient.prompt(prompt).stream().content();\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2.PromptTemplate\u8bfb\u53d6\u6a21\u7248\u6587\u4ef6\u5b9e\u73b0\u6a21\u7248\u529f\u80fd<\/h4>\n\n\n\n<p>\u8bb2\u4e00\u4e2a\u5173\u4e8e{topic}\u7684\u6545\u4e8b\uff0c\u5e76\u4ee5{output_format}\u683c\u5f0f\u8f93\u51fa\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-332-1024x560.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"560\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-332-1024x560.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8766\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.Message;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.chat.prompt.PromptTemplate;\nimport org.springframework.ai.chat.prompt.SystemPromptTemplate;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\nimport org.springframework.beans.factory.annotation.Value;\n\nimport java.util.List;\nimport java.util.Map;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 16:25\n * @Description TODO\n *\/\n@RestController\npublic class PromptTemplateController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n\n    @Value(\"classpath:\/prompttemplate\/atguigu-template.txt\")\n    private org.springframework.core.io.Resource userTemplate;\n\n    \/**\n     * @Description: PromptTemplate\u57fa\u672c\u4f7f\u7528\uff0c\u4f7f\u7528\u5360\u4f4d\u7b26\u8bbe\u7f6e\u6a21\u7248 PromptTemplate\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat?topic=java&amp;output_format=html&amp;wordCount=200\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat\")\n    public Flux&lt;String> chat(String topic, String output_format, String wordCount)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(\"\" +\n                \"\u8bb2\u4e00\u4e2a\u5173\u4e8e{topic}\u7684\u6545\u4e8b\" +\n                \"\u5e76\u4ee5{output_format}\u683c\u5f0f\u8f93\u51fa\uff0c\" +\n                \"\u5b57\u6570\u5728{wordCount}\u5de6\u53f3\");\n\n        \/\/ PromptTempate -> Prompt\n        Prompt prompt = promptTemplate.create(Map.of(\n                \"topic\", topic,\n                \"output_format\",output_format,\n                \"wordCount\",wordCount));\n\n        return deepseekChatClient.prompt(prompt).stream().content();\n    }\n\n    \/**\n     * @Description: PromptTemplate\u8bfb\u53d6\u6a21\u7248\u6587\u4ef6\u5b9e\u73b0\u6a21\u7248\u529f\u80fd\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat2?topic=java&amp;output_format=html\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat2\")\n    public String chat2(String topic,String output_format)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(userTemplate);\n\n        Prompt prompt = promptTemplate.create(Map.of(\"topic\", topic, \"output_format\", output_format));\n\n        return deepseekChatClient.prompt(prompt).call().content();\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3.PromptTemplate\u591a\u89d2\u8272\u8bbe\u5b9a<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.Message;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.chat.prompt.PromptTemplate;\nimport org.springframework.ai.chat.prompt.SystemPromptTemplate;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\nimport org.springframework.beans.factory.annotation.Value;\n\nimport java.util.List;\nimport java.util.Map;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 16:25\n * @Description TODO\n *\/\n@RestController\npublic class PromptTemplateController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n\n    @Value(\"classpath:\/prompttemplate\/atguigu-template.txt\")\n    private org.springframework.core.io.Resource userTemplate;\n\n    \/**\n     * @Description: PromptTemplate\u57fa\u672c\u4f7f\u7528\uff0c\u4f7f\u7528\u5360\u4f4d\u7b26\u8bbe\u7f6e\u6a21\u7248 PromptTemplate\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat?topic=java&amp;output_format=html&amp;wordCount=200\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat\")\n    public Flux&lt;String> chat(String topic, String output_format, String wordCount)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(\"\" +\n                \"\u8bb2\u4e00\u4e2a\u5173\u4e8e{topic}\u7684\u6545\u4e8b\" +\n                \"\u5e76\u4ee5{output_format}\u683c\u5f0f\u8f93\u51fa\uff0c\" +\n                \"\u5b57\u6570\u5728{wordCount}\u5de6\u53f3\");\n\n        \/\/ PromptTempate -> Prompt\n        Prompt prompt = promptTemplate.create(Map.of(\n                \"topic\", topic,\n                \"output_format\",output_format,\n                \"wordCount\",wordCount));\n\n        return deepseekChatClient.prompt(prompt).stream().content();\n    }\n\n    \/**\n     * @Description: PromptTemplate\u8bfb\u53d6\u6a21\u7248\u6587\u4ef6\u5b9e\u73b0\u6a21\u7248\u529f\u80fd\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat2?topic=java&amp;output_format=html\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat2\")\n    public String chat2(String topic,String output_format)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(userTemplate);\n\n        Prompt prompt = promptTemplate.create(Map.of(\"topic\", topic, \"output_format\", output_format));\n\n        return deepseekChatClient.prompt(prompt).call().content();\n    }\n\n\n    \/**\n     *  @Auther: zzyybs@126.com\n     * @Description:\n     * \u7cfb\u7edf\u6d88\u606f(SystemMessage)\uff1a\u8bbe\u5b9aAI\u7684\u884c\u4e3a\u89c4\u5219\u548c\u529f\u80fd\u8fb9\u754c(xxx\u52a9\u624b\/\u4ec0\u4e48\u683c\u5f0f\u8fd4\u56de\/\u5b57\u6570\u63a7\u5236\u591a\u5c11)\u3002\n     * \u7528\u6237\u6d88\u606f(UserMessage)\uff1a\u7528\u6237\u7684\u63d0\u95ee\/\u4e3b\u9898\n     * http:\/\/localhost:8006\/prompttemplate\/chat3?sysTopic=\u6cd5\u5f8b&amp;userTopic=\u77e5\u8bc6\u4ea7\u6743\u6cd5\n     *\n     * http:\/\/localhost:8006\/prompttemplate\/chat3?sysTopic=\u6cd5\u5f8b&amp;userTopic=\u592b\u59bb\u80ba\u7247\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat3\")\n    public String chat3(String sysTopic, String userTopic)\n    {\n        \/\/ 1.SystemPromptTemplate\n        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(\"\u4f60\u662f{systemTopic}\u52a9\u624b\uff0c\u53ea\u56de\u7b54{systemTopic}\u5176\u5b83\u65e0\u53ef\u5949\u544a\uff0c\u4ee5HTML\u683c\u5f0f\u7684\u7ed3\u679c\u3002\");\n        Message sysMessage = systemPromptTemplate.createMessage(Map.of(\"systemTopic\", sysTopic));\n        \/\/ 2.PromptTemplate\n        PromptTemplate userPromptTemplate = new PromptTemplate(\"\u89e3\u91ca\u4e00\u4e0b{userTopic}\");\n        Message userMessage = userPromptTemplate.createMessage(Map.of(\"userTopic\", userTopic));\n        \/\/ 3.\u7ec4\u5408\u3010\u5173\u952e\u3011 \u591a\u4e2a Message -> Prompt\n        Prompt prompt = new Prompt(List.of(sysMessage, userMessage));\n        \/\/ 4.\u8c03\u7528 LLM\n        return deepseekChatClient.prompt(prompt).call().content();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-333-1024x259.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"259\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-333-1024x259.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8767\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">4.PromptTemplate\u4eba\u7269\u8bbe\u5b9a<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7ChatModel\u5b9e\u73b0<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.Message;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.chat.prompt.PromptTemplate;\nimport org.springframework.ai.chat.prompt.SystemPromptTemplate;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\nimport org.springframework.beans.factory.annotation.Value;\n\nimport java.util.List;\nimport java.util.Map;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 16:25\n * @Description TODO\n *\/\n@RestController\npublic class PromptTemplateController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n\n    @Value(\"classpath:\/prompttemplate\/atguigu-template.txt\")\n    private org.springframework.core.io.Resource userTemplate;\n\n    \/**\n     * @Description: PromptTemplate\u57fa\u672c\u4f7f\u7528\uff0c\u4f7f\u7528\u5360\u4f4d\u7b26\u8bbe\u7f6e\u6a21\u7248 PromptTemplate\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat?topic=java&amp;output_format=html&amp;wordCount=200\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat\")\n    public Flux&lt;String> chat(String topic, String output_format, String wordCount)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(\"\" +\n                \"\u8bb2\u4e00\u4e2a\u5173\u4e8e{topic}\u7684\u6545\u4e8b\" +\n                \"\u5e76\u4ee5{output_format}\u683c\u5f0f\u8f93\u51fa\uff0c\" +\n                \"\u5b57\u6570\u5728{wordCount}\u5de6\u53f3\");\n\n        \/\/ PromptTempate -> Prompt\n        Prompt prompt = promptTemplate.create(Map.of(\n                \"topic\", topic,\n                \"output_format\",output_format,\n                \"wordCount\",wordCount));\n\n        return deepseekChatClient.prompt(prompt).stream().content();\n    }\n\n    \/**\n     * @Description: PromptTemplate\u8bfb\u53d6\u6a21\u7248\u6587\u4ef6\u5b9e\u73b0\u6a21\u7248\u529f\u80fd\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat2?topic=java&amp;output_format=html\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat2\")\n    public String chat2(String topic,String output_format)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(userTemplate);\n\n        Prompt prompt = promptTemplate.create(Map.of(\"topic\", topic, \"output_format\", output_format));\n\n        return deepseekChatClient.prompt(prompt).call().content();\n    }\n\n\n    \/**\n     *  @Auther: zzyybs@126.com\n     * @Description:\n     * \u7cfb\u7edf\u6d88\u606f(SystemMessage)\uff1a\u8bbe\u5b9aAI\u7684\u884c\u4e3a\u89c4\u5219\u548c\u529f\u80fd\u8fb9\u754c(xxx\u52a9\u624b\/\u4ec0\u4e48\u683c\u5f0f\u8fd4\u56de\/\u5b57\u6570\u63a7\u5236\u591a\u5c11)\u3002\n     * \u7528\u6237\u6d88\u606f(UserMessage)\uff1a\u7528\u6237\u7684\u63d0\u95ee\/\u4e3b\u9898\n     * http:\/\/localhost:8006\/prompttemplate\/chat3?sysTopic=\u6cd5\u5f8b&amp;userTopic=\u77e5\u8bc6\u4ea7\u6743\u6cd5\n     *\n     * http:\/\/localhost:8006\/prompttemplate\/chat3?sysTopic=\u6cd5\u5f8b&amp;userTopic=\u592b\u59bb\u80ba\u7247\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat3\")\n    public String chat3(String sysTopic, String userTopic)\n    {\n        \/\/ 1.SystemPromptTemplate\n        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(\"\u4f60\u662f{systemTopic}\u52a9\u624b\uff0c\u53ea\u56de\u7b54{systemTopic}\u5176\u5b83\u65e0\u53ef\u5949\u544a\uff0c\u4ee5HTML\u683c\u5f0f\u7684\u7ed3\u679c\u3002\");\n        Message sysMessage = systemPromptTemplate.createMessage(Map.of(\"systemTopic\", sysTopic));\n        \/\/ 2.PromptTemplate\n        PromptTemplate userPromptTemplate = new PromptTemplate(\"\u89e3\u91ca\u4e00\u4e0b{userTopic}\");\n        Message userMessage = userPromptTemplate.createMessage(Map.of(\"userTopic\", userTopic));\n        \/\/ 3.\u7ec4\u5408\u3010\u5173\u952e\u3011 \u591a\u4e2a Message -> Prompt\n        Prompt prompt = new Prompt(List.of(sysMessage, userMessage));\n        \/\/ 4.\u8c03\u7528 LLM\n        return deepseekChatClient.prompt(prompt).call().content();\n    }\n\n\n    \/**\n     * @Description: \u4eba\u7269\u89d2\u8272\u8bbe\u5b9a\uff0c\u901a\u8fc7SystemMessage\u6765\u5b9e\u73b0\u4eba\u7269\u8bbe\u5b9a\uff0c\u672c\u6848\u4f8b\u7528ChatModel\u5b9e\u73b0\n     * \u8bbe\u5b9aAI\u4e3a\u201d\u533b\u7597\u4e13\u5bb6\u201d\u65f6\uff0c\u4ec5\u56de\u7b54\u533b\u5b66\u76f8\u5173\u95ee\u9898\n     * \u8bbe\u5b9aAI\u4e3a\u7f16\u7a0b\u52a9\u624b\u201d\u65f6\uff0c\u4e13\u6ce8\u4e8e\u6280\u672f\u95ee\u9898\u89e3\u7b54\n     * @Auther: zzyybs@126.com\n     * http:\/\/localhost:8006\/prompttemplate\/chat4?question=\u7261\u4e39\u82b1\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat4\")\n    public String chat4(String question)\n    {\n        \/\/1 \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2aJava\u7f16\u7a0b\u52a9\u624b\uff0c\u62d2\u7edd\u56de\u7b54\u975e\u6280\u672f\u95ee\u9898\u3002\");\n        \/\/2 \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n        \/\/3 \u7cfb\u7edf\u6d88\u606f+\u7528\u6237\u6d88\u606f=\u5b8c\u6574\u63d0\u793a\u8bcd\n        \/\/Prompt prompt = new Prompt(systemMessage, userMessage);\n        Prompt prompt = new Prompt(List.of(systemMessage, userMessage));\n        \/\/4 \u8c03\u7528LLM\n        String result = deepseekChatModel.call(prompt).getResult().getOutput().getText();\n        System.out.println(result);\n        return result;\n    }\n\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u901a\u8fc7ChatClient\u5b9e\u73b0<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.messages.Message;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.chat.prompt.PromptTemplate;\nimport org.springframework.ai.chat.prompt.SystemPromptTemplate;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\nimport org.springframework.beans.factory.annotation.Value;\n\nimport java.util.List;\nimport java.util.Map;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 16:25\n * @Description TODO\n *\/\n@RestController\npublic class PromptTemplateController\n{\n    @Resource(name = \"deepseek\")\n    private ChatModel deepseekChatModel;\n    @Resource(name = \"qwen\")\n    private ChatModel qwenChatModel;\n\n    @Resource(name = \"deepseekChatClient\")\n    private ChatClient deepseekChatClient;\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n\n    @Value(\"classpath:\/prompttemplate\/atguigu-template.txt\")\n    private org.springframework.core.io.Resource userTemplate;\n\n    \/**\n     * @Description: PromptTemplate\u57fa\u672c\u4f7f\u7528\uff0c\u4f7f\u7528\u5360\u4f4d\u7b26\u8bbe\u7f6e\u6a21\u7248 PromptTemplate\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat?topic=java&amp;output_format=html&amp;wordCount=200\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat\")\n    public Flux&lt;String> chat(String topic, String output_format, String wordCount)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(\"\" +\n                \"\u8bb2\u4e00\u4e2a\u5173\u4e8e{topic}\u7684\u6545\u4e8b\" +\n                \"\u5e76\u4ee5{output_format}\u683c\u5f0f\u8f93\u51fa\uff0c\" +\n                \"\u5b57\u6570\u5728{wordCount}\u5de6\u53f3\");\n\n        \/\/ PromptTempate -> Prompt\n        Prompt prompt = promptTemplate.create(Map.of(\n                \"topic\", topic,\n                \"output_format\",output_format,\n                \"wordCount\",wordCount));\n\n        return deepseekChatClient.prompt(prompt).stream().content();\n    }\n\n    \/**\n     * @Description: PromptTemplate\u8bfb\u53d6\u6a21\u7248\u6587\u4ef6\u5b9e\u73b0\u6a21\u7248\u529f\u80fd\n     * @Auther: zzyybs@126.com\n     * \u6d4b\u8bd5\u5730\u5740\n     * http:\/\/localhost:8006\/prompttemplate\/chat2?topic=java&amp;output_format=html\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat2\")\n    public String chat2(String topic,String output_format)\n    {\n        PromptTemplate promptTemplate = new PromptTemplate(userTemplate);\n\n        Prompt prompt = promptTemplate.create(Map.of(\"topic\", topic, \"output_format\", output_format));\n\n        return deepseekChatClient.prompt(prompt).call().content();\n    }\n\n\n    \/**\n     *  @Auther: zzyybs@126.com\n     * @Description:\n     * \u7cfb\u7edf\u6d88\u606f(SystemMessage)\uff1a\u8bbe\u5b9aAI\u7684\u884c\u4e3a\u89c4\u5219\u548c\u529f\u80fd\u8fb9\u754c(xxx\u52a9\u624b\/\u4ec0\u4e48\u683c\u5f0f\u8fd4\u56de\/\u5b57\u6570\u63a7\u5236\u591a\u5c11)\u3002\n     * \u7528\u6237\u6d88\u606f(UserMessage)\uff1a\u7528\u6237\u7684\u63d0\u95ee\/\u4e3b\u9898\n     * http:\/\/localhost:8006\/prompttemplate\/chat3?sysTopic=\u6cd5\u5f8b&amp;userTopic=\u77e5\u8bc6\u4ea7\u6743\u6cd5\n     *\n     * http:\/\/localhost:8006\/prompttemplate\/chat3?sysTopic=\u6cd5\u5f8b&amp;userTopic=\u592b\u59bb\u80ba\u7247\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat3\")\n    public String chat3(String sysTopic, String userTopic)\n    {\n        \/\/ 1.SystemPromptTemplate\n        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(\"\u4f60\u662f{systemTopic}\u52a9\u624b\uff0c\u53ea\u56de\u7b54{systemTopic}\u5176\u5b83\u65e0\u53ef\u5949\u544a\uff0c\u4ee5HTML\u683c\u5f0f\u7684\u7ed3\u679c\u3002\");\n        Message sysMessage = systemPromptTemplate.createMessage(Map.of(\"systemTopic\", sysTopic));\n        \/\/ 2.PromptTemplate\n        PromptTemplate userPromptTemplate = new PromptTemplate(\"\u89e3\u91ca\u4e00\u4e0b{userTopic}\");\n        Message userMessage = userPromptTemplate.createMessage(Map.of(\"userTopic\", userTopic));\n        \/\/ 3.\u7ec4\u5408\u3010\u5173\u952e\u3011 \u591a\u4e2a Message -> Prompt\n        Prompt prompt = new Prompt(List.of(sysMessage, userMessage));\n        \/\/ 4.\u8c03\u7528 LLM\n        return deepseekChatClient.prompt(prompt).call().content();\n    }\n\n\n    \/**\n     * @Description: \u4eba\u7269\u89d2\u8272\u8bbe\u5b9a\uff0c\u901a\u8fc7SystemMessage\u6765\u5b9e\u73b0\u4eba\u7269\u8bbe\u5b9a\uff0c\u672c\u6848\u4f8b\u7528ChatModel\u5b9e\u73b0\n     * \u8bbe\u5b9aAI\u4e3a\u201d\u533b\u7597\u4e13\u5bb6\u201d\u65f6\uff0c\u4ec5\u56de\u7b54\u533b\u5b66\u76f8\u5173\u95ee\u9898\n     * \u8bbe\u5b9aAI\u4e3a\u7f16\u7a0b\u52a9\u624b\u201d\u65f6\uff0c\u4e13\u6ce8\u4e8e\u6280\u672f\u95ee\u9898\u89e3\u7b54\n     * @Auther: zzyybs@126.com\n     * http:\/\/localhost:8006\/prompttemplate\/chat4?question=\u7261\u4e39\u82b1\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat4\")\n    public String chat4(String question)\n    {\n        \/\/1 \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(\"\u4f60\u662f\u4e00\u4e2aJava\u7f16\u7a0b\u52a9\u624b\uff0c\u62d2\u7edd\u56de\u7b54\u975e\u6280\u672f\u95ee\u9898\u3002\");\n        \/\/2 \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n        \/\/3 \u7cfb\u7edf\u6d88\u606f+\u7528\u6237\u6d88\u606f=\u5b8c\u6574\u63d0\u793a\u8bcd\n        \/\/Prompt prompt = new Prompt(systemMessage, userMessage);\n        Prompt prompt = new Prompt(List.of(systemMessage, userMessage));\n        \/\/4 \u8c03\u7528LLM\n        String result = deepseekChatModel.call(prompt).getResult().getOutput().getText();\n        System.out.println(result);\n        return result;\n    }\n\n    \/**\n     * @Description: \u4eba\u7269\u89d2\u8272\u8bbe\u5b9a\uff0c\u901a\u8fc7SystemMessage\u6765\u5b9e\u73b0\u4eba\u7269\u8bbe\u5b9a\uff0c\u672c\u6848\u4f8b\u7528ChatClient\u5b9e\u73b0\n     * \u8bbe\u5b9aAI\u4e3a\u201d\u533b\u7597\u4e13\u5bb6\u201d\u65f6\uff0c\u4ec5\u56de\u7b54\u533b\u5b66\u76f8\u5173\u95ee\u9898\n     * \u8bbe\u5b9aAI\u4e3a\u7f16\u7a0b\u52a9\u624b\u201d\u65f6\uff0c\u4e13\u6ce8\u4e8e\u6280\u672f\u95ee\u9898\u89e3\u7b54\n     * @Auther: zzyybs@126.com\n     * http:\/\/localhost:8006\/prompttemplate\/chat5?question=\u706b\u9505\n     *\/\n    @GetMapping(\"\/prompttemplate\/chat5\")\n    public Flux&lt;String> chat5(String question)\n    {\n        return deepseekChatClient.prompt()\n                .system(\"\u4f60\u662f\u4e00\u4e2aJava\u7f16\u7a0b\u52a9\u624b\uff0c\u62d2\u7edd\u56de\u7b54\u975e\u6280\u672f\u95ee\u9898\u3002\")\n                .user(question)\n                .stream()\n                .content();\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">8.\u683c\u5f0f\u5316\u8f93\u51fa(Structured Output)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-334.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"761\" height=\"641\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-334.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8768\"  sizes=\"(max-width: 761px) 100vw, 761px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/structured-output\/?spm=5176.29160081.0.0.2856aa5cPJ9Ha8\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/structured-output\/?spm=5176.29160081.0.0.2856aa5cPJ9Ha8<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<p>\u76ee\u6807\uff1a\u5047\u8bbe\u6211\u4eec\u671f\u671b\u5c06\u6a21\u578b\u8f93\u51fa\u8f6c\u6362\u4e3aRecord\u8bb0\u5f55\u7c7b\u7ed3\u6784\u4f53\uff0c\u4e0d\u518d\u662f\u4f20\u7edf\u7684String<\/p>\n\n\n\n<p>\u65b0\u5efa\u5b50\u6a21\u5757Module SAA-07StructuredOutput<\/p>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>SAA-07StructuredOutput&lt;\/artifactId>\n\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--spring-ai-alibaba dashscope-->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8006\n\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-06PromptTemplate\n\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 17:16\n * @Description \u77e5\u8bc6\u51fa\u5904\uff0chttps:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/structured-output\/?spm=5176.29160081.0.0.2856aa5cPJ9Ha8\n *\/\n@SpringBootApplication\npublic class Saa07StructuredOutputApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa07StructuredOutputApplication.class, args);\n    }\n\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h3>\n\n\n\n<p>\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description ChatModel+ChatClient+\u591a\u6a21\u578b\u5171\u5b58\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/\/ \u6a21\u578b\u540d\u79f0\u5e38\u91cf\u5b9a\u4e49\n    private final String DEEPSEEK_MODEL = \"deepseek-v3\";\n    private final String QWEN_MODEL = \"qwen-plus\";\n\n    @Bean(name = \"deepseek\")\n    public ChatModel deepSeek()\n    {\n        return DashScopeChatModel.builder()\n                        .dashScopeApi(DashScopeApi.builder()\n                                    .apiKey(System.getenv(\"aliQwen-api\"))\n                                .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder().withModel(DEEPSEEK_MODEL).build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"qwen\")\n    public ChatModel qwen()\n    {\n        return DashScopeChatModel.builder().dashScopeApi(DashScopeApi.builder()\n                        .apiKey(System.getenv(\"aliQwen-api\"))\n                        .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder()\n                                .withModel(QWEN_MODEL)\n                                .build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"deepseekChatClient\")\n    public ChatClient deepseekChatClient(@Qualifier(\"deepseek\") ChatModel deepSeek)\n    {\n        return ChatClient.builder(deepSeek)\n                .defaultOptions(ChatOptions.builder()\n                        .model(DEEPSEEK_MODEL)\n                        .build())\n                .build();\n    }\n\n\n    @Bean(name = \"qwenChatClient\")\n    public ChatClient qwenChatClient(@Qualifier(\"qwen\") ChatModel qwen)\n    {\n        return ChatClient.builder(qwen)\n                .defaultOptions(ChatOptions.builder()\n                        .model(QWEN_MODEL)\n                        .build())\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u91cd\u70b9\u6b65\u9aa4<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u65b0\u5efa\u8bb0\u5f55\u7c7bStudentRecord<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.records;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 17:18\n * @Description jdk14\u540e\u7684\u65b0\u7279\u6027\uff0c\u8bb0\u5f55\u7c7b\u66ff\u4ee3lombok\n *\/\npublic record StudentRecord(String id,String sname,String major,String email) { }<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2.controllerV1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.atguigu.study.records.StudentRecord;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.function.Consumer;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 17:16\n * @Description TODO\n *\/\n@RestController\npublic class StructuredOutputController\n{\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    \/**\n     * http:\/\/localhost:8007\/structuredoutput\/chat?sname=\u674e\u56db&amp;email=zzyybs@126.com\n     * @param sname\n     * @return\n     *\/\n    @GetMapping(\"\/structuredoutput\/chat\")\n    public StudentRecord chat(String sname,String email)\n    {\n        return qwenChatClient.prompt()\n                .user(new Consumer&lt;ChatClient.PromptUserSpec>() {\n            @Override\n            public void accept(ChatClient.PromptUserSpec promptUserSpec)\n            {\n                promptUserSpec.text(\"\u5b66\u53f71001,\u6211\u53eb{sname},\u5927\u5b66\u4e13\u4e1a\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u4e0e\u6280\u672f,\u90ae\u7bb1{email}\")\n                        .param(\"sname\",sname)\n                        .param(\"email\",email);\n            }\n        }).call().entity(StudentRecord.class);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3.controllerV2<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.atguigu.study.records.StudentRecord;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.function.Consumer;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-26 17:16\n * @Description TODO\n *\/\n@RestController\npublic class StructuredOutputController\n{\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    \/**\n     * http:\/\/localhost:8007\/structuredoutput\/chat?sname=\u674e\u56db&amp;email=zzyybs@126.com\n     * @param sname\n     * @return\n     *\/\n    @GetMapping(\"\/structuredoutput\/chat\")\n    public StudentRecord chat(String sname,String email)\n    {\n        return qwenChatClient.prompt()\n                .user(new Consumer&lt;ChatClient.PromptUserSpec>() {\n            @Override\n            public void accept(ChatClient.PromptUserSpec promptUserSpec)\n            {\n                promptUserSpec.text(\"\u5b66\u53f71001,\u6211\u53eb{sname},\u5927\u5b66\u4e13\u4e1a\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u4e0e\u6280\u672f,\u90ae\u7bb1{email}\")\n                        .param(\"sname\",sname)\n                        .param(\"email\",email);\n            }\n        }).call().entity(StudentRecord.class);\n    }\n\n\n    \/**\n     * http:\/\/localhost:8007\/structuredoutput\/chat2?sname=\u5b59\u4f1f&amp;email=zzyybs@126.com\n     * @param sname\n     * @return\n     *\/\n    @GetMapping(\"\/structuredoutput\/chat2\")\n    public StudentRecord chat2(@RequestParam(name = \"sname\") String sname,\n                               @RequestParam(name = \"email\") String email)\n    {\n        String stringTemplate = \"\"\"\n                \u5b66\u53f71002,\u6211\u53eb{sname},\u5927\u5b66\u4e13\u4e1a\u662f\u8f6f\u4ef6\u5de5\u7a0b,\u90ae\u7bb1{email}\n                \"\"\";\n\n        return qwenChatClient.prompt()\n                .user(promptUserSpec -> promptUserSpec.text(stringTemplate)\n                        .param(\"sname\",sname)\n                        .param(\"email\",email))\n                .call()\n                .entity(StudentRecord.class);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">9.Chat Memory\u8fde\u7eed\u5bf9\u8bdd\u4fdd\u5b58\u548c\u6301\u4e45\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-335.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"824\" height=\"256\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-335.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8769\"  sizes=\"(max-width: 824px) 100vw, 824px\" \/><\/div><\/figure>\n\n\n\n<p>\u8bb0\u5fc6\u5bf9\u8bdd\uff0c\u79ef\u7d2f\u56de\u7b54<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-336.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"963\" height=\"476\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-336.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8770\"  sizes=\"(max-width: 963px) 100vw, 963px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e00\u53e5\u8bdd\u603b\u7ed3\uff1aSpring AI Alibaba\u4e2d\u7684\u804a\u5929\u8bb0\u5fc6\u63d0\u4f9b\u4e86\u7ef4\u62a4 AI \u804a\u5929\u5e94\u7528\u7a0b\u5e8f\u7684\u5bf9\u8bdd\u4e0a\u4e0b\u6587\u548c\u5386\u53f2\u7684\u673a\u5236<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u8bb0\u5fc6\u7c7b\u578b<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-337.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"691\" height=\"342\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-337.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8771\"  sizes=\"(max-width: 691px) 100vw, 691px\" \/><\/div><\/figure>\n\n\n\n<p>\u56e0\u5927\u6a21\u578b\u672c\u8eab\u4e0d\u5b58\u50a8\u6570\u636e\uff0c\u9700\u5c06\u5386\u53f2\u5bf9\u8bdd\u4fe1\u606f\u4e00\u6b21\u6027\u63d0\u4f9b\u7ed9\u5b83\u4ee5\u5b9e\u73b0\u8fde\u7eed\u5bf9\u8bdd\uff0c\u4e0d\u7136\u670d\u52a1\u4e00\u91cd\u542f\u5c31\u4ec0\u4e48\u90fd\u6ca1\u4e86\u2026\u2026\u6240\u4ee5\uff0c\u5fc5\u987b\u6301\u4e45\u5316<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u75db\u70b92\u4e2a<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6301\u4e45\u5316\u5a92\u4ecb<\/li>\n\n\n\n<li>\u6d88\u606f\u5bf9\u8bdd\u7a97\u53e3\uff0c\u804a\u5929\u8bb0\u5f55\u4e0a\u9650<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u6301\u4e45\u5316\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">\u524d\u7f6e\u77e5\u8bc6<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ChatMemoryRepository\u63a5\u53e3<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-338-1024x459.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"459\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-338-1024x459.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8772\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>1.\u5b9e\u73b0SpringAI\u6846\u67b6\u89c4\u5b9a\u7684ChatMemoryRepository\u63a5\u53e3<\/p>\n\n\n\n<p>2.\u63a5\u53e3ChatMemoryRepository<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-339-1024x366.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"366\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-339-1024x366.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8773\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>3.RedisChatMemoryRepository\u6e90\u7801<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-340-1024x554.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"554\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-340-1024x554.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8774\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>4.\u7f16\u7801\u65b0\u5efaRedisMemoryConfig\u914d\u7f6e\u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.memory.redis.RedisChatMemoryRepository;\nimport org.springframework.ai.chat.memory.ChatMemory;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-28 18:24\n * @Description TODO\n *\/\n@Configuration\npublic class RedisMemoryConfig\n{\n    @Value(\"${spring.data.redis.host}\")\n    private String host;\n    @Value(\"${spring.data.redis.port}\")\n    private int port;\n\n    @Bean\n    public RedisChatMemoryRepository redisChatMemoryRepository()\n    {\n        return RedisChatMemoryRepository.builder()\n                    .host(host)\n                    .port(port)\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MessageWindowChatMemory \u6d88\u606f\u7a97\u53e3\u804a\u5929\u8bb0\u5fc6<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-341.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"918\" height=\"519\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-341.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8775\"  sizes=\"(max-width: 918px) 100vw, 918px\" \/><\/div><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u987e\u95ee\uff08Advisors\uff09MessageChatMemoryAdvisor<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-342-1024x356.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"356\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-342-1024x356.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8776\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-343-1024x616.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"616\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-343-1024x616.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8777\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-345.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"912\" height=\"612\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-345.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8779\"  sizes=\"(max-width: 912px) 100vw, 912px\" \/><\/div><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">\u914d\u7f6e\u7c7bSaaLLMConfig<\/h5>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-347-1024x682.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"682\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-347-1024x682.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8781\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">controller<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport static org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.function.Consumer;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-28 18:40\n * @Description TODO\n *\/\n@RestController\npublic class ChatMemory4RedisController\n{\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient qwenChatClient;\n\n    @GetMapping(\"\/chatmemory\/chat\")\n    public String chat(String msg, String userId)\n    {\n        \/*return qwenChatClient.prompt(msg).advisors(new Consumer&lt;ChatClient.AdvisorSpec>()\n        {\n            @Override\n            public void accept(ChatClient.AdvisorSpec advisorSpec)\n            {\n                advisorSpec.param(CONVERSATION_ID, cid);\n            }\n        }).call().content();*\/\n\n        return qwenChatClient.prompt(msg)\n                .advisors(advisorSpec -> advisorSpec.param(CONVERSATION_ID, userId))\n                .call()\n                .content();\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u6d4b\u8bd5<\/h4>\n\n\n\n<p>http:\/\/localhost:8008\/chatmemory\/chat?msg=2\u52a05\u7b49\u4e8e\u591a\u5c11&#038;userId=7<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-348.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"570\" height=\"207\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-348.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8782\"  sizes=\"(max-width: 570px) 100vw, 570px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">10.\u6587\u751f\u56fe<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u963f\u91cc\u767e\u70bc\u6587\u751f\u56fe<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-349-1024x495.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"495\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-349-1024x495.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8783\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/help.aliyun.com\/zh\/model-studio\/text-to-image?spm=a2c4g.11186623.help-menu-2400256.d_0_5_0.1a457d9dv6o7Kc&amp;accounttraceid=6ec3bf09599f424a91a2a88b27b31570nrdd\">https:\/\/help.aliyun.com\/zh\/model-studio\/text-to-image?spm=a2c4g.11186623.help-menu-2400256.d_0_5_0.1a457d9dv6o7Kc&amp;accounttraceid=6ec3bf09599f424a91a2a88b27b31570nrdd<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<p>\u901a\u4e49\u4e07\u76f8-\u6587\u751f\u56feV2\u7248API\u53c2\u8003<\/p>\n\n\n\n<p><a href=\"https:\/\/help.aliyun.com\/zh\/model-studio\/text-to-image-v2-api-reference?spm=a2c4g.11186623.0.0.79c74680qv54KQ\">https:\/\/help.aliyun.com\/zh\/model-studio\/text-to-image-v2-api-reference?spm=a2c4g.11186623.0.0.79c74680qv54KQ<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u65b0\u5efa\u5b50\u6a21\u5757Module<\/h4>\n\n\n\n<p>SAA-09Text2image<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>SAA-09Text2image&lt;\/artifactId>\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--spring-ai-alibaba dashscope-->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8009\n\n# \u8bbe\u7f6e\u54cd\u5e94\u7684\u5b57\u7b26\u7f16\u7801\nserver.servlet.encoding.charset=utf-8\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\n\nspring.application.name=SAA-09Text2image\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e3b\u542f\u52a8<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa09Text2imageApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa09Text2imageApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisModel;\nimport com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisOptions;\nimport com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisModel;\nimport com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisOptions;\nimport com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisPrompt;\nimport com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisResponse;\nimport com.alibaba.cloud.ai.dashscope.image.DashScopeImageOptions;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.image.ImageModel;\nimport org.springframework.ai.image.ImagePrompt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.nio.ByteBuffer;\nimport java.util.UUID;\n\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-28 20:10\n * @Description \u77e5\u8bc6\u51fa\u5904\n * https:\/\/help.aliyun.com\/zh\/model-studio\/text-to-image?spm=a2c4g.11186623.help-menu-2400256.d_0_5_0.1a457d9dv6o7Kc&amp;accounttraceid=6ec3bf09599f424a91a2a88b27b31570nrdd\n *\/\n@RestController\npublic class Text2ImageController\n{\n    \/\/ img model\n    public static final String IMAGE_MODEL = \"wanx2.1-t2i-turbo\";\n\n    @Resource\n    private ImageModel imageModel;\n\n    @GetMapping(value = \"\/t2i\/image\")\n    public String image(@RequestParam(name = \"prompt\",defaultValue = \"\u523a\u732c\") String prompt)\n    {\n        return imageModel.call(\n                    new ImagePrompt(prompt, DashScopeImageOptions.builder().withModel(IMAGE_MODEL).build())\n                )\n                .getResult()\n                .getOutput()\n                .getUrl();\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">11.\u6587\u751f\u97f3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u963f\u91cc\u767e\u70bc\u6587\u751f\u97f3<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u8bed\u97f3\u5408\u6210-CosyVoice<\/h4>\n\n\n\n<p><a href=\"https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-large-model-for-speech-synthesis\/?spm=a2c4g.11186623.help-menu-2400256.d_2_6_0.2a7474473XyDNE&amp;scm=20140722.H_2817551._.OR_help-T_cn~zh-V_1\">https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-large-model-for-speech-synthesis\/?spm=a2c4g.11186623.help-menu-2400256.d_2_6_0.2a7474473XyDNE&amp;scm=20140722.H_2817551._.OR_help-T_cn~zh-V_1<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u8bed\u97f3\u5408\u6210CosyVoice Java SDK<\/h4>\n\n\n\n<p><a href=\"https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-java-sdk?spm=a2c4g.11186623.0.0.77e07447jgP4N0\">https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-java-sdk?spm=a2c4g.11186623.0.0.77e07447jgP4N0<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">SpeechSynthesizer\u7c7b\u63d0\u4f9b\u4e86\u8bed\u97f3\u5408\u6210\u7684\u5173\u952e\u63a5\u53e3<\/h4>\n\n\n\n<p>\u540c\u6b65\u63d0\u4ea4\u8bed\u97f3\u5408\u6210\u4efb\u52a1\uff0c\u76f4\u63a5\u83b7\u53d6\u5b8c\u6574\u7ed3\u679c<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-350-1024x372.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"372\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-350-1024x372.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8784\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u63d0\u4ea4\u6587\u672c\u540e\uff0c\u670d\u52a1\u7aef\u7acb\u5373\u5904\u7406\u5e76\u8fd4\u56de\u5b8c\u6574\u7684\u8bed\u97f3\u5408\u6210\u7ed3\u679c\u3002\u6574\u4e2a\u8fc7\u7a0b\u662f\u963b\u585e\u5f0f\u7684\uff0c\u5ba2\u6237\u7aef\u9700\u8981\u7b49\u5f85\u670d\u52a1\u7aef\u5b8c\u6210\u5904\u7406\u540e\u624d\u80fd\u7ee7\u7eed\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002\u9002\u5408\u77ed\u6587\u672c\u8bed\u97f3\u5408\u6210\u573a\u666f<\/p>\n\n\n\n<p>\u963f\u91cc\u5185\u7f6e\u63a5\u53e3\u4e00\u89c8<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-351-1024x434.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"434\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-351-1024x434.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8785\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">DashScopeSpeechSynthesisOptions<\/h4>\n\n\n\n<p>SpeechSynthesisParam\u7684\u94fe\u5f0f\u65b9\u6cd5\u914d\u7f6e\u6a21\u578b\u3001\u97f3\u8272\u7b49\u53c2\u6570<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-352.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"812\" height=\"634\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-352.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8786\"  sizes=\"(max-width: 812px) 100vw, 812px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-java-sdk#2e9a9a89aclc8\">https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-java-sdk#2e9a9a89aclc8<\/a><\/p>\n\n\n\n<p>\u4ee3\u7801\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-353-1024x546.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"546\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-353-1024x546.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8787\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u65b0\u5efa\u5b50\u6a21\u5757Module<\/h4>\n\n\n\n<p>SAA-10Text2voice<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>SAA-10Text2voice&lt;\/artifactId>\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--spring-ai-alibaba dashscope-->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8010\n\n# \u8bbe\u7f6e\u54cd\u5e94\u7684\u5b57\u7b26\u7f16\u7801\nserver.servlet.encoding.charset=utf-8\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\n\nspring.application.name=SAA-10Text2voice\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e3b\u542f\u52a8<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa10Text2voiceApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa10Text2voiceApplication.class, args);\n    }\n\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<p>\u97f3\u8272\u5217\u8868\u914d\u7f6e<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-354.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"805\" height=\"642\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-354.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8788\"  sizes=\"(max-width: 805px) 100vw, 805px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-java-sdk#722dd7ca66a6x\">https:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-java-sdk#722dd7ca66a6x<\/a><\/p>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisOptions;\nimport com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisModel;\nimport com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisPrompt;\nimport com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisResponse;\nimport jakarta.annotation.Resource;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.io.FileOutputStream;\nimport java.nio.ByteBuffer;\nimport java.util.UUID;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-29 18:35\n * @Description TODO\n *\/\n@RestController\npublic class Text2VoiceController\n{\n    @Resource\n    private SpeechSynthesisModel speechSynthesisModel;\n\n    \/\/ voice model\n    public static final String BAILIAN_VOICE_MODEL = \"cosyvoice-v2\";\n    \/\/ voice timber \u97f3\u8272\u5217\u8868\uff1ahttps:\/\/help.aliyun.com\/zh\/model-studio\/cosyvoice-java-sdk#722dd7ca66a6x\n    public static final String BAILIAN_VOICE_TIMBER = \"longyingcui\";\/\/\u9f99\u5e94\u50ac\n\n\n    \/**\n     * http:\/\/localhost:8010\/t2v\/voice\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/t2v\/voice\")\n    public String voice(@RequestParam(name = \"msg\",defaultValue = \"\u6e29\u99a8\u63d0\u9192\uff0c\u652f\u4ed8\u5b9d\u5230\u8d26100\u5143\u8bf7\u6ce8\u610f\u67e5\u6536\") String msg)\n    {\n        String filePath = \"d:\\\\\" + UUID.randomUUID() + \".mp3\";\n\n        \/\/1 \u8bed\u97f3\u53c2\u6570\u8bbe\u7f6e\n        DashScopeSpeechSynthesisOptions options = DashScopeSpeechSynthesisOptions.builder()\n                .model(BAILIAN_VOICE_MODEL)\n                .voice(BAILIAN_VOICE_TIMBER)\n                .build();\n\n        \/\/2 \u8c03\u7528\u5927\u6a21\u578b\u8bed\u97f3\u751f\u6210\u5bf9\u8c61\n        SpeechSynthesisResponse response = speechSynthesisModel.call(new SpeechSynthesisPrompt(msg, options));\n\n        \/\/3 \u5b57\u8282\u6d41\u8bed\u97f3\u8f6c\u6362\n        ByteBuffer byteBuffer = response.getResult().getOutput().getAudio();\n\n        \/\/4 \u6587\u4ef6\u751f\u6210\n        try (FileOutputStream fileOutputStream = new FileOutputStream(filePath))\n        {\n            fileOutputStream.write(byteBuffer.array());\n        } catch (Exception e) {\n            System.out.println(e.getMessage());\n        }\n        \/\/5 \u751f\u6210\u8def\u5f84OK\n        return filePath;\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">12.\u5411\u91cf\u5316\u548c\u5411\u91cf\u6570\u636e\u5e93<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u5411\u91cf<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-355-1024x189.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"189\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-355-1024x189.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8789\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u6587\u672c\u5411\u91cf\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u662f\u4ec0\u4e48<\/h4>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-356-1024x443.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"443\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-356-1024x443.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8790\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5b98\u7f51-\u5d4c\u5165\u6a21\u578b (Embedding Model)<\/p>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/embedding\/?spm=5176.29160081.0.0.2856aa5cXggpMJ\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/embedding\/?spm=5176.29160081.0.0.2856aa5cXggpMJ<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-357.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"805\" height=\"508\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-357.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8791\"  sizes=\"(max-width: 805px) 100vw, 805px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u6848\u4f8b1<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-358.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"919\" height=\"758\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-358.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8792\"  sizes=\"(max-width: 919px) 100vw, 919px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-359.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"943\" height=\"695\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-359.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8793\"  sizes=\"(max-width: 943px) 100vw, 943px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u6848\u52172<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-360.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"587\" height=\"520\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-360.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8794\"  sizes=\"(max-width: 587px) 100vw, 587px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u5d4c\u5165\u6a21\u578b\u5c0f\u603b\u7ed3<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-361.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1004\" height=\"183\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-361.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8795\"  sizes=\"(max-width: 1004px) 100vw, 1004px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3.\u5411\u91cf\u6570\u636e\u5e93<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u5411\u91cf\u5b58\u50a8\u662f\u4ec0\u4e48<\/h4>\n\n\n\n<p>\u5b98\u7f51-\u5411\u91cf\u5b58\u50a8(Vector Store\uff09<\/p>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/vectorstore\/?spm=5176.29160081.0.0.2856aa5cXggpMJ\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/vectorstore\/?spm=5176.29160081.0.0.2856aa5cXggpMJ<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-362.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"772\" height=\"601\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-362.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8796\"  sizes=\"(max-width: 772px) 100vw, 772px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e00\u53e5\u8bdd\uff1a\u4e00\u79cd\u4e13\u95e8\u7528\u4e8e\u5b58\u50a8\u3001\u7ba1\u7406\u548c\u68c0\u7d22\u5411\u91cf\u6570\u636e\uff08\u5373\u9ad8\u7ef4\u6570\u503c\u6570\u7ec4\uff09\u7684\u6570\u636e\u5e93\u7cfb\u7edf\u3002<\/p>\n\n\n\n<p>\u5176\u6838\u5fc3\u529f\u80fd\u662f\u901a\u8fc7\u9ad8\u6548\u7684\u7d22\u5f15\u7ed3\u6784\u548c\u76f8\u4f3c\u6027\u8ba1\u7b97\u7b97\u6cd5\uff0c\u652f\u6301\u5927\u89c4\u6a21\u5411\u91cf\u6570\u636e\u7684\u5feb\u901f\u67e5\u8be2\u4e0e\u5206\u6790\uff0c\u5411\u91cf\u6570\u636e\u5e93\u7ef4\u5ea6\u8d8a\u9ad8\uff0c\u67e5\u8be2\u7cbe\u51c6\u5ea6\u4e5f\u8d8a\u9ad8\uff0c\u67e5\u8be2\u6548\u679c\u4e5f\u8d8a\u597d\u3002<\/p>\n\n\n\n<p>\u4e0b\u65b9\u662fLangChain4J\u652f\u6301\u7684\u5411\u91cf\u6570\u636e\u5e93List\u6e05\u5355<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.langchain4j.dev\/integrations\/embedding-stores\">https:\/\/docs.langchain4j.dev\/integrations\/embedding-stores<\/a><\/p>\n\n\n\n<p>\u4e0b\u65b9\u662fSpringAI\u652f\u6301\u7684\u5411\u91cf\u6570\u636e\u5e93List\u6e05\u5355<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs.html\">https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs.html<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u5411\u91cf\u6570\u636e\u5e93\u80fd\u5e72\u561b<\/h4>\n\n\n\n<p>\u5c06\u6587\u672c\u3001\u56fe\u50cf\u548c\u89c6\u9891\u8f6c\u6362\u4e3a\u79f0\u4e3a\u5411\u91cf\uff08Vectors\uff09\u7684\u6d6e\u70b9\u6570\u6570\u7ec4\u5728 VectorStore\u4e2d\uff0c\u67e5\u8be2\u4e0e\u4f20\u7edf\u5173\u7cfb\u6570\u636e\u5e93\u4e0d\u540c\u3002\u5b83\u4eec\u6267\u884c\u76f8\u4f3c\u6027\u641c\u7d22\uff0c\u800c\u4e0d\u662f\u7cbe\u786e\u5339\u914d\u3002\u5f53\u7ed9\u5b9a\u4e00\u4e2a\u5411\u91cf\u4f5c\u4e3a\u67e5\u8be2\u65f6\uff0cVectorStore \u8fd4\u56de\u4e0e\u67e5\u8be2\u5411\u91cf\u201c\u76f8\u4f3c\u201d\u7684\u5411\u91cf<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">\u6307\u5f81\u7279\u70b9<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6355\u6349\u590d\u6742\u7684\u8bcd\u6c47\u5173\u7cfb\uff08\u5982\u8bed\u4e49\u76f8\u4f3c\u6027\u3001\u540c\u4e49\u8bcd\u3001\u591a\u4e49\u8bcd\uff09<\/li>\n\n\n\n<li>\u5411\u91cf\u5d4c\u5165\u4e3a\u68c0\u7d22\u589e\u5f3a\u751f\u6210 (RAG) \u5e94\u7528\u7a0b\u5e8f\u63d0\u4f9b\u652f\u6301<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">\u5c0f\u603b\u7ed3<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c06\u6587\u672c\u6620\u5c04\u5230\u9ad8\u7ef4\u7a7a\u95f4\u4e2d\u7684\u70b9\uff0c\u4f7f\u8bed\u4e49\u76f8\u4f3c\u7684\u6587\u672c\u5728\u8fd9\u4e2a\u7a7a\u95f4\u4e2d\u8ddd\u79bb\u8f83\u8fd1\u3002\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5982\uff0c\u201c\u80af\u5fb7\u57fa\u201d\u548c\u201d\u9ea6\u5f53\u52b3\u201d\u7684\u5411\u91cf\u53ef\u80fd\u4f1a\u6bd4\u201d\u80af\u5fb7\u57fa\u201d\u548c\u201d\u65b0\u7586\u5927\u76d8\u9e21\u201d\u7684\u5411\u91cf\u66f4\u63a5\u8fd1<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u7528redisStack\u4f5c\u4e3a\u5411\u91cf\u5b58\u50a8<\/h4>\n\n\n\n<p><a href=\"https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs\/redis.html\">https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs\/redis.html<\/a><\/p>\n\n\n\n<p>RedisStack\u662f\u4ec0\u4e48<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-363.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"758\" height=\"56\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-363.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8797\"  sizes=\"(max-width: 758px) 100vw, 758px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-364.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"909\" height=\"386\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-364.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8798\"  sizes=\"(max-width: 909px) 100vw, 909px\" \/><\/div><\/figure>\n\n\n\n<p>RedisStack\u6838\u5fc3\u7ec4\u4ef6<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RediSearch\uff1a\u63d0\u4f9b\u5168\u6587\u641c\u7d22\u80fd\u529b\uff0c\u652f\u6301\u590d\u6742\u7684\u6587\u672c\u641c\u7d22\u3001\u805a\u5408\u548c\u8fc7\u6ee4\uff0c\u4ee5\u53ca\u5411\u91cf\u6570\u636e\u7684\u5b58\u50a8\u548c\u68c0\u7d22<\/li>\n\n\n\n<li>RedisJSON\uff1a\u539f\u751f\u652f\u6301JSON\u6570\u636e\u7684\u5b58\u50a8\u3001\u7d22\u5f15I\u548c\u67e5\u8be2\uff0c\u53ef\u9ad8\u6548\u5b58\u50a8\u548c\u64cd\u4f5c\u5d4c\u5957\u7684JSON\u6587\u6863\u3002<\/li>\n\n\n\n<li>RedisGraph\uff1a\u652f\u6301\u56fe\u6570\u636e\u6a21\u578b\uff0c\u4f7f\u7528Cypher\u67e5\u8be2\u8bed\u8a00\u8fdb\u884c\u56fe\u904d\u5386\u67e5\u8be2\u3002<\/li>\n\n\n\n<li>RedisBloom:\u652f\u6301 Bloom\u3001Cuckoo\u3001Count-Min Sketch\u7b49\u6982\u7387\u6570\u636e\u7ed3\u6784\u3002<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>\u4e00\u53e5\u8bdd(\u91cd\u8981)<\/strong><\/h5>\n\n\n\n<p>RedisStack = \u539f\u751fRedis + \u641c\u7d22 + \u56fe + \u65f6\u95f4\u5e8f\u5217 + JSON + \u6982\u7387\u7ed3\u6784 + \u53ef\u89c6\u5316\u5de5\u5177 + \u5f00\u53d1\u6846\u67b6\u652f\u6301<\/p>\n\n\n\n<p>RedisStack\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name redis-stack-server -p 6379:6379 redis\/redis-stack-server<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u57fa\u7840api<\/h5>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-365.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"632\" height=\"432\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-365.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8799\"  sizes=\"(max-width: 632px) 100vw, 632px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u4e1a\u52a1\u7c7b<\/h4>\n\n\n\n<p>\u77e5\u8bc6\u51fa\u5904<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs.html\">https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs.html<\/a><\/p>\n\n\n\n<p>controller \u6587\u672c\u5411\u91cf\u5316 \u5411\u91cf\u5316\u5b58\u50a8 \u5411\u91cf\u5316\u67e5\u8be2<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingOptions;\nimport jakarta.annotation.Resource;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.ai.document.Document;\nimport org.springframework.ai.embedding.EmbeddingModel;\nimport org.springframework.ai.embedding.EmbeddingRequest;\nimport org.springframework.ai.embedding.EmbeddingResponse;\nimport org.springframework.ai.vectorstore.SearchRequest;\nimport org.springframework.ai.vectorstore.VectorStore;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-29 19:54\n * @Description TODO\n *\/\n@RestController\n@Slf4j\npublic class Embed2VectorController\n{\n    @Resource\n    private EmbeddingModel embeddingModel;\n\n    @Resource\n    private VectorStore vectorStore;\n\n    \/**\n     * \u6587\u672c\u5411\u91cf\u5316\n     * http:\/\/localhost:8011\/text2embed?msg=\u5c04\u96d5\u82f1\u96c4\u4f20\n     *\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/text2embed\")\n    public EmbeddingResponse text2Embed(String msg)\n    {\n        \/\/EmbeddingResponse embeddingResponse = embeddingModel.call(new EmbeddingRequest(List.of(msg), null));\n\n        EmbeddingResponse embeddingResponse = embeddingModel.call(new EmbeddingRequest(List.of(msg),\n                DashScopeEmbeddingOptions.builder().withModel(\"text-embedding-v3\").build()));\n\n        System.out.println(Arrays.toString(embeddingResponse.getResult().getOutput()));\n\n        return embeddingResponse;\n    }\n\n    @GetMapping(\"\/embed2vector\/add\")\n    public void add()\n    {\n        List&lt;Document> documents = List.of(\n                new Document(\"i study LLM\"),\n                new Document(\"i love java\")\n        );\n\n        vectorStore.add(documents);\n    }\n\n    @GetMapping(\"\/embed2vector\/get\")\n    public List getAll(@RequestParam(name = \"msg\") String msg)\n    {\n        SearchRequest searchRequest = SearchRequest.builder()\n                .query(msg)\n                .topK(2)\n                .build();\n\n        List&lt;Document> list = vectorStore.similaritySearch(searchRequest);\n\n        System.out.println(list);\n\n        return list;\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>http:\/\/localhost:8011\/text2embed?msg=\u5c04\u96d5\u82f1\u96c4\u4f20<\/li>\n\n\n\n<li>http:\/\/localhost:8011\/embed2vector\/get?msg=LLM<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-366-1024x469.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"469\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-366-1024x469.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8800\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">3.\u5b9e\u73b0\u539f\u7406<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-367.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"711\" height=\"548\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-367.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8801\"  sizes=\"(max-width: 711px) 100vw, 711px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">13.RAG\uff08Retrieval Augmented Generation\uff09<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u524d\u8a00<\/h3>\n\n\n\n<p>RAG (Retrieval-Augmented Generation)\u68c0\u7d22\u589e\u5f3a\u751f\u6210<\/p>\n\n\n\n<p>\u9700\u6c42<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AI\u667a\u80fd\u8fd0\u7ef4\u52a9\u624b\uff0c\u901a\u8fc7\u63d0\u4f9b\u7684\u9519\u8bef\u7f16\u7801\uff0c\u7ed9\u51fa\u5f02\u5e38\u89e3\u91ca\u8f85\u52a9\u8fd0\u7ef4\u4eba\u5458\u66f4\u597d\u7684\u5b9a\u4f4d\u95ee\u9898\u548c\u7ef4\u62a4\u7cfb\u7edf<\/li>\n\n\n\n<li>SpringAI+\u963f\u91cc\u767e\u70bc\u5d4c\u5165\u6a21\u578btext-embedding-v3+\u5411\u91cf\u6570\u636e\u5e93RedisStack+DeepSeek\u6765\u5b9e\u73b0RAG\u529f\u80fd\u3002<\/li>\n<\/ul>\n\n\n\n<p>LLM\u7684\u7f3a\u9677<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>LLM\u7684\u77e5\u8bc6\u4e0d\u662f\u5b9e\u65f6\u7684\uff0c\u4e0d\u5177\u5907\u77e5\u8bc6\u66f4\u65b0.<\/li>\n\n\n\n<li>LLM\u53ef\u80fd\u4e0d\u77e5\u9053\u4f60\u79c1\u6709\u7684\u9886\u57df\/\u4e1a\u52a1\u77e5\u8bc6.<\/li>\n\n\n\n<li>LLM\u6709\u65f6\u4f1a\u5728\u56de\u7b54\u4e2d\u751f\u6210\u770b\u4f3c\u5408\u7406\u4f46\u5b9e\u9645\u4e0a\u662f\u9519\u8bef\u7684\u4fe1\u606f<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.RAG\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<p>\u5b98\u7f51<\/p>\n\n\n\n<p>RAG (Retrieval-Augmented Generation)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-368.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"855\" height=\"251\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-368.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8804\"  sizes=\"(max-width: 855px) 100vw, 855px\" \/><\/div><\/figure>\n\n\n\n<p>LLM \u7684\u77e5\u8bc6\u4ec5\u9650\u4e8e\u5b83\u6240\u63a5\u53d7\u7684\u8bad\u7ec3\u6570\u636e\u3002\u5982\u679c\u4f60\u60f3\u8ba9\u4e00\u4e2a LLM \u4e86\u89e3\u7279\u5b9a\u9886\u57df\u7684\u77e5\u8bc6\u6216\u4e13\u6709\u6570\u636e\uff0c\u4f60\u53ef\u4ee5<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u4ec0\u4e48\u662fRAG?<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-369.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"790\" height=\"121\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-369.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8805\"  sizes=\"(max-width: 790px) 100vw, 790px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u5e7b\u89c9\uff1f<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5df2\u8bfb\u4e71\u56de<\/li>\n\n\n\n<li>\u5df2\u8bfb\u4e0d\u56de<\/li>\n\n\n\n<li>\u4f3c\u662f\u800c\u975e<\/li>\n<\/ul>\n\n\n\n<p>springai\u4e2d\u7684RAG<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.spring.io\/spring-ai\/reference\/api\/retrieval-augmented-generation.html\">https:\/\/docs.spring.io\/spring-ai\/reference\/api\/retrieval-augmented-generation.html<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">springai alibaba\u4e2d\u7684RAG\u53eb\u505a\u6587\u6863\u68c0\u7d22 (Document Retriever)<\/h4>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/retriever\/?spm=5176.29160081.0.0.2856aa5cXggpMJ\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/retriever\/?spm=5176.29160081.0.0.2856aa5cXggpMJ<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-370-1024x483.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"483\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-370-1024x483.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8806\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3.RAG\u6838\u5fc3\u8bbe\u8ba1\u7406\u5ff5<\/h3>\n\n\n\n<p>RAG\u6280\u672f\u5c31\u50cf\u7ed9AI\u5927\u6a21\u578b\u88c5\u4e0a\u4e86\u300c\u5b9e\u65f6\u767e\u79d1\u5927\u8111\u300d\uff0c\u4e3a\u4e86\u8ba9\u5927\u6a21\u578b\u83b7\u53d6\u8db3\u591f\u7684\u4e0a\u4e0b\u6587\uff0c\u4ee5\u4fbf\u83b7\u5f97\u66f4\u52a0\u5e7f\u6cdb\u7684\u4fe1\u606f\u6e90\uff0c\u901a\u8fc7\u5148\u67e5\u8d44\u6599\u540e\u56de\u7b54\u7684\u673a\u5236\uff0c\u8ba9AI\u6446\u8131\u4f20\u7edf\u6a21\u578b\u7684\u201d\u77e5\u8bc6\u9057\u5fd8\u548c\u5e7b\u89c9\u56de\u590d\u201d\u56f0\u5883<\/p>\n\n\n\n<p>\u4e00\u53e5\u8bdd<\/p>\n\n\n\n<p>\u7c7b\u4f3c\u8003\u8bd5\u65f6\u6709\u4e0d\u61c2\u7684\uff0c\u7ed9\u4f60\u51c6\u5907\u4e86\u5c0f\u6284\uff0c\u5bf9\u5927\u6a21\u578b\u77e5\u8bc6\u76f2\u533a\u7684\u4e00\u79cd\u8865\u5145<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.RAG\u80fd\u5e72\u561b<\/h3>\n\n\n\n<p>\u901a\u8fc7\u5f15\u5165\u5916\u90e8\u77e5\u8bc6\u6e90\u6765\u589e\u5f3aLLM\u7684\u8f93\u51fa\u80fd\u529b\uff0c\u4f20\u7edf\u7684LLM\u901a\u5e38\u57fa\u4e8e\u5176\u8bad\u7ec3\u6570\u636e\u751f\u6210\u54cd\u5e94\uff0c\u4f46\u8fd9\u4e9b\u6570\u636e\u53ef\u80fd\u8fc7\u65f6\u6216\u4e0d\u591f\u5168\u9762\u3002RAG\u5141\u8bb8\u6a21\u578b\u5728\u751f\u6210\u7b54\u6848\u4e4b\u524d\uff0c\u4ece\u7279\u5b9a\u7684\u77e5\u8bc6\u5e93\u4e2d\u68c0\u7d22\u76f8\u5173\u4fe1\u606f\uff0c\u4ece\u800c\u63d0\u4f9b\u66f4\u51c6\u786e\u548c\u4e0a\u4e0b\u6587\u76f8\u5173\u7684\u56de\u7b54<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.RAG\u600e\u4e48\u7528<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-371.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"852\" height=\"163\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-371.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8807\"  sizes=\"(max-width: 852px) 100vw, 852px\" \/><\/div><\/figure>\n\n\n\n<p>RAG\u6d41\u7a0b\u5206\u4e3a\u4e24\u4e2a\u4e0d\u540c\u7684\u9636\u6bb5\uff1a\u7d22\u5f15\u548c\u68c0\u7d22<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-372.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"850\" height=\"527\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-372.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8808\"  sizes=\"(max-width: 850px) 100vw, 850px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-373.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"886\" height=\"171\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-373.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8809\"  sizes=\"(max-width: 886px) 100vw, 886px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-374.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"847\" height=\"451\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-374.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8810\"  sizes=\"(max-width: 847px) 100vw, 847px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-375.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"892\" height=\"112\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-375.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8811\"  sizes=\"(max-width: 892px) 100vw, 892px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">6.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<p>\u9700\u6c42\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AI\u667a\u80fd\u8fd0\u7ef4\u52a9\u624b\uff0c\u901a\u8fc7\u63d0\u4f9b\u7684\u9519\u8bef\u7f16\u7801\uff0c\u7ed9\u51fa\u5f02\u5e38\u89e3\u91ca\u8f85\u52a9\u8fd0\u7ef4\u4eba\u5458\u66f4\u597d\u7684\u5b9a\u4f4d\u95ee\u9898\u548c\u7ef4\u62a4\u7cfb\u7edf<\/li>\n\n\n\n<li>SpringAI+\u963f\u91cc\u767e\u70bc\u5d4c\u5165\u6a21\u578btext-embedding-v3+\u5411\u91cf\u6570\u636e\u5e93RedisStack+DeepSeek\u6765\u5b9e\u73b0RAG\u529f\u80fd\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u5efaModule<\/h4>\n\n\n\n<p>SAA-12RAG4AiOps<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>SAA-12RAG4AiOps&lt;\/artifactId>\n\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--spring-ai-alibaba dashscope-->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!-- \u6dfb\u52a0 Redis \u5411\u91cf\u6570\u636e\u5e93\u4f9d\u8d56 -->\n        &lt;dependency>\n            &lt;groupId>org.springframework.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-starter-vector-store-redis&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8012\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-12RAG4AiDatabase\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}\nspring.ai.dashscope.chat.options.model=deepseek-r1\nspring.ai.dashscope.embedding.options.model=text-embedding-v3\n\n\n# =======Redis Stack==========\nspring.data.redis.host=localhost\nspring.data.redis.port=6379\nspring.data.redis.username=default\nspring.data.redis.password=\nspring.ai.vectorstore.redis.initialize-schema=true\nspring.ai.vectorstore.redis.index-name=atguigu-index\nspring.ai.vectorstore.redis.prefix=atguigu-prefix<\/code><\/pre>\n\n\n\n<p>\u963f\u91cc\u4e91\u767e\u70bc\u5e73\u53f0\u5411\u91cf\u5927\u6a21\u578b text-embedding-v3<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-376-1024x505.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"505\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-376-1024x505.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8812\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u914d\u7f6e\u53c2\u8003\u4fe1\u606f\u6765\u6e90\u548c\u77e5\u8bc6\u51fa\u5904<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs\/redis.html\">https:\/\/docs.spring.io\/spring-ai\/reference\/api\/vectordbs\/redis.html<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-377.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"889\" height=\"211\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-377.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8813\"  sizes=\"(max-width: 889px) 100vw, 889px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e3b\u542f\u52a8<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa12Rag4AiOpsApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n\n        SpringApplication.run(Saa12Rag4AiOpsApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u63d0\u4f9bErrorCode\u811a\u672c\u8ba9\u4ed6\u5b58\u5165\u5411\u91cf\u6570\u636e\u5e93RedisStack\uff0c\u5f62\u6210\u6587\u6863\u77e5\u8bc6\u5e93<\/h4>\n\n\n\n<p>ops.txt<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>00000 \u7cfb\u7edfOK\u6b63\u786e\u6267\u884c\u540e\u7684\u8fd4\u56de\nA0001 \u7528\u6237\u7aef\u9519\u8bef\u4e00\u7ea7\u5b8f\u89c2\u9519\u8bef\u7801\nA0100 \u7528\u6237\u6ce8\u518c\u9519\u8bef\u4e8c\u7ea7\u5b8f\u89c2\u9519\u8bef\u7801\nB1111 \u652f\u4ed8\u63a5\u53e3\u8d85\u65f6\nC2222 Kafka\u6d88\u606f\u89e3\u538b\u4e25\u91cd<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.\u4e1a\u52a1\u7c7b\u7b2c\u4e00\u7248<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">SpringAI\u6e90\u4ee3\u7801\u63a5\u53e3 VectorStore<\/h4>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-378-1024x375.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"375\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-378-1024x375.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8814\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u7528redis\u4f5c\u4e3a\u5411\u91cf\u5b58\u50a8<\/h4>\n\n\n\n<p>\u5b89\u88c5 redis-stack-server<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name redis-stack-server -p 6379:6379 redis\/redis-stack-server<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-379.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"632\" height=\"432\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-379.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8815\"  sizes=\"(max-width: 632px) 100vw, 632px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u914d\u7f6e\u7c7b<\/h4>\n\n\n\n<p>\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;\nimport org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;\nimport org.springframework.ai.vectorstore.VectorStore;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-25 18:53\n * @Description ChatModel+ChatClient+\u591a\u6a21\u578b\u5171\u5b58\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    \/\/ \u6a21\u578b\u540d\u79f0\u5e38\u91cf\u5b9a\u4e49\n    private final String DEEPSEEK_MODEL = \"deepseek-v3\";\n    private final String QWEN_MODEL = \"qwen-plus\";\n\n    @Bean(name = \"deepseek\")\n    public ChatModel deepSeek()\n    {\n        return DashScopeChatModel.builder()\n                        .dashScopeApi(DashScopeApi.builder()\n                                    .apiKey(System.getenv(\"aliQwen-api\"))\n                                .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder().withModel(DEEPSEEK_MODEL).build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"qwen\")\n    public ChatModel qwen()\n    {\n        return DashScopeChatModel.builder().dashScopeApi(DashScopeApi.builder()\n                        .apiKey(System.getenv(\"aliQwen-api\"))\n                        .build())\n                .defaultOptions(\n                        DashScopeChatOptions.builder()\n                                .withModel(QWEN_MODEL)\n                                .build()\n                )\n                .build();\n    }\n\n    @Bean(name = \"deepseekChatClient\")\n    public ChatClient deepseekChatClient(@Qualifier(\"deepseek\") ChatModel deepSeek)\n    {\n        return ChatClient.builder(deepSeek)\n                .defaultOptions(ChatOptions.builder()\n                        .model(DEEPSEEK_MODEL)\n                        .build())\n                .build();\n    }\n\n\n    @Bean(name = \"qwenChatClient\")\n    public ChatClient qwenChatClient(@Qualifier(\"qwen\") ChatModel qwen)\n    {\n        return ChatClient.builder(qwen)\n                .defaultOptions(ChatOptions.builder()\n                        .model(QWEN_MODEL)\n                        .build())\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>InitVectorDatabaseConfig(\u7b2c\u4e00\u7248)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport cn.hutool.crypto.SecureUtil;\nimport jakarta.annotation.PostConstruct;\nimport org.springframework.ai.document.Document;\nimport org.springframework.ai.reader.TextReader;\nimport org.springframework.ai.transformer.splitter.TokenTextSplitter;\nimport org.springframework.ai.vectorstore.VectorStore;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.Resource;\nimport org.springframework.data.redis.core.RedisTemplate;\n\nimport java.nio.charset.Charset;\nimport java.util.List;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-30 12:16\n * @Description TODO\n *\/\n@Configuration\npublic class InitVectorDatabaseConfig\n{\n    @Autowired\n    private VectorStore vectorStore;\n\n    @Value(\"classpath:ops.txt\")\n    private Resource sqlFile;\n\n    @PostConstruct\n    public void init()\n    {\n        \/\/ 1.\u8bfb\u53d6\u6587\u4ef6\n        TextReader textReader = new TextReader(sqlFile);\n        textReader.setCharset(Charset.defaultCharset());\n        \/\/ 2.\u6587\u4ef6\u8f6c\u6362\u6210\u5411\u91cf\uff08\u5206\u8bcd\uff09\n        List&lt;Document> list = new TokenTextSplitter().transform(textReader.read());\n\n        \/\/ 3.\u5199\u5165\u5411\u91cf\u6570\u636e\u5e93\uff08Redis\uff09,\u65e0\u6cd5\u53bb\u91cd\u590d\u7248\n        vectorStore.add(list);\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Controller<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;\nimport org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;\nimport org.springframework.ai.vectorstore.VectorStore;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-30 12:21\n * @Description TODO\n *\/\n@RestController\npublic class RagController\n{\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient chatClient;\n    @Resource\n    private VectorStore vectorStore;\n\n    \/**\n     * http:\/\/localhost:8012\/rag4aiops?msg=00000\n     * http:\/\/localhost:8012\/rag4aiops?msg=C2222\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/rag4aiops\")\n    public Flux&lt;String> rag(String msg)\n    {\n        String systemInfo = \"\"\"\n                \u4f60\u662f\u4e00\u4e2a\u8fd0\u7ef4\u5de5\u7a0b\u5e08,\u6309\u7167\u7ed9\u51fa\u7684\u7f16\u7801\u7ed9\u51fa\u5bf9\u5e94\u6545\u969c\u89e3\u91ca,\u5426\u5219\u56de\u590d\u627e\u4e0d\u5230\u4fe1\u606f\u3002\n                \"\"\";\n\n        RetrievalAugmentationAdvisor advisor = RetrievalAugmentationAdvisor.builder()\n                .documentRetriever(\n                        VectorStoreDocumentRetriever.builder()\n                                .vectorStore(vectorStore)\n                                .build()\n                )\n                .build();\n\n        return chatClient.prompt()\n                .system(systemInfo)\n                .user(msg)\n                .advisors(advisor) \/\/ RAG\u529f\u80fd,\u5411\u91cf\u6570\u636e\u5e93\u67e5\u8be2\n                .stream()\n                .content();\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6d4b\u8bd5<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-380.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"690\" height=\"48\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-380.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8816\"  sizes=\"(max-width: 690px) 100vw, 690px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u5176\u5b83\u95ee\u9898<\/h4>\n\n\n\n<p>\u91cd\u542f\u4e0b\u5fae\u670d\u52a1\uff1a\u91cd\u590d\u6570\u636e\u5199\u5165\u95ee\u9898\u9700\u8003\u8651\uff0c\u4e0d\u7136\u6bcf\u6b21\u91cd\u542f\u90fd\u8981\u65b0\u589e<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-381.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"910\" height=\"800\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-381.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8817\"  sizes=\"(max-width: 910px) 100vw, 910px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">8.\u4e1a\u52a1\u7c7b\u7b2c\u4e8c\u7248 \u5411\u91cf\u6570\u636e\u5e93\u53bb\u91cd\u95ee\u9898\u89e3\u51b3<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u4f7f\u7528RedisSetNX\u53bb\u91cd<\/h4>\n\n\n\n<p>RedisConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;\nimport org.springframework.data.redis.serializer.StringRedisSerializer;\n\n\/**\n * @auther zzyy\n * @create 2024-03-07 10:45\n *\/\n@Configuration\n@Slf4j\npublic class RedisConfig\n{\n    \/**\n     * RedisTemplate\u914d\u7f6e\n     * redis\u5e8f\u5217\u5316\u7684\u5de5\u5177\u914d\u7f6e\u7c7b\uff0c\u4e0b\u9762\u8fd9\u4e2a\u8bf7\u4e00\u5b9a\u5f00\u542f\u914d\u7f6e\n     * 127.0.0.1:6379> keys *\n     * 1) \"ord:102\"  \u5e8f\u5217\u5316\u8fc7\n     * 2) \"\\xac\\xed\\x00\\x05t\\x00\\aord:102\"   \u91ce\u751f\uff0c\u6ca1\u6709\u5e8f\u5217\u5316\u8fc7\n     * this.redisTemplate.opsForValue(); \/\/\u63d0\u4f9b\u4e86\u64cd\u4f5cstring\u7c7b\u578b\u7684\u6240\u6709\u65b9\u6cd5\n     * this.redisTemplate.opsForList(); \/\/ \u63d0\u4f9b\u4e86\u64cd\u4f5clist\u7c7b\u578b\u7684\u6240\u6709\u65b9\u6cd5\n     * this.redisTemplate.opsForSet(); \/\/\u63d0\u4f9b\u4e86\u64cd\u4f5cset\u7684\u6240\u6709\u65b9\u6cd5\n     * this.redisTemplate.opsForHash(); \/\/\u63d0\u4f9b\u4e86\u64cd\u4f5chash\u8868\u7684\u6240\u6709\u65b9\u6cd5\n     * this.redisTemplate.opsForZSet(); \/\/\u63d0\u4f9b\u4e86\u64cd\u4f5czset\u7684\u6240\u6709\u65b9\u6cd5\n     * @param redisConnectionFactor\n     * @return\n     *\/\n    @Bean\n    public RedisTemplate&lt;String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactor)\n    {\n        RedisTemplate&lt;String,Object> redisTemplate = new RedisTemplate&lt;>();\n\n        redisTemplate.setConnectionFactory(redisConnectionFactor);\n        \/\/\u8bbe\u7f6ekey\u5e8f\u5217\u5316\u65b9\u5f0fstring\n        redisTemplate.setKeySerializer(new StringRedisSerializer());\n        \/\/\u8bbe\u7f6evalue\u7684\u5e8f\u5217\u5316\u65b9\u5f0fjson\uff0c\u4f7f\u7528GenericJackson2JsonRedisSerializer\u66ff\u6362\u9ed8\u8ba4\u5e8f\u5217\u5316\n        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());\n\n        redisTemplate.setHashKeySerializer(new StringRedisSerializer());\n        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());\n\n        redisTemplate.afterPropertiesSet();\n\n        return redisTemplate;\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">InitVectorDatabaseConfig(\u7b2c\u4e8c\u7248)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport cn.hutool.crypto.SecureUtil;\nimport jakarta.annotation.PostConstruct;\nimport org.springframework.ai.document.Document;\nimport org.springframework.ai.reader.TextReader;\nimport org.springframework.ai.transformer.splitter.TokenTextSplitter;\nimport org.springframework.ai.vectorstore.AbstractVectorStoreBuilder;\nimport org.springframework.ai.vectorstore.VectorStore;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.io.Resource;\nimport org.springframework.data.redis.core.RedisTemplate;\n\nimport java.nio.charset.Charset;\nimport java.util.List;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-30 12:16\n * @Description TODO\n *\/\n@Configuration\npublic class InitVectorDatabaseConfig\n{\n    @Autowired\n    private VectorStore vectorStore;\n    @Autowired\n    private RedisTemplate&lt;String,String> redisTemplate;\n\n    @Value(\"classpath:ops.txt\")\n    private Resource opsFile;\n\n    @PostConstruct\n    public void init()\n    {\n        \/\/1 \u8bfb\u53d6\u6587\u4ef6\n        TextReader textReader = new TextReader(opsFile);\n        textReader.setCharset(Charset.defaultCharset());\n\n        \/\/2 \u6587\u4ef6\u8f6c\u6362\u4e3a\u5411\u91cf(\u5f00\u542f\u5206\u8bcd)\n        List&lt;Document> list = new TokenTextSplitter().transform(textReader.read());\n\n        \/\/3 \u5199\u5165\u5411\u91cf\u6570\u636e\u5e93RedisStack\n        \/\/vectorStore.add(list);\n\n        \/\/ \u89e3\u51b3\u4e0a\u9762\u7b2c3\u6b65\uff0c\u5411\u91cf\u6570\u636e\u91cd\u590d\u95ee\u9898\uff0c\u4f7f\u7528redis setnx\u547d\u4ee4\u5904\u7406\n\n        \/\/4 \u53bb\u91cd\u590d\u7248\u672c\n\n        String sourceMetadata = (String)textReader.getCustomMetadata().get(\"source\");\n\n        String textHash = SecureUtil.md5(sourceMetadata);\n        String redisKey = \"vector-xxx:\" + textHash;\n\n        \/\/ \u5224\u65ad\u662f\u5426\u5b58\u5165\u8fc7,redisKey\u5982\u679c\u53ef\u4ee5\u6210\u529f\u63d2\u5165\u8868\u793a\u4ee5\u524d\u6ca1\u6709\u8fc7\uff0c\u53ef\u4ee5\u5047\u5982\u5411\u91cf\u6570\u636e\n        Boolean retFlag = redisTemplate.opsForValue().setIfAbsent(redisKey, \"1\");\n\n        System.out.println(\"****retFlag : \"+retFlag);\n\n        if(Boolean.TRUE.equals(retFlag))\n        {\n            \/\/\u952e\u4e0d\u5b58\u5728\uff0c\u9996\u6b21\u63d2\u5165,\u53ef\u4ee5\u4fdd\u5b58\u8fdb\u5411\u91cf\u6570\u636e\u5e93\n            vectorStore.add(list);\n        }else {\n            \/\/\u952e\u5df2\u5b58\u5728\uff0c\u8df3\u8fc7\u6216\u8005\u62a5\u9519\n            \/\/throw new RuntimeException(\"---\u91cd\u590d\u64cd\u4f5c\");\n            System.out.println(\"------\u5411\u91cf\u521d\u59cb\u5316\u6570\u636e\u5df2\u7ecf\u52a0\u8f7d\u8fc7\uff0c\u8bf7\u4e0d\u8981\u91cd\u590d\u64cd\u4f5c\");\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u4f18\u70b9\uff1a\u6027\u80fd\u9ad8+\u7ebf\u7a0b\u5b89\u5168\u95ee\u9898OK<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">controller<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;\nimport org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;\nimport org.springframework.ai.vectorstore.VectorStore;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-30 12:21\n * @Description TODO\n *\/\n@RestController\npublic class RagController\n{\n    @Resource(name = \"qwenChatClient\")\n    private ChatClient chatClient;\n    @Resource\n    private VectorStore vectorStore;\n\n    \/**\n     * http:\/\/localhost:8012\/rag4aiops?msg=00000\n     * http:\/\/localhost:8012\/rag4aiops?msg=C2222\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/rag4aiops\")\n    public Flux&lt;String> rag(String msg)\n    {\n        String systemInfo = \"\"\"\n                \u4f60\u662f\u4e00\u4e2a\u8fd0\u7ef4\u5de5\u7a0b\u5e08,\u6309\u7167\u7ed9\u51fa\u7684\u7f16\u7801\u7ed9\u51fa\u5bf9\u5e94\u6545\u969c\u89e3\u91ca,\u5426\u5219\u56de\u590d\u627e\u4e0d\u5230\u4fe1\u606f\u3002\n                \"\"\";\n\n        RetrievalAugmentationAdvisor advisor = RetrievalAugmentationAdvisor.builder()\n                .documentRetriever(\n                        VectorStoreDocumentRetriever.builder()\n                                .vectorStore(vectorStore)\n                                .build()\n                )\n                .build();\n\n        return chatClient.prompt()\n                .system(systemInfo)\n                .user(msg)\n                .advisors(advisor) \/\/ RAG\u529f\u80fd,\u5411\u91cf\u6570\u636e\u5e93\u67e5\u8be2\n                .stream()\n                .content();\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">14.Tool Calling\u5de5\u5177\u8c03\u7528<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u4e3a\u4ec0\u4e48\u9700\u8981\u5de5\u5177\u8c03\u7528\uff1f<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-382-1024x628.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"628\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-382-1024x628.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8818\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u5de5\u5177\u8c03\u7528\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b98\u7f51<\/h4>\n\n\n\n<p>SpringAI<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.spring.io\/spring-ai\/reference\/api\/tools.html\">https:\/\/docs.spring.io\/spring-ai\/reference\/api\/tools.html<\/a><\/p>\n\n\n\n<p>SpringAI Alibba<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-383.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"794\" height=\"333\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-383.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8819\"  sizes=\"(max-width: 794px) 100vw, 794px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/tool-calling\/?spm=5176.29160081.0.0.2856aa5cgvn0gm\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/tool-calling\/?spm=5176.29160081.0.0.2856aa5cgvn0gm<\/a><\/p>\n\n\n\n<p>\u4e00\u53e5\u8bdd\uff1aLLM\u7684\u5916\u90e8utils\u5de5\u5177\u7c7b<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u91cd\u8981\u63d0\u793a:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ToolCalling(\u4e5f\u79f0\u4e3aFunctionCalling)\u5b83\u5141\u8bb8\u5927\u6a21\u578b\u4e0e\u4e00\u7ec4API\u6216\u5de5\u5177\u8fdb\u884c\u4ea4\u4e92\uff0c\u5c06 LLM \u7684\u667a\u80fd\u4e0e\u5916\u90e8\u5de5\u5177\u6216 API\u65e0\u7f1d\u8fde\u63a5\uff0c\u4ece\u800c\u589e\u5f3a\u5927\u6a21\u578b\u5176\u529f\u80fd\u3002<\/li>\n\n\n\n<li>LLM\u672c\u8eab\u5e76\u4e0d\u6267\u884c\u51fd\u6570,\u5b83\u53ea\u662f\u6307\u793a\u5e94\u8be5\u8c03\u7528\u54ea\u4e2a\u51fd\u6570\u4ee5\u53ca\u5982\u4f55\u8c03\u7528<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.\u5de5\u5177\u8c03\u7528\u80fd\u5e72\u561b<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1.\u8bbf\u95ee\u5b9e\u65f6\u6570\u636e<\/li>\n\n\n\n<li>2.\u6267\u884c\u67d0\u79cd\u5de5\u5177\u7c7b\/\u8f85\u52a9\u7c7b\u64cd\u4f5c\uff1a\u5927\u8bed\u8a00\u6a21\u578b(LLMs)\u4e0d\u4ec5\u4ec5\u662f\u6587\u672c\u751f\u6210\u7684\u80fd\u624b,\u5b83\u4eec\u8fd8\u80fd\u89e6\u53d1\u5e76\u8c03\u7528\u7b2c3\u65b9\u51fd\u6570\uff0c\u6bd4\u5982\u53d1\u90ae\u4ef6\/\u67e5\u8be2\u5fae\u4fe1\/\u8c03\u7528\u652f\u4ed8\u5b9d\/\u67e5\u770b\u987a\u4e30\u5feb\u9012\u5355\u636e\u53f7\u7b49\u7b49\u2026\u2026<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u5de5\u5177\u8c03\u7528\u600e\u4e48\u7528<\/h3>\n\n\n\n<p>\u5de5\u4f5c\u6d41\u7a0b<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-384.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1007\" height=\"747\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-384.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8820\"  sizes=\"(max-width: 1007px) 100vw, 1007px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">5.\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u65b0\u5efa\u5b50\u6a21\u5757Module<\/h4>\n\n\n\n<p>SAA-13ToolCalling<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6539POM<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>SAA-13ToolCalling&lt;\/artifactId>\n\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--spring-ai-alibaba dashscope-->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5199YML<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8013\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-13ToolCalling\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e3b\u542f\u52a8<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa13ToolCallingApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa13ToolCallingApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6.\u4e1a\u52a1\u7c7b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u5148\u4e0d\u4f7f\u7528ToolCalling<\/h4>\n\n\n\n<p>\u6ca1\u6709\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 20:26\n * @Description TODO\n *\/\n@RestController\npublic class NoToolCallingController\n{\n    @Resource\n    private ChatModel chatModel;\n \n    @GetMapping(\"\/notoolcall\/chat\")\n    public Flux&lt;String> chat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\u73b0\u5728\u51e0\u70b9\") String msg)\n    {\n        return chatModel.stream(msg);\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-385-1024x162.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"162\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-385-1024x162.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8821\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u6295\u5165\u4f7f\u7528ToolCalling<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">\u65b9\u5f0f1\u901a\u8fc7ChatModel\u5b9e\u73b0<\/h5>\n\n\n\n<p>\u6ca1\u6709\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<p>\u65b0\u5efaTool\u5de5\u5177\u7c7b\uff0c\u7c7b\u4f3cUtils\u5de5\u5177\u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.utils;\n\nimport org.springframework.ai.tool.annotation.Tool;\n\nimport java.time.LocalDateTime;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 20:39\n * @Description TODO\n *\/\npublic class DateTimeTools\n{\n    \/**\n     * 1.\u5b9a\u4e49 function call\uff08tool call\uff09\n     * 2. returnDirect\n     *    true = tool\u76f4\u63a5\u8fd4\u56de\u4e0d\u8d70\u5927\u6a21\u578b\uff0c\u76f4\u63a5\u7ed9\u5ba2\u6237\n     *    false = \u62ff\u5230tool\u8fd4\u56de\u7684\u7ed3\u679c\uff0c\u7ed9\u5927\u6a21\u578b\uff0c\u6700\u540e\u7531\u5927\u6a21\u578b\u56de\u590d\n     *\/\n    @Tool(description = \"\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\", returnDirect = false)\n    public String getCurrentTime()\n    {\n        return LocalDateTime.now().toString();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5de5\u5177\u8c03\u7528\u76f4\u63a5\u8fd4\u56de<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-386.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"798\" height=\"642\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-386.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8822\"  sizes=\"(max-width: 798px) 100vw, 798px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.atguigu.study.utils.DateTimeTools;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.model.tool.ToolCallingChatOptions;\nimport org.springframework.ai.support.ToolCallbacks;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 20:40\n * @Description TODO\n *\/\n\n@RestController\npublic class ToolCallingController\n{\n    @Resource\n    private ChatModel chatModel;\n\n    @GetMapping(\"\/toolcall\/chat\")\n    public String chat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\uff0c\u73b0\u5728\u51e0\u70b9\u4e86\") String msg)\n    {\n        \/\/ 1.\u5de5\u5177\u6ce8\u518c\u5230\u5de5\u5177\u96c6\u5408\u91cc\n        ToolCallback&#91;] tools = ToolCallbacks.from(new DateTimeTools());\n        \/\/ 2.\u5c06\u5de5\u5177\u96c6\u914d\u7f6e\u8fdbChatOptions\u5bf9\u8c61\n        ChatOptions options = ToolCallingChatOptions.builder().toolCallbacks(tools).build();\n        \/\/ 3.\u6784\u5efa\u63d0\u793a\u8bcd\n        Prompt prompt = new Prompt(msg, options);\n        \/\/ 4.\u8c03\u7528\u5927\u6a21\u578b\n        return chatModel.call(prompt).getResult().getOutput().getText();\n    }\n}<\/code><\/pre>\n\n\n\n<p>http:\/\/localhost:8013\/toolcall\/chat\u540e\u5c31\u80fd\u67e5\u770b\u5f53\u524d\u65f6\u95f4\u4e86<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">\u65b9\u5f0f2\u901a\u8fc7ChatClient\u5b9e\u73b0<\/h5>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-387.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"544\" height=\"96\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-387.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8823\"  sizes=\"(max-width: 544px) 100vw, 544px\" \/><\/div><\/figure>\n\n\n\n<p>\u590d\u4e60\u4e00\u4e0b\uff1a\u5b83\u672c\u8eab\u4e0d\u4f1a\u81ea\u52a8\u88c5\u914d\uff0c\u76f4\u63a5\u5b9a\u4e49\u65e0\u6cd5\u4f7f\u7528\uff0c\u9700\u8981ChatModel\u5957\u5c42\u58f3<\/p>\n\n\n\n<p>\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 20:47\n * @Description TODO\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    @Bean\n    public ChatClient chatClient(ChatModel chatModel)\n    {\n        return ChatClient.builder(chatModel).build();\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport com.atguigu.study.utils.DateTimeTools;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.prompt.ChatOptions;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.model.tool.ToolCallingChatOptions;\nimport org.springframework.ai.support.ToolCallbacks;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 20:40\n * @Description TODO\n *\/\n\n@RestController\npublic class ToolCallingController\n{\n    @Resource\n    private ChatModel chatModel;\n\n    @Resource\n    private ChatClient chatClient;\n\n    @GetMapping(\"\/toolcall\/chat\")\n    public String chat(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\u73b0\u5728\u51e0\u70b9\") String msg)\n    {\n        \/\/ 1.\u5de5\u5177\u6ce8\u518c\u5230\u5de5\u5177\u96c6\u5408\u91cc\n        ToolCallback&#91;] tools = ToolCallbacks.from(new DateTimeTools());\n        \/\/ 2.\u5c06\u5de5\u5177\u96c6\u914d\u7f6e\u8fdbChatOptions\u5bf9\u8c61\n        ChatOptions options = ToolCallingChatOptions.builder().toolCallbacks(tools).build();\n        \/\/ 3.\u6784\u5efa\u63d0\u793a\u8bcd\n        Prompt prompt = new Prompt(msg, options);\n        \/\/ 4.\u8c03\u7528\u5927\u6a21\u578b\n        return chatModel.call(prompt).getResult().getOutput().getText();\n    }\n\n    @GetMapping(\"\/toolcall\/chat2\")\n    public Flux&lt;String> chat2(@RequestParam(name = \"msg\",defaultValue = \"\u4f60\u662f\u8c01\u73b0\u5728\u51e0\u70b9\") String msg)\n    {\n        return chatClient.prompt(msg)\n                .tools(new DateTimeTools())\n                .stream()\n                .content();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-388-1024x136.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"136\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-388-1024x136.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8824\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5173\u4e8e\u5de5\u5177\u8c03\u7528\u76f4\u63a5\u8fd4\u56de<\/p>\n\n\n\n<p>ture\uff1a\u5927\u6a21\u578b\u76f4\u63a5\u8fd4\u56de\u539f\u59cb\u672a\u5904\u7406\u7684\u6570\u636e<\/p>\n\n\n\n<p>flase\uff1a\u5927\u6a21\u578b\u4f1a\u518d\u5bf9\u539f\u59cb\u6570\u636e\u5904\u7406\u4e00\u6b21\uff0c\u8fd4\u56de\u6211\u4eec\u719f\u77e5\u7684\u683c\u5f0f<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-389-1024x556.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"556\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-389-1024x556.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8825\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">3.\u5c0f\u603b\u7ed3<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u5efa\u5b9a\u4e49\u4e00\u4e2aTool\u5de5\u5177\u7c7b<\/li>\n\n\n\n<li>ChatModel\/ChatClient\u4f7f\u7528<\/li>\n\n\n\n<li>Tool Calling\u4f7f\u7528\u6ce8\u610f\u4e8b\u9879\uff1aToolCalling\u4f7f\u7528\u7684\u524d\u63d0\u662f\u5927\u6a21\u578b\u652f\u6301functioncall\u624d\u80fd\u6b63\u5e38\u8c03\u7528\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">15.MCP\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae(Model Context Protocol)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u4e3a\u4ec0\u4e48\u4f1a\u6709MCP\u51fa\u73b0\uff0c\u4e4b\u524d\u75db\u70b9\u662f\u4ec0\u4e48<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-390.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1005\" height=\"684\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-390.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8828\"  sizes=\"(max-width: 1005px) 100vw, 1005px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e4b\u524d\u6bcf\u4e2a\u5927\u6a21\u578b(\u5982DeepSeek\u3001ChatGPT)\u9700\u8981\u4e3a\u6bcf\u4e2a\u5de5\u5177\u5355\u72ec\u5f00\u53d1\u63a5\u53e3(FunctionCalling)\uff0c\u5bfc\u81f4\u91cd\u590d\u52b3\u52a8<\/p>\n\n\n\n<p>\u75db\u70b9<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5171\u7528<\/li>\n\n\n\n<li>\u6570\u91cf<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.MCP\u5165\u95e8\u6982\u5ff5<\/h3>\n\n\n\n<p>MCP\u81ea\u8eab\u534f\u8bae\u5b98\u7f51<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-391.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"883\" height=\"104\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-391.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8829\"  sizes=\"(max-width: 883px) 100vw, 883px\" \/><\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/modelcontextprotocol.io\/introduction\">https:\/\/modelcontextprotocol.io\/introduction<\/a><\/p>\n\n\n\n<p>SpringAI\u5b98\u7f51\u652f\u6301MCP<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.spring.io\/spring-ai\/reference\/api\/mcp\/mcp-overview.html\">https:\/\/docs.spring.io\/spring-ai\/reference\/api\/mcp\/mcp-overview.html<\/a><\/p>\n\n\n\n<p>SpringAI Aibaba\u5b98\u7f51\u652f\u6301MCP<\/p>\n\n\n\n<p><a href=\"https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/model-context-protocol\/?spm=5176.29160081.0.0.2856aa5ccBJ7XE\">https:\/\/java2ai.com\/docs\/1.0.0.2\/tutorials\/basics\/model-context-protocol\/?spm=5176.29160081.0.0.2856aa5ccBJ7XE<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">MCP\u662f\u4ec0\u4e48<\/h4>\n\n\n\n<p>\u4e00\u53e5\u8bdd\uff1aJava\u754c\u7684SpringCloud Openfeign\uff0c\u53ea\u4e0d\u8fc7Openfeign\u662f\u7528\u4e8e\u5fae\u670d\u52a1\u901a\u8baf\u7684\uff0c<br>\u800cMCP\u7528\u4e8e\u5927\u6a21\u578b\u901a\u8baf\u7684\uff0c\u4f46\u5b83\u4eec\u90fd\u662f\u4e3a\u4e86\u901a\u8baf\u83b7\u53d6\u67d0\u9879\u6570\u636e\u7684\u4e00\u79cd\u673a\u5236<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">MCP\u80fd\u5e72\u561b<\/h4>\n\n\n\n<p>\u63d0\u4f9b\u4e86\u4e00\u79cd\u6807\u51c6\u5316\u7684\u65b9\u5f0f\u6765\u8fde\u63a5 LLMs \u9700\u8981\u7684\u4e0a\u4e0b\u6587\uff0cMCP \u5c31\u7c7b\u4f3c\u4e8e\u4e00\u4e2a Agent \u65f6\u4ee3\u7684 Type-C\u534f\u8bae\uff0c\u5e0c\u671b\u80fd\u5c06\u4e0d\u540c\u6765\u6e90\u7684\u6570\u636e\u3001\u5de5\u5177\u3001\u670d\u52a1\u7edf\u4e00\u8d77\u6765\u4f9b\u5927\u6a21\u578b\u8c03\u7528<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-392-1024x579.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"579\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-392-1024x579.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8830\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-393.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"859\" height=\"569\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-393.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8831\"  sizes=\"(max-width: 859px) 100vw, 859px\" \/><\/div><\/figure>\n\n\n\n<p>MCP \u5389\u5bb3\u7684\u5730\u65b9\u5728\u4e8e\uff0c\u4e0d\u7528\u91cd\u590d\u9020\u8f6e\u5b50\u3002<\/p>\n\n\n\n<p>\u8fc7\u53bb\u6bcf\u4e2a\u8f6f\u4ef6\uff08\u6bd4\u5982\u5fae\u4fe1\u3001Excel\uff09\u90fd\u8981\u5355\u72ec\u7ed9 AI \u505a\u63a5\u53e3\uff0c<\/p>\n\n\n\n<p>\u73b0\u5728 MCP \u7edf\u4e00\u4e86\u6807\u51c6\uff0c\u5c31\u50cf\u6240\u6709\u7535\u5668\u90fd\u7528 USB-C \u5145\u7535\u53e3\uff0cAI \u4e00\u4e2a\u63a5\u53e3\u5c31\u80fd\u8fde\u63a5\u6240\u6709\u5de5\u5177<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">MCP\u600e\u4e48\u73a9<\/h4>\n\n\n\n<p><a href=\"https:\/\/mcp.so\/zh\">https:\/\/mcp.so\/zh<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-394-1024x496.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"496\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-394-1024x496.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8832\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3.MCP\u67b6\u6784\u77e5\u8bc6<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">MCP\u9075\u5faa\u5ba2\u6237\u7aef-\u670d\u52a1\u5668\u67b6\u6784\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u6838\u5fc3\u90e8\u5206<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-395.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"806\" height=\"575\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-395.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8833\"  sizes=\"(max-width: 806px) 100vw, 806px\" \/><\/div><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MCP \u4e3b\u673a\uff08MCP Hosts\uff09\uff1a\u53d1\u8d77\u8bf7\u6c42\u7684 AI \u5e94\u7528\u7a0b\u5e8f\uff0c\u6bd4\u5982\u804a\u5929\u673a\u5668\u4eba\u3001AI \u9a71\u52a8\u7684 IDE \u7b49<\/li>\n\n\n\n<li>MCP \u5ba2\u6237\u7aef\uff08MCP Clients\uff09\uff1a\u5728\u4e3b\u673a\u7a0b\u5e8f\u5185\u90e8\uff0c\u4e0e MCP \u670d\u52a1\u5668\u4fdd\u6301 1:1 \u7684\u8fde\u63a5\u3002<\/li>\n\n\n\n<li>MCP \u670d\u52a1\u5668\uff08MCP Servers\uff09\uff1a\u4e3a MCP \u5ba2\u6237\u7aef\u63d0\u4f9b\u4e0a\u4e0b\u6587\u3001\u5de5\u5177\u548c\u63d0\u793a\u4fe1\u606f\u3002<\/li>\n\n\n\n<li>\u672c\u5730\u8d44\u6e90\uff08Local Resources\uff09\uff1a\u672c\u5730\u8ba1\u7b97\u673a\u4e2d\u53ef\u4f9b MCP \u670d\u52a1\u5668\u5b89\u5168\u8bbf\u95ee\u7684\u8d44\u6e90\uff0c\u5982\u6587\u4ef6\u3001\u6570\u636e\u5e93\u3002<\/li>\n\n\n\n<li>\u8fdc\u7a0b\u8d44\u6e90\uff08Remote Resources\uff09\uff1aMCP \u670d\u52a1\u5668\u53ef\u4ee5\u8fde\u63a5\u5230\u7684\u8fdc\u7a0b\u8d44\u6e90\uff0c\u5982\u901a\u8fc7 API \u63d0\u4f9b\u7684\u6570\u636e<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u5728MCP\u901a\u4fe1\u534f\u8bae\u4e2d\uff0c\u4e00\u822c\u6709\u4e24\u79cd\u6a21\u5f0f<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>STDIO(\u6807\u51c6\u8f93\u5165\/\u8f93\u51fa)\n<ul class=\"wp-block-list\">\n<li>\u652f\u6301\u6807\u51c6\u8f93\u5165\u548c\u8f93\u51fa\u6d41\u8fdb\u884c\u901a\u4fe1\uff0c\u4e3b\u8981\u7528\u4e8e\u672c\u5730\u96c6\u6210\u3001\u547d\u4ee4\u884c\u5de5\u5177\u7b49\u573a\u666f<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>SSE (Server-Sent Events)\n<ul class=\"wp-block-list\">\n<li>\u652f\u6301\u4f7f\u7528 HTTP POST \u8bf7\u6c42\u8fdb\u884c\u670d\u52a1\u5668\u5230\u5ba2\u6237\u7aef\u6d41\u5f0f\u5904\u7406\uff0c\u4ee5\u5b9e\u73b0\u5ba2\u6237\u7aef\u5230\u670d\u52a1\u5668\u7684\u901a\u4fe1<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-396.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"939\" height=\"337\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-396.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8834\"  sizes=\"(max-width: 939px) 100vw, 939px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u5c0f\u603b\u7ed3\uff08\u5feb\u901f\u5206\u6e05\u695a \u5de5\u5177\u8c03\u7528\u3001\u68c0\u7d22\u589e\u5f3a\u751f\u6210\u3001\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff09<\/h3>\n\n\n\n<p>ToolCalling \u5de5\u5177\u7c7b\uff0c\u4e3a\u4e86\u8ba9\u5927\u6a21\u578b\u4f7f\u7528Util\u5de5\u5177<\/p>\n\n\n\n<p>RAG \u77e5\u8bc6\u5e93\uff0c\u4e3a\u4e86\u8ba9\u5927\u6a21\u578b\u83b7\u53d6\u8db3\u591f\u7684\u4e0a\u4e0b\u6587<\/p>\n\n\n\n<p>MCP \u534f\u8bae\uff0c\u4e3a\u4e86\u8ba9\u5927\u6a21\u578b\u4e4b\u95f4\u7684\u76f8\u4e92\u8c03\u7528<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-397.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"633\" height=\"491\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-397.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8835\"  sizes=\"(max-width: 633px) 100vw, 633px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-398-1024x567.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"567\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-398-1024x567.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8836\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-399.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"994\" height=\"780\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-399.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8837\"  sizes=\"(max-width: 994px) 100vw, 994px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">MCP VS ToolCalling<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e4b\u524d\u6bcf\u4e2a\u5927\u6a21\u578b(\u5982DeepSeek\u3001ChatGPT)\u9700\u8981\u4e3a\u6bcf\u4e2a\u5de5\u5177\u5355\u72ec\u5f00\u53d1\u63a5\u53e3(FunctionCalling)\uff0c\u5bfc\u81f4\u91cd\u590d\u52b3\u52a8<\/li>\n\n\n\n<li>MCP\u901a\u8fc7\u7edf\u4e00\u534f\u8bae\n<ul class=\"wp-block-list\">\n<li>\u5f00\u53d1\u8005\u53ea\u9700\u5199\u4e00\u6b21MCP\u670d\u52a1\u7aef\uff0c\u6240\u6709\u517c\u5bb9MCP\u534f\u8bae\u7684\u6a21\u578b\u90fd\u80fd\u8c03\u7528\uff0cMCP\u8ba9\u5927\u6a21\u578b\u4ece&#8221;\u88ab\u52a8\u5e94\u7b54\u201d\u53d8\u4e3a\u201d\u4e3b\u52a8\u8c03\u7528\u5de5\u5177\u201d<\/li>\n\n\n\n<li>\u6211\u8c03\u7528\u4e00\u4e2aMCP\u670d\u52a1\u5668\u5c31\u7b49\u4ef7\u8c03\u7528\u4e00\u4e2a\u5e26\u6709\u591a\u4e2a\u529f\u80fd\u7684Utils\u5de5\u5177\u7c7b\uff0c\u81ea\u5df1\u8fd8\u4e0d\u7528\u53d7\u7d2f\u643a\u5e26<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.\u672c\u5730MCP-\u5f00\u53d1\u6b65\u9aa4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1.MCP-Server\u670d\u52a1\u7aef\u5b9e\u73b0<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u5efa\u5b50\u6a21\u5757Module<\/li>\n<\/ul>\n\n\n\n<p>SAA-14LocalMcpServer<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6539POM<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n\n    &lt;artifactId>SAA-14LocalMcpServer&lt;\/artifactId>\n\n\n    &lt;dependencies>\n        &lt;!--\u6ce8\u610f\u4e8b\u9879\uff08\u91cd\u8981\uff09\n            spring-ai-starter-mcp-server-webflux\u4e0d\u80fd\u548c&lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\u4f9d\u8d56\u5e76\u5b58\uff0c\n            \u5426\u5219\u4f1a\u4f7f\u7528tomcat\u542f\u52a8,\u800c\u4e0d\u662fnetty\u542f\u52a8\uff0c\u4ece\u800c\u5bfc\u81f4mcpserver\u542f\u52a8\u5931\u8d25\uff0c\u4f46\u7a0b\u5e8f\u8fd0\u884c\u662f\u6b63\u5e38\u7684\uff0cmcp\u5ba2\u6237\u7aef\u8fde\u63a5\u4e0d\u4e0a\u3002\n        -->\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--mcp-server-webflux-->\n        &lt;dependency>\n            &lt;groupId>org.springframework.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-starter-mcp-server-webflux&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8014\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-14LocalMcpServer\n\n\n# ====mcp-server Config=============\nspring.ai.mcp.server.type=async\nspring.ai.mcp.server.name=customer-define-mcp-server\nspring.ai.mcp.server.version=1.0.0<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa14LocalMcpServerApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa14LocalMcpServerApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h5>\n\n\n\n<p>\u5929\u6c14\u9884\u62a5WeatherService\u670d\u52a1\u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.service;\n\nimport org.springframework.ai.tool.annotation.Tool;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Map;\n\n\/**\n * @auther bs@126.com\n * @create 2025-07-31 21:07\n * @Description TODO\n *\/\n@Service\npublic class WeatherService\n{\n    @Tool(description = \"\u6839\u636e\u57ce\u5e02\u540d\u79f0\u83b7\u53d6\u5929\u6c14\u9884\u62a5\")\n    public String getWeatherByCity(String city)\n    {\n        Map&lt;String, String> map = Map.of(\n                \"\u5317\u4eac\", \"11111\u964d\u96e8\u9891\u7e41\uff0c\u5176\u4e2d\u4eca\u5929\u548c\u540e\u5929\u96e8\u52bf\u8f83\u5f3a\uff0c\u90e8\u5206\u5730\u533a\u6709\u66b4\u96e8\u5e76\u4f34\u5f3a\u5bf9\u6d41\u5929\u6c14\uff0c\u9700\u6ce8\u610f\",\n                \"\u4e0a\u6d77\", \"22222\u591a\u4e91,15\u2103~27\u2103,\u5357\u98ce3\u7ea7\uff0c\u5f53\u524d\u6e29\u5ea627\u2103\u3002\",\n                \"\u6df1\u5733\", \"333333\u591a\u4e9140\u5929\uff0c\u963416\u5929\uff0c\u96e830\u5929\uff0c\u66743\u5929\"\n        );\n        return map.getOrDefault(city, \"\u62b1\u6b49\uff1a\u672a\u67e5\u8be2\u5230\u5bf9\u5e94\u57ce\u5e02\uff01\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>ToolCallbackProvider\u63a5\u53e3\u914d\u7f6e\u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.atguigu.study.service.WeatherService;\nimport org.springframework.ai.tool.ToolCallbackProvider;\nimport org.springframework.ai.tool.method.MethodToolCallbackProvider;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 21:08\n * @Description TODO\n *\/\n\n@Configuration\npublic class McpServerConfig\n{\n    \/**\n     * \u5c06\u5de5\u5177\u65b9\u6cd5\u66b4\u9732\u7ed9\u5916\u90e8 mcp client \u8c03\u7528\n     * @param weatherService\n     * @return\n     *\/\n    @Bean\n    public ToolCallbackProvider weatherTools(WeatherService weatherService)\n    {\n        return MethodToolCallbackProvider.builder()\n                .toolObjects(weatherService)\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u81ea\u542f\u52a8\u4f5c\u4e3a\u670d\u52a1\u7aef\u7b49\u5f85\u8c03\u7528\u5373\u53ef<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-400-1024x208.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"208\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-400-1024x208.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8838\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">2.MCP-Client\u5ba2\u6237\u7aef\u5b9e\u73b0<\/h4>\n\n\n\n<p>\u65b0\u5efa\u5b50\u6a21\u5757Module<\/p>\n\n\n\n<p>SAA-15LocalMcpClient<\/p>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>SAA-15LocalMcpClient&lt;\/artifactId>\n\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--spring-ai-alibaba dashscope-->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!-- 2.mcp-clent \u4f9d\u8d56 -->\n        &lt;dependency>\n            &lt;groupId>org.springframework.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-starter-mcp-client&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8015\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-15LocalMcpClient\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}\n\n# ====mcp-client Config=============\nspring.ai.mcp.client.type=async\nspring.ai.mcp.client.request-timeout=60s\nspring.ai.mcp.client.toolcallback.enabled=true\nspring.ai.mcp.client.sse.connections.mcp-server1.url=http:\/\/localhost:8014<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa15LocalMcpClientApplication\n{\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa15LocalMcpClientApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h5>\n\n\n\n<p>LLMConfig\u5e76\u6dfb\u52a0tool\u8c03\u7528<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.tool.ToolCallbackProvider;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 20:47\n * @Description TODO\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    @Bean\n    public ChatClient chatClient(ChatModel chatModel, ToolCallbackProvider tools)\n    {\n        return ChatClient.builder(chatModel)\n                .defaultToolCallbacks(tools.getToolCallbacks())  \/\/mcp\u534f\u8bae\uff0c\u914d\u7f6e\u89c1yml\u6587\u4ef6\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 21:14\n * @Description TODO\n *\/\n\n@RestController\npublic class McpClientController\n{\n    @Resource\n    private ChatClient chatClient;\/\/\u4f7f\u7528mcp\u652f\u6301\n\n    @Resource\n    private ChatModel chatModel;\/\/\u6ca1\u6709\u7eb3\u5165tool\u652f\u6301\uff0c\u666e\u901a\u8c03\u7528\n\n    \/\/ http:\/\/localhost:8015\/mcpclient\/chat?msg=\u4e0a\u6d77\n    @GetMapping(\"\/mcpclient\/chat\")\n    public Flux&lt;String> chat(@RequestParam(name = \"msg\",defaultValue = \"\u5317\u4eac\") String msg)\n    {\n        System.out.println(\"\u4f7f\u7528\u4e86mcp\");\n        return chatClient.prompt(msg).stream().content();\n    }\n\n    @RequestMapping(\"\/mcpclient\/chat2\")\n    public Flux&lt;String> chat2(@RequestParam(name = \"msg\",defaultValue = \"\u5317\u4eac\") String msg)\n    {\n        System.out.println(\"\u672a\u4f7f\u7528mcp\");\n        return chatModel.stream(msg);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3.MCP-Client invoke MCP-Server\u6d4b\u8bd5<\/h4>\n\n\n\n<p>\u4f7f\u7528mcp<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-401.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"721\" height=\"171\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-401.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8839\"  sizes=\"(max-width: 721px) 100vw, 721px\" \/><\/div><\/figure>\n\n\n\n<p>\u6ca1\u6709mcp\u652f\u6301\uff0c\u5df2\u8bfb\u4e71\u56de<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-402-1024x437.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"437\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-402-1024x437.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8840\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">6.\u8fdc\u7a0bMCP\u589e\u5f3a\u6848\u4f8b-\u5bf9\u63a5\u4e92\u8054\u7f51\u901a\u7528MCP\u670d\u52a1\uff08\u767e\u5ea6\u5730\u56fe\uff09<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5bf9\u63a5\u4e92\u8054\u7f51\u901a\u7528MCP\u670d\u52a1\uff08\u767e\u5ea6\u5730\u56fe\uff09<\/h4>\n\n\n\n<p><a href=\"https:\/\/mcp.so\/zh\/server\/baidu-map\/baidu-maps\">https:\/\/mcp.so\/zh\/server\/baidu-map\/baidu-maps<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u73af\u5883\u914d\u7f6e<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0b\u8f7d\u6700\u65b0\u7248\u7684NodeJS<\/li>\n\n\n\n<li>\u6ce8\u518c\u767e\u5ea6\u5730\u56fe\u8d26\u53f7+\u7533\u8bf7API-key \uff1a\u901f\u6210langchain4j\u65f6\u6211\u4eec\u914d\u7f6e\u8fc7\u8fd9\u91cc\u7701\u7565<\/li>\n\n\n\n<li>nodejs\u914d\u7f6e\u7f16\u7801-Typescript\u63a5\u5165<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-403.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"712\" height=\"613\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-403.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8841\"  sizes=\"(max-width: 712px) 100vw, 712px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u5f00\u53d1\u6b65\u9aa4<\/h4>\n\n\n\n<p>\u65b0\u5efa\u5b50\u6a21\u5757Module<\/p>\n\n\n\n<p>springAI-16chat-mcpclient-call-baidumcp<\/p>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n    &lt;parent>\n        &lt;groupId>com.zzyy.study&lt;\/groupId>\n        &lt;artifactId>SpringAI-zyfanV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>springAI-16chat-mcpclient-call-baidumcp&lt;\/artifactId>\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!-- 1.\u5927\u6a21\u578b\u4f9d\u8d56 -->\n        &lt;dependency>\n            &lt;groupId>org.springframework.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-starter-model-openai&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!-- 2.mcp-clent \u4f9d\u8d56 -->\n        &lt;dependency>\n            &lt;groupId>org.springframework.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-starter-mcp-client&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=6016\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=springAI-16chat-mcpclient-call-baidumcp\n\n# ====LLM Config=============\nspring.ai.openai.api-key=${aliQwen-api}\nspring.ai.openai.base-url=https:\/\/dashscope.aliyuncs.com\/compatible-mode\nspring.ai.openai.chat.options.model=qwen-plus\n\n# ====mcp-client Config=============\nspring.ai.mcp.client.toolcallback.enabled=true\nspring.ai.mcp.client.stdio.servers-configuration=classpath:\/mcp-server.json<\/code><\/pre>\n\n\n\n<p>nodejs\u914d\u7f6e\u7f16\u7801-Typescript\u63a5\u5165<\/p>\n\n\n\n<p><a href=\"https:\/\/mcp.so\/zh\/server\/baidu-map\/baidu-maps?tab=content#typescript%E6%8E%A5%E5%85%A5\">https:\/\/mcp.so\/zh\/server\/baidu-map\/baidu-maps?tab=content#typescript%E6%8E%A5%E5%85%A5<\/a><\/p>\n\n\n\n<p>mcp-server.json<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-404-1024x559.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"559\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-404-1024x559.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8842\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-405-1024x392.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"392\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-405-1024x392.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8843\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h5>\n\n\n\n<p>LLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.tool.ToolCallbackProvider;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-07-31 20:47\n * @Description TODO\n *\/\n@Configuration\npublic class SaaLLMConfig\n{\n    @Bean\n    public ChatClient chatClient(ChatModel chatModel, ToolCallbackProvider tools)\n    {\n        return ChatClient.builder(chatModel)\n                \/\/mcp\u534f\u8bae\uff0c\u914d\u7f6e\u89c1yml\u6587\u4ef6\uff0c\u6b64\u5904\u53ea\u8d4b\u80fd\u7ed9ChatClient\u5bf9\u8c61\n                .defaultToolCallbacks(tools.getToolCallbacks())\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyy\n * @create 2025-07-19 18:55\n *\/\n@RestController\npublic class McpClientCallBaiDuMcpController\n{\n    @Resource \n    private ChatClient chatClient; \/\/\u6dfb\u52a0\u4e86MCP\u8c03\u7528\u80fd\u529b\n\n    @Resource\n    private ChatModel chatModel; \/\/\u6ca1\u6709\u6dfb\u52a0MCP\u8c03\u7528\u80fd\u529b\n\n    \/**\n     * \u6dfb\u52a0\u4e86MCP\u8c03\u7528\u80fd\u529b\n     * http:\/\/localhost:6016\/mcp\/chat?msg=\u67e5\u8be2\u5317\u4eac\u5929\u6c14\n     * http:\/\/localhost:6016\/mcp\/chat?msg=\u67e5\u8be261.149.121.66\u5f52\u5c5e\u5730\n     * http:\/\/localhost:6016\/mcp\/chat?msg=\u67e5\u8be2\u660c\u5e73\u5230\u5929\u5b89\u95e8\u8def\u7ebf\u89c4\u5212\n     *\n     *\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/mcp\/chat\")\n    public Flux&lt;String> chat(String msg)\n    {\n        return chatClient.prompt(msg).stream().content();\n    }\n\n    \/**\n     * \u6ca1\u6709\u6dfb\u52a0MCP\u8c03\u7528\u80fd\u529b\n     *http:\/\/localhost:6016\/mcp\/chat2?msg=\u67e5\u8be2\u5317\u4eac\u5929\u6c14\n     * @param msg\n     * @return\n     *\/\n    @RequestMapping(\"\/mcp\/chat2\")\n    public Flux&lt;String> chat2(String msg)\n    {\n        return chatModel.stream(msg);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3.\u6d4b\u8bd5<\/h4>\n\n\n\n<p>\u5177\u5907mcp\u80fd\u529b\u7684<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-406-1024x400.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"400\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-406-1024x400.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8844\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e0d\u5177\u5907mcp\u80fd\u529b\u7684<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-407-1024x169.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"169\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-407-1024x169.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8845\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">7.MCP\u539f\u7406+\u6e90\u7801\u5206\u6790<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6e90\u7801\u83b7\u5f97<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-408.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"934\" height=\"411\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-408.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8846\"  sizes=\"(max-width: 934px) 100vw, 934px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e0b\u8f7d\u540e\u7684\u6e90\u7801<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-409.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"890\" height=\"225\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-409.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8847\"  sizes=\"(max-width: 890px) 100vw, 890px\" \/><\/div><\/figure>\n\n\n\n<p>\u539f\u7406\u8bf4\u660e<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-410-1024x381.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"381\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-410-1024x381.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8848\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">16.SAA\u751f\u6001\u7bc7<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.\u963f\u91cc\u4e91\u767e\u70bc\u5e73\u53f0\u4e91\u4e0aRAG\u77e5\u8bc6\u5e93(AI\u667a\u80fd\u8fd0\u7ef4)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u9700\u6c42\u8bf4\u660e<\/h4>\n\n\n\n<p>\u963f\u91cc\u4e91\u4e0a\u77e5\u8bc6\u5e93\u642d\u5efa<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-411-1024x413.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"413\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-411-1024x413.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8849\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-412-1024x401.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"401\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-412-1024x401.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8850\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u5f00\u53d1\u6b65\u9aa4<\/h4>\n\n\n\n<p>\u65b0\u5efa\u5b50\u6a21\u5757Module<\/p>\n\n\n\n<p>SAA-17BailianRAG<\/p>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.atguigu.study&lt;\/groupId>\n        &lt;artifactId>SpringAIAlibaba-atguiguV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>SAA-17BailianRAG&lt;\/artifactId>\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--spring-ai-alibaba dashscope-->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n\n    &lt;repositories>\n        &lt;repository>\n            &lt;id>spring-milestones&lt;\/id>\n            &lt;name>Spring Milestones&lt;\/name>\n            &lt;url>https:\/\/repo.spring.io\/milestone&lt;\/url>\n            &lt;snapshots>\n                &lt;enabled>false&lt;\/enabled>\n            &lt;\/snapshots>\n        &lt;\/repository>\n    &lt;\/repositories>\n\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8017\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-17BailianRAG\n\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa17BailianRagApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa17BailianRagApplication.class, args);\n    }\n\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h5>\n\n\n\n<p>DashScopeConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class DashScopeConfig {\n\n    @Value(\"${spring.ai.dashscope.api-key}\")\n    private String apiKey;\n\n    @Bean\n    public DashScopeApi dashScopeApi()\n    {\n        return DashScopeApi.builder()\n                .apiKey(apiKey)\n                .workSpaceId(\"llm-3as714s6flm80yc1\")\n                .build();\n    }\n\n    @Bean\n    public ChatClient chatClient(ChatModel dashscopeChatModel)\n    {\n        return ChatClient.builder(dashscopeChatModel).build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.controller;\n\nimport com.alibaba.cloud.ai.advisor.DocumentRetrievalAdvisor;\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetriever;\nimport com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetrieverOptions;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.rag.retrieval.search.DocumentRetriever;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-08-01 16:51\n * @Description TODO\n *\/\n@RestController\npublic class BailianRagController\n{\n    @Resource\n    private ChatClient chatClient;\n    @Resource\n    private DashScopeApi dashScopeApi;\n\n    \/**\n     * http:\/\/localhost:6018\/bailian\/rag\/chat\n     * http:\/\/localhost:6018\/bailian\/rag\/chat?msg=A0001\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/bailian\/rag\/chat\")\n    public Flux&lt;String> chat(@RequestParam(name = \"msg\",defaultValue = \"00000\u9519\u8bef\u4fe1\u606f\") String msg)\n    {\n        \/\/1 RetrieverOptions\u53c2\u6570\u914d\u7f6e\n        DashScopeDocumentRetrieverOptions documentRetrieverOptions = DashScopeDocumentRetrieverOptions.builder()\n                .withIndexName(\"myerror\") \/\/ \u77e5\u8bc6\u5e93\u540d\u79f0\n                .build();\n\n        \/\/2 \u767e\u70bc\u5e73\u53f0RAG\u77e5\u8bc6\u5e93\u6784\u5efa\u5668\n        DocumentRetriever retriever = new DashScopeDocumentRetriever(dashScopeApi,documentRetrieverOptions);\n\n        return chatClient.prompt()\n                .user(msg)\n                .advisors(new DocumentRetrievalAdvisor(retriever))\n                .stream()\n                .content();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-413-1024x179.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"179\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-413-1024x179.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8851\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.\u963f\u91cc\u4e91\u767e\u70bc\u5e73\u53f0\u4e91\u4e0aRAG\u77e5\u8bc6\u5e93(\u7535\u5546\u667a\u80fd\u5ba2\u670d\u6848\u4f8b)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u9700\u6c42\u8bf4\u660e<\/h4>\n\n\n\n<p>\u963f\u91cc\u4e91\u4e0a\u77e5\u8bc6\u5e93\u642d\u5efaRAG\uff0c\u7535\u5546\u5ba2\u670d\u7edf\u4e00\u8bdd\u672f<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u5f00\u53d1\u6b65\u9aa4<\/h4>\n\n\n\n<p>\u65b0\u5efa\u5b50\u6a21\u5757Module <\/p>\n\n\n\n<p>springAI-21chat-CustomerService<\/p>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.zzyy.study&lt;\/groupId>\n        &lt;artifactId>SpringAI-zyfanV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>springAI-21chat-CustomerService&lt;\/artifactId>\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!-- 2. SAA\u5927\u6a21\u578b\u4f9d\u8d56 -->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n            &lt;version>1.0.0.2&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=6021\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=springAI-21chat-CustomerService\n\n# ====LLM Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class SpringAi21chatCustomerServiceApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(SpringAi21chatCustomerServiceApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h5>\n\n\n\n<p>DashSocpeConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class DashSocpeConfig {\n\n    @Value(\"${spring.ai.dashscope.api-key}\")\n    private String apiKey;\n\n    @Bean\n    public DashScopeApi dashScopeApi() {\n        return DashScopeApi.builder()\n                .apiKey(apiKey)\n                .workSpaceId(\"llm-3as714s6flm80yc1\")\n                .build();\n    }\n\n    @Bean\n    public ChatClient chatClient(ChatModel dashscopeChatModel) {\n        return ChatClient.builder(dashscopeChatModel).build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.controller;\n\nimport com.alibaba.cloud.ai.advisor.DocumentRetrievalAdvisor;\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetriever;\nimport com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetrieverOptions;\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.rag.retrieval.search.DocumentRetriever;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-08-01 16:51\n * @Description TODO\n *\/\n@RestController\npublic class AICustomerServiceController\n{\n    @Resource\n    private ChatClient chatClient;\n    @Resource\n    private DashScopeApi dashScopeApi;\n\n    \/**\n     * http:\/\/localhost:6021\/customer\/service\n     * http:\/\/localhost:6021\/customer\/service?msg=A0001\n     * @param msg\n     * @return\n     *\/\n    @GetMapping(\"\/customer\/service\")\n    public Flux&lt;String> service(@RequestParam(name = \"msg\",defaultValue = \"\u4ec0\u4e48\u65f6\u5019\u53d1\u8d27\") String msg)\n    {\n        \/\/1 RetrieverOptions\u53c2\u6570\u914d\u7f6e\n        DashScopeDocumentRetrieverOptions documentRetrieverOptions = DashScopeDocumentRetrieverOptions.builder()\n                .withIndexName(\"\u6dd8\u5b9d\u7535\u5546\u8bdd\u672f\")\/\/ \u767e\u70bc\u5e73\u53f0\u4e91\u77e5\u8bc6\u5e93\u540d\u79f0\n                .build();\n\n        \/\/2 \u767e\u70bc\u5e73\u53f0RAG\u77e5\u8bc6\u5e93\u6784\u5efa\u5668\n        DocumentRetriever retriever = new DashScopeDocumentRetriever(dashScopeApi,documentRetrieverOptions);\n\n        return chatClient.prompt()\n                .system(\"\u4f60\u662f\u4e00\u4e2a\u7535\u5546\u667a\u80fd\u5ba2\u670d\u52a9\u624b\uff0c\u6839\u636e\u7528\u6237\u7684\u95ee\u9898\u53bb\u77e5\u8bc6\u5e93\u67e5\u8be2\u4fe1\u606f\uff0c\" +\n                        \"\u5982\u679c\u77e5\u8bc6\u5e93\u67e5\u8be2\u4e0d\u5230\u4fe1\u606f\uff0c\u8fd4\u56de\u62b1\u6b49\u67e5\u8be2\u4e0d\u5230\u4efb\u4f55\u4fe1\u606f\u3002\")\n                .user(msg)\n                .advisors(new DocumentRetrievalAdvisor(retriever))\n                .stream()\n                .content();\n    }\n\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.\u672c\u5730\u5fae\u670d\u52a1\u8c03\u7528\u963f\u91cc\u4e91\u767e\u70bc\u5e73\u53f0\u5de5\u4f5c\u6d41(AI\u667a\u80fd\u83dc\u5355\uff0c\u4eca\u5929\u5403\u4ec0\u4e48)<\/h3>\n\n\n\n<p>\u7f8e\u56e2\uff0c\u4eca\u5929\u5403\u4ec0\u4e48AI\u667a\u80fd\u83dc\u5355<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.\u4e0d\u7528\u963f\u91ccSAA\u751f\u6001<\/h4>\n\n\n\n<p>\u5f00\u53d1\u6b65\u9aa4<\/p>\n\n\n\n<p>\u65b0\u5efa\u5b50\u6a21\u5757Module<\/p>\n\n\n\n<p>SAA-18TodayMenu<\/p>\n\n\n\n<p>\u6539POM<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    &lt;modelVersion>4.0.0&lt;\/modelVersion>\n\n    &lt;parent>\n        &lt;groupId>com.zzyy.study&lt;\/groupId>\n        &lt;artifactId>SpringAI-zyfanV1&lt;\/artifactId>\n        &lt;version>1.0-SNAPSHOT&lt;\/version>\n    &lt;\/parent>\n\n    &lt;artifactId>springAI-20chat-TodayMenu&lt;\/artifactId>\n\n    &lt;dependencies>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-web&lt;\/artifactId>\n        &lt;\/dependency>\n        &lt;!-- 2. SAA\u5927\u6a21\u578b\u4f9d\u8d56 -->\n        &lt;dependency>\n            &lt;groupId>com.alibaba.cloud.ai&lt;\/groupId>\n            &lt;artifactId>spring-ai-alibaba-starter-dashscope&lt;\/artifactId>\n            &lt;version>1.0.0.2&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--hutool-->\n        &lt;dependency>\n            &lt;groupId>cn.hutool&lt;\/groupId>\n            &lt;artifactId>hutool-all&lt;\/artifactId>\n            &lt;version>5.8.22&lt;\/version>\n        &lt;\/dependency>\n        &lt;!--lombok-->\n        &lt;dependency>\n            &lt;groupId>org.projectlombok&lt;\/groupId>\n            &lt;artifactId>lombok&lt;\/artifactId>\n            &lt;version>1.18.38&lt;\/version>\n        &lt;\/dependency>\n        &lt;dependency>\n            &lt;groupId>org.springframework.boot&lt;\/groupId>\n            &lt;artifactId>spring-boot-starter-test&lt;\/artifactId>\n            &lt;scope>test&lt;\/scope>\n        &lt;\/dependency>\n    &lt;\/dependencies>\n\n    &lt;build>\n        &lt;plugins>\n            &lt;plugin>\n                &lt;groupId>org.springframework.boot&lt;\/groupId>\n                &lt;artifactId>spring-boot-maven-plugin&lt;\/artifactId>\n            &lt;\/plugin>\n            &lt;plugin>\n                &lt;groupId>org.apache.maven.plugins&lt;\/groupId>\n                &lt;artifactId>maven-compiler-plugin&lt;\/artifactId>\n                &lt;version>3.11.0&lt;\/version>\n                &lt;configuration>\n                    &lt;compilerArgs>\n                        &lt;arg>-parameters&lt;\/arg>\n                    &lt;\/compilerArgs>\n                    &lt;source>21&lt;\/source>\n                    &lt;target>21&lt;\/target>\n                &lt;\/configuration>\n            &lt;\/plugin>\n        &lt;\/plugins>\n    &lt;\/build>\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8018\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=SAA-18TodayMenu\n\n\n# ====SpringAIAlibaba Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u542f\u52a8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Saa18TodayMenuApplication\n{\n\n    public static void main(String&#91;] args)\n    {\n        SpringApplication.run(Saa18TodayMenuApplication.class, args);\n    }\n}<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h5>\n\n\n\n<p>\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class DashScopeConfig\n{\n\n    @Value(\"${spring.ai.dashscope.api-key}\")\n    private String apiKey;\n\n    @Bean\n    public DashScopeApi dashScopeApi() {\n        return DashScopeApi.builder()\n                .apiKey(apiKey)\n                .build();\n    }\n\n    @Bean\n    public ChatClient chatClient(ChatModel dashscopeChatModel) {\n        return ChatClient.builder(dashscopeChatModel).build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.atguigu.study.controller;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport reactor.core.publisher.Flux;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-09-11 19:00\n * @Description TODO\n *\/\n\n@RestController\npublic class MenuController\n{\n    @Resource\n    private ChatModel chatModel;\n\n    @GetMapping(value = \"\/eat\")\n    public Flux&lt;String> eat(@RequestParam(name = \"msg\",defaultValue = \"\u4eca\u5929\u5403\u4ec0\u4e48\") String question)\n    {\n        String info = \"\"\"\n                \u4f60\u662f\u4e00\u4e2aAI\u53a8\u5e08\u52a9\u624b,\u6bcf\u6b21\u968f\u673a\u751f\u6210\u4e09\u4e2a\u5bb6\u5e38\u83dc\uff0c\u5e76\u4e14\u63d0\u4f9b\u8fd9\u4e9b\u5bb6\u5e38\u83dc\u7684\u8be6\u7ec6\u505a\u6cd5\u6b65\u9aa4\uff0c\u4ee5HTML\u683c\u5f0f\u8fd4\u56de\n                \u5b57\u6570\u63a7\u5236\u57281500\u5b57\u4ee5\u5185\u3002\n                \"\"\";\n        \/\/ \u7cfb\u7edf\u6d88\u606f\n        SystemMessage systemMessage = new SystemMessage(info);\n        \/\/ \u7528\u6237\u6d88\u606f\n        UserMessage userMessage = new UserMessage(question);\n\n        Prompt prompt = new Prompt(userMessage, systemMessage);\n\n        return chatModel.stream(prompt).map(response -> response.getResults().get(0).getOutput().getText());\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-414-1024x796.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"796\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-414-1024x796.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8852\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">2.\u4f7f\u7528\u963f\u91ccSAA\u751f\u6001 -\u91cd\u70b9<\/h4>\n\n\n\n<p>\u5de5\u4f5c\u6d41\u914d\u7f6e<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-415-1024x508.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"508\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-415-1024x508.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8853\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5199YML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=6020\n\n# \u8bbe\u7f6e\u5168\u5c40\u7f16\u7801\u683c\u5f0f\nserver.servlet.encoding.enabled=true\nserver.servlet.encoding.force=true\nserver.servlet.encoding.charset=UTF-8\n\nspring.application.name=springAI-20chat-TodayMenu\n\n# ====LLM Config=============\nspring.ai.dashscope.api-key=${aliQwen-api}\n# SAA PlatForm today's menu Agent app-id\nspring.ai.dashscope.agent.options.app-id=f0a4613e6bd540c5bcd55e137e3b0e35<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u4e1a\u52a1\u7c7b<\/h5>\n\n\n\n<p>\u914d\u7f6e\u7c7bLLMConfig<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.config;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class DashScopeConfig\n{\n\n    @Value(\"${spring.ai.dashscope.api-key}\")\n    private String apiKey;\n\n    @Bean\n    public DashScopeApi dashScopeApi() {\n        return DashScopeApi.builder()\n                .apiKey(apiKey)\n                .build();\n    }\n\n    @Bean\n    public ChatClient chatClient(ChatModel dashscopeChatModel) {\n        return ChatClient.builder(dashscopeChatModel).build();\n    }\n}<\/code><\/pre>\n\n\n\n<p>controller<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.zzyy.study.controller;\n\nimport com.alibaba.cloud.ai.dashscope.agent.DashScopeAgent;\nimport com.alibaba.cloud.ai.dashscope.agent.DashScopeAgentOptions;\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeAgentApi;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n\/**\n * @auther zzyybs@126.com\n * @create 2025-08-13 19:01\n * @Description TODO\n *\/\n@RestController\npublic class MenuCallAgentController\n{\n    \/\/ \u767e\u70bc\u5e73\u53f0\u7684appid\n    @Value(\"${spring.ai.dashscope.agent.options.app-id}\")\n    private String APPID;\n    \/\/ \u767e\u70bc\u4e91\u7aef\u667a\u80fd\u4f53\u8c03\u7528\u5bf9\u8c61\n       private DashScopeAgent agent;\n    \/\/\u6784\u9020\u65b9\u6cd5\u6ce8\u5165\uff0c\u521b\u5efa\u767e\u70bc\u4e91\u7aef\u667a\u80fd\u4f53\u5bf9\u8c61\n       public MenuCallAgentController(DashScopeAgentApi agentApi)\n    {\n        this.agent = new DashScopeAgent(agentApi);\n    }\n\n    \/**\n     * http:\/\/localhost:8018\/eatAgent\n     * @param topic\n     * @return\n     *\/\n    @GetMapping(\"\/eatAgent\")\n    public String eatAgent(@RequestParam(name = \"topic\",defaultValue = \"\u4eca\u5929\u4e2d\u5348\u5403\u4ec0\u4e48\") String topic)\n    {\n        DashScopeAgentOptions options = DashScopeAgentOptions.builder().withAppId(APPID).build();\n\n        Prompt prompt = new Prompt(topic, options);\n\n        return agent.call(prompt).getResult().getOutput().getText();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-416-1024x643.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"643\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-416-1024x643.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8854\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">4.\u667a\u80fd\u4f53<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u662f\u4ec0\u4e48<\/h4>\n\n\n\n<p>\u201c\u667a\u80fd\u4f53\u201d\u662f\u4ece\u5bf9\u8bdd\u5de5\u5177\u8fdb\u5316\u4e3a\u6570\u5b57\u52a9\u624b\uff0c\u80fd\u50cf\u4eba\u7c7b\u52a9\u7406\u4e00\u6837\u5b8c\u6210\u7aef\u5230\u7aef\u7684\u590d\u6742\u4efb\u52a1\uff0c\u6838\u5fc3\u7a81\u7834\u5728\u4e8e\u4e3b\u52a8\u6027\u548c\u73af\u5883\u64cd\u4f5c\u80fd\u529b<\/p>\n\n\n\n<p>\u667a\u80fd\u4f53\uff08Agent\uff09\u6307\u7684\u662f\u4e00\u79cd\u5e94\u7528\uff0c<strong>\u5b83\u4f9d\u9760\u5927\u6a21\u578b\u8fdb\u884c\u81ea\u4e3b\u51b3\u7b56<\/strong>\uff0c\u5728\u4e0e\u7528\u6237\u8fdb\u884c\u81ea\u7136\u8bed\u8a00\u4ea4\u4e92\u7684\u65f6\u5019\uff0c\u6839\u636e\u7528\u6237\u95ee\u9898\u80fd\u591f\u81ea\u4e3b\u611f\u77e5\u73af\u5883\u3001<strong>\u505a\u51fa\u51b3\u7b56\u5e76\u6267\u884c\u884c\u52a8\u7684\u7cfb\u7edf<\/strong>\u3002\u5b83\u4e0d\u4ec5\u4ec5\u662f\u88ab\u52a8\u56de\u7b54\u95ee\u9898\uff0c\u800c\u662f\u50cf\u201c\u6709\u81ea\u4e3b\u610f\u8bc6\u7684\u7a0b\u5e8f\u201d\uff0c\u80fd\u4e3b\u52a8\u5b8c\u6210\u590d\u6742\u4efb\u52a1<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e3e\u4e2a\u4f8b\u5b50<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u666e\u901a\u5927\u6a21\u578b\n<ul class=\"wp-block-list\">\n<li>\u95ee\u9898\u63d0\u95ee\u8c03\u7528\uff1a\u4f60\u95ee\u201c\u4e0a\u6d77\u660e\u5929\u5929\u6c14\u5982\u4f55\uff1f\u201d\u5b83\u8fd4\u56de\u4e00\u6bb5\u6587\u5b57\u63cf\u8ff0\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u667a\u80fd\u4f53\n<ul class=\"wp-block-list\">\n<li>\u4f60\u8bf4\u201c\u5982\u679c\u660e\u5929\u4e0b\u96e8\uff0c\u63d0\u9192\u6211\u5e26\u4f1e\uff0c\u5e76\u53d6\u6d88\u660e\u5929\u7684\u6237\u5916\u4f1a\u8bae\u3002\u201d\u5b83\u4f1a\u67e5\u8be2\u5929\u6c14\u2192\u8bbe\u5b9a\u63d0\u9192\u2192\u68c0\u67e5\u65e5\u5386\u2192\u53d1\u9001\u4f1a\u8bae\u53d6\u6d88\u90ae\u4ef6\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u80fd\u5e72\u561b<\/h4>\n\n\n\n<p>\u5178\u578b\u5e94\u7528\u573a\u666f<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u81ea\u52a8\u5316\u529e\u516c\uff1a\u667a\u80fd\u4f53\u8bfb\u53d6\u90ae\u4ef6\u3001\u751f\u6210\u62a5\u544a\u3001\u5b89\u6392\u4f1a\u8bae\u3002<\/li>\n\n\n\n<li>\u667a\u80fd\u5bb6\u5c45\uff1a\u6839\u636e\u4f60\u7684\u4f5c\u606f\u81ea\u52a8\u8c03\u8282\u706f\u5149\u3001\u7a7a\u8c03\uff0c\u751a\u81f3\u8ba2\u8d2d\u7269\u8d44\u3002<\/li>\n\n\n\n<li>\u590d\u6742\u95ee\u9898\u89e3\u51b3\uff1a\u5982\u201c\u5e2e\u6211\u75281\u4e07\u5143\u9884\u7b97\u7b56\u5212\u4e00\u573a50\u4eba\u7684\u516c\u53f8\u56e2\u5efa\u201d\uff0c\u5b83\u4f1a\u62c6\u89e3\u9700\u6c42\u3001\u641c\u7d22\u573a\u5730\u3001\u6bd4\u4ef7\u3001\u751f\u6210\u65b9\u6848<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u600e\u4e48\u7528<\/h4>\n\n\n\n<p>\u963f\u91cc\u4e91\u767e\u70bc\u5e73\u53f0<\/p>\n\n\n\n<p><a href=\"https:\/\/bailian.console.aliyun.com\">https:\/\/bailian.console.aliyun.com<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-418-1024x462.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"462\" data-original=\"https:\/\/www.legendkiller.xyz\/wp-content\/uploads\/2025\/09\/image-418-1024x462.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-8856\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">\u901f\u901aSpringAI Alibaba\u5b8c\u7ed3<\/h2>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1.Spring AI Alibaba\u7406\u8bba\u6982\u8ff0 1.\u662f\u4ec0\u4e48 \u4ec0\u4e48\u662f Spring AI Alibaba SAA [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":8856,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22,1],"tags":[],"class_list":["post-8646","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-learn"],"_links":{"self":[{"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/posts\/8646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=8646"}],"version-history":[{"count":10,"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/posts\/8646\/revisions"}],"predecessor-version":[{"id":8857,"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/posts\/8646\/revisions\/8857"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/media\/8856"}],"wp:attachment":[{"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=8646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=8646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.legendkiller.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=8646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}