{"id":697,"date":"2026-07-01T09:10:37","date_gmt":"2026-07-01T01:10:37","guid":{"rendered":"https:\/\/larkdrop.cafe\/?p=697"},"modified":"2026-07-01T15:30:23","modified_gmt":"2026-07-01T07:30:23","slug":"spring-ai","status":"publish","type":"post","link":"https:\/\/larkdrop.cafe\/index.php\/2026\/07\/01\/spring-ai\/","title":{"rendered":"Spring AI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Spring AI \u672c\u8d28\u4e0a\u662f Spring \u751f\u6001\u91cc\u7684\u4e00\u5957\u5f00\u53d1\u6846\u67b6\uff0c\u5b83\u5e2e\u6211\u4eec\u89e3\u51b3\u7684\u95ee\u9898\u4ece\u201c\u8bbf\u95ee\u6570\u636e\u5e93\u3001\u8bbf\u95ee Redis\u3001\u8bbf\u95ee MQ\u201d\uff0c\u53d8\u6210\u4e86\u201c\u8bbf\u95ee\u5927\u6a21\u578b\u201d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u5b98\u65b9\u5bf9\u5b83\u7684\u5b9a\u4f4d\u53ef\u4ee5\u7406\u89e3\u4e3a\u4e09\u53e5\u8bdd\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>Spring AI<\/code>&nbsp;\u9879\u76ee\u7684\u76ee\u6807\uff0c\u662f\u8ba9\u5f00\u53d1\u8005\u53ef\u4ee5\u66f4\u7b80\u5355\u5730\u5f00\u53d1\u5305\u542b\u4eba\u5de5\u667a\u80fd\u80fd\u529b\u7684\u5e94\u7528\uff0c\u800c\u4e0d\u9700\u8981\u5f15\u5165\u4e0d\u5fc5\u8981\u7684\u590d\u6742\u5ea6\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u5927\u5bb6\u4e86\u89e3 Python \u751f\u6001\u91cc\u7684&nbsp;<code>LangChain<\/code>\uff0c\u53ef\u4ee5\u628a Spring AI \u7406\u89e3\u4e3a Java \/ Spring \u751f\u6001\u4e2d\u5bf9\u6807 LangChain \u7684\u4e00\u5957 AI \u5e94\u7528\u5f00\u53d1\u6846\u67b6\u3002<\/li>\n\n\n\n<li>Spring AI \u8981\u89e3\u51b3\u7684\u6838\u5fc3\u95ee\u9898\u662f\uff1a<code>Connecting your enterprise Data and APIs with AI Models<\/code>\uff0c\u4e5f\u5c31\u662f\u628a\u4f01\u4e1a\u81ea\u5df1\u7684\u6570\u636e\u3001\u4e1a\u52a1\u63a5\u53e3\u548c AI \u6a21\u578b\u8fde\u63a5\u8d77\u6765\u3002<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-147-1024x412.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"412\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-147-1024x412.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-698\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528Spring AI \u6240\u9700\u7684\u4f9d\u8d56\u548c\u914d\u7f6e\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n&lt;properties&gt;\n    &lt;spring-ai.version&gt;1.0.0&lt;\/spring-ai.version&gt;\n&lt;\/properties&gt;\n\n&lt;dependencyManagement&gt;\n    &lt;dependencies&gt;\n        &lt;!-- Spring AI BOM\uff1a\u7edf\u4e00\u7ba1\u7406 Spring AI \u76f8\u5173\u4f9d\u8d56\u7248\u672c --&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&lt;dependencies&gt;\n    &lt;!-- Spring AI OpenAI \u517c\u5bb9\u63a5\u53e3\u4f9d\u8d56 --&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;\/dependencies&gt;\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u7684&nbsp;<code>spring-ai-openai-spring-boot-starter<\/code>&nbsp;\u4e0d\u4e00\u5b9a\u53ea\u80fd\u8bbf\u95ee OpenAI \u5b98\u65b9\u6a21\u578b\u3002\u5f88\u591a\u56fd\u5185\u6a21\u578b\u5e73\u53f0\u3001\u672c\u5730\u6a21\u578b\u7f51\u5173\u3001\u516c\u53f8\u5185\u90e8\u6a21\u578b\u670d\u52a1\uff0c\u53ea\u8981\u63d0\u4f9b\u7684\u662f OpenAI \u517c\u5bb9\u63a5\u53e3\uff0c\u901a\u5e38\u90fd\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e00\u5957\u914d\u7f6e\u65b9\u5f0f\u63a5\u5165\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  ai:\n    openai:\n      # \u6a21\u578b\u63a5\u53e3\u5730\u5740\u3002\u53ef\u4ee5\u662f OpenAI \u5b98\u65b9\u5730\u5740\uff0c\u4e5f\u53ef\u4ee5\u662f\u517c\u5bb9 OpenAI \u534f\u8bae\u7684\u7b2c\u4e09\u65b9\u5e73\u53f0\u5730\u5740\n      base-url: https:\/\/dashscope.aliyuncs.com\/compatible-mode\n      # \u6a21\u578b\u5e73\u53f0\u63d0\u4f9b\u7684\u8bbf\u95ee\u5bc6\u94a5\uff0c\u7528\u6765\u8bc1\u660e\u201c\u4f60\u662f\u8c01\u3001\u6709\u6ca1\u6709\u6743\u9650\u8c03\u7528\u6a21\u578b\u201d\n      api-key: your-api-key\n      chat:\n        options:\n          # \u5177\u4f53\u4f7f\u7528\u54ea\u4e2a\u804a\u5929\u6a21\u578b\uff0c\u4f8b\u5982 gpt-4o-mini\u3001qwen-plus\u3001deepseek-chat \u7b49\n          model: qwen-plus\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u901a\u5e38\u4f1a\u628aAPI-KEY\u914d\u7f6e\u5230\u73af\u5883\u53d8\u91cf\u91cc\u9762\uff0c\u914d\u7f6eyml\u7684\u65f6\u5019\u5199api-key\uff1a${API-KEY}<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u91cd\u70b9\u89e3\u91ca\u4e24\u4e2a\u914d\u7f6e\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u914d\u7f6e<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u542b\u4e49<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4ece\u54ea\u91cc\u83b7\u53d6<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>base-url<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6a21\u578b\u670d\u52a1\u7684\u63a5\u53e3\u5730\u5740<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6a21\u578b\u5e73\u53f0\u63a7\u5236\u53f0\u3001\u516c\u53f8\u5185\u90e8\u6a21\u578b\u7f51\u5173\u6587\u6863\u3001\u672c\u5730\u6a21\u578b\u670d\u52a1\u5730\u5740<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>api-key<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u8c03\u7528\u6a21\u578b\u65f6\u4f7f\u7528\u7684\u5bc6\u94a5<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6a21\u578b\u5e73\u53f0\u63a7\u5236\u53f0\u521b\u5efa\uff0c\u6216\u7531\u516c\u53f8\u7edf\u4e00\u5206\u914d<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5927\u5bb6\u53ef\u4ee5\u7c7b\u6bd4\u4ee5\u524d\u8fde\u6570\u636e\u5e93\uff1a\u6570\u636e\u5e93\u8981\u6709&nbsp;<code>url<\/code>\uff0c\u6a21\u578b\u4e5f\u8981\u6709&nbsp;<code>base-url<\/code>\uff1b\u6570\u636e\u5e93\u8981\u6709\u7528\u6237\u540d\u5bc6\u7801\uff0c\u6a21\u578b\u4e5f\u8981\u6709&nbsp;<code>api-key<\/code>\uff1b\u6570\u636e\u5e93\u8981\u6307\u5b9a\u5e93\u540d\u548c\u9a71\u52a8\uff0c\u6a21\u578b\u4e5f\u8981\u6307\u5b9a&nbsp;<code>model<\/code>\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prompt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u4f7f\u7528Spring AI \u524d\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u5148\u8bb2&nbsp;<code>Prompt<\/code>\uff0c\u4e5f\u5c31\u662f\u63d0\u793a\u8bcd\u3002\u56e0\u4e3a\u6211\u4eec\u4f7f\u7528\u6a21\u578b\u65f6\uff0c\u6a21\u578b\u5230\u5e95\u600e\u4e48\u56de\u7b54\uff0c\u5f88\u5927\u7a0b\u5ea6\u7531\u63d0\u793a\u8bcd\u51b3\u5b9a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u8981\u5f3a\u8c03\u4e00\u4e0b\uff0c\u672c\u8bfe\u7a0b\u4e2d\u6240\u8bf4\u7684\u201c\u6a21\u578b\u201d\uff0c\u4e3b\u8981\u6307\u7684\u662f\u5927\u8bed\u8a00\u6a21\u578b\uff0c\u4e5f\u5c31\u662f LLM\u3002\u5927\u8bed\u8a00\u6a21\u578b\u6709\u51e0\u4e2a\u975e\u5e38\u660e\u663e\u7684\u7279\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b83\u64c5\u957f\u7406\u89e3\u81ea\u7136\u8bed\u8a00\uff0c\u4e5f\u64c5\u957f\u751f\u6210\u6587\u672c\u3001\u603b\u7ed3\u6587\u672c\u3001\u6539\u5199\u6587\u672c\u3001\u62bd\u53d6\u4fe1\u606f\u3002<\/li>\n\n\n\n<li>\u5b83\u4e0d\u662f\u6570\u636e\u5e93\uff0c\u4e0d\u4fdd\u8bc1\u6bcf\u6b21\u90fd\u4e25\u683c\u8fd4\u56de\u56fa\u5b9a\u7ed3\u679c\u3002<\/li>\n\n\n\n<li>\u5b83\u4e0d\u662f\u4e1a\u52a1\u7cfb\u7edf\uff0c\u4e0d\u5929\u7136\u77e5\u9053\u6211\u4eec\u516c\u53f8\u7684\u6570\u636e\u548c\u63a5\u53e3\u3002<\/li>\n\n\n\n<li>\u5b83\u7684\u8f93\u51fa\u4f1a\u53d7\u5230\u4e0a\u4e0b\u6587\u548c\u63d0\u793a\u8bcd\u7684\u5f3a\u70c8\u5f71\u54cd\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\uff0c\u6211\u4eec\u548c\u5927\u6a21\u578b\u4ea4\u4e92\u65f6\uff0c\u4e0d\u80fd\u53ea\u95ee\u4e00\u53e5\u201c\u5e2e\u6211\u505a\u4e00\u4e0b\u201d\uff0c\u800c\u8981\u628a\u4efb\u52a1\u3001\u80cc\u666f\u3001\u8981\u6c42\u3001\u8f93\u51fa\u683c\u5f0f\u5c3d\u91cf\u8bb2\u6e05\u695a\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Message \u89d2\u8272<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u73b0\u5728\u7684\u5927\u6a21\u578b\u63d0\u793a\u8bcd\u901a\u5e38\u4e0d\u662f\u4e00\u6574\u6bb5\u7eaf\u6587\u672c\uff0c\u800c\u662f\u7531\u591a\u6761&nbsp;<code>Message<\/code>&nbsp;\u7ec4\u6210\u3002\u6bcf\u6761 Message \u90fd\u6709\u81ea\u5df1\u7684\u89d2\u8272\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u89d2\u8272<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f5c\u7528<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u7c7b\u6bd4<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>System<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u8bbe\u5b9a AI \u7684\u4eba\u8bbe\u3001\u884c\u4e3a\u51c6\u5219\u3001\u80cc\u666f\u77e5\u8bc6\u548c\u56de\u7b54\u8fb9\u754c<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5e55\u540e\u5bfc\u6f14<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>User<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u7528\u6237\u63d0\u51fa\u7684\u95ee\u9898\u3001\u6307\u4ee4\u6216\u9700\u6c42<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u63d0\u95ee\u7684\u4eba<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>Assistant<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5927\u6a21\u578b\u4e4b\u524d\u7684\u56de\u590d\uff0c\u5e38\u7528\u4e8e\u7ef4\u6301\u591a\u8f6e\u5bf9\u8bdd\u4e0a\u4e0b\u6587<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u804a\u5929\u8bb0\u5f55\u91cc\u7684 AI \u56de\u590d<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>Tool<\/code>&nbsp;\/&nbsp;<code>Function<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5de5\u5177\u6267\u884c\u540e\u7684\u7ed3\u679c\uff0c\u7528\u6765\u544a\u8bc9\u6a21\u578b\u5de5\u5177\u8fd4\u56de\u4e86\u4ec0\u4e48<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5916\u90e8\u7cfb\u7edf\u67e5\u8be2\u7ed3\u679c<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nSystem: \u4f60\u662f\u4e00\u540d\u7ecf\u9a8c\u4e30\u5bcc\u7684 Java \u8bb2\u5e08\uff0c\u56de\u7b54\u8981\u9002\u5408\u521d\u5b66\u8005\u3002\nUser: \u8bf7\u89e3\u91ca\u4e00\u4e0b\u4ec0\u4e48\u662f Spring Bean\u3002\nAssistant: Spring Bean \u5c31\u662f\u4ea4\u7ed9 Spring \u5bb9\u5668\u7ba1\u7406\u7684\u5bf9\u8c61\u2026\u2026\nUser: \u90a3\u5b83\u548c new \u51fa\u6765\u7684\u5bf9\u8c61\u6709\u4ec0\u4e48\u533a\u522b\uff1f\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u6bcf\u4e00\u884c\u90fd\u53ef\u4ee5\u770b\u4f5c\u4e00\u6761\u6d88\u606f\uff0c\u591a\u6761\u6d88\u606f\u7ec4\u5408\u8d77\u6765\uff0c\u624d\u6784\u6210\u4e00\u6b21\u5b8c\u6574\u7684 Prompt\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prompt \u6838\u5fc3\u8981\u70b9<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u5b98\u65b9\u6587\u6863\u4e2d\u63d0\u5230\uff0c\u8bbe\u8ba1 Prompt \u65f6\u901a\u5e38\u9700\u8981\u8003\u8651\u51e0\u4e2a\u7ec4\u6210\u90e8\u5206\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Instructions<\/code>\uff1a\u660e\u786e\u6307\u4ee4\u3002\u544a\u8bc9 AI \u8981\u505a\u4ec0\u4e48\uff0c\u5c31\u50cf\u6211\u4eec\u7ed9\u4e00\u4e2a\u540c\u4e8b\u5b89\u6392\u4efb\u52a1\u4e00\u6837\uff0c\u8d8a\u6e05\u6670\u8d8a\u597d\u3002<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>External Context<\/code>\uff1a\u5916\u90e8\u4e0a\u4e0b\u6587\u3002\u628a\u76f8\u5173\u80cc\u666f\u3001\u8d44\u6599\u3001\u7ea6\u675f\u6761\u4ef6\u8865\u5145\u8fdb\u53bb\uff0c\u8ba9 AI \u77e5\u9053\u5f53\u524d\u4efb\u52a1\u53d1\u751f\u5728\u4ec0\u4e48\u573a\u666f\u91cc\u3002<\/li>\n\n\n\n<li><code>User Input<\/code>\uff1a\u7528\u6237\u8f93\u5165\u3002\u4e5f\u5c31\u662f\u7528\u6237\u771f\u6b63\u63d0\u51fa\u7684\u95ee\u9898\u6216\u9700\u6c42\u3002<\/li>\n\n\n\n<li><code>Output Indicator<\/code>\uff1a\u8f93\u51fa\u683c\u5f0f\u8981\u6c42\u3002\u544a\u8bc9 AI \u5e0c\u671b\u4ee5\u4ec0\u4e48\u683c\u5f0f\u8fd4\u56de\uff0c\u6bd4\u5982 JSON\u3001\u8868\u683c\u3001\u5217\u8868\u7b49\u3002 \/\/ \u62ff\u5230\u7684\u662f\u5bf9\u8c61 \u201c\u59d3\u540d\u5f20\u4e09\uff0c&#8221;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u6211\u4eec\u53ea\u662f\u95ee\u201c\u5e2e\u6211\u5206\u6790\u4e00\u4e0b\u8fd9\u4e2a\u75c5\u4eba\u201d\uff0c\u6a21\u578b\u4e0d\u77e5\u9053\u75c5\u4eba\u4fe1\u606f\u5728\u54ea\u91cc\uff0c\u4e5f\u4e0d\u77e5\u9053\u5206\u6790\u76ee\u6807\u662f\u4ec0\u4e48\u3002\u66f4\u597d\u7684 Prompt \u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u4f60\u662f\u4e00\u540d\u667a\u80fd\u5206\u8bca\u52a9\u624b\u3002\n\u8bf7\u6839\u636e\u4e0b\u9762\u7684\u60a3\u8005\u63cf\u8ff0\uff0c\u5224\u65ad\u60a3\u8005\u53ef\u80fd\u9700\u8981\u6302\u54ea\u4e2a\u79d1\u5ba4\u3002\n\u8981\u6c42\uff1a\n1. \u53ea\u80fd\u4ece \u5185\u79d1\u3001\u5916\u79d1\u3001\u513f\u79d1\u3001\u6025\u8bca\u79d1 \u4e2d\u9009\u62e9\u3002\n2. \u7ed9\u51fa 1 \u53e5\u7b80\u77ed\u7406\u7531\u3002\n3. \u4f7f\u7528 JSON \u683c\u5f0f\u8fd4\u56de\u3002\n\n\u60a3\u8005\u63cf\u8ff0\uff1a\u53d1\u70ed 3 \u5929\uff0c\u54b3\u55fd\uff0c\u54bd\u75db\uff0c\u65e0\u660e\u663e\u80f8\u75db\u3002\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a Prompt \u5c31\u660e\u663e\u66f4\u5bb9\u6613\u5f97\u5230\u7a33\u5b9a\u7ed3\u679c\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b80\u5355\u4e00\u8f6e\u5bf9\u8bdd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u771f\u6b63\u8bbf\u95ee\u5927\u6a21\u578b\u65f6\uff0cSpring AI \u4e2d\u6700\u6838\u5fc3\u7684\u5bf9\u8c61\u4e4b\u4e00\u5c31\u662f&nbsp;<code>ChatClient<\/code>\u3002\u5927\u5bb6\u53ef\u4ee5\u628a&nbsp;<code>ChatClient<\/code>&nbsp;\u7c7b\u6bd4\u6210\u4ee5\u524d\u4f7f\u7528\u7684&nbsp;<code>RedissionClient<\/code>&nbsp;\u6216\u8005&nbsp;<code>RestTemplate<\/code>\uff1a<code>RestTemplate<\/code>&nbsp;\u7528\u6765\u8bbf\u95ee\u666e\u901a HTTP \u670d\u52a1\uff0c<code>ChatClient<\/code>&nbsp;\u7528\u6765\u8bbf\u95ee\u804a\u5929\u6a21\u578b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u5148\u6765\u770b\u4e0b\u5982\u4f55\u5f97\u5230\u4e00\u4e2aChatClient\u5bf9\u8c61<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class SpringAIConfig {\n\n    \/**\n     * \u521b\u5efa ChatClient \u5bf9\u8c61\u3002\n     * ChatClient.Builder \u7531 Spring AI \u81ea\u52a8\u63d0\u4f9b\uff0c\u5b83\u4f1a\u8bfb\u53d6 application.yml \u4e2d\u7684\u6a21\u578b\u914d\u7f6e\u3002\n     *\/\n    @Bean\n    public ChatClient chatClient(ChatClient.Builder builder) {\n        return builder.build();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u63a5\u7740\u5b9a\u4e49\u4e00\u4e2a Controller \u6d4b\u8bd5\u6700\u7b80\u5355\u7684\u4e00\u8f6e\u5bf9\u8bdd\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\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\n@RestController\npublic class ChatController {\n\n    private final ChatClient chatClient;\n\n    public ChatController(ChatClient chatClient) {\n        this.chatClient = chatClient;\n    }\n\n    @GetMapping(\"\/ai\")\n    public String generation(@RequestParam String userInput) {\n        return this.chatClient\n                .prompt()\n                .user(userInput)\n                .call()\n                .content();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u6bb5\u4ee3\u7801\u7684\u8c03\u7528\u94fe\u975e\u5e38\u91cd\u8981\uff1a<code>chatClient.prompt().user(userInput).call().content()<\/code>\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>prompt()<\/code>\uff1a\u5f00\u59cb\u6784\u5efa\u4e00\u6b21\u63d0\u793a\u8bcd\u8bf7\u6c42\u3002<\/li>\n\n\n\n<li><code>user(userInput)<\/code>\uff1a\u6dfb\u52a0\u4e00\u6761\u7528\u6237\u6d88\u606f\u3002<\/li>\n\n\n\n<li><code>call()<\/code>\uff1a\u5411\u6a21\u578b\u53d1\u8d77\u540c\u6b65\u8c03\u7528\u3002<\/li>\n\n\n\n<li><code>content()<\/code>\uff1a\u53d6\u51fa\u6a21\u578b\u8fd4\u56de\u7684\u6587\u672c\u5185\u5bb9\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5199\u5b8c\u540e\uff0c\u53ef\u4ee5\u4f7f\u7528 ApiFox \u6216\u6d4f\u89c8\u5668\u8bbf\u95ee\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nGET http:\/\/localhost:8080\/ai?userInput=\u8bf7\u7528\u4e00\u53e5\u8bdd\u4ecb\u7ecdSpring AI\n```<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7cfb\u7edf\u6d88\u606f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5728\u4e0a\u4e00\u8282\u7684\u57fa\u7840\u4e0a\u518d\u52a0\u5165\u7cfb\u7edf\u6d88\u606f\u3002\u5728ChatClient\u4e2d\u6dfb\u52a0\u7cfb\u7edf\u6d88\u606f\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5c40\u90e8\u6dfb\u52a0\u7cfb\u7edf\u6d88\u606f<\/li>\n\n\n\n<li>\u6dfb\u52a0\u9ed8\u8ba4\u7cfb\u7edf\u6d88\u606f<\/li>\n\n\n\n<li>\u4f7f\u7528\u52a8\u6001\u53c2\u6570<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c40\u90e8\u7cfb\u7edf\u6d88\u606f\u53ea\u5bf9\u5f53\u524d\u8fd9\u4e00\u6b21\u8c03\u7528\u751f\u6548\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@GetMapping(\"\/ai\/java-teacher\")\npublic String javaTeacher(@RequestParam String question) {\n    return chatClient.prompt()\n            .system(\"\u4f60\u662f\u4e00\u540d\u7ecf\u9a8c\u4e30\u5bcc\u7684Java\u8bb2\u5e08\uff0c\u56de\u7b54\u8981\u9002\u5408\u521d\u5b66\u8005\uff0c\u5c3d\u91cf\u4f7f\u7528\u5927\u767d\u8bdd\u3002\")\n            .user(question)\n            .call()\n            .content();\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u4e00\u4e2a&nbsp;<code>ChatClient<\/code>&nbsp;\u5728\u6574\u4e2a\u9879\u76ee\u4e2d\u90fd\u5e0c\u671b\u4f7f\u7528\u540c\u4e00\u5957\u7cfb\u7edf\u8bbe\u5b9a\uff0c\u53ef\u4ee5\u5728\u6784\u5efa&nbsp;<code>ChatClient<\/code>&nbsp;\u65f6\u8bbe\u7f6e\u9ed8\u8ba4\u7cfb\u7edf\u6d88\u606f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@Bean\npublic ChatClient javaTeacherChatClient(ChatClient.Builder builder) {\n    return builder\n            .defaultSystem(\"\u4f60\u662f\u4e00\u540d\u7ecf\u9a8c\u4e30\u5bcc\u7684Java\u8bb2\u5e08\uff0c\u56de\u7b54\u8981\u6e05\u6670\u3001\u51c6\u786e\u3001\u9002\u5408\u521d\u5b66\u8005\u3002\")\n            .build();\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u65f6\u5019\u7cfb\u7edf\u6d88\u606f\u4e2d\u6709\u4e00\u90e8\u5206\u5185\u5bb9\u662f\u52a8\u6001\u7684\u3002\u6b64\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u7cfb\u7edf\u6d88\u606f\u4e2d\u6dfb\u52a0\u5360\u4f4d\u7b26\uff0c\u5728\u6267\u884c\u65f6\u52a8\u6001\u4f20\u9012\u53c2\u6570\u586b\u5145\u7cfb\u7edf \u6d88\u606f\u4e2d\u7684\u5360\u4f4d\u7b26<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@Bean\npublic ChatClient dynamicTeacherChatClient(ChatClient.Builder builder) {\n    return builder\n            \/\/ \u8fd9\u91cc\u6ce8\u610f\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5360\u4f4d\u7b26\u7684\u683c\u5f0f\u662f{\u5360\u4f4d\u7b26\u540d\u79f0}\n            .defaultSystem(\"\u4f60\u662f\u4e00\u540d{language}\u8bb2\u5e08\uff0c\u8bf7\u4f7f\u7528{style}\u7684\u65b9\u5f0f\u56de\u7b54\u95ee\u9898\u3002\")\n            .build();\n}\n```<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@GetMapping(\"\/ai\/dynamic-teacher\")\npublic String dynamicTeacher(@RequestParam String question,\n                             @RequestParam(defaultValue = \"Java\") String language,\n                             @RequestParam(defaultValue = \"\u5927\u767d\u8bdd\") String style) {\n    return chatClient.prompt()\n            .system(prompt -&gt; prompt\n                    .param(\"language\", language)\n                    .param(\"style\", style))\n            .user(question)\n            .call()\n            .content();\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a\u5982\u679c\u7cfb\u7edf\u6d88\u606f\u4e2d\u5199\u4e86&nbsp;<code>{language}<\/code>\u3001<code>{style}<\/code>&nbsp;\u8fd9\u79cd\u53c2\u6570\u5360\u4f4d\u7b26\uff0c\u4f46\u662f\u8c03\u7528\u65f6\u6ca1\u6709\u63d0\u4f9b\u5bf9\u5e94\u53c2\u6570\uff0cSpring AI \u4f1a\u5728\u6a21\u677f\u6e32\u67d3\u9636\u6bb5\u62a5\u9519\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7ed3\u6784\u5316\u8f93\u51fa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u548c\u6a21\u578b\u4ea4\u4e92\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6a21\u578b\u7ed9\u6211\u4eec\u8fd4\u56de\u7684\u901a\u5e38\u90fd\u662f\u666e\u901a\u5b57\u7b26\u4e32\u3002\u4f46\u662f\u5728\u771f\u5b9e\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4e0d\u5e0c\u671b\u6a21\u578b\u8fd4\u56de\u4e00\u6bb5\u81ea\u7136\u8bed\u8a00\uff0c\u800c\u662f\u5e0c\u671b\u5b83\u8fd4\u56de\u7ed3\u6784\u5316\u7684\u6570\u636e\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\u8ba9\u6a21\u578b\u751f\u6210\u67d0\u4e2a\u6f14\u5458\u7684\u7535\u5f71\u4f5c\u54c1\u5217\u8868\uff0c\u5982\u679c\u53ea\u8fd4\u56de\u4e00\u6bb5\u666e\u901a\u6587\u672c\uff0c\u540e\u7aef\u8fd8\u8981\u81ea\u5df1\u89e3\u6790\uff1b\u5982\u679c\u76f4\u63a5\u8fd4\u56de Java \u5bf9\u8c61\uff0c\u540e\u7eed\u4ee3\u7801\u5904\u7406\u5c31\u4f1a\u65b9\u4fbf\u5f88\u591a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u7684&nbsp;<code>ChatClient<\/code>&nbsp;\u63d0\u4f9b\u4e86\u4e00\u4e2a\u975e\u5e38\u76f4\u63a5\u7684\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n.call()\n.entity(\u76ee\u6807\u7c7b\u578b)\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u6211\u4eec\u4e0d\u5c55\u5f00\u8bb2\u5404\u79cd&nbsp;<code>xxxConverter<\/code>\uff0c\u53ea\u56f4\u7ed5\u5b98\u65b9\u6587\u6863\u4e2d&nbsp;<code>entity()<\/code>&nbsp;\u7684\u7528\u6cd5\u770b\u4e09\u79cd\u60c5\u51b5\uff1a\u666e\u901a\u5bf9\u8c61\u3001<code>List<\/code>\u3001<code>Map<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u666e\u901a\u5bf9\u8c61<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b98\u65b9\u6587\u6863\u4e2d\u7b2c\u4e00\u4e2a\u4f8b\u5b50\u662f\uff1a\u751f\u6210\u67d0\u4e2a\u6f14\u5458\u7684 5 \u90e8\u7535\u5f71\u4f5c\u54c1\uff0c\u5e76\u628a\u7ed3\u679c\u6620\u5c04\u6210\u4e00\u4e2a\u5bf9\u8c61\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5148\u5b9a\u4e49\u4e00\u4e2a\u666e\u901a Java Bean\u3002\u5b98\u65b9\u6587\u6863\u91cc\u4f7f\u7528\u7684\u662f&nbsp;<code>record<\/code>\uff0c\u4f46\u6211\u4eec\u8bfe\u7a0b\u4e2d\u4e3a\u4e86\u548c\u5927\u5bb6\u524d\u9762\u5b66\u4e60\u7684 Java Bean \u4fdd\u6301\u4e00\u81f4\uff0c\u8fd9\u91cc\u6539\u6210\u666e\u901a\u7c7b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@Data\npublic class ActorsFilms {\n\n    private String actor;\n    private List&lt;String&gt; movies;\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u4f7f\u7528&nbsp;<code>entity(ActorsFilms.class)<\/code>&nbsp;\u63a5\u6536\u7ed3\u679c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\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\n@RestController\npublic class StructuredOutputController {\n\n    private final ChatClient chatClient;\n\n    public StructuredOutputController(ChatClient chatClient) {\n        this.chatClient = chatClient;\n    }\n\n    \/**\n     * \u793a\u4f8b\u8bf7\u6c42\uff1aGET \/ai\/actor-films?actor=Tom Hanks\n     *\/\n    @GetMapping(\"\/ai\/actor-films\")\n    public ActorsFilms actorFilms(@RequestParam(defaultValue = \"Tom Hanks\") String actor) {\n        return chatClient.prompt()\n                .user(user -&gt; user\n                        .text(\"Generate the filmography of 5 movies for {actor}.\")\n                        .param(\"actor\", actor))\n                .call()\n                .entity(ActorsFilms.class);\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u6700\u5173\u952e\u7684\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n.entity(ActorsFilms.class)\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u8868\u793a\u8ba9 Spring AI \u5c1d\u8bd5\u628a\u6a21\u578b\u8f93\u51fa\u6620\u5c04\u6210\u4e00\u4e2a&nbsp;<code>ActorsFilms<\/code>&nbsp;\u5bf9\u8c61\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">List \u5bf9\u8c61<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\u79cd\u60c5\u51b5\uff1a\u5982\u679c\u6700\u5916\u5c42\u8fd4\u56de\u503c\u672c\u8eab\u5c31\u662f\u4e00\u4e2a&nbsp;<code>List<\/code>\uff0c\u6bd4\u5982\u4e00\u6b21\u751f\u6210 Tom Hanks \u548c Bill Murray \u4e24\u4e2a\u6f14\u5458\u7684\u7535\u5f71\u4f5c\u54c1\uff0c\u5c31\u9700\u8981\u4f7f\u7528&nbsp;<code>ParameterizedTypeReference<\/code>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.core.ParameterizedTypeReference;\nimport org.springframework.web.bind.annotation.GetMapping;\n\nimport java.util.List;\n\n@GetMapping(\"\/ai\/actor-films-list\")\npublic List&lt;ActorsFilms&gt; actorFilmsList() {\n    return chatClient.prompt()\n            .user(\"Generate the filmography of 5 movies for Tom Hanks and Bill Murray.\")\n            .call()\n            .entity(new ParameterizedTypeReference&lt;List&lt;ActorsFilms&gt;&gt;() {\n            });\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u7684\u91cd\u70b9\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n.entity(new ParameterizedTypeReference&lt;List&lt;ActorsFilms&gt;&gt;() {\n})\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u76f4\u63a5\u5199&nbsp;<code>List.class<\/code>\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u56e0\u4e3a Java \u6cdb\u578b\u5b58\u5728\u7c7b\u578b\u64e6\u9664\u3002\u5982\u679c\u53ea\u5199&nbsp;<code>List.class<\/code>\uff0c\u7a0b\u5e8f\u53ea\u80fd\u77e5\u9053\u7ed3\u679c\u662f\u4e00\u4e2a&nbsp;<code>List<\/code>\uff0c\u4f46\u4e0d\u77e5\u9053&nbsp;<code>List<\/code>&nbsp;\u91cc\u9762\u7684\u5143\u7d20\u5230\u5e95\u662f\u4ec0\u4e48\u7c7b\u578b\u3002\u6240\u4ee5\uff0c\u5f53\u6700\u5916\u5c42\u7ed3\u679c\u662f&nbsp;<code>List<\/code>&nbsp;\u65f6\uff0c\u8981\u7528&nbsp;<code>ParameterizedTypeReference&gt;<\/code>&nbsp;\u628a\u5b8c\u6574\u6cdb\u578b\u7c7b\u578b\u544a\u8bc9 Spring AI\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Map \u5bf9\u8c61<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e09\u79cd\u60c5\u51b5\uff1a\u5982\u679c\u6211\u4eec\u4e0d\u60f3\u63d0\u524d\u5b9a\u4e49 Java Bean\uff0c\u4e5f\u53ef\u4ee5\u8ba9\u6a21\u578b\u8fd4\u56de\u4e00\u4e2a&nbsp;<code>Map<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\uff1a\u8ba9\u6a21\u578b\u4ecb\u7ecd\u4e00\u5ea7\u57ce\u5e02\uff0c\u8fd4\u56de\u4e00\u4e2a\u5305\u542b\u82e5\u5e72\u5b57\u6bb5\u7684 JSON \u5bf9\u8c61\u3002\u56e0\u4e3a\u57ce\u5e02\u4fe1\u606f\u7684\u5b57\u6bb5\u5e76\u4e0d\u56fa\u5b9a\uff08\u6709\u7684\u57ce\u5e02\u53ef\u80fd\u591a\u4e00\u4e2a\u5b57\u6bb5\uff0c\u6709\u7684\u5c11\u4e00\u4e2a\uff09\uff0c\u7528&nbsp;<code>Map<\/code>&nbsp;\u63a5\u6536\u6700\u7701\u4e8b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.core.ParameterizedTypeReference;\nimport org.springframework.web.bind.annotation.GetMapping;\n\nimport java.util.Map;\n\n@GetMapping(\"\/ai\/city-info\")\npublic Map&lt;String, Object&gt; cityInfo() {\n    return chatClient.prompt()\n            .user(\"\u7528 JSON \u4ecb\u7ecd\u4e00\u4e0b\u5317\u4eac\uff0c\u5305\u542b\u57ce\u5e02\u540d\u79f0\u3001\u6240\u5c5e\u56fd\u5bb6\u3001\u4eba\u53e3\u6570\u91cf\u8fd9\u51e0\u4e2a\u5b57\u6bb5\")\n            .call()\n            .entity(new ParameterizedTypeReference&lt;Map&lt;String, Object&gt;&gt;() {\n            });\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u7684\u91cd\u70b9\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n.entity(new ParameterizedTypeReference&lt;Map&lt;String, Object&gt;&gt;() {\n})\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Map<\/code>&nbsp;\u7684\u7279\u70b9\u662f\u7075\u6d3b\uff0c\u4e0d\u9700\u8981\u63d0\u524d\u5b9a\u4e49\u7c7b\uff1b\u4f46\u662f\u7f3a\u70b9\u4e5f\u5f88\u660e\u663e\uff1a\u5b57\u6bb5\u540d\u548c\u5b57\u6bb5\u7c7b\u578b\u6ca1\u6709 Java \u7c7b\u7ea6\u675f\uff0c\u540e\u7eed\u53d6\u503c\u65f6\u66f4\u5bb9\u6613\u5199\u9519\uff0c\u4e5f\u53ef\u80fd\u9700\u8981\u624b\u52a8\u7c7b\u578b\u8f6c\u6362\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\u5b9e\u9645\u9879\u76ee\u4e2d\u53ef\u4ee5\u8fd9\u6837\u9009\u62e9\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u8fd4\u56de\u7c7b\u578b<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u5199\u6cd5<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u9002\u5408\u573a\u666f<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">\u666e\u901a\u5bf9\u8c61<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>.entity(ActorsFilms.class)<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6700\u5916\u5c42\u662f\u4e00\u4e2a\u7ed3\u6784\u7a33\u5b9a\u7684\u5bf9\u8c61<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>List&lt;\u5bf9\u8c61&gt;<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>.entity(new ParameterizedTypeReference&gt;() {})<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6700\u5916\u5c42\u662f\u4e00\u7ec4\u540c\u7c7b\u578b\u5bf9\u8c61<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>Map<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>.entity(new ParameterizedTypeReference&gt;() {})<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e34\u65f6\u9a8c\u8bc1\u3001\u5b57\u6bb5\u4e0d\u7a33\u5b9a\u3001\u7ed3\u6784\u6bd4\u8f83\u52a8\u6001<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u540e\u518d\u5f3a\u8c03\u4e00\u6b21\u5bf9\u8c61\u4e2d\u5305\u542b&nbsp;<code>List<\/code>&nbsp;\u7684\u60c5\u51b5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ActorsFilms<\/code>&nbsp;\u91cc\u9762\u6709&nbsp;<code>List movies<\/code>\uff0c\u4f46\u6700\u5916\u5c42\u662f&nbsp;<code>ActorsFilms<\/code>\uff0c\u6240\u4ee5\u7528&nbsp;<code>.entity(ActorsFilms.class)<\/code>\u3002<\/li>\n\n\n\n<li>\u53ea\u6709\u5f53\u6700\u5916\u5c42\u672c\u8eab\u5c31\u662f&nbsp;<code>List<\/code>&nbsp;\u65f6\uff0c\u624d\u4f7f\u7528&nbsp;<code>ParameterizedTypeReference&gt;<\/code>\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u591a\u8f6e\u5bf9\u8bdd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u9762\u7684\u63a5\u53e3\u90fd\u662f\u4e00\u95ee\u4e00\u7b54\u3002\u7528\u6237\u95ee\u4e00\u53e5\uff0c\u6a21\u578b\u7b54\u4e00\u53e5\u3002\u95ee\u9898\u662f\uff1a\u771f\u5b9e\u804a\u5929\u901a\u5e38\u662f\u591a\u8bba\u5bf9\u8bdd\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u7528\u6237\uff1a\u6211\u53d1\u70e7\u4e09\u5929\u4e86\u3002\n\u6a21\u578b\uff1a\u8fd8\u6709\u54b3\u55fd\u3001\u54bd\u75db\u5417\uff1f\n\u7528\u6237\uff1a\u6709\u54b3\u55fd\u3002\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e09\u53e5\u8bdd\u201c\u6709\u54b3\u55fd\u201d\u672c\u8eab\u6ca1\u6709\u5b8c\u6574\u542b\u4e49\u3002\u5982\u679c\u6a21\u578b\u4e0d\u77e5\u9053\u524d\u9762\u804a\u8fc7\u201c\u53d1\u70e7\u4e09\u5929\u201d\uff0c\u5c31\u65e0\u6cd5\u6b63\u786e\u7406\u89e3\uff0c\u4f46\u662f\u6211\u4eec\u77e5\u9053\u6a21\u578b\u53ea\u6709\u77ed\u671f\u8bb0\u5fc6\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\uff0c\u591a\u8f6e\u5bf9\u8bdd\u7684\u6838\u662f\u8ba9\u6a21\u578b\u5728\u5f53\u524d\u8bf7\u6c42\u4e2d\u770b\u5230\u4e4b\u524d\u7684\u804a\u5929\u8bb0\u5f55\uff0c\u800c\u8fd9\u5c31\u662f\u4f1a\u8bdd\u8bb0\u5fc6\u3002\u5b9e\u73b0\u4f1a\u8bdd\u8bb0\u5fc6\uff0c\u672c\u8d28\u4e0a\u8981\u89e3\u51b3\u4e09\u4e2a\u95ee\u9898\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b58\u5728\u54ea<\/strong>\uff1f<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u804a\u5929\u8bb0\u5f55\u8981\u5b58\u5728\u54ea\u91cc\uff1fSpring AI \u4e2d\u4f7f\u7528&nbsp;<code>ChatMemoryRepository<\/code>\u63a5\u53e3\u6765\u5b9a\u4e49\u4f1a\u8bdd\u8bb0\u5fc6\u7684\u4fdd\u5b58\u884c\u4e3a\uff0c\u6839\u636e\u5177\u4f53\u5b58\u50a8\u4f4d\u7f6e\u7684\u4e0d\u540c\uff0c\u6bd4\u5982\u5185\u5b58\u3001JDBC\u3001Cassandra\u3001Neo4j \u7b49\uff0cSpring AI \u63d0\u4f9b\u4e86ChatMemoryRepository\u63a5\u53e3\u7684\u4e0d\u540c\u5b9e\u73b0\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b58\u591a\u5c11\uff1f<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u804a\u5929\u8bb0\u5f55\u4e0d\u80fd\u65e0\u9650\u5236\u5168\u90e8\u585e\u7ed9\u6a21\u578b\u3002\u539f\u56e0\u5f88\u7b80\u5355\uff1a\u6a21\u578b\u4e0a\u4e0b\u6587\u957f\u5ea6\u6709\u9650\uff0c\u804a\u5929\u8bb0\u5f55\u8d8a\u591a\uff0c\u8bf7\u6c42\u8d8a\u6162\u3001\u8d39\u7528\u8d8a\u9ad8\uff0c\u592a\u4e45\u4e4b\u524d\u7684\u6d88\u606f\u53ef\u80fd\u4e5f\u6ca1\u6709\u4ef7\u503c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u4e2d&nbsp;<code>ChatMemory<\/code>&nbsp;\u63a5\u53e3\u8868\u793a\u4f1a\u8bdd\u8bb0\u5fc6\uff0c\u5b83\u4f1a\u51b3\u5b9a\u5982\u4f55\u7ba1\u7406\u6d88\u606f\uff0c\u6bd4\u5982\u4fdd\u7559\u6700\u8fd1 N \u6761\u6d88\u606f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u8fd9\u6837\u7406\u89e3\u4e8c\u8005\u5173\u7cfb\uff1a\u5b58\u50a8\u7ec4\u4ef6\u8d1f\u8d23\u201c\u6d88\u606f\u653e\u5728\u54ea\u91cc\u201d\uff0c<code>ChatMemory<\/code>&nbsp;\u8d1f\u8d23\u201c\u600e\u4e48\u8bfb\u3001\u600e\u4e48\u5199\u3001\u4fdd\u7559\u591a\u5c11\u201d\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5982\u4f55\u9694\u79bb\u4e0d\u540c\u4f1a\u8bdd\uff1f<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u540c\u7528\u6237\u3001\u4e0d\u540c\u7a97\u53e3\u3001\u4e0d\u540c\u4e1a\u52a1\u5355\u636e\u7684\u804a\u5929\u8bb0\u5f55\u5fc5\u987b\u9694\u79bb\u3002\u6838\u5fc3\u601d\u8def\u5c31\u662f\u4f7f\u7528&nbsp;<code>conversationId<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\u7528\u6237 A \u7684\u4f1a\u8bdd ID \u662f&nbsp;<code>user-a-session-001<\/code>\uff0c\u7528\u6237 B \u7684\u4f1a\u8bdd ID \u662f&nbsp;<code>user-b-session-001<\/code>\u3002\u6bcf\u6b21\u8c03\u7528\u6a21\u578b\u65f6\u5e26\u4e0a\u5bf9\u5e94\u7684\u4f1a\u8bdd ID\uff0cSpring AI \u5c31\u80fd\u628a\u4e0d\u540c\u4f1a\u8bdd\u7684\u8bb0\u5fc6\u533a\u5206\u5f00\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f1a\u8bdd\u8bb0\u5fc6\u7684\u5b9e\u73b0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u5b9e\u9645\u4f7f\u7528\u4e2d\uff0c\u4e0d\u6211\u4eec\u6bcf\u6b21\u624b\u52a8\u8c03\u7528\u65b9\u6cd5\u4fdd\u5b58\u4f1a\u8bdd\u4e2d\u7684\u6d88\u606f\uff0c\u4e5f\u4e0d\u7528\u628a\u5386\u53f2\u6d88\u606f\u67e5\u51fa\u6765\u518d\u62fc\u5230 Prompt \u91cc\u53d1\u9001\u7ed9\u6a21\u578b\u3002\u800c\u662f\u901a\u8fc7\u5185\u7f6e\u7684Advisor\u81ea\u52a8\u4fdd\u5b58\u4f1a\u8bdd\u4e2d\u7684\u6d88\u606f\uff0c\u81ea\u52a8\u62fc\u63a5\u4f1a\u8bdd\u4e2d\u7684\u6d88\u606f\u5230\u63d0\u793a\u8bcd\u4e2d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Advisor \u53ef\u4ee5\u7406\u89e3\u4e3a&nbsp;<code>ChatClient<\/code>&nbsp;\u8c03\u7528\u8fc7\u7a0b\u4e2d\u7684\u62e6\u622a\u5668\uff0c\u5b83\u4eec\u7684\u6267\u884c\u539f\u7406\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u7528\u6237\u4ee3\u7801\u901a\u8fc7&nbsp;<code>ChatClient<\/code>&nbsp;\u53d1\u8d77\u8bf7\u6c42\u3002<\/li>\n\n\n\n<li>\u8bf7\u6c42\u4e0d\u4f1a\u7acb\u523b\u5230\u6a21\u578b\uff0c\u800c\u662f\u5148\u7ecf\u8fc7 Advisor \u94fe\u3002<\/li>\n\n\n\n<li>Advisor \u53ef\u4ee5\u5728\u8bf7\u6c42\u53d1\u9001\u524d\u4fee\u6539 Prompt\uff0c\u6bd4\u5982\u52a0\u5165\u5386\u53f2\u6d88\u606f\u3001\u52a0\u5165\u68c0\u7d22\u5230\u7684\u77e5\u8bc6\u3001\u8bb0\u5f55\u65e5\u5fd7\u3002<\/li>\n\n\n\n<li>\u4fee\u6539\u540e\u7684\u8bf7\u6c42\u53d1\u9001\u7ed9\u6a21\u578b\u3002<\/li>\n\n\n\n<li>\u6a21\u578b\u8fd4\u56de\u54cd\u5e94\u3002<\/li>\n\n\n\n<li>\u54cd\u5e94\u4e5f\u4f1a\u7ecf\u8fc7 Advisor \u94fe\uff0cAdvisor \u53ef\u4ee5\u8bb0\u5f55\u54cd\u5e94\u65e5\u5fd7\u3001\u4fdd\u5b58\u6d88\u606f\u7b49\u3002<\/li>\n\n\n\n<li>\u6700\u7ec8\u7ed3\u679c\u8fd4\u56de\u7ed9 Controller\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u548c\u5927\u5bb6\u719f\u6089\u7684\u62e6\u622a\u5668\u3001\u8fc7\u6ee4\u5668\u601d\u60f3\u975e\u5e38\u50cf\uff1aSpring MVC \u7684\u62e6\u622a\u5668\u53ef\u4ee5\u5728 Controller \u524d\u540e\u505a\u589e\u5f3a\uff0cAdvisor \u53ef\u4ee5\u5728\u5927\u6a21\u578b\u8c03\u7528\u524d\u540e\u505a\u589e\u5f3a\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:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-1-987x1024.jpeg'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"987\" height=\"1024\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-1-987x1024.jpeg\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-701\"  sizes=\"auto, (max-width: 987px) 100vw, 987px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\uff0cAdvisor\u5728ChatClient\u53d1\u6d88\u606f\u524d\u5728\u63d0\u793a\u8bcd\u4e2d\u6dfb\u52a0\u4f1a\u8bdd\u5386\u53f2\u6d88\u606f\uff0c\u5e76\u4fdd\u5b58\u7528\u6237\u53d1\u9001\u7684\u7528\u6237\u6d88\u606f\u7b49\u3002\u5728\u6536\u5230\u6a21\u578b\u54cd\u5e94\u65f6\u81ea\u52a8\u4fdd\u5b58\u6a21\u578b\u8fd4\u56de\u7684\u52a9\u624b\u6d88\u606f\u3002\u5982\u679c\u60f3\u8981\u5b9e\u73b0\u4f1a\u8bdd\u8bb0\u5fc6\uff0c\u53ea\u9700\u8981\u4f7f\u7528\u4f1a\u8bdd\u8bb0\u5fc6\u76f8\u5173\u7684Advisor\u5373\u53ef\u3002\u76ee\u524d\u9488\u5bf9\u4f1a\u8bdd\u8bb0\u5fc6\u4e3b\u8981\u4f7f\u7528\u7684\u662f<code>MessageChatMemoryAdvisor<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MessageChatMemoryAdvisor \u7684\u4f7f\u7528\u975e\u5e38\u7b80\u5355\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a\u5148\u914d\u7f6e\u4e00\u4e2a\u5e26\u8bb0\u5fc6\u80fd\u529b\u7684&nbsp;<code>ChatClient<\/code>\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;\nimport org.springframework.ai.chat.memory.ChatMemory;\nimport org.springframework.ai.chat.memory.InMemoryChatMemoryRepository;\nimport org.springframework.ai.chat.memory.MessageWindowChatMemory;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class ChatMemoryConfig {\n\n    @Bean\n    public ChatMemory chatMemory() {\n        return MessageWindowChatMemory.builder()\n                 \/\/ \u6307\u5b9aChatMemory\u7684\u5e95\u5c42\u5b58\u50a8\u4f7f\u7528\u7eaf\u5185\u5b58\u5b58\u50a8\n                .chatMemoryRepository(new InMemoryChatMemoryRepository())\n                .maxMessages(20)\n                .build();\n    }\n\n    @Bean\n    public ChatClient memoryChatClient(ChatClient.Builder builder, ChatMemory chatMemory) {\n        return builder\n                 \/\/ \u6307\u5b9a\u9ed8\u8ba4\u7684advisor\uff0c\u5f53\u7136\u4e5f\u53ef\u4ee5\u5c40\u90e8\u6307\u5b9a\u5c31\u50cf\u5c40\u90e8\u6307\u5b9a\u7cfb\u7edf\u6d88\u606f\u4e00\u6837\n                .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())\n                .build();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u5b9a\u4e49 Controller\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.memory.ChatMemory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class MemoryChatController {\n\n    private final ChatClient memoryChatClient;\n\n    public MemoryChatController(ChatClient memoryChatClient) {\n        this.memoryChatClient = memoryChatClient;\n    }\n\n    \/**\n     * \u793a\u4f8b\u8bf7\u6c42\uff1a\n     * GET \/ai\/memory?conversationId=1001&amp;message=\u6211\u53eb\u5f20\u4e09\n     * GET \/ai\/memory?conversationId=1001&amp;message=\u6211\u53eb\u4ec0\u4e48\u540d\u5b57\n     *\/\n    @GetMapping(\"\/ai\/memory\")\n    public String memory(@RequestParam String conversationId,\n                         @RequestParam String message) {\n        return memoryChatClient.prompt()\n                .user(message)\n                 \/\/ \u5b9e\u73b0\u4f1a\u8bdd\u8bb0\u5fc6\u7684\u9694\u79bb\uff0c\u6307\u5b9a\u4f1a\u8bddid\n                .advisors(advisor -&gt; advisor\n                        .param(ChatMemory.CONVERSATION_ID, conversationId))\n                .call()\n                .content();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d4b\u8bd5\u65f6\u8981\u6ce8\u610f\uff1a\u540c\u4e00\u4e2a&nbsp;<code>conversationId<\/code>&nbsp;\u624d\u4f1a\u5171\u4eab\u8bb0\u5fc6\u3002\u6362\u4e00\u4e2a&nbsp;<code>conversationId<\/code>\uff0c\u6a21\u578b\u5c31\u770b\u4e0d\u5230\u4e4b\u524d\u7684\u804a\u5929\u8bb0\u5f55\u4e86\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SimpleLoggerAdvisor<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u5f15\u5165\u4e00\u4e2a\u65b0\u7684Advisor\uff0c<code>SimpleLoggerAdvisor<\/code>&nbsp;\u5b83\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u6253\u5370\u8bf7\u6c42\u548c\u54cd\u5e94\u65e5\u5fd7\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;\n\n@Bean\npublic ChatClient loggerChatClient(ChatClient.Builder builder, ChatMemory chatMemory) {\n    return builder\n            .defaultAdvisors(new SimpleLoggerAdvisor())\n            .build();\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u7684\u4f5c\u7528\u4e0d\u662f\u6539\u53d8\u6a21\u578b\u80fd\u529b\uff0c\u800c\u662f\u65b9\u4fbf\u6211\u4eec\u89c2\u5bdf\u6700\u7ec8\u53d1\u9001\u7ed9\u6a21\u578b\u7684\u8bf7\u6c42\u662f\u4ec0\u4e48\u3001\u6a21\u578b\u8fd4\u56de\u7684\u54cd\u5e94\u662f\u4ec0\u4e48\u3001Advisor \u94fe\u662f\u5426\u6309\u9884\u671f\u5de5\u4f5c\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6d41\u5f0f\u54cd\u5e94<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u4ed4\u7ec6\u89c2\u5bdf\u6211\u4eec\u8bbf\u95ee\u5927\u6a21\u578b\u7684\u7ed3\u679c\uff0c\u5c31\u4f1a\u53d1\u73b0\u6211\u4eec\u6bcf\u6b21\u83b7\u53d6\u7684\u90fd\u662f\u5927\u6a21\u578b\u5b8c\u6574\u7684\u56de\u590d\u5185\u5bb9\u3002\u4f46\u662f\u5927\u5bb6\u56de\u5fc6\u4e00\u4e0b\u5e73\u65f6\u6211\u4eec\u5728\u4f7f\u7528DeepSeek\uff0cChatGPT\u7b49\u5927\u6a21\u578b\u4ea7\u54c1\u65f6\uff0c\u6bcf\u6b21\u7684\u56de\u590d\u662f\u4e00\u70b9\u4e00\u70b9\u663e\u793a\u51fa\u6765\uff0c\u800c\u4e0d\u662f\u4e00\u6b21\u5c31\u663e\u793a\u5b8c\u6574\u7684\u56de\u590d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u79cd\u5c06\u54cd\u5e94\u5185\u5bb9\u5206\u6210\u591a\u4e2a\u6570\u636e\u5757\uff08chunk\uff09\u9010\u6b65\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\uff0c\u5ba2\u6237\u7aef\u53ef\u4ee5\u8fb9\u63a5\u6536\u8fb9\u5904\u7406\uff0c\u800c\u65e0\u9700\u7b49\u5f85\u4e00\u6b21\u63a5\u6536\u6574\u4e2a\u54cd\u5e94\u5185\u5bb9\u7684\u54cd\u5e94\u6570\u636e\u4f20\u8f93\u65b9\u5f0f\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a<code>\u6d41\u5f0f\u54cd\u5e94<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e4b\u6240\u4ee5\u5927\u6a21\u578b\u4ea7\u54c1\u666e\u904d\u91c7\u7528\u6d41\u5f0f\u54cd\u5e94\uff0c\u662f\u56e0\u4e3a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>LLM \u662f\u9010\u4e2a token \u751f\u6210\u6587\u672c\u7684\uff0c\u5982\u679c\u5927\u6a21\u578b\u56de\u590d\u7684\u6587\u672c\u5185\u5bb9\u6bd4\u8f83\u591a\uff0c\u90a3\u4e48\u7528\u6237\u53ef\u80fd\u9700\u8981\u7b49\u5f85\u4e00\u4e2a\u672a\u77e5\u7684\u65f6\u957f\u624d\u80fd\u770b\u5230\u5b8c\u6574\u54cd\u5e94<\/li>\n\n\n\n<li>\u4f46\u662f\u4f7f\u7528\u6d41\u5f0f\u54cd\u5e94\u53ef\u4ee5\u6539\u5584\u7528\u6237\u4f53\u9a8c\uff0c\u7528\u6237\u51e0\u4e4e\u53ef\u4ee5\u7acb\u5373\u5f00\u59cb\u9605\u8bfb\u5927\u6a21\u578b\u7684\u54cd\u5e94\uff0c\u5b83\u5927\u5927\u7f29\u77ed\u4e86\u7528\u6237\u6240\u770b\u5230\u7684<strong>\u9996\u6b21\u54cd\u5e94<\/strong>\u7684\u65f6\u95f4<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SSE \u534f\u8bae<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u601d\u8003\u4e00\u4e0b\u5c31\u4f1a\u53d1\u73b0\uff0c\u6d41\u5f0f\u54cd\u5e94\u7684\u5b9e\u73b0\u548c\u666e\u901a\u7684HTTP\u54cd\u5e94\u4e00\u5b9a\u662f\u4e0d\u4e00\u6837\u7684\uff0c\u56e0\u4e3a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u666e\u901a\u7684HTTP\u54cd\u5e94\u5f0f\u4e00\u6b21\u8bf7\u6c42\uff0c\u5bf9\u5e94\u4e00\u6b21\u54cd\u5e94\uff0c\u4e00\u6b21\u901a\u4fe1\u8fc7\u7a0b\u7ed3\u675f<\/li>\n\n\n\n<li>\u4f46\u662f\uff0c\u6d41\u5f0f\u54cd\u5e94\u5f0f\u4e00\u6b21\u8bf7\u6c42\uff0c\u5bf9\u5e94\u591a\u6b21\u54cd\u5e94<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d41\u5f0f\u54cd\u5e94\u7684\u5b9e\u73b0\u9700\u8981\u9075\u5faa\u4e00\u5957\u7279\u6b8a\u7684\u534f\u8bae&nbsp;<code>SSE<\/code>\uff0c\u5168\u79f0&nbsp;<code>Server-Sent Events<\/code>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SSE\u534f\u8bae\u57fa\u4e8e HTTP<\/li>\n\n\n\n<li>\u5141\u8bb8\u670d\u52a1\u7aef\u5411\u5ba2\u6237\u7aef\u6301\u7eed\u63a8\u9001\u4e8b\u4ef6\u6d41\uff0c\u6bcf\u4e00\u4e2a\u4e8b\u4ef6\u6d41\u4e2d\u53ef\u4ee5\u5305\u542b\u4e8b\u4ef6\u7c7b\u578b\u548c\u6570\u636e\u3002<\/li>\n\n\n\n<li>\u6bcf\u4e2a\u4e8b\u4ef6\u5fc5\u987b\u4ee5\u4e24\u4e2a\u6362\u884c\u7b26\uff08\\n\\n\uff09\u7ed3\u5c3e\uff0c\u5b83\u8868\u793a\u201c\u4e00\u4e2a chunk\u201d\u548c\u201c\u4e0b\u4e00\u4e2achunk\u201d\u7684\u7269\u7406\u8fb9\u754c<\/li>\n\n\n\n<li>\u6bcf\u4e2a\u4e8b\u4ef6\u4e2d\u7684\u6570\u636e\u5c31\u4ee3\u8868\u6d41\u5f0f\u54cd\u5e94\u4e2d\u7684\u4e00\u4e2achunk\uff0c\u4e8b\u4ef6\u7c7b\u578b\u53ef\u4ee5\u4f5c\u4e3a\u903b\u8f91\u6807\u8bc6\uff0c\u6807\u5fd7\u6d41\u5f0f\u54cd\u5e94\u7684\u7ed3\u675f\u3002\u4f46\u662f\u6d41\u5f0f\u54cd\u5e94\u4e2d\u4e8b\u4ef6\u7c7b\u578b\u662f\u53ef\u9009\u7684\uff0c\u5982\u679c\u6d41\u5f0f\u54cd\u5e94\u4e2d\u6ca1\u6709\u4e8b\u4ef6\u7c7b\u578b\u4e5f\u6ca1\u5173\u7cfb\uff0c\u670d\u52a1\u7aef\u5728\u6d41\u901d\u54cd\u5e94\u7ed3\u675f\u540e\u53ef\u4ee5\u7269\u7406\u65ad\u5f00\u8fde\u63a5<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">SSE \u8fd4\u56de\u7ed9\u524d\u7aef\u7684\u6570\u636e\u683c\u5f0f\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nid: 1\nevent: message\ndata: \u4f60\u597d\n\n\nid: 2\nevent: message\ndata: \uff0c\u6211\u662f\n\n\nid: 3\nevent: message\ndata: Spring AI\n```<\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u5b57\u6bb5<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u662f\u5426\u5fc5\u987b<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>data<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5fc5\u987b<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5f53\u524d\u4e8b\u4ef6\u643a\u5e26\u7684\u6570\u636e<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>event<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u53ef\u9009<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e8b\u4ef6\u7c7b\u578b\uff0c\u524d\u7aef\u53ef\u6309\u7c7b\u578b\u76d1\u542c<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>id<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u53ef\u9009<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e8b\u4ef6 ID\uff0c\u53ef\u7528\u4e8e\u65ad\u7ebf\u91cd\u8fde<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>retry<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u53ef\u9009<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5ba2\u6237\u7aef\u91cd\u8fde\u95f4\u9694<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Spring AI \u6d41\u5f0f\u63a5\u53e3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u540e\u7aef\u53ef\u4ee5\u8fd4\u56de&nbsp;<code>Flux<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.http.MediaType;\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@RestController\npublic class StreamChatController {\n\n    private final ChatClient chatClient;\n\n    public StreamChatController(ChatClient chatClient) {\n        this.chatClient = chatClient;\n    }\n\n    @GetMapping(value = \"\/ai\/stream\", produces = MediaType.TEXT_EVENT_STREAM_VALUE)\n    public Flux&lt;String&gt; stream(@RequestParam String message) {\n        return chatClient.prompt()\n                .user(message)\n                 \/\/ \u8c03\u7528call\u83b7\u53d6\u7684\u662f\u6574\u4e2a\u54cd\u5e94\uff0c\u800c\u8c03\u7528stream\u83b7\u53d6\u7684\u662f\u6d41\u5f0f\u54cd\u5e94\n                .stream()\n                 \/\/ \u83b7\u53d6\u6d41\u5f0f\u54cd\u5e94\u4e2d\u7684chunk\u6570\u636e\n                .content()\n                .doOnNext(chunk -&gt; System.out.println(\"\u6a21\u578b\u7247\u6bb5\uff1a\" + chunk))\n                \/\/ \u6d41\u5f0f\u54cd\u5e94\u7684\u672b\u5c3e\u62fc\u63a5\u5b57\u7b26\u4e32\"[END]\"\u4f5c\u4e3a\u81ea\u5b9a\u4e49\u7ed3\u675f\u6807\u5fd7\n                .concatWith(Flux.just(\"[END]\"));\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u91cd\u70b9\u770b\u4e09\u4e2a\u70b9\uff1a<code>stream()<\/code>&nbsp;\u8868\u793a\u4f7f\u7528\u6d41\u5f0f\u8c03\u7528\uff0c<code>content()<\/code>&nbsp;\u628a\u6a21\u578b\u8f93\u51fa\u8f6c\u6362\u6210\u6587\u672c\u7247\u6bb5\u6d41\uff0c<code>concatWith(Flux.just(\"[END]\"))<\/code>&nbsp;\u5728\u6d41\u7ed3\u675f\u540e\u8ffd\u52a0\u7ed3\u675f\u6807\u5fd7\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8ba9\u6a21\u578b\u4f7f\u7528\u4f60\u7684\u77e5\u8bc6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6a21\u578b\u4e3b\u8981\u4f9d\u8d56\u5b83\u81ea\u5df1\u8bad\u7ec3\u65f6\u5b66\u5230\u7684\u77e5\u8bc6\u6765\u56de\u7b54\u95ee\u9898\u3002\u4f46\u662f\u5728\u771f\u5b9e\u4e1a\u52a1\u91cc\uff0c\u5149\u9760\u8fd9\u70b9\u77e5\u8bc6\u8fdc\u8fdc\u4e0d\u591f\uff0c\u56e0\u4e3a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e0d\u4e86\u89e3\u6700\u65b0\u52a8\u6001<\/strong>\u3002\u6a21\u578b\u8bad\u7ec3\u5b8c\u6210\u4e4b\u540e\u518d\u53d1\u751f\u7684\u4e8b\u60c5\uff0c\u5b83\u6839\u672c\u6ca1&#8221;\u89c1\u8fc7&#8221;\u3002\u6bd4\u5982 Spring AI \u5b98\u65b9\u5c31\u63d0\u5230\uff0cGPT-3.5\/4 \u7684\u8bad\u7ec3\u6570\u636e\u53ea\u5230 2021 \u5e74 9 \u6708\uff0c\u95ee\u5b83\u4e4b\u540e\u7684\u65b0\u95fb\u3001\u65b0\u653f\u7b56\u3001\u65b0\u6587\u6863\uff0c\u5b83\u53ea\u4f1a\u544a\u8bc9\u4f60&#8221;\u4e0d\u77e5\u9053&#8221;\u3002<\/li>\n\n\n\n<li><strong>\u4e0d\u4e86\u89e3\u4f60\u4eec\u516c\u53f8<\/strong>\u3002\u4f01\u4e1a\u5185\u90e8\u7684\u89c4\u7ae0\u5236\u5ea6\u3001\u9879\u76ee\u6587\u6863\u3001\u8ba2\u5355\u6570\u636e\u3001\u79c1\u6709\u4e1a\u52a1\u89c4\u5219\uff0c\u4e0d\u53ef\u80fd\u51fa\u73b0\u5728\u6a21\u578b\u7684\u8bad\u7ec3\u6570\u636e\u91cc\uff0c\u6a21\u578b\u81ea\u7136\u4e5f\u7b54\u4e0d\u4e0a\u6765\u3002<\/li>\n\n\n\n<li><strong>\u4e0d\u4f1a\u8c03\u7528\u5916\u90e8\u7cfb\u7edf<\/strong>\u3002\u6bd4\u5982\u67e5\u5f53\u524d\u6570\u636e\u5e93\u91cc\u7684\u5e93\u5b58\u3001\u8c03\u652f\u4ed8\u63a5\u53e3\u3001\u8bfb\u5b9e\u65f6\u5929\u6c14\uff0c\u8fd9\u4e9b\u90fd\u4e0d\u662f\u8111\u5b50\u91cc&#8221;\u8bb0\u4f4f&#8221;\u7684\u77e5\u8bc6\uff0c\u800c\u662f\u9700\u8981\u4e3b\u52a8\u53bb\u5916\u90e8\u7cfb\u7edf\u91cc\u62ff\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\u5149\u8ba9\u6a21\u578b&#8221;\u81ea\u5df1\u60f3&#8221;\u662f\u4e0d\u591f\u7684\uff0c\u6211\u4eec\u5fc5\u987b\u60f3\u529e\u6cd5\u628a<strong>\u81ea\u5df1\u7684\u6570\u636e<\/strong>\u548c<strong>\u5916\u90e8 API<\/strong>&nbsp;\u63a5\u5230\u6a21\u578b\u4e0a\u53bb\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9488\u5bf9\u8fd9\u4ef6\u4e8b\uff0cSpring AI \u5b98\u65b9\u5728\u7ed9\u51fa\u4e86\u4e09\u6761\u4e3b\u6d41\u7684\u6280\u672f\u8def\u7ebf\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u65b9\u5f0f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u6838\u5fc3\u601d\u60f3<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u9002\u5408\u573a\u666f<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Fine Tuning\uff08\u5fae\u8c03\uff09<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u62ff\u4f60\u7684\u6570\u636e\u53bb\u91cd\u65b0\u8bad\u7ec3\u6a21\u578b\uff0c\u6539\u52a8\u6a21\u578b\u5185\u90e8\u7684\u6743\u91cd<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u60f3\u56fa\u5b9a\u56de\u7b54\u98ce\u683c\u3001\u4e13\u7cbe\u67d0\u7c7b\u4efb\u52a1\uff0c\u4e14\u56e2\u961f\u6709\u8db3\u591f\u7684\u7b97\u529b\u548c\u6837\u672c<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Prompt Stuffing\uff08\u63d0\u793a\u8bcd\u585e\u6570\u636e\uff09<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e0d\u52a8\u6a21\u578b\uff0c\u56de\u7b54\u524d\u76f4\u63a5\u628a\u76f8\u5173\u8d44\u6599\u585e\u8fdb Prompt\uff0c\u8ba9\u6a21\u578b&#8221;\u8fb9\u770b\u8fb9\u7b54&#8221;\u3002\u5176\u5178\u578b\u5de5\u7a0b\u5316\u5b9e\u73b0\u5c31\u662f&nbsp;<code>RAG<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4f01\u4e1a\u77e5\u8bc6\u5e93\u95ee\u7b54\u3001\u6587\u6863\u95ee\u7b54\uff08\u6700\u5e38\u7528\uff09<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Tool Calling\uff08\u5de5\u5177\u8c03\u7528\uff09<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e0d\u52a8\u6a21\u578b\uff0c\u7ed9\u6a21\u578b\u4e00\u4efd&#8221;\u5de5\u5177\u6e05\u5355&#8221;\uff0c\u8ba9\u5b83\u5728\u9700\u8981\u65f6\u4e3b\u52a8\u8c03\u7528\u6211\u4eec\u5199\u597d\u7684\u670d\u52a1\/\u63a5\u53e3\uff0c\u53bb\u62ff\u5b9e\u65f6\u6570\u636e\u6216\u6267\u884c\u64cd\u4f5c<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u8c03\u7528\u5916\u90e8 API\u3001\u67e5\u8be2\u6570\u636e\u5e93\u3001\u64cd\u4f5c\u4e1a\u52a1\u7cfb\u7edf<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u5bf9\u6bd4\u4e00\u4e0b\u8fd9\u4e09\u6761\u8def\u7ebf\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Fine Tuning<\/code>&nbsp;\u662f\u53bb\u6539\u9020\u6a21\u578b\u672c\u8eab\uff0c\u6548\u679c\u6700\u6df1\u5165\uff0c\u4f46\u6210\u672c\u6700\u9ad8\uff0c\u5bf9\u5927\u591a\u6570\u4e1a\u52a1\u56e2\u961f\u6765\u8bf4\u95e8\u69db\u8fc7\u9ad8\u3002<\/li>\n\n\n\n<li><code>Prompt Stuffing \/ RAG<\/code>&nbsp;\u4e0d\u6539\u6a21\u578b\uff0c\u53ea\u662f\u7b54\u9898\u524d\u5148&#8221;\u7ffb\u4e00\u4e0b\u5c0f\u6284&#8221;\uff0c\u662f\u4f01\u4e1a\u77e5\u8bc6\u5e93\u573a\u666f\u4e0b\u6700\u5e38\u7528\u7684\u65b9\u6848\u3002<\/li>\n\n\n\n<li><code>Tool Calling<\/code>&nbsp;\u540c\u6837\u4e0d\u6539\u6a21\u578b\uff0c\u4f46\u76f8\u5f53\u4e8e\u989d\u5916\u7ed9\u4e86\u6a21\u578b&#8221;\u52a8\u624b&#8221;\u7684\u80fd\u529b\uff0c\u8ba9\u5b83\u80fd\u4e3b\u52a8\u8c03\u5916\u90e8\u7cfb\u7edf\u62ff\u6570\u636e\u3001\u505a\u4e8b\u60c5\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u540e\u4e24\u79cd\u65b9\u5f0f\u90fd\u4e0d\u9700\u8981\u91cd\u65b0\u8bad\u7ec3\u6a21\u578b\uff0c\u90e8\u7f72\u548c\u8fed\u4ee3\u90fd\u5f88\u8f7b\u91cf\uff0c\u662f\u4f01\u4e1a\u843d\u5730\u6700\u5e38\u89c1\u7684\u4e24\u79cd\u65b9\u5f0f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">RAG<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">RAG \u5168\u79f0\u662f&nbsp;<code>Retrieval Augmented Generation<\/code>\uff0c\u7ffb\u8bd1\u6210\u4e2d\u6587\u53eb\u201c\u68c0\u7d22\u589e\u5f3a\u751f\u6210\u201d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u7406\u89e3\uff1aRAG \u5c31\u662f\u7ed9\u5927\u6a21\u578b\u914d\u4e00\u4e2a\u5916\u6302\u77e5\u8bc6\u5e93\u3002\u6a21\u578b\u56de\u7b54\u524d\uff0c\u5148\u53bb\u77e5\u8bc6\u5e93\u67e5\u8d44\u6599\uff0c\u518d\u7ed3\u5408\u67e5\u5230\u7684\u8d44\u6599\u751f\u6210\u7b54\u6848\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u7c7b\u6bd4\u8003\u8bd5\uff1a\u5927\u6a21\u578b\u50cf\u4e00\u4e2a\u5b66\u4e60\u80fd\u529b\u5f88\u5f3a\u7684\u5b66\u751f\uff0c\u4f46\u5b83\u4e0d\u80fd\u8bb0\u4f4f\u6240\u6709\u4f01\u4e1a\u5185\u90e8\u8d44\u6599\u3002RAG \u5c31\u50cf\u5141\u8bb8\u5b83\u5728\u7b54\u9898\u524d\u7ffb\u6211\u4eec\u51c6\u5907\u597d\u7684\u201c\u8d44\u6599\u5c0f\u6284\u201d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RAG \u80fd\u89e3\u51b3\u51e0\u4e2a\u6838\u5fc3\u95ee\u9898\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u89e3\u51b3\u5927\u6a21\u578b\u77e5\u8bc6\u8fc7\u671f\u95ee\u9898\uff0c\u77e5\u8bc6\u5e93\u53ef\u4ee5\u968f\u65f6\u66f4\u65b0\u3002<\/li>\n\n\n\n<li>\u8ba9\u56de\u7b54\u66f4\u53ef\u8ffd\u6eaf\uff0c\u7b54\u6848\u53ef\u4ee5\u5bf9\u5e94\u5230\u539f\u59cb\u6587\u6863\u3002<\/li>\n\n\n\n<li>\u65e0\u9700\u91cd\u65b0\u8bad\u7ec3\u6a21\u578b\uff0c\u4e5f\u80fd\u8ba9 AI \u638c\u63e1\u4f01\u4e1a\u5185\u90e8\u77e5\u8bc6\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">RAG \u57fa\u672c\u539f\u7406\u5982\u4e0b\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:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-148.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"775\" height=\"637\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-148.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-699\"  sizes=\"auto, (max-width: 775px) 100vw, 775px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d41\u7a0b\u53ef\u4ee5\u62c6\u6210\u4e09\u6b65\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u7528\u6237\u63d0\u95ee\u540e\uff0c\u5148\u6839\u636e\u95ee\u9898\u53bb\u77e5\u8bc6\u5e93\u68c0\u7d22\u76f8\u5173\u5185\u5bb9\u3002<\/li>\n\n\n\n<li>\u5c06\u68c0\u7d22\u5230\u7684\u5185\u5bb9\u548c\u7528\u6237\u95ee\u9898\u4e00\u8d77\u653e\u8fdb Prompt\u3002<\/li>\n\n\n\n<li>\u5927\u6a21\u578b\u53c2\u8003\u8fd9\u4e9b\u5185\u5bb9\u751f\u6210\u6700\u7ec8\u56de\u7b54\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u4ee5\u505a\u4e00\u4e2a&#8221;\u4f01\u4e1a\u5458\u5de5\u624b\u518c\u95ee\u7b54\u52a9\u624b&#8221;\u4e3a\u4f8b\uff0c\u6784\u5efa\u4e00\u4e2a\u5458\u5de5\u624b\u518c\u77e5\u8bc6\u5e93\uff0c\u8ba9\u7528\u6237\u53ef\u4ee5\u8be2\u95ee\u8003\u52e4\u3001\u8bf7\u5047\u3001\u62a5\u9500\u3001\u8fdc\u7a0b\u529e\u516c\u7b49\u5236\u5ea6\u95ee\u9898\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u77e5\u8bc6\u7684\u8868\u793a<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f01\u4e1a\u77e5\u8bc6\u53ef\u80fd\u6765\u81ea\u5404\u79cd\u6587\u6863\uff1aHTML\u3001PDF\u3001Word\u3001Markdown\u3001TXT \u7b49\u3002\u90a3\u662f\u4e0d\u662f\u76f4\u63a5\u628a\u8fd9\u4e9b\u6587\u6863\u539f\u6587\u5b58\u8d77\u6765\u5c31\u884c\uff1f\u5f53\u7136\u4e0d\u884c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u76f4\u63a5\u5b58\u539f\u6587\uff0c\u68c0\u7d22\u65f6\u5927\u6982\u7387\u53ea\u80fd\u505a\u5173\u952e\u8bcd\u5339\u914d\u3002\u5173\u952e\u8bcd\u5339\u914d\u6709\u4e24\u4e2a\u660e\u663e\u95ee\u9898\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\u8bcd\u6c47\u9e3f\u6c9f<\/code>\uff1a\u7528\u6237\u8bf4\u201c\u5728\u5bb6\u529e\u516c\u201d\uff0c\u6587\u6863\u5199\u201c\u8fdc\u7a0b\u529e\u516c\u201d\uff0c\u5173\u952e\u8bcd\u53ef\u80fd\u5339\u914d\u4e0d\u5230\u3002<\/li>\n\n\n\n<li><code>\u7f3a\u4e4f\u8bed\u4e49\u7406\u89e3<\/code>\uff1a\u53ea\u770b\u8bcd\u6709\u6ca1\u6709\u51fa\u73b0\uff0c\u4e0d\u7406\u89e3\u53e5\u5b50\u771f\u6b63\u542b\u4e49\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5 RAG \u901a\u5e38\u4f1a\u628a\u6587\u672c\u8f6c\u6210\u5411\u91cf\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5411\u91cf\u53ef\u4ee5\u7406\u89e3\u4e3a\u6587\u672c\u5728\u6570\u5b66\u7a7a\u95f4\u4e2d\u7684\u5750\u6807\uff1a\u4e00\u6bb5\u6587\u672c\u53ef\u4ee5\u8868\u793a\u6210\u4e00\u4e2a\u5411\u91cf\uff0c\u542b\u4e49\u76f8\u8fd1\u7684\u6587\u672c\u5411\u91cf\u8ddd\u79bb\u66f4\u8fd1\uff0c\u542b\u4e49\u5dee\u5f02\u5927\u7684\u6587\u672c\u5411\u91cf\u8ddd\u79bb\u66f4\u8fdc\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a\u6587\u672c\u8f6c\u6210\u5411\u91cf\u7684\u8fc7\u7a0b\u53eb&nbsp;<code>Embedding<\/code>\u3002\u5b9e\u73b0 Embedding \u7684\u6a21\u578b\u53eb&nbsp;<code>EmbeddingModel<\/code>\u3002\u6211\u4eec\u628a\u6587\u672c\u8f93\u5165\u7ed9 EmbeddingModel\uff0c\u5b83\u8f93\u51fa\u5bf9\u5e94\u5411\u91cf\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:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-149-1024x521.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"521\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-149-1024x521.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-700\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u603b\u7ed3\u4e00\u53e5\uff1a\u4e3a\u4e86\u66f4\u597d\u5730\u6309\u8bed\u4e49\u68c0\u7d22\u77e5\u8bc6\uff0c\u6211\u4eec\u9700\u8981\u5148\u628a\u77e5\u8bc6\u6587\u672c\u901a\u8fc7 EmbeddingModel \u8f6c\u6210\u5411\u91cf\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u5411\u91cf\u8981\u5b58\u5728\u54ea\u91cc\uff1f\u5c31\u9700\u8981\u5411\u91cf\u6570\u636e\u5e93\u3002\u5e38\u89c1\u5411\u91cf\u6570\u636e\u5e93\u5305\u62ec Milvus\u3001Chroma\u3001Pinecone\u3001RedisSearch\u3001Elasticsearch\u3002\u672c\u8bfe\u7a0b\u4e2d\u6211\u4eec\u4f7f\u7528 Elasticsearch \u4f5c\u4e3a\u5411\u91cf\u5b58\u50a8\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u77e5\u8bc6\u5e93\u7684\u6784\u5efa<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u77e5\u8bc6\u5e93\u6784\u5efa\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a&nbsp;<code>ETL<\/code>&nbsp;\u6d41\u7a0b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u9636\u6bb5<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u82f1\u6587<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f5c\u7528<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">E<\/td><td class=\"has-text-align-left\" data-align=\"left\">Extract<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u8bfb\u53d6\u539f\u59cb\u6587\u6863<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">T<\/td><td class=\"has-text-align-left\" data-align=\"left\">Transform<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6e05\u6d17\u3001\u5207\u5206\u3001\u8f6c\u6362\u6587\u6863<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">L<\/td><td class=\"has-text-align-left\" data-align=\"left\">Load<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5199\u5165\u76ee\u6807\u5b58\u50a8\uff0c\u6bd4\u5982\u5411\u91cf\u6570\u636e\u5e93<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">RAG \u7684 ETL \u6d41\u7a0b\u901a\u5e38\u662f\u79bb\u7ebf\u5904\u7406\u7684\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5e76\u4e0d\u662f\u7528\u6237\u6bcf\u6b21\u63d0\u95ee\u65f6\u624d\u4e34\u65f6\u8bfb\u53d6\u6240\u6709\u6587\u6863\u3001\u5207\u5206\u3001\u5411\u91cf\u5316\u3001\u5199\u5165\u6570\u636e\u5e93\u3002\u90a3\u6837\u592a\u6162\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b63\u786e\u6d41\u7a0b\u662f\uff1a\u63d0\u524d\u628a\u4f01\u4e1a\u6587\u6863\u8bfb\u53d6\u51fa\u6765\uff0c\u5207\u5206\u6210\u9002\u5408\u68c0\u7d22\u7684\u5c0f\u6bb5\uff0c\u8c03\u7528 EmbeddingModel \u8f6c\u6210\u5411\u91cf\uff0c\u5199\u5165\u5411\u91cf\u6570\u636e\u5e93\uff0c\u7528\u6237\u63d0\u95ee\u65f6\u53ea\u505a\u68c0\u7d22\u548c\u751f\u6210\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6587\u6863\u8bfb\u53d6<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u4e2d\u8bfb\u53d6\u6587\u6863\u7684\u6838\u5fc3\u63a5\u53e3\u53ef\u4ee5\u7b80\u5316\u7406\u89e3\u4e3a&nbsp;<code>DocumentReader<\/code>\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Reader<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u9002\u5408\u8bfb\u53d6<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>TextReader<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">TXT\u3001\u666e\u901a\u6587\u672c<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>JsonReader<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">JSON \u6587\u4ef6<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>MarkdownDocumentReader<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Markdown \u6587\u6863<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>PagePdfDocumentReader<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">PDF \u6587\u6863<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>TikaDocumentReader<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u591a\u79cd\u590d\u6742\u6587\u4ef6\u683c\u5f0f<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u8bfe\u7a0b\u4e2d\u6211\u4eec\u4f7f\u7528&nbsp;<code>TextReader<\/code>\uff0c\u56e0\u4e3a\u5b83\u6700\u7b80\u5355\uff0c\u9002\u5408\u5148\u7406\u89e3\u5b8c\u6574\u6d41\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u63a5\u4e0b\u6765\u6211\u4eec\u628a\u4e00\u4efd&#8221;\u5458\u5de5\u624b\u518c\u8282\u9009&#8221;\u505a\u6210\u4e00\u4e2a\u6587\u6863\u6587\u4ef6\u3002\u5728&nbsp;<code>src\/main\/resources\/document<\/code>&nbsp;\u76ee\u5f55\u4e0b\u65b0\u5efa&nbsp;<code>employee-handbook.txt<\/code>\uff0c\u5185\u5bb9\u5982\u4e0b\uff08\u8282\u9009\uff0c\u53ef\u6309\u9700\u6269\u5145\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u5458\u5de5\u624b\u518c\u8282\u9009\n\n\u8003\u52e4\u4e0e\u5de5\u4f5c\u65f6\u95f4\uff1a\u516c\u53f8\u5b9e\u884c\u6807\u51c6\u5de5\u4f5c\u5236\uff0c\u5de5\u4f5c\u65f6\u95f4\u4e3a\u5468\u4e00\u81f3\u5468\u4e94 9:00 \u81f3 18:00\uff0c\u4e2d\u5348 12:00 \u81f3 13:30 \u4e3a\u5348\u4f11\u65f6\u95f4\u3002\u5458\u5de5\u56e0\u4ea4\u901a\u3001\u5929\u6c14\u6216\u5176\u4ed6\u539f\u56e0\u65e0\u6cd5\u6309\u65f6\u5230\u5c97\u65f6\uff0c\u5e94\u63d0\u524d\u901a\u8fc7\u4f01\u4e1a\u5fae\u4fe1\u5411\u76f4\u5c5e\u4e3b\u7ba1\u8bf4\u660e\u60c5\u51b5\u3002\u672a\u7ecf\u8bf4\u660e\u4e14\u8d85\u8fc7\u89c4\u5b9a\u65f6\u95f4\u672a\u5230\u5c97\u7684\uff0c\u6309\u8fdf\u5230\u6216\u65f7\u5de5\u5904\u7406\u3002\n\n\u8bf7\u5047\u4e0e\u5ba1\u6279\uff1a\u5458\u5de5\u8bf7\u5047\u5e94\u63d0\u524d\u63d0\u4ea4\u7533\u8bf7\uff0c\u5e76\u8bf4\u660e\u8bf7\u5047\u7c7b\u578b\u3001\u8d77\u6b62\u65f6\u95f4\u548c\u8bf7\u5047\u539f\u56e0\u3002\u75c5\u5047\u9700\u5728\u8fd4\u5c97\u540e\u8865\u5145\u75c5\u5047\u8bc1\u660e\u6216\u5c31\u8bca\u8bb0\u5f55\u3002\u5e74\u5047\u3001\u4e8b\u5047\u3001\u8c03\u4f11\u7b49\u7533\u8bf7\u7531\u76f4\u5c5e\u4e3b\u7ba1\u5ba1\u6279\u3002\u8fde\u7eed\u8bf7\u5047\u8d85\u8fc7\u4e09\u5929\u7684\uff0c\u8fd8\u9700\u8981\u90e8\u95e8\u8d1f\u8d23\u4eba\u786e\u8ba4\u3002\n\n\u62a5\u9500\u4e0e\u53d1\u7968\uff1a\u5458\u5de5\u56e0\u516c\u4ea7\u751f\u7684\u4ea4\u901a\u3001\u4f4f\u5bbf\u3001\u4f1a\u8bae\u7b49\u8d39\u7528\uff0c\u53ef\u4ee5\u5728\u8d39\u7528\u53d1\u751f\u540e 30 \u5929\u5185\u63d0\u4ea4\u62a5\u9500\u7533\u8bf7\u3002\u7533\u8bf7\u65f6\u5e94\u4e0a\u4f20\u771f\u5b9e\u3001\u5b8c\u6574\u3001\u5408\u89c4\u7684\u53d1\u7968\u548c\u8d39\u7528\u8bf4\u660e\u3002\u62a5\u9500\u5355\u636e\u5e94\u4e0e\u5b9e\u9645\u4e1a\u52a1\u4e00\u81f4\u3002\u4e2a\u4eba\u6d88\u8d39\u3001\u65e0\u5173\u62db\u5f85\u3001\u65e0\u6cd5\u8bf4\u660e\u4e1a\u52a1\u7528\u9014\u7684\u8d39\u7528\uff0c\u4e0d\u5c5e\u4e8e\u516c\u53f8\u62a5\u9500\u8303\u56f4\u3002\n\n\u8fdc\u7a0b\u529e\u516c\uff1a\u5458\u5de5\u56e0\u7279\u6b8a\u60c5\u51b5\u9700\u8981\u8fdc\u7a0b\u529e\u516c\u65f6\uff0c\u5e94\u63d0\u524d\u5411\u76f4\u5c5e\u4e3b\u7ba1\u7533\u8bf7\uff0c\u5e76\u8bf4\u660e\u8fdc\u7a0b\u529e\u516c\u65e5\u671f\u3001\u5de5\u4f5c\u5b89\u6392\u548c\u8054\u7cfb\u65b9\u5f0f\u3002\u8fdc\u7a0b\u529e\u516c\u671f\u95f4\uff0c\u5458\u5de5\u5e94\u4fdd\u6301\u5de5\u4f5c\u65f6\u95f4\u5185\u5728\u7ebf\uff0c\u53ca\u65f6\u54cd\u5e94\u4f1a\u8bae\u3001\u6d88\u606f\u548c\u4efb\u52a1\u534f\u4f5c\u3002\u6d89\u53ca\u5ba2\u6237\u8d44\u6599\u3001\u5408\u540c\u3001\u8d22\u52a1\u6570\u636e\u7b49\u654f\u611f\u4fe1\u606f\u65f6\uff0c\u5e94\u4f7f\u7528\u516c\u53f8\u6279\u51c6\u7684\u8bbe\u5907\u548c\u7f51\u7edc\u73af\u5883\u3002\n\n\u4fe1\u606f\u5b89\u5168\uff1a\u5458\u5de5\u4e0d\u5f97\u5c06\u516c\u53f8\u8d26\u53f7\u3001\u5bc6\u7801\u3001\u9a8c\u8bc1\u7801\u63d0\u4f9b\u7ed9\u4ed6\u4eba\uff0c\u4e5f\u4e0d\u5f97\u4f7f\u7528\u79c1\u4eba\u7f51\u76d8\u4fdd\u5b58\u516c\u53f8\u5185\u90e8\u8d44\u6599\u3002\u79bb\u804c\u3001\u8f6c\u5c97\u6216\u9879\u76ee\u7ed3\u675f\u65f6\uff0c\u5e94\u6309\u8981\u6c42\u5f52\u8fd8\u8bbe\u5907\u3001\u79fb\u4ea4\u6587\u6863\uff0c\u5e76\u5220\u9664\u4e2a\u4eba\u8bbe\u5907\u4e2d\u4fdd\u5b58\u7684\u516c\u53f8\u654f\u611f\u4fe1\u606f\u3002\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bfb\u53d6\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.document.Document;\nimport org.springframework.ai.reader.TextReader;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.ResourceLoader;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class DocumentReadService {\n\n    private final ResourceLoader resourceLoader;\n\n    public DocumentReadService(ResourceLoader resourceLoader) {\n        this.resourceLoader = resourceLoader;\n    }\n\n    public List&lt;Document&gt; readEmployeeHandbook() {\n        Resource resource = resourceLoader.getResource(\"classpath:document\/employee-handbook.txt\");\n        TextReader textReader = new TextReader(resource);\n        textReader.getCustomMetadata().put(\"source\", \"employee-handbook.txt\");\n        return textReader.get();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Document<\/code>&nbsp;\u53ef\u4ee5\u7406\u89e3\u4e3a Spring AI \u5bf9&#8221;\u77e5\u8bc6\u7247\u6bb5&#8221;\u7684\u7edf\u4e00\u62bd\u8c61\u3002\u5b83\u901a\u5e38\u5305\u542b&nbsp;<code>text<\/code>&nbsp;\u6587\u672c\u5185\u5bb9\u548c&nbsp;<code>metadata<\/code>&nbsp;\u5143\u6570\u636e\uff0c\u6bd4\u5982\u6765\u6e90\u6587\u4ef6\u3001\u9875\u7801\u3001\u5206\u7c7b\u3001\u65f6\u95f4\u7b49\u3002\u5728\u6211\u4eec\u8fd9\u4e2a\u6848\u4f8b\u91cc\uff0c<code>TextReader<\/code>&nbsp;\u8bfb\u51fa\u6765\u540e\u5c31\u662f\u4e00\u4e2a&nbsp;<code>Document<\/code>\uff0c<code>text<\/code>&nbsp;\u5c31\u662f\u6574\u4efd\u5458\u5de5\u624b\u518c\u8282\u9009\uff0c<code>metadata<\/code>&nbsp;\u91cc\u5e26\u4e0a\u4e86&nbsp;<code>source=employee-handbook.txt<\/code>\uff0c\u65b9\u4fbf\u540e\u9762\u8ffd\u6eaf\u6bcf\u6bb5\u7b54\u6848\u6765\u81ea\u54ea\u4e2a\u6587\u4ef6\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6587\u6863\u8f6c\u5316<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bfb\u53d6\u51fa\u6765\u7684\u6587\u6863\u5f80\u5f80\u6bd4\u8f83\u957f\uff0c\u4e0d\u9002\u5408\u76f4\u63a5\u5199\u5165\u5411\u91cf\u5e93\uff0c\u9700\u8981\u5148\u505a\u5207\u5206\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u975e\u5e38\u5173\u952e\u7684\u95ee\u9898\u5148\u8981\u60f3\u6e05\u695a\uff1a<strong>\u4e3a\u4ec0\u4e48\u5fc5\u987b\u5207\uff1f\u6574\u7bc7\u76f4\u63a5\u704c\u8fdb\u53bb\u4e0d\u884c\u5417\uff1f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u7ed3\u5408\u521a\u624d\u90a3\u4efd\u5458\u5de5\u624b\u518c\u6587\u6863\u770b\uff0c\u81f3\u5c11\u6709\u4e09\u4e2a\u539f\u56e0\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e00\u4e2a\u5411\u91cf\u53ea\u80fd&#8221;\u4ee3\u8868&#8221;\u4e00\u6bb5\u8bed\u4e49\uff0c\u6574\u7bc7\u6587\u6863\u7b97\u51fa\u7684\u5411\u91cf\u4f1a&#8221;\u5e73\u5747\u5316&#8221;<\/strong><\/li>\n\n\n\n<li><strong>\u5927\u6a21\u578b\u6709\u4e0a\u4e0b\u6587\u7a97\u53e3\u4e0a\u9650<\/strong><\/li>\n\n\n\n<li><strong>\u4e0d\u5207\u5206\u8fd8\u4f1a\u5e26\u6765\u566a\u58f0\u548c\u6210\u672c\u95ee\u9898<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u4e2d\u8d1f\u8d23\u6587\u6863\u8f6c\u6362\u7684\u7edf\u4e00\u63a5\u53e3\u662f&nbsp;<code>DocumentTransformer<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic interface DocumentTransformer extends Function&lt;List&lt;Document&gt;, List&lt;Document&gt;&gt; {\n\n    default List&lt;Document&gt; transform(List&lt;Document&gt; transform) {\n        return apply(transform);\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u5b98\u65b9&nbsp;<code>ETL Pipeline<\/code>&nbsp;\u6587\u6863\u91cc\u63d0\u4f9b\u7684\u5207\u5206\u6587\u6863\u7684DocumentTransformer\u53ea\u6709\u4e00\u4e2a&nbsp;<code>TokenTextSplitter<\/code>\uff0c\u5b83\u5305\u542b\u5982\u4e0b\u53c2\u6570\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>chunkSize<\/code>\uff08\u9ed8\u8ba4 800\uff09\uff1a<strong>\u6bcf\u4e2a chunk \u7684\u76ee\u6807 token \u6570<\/strong>\u3002\u5207\u5206\u65f6\u4ee5\u8fd9\u4e2a\u503c\u4f5c\u4e3a\u53c2\u8003\u957f\u5ea6\u3002<\/li>\n\n\n\n<li><code>minChunkSizeChars<\/code>\uff08\u9ed8\u8ba4 350\uff09\uff1a<strong>chunk \u7684\u6700\u5c0f\u5b57\u7b26\u6570<\/strong>\u3002\u5207\u5206\u65f6\u53ea\u4f1a\u5728\u5927\u4e8e\u8fd9\u4e2a\u957f\u5ea6\u4e4b\u540e\u518d\u53bb\u627e\u6807\u70b9\u5207\u5206\u70b9\uff0c\u907f\u514d\u5207\u51fa\u8fc7\u77ed\u7684\u5c0f\u788e\u7247\u3002<\/li>\n\n\n\n<li><code>minChunkLengthToEmbed<\/code>\uff08\u9ed8\u8ba4 5\uff09\uff1a<strong>chunk \u88ab\u4fdd\u7559\u7684\u6700\u5c0f\u957f\u5ea6<\/strong>\u3002\u5207\u5b8c\u4e4b\u540e\u5982\u679c\u4e00\u6bb5\u6bd4\u8fd9\u4e2a\u503c\u8fd8\u77ed\uff0c\u5c31\u76f4\u63a5\u4e22\u5f03\uff0c\u4e0d\u4f1a\u8fdb\u5165\u6700\u7ec8\u7ed3\u679c\u3002<\/li>\n\n\n\n<li><code>maxNumChunks<\/code>\uff08\u9ed8\u8ba4 10000\uff09\uff1a<strong>\u4e00\u4efd\u6587\u6863\u6700\u591a\u5207\u6210\u591a\u5c11\u6bb5<\/strong>\u3002\u8d85\u8fc7\u5c31\u505c\u6b62\u5207\u5206\uff0c\u4e3b\u8981\u8d77\u515c\u5e95\u4fdd\u62a4\u4f5c\u7528\uff0c\u9632\u6b62\u5f02\u5e38\u6587\u672c\u5207\u51fa\u51e0\u5341\u4e07\u6bb5\u3002<\/li>\n\n\n\n<li><code>keepSeparator<\/code>\uff08\u9ed8\u8ba4 true\uff09\uff1a<strong>\u662f\u5426\u4fdd\u7559\u5206\u9694\u7b26<\/strong>\uff08\u4e3b\u8981\u662f\u6362\u884c&nbsp;<code>\\n<\/code>\uff09\u3002<code>true<\/code>&nbsp;\u65f6\u4fdd\u7559\uff0c\u6587\u6863\u6bb5\u843d\u683c\u5f0f\u66f4\u63a5\u8fd1\u539f\u6587\uff1b<code>false<\/code>&nbsp;\u65f6\u53bb\u6389\uff0c\u6587\u672c\u66f4\u7d27\u51d1\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u8981\u6ce8\u610f\uff1aSpring AI 1.x \u7684&nbsp;<code>TokenTextSplitter<\/code>&nbsp;<strong>\u6ca1\u6709<\/strong>&nbsp;<code>withPunctuationMarks<\/code>&nbsp;\u914d\u7f6e\u65b9\u6cd5\uff0c\u53e5\u5b50\u8fb9\u754c\u5b57\u7b26\u5728\u6e90\u7801\u4e2d\u662f\u56fa\u5b9a\u7684\uff1a\u82f1\u6587\u53e5\u53f7&nbsp;<code>.<\/code>\u3001\u82f1\u6587\u95ee\u53f7&nbsp;<code>?<\/code>\u3001\u82f1\u6587\u611f\u53f9\u53f7&nbsp;<code>!<\/code>&nbsp;\u548c\u6362\u884c&nbsp;<code>\\n<\/code>\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5b83\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7 builder \u914d\u7f6e\u4e2d\u6587\u53e5\u53f7&nbsp;<code>\u3002<\/code>\u3001\u4e2d\u6587\u95ee\u53f7&nbsp;<code>\uff1f<\/code>\u3001\u4e2d\u6587\u611f\u53f9\u53f7&nbsp;<code>\uff01<\/code>\u3001\u4e2d\u6587\u5206\u53f7&nbsp;<code>\uff1b<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e86\u89e3\u4e86\u53c2\u6570\uff0c\u518d\u5927\u81f4\u8bf4\u4e00\u4e0b\u5b83\u7684\u5207\u5206\u601d\u8def\uff1a\u5148\u6309&nbsp;<code>chunkSize<\/code>&nbsp;\u5207\u51fa\u5019\u9009 chunk\uff1b<strong>\u53ea\u6709<\/strong>\u5f53\u5269\u4f59 token \u6570<strong>\u8d85\u8fc7<\/strong>&nbsp;<code>chunkSize<\/code>&nbsp;\u65f6\uff0c\u624d\u4f1a\u5728&nbsp;<code>minChunkSizeChars<\/code>&nbsp;\u4e4b\u540e\u3001\u6700\u9760\u540e\u7684\u4e00\u4e2a\u5185\u7f6e\u8fb9\u754c\u5b57\u7b26\u5904\u622a\u65ad\uff0c\u8ba9 chunk \u5c3d\u91cf\u843d\u5728\u53e5\u5b50\u8fb9\u754c\u4e0a\uff1b\u6700\u540e\u8fc7\u6ee4\u6389\u957f\u5ea6\u5c0f\u4e8e&nbsp;<code>minChunkLengthToEmbed<\/code>&nbsp;\u7684\u5c0f\u788e\u7247\u3002\u5b8c\u6574\u7684\u89c4\u5219\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\u9644\u5f55\u7684[TokenTextSplitter \u5b8c\u6574\u5207\u5206\u89c4\u5219](#tokentextsplitter-\u5b8c\u6574\u5207\u5206\u89c4\u5219)\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9488\u5bf9\u6211\u4eec\u7684&#8221;\u5458\u5de5\u624b\u518c&#8221;\u6848\u4f8b\uff0c\u53ef\u4ee5\u8fd9\u6837\u6765\u5b9a\u4e49TokenTextSplitter\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.document.Document;\nimport org.springframework.ai.transformer.splitter.TokenTextSplitter;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class DocumentSplitService {\n\n    public List&lt;Document&gt; split(List&lt;Document&gt; documents) {\n        \/\/ \u4f7f\u7528 builder \u65b9\u5f0f\u6784\u9020 TokenTextSplitter\uff0c\u53ef\u8bfb\u6027\u66f4\u597d\n        TokenTextSplitter splitter = TokenTextSplitter.builder()\n                \/\/ \u5458\u5de5\u624b\u518c\u6bcf\u4e2a\u5c0f\u8282\u90fd\u4e0d\u957f\uff0c\u8fd9\u91cc\u628a\u76ee\u6807\u957f\u5ea6\u8c03\u5c0f\uff0c\u65b9\u4fbf\u6309\u5c0f\u8282\u9644\u8fd1\u5207\u5f00\n                .withChunkSize(160)\n                \/\/ \u5c0f\u8282\u6bb5\u843d\u901a\u5e38\u5728\u767e\u5b57\u4ee5\u4e0a\uff0c80 \u4e2a\u5b57\u7b26\u540e\u518d\u627e\u8fb9\u754c\uff0c\u907f\u514d\u5207\u5f97\u592a\u788e\n                .withMinChunkSizeChars(80)\n                \/\/ \u5207\u5b8c\u4e4b\u540e\uff0c\u957f\u5ea6\u5c0f\u4e8e 5 \u4e2a\u5b57\u7b26\u7684 chunk \u4f1a\u88ab\u76f4\u63a5\u4e22\u5f03\uff08\u57fa\u672c\u662f\u566a\u58f0\uff09\n                .withMinChunkLengthToEmbed(5)\n                \/\/ \u793a\u4f8b\u6587\u6863\u8f83\u77ed\uff0c100 \u6bb5\u5df2\u7ecf\u8db3\u591f\u4f5c\u4e3a\u4fdd\u62a4\u4e0a\u9650\n                .withMaxNumChunks(100)\n                \/\/ \u4fdd\u7559\u6362\u884c\u7b49\u5206\u9694\u7b26\uff0c\u8ba9\u6bb5\u843d\u683c\u5f0f\u66f4\u63a5\u8fd1\u539f\u6587\uff08\u65b9\u4fbf\u540e\u7eed\u9605\u8bfb\u548c\u8c03\u8bd5\uff09\n                .withKeepSeparator(true)\n                .build();\n\n        return splitter.apply(documents);\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5207\u5206\u53c2\u6570\u6ca1\u6709&#8221;\u4e07\u80fd\u503c&#8221;\uff0c\u4f46\u5bf9\u4e2d\u6587\u77e5\u8bc6\u5e93\u7c7b RAG \u9879\u76ee\uff0c\u6709\u51e0\u6761\u5efa\u8bae\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>chunk \u5927\u5c0f\u8981\u8ddf\u6587\u6863\u7c92\u5ea6\u5339\u914d<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u50cf\u5458\u5de5\u624b\u518c\u8fd9\u79cd\u6bcf\u4e2a\u5c0f\u8282\u672c\u6765\u5c31\u4e0d\u957f\u7684\u6587\u6863\uff0c\u53ef\u4ee5\u5148\u4ece 100~300 token \u5f00\u59cb\uff1b\u957f\u7bc7\u6587\u7ae0\u6216\u62a5\u544a\u518d\u8003\u8651 300~800 token\u3002\u592a\u5c0f\u8bed\u4e49\u4e0d\u5b8c\u6574\uff0c\u592a\u5927\u5219\u5bb9\u6613\u628a\u591a\u4e2a\u5236\u5ea6\u4e3b\u9898\u6df7\u5728\u4e00\u4e2a\u5411\u91cf\u91cc\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>chunk \u4e4b\u95f4\u4fdd\u7559 10%~20% \u7684\u91cd\u53e0\uff08chunk overlap\uff09<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5207\u5206\u65f6\u8ba9\u76f8\u90bb chunk \u5171\u4eab\u4e00\u5c0f\u6bb5\u5185\u5bb9\uff08\u6bd4\u5982 50~150 token\uff09\uff0c\u53ef\u4ee5\u907f\u514d\u4e00\u53e5\u5173\u952e\u63cf\u8ff0\u521a\u597d\u88ab\u5207\u5230\u4e24\u6bb5\u4e4b\u95f4\u3001\u5bfc\u81f4\u4e24\u6bb5\u90fd\u68c0\u7d22\u4e0d\u547d\u4e2d\u3002\u91cd\u53e0\u6bd4\u4f8b\u8fc7\u5927\u5219\u4f1a\u6d6a\u8d39\u5b58\u50a8\u548c token \u6210\u672c\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4f18\u5148\u6309&#8221;\u8bed\u4e49\u8fb9\u754c&#8221;\u5207\uff0c\u800c\u4e0d\u662f\u6309\u5b57\u7b26\u786c\u5207<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u80fd\u6309\u6807\u9898\u5207\u5c31\u6309\u6807\u9898\u5207\uff0c\u80fd\u6309\u6bb5\u843d\u5207\u5c31\u6309\u6bb5\u843d\u5207\uff0c\u518d\u9000\u800c\u6c42\u5176\u6b21\u6309\u53e5\u5b50\u5207\u3002<code>TokenTextSplitter<\/code>&nbsp;\u4f1a\u4f18\u5148\u5728\u5185\u7f6e\u7684\u82f1\u6587\u6807\u70b9\u548c\u6362\u884c\u5904\u505a\u8fb9\u754c\u5bf9\u9f50\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e0d\u540c\u7c7b\u578b\u6587\u6863\u5e94\u4f7f\u7528\u4e0d\u540c\u5207\u5206\u7b56\u7565<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7ed3\u6784\u5316\u6587\u6863\uff08Markdown\u3001HTML\uff09\uff1a\u4f18\u5148\u6309\u7ae0\u8282\u3001\u6807\u9898\u5207\u3002<\/li>\n\n\n\n<li>\u957f\u7bc7\u6587\u7ae0\uff08PDF\u3001Word\uff09\uff1a\u6309\u6bb5\u843d + \u53e5\u5b50\u5207\uff0c\u52a0 overlap\u3002<\/li>\n\n\n\n<li>\u95ee\u7b54\u3001FAQ \u7c7b\uff1a\u4ee5&#8221;\u4e00\u6761 QA&#8221;\u4e3a\u6700\u5c0f\u5355\u5143\uff0c\u4e0d\u5f3a\u5207\u3002<\/li>\n\n\n\n<li>\u4ee3\u7801\uff1a\u6309\u51fd\u6570\/\u7c7b\u5207\uff0c\u907f\u514d\u5207\u65ad\u51fd\u6570\u4f53\u3002<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9488\u5bf9\u4e2d\u6587\uff0c\u4f18\u5148\u4fdd\u7559\u6362\u884c\u548c\u6bb5\u843d\u7ed3\u6784<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI 1.x \u4e0d\u80fd\u914d\u7f6e\u4e2d\u6587\u6807\u70b9\u8fb9\u754c\uff0c\u56e0\u6b64\u4e2d\u6587\u6587\u6863\u4e0d\u8981\u53ea\u4f9d\u8d56&nbsp;<code>TokenTextSplitter<\/code>&nbsp;\u81ea\u52a8\u6309\u4e2d\u6587\u53e5\u53f7\u5207\u53e5\u3002\u66f4\u7a33\u59a5\u7684\u505a\u6cd5\u662f\uff1a\u5728\u539f\u59cb\u6587\u6863\u4e2d\u4fdd\u7559\u6e05\u6670\u7684\u6bb5\u843d\u6362\u884c\uff0c\u6216\u8005\u5728\u8fdb\u5165&nbsp;<code>TokenTextSplitter<\/code>&nbsp;\u4e4b\u524d\u5148\u6309\u6807\u9898\u3001\u6bb5\u843d\u3001FAQ \u6761\u76ee\u7b49\u4e1a\u52a1\u8bed\u4e49\u8fb9\u754c\u505a\u4e00\u5c42\u9884\u5207\u5206\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5207\u5206\u4e0d\u662f\u4e00\u6b21\u6027\u5de5\u4f5c\uff0c\u8981\u6301\u7eed\u76d1\u63a7<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ebf\u4e0a\u8dd1\u4e00\u6bb5\u65f6\u95f4\u540e\uff0c\u770b\u54ea\u4e9b\u7528\u6237\u95ee\u9898\u53ec\u56de\u4e0d\u5230\u3001\u6216\u8005\u53ec\u56de\u4e86\u65e0\u5173\u5185\u5bb9\uff0c\u56de\u8fc7\u5934\u8c03\u6574 chunk \u5927\u5c0f\u3001overlap\u3001\u9884\u5207\u5206\u7b56\u7565\u548c\u6bb5\u843d\u7ed3\u6784\uff0c\u662f\u4e00\u4e2a\u8fed\u4ee3\u8fc7\u7a0b\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u6587\u6863\u5199\u5165<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u6587\u6863\u5199\u5165\u7684\u6838\u5fc3\u63a5\u53e3\u662f&nbsp;<code>DocumentWriter<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic interface DocumentWriter extends Consumer&lt;List&lt;Document&gt;&gt; {\n\n    default void write(List&lt;Document&gt; documents) {\n        accept(documents);\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728 RAG \u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u5199\u5165\u7684\u662f\u5411\u91cf\u6570\u636e\u5e93\uff0c\u6240\u4ee5\u66f4\u5e38\u7528\u7684\u662f&nbsp;<code>VectorStore<\/code>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic interface VectorStore extends DocumentWriter, VectorStoreRetriever {\n\n    void add(List&lt;Document&gt; documents);\n\n    \/\/ \u5176\u4ed6\u65b9\u6cd5\u6682\u65f6\u5148\u4e0d\u5173\u6ce8\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>VectorStore<\/code>&nbsp;\u53ef\u4ee5\u7406\u89e3\u4e3a Spring AI \u5bf9\u5411\u91cf\u6570\u636e\u5e93\u7684\u7edf\u4e00\u62bd\u8c61\u3002\u5e95\u5c42\u53ef\u4ee5\u662f Elasticsearch\u3001Redis\u3001Chroma\u3001Milvus \u7b49\uff0c\u4e0d\u540c\u7684\u5411\u91cf\u6570\u636e\u5e93\u6709\u4e0d\u540c\u7684VectorStore\u5b9e\u73b0\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u4f7f\u7528 Elasticsearch \u5b58\u50a8\u5411\u91cf\uff0c\u9700\u8981\u5f15\u5165\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-ai-starter-vector-store-elasticsearch&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u6ca1\u6709\u5355\u72ec\u5199&nbsp;<code>`\uff0c\u662f\u56e0\u4e3a\u524d\u9762\u5df2\u7ecf\u901a\u8fc7&nbsp;<\/code>spring-ai-bom` \u7edf\u4e00\u7ba1\u7406\u4e86 Spring AI \u76f8\u5173\u4f9d\u8d56\u7684\u7248\u672c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u540c\u65f6\u8fd8\u9700\u8981\u914d\u7f6e Embedding \u6a21\u578b\u3002\u56e0\u4e3a\u5199\u5165\u5411\u91cf\u5e93\u65f6\uff0c\u6587\u672c\u5fc5\u987b\u5148\u8f6c\u6210\u5411\u91cf\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  ai:\n    openai:\n      base-url: https:\/\/api.example.com\n      api-key: your-api-key\n      chat:\n        options:\n          model: your-chat-model\n      embedding:\n        options:\n          model: your-embedding-model\n    vectorstore:\n      elasticsearch:\n        index-name: spring-ai-docs\n        dimensions: 1536\n\n  elasticsearch:\n    uris: http:\/\/ip\u5730\u5740:9200\n```<\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u53c2\u6570<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u542b\u4e49<\/th><th class=\"has-text-align-left\" data-align=\"left\"><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>index-name<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Elasticsearch \u7d22\u5f15\u540d<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>dimensions<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5411\u91cf\u7ef4\u5ea6\uff0c\u5fc5\u987b\u548c Embedding \u6a21\u578b\u8f93\u51fa\u7ef4\u5ea6\u4e00\u81f4<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>spring.elasticsearch.uris<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Elasticsearch \u670d\u52a1\u5730\u5740<\/td><td class=\"has-text-align-left\" data-align=\"left\"><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>VectorStore<\/code>&nbsp;\u5728\u4fdd\u5b58\u6587\u6863\u65f6\uff0c\u5e76\u4e0d\u662f\u76f4\u63a5\u628a\u6587\u672c\u539f\u6837\u5199\u5165\u5411\u91cf\u5e93\u3002\u5b83\u4f1a\u5148\u8c03\u7528\u914d\u7f6e\u597d\u7684 Embedding \u6a21\u578b\uff0c\u628a\u6587\u6863\u6587\u672c\u8f6c\u6210\u5411\u91cf\uff0c\u7136\u540e\u518d\u628a\u5411\u91cf\u548c\u6587\u6863\u5185\u5bb9\u4e00\u8d77\u4fdd\u5b58\u5230\u5411\u91cf\u6570\u636e\u5e93\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.document.Document;\nimport org.springframework.ai.vectorstore.VectorStore;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class DocumentWriteService {\n\n    private final VectorStore vectorStore;\n\n    public DocumentWriteService(VectorStore vectorStore) {\n        this.vectorStore = vectorStore;\n    }\n\n    public void write(List&lt;Document&gt; documents) {\n        \/\/ add\u65b9\u6cd5\u4f1a\u5148\u5b8c\u6210Embedding\u5411\u91cf\u5316\uff0c\u518d\u5199\u5165\u5411\u91cf\u6570\u636e\u5e93\n        vectorStore.add(documents);\n    }\n}\n```<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b8c\u6574 ETL Controller<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a\u8bfb\u53d6\u3001\u5207\u5206\u3001\u5199\u5165\u4e32\u8d77\u6765\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\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.core.io.Resource;\nimport org.springframework.core.io.ResourceLoader;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n@RestController\npublic class RagEtlController {\n\n    private final ResourceLoader resourceLoader;\n    private final VectorStore vectorStore;\n\n    public RagEtlController(ResourceLoader resourceLoader, VectorStore vectorStore) {\n        this.resourceLoader = resourceLoader;\n        this.vectorStore = vectorStore;\n    }\n\n    @PostMapping(\"\/ai\/rag\/etl\")\n    public String etl() {\n        Resource resource = resourceLoader.getResource(\"classpath:document\/employee-handbook.txt\");\n        TextReader textReader = new TextReader(resource);\n        textReader.getCustomMetadata().put(\"source\", \"employee-handbook.txt\");\n        List&lt;Document&gt; documents = textReader.get();\n\n        TokenTextSplitter splitter = TokenTextSplitter.builder()\n                .withChunkSize(160)\n                .withMinChunkSizeChars(80)\n                .withMinChunkLengthToEmbed(5)\n                .withMaxNumChunks(100)\n                .withKeepSeparator(true)\n                .build();\n        List&lt;Document&gt; splitDocuments = splitter.apply(documents);\n\n        vectorStore.add(splitDocuments);\n\n        return \"ETL\u5b8c\u6210\uff0c\u5199\u5165\u6587\u6863\u7247\u6bb5\u6570\u91cf\uff1a\" + splitDocuments.size();\n    }\n}\n```<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u77e5\u8bc6\u7684\u68c0\u7d22\u53ca\u878d\u5408<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u77e5\u8bc6\u68c0\u7d22\u7406\u8bba<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6587\u6863\u4e2d\u7684\u77e5\u8bc6\u5728\u7ecf\u8fc7\u4e86ETL\u6d41\u7a0b\u540e\uff0c\u5c31\u4ee5\u5411\u91cf\u7684\u5f62\u5f0f\u5b58\u50a8\u5230\u4e86\u5411\u91cf\u6570\u636e\u5e93\u4e2d\u3002\u5f53\u7528\u6237\u63d0\u51fa\u95ee\u9898\u540e\uff0c\u5982\u4f55\u4ece\u5411\u91cf\u6570\u636e\u5e93\u4e2d\u627e\u5230\u548c\u7528\u6237\u95ee\u9898\u76f8\u5173\u7684\u77e5\u8bc6\u5462\uff1f\u5176\u5b9e\uff0c\u601d\u8def\u4e5f\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u5c06\u7528\u6237\u7684\u95ee\u9898\u4e5f\u7528\u540c\u4e00\u4e2a\u5411\u91cf\u6a21\u578b\u8f6c\u5316\u4e3a\u5411\u91cf\uff0c\u7136\u540e\u8ba1\u7b97\u7528\u6237\u7684\u95ee\u9898\u5411\u91cf\u4e0e\u77e5\u8bc6\u5e93\u4e2d\u5411\u91cf\u7684\u76f8\u4f3c\u5ea6\uff0c\u76f8\u4f3c\u5ea6\u8d8a\u9ad8\uff0c\u5219\u8bf4\u660e\u6539\u5411\u91cf\u6240\u4ee3\u8868\u7684\u77e5\u8bc6\u4e0e\u7528\u6237\u95ee\u9898\u8d8a\u76f8\u5173\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u4f55\u5224\u65ad\u5411\u91cf\u4e4b\u95f4\u7684\u76f8\u5173\u6027\u5462\uff1f\u901a\u8fc7<code>\u4f59\u5f26\u76f8\u4f3c\u5ea6<\/code>\uff0c\u5176\u503c\u57fa\u4e8e\u5411\u91cf\u70b9\u79ef\u548c\u6a21\u957f\u63a8\u5bfc\uff0c\u5bf9\u5e94\u7684\u516c\u5f0f\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$$<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\\cos\\theta = \\frac{\\vec{a} \\cdot \\vec{b}}{|\\vec{a}| \\cdot |\\vec{b}|}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">$$<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5176\u4e2d$\\vec{a}$\u548c $\\vec{b}$\u662f\u4e24\u4e2a\u975e\u96f6\u5411\u91cf\uff0c$\\theta$ \u662f\u5b83\u4eec\u7684\u5939\u89d2\uff0c$\\vec{a} \\cdot \\vec{b}$\u662f\u70b9\u79ef\uff0c$|\\vec{a}|$\u3001$|\\vec{b}|$\u662f\u5411\u91cf\u6a21\u957f\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5f53 cos*\u03b8*=1 \u65f6\uff0c*\u03b8*=0\u2218\uff0c\u4e24\u5411\u91cf\u65b9\u5411\u5b8c\u5168\u76f8\u540c\uff08\u76f8\u4f3c\u5ea6\u6700\u9ad8\uff09\u3002<\/li>\n\n\n\n<li>\u5f53 cos*\u03b8*=0 \u65f6\uff0c*\u03b8*=90\u2218\uff0c\u4e24\u5411\u91cf\u5782\u76f4\uff08\u65e0\u4efb\u4f55\u65b9\u5411\u5173\u8054\uff09\u3002<\/li>\n\n\n\n<li>\u5f53 cos*\u03b8*=\u22121 \u65f6\uff0c*\u03b8*=180\u2218\uff0c\u4e24\u5411\u91cf\u65b9\u5411\u5b8c\u5168\u76f8\u53cd\uff08\u76f8\u4f3c\u5ea6\u6700\u4f4e\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u77e5\u8bc6\u68c0\u7d22\u5b9e\u73b0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9996\u5148\u9700\u8981\u5f15\u5165\u5982\u4e0b\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-ai-advisors-vector-store&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u77e5\u8bc6\u5165\u5e93\u540e\uff0c\u7528\u6237\u63d0\u95ee\u65f6\u5c31\u8981\u505a\u4e24\u4ef6\u4e8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4ece\u5411\u91cf\u6570\u636e\u5e93\u68c0\u7d22\u76f8\u5173\u77e5\u8bc6\u3002<\/li>\n\n\n\n<li>\u628a\u68c0\u7d22\u5230\u7684\u77e5\u8bc6\u653e\u8fdb Prompt\uff0c\u8ba9\u6a21\u578b\u53c2\u8003\u540e\u56de\u7b54\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u63d0\u4f9b\u4e86&nbsp;<code>QuestionAnswerAdvisor<\/code>&nbsp;\u5e2e\u6211\u4eec\u5b8c\u6210\u8fd9\u4e2a\u6d41\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u7406\u89e3\uff1a<code>QuestionAnswerAdvisor<\/code>&nbsp;\u662f\u4e00\u4e2a\u4e13\u95e8\u7528\u4e8e RAG \u95ee\u7b54\u7684 Advisor\uff0c\u5b83\u4f1a\u5728\u8c03\u7528\u6a21\u578b\u524d\uff0c\u6839\u636e\u7528\u6237\u95ee\u9898\u53bb&nbsp;<code>VectorStore<\/code>&nbsp;\u68c0\u7d22\u76f8\u5173\u6587\u6863\uff0c\u5e76\u628a\u6587\u6863\u5185\u5bb9<strong>\u52a0\u5165 Prompt<\/strong>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.chat.client.ChatClient;\nimport org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;\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\n@RestController\npublic class RagChatController {\n\n    private final ChatClient chatClient;\n    private final VectorStore vectorStore;\n\n    public RagChatController(ChatClient chatClient, VectorStore vectorStore) {\n        this.chatClient = chatClient;\n        this.vectorStore = vectorStore;\n    }\n\n    @GetMapping(\"\/ai\/rag\/chat\")\n    public String ragChat(@RequestParam String question) {\n        QuestionAnswerAdvisor advisor = QuestionAnswerAdvisor.builder(vectorStore)\n                .searchRequest(SearchRequest.builder()\n                        .topK(5)\n                        .similarityThreshold(0.7)\n                        .build())\n                .build();\n\n        return chatClient.prompt()\n                .advisors(advisor)\n                .user(question)\n                .call()\n                .content();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u91cd\u70b9\u7406\u89e3\u4e24\u4e2a\u53c2\u6570\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u53c2\u6570<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f5c\u7528<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>topK<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6700\u591a\u68c0\u7d22\u51e0\u4e2a\u76f8\u5173\u7247\u6bb5<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>similarityThreshold<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u76f8\u4f3c\u5ea6\u4f4e\u4e8e\u9608\u503c\u7684\u7247\u6bb5\u4e0d\u8981<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c&nbsp;<code>topK<\/code>&nbsp;\u592a\u5c0f\uff0c\u53ef\u80fd\u6f0f\u6389\u5173\u952e\u4fe1\u606f\uff1b\u5982\u679c\u592a\u5927\uff0cPrompt \u4f1a\u53d8\u957f\uff0c\u566a\u58f0\u4e5f\u4f1a\u589e\u52a0\u3002\u5982\u679c\u9608\u503c\u592a\u9ad8\uff0c\u53ef\u80fd\u67e5\u4e0d\u5230\u5185\u5bb9\uff1b\u5982\u679c\u592a\u4f4e\uff0c\u53ef\u80fd\u628a\u4e0d\u76f8\u5173\u5185\u5bb9\u585e\u7ed9\u6a21\u578b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RAG \u8c03\u4f18\u5f88\u591a\u65f6\u5019\u5c31\u662f\u5728\u8c03\u8fd9\u4e9b\u53c2\u6570\uff0c\u4ee5\u53ca\u8c03\u6587\u6863\u5207\u5206\u7b56\u7565\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tool Calling<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u9762 RAG \u89e3\u51b3\u7684\u662f\u201c\u8ba9\u6a21\u578b\u770b\u6211\u4eec\u7684\u77e5\u8bc6\u201d\u3002\u4f46\u662f\u5f88\u591a\u4e1a\u52a1\u573a\u666f\u4e2d\uff0c\u6a21\u578b\u4e0d\u53ea\u662f\u8981\u770b\u8d44\u6599\uff0c\u8fd8\u8981\u8c03\u7528\u7cfb\u7edf\u80fd\u529b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\u67e5\u8be2\u4eca\u5929\u5317\u4eac\u5929\u6c14\u3001\u67e5\u8be2\u67d0\u4e2a\u8ba2\u5355\u72b6\u6001\u3001\u521b\u5efa\u4e00\u6761\u5f85\u529e\u4e8b\u9879\u3001\u8c03\u7528\u6302\u53f7\u63a5\u53e3\u3001\u6839\u636e\u60a3\u8005 ID \u67e5\u8be2\u75c5\u5386\u6458\u8981\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5c31\u9700\u8981&nbsp;<code>Tool Calling<\/code>\uff0c\u4e5f\u53eb\u5de5\u5177\u8c03\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u5b98\u65b9\u63d0\u5230\uff0cTools \u4e3b\u8981\u7528\u4e8e\u4e24\u7c7b\u573a\u666f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>Information Retrieval<\/code>\uff1a\u4fe1\u606f\u68c0\u7d22\u3002\u8ba9\u6a21\u578b\u8c03\u7528\u5de5\u5177\u67e5\u8be2\u5916\u90e8\u4fe1\u606f\uff0c\u4f8b\u5982\u5929\u6c14\u3001\u5e93\u5b58\u3001\u8ba2\u5355\u3001\u75c5\u5386\u3002<\/li>\n\n\n\n<li><code>Taking Actions<\/code>\uff1a\u6267\u884c\u52a8\u4f5c\u3002\u8ba9\u6a21\u578b\u8c03\u7528\u5de5\u5177\u5b8c\u6210\u67d0\u4e2a\u64cd\u4f5c\uff0c\u4f8b\u5982\u521b\u5efa\u5de5\u5355\u3001\u53d1\u9001\u6d88\u606f\u3001\u63d0\u4ea4\u8868\u5355\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ee3\u7801\u5c42\u9762\u4ec0\u4e48\u662f Tool<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728 Spring AI \u4e2d\uff0c\u4ee3\u7801\u5c42\u9762\u53ef\u4ee5\u628a\u4e00\u4e2a Java \u65b9\u6cd5\u66b4\u9732\u6210 Tool\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e5f\u5c31\u662f\u8bf4\uff1a\u4e00\u4e2a\u5e26\u6709\u5de5\u5177\u63cf\u8ff0\u7684\u65b9\u6cd5\uff0c\u5c31\u662f\u6a21\u578b\u53ef\u4ee5\u9009\u62e9\u8c03\u7528\u7684\u80fd\u529b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u5e38\u7528\u7684\u662f\u58f0\u660e\u5f0f\u5b9a\u4e49\uff0c\u4e5f\u5c31\u662f\u4f7f\u7528&nbsp;<code>@Tool<\/code>&nbsp;\u6ce8\u89e3\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport org.springframework.ai.tool.annotation.Tool;\nimport org.springframework.ai.tool.annotation.ToolParam;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class WeatherTools {\n\n    @Tool(description = \"\u6839\u636e\u57ce\u5e02\u540d\u79f0\u67e5\u8be2\u5f53\u524d\u5929\u6c14\")\n    public String getWeather(\n            @ToolParam(description = \"\u57ce\u5e02\u540d\u79f0\uff0c\u4f8b\u5982\u5317\u4eac\u3001\u4e0a\u6d77\u3001\u5e7f\u5dde\") String city) {\n        if (\"\u5317\u4eac\".equals(city)) {\n            return \"\u5317\u4eac\u4eca\u5929\u6674\uff0c\u6c14\u6e29 18 \u5230 28 \u6444\u6c0f\u5ea6\u3002\";\n        }\n        return city + \"\u4eca\u5929\u591a\u4e91\uff0c\u6c14\u6e29 20 \u5230 26 \u6444\u6c0f\u5ea6\u3002\";\n    }\n}\n```<\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u6ce8\u89e3<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f5c\u7528<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@Tool<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u6807\u8bb0\u5f53\u524d\u65b9\u6cd5\u53ef\u4ee5\u4f5c\u4e3a\u5de5\u5177\u66b4\u9732\u7ed9\u6a21\u578b\uff0c\u5e76\u63cf\u8ff0\u5de5\u5177\u7528\u9014<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>@ToolParam<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u63cf\u8ff0\u65b9\u6cd5\u53c2\u6570\u542b\u4e49\uff0c\u5e2e\u52a9\u6a21\u578b\u6b63\u786e\u751f\u6210\u5de5\u5177\u5165\u53c2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u8981\u7279\u522b\u6ce8\u610f\uff1a\u6a21\u578b\u4e0d\u662f\u76f4\u63a5\u8bfb Java \u4ee3\u7801\u3002\u6a21\u578b\u4e3b\u8981\u6839\u636e\u5de5\u5177\u540d\u79f0\u3001\u5de5\u5177\u63cf\u8ff0\u3001\u53c2\u6570\u63cf\u8ff0\u6765\u5224\u65ad\u662f\u5426\u8c03\u7528\u5de5\u5177\u3002\u6240\u4ee5\u63cf\u8ff0\u4e00\u5b9a\u8981\u6e05\u695a\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5de5\u5177\u8c03\u7528\u8fc7\u7a0b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5de5\u5177\u8c03\u7528\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nsequenceDiagram\n    participant User as \ud83d\udc64 \u7528\u6237\n    participant AIApp as \ud83e\udd16 AI\u5e94\u7528\n    participant LLM as \ud83d\udca1 \u57fa\u7840\u5927\u6a21\u578b\n    participant Tools as \ud83d\udd27 \u5de5\u5177\u96c6\n\n    User-&gt;&gt;AIApp: \ud83d\udfea 1. \u63d0\u51fa\u95ee\u9898\uff08\u5982\uff1a\u5317\u4eac\u4eca\u5929\u5929\u6c14\uff1f\uff09\n    AIApp-&gt;&gt;LLM: \ud83d\udfe6 2.1 \u5de5\u5177\u4fe1\u606f + Prompt\u63d0\u793a\u8bcd\n\n    alt \u6839\u636e\u5927\u6a21\u578b\u8fd4\u56de\u7684\u54cd\u5e94\u5224\u65ad\uff0c\u662f\u5426\u9700\u8981\u5de5\u5177\u8c03\u7528\n        LLM-&gt;&gt;AIApp: \ud83d\udfe8 2.2 \u5224\u65ad\u65e0\u9700\u5de5\u5177\u8c03\u7528\uff0c\u8fd4\u56de\u6700\u7ec8\u54cd\u5e94\n    else \u6839\u636e\u5927\u6a21\u578b\u8fd4\u56de\u7684\u54cd\u5e94\u5224\u65ad\uff0c\u9700\u8981\u5de5\u5177\u8c03\u7528\n        AIApp-&gt;&gt;Tools: \ud83d\udfe6 2.3 \u8c03\u7528\u6307\u5b9a\u5de5\u5177\uff08\u4f20\u5165\u5165\u53c2\uff09\n        Tools-&gt;&gt;AIApp: \ud83d\udfe9 2.4 \u8fd4\u56de\u5de5\u5177\u6267\u884c\u7ed3\u679c\uff08\u5982\u5929\u6c14\u6570\u636e\/\u8ba1\u7b97\u7ed3\u679c\uff09\n        AIApp-&gt;&gt;LLM: \ud83d\udfe6 2.5 \u6574\u5408Prompt\uff08Prompt\u63d0\u793a\u8bcd+\u5de5\u5177\u7ed3\u679c\uff09\n        LLM-&gt;&gt;AIApp: \ud83d\udfe6 2.6 \u8fd4\u56de\u7ed3\u5408\u5de5\u5177\u6267\u884c\u7ed3\u679c\u7684\u6700\u7ec8\u54cd\u5e94\n    end\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u5927\u767d\u8bdd\u8bb2\uff1a\u5e94\u7528\u5148\u628a\u201c\u6709\u54ea\u4e9b\u5de5\u5177\u53ef\u7528\u201d\u544a\u8bc9\u6a21\u578b\uff1b\u6a21\u578b\u6839\u636e\u7528\u6237\u95ee\u9898\u5224\u65ad\u8981\u4e0d\u8981\u8c03\u7528\u5de5\u5177\uff1b\u5982\u679c\u9700\u8981\u8c03\u7528\uff0c\u6a21\u578b\u8fd4\u56de\u5de5\u5177\u540d\u548c\u53c2\u6570\uff1bSpring AI \u6839\u636e\u5de5\u5177\u540d\u548c\u53c2\u6570\u8c03\u7528\u5bf9\u5e94 Java \u65b9\u6cd5\uff1b\u5de5\u5177\u8fd4\u56de\u7ed3\u679c\uff1bSpring AI \u518d\u628a\u5de5\u5177\u7ed3\u679c\u4ea4\u7ed9\u6a21\u578b\uff1b\u6a21\u578b\u57fa\u4e8e\u5de5\u5177\u7ed3\u679c\u7ec4\u7ec7\u6700\u7ec8\u56de\u7b54\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\u771f\u6b63\u6267\u884c\u5de5\u5177\u7684\u4e0d\u662f\u6a21\u578b\u672c\u8eab\uff0c\u800c\u662f\u6211\u4eec\u7684 Java \u5e94\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u8ba9\u6211\u4eec\u5b9a\u4e49\u7684Tool\u751f\u6548\u5462\uff1f\u53ea\u9700\u8981\u628a\u5b9a\u4e49\u597d\u7684tool\u8bbe\u7f6e\u7ed9ChatClient\u5bf9\u8c61\u5373\u53ef<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\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\n@RestController\npublic class ToolChatController {\n\n    private final ChatClient chatClient;\n    private final WeatherTools weatherTools;\n\n    public ToolChatController(ChatClient chatClient, WeatherTools weatherTools) {\n        this.chatClient = chatClient;\n        this.weatherTools = weatherTools;\n    }\n\n    @GetMapping(\"\/ai\/tool\/weather\")\n    public String weather(@RequestParam String question) {\n        return chatClient.prompt()\n                .user(question)\n                \/\/ tools \u65b9\u6cd5\u53ef\u4ee5\u63a5\u6536\u4e00\u4e2a\u6216\u591a\u4e2a\u5de5\u5177\u5bf9\u8c61\n                \/\/ Spring AI \u4f1a\u81ea\u52a8\u626b\u63cf\u5176\u4e2d\u6807\u4e86 @Tool \u7684\u65b9\u6cd5\u5e76\u6ce8\u518c\u7ed9\u672c\u6b21\u8c03\u7528\n                .tools(weatherTools)\n                .call()\n                .content();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u7528\u6237\u95ee&#8221;\u5317\u4eac\u4eca\u5929\u5929\u6c14\u600e\u4e48\u6837&#8221;\u65f6\uff0c\u6a21\u578b\u4f1a\u53d1\u73b0\u666e\u901a\u8bed\u8a00\u6a21\u578b\u672c\u8eab\u4e0d\u77e5\u9053\u5b9e\u65f6\u5929\u6c14\uff0c\u4e8e\u662f\u9009\u62e9\u8c03\u7528&nbsp;<code>getWeather<\/code>&nbsp;\u5de5\u5177\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u9644\u5f55<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Prompt \u4f18\u5316\u6280\u5de7<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u8865\u5145\u4e00\u4e9b\u5e38\u89c1 Prompt \u6280\u5de7\u3002\u5927\u5bb6\u5148\u4e0d\u7528\u6b7b\u8bb0\uff0c\u5148\u7406\u89e3\u5b83\u4eec\u5206\u522b\u89e3\u51b3\u4ec0\u4e48\u95ee\u9898\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ed9 AI \u63d0\u4f9b\u6e05\u6670\u7684\u4efb\u52a1\u63cf\u8ff0\u548c\u89d2\u8272\u5b9a\u4f4d\uff0c\u5e2e\u52a9\u6a21\u578b\u7406\u89e3\u80cc\u666f\u548c\u671f\u671b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u7cfb\u7edf\uff1a\u4f60\u662f\u4e00\u4f4d\u7ecf\u9a8c\u4e30\u5bcc\u7684 Python \u6559\u5e08\uff0c\u64c5\u957f\u5411\u521d\u5b66\u8005\u89e3\u91ca\u7f16\u7a0b\u6982\u5ff5\u3002\n\u7528\u6237\uff1a\u8bf7\u89e3\u91ca Python \u4e2d\u7684\u5217\u8868\u63a8\u5bfc\u5f0f\uff0c\u5305\u62ec\u57fa\u672c\u8bed\u6cd5\u548c 2-3 \u4e2a\u5b9e\u7528\u793a\u4f8b\u3002\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u63d0\u4f9b\u8db3\u591f\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\u548c\u671f\u671b\u8f93\u51fa\u683c\u5f0f\uff0c\u51cf\u5c11\u6a21\u578b\u4e0d\u786e\u5b9a\u6027\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u8bf7\u63d0\u4f9b\u4e00\u4e2a\u793e\u4ea4\u5a92\u4f53\u8425\u9500\u8ba1\u5212\uff0c\u9488\u5bf9\u4e00\u6b3e\u65b0\u4e0a\u5e02\u7684\u667a\u80fd\u624b\u8868\u3002\u8ba1\u5212\u5e94\u5305\u542b\uff1a\n1. \u76ee\u6807\u53d7\u4f17\u63cf\u8ff0\n2. \u4e09\u4e2a\u5185\u5bb9\u4e3b\u9898\n3. \u6bcf\u4e2a\u5e73\u53f0\u7684\u5185\u5bb9\u7c7b\u578b\u5efa\u8bae\n4. \u53d1\u5e03\u9891\u7387\u5efa\u8bae\n\n\u793a\u4f8b\u683c\u5f0f\uff1a\n\u76ee\u6807\u53d7\u4f17\uff1a[\u63cf\u8ff0]\n\u5185\u5bb9\u4e3b\u9898\uff1a[\u4e3b\u98981]\uff0c[\u4e3b\u98982]\uff0c[\u4e3b\u98983]\n\u5e73\u53f0\u7b56\u7565\uff1a[\u5e73\u53f0] - [\u5185\u5bb9\u7c7b\u578b] - [\u9891\u7387]\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u901a\u8fc7\u5217\u8868\u3001\u8868\u683c\u7b49\u7ed3\u6784\u5316\u683c\u5f0f\uff0c\u8ba9\u6a21\u578b\u8f93\u51fa\u66f4\u6709\u6761\u7406\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u5206\u6790\u4ee5\u4e0b\u516c\u53f8\u7684\u4f18\u52bf\u548c\u52a3\u52bf\uff1a\n\u516c\u53f8\uff1aTesla\n\n\u8bf7\u4f7f\u7528\u8868\u683c\u683c\u5f0f\u56de\u7b54\uff0c\u5305\u542b\u4ee5\u4e0b\u5217\uff1a\n- \u4f18\u52bf\uff08\u6700\u5c113\u9879\uff09\n- \u6bcf\u9879\u4f18\u52bf\u7684\u7b80\u8981\u5206\u6790\n- \u52a3\u52bf\uff08\u6700\u5c113\u9879\uff09\n- \u6bcf\u9879\u52a3\u52bf\u7684\u7b80\u8981\u5206\u6790\n- \u5e94\u5bf9\u5efa\u8bae\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f15\u5bfc\u6a21\u578b\u5206\u6b65\u9aa4\u601d\u8003\uff0c\u63d0\u9ad8\u590d\u6742\u95ee\u9898\u7684\u51c6\u786e\u6027\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u95ee\u9898\uff1a\u4e00\u4e2a\u5546\u5e97\u552e\u5356 T \u6064\uff0c\u6bcf\u4ef6 15 \u5143\u3002\u5982\u679c\u8d2d\u4e70 5 \u4ef6\u4ee5\u4e0a\u53ef\u4ee5\u4eab\u53d7 8 \u6298\u4f18\u60e0\u3002\u5c0f\u660e\u4e70\u4e86 7 \u4ef6 T \u6064\uff0c\u4ed6\u9700\u8981\u652f\u4ed8\u591a\u5c11\u94b1\uff1f\n\n\u8bf7\u4e00\u6b65\u6b65\u601d\u8003\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff1a\n1. \u9996\u5148\u8ba1\u7b97 7 \u4ef6 T \u6064\u7684\u539f\u4ef7\n2. \u786e\u5b9a\u662f\u5426\u7b26\u5408\u6298\u6263\u6761\u4ef6\n3. \u5982\u679c\u7b26\u5408\uff0c\u8ba1\u7b97\u6298\u6263\u540e\u7684\u4ef7\u683c\n4. \u5f97\u51fa\u6700\u7ec8\u652f\u4ed8\u91d1\u989d\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u901a\u8fc7\u63d0\u4f9b\u51e0\u4e2a\u8f93\u5165\u8f93\u51fa\u793a\u4f8b\uff0c\u5e2e\u52a9\u6a21\u578b\u7406\u89e3\u4efb\u52a1\u6a21\u5f0f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u6211\u5c06\u7ed9\u4f60\u4e00\u4e9b\u60c5\u611f\u5206\u6790\u7684\u4f8b\u5b50\uff0c\u7136\u540e\u8bf7\u4f60\u6309\u7167\u540c\u6837\u7684\u65b9\u5f0f\u5206\u6790\u65b0\u53e5\u5b50\u7684\u60c5\u611f\u503e\u5411\u3002\n\n\u8f93\u5165\uff1a\"\u8fd9\u5bb6\u9910\u5385\u7684\u670d\u52a1\u592a\u5dee\u4e86\uff0c\u7b49\u4e86\u4e00\u4e2a\u5c0f\u65f6\u624d\u4e0a\u83dc\"\n\u8f93\u51fa\uff1a\u8d1f\u9762\uff0c\u56e0\u4e3a\u63cf\u8ff0\u4e86\u957f\u65f6\u95f4\u7b49\u5f85\u548c\u5dee\u8bc4\u670d\u52a1\n\n\u8f93\u5165\uff1a\"\u65b0\u4e70\u7684\u624b\u673a\u5c4f\u5e55\u6e05\u6670\uff0c\u7535\u6c60\u4e5f\u5f88\u8010\u7528\"\n\u8f93\u51fa\uff1a\u6b63\u9762\uff0c\u56e0\u4e3a\u8d5e\u626c\u4e86\u4ea7\u54c1\u7684\u591a\u4e2a\u65b9\u9762\n\n\u73b0\u5728\u5206\u6790\u8fd9\u4e2a\u53e5\u5b50\uff1a\n\"\u8fd9\u672c\u4e66\u5185\u5bb9\u8fd8\u884c\uff0c\u4f46\u662f\u4ef7\u683c\u6709\u70b9\u8d35\"\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c06\u590d\u6742\u4efb\u52a1\u62c6\u6210\u6b65\u9aa4\uff0c\u964d\u4f4e\u6a21\u578b\u9057\u6f0f\u5173\u952e\u73af\u8282\u7684\u6982\u7387\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u8bf7\u5e2e\u6211\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u7f51\u7ad9\u843d\u5730\u9875\u8bbe\u8ba1\u65b9\u6848\uff0c\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\uff1a\n\n\u6b65\u9aa41\uff1a\u5206\u6790\u76ee\u6807\u53d7\u4f17\uff08\u8003\u8651\u5e74\u9f84\u3001\u804c\u4e1a\u3001\u9700\u6c42\u7b49\u56e0\u7d20\uff09\n\u6b65\u9aa42\uff1a\u786e\u5b9a\u9875\u9762\u6838\u5fc3\u4fe1\u606f\uff08\u4e3b\u6807\u9898\u3001\u526f\u6807\u9898\u3001\u4ef7\u503c\u4e3b\u5f20\uff09\n\u6b65\u9aa43\uff1a\u8bbe\u8ba1\u9875\u9762\u7ed3\u6784\uff08\u81f3\u5c11\u5305\u542b\u54ea\u4e9b\u533a\u5757\uff09\n\u6b65\u9aa44\uff1a\u5236\u5b9a\u89c6\u89c9\u5f15\u5bfc\u7b56\u7565\uff08\u989c\u8272\u3001\u56fe\u50cf\u5efa\u8bae\uff09\n\u6b65\u9aa45\uff1a\u8bbe\u8ba1\u884c\u52a8\u53ec\u5524\u6309\u94ae\u548c\u6587\u6848\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8ba9\u6a21\u578b\u68c0\u67e5\u81ea\u5df1\u7684\u8f93\u51fa\uff0c\u63d0\u9ad8\u590d\u6742\u4efb\u52a1\u7684\u53ef\u9760\u6027\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u89e3\u51b3\u4ee5\u4e0b\u6982\u7387\u95ee\u9898\uff1a\n\u4ece\u4e00\u526f\u6807\u51c6\u6251\u514b\u724c\u4e2d\u968f\u673a\u62bd\u53d6\u4e24\u5f20\u724c\uff0c\u6c42\u62bd\u5230\u81f3\u5c11\u4e00\u5f20\u7ea2\u6843\u7684\u6982\u7387\u3002\n\n\u9996\u5148\u7ed9\u51fa\u4f60\u7684\u89e3\u7b54\uff0c\u7136\u540e\uff1a\n1. \u68c0\u67e5\u4f60\u7684\u63a8\u7406\u8fc7\u7a0b\u662f\u5426\u5b58\u5728\u903b\u8f91\u9519\u8bef\n2. \u9a8c\u8bc1\u4f60\u4f7f\u7528\u7684\u6982\u7387\u516c\u5f0f\u662f\u5426\u6b63\u786e\n3. \u68c0\u67e5\u8ba1\u7b97\u6b65\u9aa4\u662f\u5426\u6709\u8bef\n4. \u5982\u679c\u53d1\u73b0\u4efb\u4f55\u95ee\u9898\uff0c\u63d0\u4f9b\u4fee\u6b63\u540e\u7684\u89e3\u7b54\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u7b54\u6848\u9700\u8981\u4f9d\u636e\u6750\u6599\u65f6\uff0c\u8981\u6c42\u6a21\u578b\u8bf4\u660e\u4f9d\u636e\uff0c\u964d\u4f4e\u80e1\u7f16\u4e71\u9020\u6982\u7387\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u8bf7\u89e3\u91ca\u5149\u5408\u4f5c\u7528\u7684\u8fc7\u7a0b\u53ca\u5176\u5728\u690d\u7269\u751f\u957f\u4e2d\u7684\u4f5c\u7528\u3002\u5728\u56de\u7b54\u4e2d\uff1a\n1. \u63d0\u4f9b\u5149\u5408\u4f5c\u7528\u7684\u79d1\u5b66\u5b9a\u4e49\n2. \u89e3\u91ca\u4e3b\u8981\u7684\u5316\u5b66\u53cd\u5e94\n3. \u63cf\u8ff0\u5f71\u54cd\u5149\u5408\u4f5c\u7528\u6548\u7387\u7684\u5173\u952e\u56e0\u7d20\n4. \u8bf4\u660e\u5176\u5bf9\u751f\u6001\u7cfb\u7edf\u7684\u91cd\u8981\u6027\n\n\u5bf9\u4e8e\u4efb\u4f55\u53ef\u80fd\u9700\u8981\u5177\u4f53\u6570\u636e\u6216\u7814\u7a76\u652f\u6301\u7684\u9648\u8ff0\uff0c\u8bf7\u660e\u786e\u6307\u51fa\u8fd9\u4e9b\u4fe1\u606f\u7684\u6765\u6e90\uff0c\u5e76\u8bf4\u660e\u8fd9\u4e9b\u4fe1\u606f\u7684\u53ef\u9760\u6027\u3002\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8981\u6c42\u6a21\u578b\u4ece\u4e0d\u540c\u89d2\u8272\u6216\u4e13\u4e1a\u89c6\u89d2\u5206\u6790\u95ee\u9898\uff0c\u8ba9\u7b54\u6848\u66f4\u5168\u9762\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u5206\u6790\u201c\u57ce\u5e02\u5e94\u8be5\u7981\u6b62\u79c1\u5bb6\u8f66\u8fdb\u5165\u5e02\u4e2d\u5fc3\u201d\u8fd9\u4e00\u63d0\u8bae\uff1a\n\n\u8bf7\u4ece\u4ee5\u4e0b 4 \u4e2a\u4e0d\u540c\u89d2\u5ea6\u5206\u6790\uff1a\n1. \u73af\u4fdd\u4e13\u5bb6\u89c6\u89d2\n2. \u7ecf\u6d4e\u5b66\u5bb6\u89c6\u89d2\n3. \u5e02\u4e2d\u5fc3\u5546\u6237\u89c6\u89d2\n4. \u901a\u52e4\u5c45\u6c11\u89c6\u89d2\n\n\u5bf9\u6bcf\u4e2a\u89c6\u89d2\uff1a\n- \u63d0\u4f9b\u652f\u6301\u8be5\u63d0\u8bae\u7684 2 \u4e2a\u8bba\u70b9\n- \u63d0\u4f9b\u53cd\u5bf9\u8be5\u63d0\u8bae\u7684 2 \u4e2a\u8bba\u70b9\n- \u5206\u6790\u53ef\u80fd\u7684\u6298\u4e2d\u65b9\u6848\n```<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">TokenTextSplitter \u5b8c\u6574\u5207\u5206\u89c4\u5219<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8fd9\u91cc\u628a Spring AI 1.x \u4e2d&nbsp;<code>TokenTextSplitter<\/code>&nbsp;\u7684\u5b8c\u6574\u5207\u5206\u8fc7\u7a0b\u5217\u51fa\u6765\uff0c\u65b9\u4fbf\u8bfe\u540e\u56de\u987e\u3002\u65e5\u5e38\u4f7f\u7528\u53ea\u9700\u8981\u77e5\u9053&#8221;\u6309 token \u5207\u3001\u5c3d\u91cf\u5728\u5185\u7f6e\u82f1\u6587\u6807\u70b9\u6216\u6362\u884c\u5904\u5207\u5f00&#8221;\u5373\u53ef\uff0c\u4f46\u5f53\u4f60\u9047\u5230\u5207\u5206\u7ed3\u679c\u4e0d\u7b26\u5408\u9884\u671f\u65f6\uff0c\u8fd9\u4efd\u89c4\u5219\u53ef\u4ee5\u5e2e\u4f60\u5b9a\u4f4d\u539f\u56e0\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b8c\u6574\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5148\u628a\u6574\u6bb5\u6587\u672c\u7528&nbsp;<code>CL100K_BASE<\/code>&nbsp;\u7f16\u7801\u8f6c\u6210 token \u5e8f\u5217\u3002<\/li>\n\n\n\n<li>\u6bcf\u8f6e\u5148\u5224\u65ad\u5f53\u524d\u8fd8\u5269\u591a\u5c11 token\uff1a<\/li>\n\n\n\n<li>\u5982\u679c\u5269\u4f59 token \u6570\u4e0d\u8d85\u8fc7&nbsp;<code>chunkSize<\/code>\uff0c\u76f4\u63a5\u628a\u5269\u4f59\u5185\u5bb9\u4f5c\u4e3a\u6700\u540e\u4e00\u4e2a\u5019\u9009 chunk\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u5269\u4f59 token \u6570\u8d85\u8fc7&nbsp;<code>chunkSize<\/code>\uff0c\u53d6\u524d&nbsp;<code>chunkSize<\/code>&nbsp;\u4e2a token \u4f5c\u4e3a\u5019\u9009\u7a97\u53e3\uff0c\u5e76\u628a\u5b83\u89e3\u7801\u56de\u6587\u672c\u3002<\/li>\n\n\n\n<li>\u5bf9\u5019\u9009\u7a97\u53e3\u5c1d\u8bd5\u505a\u8fb9\u754c\u5bf9\u9f50\uff1a<\/li>\n\n\n\n<li>\u5207\u5206\u70b9\u53ea\u4f1a\u4ece\u6e90\u7801\u5185\u7f6e\u7684 4 \u4e2a\u8fb9\u754c\u5b57\u7b26\u4e2d\u627e\uff1a\u82f1\u6587\u53e5\u53f7&nbsp;<code>.<\/code>\u3001\u82f1\u6587\u95ee\u53f7&nbsp;<code>?<\/code>\u3001\u82f1\u6587\u611f\u53f9\u53f7&nbsp;<code>!<\/code>\u3001\u6362\u884c&nbsp;<code>\\n<\/code>\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u627e\u5230\u4e86\u8fb9\u754c\u5b57\u7b26\uff0c\u5e76\u4e14\u5b83\u7684\u4f4d\u7f6e\u5927\u4e8e&nbsp;<code>minChunkSizeChars<\/code>\uff0c\u5c31\u5728\u8fd9\u4e2a\u8fb9\u754c\u5b57\u7b26\u540e\u63d0\u524d\u622a\u65ad chunk\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u6ca1\u6709\u627e\u5230\u8fb9\u754c\u5b57\u7b26\uff0c\u6216\u8005\u8fb9\u754c\u5b57\u7b26\u4f4d\u7f6e\u4e0d\u5927\u4e8e&nbsp;<code>minChunkSizeChars<\/code>\uff0c\u5c31\u4e0d\u6309\u6807\u70b9\u622a\u65ad\uff0c\u76f4\u63a5\u4f7f\u7528\u5f53\u524d\u5019\u9009\u7a97\u53e3\u3002<\/li>\n\n\n\n<li>\u63d0\u524d\u622a\u65ad\u65f6\uff0c\u5019\u9009\u7a97\u53e3\u91cc\u6ca1\u8fdb\u5165\u5f53\u524d chunk \u7684 token \u4e0d\u4f1a\u4e22\uff0c\u4f1a\u7559\u5230\u4e0b\u4e00\u8f6e\u7ee7\u7eed\u5904\u7406\u3002<\/li>\n\n\n\n<li>\u53bb\u9664\u9996\u5c3e\u7a7a\u767d\uff1b\u6839\u636e&nbsp;<code>keepSeparator<\/code>&nbsp;\u51b3\u5b9a\u662f\u5426\u628a\u7cfb\u7edf\u6362\u884c\u7b26\u66ff\u6362\u4e3a\u7a7a\u683c\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u6700\u7ec8\u957f\u5ea6\u5927\u4e8e&nbsp;<code>minChunkLengthToEmbed<\/code>\uff0c\u5c31\u628a\u5b83\u52a0\u5165\u7ed3\u679c\uff0c\u5426\u5219\u4e22\u5f03\u3002<\/li>\n\n\n\n<li>\u4ece\u5269\u4f59 token \u4e2d\u79fb\u9664\u5df2\u7ecf\u52a0\u5165\u5f53\u524d chunk \u7684 token\uff0c\u7ee7\u7eed\u5904\u7406\u540e\u9762\u7684\u6587\u672c\u3002<\/li>\n\n\n\n<li>\u76f4\u5230\u6240\u6709 token \u5904\u7406\u5b8c\u6216\u8fbe\u5230&nbsp;<code>maxNumChunks<\/code>&nbsp;\u4e0a\u9650\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u56e0\u4e3a\u8fbe\u5230&nbsp;<code>maxNumChunks<\/code>&nbsp;\u4e0a\u9650\u800c\u4ecd\u6709\u5269\u4f59\u6587\u672c\uff0c\u5269\u4f59\u6587\u672c\u957f\u5ea6\u6ee1\u8db3&nbsp;<code>minChunkLengthToEmbed<\/code>&nbsp;\u65f6\uff0c\u4f1a\u4f5c\u4e3a\u6700\u540e\u4e00\u4e2a chunk \u52a0\u5165\u7ed3\u679c\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u8981\u7279\u522b\u6ce8\u610f\u4e24\u70b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u53ea\u6709\u5f53\u524d\u5269\u4f59 token \u6570\u8d85\u8fc7&nbsp;<code>chunkSize<\/code>&nbsp;\u65f6\uff0c\u624d\u4f1a\u5c1d\u8bd5\u6309\u8fb9\u754c\u5b57\u7b26\u622a\u65ad<\/strong>\u3002\u5982\u679c\u4e00\u4efd\u6587\u6863\u672c\u6765\u5c31\u6bd4&nbsp;<code>chunkSize<\/code>&nbsp;\u5c0f\uff0c\u5b83\u4f1a\u88ab\u4f5c\u4e3a\u5355\u72ec\u4e00\u4e2a chunk \u8fd4\u56de\uff0c\u4e0d\u4f1a\u88ab\u591a\u4f59\u5730\u5207\u788e\uff0c\u907f\u514d\u5bf9\u5c0f\u6587\u6863\u9020\u6210\u4e0d\u5fc5\u8981\u7684\u788e\u7247\u5316\u3002<\/li>\n\n\n\n<li>Spring AI 1.x \u7684&nbsp;<code>TokenTextSplitter<\/code>&nbsp;\u91cc\u4e2d\u6587\u6807\u70b9&nbsp;<code>\u3002 \uff1f \uff01 \uff1b<\/code>&nbsp;\u4e0d\u5728\u5185\u7f6e\u8fb9\u754c\u5b57\u7b26\u91cc\u3002\u5982\u679c\u4e2d\u6587\u6587\u6863\u6ca1\u6709\u6362\u884c\uff0c\u5b83\u901a\u5e38\u4f1a\u66f4\u63a5\u8fd1\u6309 token \u957f\u5ea6\u786c\u5207\uff0c\u800c\u4e0d\u662f\u4e25\u683c\u6309\u4e2d\u6587\u53e5\u5b50\u5207\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5de5\u4e1a\u7ea7 RAG \u5e38\u89c1\u589e\u5f3a\u65b9\u6848<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bfe\u5802\u4e2d\u6211\u4eec\u53ea\u5c55\u793a\u4e86\u6700\u57fa\u7840\u7684 RAG\uff1a\u7528\u6237\u95ee\u9898\u8fdb\u5165\u7cfb\u7edf\u540e\uff0c\u76f4\u63a5\u5230\u5411\u91cf\u6570\u636e\u5e93\u68c0\u7d22\u76f8\u5173\u7247\u6bb5\uff0c\u7136\u540e\u628a\u7247\u6bb5\u585e\u8fdb Prompt \u4ea4\u7ed9\u5927\u6a21\u578b\u56de\u7b54\u3002\u4f46\u5728\u771f\u5b9e\u5de5\u4e1a\u7ea7\u573a\u666f\u4e2d\uff0cRAG \u5f80\u5f80\u4f1a\u505a\u5f88\u591a\u589e\u5f3a\uff0c\u5e38\u89c1\u65b9\u6848\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u67e5\u8be2\u6539\u5199\uff08Query Rewrite\uff09\uff1a\u5148\u8ba9\u6a21\u578b\u628a\u7528\u6237\u53e3\u8bed\u5316\u3001\u6a21\u7cca\u3001\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\u6539\u5199\u6210\u66f4\u9002\u5408\u68c0\u7d22\u7684\u6807\u51c6\u95ee\u9898\uff0c\u63d0\u9ad8\u53ec\u56de\u8d28\u91cf\u3002<\/li>\n\n\n\n<li>\u591a\u67e5\u8be2\u6269\u5c55\uff08Multi-Query\uff09\uff1a\u9488\u5bf9\u540c\u4e00\u4e2a\u7528\u6237\u95ee\u9898\u751f\u6210\u591a\u4e2a\u4e0d\u540c\u8868\u8fbe\u65b9\u5f0f\u7684\u95ee\u9898\uff0c\u5206\u522b\u68c0\u7d22\u540e\u5408\u5e76\u7ed3\u679c\uff0c\u51cf\u5c11\u201c\u95ee\u6cd5\u4e0d\u540c\u5bfc\u81f4\u641c\u4e0d\u5230\u201d\u7684\u95ee\u9898\u3002<\/li>\n\n\n\n<li>HyDE\uff08Hypothetical Document Embeddings\uff09\uff1a\u5148\u8ba9\u6a21\u578b\u6839\u636e\u95ee\u9898\u751f\u6210\u4e00\u6bb5\u201c\u5047\u60f3\u7b54\u6848\/\u5047\u60f3\u6587\u6863\u201d\uff0c\u518d\u7528\u8fd9\u6bb5\u6587\u672c\u53bb\u505a\u5411\u91cf\u68c0\u7d22\uff0c\u9002\u5408\u7528\u6237\u95ee\u9898\u5f88\u77ed\u4f46\u8bed\u4e49\u4e0d\u5145\u5206\u7684\u573a\u666f\u3002<\/li>\n\n\n\n<li>\u6df7\u5408\u68c0\u7d22\uff08Hybrid Search\uff09\uff1a\u540c\u65f6\u4f7f\u7528\u5411\u91cf\u68c0\u7d22\u548c\u5173\u952e\u8bcd\u68c0\u7d22\uff0c\u5411\u91cf\u68c0\u7d22\u64c5\u957f\u8bed\u4e49\u76f8\u4f3c\uff0c\u5173\u952e\u8bcd\u68c0\u7d22\u64c5\u957f\u7cbe\u786e\u5339\u914d\u4e13\u6709\u540d\u8bcd\u3001\u7f16\u53f7\u3001\u672f\u8bed\uff0c\u4e24\u8005\u4e92\u8865\u3002<\/li>\n\n\n\n<li>\u5143\u6570\u636e\u8fc7\u6ee4\uff08Metadata Filter\uff09\uff1a\u68c0\u7d22\u65f6\u6839\u636e\u6587\u6863\u6765\u6e90\u3001\u65f6\u95f4\u3001\u90e8\u95e8\u3001\u6743\u9650\u3001\u4e1a\u52a1\u7c7b\u578b\u7b49\u5143\u6570\u636e\u5148\u8fc7\u6ee4\u8303\u56f4\uff0c\u907f\u514d\u628a\u4e0d\u8be5\u770b\u7684\u6216\u4e0d\u76f8\u5173\u9886\u57df\u7684\u77e5\u8bc6\u53ec\u56de\u3002<\/li>\n\n\n\n<li>\u4e0a\u4e0b\u6587\u7a97\u53e3\u6269\u5c55\uff08Context Window Expansion\uff09\uff1a\u68c0\u7d22\u547d\u4e2d\u67d0\u4e2a\u7247\u6bb5\u540e\uff0c\u628a\u5b83\u524d\u540e\u7684\u76f8\u90bb\u7247\u6bb5\u4e5f\u4e00\u8d77\u5e26\u4e0a\uff0c\u89e3\u51b3\u5355\u4e2a\u7247\u6bb5\u4e0a\u4e0b\u6587\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\u3002<\/li>\n\n\n\n<li>ReRank\uff08\u91cd\u6392\u5e8f\/\u7cbe\u6392\uff09\uff1a\u5411\u91cf\u5e93\u76f8\u4f3c\u5ea6\u901a\u5e38\u662f\u201c\u7c97\u6392\u201d\uff0c\u5b83\u53ea\u6bd4\u8f83\u201c\u95ee\u9898\u5411\u91cf\u201d\u548c\u201c\u6587\u6863\u5411\u91cf\u201d\u5728\u5411\u91cf\u7a7a\u95f4\u91cc\u7684\u8ddd\u79bb\uff0c\u901f\u5ea6\u5feb\u4f46\u5224\u65ad\u8f83\u7c97\uff1bReRank \u4f1a\u628a\u7528\u6237\u95ee\u9898\u548c\u5019\u9009\u6587\u6863\u6210\u5bf9\u8f93\u5165\u7ed9\u4e13\u95e8\u7684\u91cd\u6392\u6a21\u578b\uff0c\u8ba9\u6a21\u578b\u66f4\u7ec6\u81f4\u5730\u5224\u65ad\u201c\u8fd9\u6bb5\u6587\u6863\u662f\u5426\u771f\u7684\u80fd\u56de\u7b54\u8fd9\u4e2a\u95ee\u9898\u201d\uff0c\u518d\u91cd\u65b0\u6392\u5e8f\uff0c\u6240\u4ee5\u53eb\u201c\u7cbe\u6392\u201d\u3002<\/li>\n\n\n\n<li>\u67e5\u8be2\u8def\u7531\uff08Query Routing\uff09\uff1a\u5148\u5224\u65ad\u7528\u6237\u95ee\u9898\u5c5e\u4e8e\u54ea\u4e2a\u77e5\u8bc6\u5e93\u3001\u54ea\u4e2a\u4e1a\u52a1\u57df\u6216\u662f\u5426\u9700\u8981\u67e5\u6570\u636e\u5e93\uff0c\u518d\u8def\u7531\u5230\u5bf9\u5e94\u7684\u68c0\u7d22\u5668\u6216\u5de5\u5177\u3002<\/li>\n\n\n\n<li>\u591a\u8def\u53ec\u56de\uff08Multi-Retriever\uff09\uff1a\u540c\u65f6\u4ece\u5411\u91cf\u5e93\u3001\u6570\u636e\u5e93\u3001\u641c\u7d22\u5f15\u64ce\u3001\u77e5\u8bc6\u56fe\u8c31\u7b49\u591a\u4e2a\u6765\u6e90\u53ec\u56de\u4fe1\u606f\uff0c\u518d\u7edf\u4e00\u878d\u5408\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">MCP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u5148\u56de\u5230\u7b2c\u4e00\u4e2a\u95ee\u9898\u3002\u5728\u524d\u9762\u5b66\u4e60 Tool Calling \u7684\u65f6\u5019\uff0c\u6211\u4eec\u5199\u8fc7\u7c7b\u4f3c\u8fd9\u6837\u7684\u5de5\u5177\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic class WeatherTools {\n    @Tool(description = \"\u6839\u636e\u57ce\u5e02\u540d\u67e5\u8be2\u5929\u6c14\")\n    public String getWeather(String city, String date) {\n        \/\/ \u8c03\u5929\u6c14\u63a5\u53e3\n        return \"\u6674\uff0c25\u5ea6\";\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u5de5\u5177\u5199\u5f97\u5f88\u597d\uff0c\u4f46\u5b83\u6709\u51e0\u4e2a\u660e\u663e\u7684\u5c40\u9650\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u8bed\u8a00\u9650\u5236<\/strong>\uff1a\u8fd9\u4e2a\u5de5\u5177\u53ea\u80fd\u5728 Java \u9879\u76ee\u91cc\u88ab\u5927\u6a21\u578b\u8c03\u7528\u3002\u5982\u679c\u53e6\u4e00\u4e2a\u56e2\u961f\u7528 Python \u5199 AI \u5e94\u7528\uff0c\u4ed6\u4eec\u6ca1\u6cd5\u76f4\u63a5\u7528\u6211\u4eec\u5199\u597d\u7684\u8fd9\u4e2a\u5de5\u5177\u3002<\/li>\n\n\n\n<li><strong>\u96be\u4ee5\u590d\u7528<\/strong>\uff1a\u6362\u4e00\u4e2a\u65b0\u7684 SpringBoot \u5de5\u7a0b\uff0c\u8fd9\u4e2a\u5de5\u5177\u7684\u4ee3\u7801\u5c31\u8981\u62f7\u8d1d\u4e00\u4efd\u8fc7\u53bb\uff1b\u5982\u679c\u5de5\u5177\u5185\u90e8\u4f9d\u8d56\u4e86\u4e00\u5806 jar \u5305\uff0c\u6574\u4e2a\u9879\u76ee\u7ed3\u6784\u4e5f\u8981\u8ddf\u7740\u642c\u3002<\/li>\n\n\n\n<li><strong>\u91cd\u590d\u9020\u8f6e\u5b50<\/strong>\uff1a\u4eca\u5929\u6211\u8981\u67e5\u5929\u6c14\uff0c\u81ea\u5df1\u5b9e\u73b0\u4e00\u904d\uff1b\u660e\u5929\u53e6\u4e00\u4e2a\u56e2\u961f\u4e5f\u8981\u67e5\u5929\u6c14\uff0c\u4ed6\u4eec\u4e5f\u8981\u4ece\u5934\u5b9e\u73b0\u4e00\u904d\u3002\u5168\u4e16\u754c\u90fd\u5728\u91cd\u590d\u5199\u540c\u6837\u7684\u5de5\u5177\u4ee3\u7801\uff0c\u6d6a\u8d39\u65f6\u95f4\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u90a3\u6709\u6ca1\u6709\u4e00\u79cd\u65b9\u5f0f\uff0c\u8ba9\u5de5\u5177\u7684\u5f00\u53d1\u548c\u4f7f\u7528\u53d8\u6210&#8221;\u6807\u51c6\u5316&#8221;\u7684\uff1f\u4efb\u4f55\u4eba\u5f00\u53d1\u7684\u5de5\u5177\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u62ff\u6765\u76f4\u63a5\u7ed9\u81ea\u5df1\u7684 AI \u7528 \u2014\u2014 \u5c31\u50cf USB \u63a5\u53e3\u4e00\u6837\uff0c\u8c01\u7684\u8bbe\u5907\u90fd\u80fd\u63d2\u4e0a\u53bb ,&nbsp;<strong>MCP<\/strong>\u534f\u8bae\u5c31\u662f\u4e3a\u6b64\u800c\u8bde\u751f\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MCP \u7684\u5168\u79f0\u662f&nbsp;<strong>Model Context Protocol\uff08\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff09<\/strong>\uff0c\u662f\u7531 Anthropic \u516c\u53f8\uff08\u4e5f\u5c31\u662f Claude \u7684\u5f00\u53d1\u516c\u53f8\uff09\u5728 2024 \u5e74\u63d0\u51fa\u7684\u4e00\u5957<strong>\u5f00\u653e\u534f\u8bae<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u7684\u6838\u5fc3\u4f5c\u7528\u662f\uff1a<strong>\u7edf\u4e00 AI \u5e94\u7528\u548c\u5916\u90e8\u5de5\u5177\/\u6570\u636e\u6e90\u7684\u4ea4\u4e92\u65b9\u5f0f<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u4e2a\u6bd4\u65b9\uff1a\u5728 MCP \u51fa\u73b0\u4e4b\u524d\uff0c\u6bcf\u5bb6\u7684 AI \u5de5\u5177\u5c31\u50cf\u6bcf\u5bb6\u7684\u7535\u6e90\u63d2\u5934\u90fd\u4e0d\u4e00\u6837 \u2014\u2014 \u6709\u5706\u5934\u7684\u3001\u6709\u6241\u5934\u7684\u3001\u6709\u4e09\u5b54\u7684\uff0c\u4e92\u76f8\u4e4b\u95f4\u6ca1\u6cd5\u901a\u7528\u3002MCP \u5c31\u76f8\u5f53\u4e8e\u89c4\u5b9a\u4e86&#8221;\u5168\u4e16\u754c\u7edf\u4e00\u7528\u4e00\u79cd\u63d2\u5934&#8221;\uff0c\u4ece\u6b64\u4ee5\u540e\u6240\u6709\u7684 AI \u5de5\u5177\u90fd\u6309\u8fd9\u4e2a\u6807\u51c6\u6765\u5f00\u53d1\uff0c\u6240\u6709\u7684 AI \u5e94\u7528\u4e5f\u90fd\u80fd\u76f4\u63a5\u7528\u8fd9\u4e9b\u5de5\u5177\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u7684\u5b58\u5728\u610f\u4e49\u5728\u4e8e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u8de8\u8bed\u8a00<\/strong>\uff1aMCP \u662f\u4e00\u4e2a\u534f\u8bae\uff08\u7c7b\u4f3c HTTP\uff09\uff0c\u4efb\u4f55\u8bed\u8a00\u90fd\u53ef\u4ee5\u5b9e\u73b0\uff0c\u4e0d\u518d\u53d7 Java\u3001Python \u7b49\u8bed\u8a00\u7684\u9650\u5236<\/li>\n\n\n\n<li><strong>\u80fd\u590d\u7528<\/strong>\uff1a\u4e00\u4e2a MCP \u5de5\u5177\u5f00\u53d1\u597d\u4e4b\u540e\uff0c\u4efb\u4f55 AI \u5e94\u7528\u90fd\u53ef\u4ee5\u63a5\u5165\u4f7f\u7528<\/li>\n\n\n\n<li><strong>\u751f\u6001\u4e30\u5bcc<\/strong>\uff1a\u56e0\u4e3a\u662f\u5f00\u653e\u534f\u8bae\uff0c\u5168\u4e16\u754c\u7684\u5f00\u53d1\u8005\u90fd\u5728\u8d21\u732e MCP \u5de5\u5177\uff0c\u6211\u4eec\u7528\u522b\u4eba\u5199\u597d\u7684\u5c31\u884c<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">MCP \u7684 C\/S \u67b6\u6784<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MCP \u534f\u8bae\u91c7\u7528\u7684\u662f&nbsp;<strong>C\/S \u67b6\u6784\uff08\u5ba2\u6237\u7aef\/\u670d\u52a1\u7aef\u67b6\u6784\uff09<\/strong>\u3002\u8fd9\u91cc\u6709\u4e24\u4e2a\u6838\u5fc3\u89d2\u8272\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MCP Server\uff08\u670d\u52a1\u7aef\uff09<\/strong>\uff1a\u8d1f\u8d23\u628a\u5de5\u5177&#8221;\u5bf9\u5916\u66b4\u9732&#8221;\u51fa\u6765\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u8c01\u5b9e\u73b0\u4e86\u4e00\u4e2a\u5de5\u5177\uff08\u6bd4\u5982\u67e5\u5929\u6c14\uff09\uff0c\u5c31\u628a\u8fd9\u4e2a\u5de5\u5177\u5305\u5728\u4e00\u4e2a MCP Server \u91cc\u9762\uff0c\u7136\u540e\u542f\u52a8\u8fd9\u4e2a Server\u3002<\/li>\n\n\n\n<li><strong>MCP Client\uff08\u5ba2\u6237\u7aef\uff09<\/strong>\uff1a\u8d1f\u8d23&#8221;\u8c03\u7528&#8221;\u5de5\u5177\u3002\u6211\u4eec\u7684 AI \u5e94\u7528\uff08\u6bd4\u5982\u57fa\u4e8e Spring AI \u5199\u7684\u5e94\u7528\uff09\u5c31\u5145\u5f53 MCP Client\uff0c\u53bb\u8fde\u63a5 MCP Server\uff0c\u53d1\u73b0 Server \u4e0a\u6709\u54ea\u4e9b\u5de5\u5177\u53ef\u7528\uff0c\u7136\u540e\u8ba9\u5927\u6a21\u578b\u6309\u9700\u8c03\u7528\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph LR\n    A[AI\u5e94\u7528&lt;br\/&gt;MCP Client] --&gt;|\u8c03\u7528\u5de5\u5177| B[MCP Server&lt;br\/&gt;\u66b4\u9732\u5de5\u5177]\n    B --&gt;|\u8fd4\u56de\u7ed3\u679c| A\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u90a3 MCP Client \u548c MCP Server \u4e4b\u95f4\u5230\u5e95\u901a\u8fc7\u4ec0\u4e48\u65b9\u5f0f\u901a\u4fe1\u5462\uff1f\u8fd9\u5c31\u6d89\u53ca\u5230 MCP \u7684\u4e24\u79cd\u901a\u4fe1\u65b9\u5f0f\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:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-1024x1000.webp'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1000\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-1024x1000.webp\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-705\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u901a\u4fe1\u65b9\u5f0f\u4e00\uff1aStdio\uff08\u6807\u51c6\u8f93\u5165\u8f93\u51fa\uff09<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Stdio \u901a\u4fe1\u65b9\u5f0f\u662f\u57fa\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u7684\u6807\u51c6\u8f93\u5165\u548c\u6807\u51c6\u8f93\u51fa\u6765\u4f20\u9012\u6d88\u606f\u7684\u3002\u5b83\u7684\u5de5\u4f5c\u8fc7\u7a0b\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MCP Client \u5728\u672c\u5730\u628a MCP Server \u4f5c\u4e3a<strong>\u5b50\u8fdb\u7a0b<\/strong>\u542f\u52a8\u8d77\u6765<\/li>\n\n\n\n<li>MCP Client \u901a\u8fc7\u5f80\u8fd9\u4e2a\u5b50\u8fdb\u7a0b\u7684\u6807\u51c6\u8f93\u5165\uff08stdin\uff09\u5199\u6570\u636e\u6765\u53d1\u9001\u8bf7\u6c42<\/li>\n\n\n\n<li>MCP Server \u901a\u8fc7\u5f80\u81ea\u5df1\u7684\u6807\u51c6\u8f93\u51fa\uff08stdout\uff09\u5199\u6570\u636e\u6765\u8fd4\u56de\u54cd\u5e94<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u8bf4\uff0c\u5c31\u662f Client \u548c Server \u4e4b\u95f4\u901a\u8fc7&#8221;\u7ba1\u9053&#8221;\u901a\u4fe1\uff0c<strong>\u4e24\u8005\u5fc5\u987b\u8fd0\u884c\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a<\/strong>\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>\u6613\u6df7\u6dc6\u70b9\uff1a\u6807\u51c6\u8f93\u5165\u4e0d\u5c31\u662f\u952e\u76d8\u3001\u6807\u51c6\u8f93\u51fa\u4e0d\u5c31\u662f\u63a7\u5236\u53f0\u5417\uff1f<\/strong><\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u952e\u76d8\u548c\u5c4f\u5e55\u53ea\u662f stdin\/stdout \u7684<strong>\u9ed8\u8ba4\u8fde\u63a5\u5bf9\u8c61<\/strong>\uff0c\u4e0d\u662f\u5b83\u4eec\u7684\u672c\u8d28\u3002stdin \u672c\u8d28\u4e0a\u662f&#8221;\u8fdb\u7a0b\u8bfb\u6570\u636e\u7684\u5165\u53e3&#8221;\uff0cstdout \u662f&#8221;\u8fdb\u7a0b\u5199\u6570\u636e\u7684\u51fa\u53e3&#8221;\uff0c\u81f3\u4e8e\u8fd9\u4e24\u5934\u63a5\u7684\u662f\u4ec0\u4e48\uff0c\u662f\u53ef\u4ee5\u88ab\u66ff\u6362\u7684\u3002\u6bd4\u5982\u547d\u4ee4\u884c\u91cc\u7684\u7ba1\u9053&nbsp;<code>cat data.txt | sort<\/code>\uff0c\u524d\u4e00\u4e2a\u7a0b\u5e8f\u7684\u6807\u51c6\u8f93\u51fa\u76f4\u63a5\u6210\u4e86\u540e\u4e00\u4e2a\u7a0b\u5e8f\u7684\u6807\u51c6\u8f93\u5165\uff0c\u5168\u7a0b\u6ca1\u6709\u952e\u76d8\u548c\u5c4f\u5e55\u53c2\u4e0e\u3002<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">MCP \u7684 Stdio \u6a21\u5f0f\u6b63\u662f\u5229\u7528\u4e86\u8fd9\u4e00\u70b9\uff1aClient \u628a Server \u4f5c\u4e3a\u5b50\u8fdb\u7a0b\u542f\u52a8\u65f6\uff0c\u64cd\u4f5c\u7cfb\u7edf\u628a Server \u7684 stdin\/stdout \u63a5\u5230\u4e86<strong>\u4e0e Client \u4e4b\u95f4\u7684\u7ba1\u9053<\/strong>\u4e0a\uff0c\u800c\u4e0d\u662f\u63a5\u5230\u952e\u76d8\u548c\u5c4f\u5e55\u3002\u4e8e\u662f Client \u628a\u8bf7\u6c42\u5199\u8fdb Server \u7684 stdin\uff0cServer \u628a\u54cd\u5e94\u5199\u5230\u81ea\u5df1\u7684 stdout \u6d41\u56de Client \u2014\u2014 \u8fd9\u662f\u4e00\u6761<strong>\u8fdb\u7a0b\u95f4\u901a\u4fe1\u7684\u4e13\u7528\u6570\u636e\u901a\u9053<\/strong>\uff0c\u5e76\u975e\u7ed9\u4eba\u770b\u7684\u63a7\u5236\u53f0\u3002\u4e5f\u6b63\u56e0\u4e3a stdout \u88ab\u534f\u8bae\u6570\u636e\u5360\u7528\u4e86\uff0c\u8fd9\u7c7b Server \u7684\u65e5\u5fd7\u901a\u5e38\u6539\u6253\u5230 stderr\uff0c\u4ee5\u514d\u6c61\u67d3\u6570\u636e\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd8\u6709\u4e00\u4e2a\u5c0f\u95ee\u9898\uff1a<strong>\u4e3a\u4ec0\u4e48\u662f Client \u542f\u52a8 Server\uff0c\u800c\u4e0d\u662f Server \u81ea\u5df1\u72ec\u7acb\u8fd0\u884c\uff1f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u56e0\u662f\uff1a<strong>Stdio \u672c\u8d28\u4e0a\u662f\u57fa\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u7684\u7ba1\u9053\u901a\u4fe1<\/strong>\uff0c\u800c\u7ba1\u9053\u901a\u4fe1\u6709\u4e00\u4e2a\u786c\u6027\u7ea6\u675f \u2014\u2014&nbsp;<strong>\u5fc5\u987b\u662f\u7236\u5b50\u8fdb\u7a0b\u5173\u7cfb\u624d\u80fd\u5efa\u7acb<\/strong>\u3002\u6240\u4ee5\u5728 Stdio \u6a21\u5f0f\u4e0b\uff0c\u5fc5\u7136\u662f\u5176\u4e2d\u4e00\u65b9\u628a\u53e6\u4e00\u65b9\u62c9\u8d77\u6765\u3002MCP \u534f\u8bae\u89c4\u5b9a\uff1a<strong>\u7531 Client \u628a Server \u4f5c\u4e3a\u5b50\u8fdb\u7a0b\u542f\u52a8<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9002\u7528\u573a\u666f\uff1a<strong>\u672c\u5730\u5de5\u5177\u7684\u8c03\u7528<\/strong>\u3002\u6bd4\u5982\u8bfb\u5199\u672c\u5730\u6587\u4ef6\u3001\u64cd\u4f5c\u672c\u5730\u6570\u636e\u5e93\u3001\u8c03\u7528\u672c\u5730 CLI \u5de5\u5177\u7b49\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u901a\u4fe1\u65b9\u5f0f\u4e8c\uff1aSSE \/ Streamable HTTP\uff08\u57fa\u4e8e HTTP \u7684\u7f51\u7edc\u901a\u4fe1\uff09<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u79cd\u65b9\u5f0f\u662f\u57fa\u4e8e HTTP \u534f\u8bae\u8fdb\u884c\u901a\u4fe1\u7684\uff0cClient \u548c Server \u53ef\u4ee5\u5206\u522b\u90e8\u7f72\u5728\u4e0d\u540c\u7684\u673a\u5668\u4e0a\uff0c\u901a\u8fc7\u7f51\u7edc\u8bbf\u95ee\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u79cd\u6a21\u5f0f\u4e0b\uff0c<strong>MCP Server \u662f\u72ec\u7acb\u90e8\u7f72\u3001\u72ec\u7acb\u542f\u52a8\u7684\u4e00\u4e2a HTTP \u670d\u52a1<\/strong>\uff08\u6bd4\u5982\u5c31\u662f\u4e00\u4e2a\u666e\u901a\u7684 Spring Boot \u5e94\u7528\uff09\uff0c\u5b83\u4e00\u76f4\u5728\u67d0\u4e2a\u7aef\u53e3\u4e0a\u76d1\u542c\u8bf7\u6c42\u3002MCP Client \u4e0d\u9700\u8981\u53bb\u542f\u52a8 Server\uff0c\u53ea\u9700\u8981\u77e5\u9053 Server \u7684 URL \u5730\u5740\uff0c\u901a\u8fc7 HTTP \u534f\u8bae\u53d1\u9001\u8bf7\u6c42\u5373\u53ef\u3002\u8fd9\u5c31\u548c\u6211\u4eec\u5e73\u65f6\u8c03\u7528\u4e00\u4e2a\u666e\u901a\u7684 Web \u670d\u52a1\u975e\u5e38\u7c7b\u4f3c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9002\u7528\u573a\u666f\uff1a<strong>\u8fdc\u7a0b\u5de5\u5177\u7684\u8c03\u7528<\/strong>\u3002\u6bd4\u5982\u8fdc\u7aef\u670d\u52a1\u5668\u4e0a\u90e8\u7f72\u4e86\u4e00\u4e2a MCP Server\uff0c\u5168\u4e16\u754c\u7684 AI \u5e94\u7528\u90fd\u53ef\u4ee5\u8fde\u8fc7\u6765\u7528\u5b83\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4e24\u79cd\u901a\u4fe1\u65b9\u5f0f\u7684\u5bf9\u6bd4\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u901a\u4fe1\u65b9\u5f0f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u90e8\u7f72\u5f62\u5f0f<\/th><th class=\"has-text-align-left\" data-align=\"left\">Server \u7531\u8c01\u542f\u52a8<\/th><th class=\"has-text-align-left\" data-align=\"left\">Server \u751f\u547d\u5468\u671f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u9002\u7528\u573a\u666f<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Stdio<\/td><td class=\"has-text-align-left\" data-align=\"left\">Client \u548c Server \u5728\u540c\u4e00\u53f0\u673a\u5668<\/td><td class=\"has-text-align-left\" data-align=\"left\">Client \u628a Server \u4f5c\u4e3a\u5b50\u8fdb\u7a0b\u62c9\u8d77<\/td><td class=\"has-text-align-left\" data-align=\"left\">Client \u9000\u51fa\uff0cServer \u4e5f\u9000\u51fa<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u672c\u5730\u5de5\u5177\uff1a\u8bfb\u5199\u6587\u4ef6\u3001\u64cd\u4f5c\u672c\u5730\u6570\u636e\u5e93\u7b49<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">SSE \/ HTTP<\/td><td class=\"has-text-align-left\" data-align=\"left\">Client \u548c Server \u901a\u8fc7\u7f51\u7edc\u901a\u4fe1<\/td><td class=\"has-text-align-left\" data-align=\"left\">Server \u72ec\u7acb\u90e8\u7f72\u3001\u72ec\u7acb\u542f\u52a8<\/td><td class=\"has-text-align-left\" data-align=\"left\">Server \u957f\u671f\u8fd0\u884c\uff0c\u4e0e Client \u65e0\u5173<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u8fdc\u7a0b\u5de5\u5177\uff1a\u8fdc\u7aef\u670d\u52a1\u3001\u8de8\u7f51\u7edc\u7684\u5de5\u5177\u8c03\u7528<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u53d1\u73b0MCP \u670d\u52a1<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u521a\u624d\u8bf4\u4e86\uff0cMCP \u4e00\u5927\u597d\u5904\u5c31\u662f&#8221;\u522b\u4eba\u5199\u7684\u5de5\u5177\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u7528&#8221;\u3002\u90a3\u8fd9\u4e9b&#8221;\u522b\u4eba\u5199\u597d\u7684 MCP Server&#8221;\u53bb\u54ea\u91cc\u627e\u5462\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3b\u8981\u6709\u4e24\u4e2a\u6e20\u9053\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6e20\u9053\u4e00\uff1aMCP \u670d\u52a1\u5e02\u573a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u670d\u52a1\u5e02\u573a\u5c31\u50cf\u4e00\u4e2a&#8221;\u5e94\u7528\u5546\u5e97&#8221;\uff0c\u91cc\u9762\u6536\u5f55\u4e86\u5927\u91cf\u5f00\u53d1\u8005\u8d21\u732e\u7684 MCP Server\u3002\u6bd4\u8f83\u6709\u540d\u7684\u6709\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MCP.so<\/strong>\uff1a\u793e\u533a\u7ef4\u62a4\u7684 MCP \u670d\u52a1\u5e02\u573a\uff0c\u6536\u5f55\u4e86\u5927\u91cf MCP Server<\/li>\n\n\n\n<li><strong>Smithery<\/strong>\uff1a\u53e6\u4e00\u4e2a\u975e\u5e38\u6d41\u884c\u7684 MCP \u670d\u52a1\u5e02\u573a<\/li>\n\n\n\n<li><strong>modelscope MCP \u5e7f\u573a<\/strong>\uff1a\u963f\u91cc\u9b54\u642d\u793e\u533a\u7ef4\u62a4\u7684 MCP \u670d\u52a1\u5e02\u573a\uff0c\u56fd\u5185\u8bbf\u95ee\u8f83\u5feb<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u9700\u8981\u7279\u522b\u8bf4\u660e\u7684\u662f\uff1a<strong>\u7edd\u5927\u591a\u6570 MCP \u670d\u52a1\u5e02\u573a\uff0c\u63d0\u4f9b\u7684\u90fd\u662f&#8221;\u672c\u5730\u4e0b\u8f7d MCP \u670d\u52a1\u7aef\u4ee3\u7801\u5e76\u8fd0\u884c&#8221;\u7684\u65b9\u5f0f<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e5f\u5c31\u662f\u8bf4\uff0c\u4f60\u5728\u5e02\u573a\u4e0a\u627e\u5230\u4e00\u4e2a\u5fc3\u4eea\u7684 MCP Server\uff0c\u5e02\u573a\u4e0a\u7ed9\u4f60\u7684\u4e0d\u662f\u4e00\u4e2a\u73b0\u6210\u7684\u8fdc\u7a0b\u5730\u5740\uff0c\u800c\u662f\u4e00\u884c\u5b89\u88c5\u547d\u4ee4\uff08\u6bd4\u5982 npm install\uff09\uff0c\u4f60\u9700\u8981\u628a\u8fd9\u4e2a Server \u4e0b\u8f7d\u5230\u81ea\u5df1\u7684\u672c\u5730\u673a\u5668\u4e0a\u3002\u7136\u540e\u4f60\u7684 AI \u5e94\u7528\u5c31\u7528 Stdio \u65b9\u5f0f\u8fde\u63a5\u5b83\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6e20\u9053\u4e8c\uff1a\u4e91\u670d\u52a1\u5e73\u53f0\u63d0\u4f9b\u7684\u4e91\u7aef MCP<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MCP \u7684\u5b9e\u73b0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI \u672c\u8eab\u5c31\u652f\u6301MCP\u534f\u8bae\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u57fa\u4e8eSpring AI\u7528\u4e24\u4e2a\u6848\u4f8b\u5206\u522b\u6f14\u793a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6848\u4f8b\u4e00<\/strong>\uff1a\u4f5c\u4e3a MCP Client\uff0c\u8c03\u7528<strong>\u522b\u4eba<\/strong>\u5b9e\u73b0\u7684 MCP Server \u2014\u2014 \u9ad8\u5fb7\u5730\u56fe MCP Server<\/li>\n\n\n\n<li><strong>\u6848\u4f8b\u4e8c<\/strong>\uff1a\u4f5c\u4e3a MCP Server\uff0c<strong>\u81ea\u5df1<\/strong>\u5b9e\u73b0\u4e00\u4e2a\u67e5\u5929\u6c14\u7684 MCP Server\uff0c\u5e76\u8ba9\u53e6\u4e00\u4e2a\u9879\u76ee\u53bb\u8c03\u7528\u5b83<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u6848\u4f8b\u4e00\uff1a\u8c03\u7528\u522b\u4eba\u7684 MCP Server<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u8fd9\u4e2a\u6848\u4f8b\u8981\u5b9e\u73b0\u7684\u529f\u80fd\u662f\uff1a<strong>\u6839\u636e\u4e00\u4e2a\u516c\u7f51 IP\uff0c\u8ba9\u5927\u6a21\u578b\u544a\u8bc9\u6211\u4eec\u8fd9\u4e2a IP \u5bf9\u5e94\u54ea\u4e2a\u57ce\u5e02<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5927\u6a21\u578b\u81ea\u5df1\u80af\u5b9a\u4e0d\u77e5\u9053\u67d0\u4e2a IP \u5bf9\u5e94\u54ea\u513f\uff0c\u4f46\u662f\u9ad8\u5fb7\u5730\u56fe\u5b98\u65b9\u63d0\u4f9b\u4e86\u4e00\u4e2a MCP Server\uff0c\u91cc\u9762\u5c31\u6709&#8221;IP \u5b9a\u4f4d&#8221;\u7684\u5de5\u5177\uff0c\u6211\u4eec\u76f4\u63a5\u7528\u5b83\u5c31\u884c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e00\u6b65\uff1a\u672c\u5730\u5b89\u88c5\u5e76\u8fd0\u884c\u9ad8\u5fb7\u5730\u56fe MCP Server<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u56e0\u4e3a\u6211\u4eec\u524d\u9762\u8bf4\u8fc7\uff0c\u7edd\u5927\u591a\u6570 MCP Server \u90fd\u662f\u672c\u5730\u8fd0\u884c\u7684\uff0c\u53d7\u9650\u4e8e\u4e0a\u8bfe\u73af\u5883\uff08\u6ca1\u6709\u53ef\u7528\u7684\u8fdc\u7aef MCP\uff09\uff0c\u6211\u4eec\u4e5f\u4f7f\u7528\u672c\u5730\u8fd0\u884c\u7684\u65b9\u5f0f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u5f00\u547d\u4ee4\u884c\uff0c\u6267\u884c\u4e0b\u9762\u8fd9\u6761\u547d\u4ee4\u5b89\u88c5\u9ad8\u5fb7\u5730\u56fe\u5b98\u65b9 MCP Server\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nnpm install -g @amap\/amap-maps-mcp-server --registry=https:\/\/registry.npmmirror.com\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u6761\u547d\u4ee4\u7684\u542b\u4e49\u662f\uff1a\u901a\u8fc7 npm \u5168\u5c40\u5b89\u88c5\u9ad8\u5fb7\u5730\u56fe\u5b98\u65b9\u63d0\u4f9b\u7684 MCP Server \u5305\u3002<code>--registry<\/code>&nbsp;\u53c2\u6570\u6307\u5b9a\u4ece\u56fd\u5185\u7684 npm \u955c\u50cf\u6e90\u4e0b\u8f7d\uff0c\u901f\u5ea6\u66f4\u5feb\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b89\u88c5\u6210\u529f\u4e4b\u540e\uff0c\u8fd9\u4e2a MCP Server \u5c31\u5728\u6211\u4eec\u672c\u673a\u4e0a\u51c6\u5907\u597d\u4e86\uff08\u6ce8\u610f\u6b64\u65f6\u8fd8\u6ca1\u542f\u52a8\uff0c\u7b49\u4e0b\u6211\u4eec\u7684 AI \u5e94\u7528\u542f\u52a8\u65f6\u4f1a\u901a\u8fc7 Stdio \u65b9\u5f0f\u81ea\u52a8\u628a\u5b83\u62c9\u8d77\u6765\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e8c\u6b65\uff1a\u5728 Spring Boot \u9879\u76ee\u4e2d\u5f15\u5165 MCP Client \u4f9d\u8d56<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-ai-starter-mcp-client&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u4f9d\u8d56\u5c31\u662f Spring AI \u63d0\u4f9b\u7684 MCP Client Starter\uff0c\u5f15\u5165\u540e\u6211\u4eec\u5c31\u5177\u5907\u4e86\u8fde\u63a5 MCP Server \u7684\u80fd\u529b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e09\u6b65\uff1a\u6dfb\u52a0 MCP Client \u7684 yml \u914d\u7f6e<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  ai:\n    mcp:\n      client:\n        stdio:\n          servers-configuration: classpath:mcp-servers\/servers.json  # MCP Server \u914d\u7f6e\u6587\u4ef6\u8def\u5f84\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bcf\u4e2a\u914d\u7f6e\u9879\u7684\u542b\u4e49\u90fd\u5df2\u7ecf\u5728\u6ce8\u91ca\u4e2d\u8bf4\u660e\u3002\u8fd9\u91cc\u6700\u5173\u952e\u7684\u662f\u6700\u540e\u4e00\u4e2a&nbsp;<code>servers-configuration<\/code>\uff0c\u5b83\u6307\u5411\u4e00\u4e2a\u6587\u4ef6&nbsp;<code>servers.json<\/code>\uff0c\u8fd9\u4e2a\u6587\u4ef6\u91cc\u5230\u5e95\u662f\u4ec0\u4e48\u5462\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u56db\u6b65\uff1a\u7f16\u5199 servers.json \u914d\u7f6e\u6587\u4ef6<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>servers.json<\/code>&nbsp;\u8fd9\u4e2a\u6587\u4ef6\u7684\u4f5c\u7528\uff0c\u5c31\u662f\u544a\u8bc9 MCP Client\uff1a<strong>\u6211\u8981\u8fde\u63a5\u54ea\u4e9b MCP Server\uff0c\u6bcf\u4e2a Server \u600e\u4e48\u542f\u52a8<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u6587\u4ef6\u53ef\u4ee5\u4ece\u4e24\u4e2a\u5730\u65b9\u83b7\u53d6\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4ece MCP \u670d\u52a1\u5e02\u573a<\/strong>\uff1a\u5728 MCP.so\u3001modelscope \u7b49\u5e02\u573a\u4e0a\uff0c\u6bcf\u4e2a MCP Server \u7684\u8be6\u60c5\u9875\u4f1a\u76f4\u63a5\u7ed9\u51fa\u53ef\u4ee5\u62f7\u8d1d\u7684 servers.json \u914d\u7f6e\u7247\u6bb5<\/li>\n\n\n\n<li><strong>\u4ece MCP Server \u5b98\u65b9\u6587\u6863<\/strong>\uff1a\u6bd4\u5982\u9ad8\u5fb7\u5730\u56fe\u7684 MCP Server \u6587\u6863\u91cc\u4e5f\u63d0\u4f9b\u4e86\u5bf9\u5e94\u7684\u914d\u7f6e<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u6211\u4eec\u6848\u4f8b\u91cc\u7684\u9ad8\u5fb7\u5730\u56fe MCP Server\uff0c\u5728&nbsp;<code>src\/main\/resources\/mcp-servers\/<\/code>&nbsp;\u76ee\u5f55\u4e0b\u521b\u5efa&nbsp;<code>servers.json<\/code>\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n{\n  \"mcpServers\": {\n    \"amap-maps\": {\n      \"command\": \"npx.cmd\",\n      \"args\": [\n        \"-y\",\n        \"@amap\/amap-maps-mcp-server\"\n      ],\n      \"env\": {\n        \"AMAP_MAPS_API_KEY\": \"\u4f60\u81ea\u5df1\u7684\u9ad8\u5fb7\u5730\u56feAPI Key\"\n      }\n    }\n  }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u89e3\u91ca\u4e00\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>mcpServers<\/code>&nbsp;\u4e0b\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a MCP Server\uff0c\u6bcf\u4e2a Server \u6709\u4e00\u4e2a\u540d\u5b57\uff08\u6bd4\u5982\u8fd9\u91cc\u7684&nbsp;<code>amap-maps<\/code>\uff09<\/li>\n\n\n\n<li><code>command<\/code>&nbsp;+&nbsp;<code>args<\/code>\uff1a\u901a\u8fc7\u4ec0\u4e48\u547d\u4ee4\u542f\u52a8\u8fd9\u4e2a MCP Server\u3002\u8fd9\u91cc\u5c31\u662f\u7528&nbsp;<code>npx<\/code>&nbsp;\u8dd1\u521a\u624d\u6211\u4eec npm \u5b89\u88c5\u597d\u7684\u5305<\/li>\n\n\n\n<li><code>env<\/code>\uff1a\u73af\u5883\u53d8\u91cf\u3002\u9ad8\u5fb7\u5730\u56fe\u7684 MCP Server \u9700\u8981\u4e00\u4e2a API Key \u624d\u80fd\u8c03\u7528\u9ad8\u5fb7\u7684\u63a5\u53e3\uff0c\u6211\u4eec\u8981\u628a\u81ea\u5df1\u7684 Key \u586b\u5728\u8fd9\u91cc\uff08\u53bb\u9ad8\u5fb7\u5f00\u653e\u5e73\u53f0 https:\/\/lbs.amap.com \u514d\u8d39\u7533\u8bf7\u5373\u53ef\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5230\u8fd9\u4e00\u6b65\uff0c\u914d\u7f6e\u5c31\u5b8c\u6210\u4e86\u3002Spring AI \u542f\u52a8\u65f6\u4f1a\u81ea\u52a8\u8bfb yml \u2192 \u8bfb servers.json \u2192 \u901a\u8fc7 Stdio \u65b9\u5f0f\u542f\u52a8\u9ad8\u5fb7 MCP Server \u2192 \u5efa\u7acb\u8fde\u63a5 \u2192 \u83b7\u53d6 Server \u4e0a\u7684\u6240\u6709\u5de5\u5177\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e94\u6b65\uff1a\u7f16\u5199\u914d\u7f6e\u7c7b\uff0c\u628a MCP \u7684\u5de5\u5177\u6ce8\u518c\u5230 ChatClient<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@Configuration\npublic class McpClientConfig {\n\n    \/**\n     * \u6784\u5efa ChatClient\uff0c\u5e76\u6ce8\u5165 MCP Client \u63d0\u4f9b\u7684\u6240\u6709\u5de5\u5177\n     *\n     * @param builder ChatClient \u7684\u6784\u5efa\u5668\n     * @param toolCallbackProvider Spring AI \u81ea\u52a8\u6ce8\u5165\u7684\u5de5\u5177\u56de\u8c03\u63d0\u4f9b\u8005\uff0c\n     *                             \u5b83\u4f1a\u628a MCP Server \u4e0a\u7684\u6240\u6709\u5de5\u5177\u81ea\u52a8\u8f6c\u6362\u4e3a ToolCallback\n     *\/\n    @Bean\n    public ChatClient chatClient(ChatClient.Builder builder,\n                                 ToolCallbackProvider toolCallbackProvider) {\n        return builder\n                \/\/ \u628a MCP Server \u4e0a\u7684\u5de5\u5177\uff0c\u5168\u90e8\u6ce8\u5165\u7ed9 ChatClient\n                .defaultToolCallbacks(toolCallbackProvider)\n                .build();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u6709\u4e00\u4e2a\u5173\u952e\u70b9\uff1a<code>ToolCallbackProvider<\/code>&nbsp;\u662f Spring AI \u81ea\u52a8\u5e2e\u6211\u4eec\u6ce8\u5165\u7684 Bean\uff0c\u5b83\u5185\u90e8\u5305\u542b\u4e86\u4ece\u6240\u6709 MCP Server \u4e0a\u53d1\u73b0\u5230\u7684\u5de5\u5177\u5217\u8868\u3002\u6211\u4eec\u628a\u5b83\u6ce8\u5165\u5230 ChatClient \u4e4b\u540e\uff0c<strong>\u5927\u6a21\u578b\u5c31\u53ef\u4ee5\u81ea\u52a8\u9009\u62e9\u5e76\u8c03\u7528\u8fd9\u4e9b MCP \u5de5\u5177<\/strong>\u4e86\uff0c\u6548\u679c\u5c31\u8ddf\u6211\u4eec\u524d\u9762\u5b66\u8fc7\u7684&nbsp;<code>@Tool<\/code>&nbsp;\u6ce8\u89e3\u5b9a\u4e49\u7684\u672c\u5730\u5de5\u5177\u4e00\u6a21\u4e00\u6837\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u516d\u6b65\uff1a\u7f16\u5199 Controller \u6d4b\u8bd5<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@RestController\npublic class McpController {\n\n    private final ChatClient chatClient;\n\n    public McpDemoController(ChatClient chatClient) {\n        this.chatClient = chatClient;\n    }\n\n    @GetMapping(\"\/ip2city\")\n    public String ip2city(String ip) {\n        \/\/ \u7528\u6237\u6d88\u606f\uff0c\u8ba9\u5927\u6a21\u578b\u67e5\u8fd9\u4e2a IP \u6240\u5728\u7684\u57ce\u5e02\n        \/\/ \u5927\u6a21\u578b\u4f1a\u81ea\u52a8\u5224\u65ad\u9700\u8981\u8c03\u7528\u9ad8\u5fb7 MCP \u7684 IP \u5b9a\u4f4d\u5de5\u5177\n        return chatClient.prompt()\n                .user(\"\u8bf7\u5e2e\u6211\u67e5\u4e00\u4e0b IP \u5730\u5740 \" + ip + \" \u5bf9\u5e94\u7684\u57ce\u5e02\u662f\u54ea\u4e2a\")\n                .call()\n                .content();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u542f\u52a8\u9879\u76ee\uff0c\u8bbf\u95ee&nbsp;<code>http:\/\/localhost:8080\/ip2city?ip=114.247.50.2<\/code>\uff0c\u5c31\u80fd\u770b\u5230\u5927\u6a21\u578b\u8fd4\u56de\u7684\u57ce\u5e02\u4fe1\u606f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5230\u8fd9\u91cc\u4f60\u53ef\u80fd\u4f1a\u6709\u7591\u95ee\uff1a\u6211\u5c31\u5199\u4e86\u51e0\u884c\u914d\u7f6e\u548c\u4ee3\u7801\uff0c\u4e3a\u4ec0\u4e48\u5927\u6a21\u578b\u5c31\u80fd\u8c03\u7528\u9ad8\u5fb7\u7684\u5de5\u5177\u4e86\uff1f\u6574\u4e2a\u8fc7\u7a0b\u4e2d\u6570\u636e\u662f\u600e\u4e48\u6d41\u8f6c\u7684\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u7528\u4e00\u4e2a\u65f6\u5e8f\u56fe\u6765\u68b3\u7406\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nsequenceDiagram\n    participant User as \ud83d\udc64 \u7528\u6237\n    participant App as \ud83e\udd16 AI\u5e94\u7528&lt;br\/&gt;(MCP Client)\n    participant LLM as \ud83d\udca1 \u5927\u6a21\u578b\n    participant Server as \ud83d\udd27 \u9ad8\u5fb7MCP Server\n\n    Note over App,Server: \u542f\u52a8\u9636\u6bb5\n    App-&gt;&gt;Server: 1. \u901a\u8fc7Stdio\u542f\u52a8MCP Server\u8fdb\u7a0b\n    App-&gt;&gt;Server: 2. \u8be2\u95ee\u53ef\u7528\u7684\u5de5\u5177\u5217\u8868\n    Server-&gt;&gt;App: 3. \u8fd4\u56de\u5de5\u5177\u5217\u8868\uff08\u542bIP\u5b9a\u4f4d\u5de5\u5177\u7b49\uff09\n\n    Note over User,Server: \u8c03\u7528\u9636\u6bb5\n    User-&gt;&gt;App: 4. \u63d0\u95ee\uff1aIP 114.247.50.2 \u662f\u54ea\u91cc\uff1f\n    App-&gt;&gt;LLM: 5. \u53d1\u9001\u7528\u6237\u6d88\u606f + \u5de5\u5177\u5217\u8868\uff08MCP \u63d0\u4f9b\uff09\n    LLM-&gt;&gt;App: 6. \u8fd4\u56de\uff1a\u9700\u8981\u8c03\u7528 IP \u5b9a\u4f4d\u5de5\u5177\n    App-&gt;&gt;Server: 7. \u901a\u8fc7 Stdio \u8c03\u7528 IP \u5b9a\u4f4d\u5de5\u5177\n    Server-&gt;&gt;App: 8. \u8fd4\u56de IP \u5bf9\u5e94\u7684\u57ce\u5e02\u4fe1\u606f\n    App-&gt;&gt;LLM: 9. \u628a\u5de5\u5177\u7ed3\u679c\u518d\u6b21\u53d1\u7ed9\u5927\u6a21\u578b\n    LLM-&gt;&gt;App: 10. \u6574\u5408\u540e\u8fd4\u56de\u6700\u7ec8\u7b54\u590d\n    App-&gt;&gt;User: 11. \u8fd4\u56de\u7b54\u590d\u7ed9\u7528\u6237\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6574\u4e2a\u6d41\u7a0b\u7684\u5173\u952e\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u542f\u52a8\u9636\u6bb5<\/strong>\uff1aMCP Client \u901a\u8fc7 Stdio \u628a MCP Server \u62c9\u8d77\u6765\uff0c\u5e76\u67e5\u8be2\u6709\u54ea\u4e9b\u5de5\u5177<\/li>\n\n\n\n<li><strong>\u8c03\u7528\u9636\u6bb5<\/strong>\uff1aMCP \u5de5\u5177\u548c\u6211\u4eec\u524d\u9762\u5b66\u7684&nbsp;<code>@Tool<\/code>&nbsp;\u5b9a\u4e49\u7684\u5de5\u5177\u7528\u6cd5\u5b8c\u5168\u4e00\u6837 \u2014\u2014 \u5927\u6a21\u578b\u51b3\u5b9a\u8981\u4e0d\u8981\u7528\uff0c\u51b3\u5b9a\u4e86\u5c31\u8ba9 MCP Client \u53bb\u8c03<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u6848\u4f8b\u4e8c\uff1a\u5b9e\u73b0\u81ea\u5df1\u7684 MCP Server<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b66\u5b8c\u4e86&#8221;\u8c03\u7528\u522b\u4eba\u7684 MCP Server&#8221;\uff0c\u6211\u4eec\u518d\u6765\u5b66&#8221;\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a MCP Server&#8221;\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u8981\u5b9e\u73b0\u7684 MCP Server \u529f\u80fd\u5f88\u7b80\u5355\uff1a<strong>\u6839\u636e\u65f6\u533a\u540d\u67e5\u8be2\u5f53\u524d\u65f6\u95f4<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f&nbsp;<strong>\u6ce8\u610f\uff1aMCP Server \u8981\u653e\u5728\u4e00\u4e2a\u65b0\u7684 SpringBoot \u5de5\u7a0b\u91cc<\/strong>\uff08\u548c\u6848\u4f8b\u4e00\u7684 MCP Client \u5de5\u7a0b\u533a\u5206\u5f00\uff09\uff0c\u56e0\u4e3a\u5b83\u4eec\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u8fdb\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u6211\u4eec\u8981\u8ba9\u81ea\u5df1\u5b9e\u73b0\u7684 MCP Server \u4ee5&nbsp;<strong>SSE\/HTTP \u65b9\u5f0f<\/strong>&nbsp;\u5bf9\u5916\u63d0\u4f9b\u670d\u52a1\uff0c\u8fd9\u6837\u5b83\u5c31\u662f\u4e00\u4e2a\u72ec\u7acb\u8fd0\u884c\u7684 Web \u670d\u52a1\uff0c\u4efb\u4f55\u673a\u5668\u4e0a\u7684 MCP Client \u90fd\u80fd\u901a\u8fc7 HTTP \u8fde\u8fc7\u6765\u8c03\u7528\u5b83\uff0c\u66f4\u63a5\u8fd1\u4f01\u4e1a\u7ea7\u771f\u5b9e\u573a\u666f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e00\u6b65\uff1a\u5728\u65b0\u5de5\u7a0b\u4e2d\u5f15\u5165 MCP Server \u4f9d\u8d56<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n&lt;!-- WebMVC \u7248\u672c\u7684 MCP Server Starter\uff0c\u5bf9\u5916\u63d0\u4f9b\u57fa\u4e8e HTTP \u7684 MCP \u670d\u52a1 --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-ai-starter-mcp-server-webmvc&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a\u8fd9\u91cc\u7528\u7684\u662f&nbsp;<strong><code>spring-ai-starter-mcp-server-webmvc<\/code><\/strong>\uff0c\u4e0d\u662f Stdio \u7248\u672c\u7684&nbsp;<code>spring-ai-starter-mcp-server<\/code>\u3002webmvc \u7248\u672c\u4f1a\u81ea\u52a8\u5e2e\u6211\u4eec\u66b4\u9732 SSE \/ Streamable HTTP \u7684\u7aef\u70b9\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e8c\u6b65\uff1a\u6dfb\u52a0 MCP Server \u7684 yml \u914d\u7f6e<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  ai:\n    mcp:\n      server:\n        enabled: true                 # \u542f\u7528 MCP Server\n        name: time-mcp-server      # MCP Server \u7684\u540d\u79f0\nserver:\n  port: 8081                          # MCP Server \u76d1\u542c\u7684\u7aef\u53e3\uff0cClient \u901a\u8fc7\u8fd9\u4e2a\u7aef\u53e3\u8fde\u8fc7\u6765\n```<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic class TimeService {\n\n\n    \/**\n     * \u8fd4\u56de\u5f53\u524d\u65f6\u95f4\n     *\/\n    @Tool(description = \"\u83b7\u53d6\u5f53\u524d\u6307\u5b9a\u65f6\u533a\u7684\u65f6\u95f4\uff0c\u8fd4\u56de\u7cbe\u786e\u90fd\u6309\u79d2\u7684\u65e5\u671f\u5b57\u7b26\u4e32\")\n    public String getTime(@ToolParam(description = \"\u6307\u5b9a\u7684\u65f6\u533a\u540d\u79f0, \u6bd4\u5982Asia\/Shanghai\") String zone) {\n        System.out.println(\"\u65b9\u6cd5\u88ab\u8c03\u7528\u4e86\uff01\");\n\n        DateTimeFormatter dateTimeFormatter = null;\n        ZoneId zoneId = null;\n        try {\n            dateTimeFormatter = DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\");\n            zoneId = ZoneId.of(zone);\n            return ZonedDateTime.now(zoneId).format(dateTimeFormatter);\n        } catch (Exception e) {\n            e.printStackTrace();\n            return \"\u83b7\u53d6\" + zone + \"\u65f6\u533a\u7684\u65f6\u95f4\u5931\u8d25\";\n        }\n\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u7528\u5230\u7684&nbsp;<code>@Tool<\/code>&nbsp;\u548c&nbsp;<code>@ToolParam<\/code>&nbsp;\u6ce8\u89e3\uff0c\u8ddf\u6211\u4eec\u4e4b\u524d\u5b66 Tool Calling \u65f6\u4e00\u6a21\u4e00\u6837\uff0c<strong>\u5b8c\u5168\u6ca1\u6709\u4efb\u4f55\u7279\u6b8a\u7684\u5199\u6cd5<\/strong>\u3002\u8fd9\u4e00\u70b9\u6b63\u662f MCP \u7684\u4f18\u70b9\uff1a\u5199\u5de5\u5177\u7684\u65b9\u5f0f\u5b8c\u5168\u6ca1\u53d8\uff0c\u53ea\u662f\u90e8\u7f72\u5f62\u6001\u53d8\u4e86\u800c\u5df2\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u56db\u6b65\uff1a\u7f16\u5199\u914d\u7f6e\u7c7b\uff0c\u628a\u5de5\u5177\u6ce8\u518c\u4e3a MCP Server \u63d0\u4f9b\u7684\u5de5\u5177<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@Configuration\npublic class WeatherMcpServerConfig {\n\n    \/**\n     * \u628a WeatherService \u4e2d\u7684\u5de5\u5177\u65b9\u6cd5\uff0c\u6ce8\u518c\u4e3a MCP Server \u5bf9\u5916\u66b4\u9732\u7684\u5de5\u5177\n     *\n     * \u6ce8\u610f\uff1a\u8fd9\u91cc\u5fc5\u987b\u8fd4\u56de List&lt;ToolCallback&gt; \u6216\u8005 ToolCallbackProvider\uff0c\n     * \u624d\u80fd\u88ab MCP Server Starter \u81ea\u52a8\u8bc6\u522b\u5e76\u53d1\u5e03\u3002\n     *\/\n    @Bean\n    public List&lt;ToolCallback&gt; weatherToolCallbacks() {\n        \/\/ \u901a\u8fc7 ToolCallbacks.from() \u5de5\u5177\u65b9\u6cd5\uff0c\u628a WeatherService \u4e2d\u6240\u6709\u7684 @Tool \u65b9\u6cd5\n        \/\/ \u81ea\u52a8\u8f6c\u6362\u4e3a ToolCallback \u5bf9\u8c61\uff0c\u5e76\u653e\u8fdb List\n        return List.of(ToolCallbacks.from(new WeatherService()));\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e94\u6b65\uff1a\u542f\u52a8 MCP Server<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u516d\u6b65\uff1a\u5728 MCP Client \u5de5\u7a0b\u4e2d\u8ffd\u52a0\u8fd9\u4e2a\u65b0\u7684 Server \u914d\u7f6e<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u73b0\u5728\u56de\u5230\u6848\u4f8b\u4e00\u7684 MCP Client \u5de5\u7a0b\uff0c\u6211\u4eec\u8981\u8ba9\u5b83<strong>\u540c\u65f6\u8fde\u63a5\u4e24\u4e2a MCP Server<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9ad8\u5fb7\u5730\u56fe MCP Server\uff08Stdio \u65b9\u5f0f\uff09<\/li>\n\n\n\n<li>\u6211\u4eec\u81ea\u5df1\u7684\u65f6\u95f4 MCP Server\uff08SSE\/HTTP \u65b9\u5f0f\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u7531\u4e8e\u8fd9\u4e24\u4e2a Server \u7684\u901a\u4fe1\u65b9\u5f0f\u4e0d\u540c\uff0c\u914d\u7f6e\u4f4d\u7f6e\u4e5f\u4e0d\u540c\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stdio \u65b9\u5f0f\u7684\u9ad8\u5fb7 MCP Server \u7ee7\u7eed\u653e\u5728&nbsp;<code>servers.json<\/code><\/li>\n\n\n\n<li>SSE \u65b9\u5f0f\u7684\u65f6\u95f4 MCP Server \u76f4\u63a5\u5728 yml \u4e2d\u914d\u7f6e<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4fee\u6539 MCP Client \u5de5\u7a0b\u7684 yml\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  ai:\n    mcp:\n      client:\n        stdio:\n          servers-configuration: classpath:mcp-servers\/servers.json\n        # SSE\/HTTP \u65b9\u5f0f\u7684 MCP Server\uff0c\u76f4\u63a5\u5728 yml \u4e2d\u914d\u7f6e\n        sse:\n          connections:\n            time-mcp-server:                         # \u7ed9\u8fd9\u4e2a Server \u8d77\u4e2a\u540d\u5b57\n              url: http:\/\/localhost:8081            # Server \u7684\u8bbf\u95ee\u5730\u5740\uff08\u5982\u679c Server \u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5c31\u6539\u6210\u5bf9\u5e94 IP\uff09\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u89e3\u91ca SSE \u914d\u7f6e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>connections<\/code>&nbsp;\u4e0b\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a SSE \u65b9\u5f0f\u7684 MCP Server<\/li>\n\n\n\n<li><code>url<\/code>\uff1aMCP Server \u7684\u8bbf\u95ee\u57fa\u5730\u5740\uff0c\u7531\u4e8e\u8fd9\u91cc\u6211\u4eec Server \u4e5f\u90e8\u7f72\u5728\u672c\u673a\uff0c\u6240\u4ee5\u662f&nbsp;<code>localhost:8081<\/code>\u3002\u751f\u4ea7\u73af\u5883\u6539\u6210\u5b9e\u9645\u7684\u8fdc\u7a0b\u5730\u5740\u5373\u53ef<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u81f3\u6b64\uff0cMCP Client \u542f\u52a8\u4e4b\u540e\uff0c\u901a\u8fc7 Stdio \u542f\u52a8\u5e76\u8fde\u63a5\u9ad8\u5fb7 MCP Server\uff0c\u901a\u8fc7 HTTP \u8fde\u63a5\u6211\u4eec\u81ea\u5df1\u7684\u5929\u6c14 MCP Server\u3002\u6240\u6709 Server \u4e0a\u7684\u5de5\u5177\u90fd\u4f1a\u88ab\u6c47\u603b\u5230&nbsp;<code>ToolCallbackProvider<\/code>&nbsp;\u4e2d\uff0c\u5bf9\u5927\u6a21\u578b\u800c\u8a00\u770b\u5230\u7684\u5c31\u662f&#8221;\u4e00\u5806\u53ef\u7528\u7684\u5de5\u5177&#8221;\uff0c\u4e0d\u533a\u5206\u6765\u6e90\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e03\u6b65\uff1a\u6d4b\u8bd5\u8c03\u7528<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5199\u4e00\u4e2a\u65b0\u7684\u63a5\u53e3\u6d4b\u8bd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@GetMapping(\"\/time\")\npublic String weather(@RequestParam String zone) {\n    return chatClient.prompt()\n            .user(\"\u8bf7\u5e2e\u6211\u67e5\u8be2 \" + zone + \"\u5f53\u524d\u7684\u65f6\u95f4\")\n            .call()\n            .content();\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bbf\u95ee&nbsp;<code>http:\/\/localhost:8080\/time?zone=GMT+8<\/code>\uff0c\u53ef\u4ee5\u770b\u5230\u5927\u6a21\u578b\u81ea\u52a8\u8c03\u7528\u4e86\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u7684\u5de5\u5177\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f \u6d4b\u8bd5\u524d\u9700\u8981\u4fdd\u8bc1&nbsp;<strong>MCP Server \u5de5\u7a0b\u5df2\u7ecf\u542f\u52a8<\/strong>\uff08\u76d1\u542c 8081 \u7aef\u53e3\uff09\uff0c\u5426\u5219 Client \u542f\u52a8\u65f6\u4f1a\u8fde\u63a5\u5931\u8d25\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u591a\u6a21\u6001<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u4e4b\u524d\u5b66\u7684\u6240\u6709\u5185\u5bb9\uff0c\u65e0\u8bba\u662f Prompt\u3001\u8fd8\u662f RAG\u3001\u8fd8\u662f Tool Calling\uff0c<strong>\u8f93\u5165\u548c\u8f93\u51fa\u7684\u6838\u5fc3\u90fd\u662f&#8221;\u6587\u5b57&#8221;<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\u5728\u73b0\u5b9e\u4e16\u754c\u91cc\uff0c\u4fe1\u606f\u7684\u8f7d\u4f53\u8fdc\u8fdc\u4e0d\u6b62\u6587\u5b57\u3002\u4f60\u968f\u4fbf\u6253\u5f00\u5fae\u4fe1\u804a\u5929\u754c\u9762\u770b\u770b\uff0c\u91cc\u9762\u6709\uff1a\u6587\u5b57\u3001\u56fe\u7247\u3001\u8bed\u97f3\u3001\u89c6\u9891\u3001\u6587\u4ef6 \u2026\u2026 \u6bcf\u4e00\u79cd\u90fd\u662f\u4e0d\u540c\u5f62\u5f0f\u7684\u4fe1\u606f\u3002\u6211\u4eec\u628a\u8fd9\u4e9b\u4e0d\u540c\u5f62\u5f0f\u7684\u4fe1\u606f\uff0c\u79f0\u4e3a\u4e0d\u540c\u7684<strong>&#8220;\u6a21\u6001&#8221;\uff08Modality\uff09<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u90a3\u4ec0\u4e48\u662f<strong>\u591a\u6a21\u6001<\/strong>\u5462\uff1f<strong>\u591a\u6a21\u6001\u5c31\u662f\u6307\u6a21\u578b\u80fd\u591f\u540c\u65f6\u5904\u7406\u591a\u79cd\u5f62\u5f0f\u7684\u4fe1\u606f<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u4e4b\u524d\u5b66\u7684\u5927\u6a21\u578b\uff08\u6bd4\u5982\u901a\u4e49\u5343\u95ee\u6807\u51c6\u7248\u3001GPT-4 \u6587\u672c\u7248\uff09\u4e25\u683c\u6765\u8bf4\u53eb<strong>&#8220;\u5927\u8bed\u8a00\u6a21\u578b&#8221;\uff08LLM\uff09<\/strong>\uff0c\u5b83\u4eec\u53ea\u80fd\u5904\u7406\u6587\u5b57\u8f93\u5165\u3001\u4ea7\u751f\u6587\u5b57\u8f93\u51fa\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u800c<strong>&#8220;\u591a\u6a21\u6001\u5927\u6a21\u578b&#8221;<\/strong>&nbsp;\u5728\u5927\u8bed\u8a00\u6a21\u578b\u7684\u57fa\u7840\u4e0a\uff0c\u589e\u52a0\u4e86\u5bf9\u56fe\u7247\u3001\u97f3\u9891\u3001\u89c6\u9891\u7b49\u5176\u4ed6\u6a21\u6001\u7684\u7406\u89e3\u80fd\u529b\u3002\u6bd4\u8f83\u6709\u540d\u7684\u591a\u6a21\u6001\u6a21\u578b\u6709\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u963f\u91cc&nbsp;<strong>qwen-vl<\/strong>&nbsp;\u7cfb\u5217\u3001<strong>qwen-omni<\/strong>&nbsp;\u7cfb\u5217\uff1a\u56fe\u50cf\u3001\u89c6\u9891\u3001\u8bed\u97f3\u7406\u89e3<\/li>\n\n\n\n<li>OpenAI&nbsp;<strong>GPT-4o<\/strong>\uff1a\u56fe\u3001\u6587\u3001\u97f3\u7684\u5168\u6a21\u6001\u6a21\u578b<\/li>\n\n\n\n<li>Google&nbsp;<strong>Gemini<\/strong>\uff1a\u540c\u6837\u652f\u6301\u591a\u6a21\u6001\u8f93\u5165<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u4e2a\u6bd4\u65b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5927\u8bed\u8a00\u6a21\u578b<\/strong>&nbsp;\u5c31\u50cf\u4e00\u4e2a<strong>\u53ea\u4f1a\u8bfb\u5b57\u3001\u53ea\u4f1a\u5199\u5b57\u7684\u5b66\u8005<\/strong>\uff0c\u4f60\u7ed9\u4ed6\u6587\u5b57\u4ed6\u61c2\u3001\u4ed6\u80fd\u5199\u6587\u5b57\u7ed9\u4f60<\/li>\n\n\n\n<li><strong>\u591a\u6a21\u6001\u6a21\u578b<\/strong>&nbsp;\u5c31\u50cf\u4e00\u4e2a<strong>\u773c\u8033\u53e3\u624b\u8111\u5168\u80fd\u7684\u4eba<\/strong>\uff0c\u4f60\u7ed9\u4ed6\u56fe\u4ed6\u80fd\u770b\u3001\u7ed9\u4ed6\u97f3\u9891\u4ed6\u80fd\u542c\u3001\u7ed9\u4ed6\u6587\u5b57\u4ed6\u80fd\u8bfb\uff0c\u8f93\u51fa\u5f62\u5f0f\u4e5f\u53ef\u4ee5\u66f4\u4e30\u5bcc<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u6211\u4eec\u7528\u963f\u91cc\u7684&nbsp;<strong>qwen-omni-turbo<\/strong>&nbsp;\u6a21\u578b\uff0c\u6f14\u793a\u4e00\u4e2a&#8221;\u4e0a\u4f20\u56fe\u7247\u8ba9\u6a21\u578b\u63cf\u8ff0\u56fe\u7247\u5185\u5bb9&#8221;\u7684\u6848\u4f8b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>qwen-omni-turbo<\/code>&nbsp;\u662f\u901a\u4e49\u5343\u95ee\u7684\u4e00\u4e2a\u591a\u6a21\u6001\u6a21\u578b\uff0c\u652f\u6301\u56fe\u50cf\u3001\u97f3\u9891\u3001\u89c6\u9891\u7684\u8f93\u5165\uff0c\u8f93\u51fa\u6587\u672c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e00\u6b65\uff1a\u5728 yml \u4e2d\u914d\u7f6e\u591a\u6a21\u6001\u6a21\u578b<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  ai:\n    openai:\n      base-url: https:\/\/dashscope.aliyuncs.com\/compatible-mode\n      api-key: ${DASHSCOPE_API_KEY}\n      chat:\n        options:\n          model: qwen-omni-turbo     # \u6307\u5b9a\u591a\u6a21\u6001\u6a21\u578b\n          stream-usage: false         # qwen-omni-turbo \u8981\u6c42 stream \u8c03\u7528\u65f6 stream-usage \u5fc5\u987b\u4e3a false\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e8c\u6b65\uff1a\u7f16\u5199 Controller<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@RestController\npublic class MultiModalController {\n\n    private final ChatClient chatClient;\n\n    public MultiModalController(ChatClient.Builder builder) {\n        this.chatClient = builder.build();\n    }\n\n    \/**\n     * \u591a\u6a21\u6001\u63a5\u53e3\uff1a\u63a5\u6536\u7528\u6237\u6d88\u606f + \u4e0a\u4f20\u7684\u56fe\u7247\uff0c\u8fd4\u56de\u6a21\u578b\u5bf9\u56fe\u7247\u7684\u7406\u89e3\uff08\u6d41\u5f0f\uff09\n     *\n     * @param message \u7528\u6237\u6587\u5b57\u6d88\u606f\uff0c\u6bd4\u5982\"\u8fd9\u5f20\u56fe\u7247\u91cc\u6709\u4ec0\u4e48\uff1f\"\n     * @param image   \u7528\u6237\u4e0a\u4f20\u7684\u56fe\u7247\u6587\u4ef6\n     * @return Flux&lt;String&gt; \u6d41\u5f0f\u54cd\u5e94\uff0c\u9010\u5b57\u8fd4\u56de\u6a21\u578b\u7684\u56de\u7b54\n     *\/\n    @PostMapping(value = \"\/image-understand\",\n                 produces = MediaType.TEXT_EVENT_STREAM_VALUE)\n    public Flux&lt;String&gt; understandImage(@RequestParam String message,\n                                        MultipartFile image) throws IOException {\n\n        \/\/ 1. \u628a\u4e0a\u4f20\u7684\u56fe\u7247\u5305\u88c5\u4e3a Spring AI \u4e2d\u7684 Media \u5bf9\u8c61\n        \/\/    \u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u56fe\u7247\u7684 MIME \u7c7b\u578b\uff08image\/jpeg\u3001image\/png \u7b49\uff09\n        \/\/    \u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u56fe\u7247\u7684\u5185\u5bb9\u8d44\u6e90\n        Media imageMedia = Media.builder()\n                .mimeType(MimeType.valueOf(image.getContentType()))\n                .data(image.getResource())\n                .build();\n\n        \/\/ 2. \u8c03\u7528 ChatClient\uff0c\u6ce8\u610f user() \u65b9\u6cd5\u7684\u53c2\u6570\uff1a\n        \/\/    \u53ef\u4ee5\u540c\u65f6\u4f20\u5165\u6587\u5b57\u5185\u5bb9\u548c Media \u5bf9\u8c61\uff08\u4e5f\u5c31\u662f\u56fe\u7247\uff09\n        \/\/    \u8fd9\u5c31\u662f\"\u591a\u6a21\u6001\u8f93\u5165\"\u7684\u4f53\u73b0 \u2014\u2014 \u8f93\u5165\u65e2\u6709\u6587\u5b57\u53c8\u6709\u56fe\u7247\n        return chatClient.prompt()\n                .user(promptUserSpec -&gt; promptUserSpec\n                        .text(message)            \/\/ \u6587\u5b57\u90e8\u5206\n                        .media(imageMedia))       \/\/ \u56fe\u7247\u90e8\u5206\n                .stream()                          \/\/ \u4f7f\u7528\u6d41\u5f0f\u54cd\u5e94\n                .content();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee3\u7801\u7684\u6838\u5fc3\u5728\u4e8e&nbsp;<code>user()<\/code>&nbsp;\u8fd9\u4e00\u6bb5\uff1a\u901a\u8fc7&nbsp;<code>media()<\/code>&nbsp;\u65b9\u6cd5\u628a\u56fe\u7247\u9644\u52a0\u5230\u7528\u6237\u6d88\u606f\u91cc\u3002\u5927\u6a21\u578b\u5728\u62ff\u5230\u8fd9\u4e2a\u8bf7\u6c42\u540e\uff0c\u4f1a<strong>\u540c\u65f6\u7406\u89e3<\/strong>\u7528\u6237\u7684\u6587\u5b57\u63cf\u8ff0\u548c\u56fe\u7247\u5185\u5bb9\uff0c\u7ed9\u51fa\u7efc\u5408\u7684\u56de\u7b54\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d4b\u8bd5\u65f6\uff0c\u53ef\u4ee5\u7528 ApiFox \u6216\u8005 Postman \u53d1\u8d77&nbsp;<code>multipart\/form-data<\/code>&nbsp;\u8bf7\u6c42\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>message<\/code>\uff1a\u586b\u4e00\u6bb5\u6587\u5b57\uff0c\u6bd4\u5982&#8221;\u8bf7\u63cf\u8ff0\u8fd9\u5f20\u56fe\u7247&#8221;<\/li>\n\n\n\n<li><code>image<\/code>\uff1a\u4e0a\u4f20\u4e00\u5f20\u672c\u5730\u56fe\u7247\u6587\u4ef6<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd4\u56de\u503c\u662f\u6d41\u5f0f\u54cd\u5e94\uff0c\u524d\u7aef\u4f1a\u9010\u5b57\u770b\u5230\u6a21\u578b\u5bf9\u56fe\u7247\u7684\u7406\u89e3\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6a21\u578b\u79c1\u6709\u5316\u90e8\u7f72<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u7528\u7684\u6240\u6709\u6a21\u578b\u90fd\u662f&#8221;\u5728\u7ebf API&#8221;\u5f62\u5f0f\uff1a\u5199\u597d API Key\uff0c\u8c03\u7528\u963f\u91cc\u4e91\u3001OpenAI \u7b49\u5382\u5546\u7684\u8fdc\u7a0b\u63a5\u53e3\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u8fd9\u79cd&#8221;\u5728\u7ebf API&#8221;\u5728\u5f88\u591a\u573a\u666f\u4e0b\u662f\u4e0d\u80fd\u7528\u7684\uff0c\u56e0\u4e3a\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. \u6570\u636e\u5b89\u5168\u548c\u9690\u79c1\u8981\u6c42\u9ad8\u7684\u573a\u666f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u50cf\u91d1\u878d\u3001\u653f\u5e9c\u3001\u519b\u5de5\u8fd9\u4e9b\u884c\u4e1a\uff0c\u4e1a\u52a1\u6570\u636e\u901a\u5e38\u90fd\u662f\u9ad8\u5ea6\u654f\u611f\u7684\u3002\u5982\u679c\u8c03\u7528\u5916\u90e8 API\uff0c\u610f\u5473\u7740\u6bcf\u6b21\u8bf7\u6c42\u90fd\u8981\u628a\u7528\u6237\u6570\u636e\u901a\u8fc7\u516c\u7f51\u53d1\u7ed9\u7b2c\u4e09\u65b9\u5382\u5546\uff0c\u8fd9\u662f\u7edd\u5927\u591a\u6570\u4f01\u4e1a\u7684\u5408\u89c4\u4f53\u7cfb\u6240\u4e0d\u5141\u8bb8\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. \u7f51\u7edc\u9694\u79bb\u7684\u573a\u666f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u4e9b\u4f01\u4e1a\u7684\u5185\u7f51\u662f\u548c\u5916\u7f51\u5b8c\u5168\u7269\u7406\u9694\u79bb\u7684\uff08\u4fd7\u79f0&#8221;\u5185\u5916\u7f51\u7269\u7406\u9694\u79bb&#8221;\uff09\uff0c\u6839\u672c\u6ca1\u6cd5\u8bbf\u95ee OpenAI\u3001\u963f\u91cc\u4e91\u7684\u63a5\u53e3\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u4e91\u7aef API \u662f\u5929\u7136\u7528\u4e0d\u4e86\u7684\uff0c\u5fc5\u987b\u7528\u672c\u5730\u90e8\u7f72\u7684\u6a21\u578b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. \u6210\u672c\u63a7\u5236\u7684\u573a\u666f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e91\u7aef API \u901a\u5e38\u6309 token \u8ba1\u8d39\uff0c\u4e00\u65e6\u5e94\u7528\u89c4\u6a21\u4e0a\u53bb\uff08\u6bd4\u5982\u6bcf\u5929\u767e\u4e07\u7ea7\u8c03\u7528\uff09\uff0c\u6210\u672c\u4f1a\u975e\u5e38\u9ad8\u3002\u800c\u79c1\u6709\u5316\u90e8\u7f72\u7684\u6a21\u5f0f\u662f&#8221;\u4e00\u6b21\u6027\u4e70\/\u79df GPU\uff0c\u957f\u671f\u4f7f\u7528\uff0c\u8c03\u7528\u6b21\u6570\u4e0d\u9650&#8221;\uff0c\u5bf9\u4e8e<strong>\u8c03\u7528\u91cf\u6781\u5927\u7684\u573a\u666f<\/strong>\uff0c\u957f\u671f\u4e0b\u6765\u6210\u672c\u53cd\u800c\u66f4\u4f4e\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. \u5b9a\u5236\u548c\u7a33\u5b9a\u6027\u8981\u6c42\u9ad8\u7684\u573a\u666f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e91\u7aef API \u5076\u5c14\u4f1a\u6709\u9650\u6d41\u3001\u4e0d\u7a33\u5b9a\u7684\u60c5\u51b5\uff0c\u4e14\u6a21\u578b\u7248\u672c\u53ef\u80fd\u4f1a\u88ab\u5382\u5546\u66f4\u65b0\uff0c\u5bfc\u81f4\u540c\u6837\u7684 prompt \u7a81\u7136\u51fa\u73b0\u884c\u4e3a\u53d8\u5316\u3002\u79c1\u6709\u5316\u90e8\u7f72\u7684\u6a21\u578b\uff0c<strong>\u7248\u672c\u5b8c\u5168\u7531\u81ea\u5df1\u63a7\u5236<\/strong>\uff0c\u4e0d\u4f1a\u51fa\u73b0\u4e00\u89c9\u9192\u6765\u6a21\u578b\u884c\u4e3a\u53d8\u4e86\u7684\u60c5\u51b5\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. \u79bb\u7ebf\u573a\u666f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\u8f66\u8f7d\u3001\u5de5\u4e1a\u8bbe\u5907\u3001\u8fb9\u7f18\u8ba1\u7b97\u573a\u666f\uff0c\u8bbe\u5907\u672c\u8eab\u53ef\u80fd\u6ca1\u6709\u7a33\u5b9a\u7684\u7f51\u7edc\u8fde\u63a5\uff0c\u5fc5\u987b\u628a\u6a21\u578b\u90e8\u7f72\u5728\u8bbe\u5907\u4e0a\u624d\u80fd\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0a\u573a\u666f\u5c31\u9002\u5408\u628a\u6a21\u578b<strong>\u90e8\u7f72\u5230\u81ea\u5df1\u7684\u670d\u52a1\u5668\u4e0a<\/strong>\uff0c\u4e5f\u5c31\u662f<strong>\u6a21\u578b\u7684\u79c1\u6709\u5316\u90e8\u7f72<\/strong>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Ollama \u4ecb\u7ecd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u77e5\u9053\u4e86\u4e3a\u4ec0\u4e48\u8981\u79c1\u6709\u5316\u90e8\u7f72\uff0c\u4e0b\u4e00\u4e2a\u95ee\u9898\u5c31\u662f\uff1a<strong>\u600e\u4e48\u90e8\u7f72\uff1f<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u8ba9\u6211\u4eec\u81ea\u5df1\u4ece\u96f6\u642d\u5efa GPU \u670d\u52a1\u3001\u52a0\u8f7d\u6a21\u578b\u3001\u5199\u63a8\u7406\u5f15\u64ce\uff0c\u96be\u5ea6\u5f88\u5927\u3002\u597d\u5728\u5df2\u7ecf\u6709\u73b0\u6210\u7684\u5de5\u5177\u5e2e\u6211\u4eec\u505a\u8fd9\u4ef6\u4e8b\uff0c\u5176\u4e2d\u6700\u6d41\u884c\u7684\u4e00\u4e2a\u5c31\u662f \u2014\u2014&nbsp;<strong>Ollama<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ollama \u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u672c\u5730\u5927\u6a21\u578b\u8fd0\u884c\u6846\u67b6<\/strong>\uff0c\u5b83\u628a&#8221;\u4e0b\u8f7d\u6a21\u578b + \u52a0\u8f7d\u6a21\u578b + \u63d0\u4f9b API&#8221;\u8fd9\u4e00\u6574\u5957\u6d41\u7a0b\u5c01\u88c5\u5230\u4e86\u4e00\u4e2a\u547d\u4ee4\u884c\u5de5\u5177\u91cc\u3002\u4f60\u53ea\u9700\u8981\u6267\u884c\u4e00\u6761\u547d\u4ee4\uff0c\u5c31\u80fd\u5728\u81ea\u5df1\u7684\u7535\u8111\u4e0a\u8dd1\u8d77\u6765\u4e00\u4e2a\u5927\u6a21\u578b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ollama \u652f\u6301\u5f88\u591a\u4e3b\u6d41\u7684\u5f00\u6e90\u6a21\u578b\uff0c\u6bd4\u5982\uff1a<strong>Llama \u7cfb\u5217<\/strong>\uff08Meta \u5f00\u6e90\uff09\uff0c<strong>Qwen \u7cfb\u5217<\/strong>\uff08\u963f\u91cc\u901a\u4e49\u5343\u95ee\u5f00\u6e90\u7248\uff09\uff0c<strong>DeepSeek \u7cfb\u5217<\/strong>\uff0c<strong>Mistral \u7cfb\u5217<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Gemma<\/strong>\uff08Google \u5f00\u6e90\uff09&#8230;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b98\u7f51\u5730\u5740\uff1a<strong>https:\/\/ollama.com<\/strong>\uff0c\u5728\u5b98\u7f51\u9996\u9875\uff0c\u4f60\u53ef\u4ee5\u770b\u5230\u6240\u6709\u652f\u6301\u7684\u6a21\u578b\u7684\u5b8c\u6574\u5217\u8868\uff0c\u6bcf\u4e2a\u6a21\u578b\u90fd\u6709\u4e0d\u540c\u7684\u89c4\u6a21\uff08\u6bd4\u5982 0.5b\u30017b\u300172b\uff0c\u4ee3\u8868\u53c2\u6570\u91cf\uff09\uff0c\u6570\u5b57\u8d8a\u5c0f\u8d8a\u7701\u8d44\u6e90\u3001\u8d8a\u5feb\uff0c\u4f46\u80fd\u529b\u4e5f\u8d8a\u5f31\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u901a\u8fc7 Ollama \u90e8\u7f72\u8fd0\u884c\u672c\u5730\u6a21\u578b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u4ee5&nbsp;<strong>Linux \u7cfb\u7edf<\/strong>&nbsp;\u4e3a\u4f8b\uff08\u751f\u4ea7\u73af\u5883\u4e00\u822c\u90fd\u662f Linux \u670d\u52a1\u5668\uff09\uff0c\u8bb2\u89e3\u90e8\u7f72\u7684\u5b8c\u6574\u8fc7\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e00\u6b65\uff1a\u4e0b\u8f7d Ollama<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u5f00 Ollama \u5b98\u7f51\u7684\u4e0b\u8f7d\u9875 https:\/\/ollama.com\/download\uff0c<strong>\u6ce8\u610f\u9009\u62e9\u6b63\u786e\u7684\u5e73\u53f0<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>macOS\uff1a\u4e0b\u8f7d .zip \u5305<\/li>\n\n\n\n<li>Windows\uff1a\u4e0b\u8f7d .exe \u5b89\u88c5\u5305<\/li>\n\n\n\n<li><strong>Linux<\/strong>\uff1a\u4e0b\u8f7d tgz \u538b\u7f29\u5305\uff08\u6211\u4eec\u8fd9\u91cc\u7528 Linux\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u6211\u4eec\u5f53\u524d\u7684\u8bfe\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528 Linux \u7248\u672c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e8c\u6b65\uff1a\u5b89\u88c5 Ollama<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1\uff09\u89e3\u538b<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ntar -xzf ollama-linux-amd64.tgz -C \/usr\/local\/\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c06\u4e0b\u8f7d\u597d\u7684 tgz \u5305\u89e3\u538b\u5230&nbsp;<code>\/usr\/local\/<\/code>&nbsp;\u76ee\u5f55\uff0c\u89e3\u538b\u540e&nbsp;<code>ollama<\/code>&nbsp;\u53ef\u6267\u884c\u6587\u4ef6\u5c31\u653e\u5728&nbsp;<code>\/usr\/local\/bin\/<\/code>&nbsp;\u4e0b\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2\uff09\u9a8c\u8bc1\u5b89\u88c5<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nollama -v\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u8f93\u51fa\u7248\u672c\u53f7\uff0c\u8bf4\u660e\u5b89\u88c5\u6210\u529f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f&nbsp;<strong>\u7279\u522b\u6ce8\u610f<\/strong>\uff1a\u5982\u679c\u8f93\u5165&nbsp;<code>ollama -v<\/code>&nbsp;\u63d0\u793a&#8221;command not found&#8221;\uff0c\u662f\u56e0\u4e3a&nbsp;<code>\/usr\/local\/bin\/<\/code>&nbsp;\u6ca1\u6709\u52a0\u5165 PATH \u73af\u5883\u53d8\u91cf\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\u9700\u8981\u914d\u7f6e PATH \u73af\u5883\u53d8\u91cf\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nexport PATH=$PATH:\/usr\/local\/bin\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a\u8fd9\u4e00\u884c\u52a0\u5230&nbsp;<code>~\/.bashrc<\/code>&nbsp;\u6587\u4ef6\u672b\u5c3e\uff0c\u7136\u540e&nbsp;<code>source ~\/.bashrc<\/code>&nbsp;\u8ba9\u5b83\u751f\u6548\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3\uff09\u914d\u7f6e Ollama \u76f8\u5173\u7684\u73af\u5883\u53d8\u91cf<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9664\u4e86 PATH \u4e4b\u5916\uff0c\u6211\u4eec\u8fd8\u8981\u914d\u7f6e\u4e09\u4e2a\u4e13\u95e8\u7ed9 Ollama \u7528\u7684\u73af\u5883\u53d8\u91cf\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nexport OLLAMA_HOST=0.0.0.0:11434\nexport OLLAMA_MODELS=$HOME\/ollama\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5206\u522b\u89e3\u91ca\u4e0b\u8fd9\u4e09\u4e2a\u73af\u5883\u53d8\u91cf\u7684\u542b\u4e49\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OLLAMA_MODELS<\/strong>\uff1a\u6307\u5b9a Ollama \u628a\u4e0b\u8f7d\u4e0b\u6765\u7684\u6a21\u578b\u6587\u4ef6<strong>\u5b58\u653e\u5728\u54ea\u91cc<\/strong>\u3002\u6a21\u578b\u6587\u4ef6\u901a\u5e38\u90fd\u5f88\u5927\uff08\u5c0f\u5219\u51e0 GB\uff0c\u5927\u5219\u51e0\u5341 GB\uff09\uff0c\u9ed8\u8ba4\u4f1a\u653e\u5728\u7528\u6237\u4e3b\u76ee\u5f55\u4e0b\uff0c\u78c1\u76d8\u53ef\u80fd\u4e0d\u591f\u3002\u8fd9\u91cc\u6211\u4eec\u6307\u5b9a\u5230&nbsp;<code>$HOME\/ollama<\/code>\uff0c\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u670d\u52a1\u5668\u5b9e\u9645\u7684\u78c1\u76d8\u60c5\u51b5\u81ea\u7531\u8c03\u6574\u3002<\/li>\n\n\n\n<li><strong>OLLAMA_HOST<\/strong>\uff1a\u6307\u5b9a Ollama \u670d\u52a1<strong>\u76d1\u542c\u7684\u5730\u5740\u548c\u7aef\u53e3<\/strong>\u3002<code>0.0.0.0<\/code>&nbsp;\u8868\u793a\u76d1\u542c\u6240\u6709\u7f51\u5361\uff08\u5373\u5141\u8bb8\u5176\u4ed6\u673a\u5668\u6765\u8bbf\u95ee\uff0c\u4e0d\u53ea\u662f\u672c\u673a\uff09\uff0c<code>11434<\/code>&nbsp;\u662f Ollama \u7684\u9ed8\u8ba4\u7aef\u53e3\u3002\u5982\u679c\u53ea\u586b&nbsp;<code>127.0.0.1:11434<\/code>\uff0c\u90a3\u5c31\u53ea\u5141\u8bb8\u672c\u673a\u8bbf\u95ee\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u914d\u7f6e\u5b8c\u540e\uff0c\u542f\u52a8 Ollama \u670d\u52a1\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nollama serve\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5230\u8fd9\u4e00\u6b65\uff0cOllama \u672c\u8eab\u5c31\u90e8\u7f72\u5b8c\u6210\u4e86\uff0c\u4f46\u662f\u8fd8\u6ca1\u6709\u4efb\u4f55\u6a21\u578b\u53ef\u4ee5\u7528\u3002\u542f\u52a8\u6210\u529f\u540e\u53ef\u4ee5\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95eehttp:\/\/ip:11434\/api\/tags<\/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:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-150.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"829\" height=\"192\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-150.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-702\"  sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e09\u6b65\uff1a\u4e0b\u8f7d\u5e76\u8fd0\u884c\u6a21\u578b<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u8fd9\u91cc\u4e0b\u8f7d\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u6a21\u578b&nbsp;<code>qwen2.5:0.5b<\/code>&nbsp;\u4f5c\u4e3a\u6f14\u793a\uff08\u53ea\u6709\u7ea6 400MB\uff0c\u8dd1\u8d77\u6765\u4e0d\u9700\u8981 GPU\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u5f00 Ollama \u5b98\u7f51\uff0c\u641c\u7d22&nbsp;<code>qwen2.5<\/code>\uff0c\u8fdb\u5165\u6a21\u578b\u8be6\u60c5\u9875\uff0c\u9009\u62e9&nbsp;<code>0.5b<\/code>&nbsp;\u89c4\u683c\uff0c\u53ef\u4ee5\u770b\u5230\u5bf9\u5e94\u7684\u547d\u4ee4\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nollama run qwen2.5:0.5b\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6267\u884c\u8fd9\u6761\u547d\u4ee4\uff0c\u4f1a\u53d1\u751f\u4e24\u4ef6\u4e8b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u7b2c\u4e00\u6b21\u6267\u884c<\/strong>\uff1aOllama \u68c0\u6d4b\u5230\u672c\u5730\u6ca1\u6709\u8fd9\u4e2a\u6a21\u578b\uff0c\u4f1a<strong>\u5148\u53bb\u8fdc\u7a0b\u4ed3\u5e93\u4e0b\u8f7d<\/strong>\uff08\u8017\u65f6\u53d6\u51b3\u4e8e\u7f51\u901f\u548c\u6a21\u578b\u5927\u5c0f\uff09\uff0c\u4e0b\u8f7d\u5b8c\u540e\u81ea\u52a8\u8fd0\u884c<\/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:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-151.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"890\" height=\"107\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-151.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-703\"  sizes=\"auto, (max-width: 890px) 100vw, 890px\" \/><\/div><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u540e\u7eed\u6267\u884c<\/strong>\uff1a\u6a21\u578b\u5df2\u7ecf\u5728\u672c\u5730\u4e86\uff0c\u76f4\u63a5\u8fd0\u884c\uff0c\u4e0d\u4f1a\u518d\u4e0b\u8f7d<\/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:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-152-1024x160.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"160\" data-original=\"https:\/\/larkdrop.cafe\/wp-content\/uploads\/2026\/06\/image-152-1024x160.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-704\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c\u6210\u529f\u540e\uff0c\u547d\u4ee4\u884c\u8fdb\u5165\u4e00\u4e2a\u4ea4\u4e92\u5f0f\u5bf9\u8bdd\u754c\u9762\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u548c\u6a21\u578b\u804a\u5929\u3002\u6309 Ctrl+D \u9000\u51fa\u5bf9\u8bdd\uff0c\u4f46\u6a21\u578b\u670d\u52a1\u4ecd\u5728 11434 \u7aef\u53e3\u4e0a\u8fd0\u884c\uff0c\u7b49\u7740\u522b\u4eba\u8c03\u7528\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Spring AI \u4e0e Ollama \u6574\u5408<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6a21\u578b\u5728\u672c\u5730\u8dd1\u8d77\u6765\u4e86\uff0c\u4e0b\u4e00\u6b65\u5c31\u662f\u7528 Spring AI \u53bb\u8c03\u7528\u5b83\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e00\u6b65\uff1a\u5f15\u5165 Maven \u4f9d\u8d56<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\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;\/dependency&gt;\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a starter \u4e13\u95e8\u7528\u6765\u5bf9\u63a5 Ollama\uff0c\u91cc\u9762\u5c01\u88c5\u4e86\u548c Ollama \u63a5\u53e3\u901a\u4fe1\u7684\u6240\u6709\u7ec6\u8282\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e8c\u6b65\uff1a\u6dfb\u52a0 yml \u914d\u7f6e<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  ai:\n    ollama:\n      base-url: http:\/\/192.168.1.100:11434    # Ollama \u670d\u52a1\u5730\u5740\uff0c\u6539\u4e3a\u4f60\u90e8\u7f72 Ollama \u7684\u673a\u5668 IP\n      chat:\n        options:\n          model: qwen2.5:0.5b                  # \u6307\u5b9a\u4f7f\u7528\u7684\u6a21\u578b\uff0c\u5fc5\u987b\u662f\u5df2\u7ecf\u5728 Ollama \u4e2d\u4e0b\u8f7d\u8fc7\u7684\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>base-url<\/code>&nbsp;\u5c31\u662f Ollama \u670d\u52a1\u7684\u8bbf\u95ee\u5730\u5740\u3002\u5982\u679c Ollama \u90e8\u7f72\u5728\u672c\u673a\u5c31\u5199&nbsp;<code>http:\/\/localhost:11434<\/code>\uff0c\u90e8\u7f72\u5728\u5176\u4ed6\u673a\u5668\u5c31\u5199\u8fdc\u7a0b IP\u3002<\/li>\n\n\n\n<li><code>model<\/code>&nbsp;\u5fc5\u987b\u662f\u4f60\u524d\u9762\u7528&nbsp;<code>ollama run<\/code>&nbsp;\u4e0b\u8f7d\u8fc7\u7684\u6a21\u578b\uff0c\u5426\u5219\u4f1a\u62a5&#8221;\u6a21\u578b\u4e0d\u5b58\u5728&#8221;\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e09\u6b65\uff1a\u7f16\u5199\u4e00\u4e2a\u7b80\u5355\u7684 Controller \u6d4b\u8bd5<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@RestController\npublic class OllamaController {\n\n    private final ChatClient chatClient;\n\n    public OllamaController(ChatClient.Builder builder) {\n        \/\/ \u76f4\u63a5\u57fa\u4e8e\u6ce8\u5165\u7684 builder \u6784\u5efa ChatClient\n        \/\/ \u6846\u67b6\u4f1a\u6839\u636e yml \u4e2d\u7684 spring.ai.ollama.* \u914d\u7f6e\u81ea\u52a8\u628a OllamaChatModel \u88c5\u597d\n        this.chatClient = builder.build();\n    }\n\n    \/**\n     * \u7b80\u5355\u4e00\u8f6e\u5bf9\u8bdd\uff0c\u6d4b\u8bd5\u672c\u5730\u90e8\u7f72\u7684 Ollama \u6a21\u578b\u662f\u5426\u53ef\u7528\n     *\/\n    @GetMapping(\"\/ollama\/chat\")\n    public String chat(@RequestParam String message) {\n        return chatClient.prompt()\n                .user(message)\n                .call()\n                .content();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u542f\u52a8 Spring Boot \u9879\u76ee\uff0c\u8bbf\u95ee&nbsp;<code>http:\/\/localhost:8080\/ollama\/chat?message=\u4f60\u597d\uff0c\u8bf7\u4ecb\u7ecd\u4e00\u4e0b\u4f60\u81ea\u5df1<\/code>\uff0c\u5c31\u80fd\u770b\u5230\u672c\u5730 Ollama \u6a21\u578b\u8fd4\u56de\u7684\u5185\u5bb9\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ollama\u5e38\u7528\u547d\u4ee4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b66\u4f1a\u4e86\u5982\u4f55\u628a Ollama \u8dd1\u8d77\u6765\u8fd8\u4e0d\u591f\uff0c\u5728\u5b9e\u9645\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u6211\u4eec\u8fd8\u7ecf\u5e38\u9700\u8981\u505a\u8fd9\u4e9b\u4e8b\u60c5\uff1a\u770b\u770b\u672c\u5730\u90fd\u88c5\u4e86\u54ea\u4e9b\u6a21\u578b\u3001\u5220\u6389\u4e00\u4e2a\u4e0d\u7528\u7684\u6a21\u578b\u3001\u67e5\u770b\u6a21\u578b\u8be6\u60c5\u3001\u770b\u770b\u73b0\u5728\u54ea\u4e9b\u6a21\u578b\u6b63\u5728\u8dd1\u7b49\u3002\u8fd9\u4e9b\u90fd\u901a\u8fc7 Ollama \u81ea\u5e26\u7684\u547d\u4ee4\u884c\u5c31\u80fd\u5b8c\u6210\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u5206\u7c7b\u4ecb\u7ecd\u6700\u5e38\u7528\u7684\u51e0\u4e2a\u547d\u4ee4\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. \u670d\u52a1\u76f8\u5173<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n# \u542f\u52a8 Ollama \u670d\u52a1\uff08\u524d\u53f0\u542f\u52a8\uff0c\u4f1a\u4e00\u76f4\u5360\u7740\u5f53\u524d\u7ec8\u7aef\uff09\nollama serve\n\n# \u67e5\u770b Ollama \u7248\u672c\nollama -v\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ollama serve<\/code>&nbsp;\u662f Ollama \u670d\u52a1\u7684\u542f\u52a8\u547d\u4ee4\uff0c\u542f\u52a8\u540e\u9ed8\u8ba4\u76d1\u542c&nbsp;<code>11434<\/code>&nbsp;\u7aef\u53e3\uff0c\u6240\u6709\u7684\u6a21\u578b\u8c03\u7528\u90fd\u8981\u901a\u8fc7\u5b83\u3002\u751f\u4ea7\u73af\u5883\u4e00\u822c\u4f1a\u628a\u5b83\u6ce8\u518c\u4e3a systemd \u670d\u52a1\u5728\u540e\u53f0\u8fd0\u884c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. \u6a21\u578b\u4e0b\u8f7d\u4e0e\u8fd0\u884c<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n# \u4ec5\u4e0b\u8f7d\u6a21\u578b\uff0c\u4e0d\u8fd0\u884c\uff08\u9002\u5408\u63d0\u524d\u628a\u6a21\u578b\u51c6\u5907\u597d\uff09\nollama pull qwen2.5:0.5b\n\n# \u4e0b\u8f7d\u5e76\u8fd0\u884c\u6a21\u578b\uff08\u5982\u679c\u672c\u5730\u6ca1\u6709\u4f1a\u81ea\u52a8\u5148 pull\uff09\nollama run qwen2.5:0.5b\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u89e3\u91ca\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pull<\/code>&nbsp;\u548c&nbsp;<code>run<\/code>&nbsp;\u7684\u533a\u522b\uff1a<code>pull<\/code>&nbsp;\u53ea\u4e0b\u8f7d\u4e0d\u542f\u52a8\uff0c<code>run<\/code>&nbsp;\u4e0b\u8f7d\u5b8c\u4f1a\u7acb\u523b\u8fdb\u5165\u5bf9\u8bdd\uff1b<\/li>\n\n\n\n<li>\u6a21\u578b\u540d\u79f0\u7684\u683c\u5f0f\u662f&nbsp;<code>\u6a21\u578b\u540d:\u7248\u672c\/\u89c4\u6a21<\/code>\uff0c\u6bd4\u5982&nbsp;<code>qwen2.5:0.5b<\/code>&nbsp;\u8868\u793a\u901a\u4e49\u5343\u95ee 2.5 \u7684 0.5B \u53c2\u6570\u7248\u672c\uff0c\u4e0d\u540c\u89c4\u6a21\u6587\u4ef6\u5927\u5c0f\u5dee\u522b\u975e\u5e38\u5927\uff1b<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. \u6a21\u578b\u7ba1\u7406<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n# \u67e5\u770b\u672c\u5730\u5df2\u5b89\u88c5\u7684\u6240\u6709\u6a21\u578b\nollama list\n\n# \u67e5\u770b\u5f53\u524d\u6b63\u5728\u8fd0\u884c\uff08\u5df2\u52a0\u8f7d\u5230\u5185\u5b58\uff09\u7684\u6a21\u578b\nollama ps\n\n# \u67e5\u770b\u67d0\u4e2a\u6a21\u578b\u7684\u8be6\u7ec6\u4fe1\u606f\uff08\u53c2\u6570\u91cf\u3001\u6a21\u677f\u3001license \u7b49\uff09\nollama show qwen2.5:0.5b\n\n# \u5220\u9664\u4e00\u4e2a\u672c\u5730\u6a21\u578b\uff0c\u91ca\u653e\u78c1\u76d8\u7a7a\u95f4\nollama rm qwen2.5:0.5b\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u51e0\u4e2a\u547d\u4ee4\u5bf9\u5e94\u5b66\u751f\u719f\u6089\u7684 Linux\/Docker \u601d\u7ef4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ollama list<\/code>&nbsp;\u7c7b\u4f3c&nbsp;<code>docker images<\/code>\uff0c\u770b\u672c\u5730\u88c5\u4e86\u4ec0\u4e48<\/li>\n\n\n\n<li><code>ollama ps<\/code>&nbsp;\u7c7b\u4f3c&nbsp;<code>docker ps<\/code>\uff0c\u770b\u73b0\u5728\u8dd1\u4e86\u4ec0\u4e48<\/li>\n\n\n\n<li><code>ollama rm<\/code>&nbsp;\u7c7b\u4f3c&nbsp;<code>docker rmi<\/code>\uff0c\u5220\u9664\u5360\u7a7a\u95f4\u7684\u6a21\u578b<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. \u4e00\u4efd\u901f\u67e5\u8868<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u547d\u4ee4<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u4f5c\u7528<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u7c7b\u6bd4<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ollama serve<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u542f\u52a8 Ollama \u670d\u52a1<\/td><td class=\"has-text-align-left\" data-align=\"left\">\u542f\u52a8\u6570\u636e\u5e93\u670d\u52a1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ollama pull<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e0b\u8f7d\u6a21\u578b<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>docker pull<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ollama run<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u4e0b\u8f7d\u5e76\u8fd0\u884c \/ \u76f4\u63a5\u5bf9\u8bdd<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>docker run<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ollama list<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5217\u51fa\u672c\u5730\u6240\u6709\u6a21\u578b<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>docker images<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ollama ps<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u67e5\u770b\u6b63\u5728\u8fd0\u884c\u7684\u6a21\u578b<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>docker ps<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ollama show<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u67e5\u770b\u6a21\u578b\u8be6\u60c5<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>docker inspect<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ollama rm<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">\u5220\u9664\u672c\u5730\u6a21\u578b<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code>docker rmi<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u719f\u8bb0\u8fd9\u5f20\u8868\uff0c\u65e5\u5e38 Ollama \u7684\u8fd0\u7ef4\u57fa\u672c\u90fd\u80fd\u641e\u5b9a\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spring AI Alibaba<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Spring AI Alibaba \u662f\u4e13\u95e8\u7528\u6765\u6784\u5efa Agent \u667a\u80fd\u4f53\u5e94\u7528\u7684\u6846\u67b6\u3002<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u5b66\u4e60 Spring AI \u7684\u65f6\u5019\uff0c\u6211\u4eec\u5df2\u7ecf\u77e5\u9053\u4e86\u5982\u4f55\u901a\u8fc7 Spring AI \u4e0e\u5927\u6a21\u578b\u8fdb\u884c\u57fa\u672c\u7684\u4ea4\u4e92\u3002\u4f46\u662f\uff0c\u4ec5\u4ec5\u80fd\u548c\u5927\u6a21\u578b\u5bf9\u8bdd\u662f\u8fdc\u8fdc\u4e0d\u591f\u7684\u3002\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u6784\u5efa\u7684\u662f\u4e00\u4e2a\u80fd\u591f\u81ea\u4e3b\u601d\u8003\u3001\u81ea\u4e3b\u884c\u52a8\u7684&#8221;\u667a\u80fd\u4f53&#8221;\uff08Agent\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ec0\u4e48\u662f Agent\uff1f\u7b80\u5355\u6765\u8bf4\uff0c<strong>\u7ad9\u5728\u5e94\u7528\u7a0b\u5e8f\u7684\u89d2\u5ea6<\/strong>\uff0cAgent \u5c31\u662f\u4e00\u4e2a\u80fd\u591f<strong>\u81ea\u4e3b\u51b3\u7b56\u5e76\u6267\u884c\u4efb\u52a1<\/strong>\u7684\u7a0b\u5e8f\u3002\u5b83\u4e0d\u4ec5\u4ec5\u662f\u548c\u5927\u6a21\u578b\u804a\u5929\uff0c\u800c\u662f\u80fd\u591f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u81ea\u4e3b\u51b3\u7b56\uff1a\u6839\u636e\u7528\u6237\u7684\u9700\u6c42\uff0c\u81ea\u5df1\u5206\u89e3\u4efb\u52a1\uff0c\u81ea\u5df1\u5224\u65ad\u5e94\u8be5\u505a\u4ec0\u4e48<\/li>\n\n\n\n<li>\u843d\u5730\u6267\u884c\uff1a\u8c03\u7528\u5404\u79cd\u5de5\u5177\uff08\u6bd4\u5982\u67e5\u6570\u636e\u5e93\u3001\u8c03\u63a5\u53e3\uff09\u6765\u5b8c\u6210\u4efb\u52a1<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u800c Spring AI Alibaba\uff0c\u5c31\u662f\u5e2e\u52a9\u6211\u4eec\u5feb\u901f\u6784\u5efa\u8fd9\u79cd Agent \u5e94\u7528\u7684\u6846\u67b6\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spring AI Alibaba \u5206\u5c42\u67b6\u6784<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Spring AI Alibaba \u4ece\u67b6\u6784\u4e0a\u5305\u542b\u4e09\u5c42\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u7f3a\u5931\u56fe\u7247] image\/Spring%20AI%20Alibaba\u8bfe\u4ef6\u5236\u4f5c\u8bf4\u660e\/high-level.png<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u4ece\u4e0b\u5f80\u4e0a\u6765\u770b\u8fd9\u4e09\u5c42\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e00\u5c42\uff1aAugmented LLM\uff08\u589e\u5f3a\u5927\u6a21\u578b\u5c42\uff09<\/strong>\uff1a\u5176\u5b9e\u5bf9\u5e94\u7684\u57fa\u672c\u5c31\u662fSpring AI<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e8c\u5c42\uff1aGraph Runtime\uff08\u56fe\u8fd0\u884c\u65f6\u5c42\uff09<\/strong>\uff1agraph \u662f\u4e00\u4e2a\u4f4e\u7ea7\u522b\u7684\u5de5\u4f5c\u6d41\u548c\u591a\u4ee3\u7406\u534f\u8c03\u6846\u67b6\uff0c\u80fd\u591f\u5e2e\u52a9\u5f00\u53d1\u8005\u5b9e\u73b0\u590d\u6742\u7684\u5e94\u7528\u7a0b\u5e8f\u7f16\u6392\uff0cGraph \u662f Agent Framework \u7684\u5e95\u5c42\u8fd0\u884c\u65f6\u57fa\u5ea7<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7b2c\u4e09\u5c42\uff1aAgent Framework\uff08\u667a\u80fd\u4f53\u6846\u67b6\u5c42\uff09<\/strong>\uff1a\u662f\u4e00\u4e2a\u4ee5 ReactAgent \u4e3a\u6838\u5fc3\u7684 Agent \u5f00\u53d1\u6846\u67b6\uff0c\u4f7f\u5f00\u53d1\u8005\u80fd\u591f\u6784\u5efa\u5177\u5907\u81ea\u52a8\u4e0a\u4e0b\u6587\u5de5\u7a0b\u548c\u4eba\u673a\u4ea4\u4e92\u7b49\u6838\u5fc3\u80fd\u529b\u7684Agent\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4ee3\u7801\u5c42\u9762\u7684Agent\u7406\u89e3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u9700\u8981\u518d\u6b21\u89e3\u91ca\u4e00\u4e2a\u6982\u5ff5\u2014\u2014Agent\uff0c\u8fd9\u4e2a\u6982\u5ff5\u9700\u8981\u5206\u573a\u666f\u6765\u7406\u89e3\uff0c\u5728\u5e94\u7528\u7a0b\u5e8f\u8fd9\u4e2a\u5c42\u9762\uff0cAgent\u8868\u793a\u80fd\u591f<strong>\u81ea\u4e3b\u51b3\u7b56\u5e76\u6267\u884c\u4efb\u52a1<\/strong>\u7684\u7a0b\u5e8f\uff0c\u5728\u4ee3\u7801\u5c42\u9762\u6211\u4eec\u4e5f\u4f1a\u4f7f\u7528Agent\uff0c\u4f46\u662f\u4ee3\u7801\u5c42\u9762\u7684Agent\u7684\u542b\u4e49\u5c31\u5b8c\u5168\u4e0d\u540c\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u600e\u4e48\u7406\u89e3\u4ee3\u7801\u5c42\u9762\u7684\u4e00\u4e2aAgent\uff1f<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5728\u4ee3\u7801\u5c42\u9762\u5b83\u5c31\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\u6267\u884c\u5355\u5143\uff0c\u8be5\u5355\u5143\u5177\u6709\u4e0e\u6a21\u578b\u4ea4\u4e92\u7684\u80fd\u529b\uff0c\u53ef\u4ee5\u6709\u81ea\u5df1\u7684\u5de5\u5177\u96c6\uff0c\u81ea\u5df1\u7684\u4f1a\u8bdd\u8bb0\u5fc6\uff0c\u81ea\u5df1\u6240\u8bbf\u95ee\u7684\u77e5\u8bc6\u5e93<\/li>\n\n\n\n<li>\u540c\u65f6\uff0c\u8fd9\u4e2a\u6267\u884c\u5355\u5143\u53ea\u4f1a\u626e\u6f14\u5355\u4e00\u89d2\u8272\uff0c\u5b9e\u73b0\u5355\u4e00\u529f\u80fd<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u6211\u4eec\u8981\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u5f88\u7b80\u5355\u7684Agent\u5e94\u7528\u7a0b\u5e8f\uff0c\u4ee3\u7801\u5c42\u9762\u7684\u4e00\u4e2aAgent\u5c31\u53ef\u4ee5\u5b9e\u73b0\uff0c\u6bd4\u5982\u4f60\u8981\u505a\u4e00\u4e2a&#8221;\u8ba2\u5355\u67e5\u8be2 Agent&#8221;\uff0c\u5b83\u80fd\u6839\u636e\u7528\u6237\u7684\u81ea\u7136\u8bed\u8a00\u3001\u67e5\u8be2\u7528\u6237\u8ba2\u5355<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\uff0c\u5982\u679c\u6211\u4eec\u60f3\u5b9e\u73b0\u4e00\u4e9b\u5177\u6709<strong>\u590d\u6742\u529f\u80fd<\/strong>\u7684Agent\u5e94\u7528\u7a0b\u5e8f\uff0c\u5728\u4ee3\u7801\u5b9e\u73b0\u5c42\u9762\u53ef\u80fd\u5c31\u9700\u8981\u591a\u4e2a\u4ee3\u7801\u5c42\u9762\u7684Agent\u5b9e\u73b0\u4e0d\u540c\u89d2\u8272\u7684\u5206\u5de5\u4e0e\u534f\u4f5c\u3002\u4e3e\u4e00\u4e2a\u4f8b\u5b50\u6765\u8bf4\u660e\uff0c\u6bd4\u5982\u8bf4\u6211\u60f3\u5b9e\u73b0\u4e00\u4e2a\u80fd\u591f\u81ea\u4e3b\u5236\u5b9a\u7ea6\u4f1a\u884c\u7a0b\u7684Agent\u5e94\u7528\u7a0b\u5e8f\uff0c\u5728\u4ee3\u7801\u5b9e\u73b0\u5c42\u9762\u6211\u53ef\u80fd\u9700\u8981\u626e\u6f14\u4e0d\u540c\u89d2\u8272\u7684\u591a\u4e2a\u72ec\u7acb\u6267\u884c\u5355\u5143\u6765\u5206\u5de5\u534f\u4f5c\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6536\u96c6\u7528\u6237\u4fe1\u606f\u7684\u6267\u884c\u5355\u5143\uff1a\u8d1f\u8d23\u63a5\u6536\u7528\u6237\u4fe1\u606f\uff0c\u5e76\u901a\u8fc7LLM\u63d0\u53d6\u51fa\u7528\u6237\u7684\u7ea6\u4f1a\u65f6\u95f4\uff0c\u51fa\u53d1\u5730\u70b9\uff0c\u65e5\u671f\uff0c\u4ee5\u53ca\u504f\u597d\u7b49\u4fe1\u606f<\/li>\n\n\n\n<li>\u4e13\u95e8\u8d1f\u8d23\u67e5\u8be2\u5929\u6c14\u7684\u6267\u884c\u5355\u5143\uff1a\u8d1f\u8d23\u6839\u636e\u7ea6\u4f1a\u65e5\u671f\u67e5\u8be2\u5929\u6c14\uff0c\u5e76\u7ed9\u51fa\u7a7f\u642d\u5efa\u8bae<\/li>\n\n\n\n<li>\u4e13\u95e8\u8d1f\u8d23\u51fa\u884c\u8def\u7ebf\u7684\u6267\u884c\u5355\u5143\uff1a\u6839\u636e\u7528\u6237\u7684\u51fa\u53d1\u5730\u70b9\u548c\u7ea6\u4f1a\u76ee\u6807\u533a\u57df\uff0c\u7ed9\u51fa\u5408\u9002\u7684\u51fa\u884c\u5efa\u8bae<\/li>\n\n\n\n<li>\u8d1f\u8d23\u6536\u96c6\u6d3b\u52a8\u4fe1\u606f\u7684\u6267\u884c\u5355\u5143: \u6839\u636e\u7528\u6237\u7684\u504f\u597d\uff0c\u67e5\u8be2\u76ee\u6807\u533a\u57df\uff0c\u5728\u7ea6\u4f1a\u65e5\u671f\u5408\u9002\u7684\u6d3b\u52a8\u5730\u70b9\uff0c\u5c31\u9910\u5730\u70b9\u7b49<\/li>\n\n\n\n<li>\u8d1f\u8d23\u6839\u636e\u6d3b\u52a8\u4fe1\u606f\u6307\u5b9a\u7ea6\u4f1a\u8ba1\u5212\u7684\u6267\u884c\u5355\u5143\uff1a\u6839\u636e\u6536\u96c6\u5230\u7684\u4fe1\u606f\uff0c\u6574\u7406\uff0c\u7b5b\u9009\uff0c\u6392\u5217\uff0c\u5f97\u5230\u5b8c\u6574\u7684\u7ea6\u4f1a\u884c\u7a0b\u5b89\u6392<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0a\u7684\u6bcf\u4e00\u4e2a\u72ec\u7acb\u7684\u6267\u884c\u5355\u5143\uff0c\u90fd\u5bf9\u5e94\u4e00\u4e2a\u4ee3\u7801\u5c42\u9762\u7684Agent\uff0c\u591a\u4e2a\u4ee3\u7801\u5c42\u9762Agent\u76f8\u4e92\u5206\u5de5\u534f\u4f5c\uff0c\u800c\u8fd9\u4e9b\u4ee3\u7801\u5c42\u9762\u7684Agent\u5206\u5de5\u534f\u4f5c\u6700\u7ec8\u5c31\u5b9e\u73b0\u4e86\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\u5c42\u9762\u7684Agent\u529f\u80fd\uff01<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u4ee3\u7801\u5c42\u9762\u7684\u591aAgent\u5206\u5de5\u534f\u4f5c\uff0c\u6709\u4e00\u4e2a\u4e13\u4e1a\u7684\u8bcd\u6765\u63cf\u8ff0\u2014\u2014Multi-agent\uff0c\u540c\u65f6\u8fd9\u591a\u4e2aAgent\u5206\u5de5\u534f\u4f5c\u662f\u6709\u56fa\u5b9a\u7684\u5148\u540e\u6267\u884c\u987a\u5e8f\u5373\u6267\u884c\u6d41\u7a0b\u7684\uff0c\u8fd9\u5957\u591a\u4e2a\u4ee3\u7801\u5c42\u9762\u7684Agent\u7684\u6267\u884c\u6d41\u7a0b\u6211\u4eec\u5c31\u79f0\u4e4b\u4e3a\u591aAgent\u5de5\u4f5c\u6d41(Multi-agnet workflow)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spring AI Alibaba \u5206\u5c42\u4f7f\u7528\u573a\u666f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u7406\u89e3\u4e86\u4ee3\u7801\u5c42\u9762\u7684Agent\uff0c\u4ee5\u53caMulti-agent, Multi-agent workflow\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u7406\u89e3Agentic Framework\u8fd9\u4e00\u5c42\u548cGraph Runtime\u8fd9\u4e00\u5c42\u7684\u4f7f\u7528\u573a\u666f\u4e86\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agentic Framework\u8fd9\u4e00\u5c42\u63d0\u4f9b\u4e86ReactAgent\uff0c\u4e00\u4e2aReactAgent\u5bf9\u8c61\u5c31\u53ef\u4ee5\u88ab\u5f53\u505a\u662f\u6211\u4eec\u524d\u9762\u6240\u8bf4\u7684\u4e00\u4e2a\u4ee3\u7801\u5c42\u9762\u7684Agent\uff0c\u56e0\u6b64\u5c31\u5df2\u7ecf\u53ef\u4ee5\u5177\u5907\u6784\u5efa\u4e00\u4e2a\u57fa\u672c\u7684Agent\u5e94\u7528\u7684\u80fd\u529b\uff0c\u540c\u65f6\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u4f7f\u7528Multi-Agent\uff0cAgentic Framework\u4e5f\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86<strong>\u57fa\u7840\u7684<\/strong>\u591a\u667a\u80fd\u4f53\u5b9e\u73b0\u65b9\u5f0f<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u6bd4\u5982\"\u5199\u4e00\u7bc7\u6587\u7ae0\u7136\u540e\u7ffb\u8bd1\u6210\u82f1\u6587\"\uff0c\u8fd9\u91cc\u9762\u6d89\u53ca\u4e24\u4e2a\u89d2\u8272\uff1a\u5199\u4f5c\u8005\u548c\u7ffb\u8bd1\u8005\uff0c\u4e24\u4e2a\u89d2\u8272\u53ef\u4ee5\u7528\u4e24\u4e2aReactAgent\u5b9e\u73b0\uff0c\u7136\u540e\u53ef\u4ee5\u5229\u7528Agentic Framework\u63d0\u4f9b\u7684\u57fa\u7840workflow\u7684\u5b9e\u73b0\uff0c\u8ba9\u5199\u4f5cReactAgent\u5148\u6267\u884c\uff0c\u7ffb\u8bd1ReactAgent\u540e\u6267\u884c\uff0c\u9488\u5bf9\u5199\u4f5cReactAgent\u5199\u51fa\u7684\u5185\u5bb9\u6765\u7ffb\u8bd1\n```<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f46\u662f\uff0c\u5728\u4f01\u4e1a\u7ea7\u5f00\u53d1\u4e2d\uff0cMulti-Agent\u6709\u66f4\u4e3a\u590d\u6742\u7075\u6d3b\u7684\u534f\u4f5c\u573a\u666f\uff0c\u5927\u91cf\u81ea\u5b9a\u4e49\u903b\u8f91\uff0c\u66f4\u590d\u6742\u7684\u72b6\u6001\u63a7\u5236\uff0c\u6b64\u65f6Agentic Framework\u8fd9\u4e00\u5c42\u53ef\u80fd\u5c31\u6ee1\u8db3\u4e0d\u4e86\u6211\u4eec\u7684\u9700\u6c42\u4e86\uff0c\u5c31\u53ea\u80fd\u4f7f\u7528Graph Runtime\u8fd9\u4e00\u5c42\u7684\u529f\u80fd\u4e86<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u5982\u679c\u4f60\u7684\u591a Agent \u534f\u4f5c\u573a\u666f\u975e\u5e38\u590d\u6742\uff0c\u6709\u5927\u91cf\u81ea\u5b9a\u4e49\u903b\u8f91\u3001\u590d\u6742\u7684\u72b6\u6001\u63a7\u5236\u3001\u9700\u8981\u7cbe\u786e\u63a7\u5236\u6267\u884c\u6d41\u7a0b\uff0c\u90a3\u5c31\u9700\u8981\u7528 Graph Runtime\u3002\n\n\u4e3e\u4e2a\u4f8b\u5b50\uff1a\u4f60\u8981\u505a\u4e00\u4e2a\"\u533b\u7597\u95ee\u8bca\u7cfb\u7edf\"\uff0c\u6d41\u7a0b\u662f\u8fd9\u6837\u7684\uff1a\n1. \u5148\u8bc6\u522b\u60a3\u8005\u662f\u8c01\n2. \u7136\u540e\u63d0\u53d6\u75c7\u72b6\u4fe1\u606f\uff0c\u5982\u679c\u4fe1\u606f\u4e0d\u591f\u8fd8\u8981\u8ffd\u95ee\n3. \u8ffd\u95ee\u5b8c\u4e86\u8981\u505a\u75c7\u72b6\u6807\u51c6\u5316\uff0c\u8ba9\u7528\u6237\u786e\u8ba4\n4. \u7136\u540e\u505a\u6025\u8bca\u8bc4\u4f30\n5. \u6700\u540e\u68c0\u7d22\u75be\u75c5\u8bc1\u636e\uff0c\u7ed9\u51fa\u5206\u8bca\u5efa\u8bae\n\n\u8fd9\u79cd\u590d\u6742\u5ea6\uff0c\u5c31\u53ea\u80fd\u7528 Graph Runtime \u6765\u81ea\u5b9a\u4e49\u5de5\u4f5c\u6d41\u4e86\u3002\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\u63a5\u4e0b\u6765\u7684\u8bfe\u4ef6\u5185\u5bb9\uff0c\u5206\u6210\u4e24\u4e2a\u5927\u7684\u90e8\u5206\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Agent Framework<\/strong>\uff1a\u5b66\u4e60 ReactAgent \u7684\u4f7f\u7528\uff0c\u4ee5\u53ca\u57fa\u4e8e ReactAgent \u5b9e\u73b0\u7684\u57fa\u672c Multi-Agent \u5de5\u4f5c\u6d41<\/li>\n\n\n\n<li><strong>Graph Runtime<\/strong>\uff1a\u5b66\u4e60\u590d\u6742\u591a Agent \u5de5\u4f5c\u6d41\u7684\u81ea\u5b9a\u4e49\u5b9e\u73b0\uff0c\u5305\u62ec\u8282\u70b9\u5b9a\u4e49\u3001\u72b6\u6001\u5b9a\u4e49\u3001\u56fe\u7684\u8fd0\u884c\u65f6\u72b6\u6001\u6d41\u8f6c\uff08\u8fb9\u7684\u5b9a\u4e49\uff09\u7b49<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Agent Framework<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b66\u4e60 Agent Framework \uff0c\u4e3b\u8981\u5305\u542b\u5305\u62ec\u4e24\u5757\u5185\u5bb9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>ReactAgent \u7684\u4f7f\u7528<\/li>\n\n\n\n<li>\u57fa\u4e8e ReactAgent \u5b9e\u73b0\u7684\u57fa\u672c Multi-Agent \u5de5\u4f5c\u6d41<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u4f7f\u7528\u524d\u9700\u8981\u5f15\u5165\u5982\u4e0b\u4f9d\u8d56\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n&lt;dependency&gt;\n    &lt;groupId&gt;com.alibaba.cloud.ai&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-ai-alibaba-agent-framework&lt;\/artifactId&gt;\n    &lt;version&gt;1.1.2.2&lt;\/version&gt;\n&lt;\/dependency&gt;\n\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;version&gt;1.1.2.2&lt;\/version&gt;\n&lt;\/dependency&gt;\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u53ca\u914d\u7f6e\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nspring:\n  application:\n    name: alibaba\n  ai:\n    dashscope:\n      api-key: \u4f60\u7684apikey\n      base-url:  https:\/\/dashscope.aliyuncs.com\n      chat:\n        options:\n          model: qwen-plus\n```<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ReactAgent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ReactAgent \u662f Spring AI Alibaba \u4e2d\u6784\u5efa Agent \u7684\u6838\u5fc3\u7c7b\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u9010\u6b65\u5b66\u4e60 ReactAgent \u7684\u5404\u9879\u529f\u80fd\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u57fa\u672c\u529f\u80fd<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u57fa\u672c\u7684 ReactAgent\uff0c\u53ea\u9700\u8981\u914d\u7f6e\u4e00\u4e2a\u5927\u6a21\u578b\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u4e0e\u6a21\u578b\u7684\u7b80\u5355\u4ea4\u4e92(\u4e00\u8f6e\u5bf9\u8bdd)\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u6784\u5efa\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\n\n@Autowired\nChatModel chatModel;\n\n\/\/ \u6784\u5efa ReactAgent\nReactAgent agent = ReactAgent.builder()\n    .name(\"my_agent\")       \/\/ Agent \u7684\u540d\u79f0\n    .model(chatModel)       \/\/ \u6307\u5b9a\u4f7f\u7528\u7684\u5927\u6a21\u578b\n    .build();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u8c03\u7528\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u8c03\u7528 Agent\uff0c\u4f20\u5165\u7528\u6237\u6d88\u606f\uff0c\u8fd4\u56de\u6a21\u578b\u7684\u56de\u590d\nAssistantMessage response = agent.call(\"\u4f60\u597d\uff0c\u8bf7\u4ecb\u7ecd\u4e00\u4e0b\u4f60\u81ea\u5df1\");\nSystem.out.println(response.getText());\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c31\u8fd9\u4e48\u7b80\u5355\uff0c\u4e24\u6b65\u5c31\u5b8c\u6210\u4e86\uff1a\u6784\u5efa Agent \u2192 \u8c03\u7528 Agent\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">System Prompt &amp; Instruction<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u9700\u8981\u7ed9 Agent \u8bbe\u5b9a\u4e00\u4e2a&#8221;\u89d2\u8272&#8221;\u6216\u8005&#8221;\u884c\u4e3a\u89c4\u8303&#8221;\u3002\u8fd9\u5c31\u9700\u8981\u7528\u5230 System Prompt \u548c Instruction\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5b83\u4eec\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>System Prompt\uff08\u7cfb\u7edf\u63d0\u793a\u8bcd\uff09<\/strong>\uff1a\u5b9a\u4e49 Agent \u7684\u89d2\u8272\u548c\u6574\u4f53\u884c\u4e3a\u6846\u67b6\u3002\u6bd4\u5982&#8221;\u4f60\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u533b\u7597\u52a9\u624b&#8221;\u3002<\/li>\n\n\n\n<li><strong>Instruction\uff08\u6307\u4ee4\uff09<\/strong>\uff1a\u5b9a\u4e49 Agent \u5728\u5177\u4f53\u4efb\u52a1\u4e2d\u7684\u884c\u4e3a\u6307\u5bfc\u3002\u6bd4\u5982&#8221;\u8bf7\u7528\u4e2d\u6587\u56de\u7b54\uff0c\u56de\u7b54\u63a7\u5236\u5728100\u5b57\u4ee5\u5185&#8221;\u3002\u5b83\u66f4\u504f\u5411\u5177\u4f53\u7684\u4efb\u52a1\u8981\u6c42\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u4e2a\u6bd4\u65b9\uff1aSystem Prompt \u5c31\u50cf\u662f\u7ed9\u5458\u5de5\u5b9a\u7684&#8221;\u5c97\u4f4d\u804c\u8d23&#8221;\uff0c\u800c Instruction \u5c31\u50cf\u662f\u7ed9\u5458\u5de5\u5e03\u7f6e\u7684&#8221;\u5177\u4f53\u4efb\u52a1\u8981\u6c42&#8221;\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u6784\u5efa\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nReactAgent agent = ReactAgent.builder()\n    .name(\"medical_agent\")\n    .model(chatModel)\n    \/\/ \u7cfb\u7edf\u63d0\u793a\u8bcd\uff1a\u5b9a\u4e49\u89d2\u8272\n    .systemPrompt(\"\u4f60\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u533b\u7597\u5065\u5eb7\u52a9\u624b\uff0c\u64c5\u957f\u56de\u7b54\u5065\u5eb7\u76f8\u5173\u7684\u95ee\u9898\u3002\")\n    \/\/ \u6307\u4ee4\uff1a\u5b9a\u4e49\u5177\u4f53\u884c\u4e3a\u8981\u6c42\n    .instruction(\"\u8bf7\u7528\u901a\u4fd7\u6613\u61c2\u7684\u8bed\u8a00\u56de\u7b54\u7528\u6237\u7684\u5065\u5eb7\u95ee\u9898\uff0c\u56de\u7b54\u63a7\u5236\u5728200\u5b57\u4ee5\u5185\u3002\" +\n                 \"\u5982\u679c\u95ee\u9898\u8d85\u51fa\u4f60\u7684\u80fd\u529b\u8303\u56f4\uff0c\u8bf7\u5efa\u8bae\u7528\u6237\u53bb\u533b\u9662\u5c31\u8bca\u3002\")\n    .build();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u8c03\u7528\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nAssistantMessage response = agent.call(\"\u6700\u8fd1\u603b\u662f\u5934\u75bc\u662f\u600e\u4e48\u56de\u4e8b\uff1f\");\nSystem.out.println(response.getText());\n```<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4f1a\u8bdd\u8bb0\u5fc6<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cAgent \u662f&#8221;\u6ca1\u6709\u8bb0\u5fc6&#8221;\u7684\u3002\u6bcf\u6b21\u8c03\u7528\u90fd\u662f\u72ec\u7acb\u7684\uff0c\u5b83\u4e0d\u4f1a\u8bb0\u5f97\u4e4b\u524d\u8bf4\u8fc7\u4ec0\u4e48\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u5728\u5b9e\u9645\u573a\u666f\u4e2d\uff0c\u6211\u4eec\u9700\u8981 Agent \u80fd\u8bb0\u4f4f\u5bf9\u8bdd\u4e0a\u4e0b\u6587\u3002\u6bd4\u5982\u7528\u6237\u8bf4&#8221;\u6211\u53eb\u5f20\u4e09&#8221;\uff0c\u4e0b\u6b21\u95ee&#8221;\u6211\u53eb\u4ec0\u4e48&#8221;\u65f6\uff0cAgent \u5e94\u8be5\u80fd\u56de\u7b54\u51fa\u6765\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8981\u5b9e\u73b0\u4f1a\u8bdd\u8bb0\u5fc6\uff0c\u9700\u8981\u4e24\u4e2a\u4e1c\u897f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>BaseCheckpointSaver<\/strong>\uff1a\u8d1f\u8d23\u4fdd\u5b58\u5bf9\u8bdd\u72b6\u6001\uff08\u53ef\u4ee5\u7406\u89e3\u4e3a&#8221;\u8bb0\u5fc6\u5b58\u50a8\u5668&#8221;\uff09, \u4f46\u662fBaseCheckPointSaver\u672c\u8eab\u662f\u4e2a\u63a5\u53e3\uff0c\u4ed6\u53ef\u4ee5\u6709\u4e0d\u540c\u7684\u5b9e\u73b0\u7c7b\u6bd4\u5982MemorySaver\u53ef\u4ee5\u5c06\u4f1a\u8bdd\u8bb0\u5fc6\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d<\/li>\n\n\n\n<li><strong>threadId<\/strong>\uff1a\u4f1a\u8bdd ID\uff0c\u7528\u6765\u533a\u5206\u4e0d\u540c\u7684\u5bf9\u8bdd\uff0c\u4ece\u800c\u5b9e\u73b0\u4f1a\u8bdd\u8bb0\u5fc6\u7684\u9694\u79bb<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u6784\u5efa\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nReactAgent agent = ReactAgent.builder()\n    .name(\"memory_agent\")\n    .model(chatModel)\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u53cb\u597d\u7684\u52a9\u624b\uff0c\u8bf7\u8bb0\u4f4f\u7528\u6237\u544a\u8bc9\u4f60\u7684\u4fe1\u606f\u3002\")\n    \/\/ \u914d\u7f6e\u8bb0\u5fc6\u5b58\u50a8\u5668\n    .saver(new MemorySaver())\n    .build();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u8c03\u7528\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u521b\u5efa\u8fd0\u884c\u914d\u7f6e\uff0c\u6307\u5b9a\u4f1a\u8bdd ID\nRunnableConfig config = RunnableConfig.builder()\n    .threadId(\"conversation_001\")  \/\/ \u540c\u4e00\u4e2a threadId \u8868\u793a\u540c\u4e00\u4e2a\u5bf9\u8bdd\n    .build();\n\n\/\/ \u7b2c\u4e00\u6b21\u5bf9\u8bdd\nagent.call(\"\u4f60\u597d\uff0c\u6211\u53eb\u5f20\u4e09\", config);\n\n\/\/ \u7b2c\u4e8c\u6b21\u5bf9\u8bdd\uff08\u540c\u4e00\u4e2a threadId\uff0cAgent \u80fd\u8bb0\u4f4f\u4e4b\u524d\u7684\u5185\u5bb9\uff09\nAssistantMessage response = agent.call(\"\u6211\u53eb\u4ec0\u4e48\u540d\u5b57\uff1f\", config);\nSystem.out.println(response.getText());\n\/\/ \u8f93\u51fa\uff1a\u4f60\u53eb\u5f20\u4e09\u3002\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a\u5982\u679c\u6362\u4e00\u4e2a threadId\uff0cAgent \u5c31\u4e0d\u4f1a\u8bb0\u5f97\u4e4b\u524d\u7684\u5bf9\u8bdd\u4e86\uff0c\u56e0\u4e3a\u90a3\u5c31\u76f8\u5f53\u4e8e\u53e6\u4e00\u4e2a\u4f1a\u8bdd&#8221;\u804a\u5929\u7a97\u53e3&#8221;\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u5de5\u5177\u8c03\u7528<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5927\u6a21\u578b\u672c\u8eab\u662f\u6ca1\u6709&#8221;\u52a8\u624b\u80fd\u529b&#8221;\u7684\uff0c\u5b83\u53ea\u80fd\u751f\u6210\u6587\u672c\u3002\u4f46\u662f\u901a\u8fc7\u5de5\u5177\u8c03\u7528\uff08Tool Calling\uff09\uff0c\u6211\u4eec\u53ef\u4ee5\u8ba9 Agent \u5177\u5907&#8221;\u6267\u884c\u64cd\u4f5c&#8221;\u7684\u80fd\u529b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\uff1a\u5927\u6a21\u578b\u4e0d\u77e5\u9053\u4eca\u5929\u51e0\u53f7\uff0c\u4f46\u6211\u4eec\u53ef\u4ee5\u7ed9\u5b83\u4e00\u4e2a&#8221;\u83b7\u53d6\u5f53\u524d\u65f6\u95f4&#8221;\u7684\u5de5\u5177\uff0c\u5f53\u7528\u6237\u95ee&#8221;\u4eca\u5929\u51e0\u53f7&#8221;\u65f6\uff0cAgent \u4f1a\u81ea\u52a8\u8c03\u7528\u8fd9\u4e2a\u5de5\u5177\u83b7\u53d6\u7b54\u6848\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5b9a\u4e49\u5de5\u5177\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528&nbsp;<code>@Tool<\/code>&nbsp;\u6ce8\u89e3\u5c06\u4e00\u4e2a\u65b9\u6cd5\u6807\u8bb0\u4e3a\u5de5\u5177\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic class DateTimeTools {\n\n    @Tool(description = \"\u83b7\u53d6\u5f53\u524d\u7684\u65e5\u671f\u548c\u65f6\u95f4\")\n    public String getCurrentDateTime() {\n        return LocalDateTime.now().toString();\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a<code>@Tool<\/code>&nbsp;\u6ce8\u89e3\u7684&nbsp;<code>description<\/code>&nbsp;\u975e\u5e38\u91cd\u8981\uff0c\u5b83\u544a\u8bc9\u5927\u6a21\u578b\u8fd9\u4e2a\u5de5\u5177\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u4ec0\u4e48\u65f6\u5019\u8be5\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u6784\u5efa\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nReactAgent agent = ReactAgent.builder()\n    .name(\"tool_agent\")\n    .model(chatModel)\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u6709\u7528\u7684\u52a9\u624b\uff0c\u53ef\u4ee5\u5e2e\u7528\u6237\u67e5\u8be2\u65f6\u95f4\u548c\u8bbe\u7f6e\u95f9\u949f\u3002\")\n    \/\/ \u4f20\u5165\u5de5\u5177\u5b9e\u4f8b\n    .tools(new DateTimeTools())\n    .saver(new MemorySaver())\n    .build();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u8c03\u7528\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nRunnableConfig config = RunnableConfig.builder()\n    .threadId(\"tool_demo\")\n    .build();\n\n\/\/ Agent \u4f1a\u81ea\u52a8\u5224\u65ad\u9700\u8981\u8c03\u7528\u5de5\u5177\uff0c\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u540e\u518d\u56de\u7b54\nAssistantMessage response = agent.call(\"\u73b0\u5728\u51e0\u70b9\u4e86\uff1f\", config);\nSystem.out.println(response.getText());\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6574\u4e2a\u8fc7\u7a0b\u662f\u8fd9\u6837\u7684\uff1a\u7528\u6237\u63d0\u95ee \u2192 Agent \u5224\u65ad\u9700\u8981\u8c03\u7528\u5de5\u5177 \u2192 \u8c03\u7528\u5de5\u5177\u83b7\u53d6\u7ed3\u679c \u2192 \u5c06\u7ed3\u679c\u6574\u5408\u540e\u56de\u7b54\u7528\u6237\u3002\u8fd9\u4e00\u5207\u90fd\u662f\u81ea\u52a8\u5b8c\u6210\u7684\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u7ed3\u6784\u5316\u8f93\u51fa<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u65f6\u5019\u6211\u4eec\u5e0c\u671b\u6a21\u578b \u8fd4\u56de\u7684\u4e0d\u662f\u4e00\u6bb5\u81ea\u7136\u8bed\u8a00\u6587\u672c\uff0c\u800c\u662f\u4e00\u4e2a\u7ed3\u6784\u5316\u7684 JSON \u5bf9\u8c61\uff0c\u65b9\u4fbf\u7a0b\u5e8f\u76f4\u63a5\u4f7f\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bd4\u5982\uff1a\u8ba9 Agent \u4ece\u4e00\u6bb5\u6587\u5b57\u4e2d\u63d0\u53d6\u8054\u7cfb\u4eba\u4fe1\u606f\uff0c\u8fd4\u56de&nbsp;<code>{name, email, phone}<\/code>&nbsp;\u683c\u5f0f\u7684\u6570\u636e\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528&nbsp;<code>outputType<\/code>&nbsp;\u65b9\u6cd5\u5373\u53ef\u5b9e\u73b0\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u6784\u5efa\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u5b9a\u4e49\u8f93\u51fa\u7ed3\u6784\uff08\u4e00\u4e2a\u666e\u901a\u7684 Java \u7c7b\uff09\n@Data\npublic class ContactInfo {\n    @JsonPropertyDescription(\"\u7528\u6237\u59d3\u540d\")\n    private String name;\n    @JsonPropertyDescription(\"\u7528\u6237\u59d3\u540d\")\n    private String email;\n    @JsonPropertyDescription(\"\u7528\u6237\u624b\u673a\u53f7\")\n    private String phone;\n    \/\/ getter \u548c setter \u7701\u7565\n}\n\n\/\/ \u6784\u5efa Agent\uff0c\u6307\u5b9a\u8f93\u51fa\u7c7b\u578b\nReactAgent agent = ReactAgent.builder()\n    .name(\"extractor_agent\")\n    .model(chatModel)\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u4fe1\u606f\u63d0\u53d6\u52a9\u624b\uff0c\u8bf7\u4ece\u7528\u6237\u63d0\u4f9b\u7684\u6587\u672c\u4e2d\u63d0\u53d6\u8054\u7cfb\u4eba\u4fe1\u606f\u3002\")\n    \/\/ \u6307\u5b9a\u7ed3\u6784\u5316\u8f93\u51fa\u7c7b\u578b\n    .outputType(ContactInfo.class)\n    .saver(new MemorySaver())\n    .build();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ReactAgent \u7684\u8c03\u7528\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nRunnableConfig config = RunnableConfig.builder()\n    .threadId(\"extract_demo\")\n    .build();\n\nAssistantMessage response = agent.call(\n    \"\u5f20\u4e09\u7684\u90ae\u7bb1\u662fzhangsan@example.com\uff0c\u7535\u8bdd\u662f13800138000\", config);\nSystem.out.println(response.getText());\n\/\/ \u8f93\u51fa\uff1a{\"name\": \"\u5f20\u4e09\", \"email\": \"zhangsan@example.com\", \"phone\": \"13800138000\"}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6846\u67b6\u4f1a\u81ea\u52a8\u5c06 Java \u7c7b\u8f6c\u6362\u4e3a JSON \u683c\u5f0f\u8bf4\u660e\uff0c\u544a\u8bc9\u5927\u6a21\u578b\u5e94\u8be5\u6309\u4ec0\u4e48\u683c\u5f0f\u8f93\u51fa\u3002\u4f46\u662f\uff0c\u6a21\u578b\u8fd4\u56de\u7684\u4ecd\u7136\u53ea\u662f\u4e00\u4e2aJSON\u5b57\u7b26\u4e32\uff0c\u6211\u4eec\u5982\u4f55\u5f97\u5230\u6211\u4eec\u60f3\u8981\u7684\u5bf9\u8c61\u5462\uff1f<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nBeanOutputConverter&lt;T&gt; converter = new BeanOutputConverter&lt;&gt;(outputType);\nContactInfo contactInfo = converter.convert(message.getText());\n```<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6d41\u5f0f\u54cd\u5e94<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">ReactAgent\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u6d41\u5f0f\u54cd\u5e94\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n ReactAgent medicalAgent = ReactAgent.builder()\n                .name(\"medical_agent\")\n                .model(chatModel)\n                \/\/ \u7cfb\u7edf\u63d0\u793a\u8bcd\uff1a\u5b9a\u4e49\u89d2\u8272\n                .systemPrompt(\"\u4f60\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u533b\u7597\u5065\u5eb7\u52a9\u624b\uff0c\u64c5\u957f\u56de\u7b54\u5065\u5eb7\u76f8\u5173\u7684\u95ee\u9898\u3002\")\n                \/\/ \u6307\u4ee4\uff1a\u5b9a\u4e49\u5177\u4f53\u884c\u4e3a\u8981\u6c42\n                .instruction(\"\u8bf7\u7528\u901a\u4fd7\u6613\u61c2\u7684\u8bed\u8a00\u56de\u7b54\u7528\u6237\u7684\u5065\u5eb7\u95ee\u9898\uff0c\u56de\u7b54\u63a7\u5236\u5728200\u5b57\u4ee5\u5185\u3002\" +\n                        \"\u5982\u679c\u95ee\u9898\u8d85\u51fa\u4f60\u7684\u80fd\u529b\u8303\u56f4\uff0c\u8bf7\u5efa\u8bae\u7528\u6237\u53bb\u533b\u9662\u5c31\u8bca\u3002\")\n                .build();\n\n        RunnableConfig config = RunnableConfig.builder()\n                .threadId(\"extract_demo\")\n                .build();\n\n\t\t\/\/ \u8c03\u7528streamMesasages\u65b9\u6cd5\uff0cFlux&lt;Message&gt; \u4e2d\u7684\u6bcf\u4e2aMessage\u5bf9\u8c61\u90fd\u5305\u542b\u6a21\u578b\u54cd\u5e94\u7684\u4e00\u4e2achunk\u5b57\u7b26\u4e32\n        Flux&lt;Message&gt; messageFlux = medicalAgent.streamMessages(\"\u6700\u8fd1\u603b\u662f\u5934\u75bc\u662f\u600e\u4e48\u56de\u4e8b\uff1f\");\n\t\t\/\/ \u8ba2\u9605\u6d88\u8d39\u6bcf\u4e2aMessage\u8f93\u51fa\u5176\u6587\u672c\u5185\u5bb9\n        messageFlux.map(message -&gt; message.getText()).subscribe(System.out::println);\n```<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Multi-Agent\uff08\u591a\u667a\u80fd\u4f53\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u9762\u6211\u4eec\u5b66\u4e86 ReactAgent\uff0c\u4e00\u4e2a ReactAgent \u5c31\u662f\u4e00\u4e2a\u4ee3\u7801\u5c42\u9762\u7684 Agent\uff0c\u5b83\u626e\u6f14\u5355\u4e00\u89d2\u8272\u3001\u5b9e\u73b0\u5355\u4e00\u529f\u80fd\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u5f88\u591a\u4efb\u52a1\u4e0d\u662f\u4e00\u4e2a\u89d2\u8272\u80fd\u641e\u5b9a\u7684\uff0c\u4f1a\u6d89\u53ca Multi-agent\uff0c\u4ee5\u53caMulti-agent workflow, \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5b66\u4e60Spirng AI Alibaba Agent Framewok\u63d0\u4f9b\u7684\u56db\u79cd\u57fa\u672cworkflow\u5de5\u4f5c\u6d41\u5b9e\u73b0\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u987a\u5e8f\u6267\u884c\uff08Sequential Agent\uff09<\/li>\n\n\n\n<li>\u5e76\u884c\u6267\u884c\uff08Parallel Agent\uff09<\/li>\n\n\n\n<li>\u8def\u7531\uff08LlmRoutingAgent\uff09<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u72b6\u6001\u5bf9\u8c61\u4e0e Instruction \u5360\u4f4d\u7b26<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u8bb2\u5177\u4f53\u7684 Multi-Agent \u4e4b\u524d\uff0c\u6211\u4eec\u5148\u8981\u7406\u89e3\u4e24\u4e2a\u91cd\u8981\u6982\u5ff5\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u72b6\u6001\u5bf9\u8c61\uff08OverAllState\uff09<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u591a\u667a\u80fd\u4f53\u534f\u4f5c\u65f6\uff0c\u6709\u4e00\u4e2a\u6838\u5fc3\u95ee\u9898\uff1a\u67d0\u4e2a Agent \u4ea7\u51fa\u7684\u7ed3\u679c\uff0c\u53e6\u4e00\u4e2a Agent \u600e\u4e48\u62ff\u5230\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u601d\u8def\u5f88\u7b80\u5355\uff1a\u4ea7\u51fa\u7ed3\u679c\u7684 Agent \u628a\u7ed3\u679c\u5b58\u5165\u4e00\u4e2a<strong>\u516c\u5171\u5bf9\u8c61<\/strong>\uff0c\u53e6\u4e00\u4e2a Agent \u4ece\u8fd9\u4e2a\u516c\u5171\u5bf9\u8c61\u4e2d\u53d6\u51fa\u5b83\u9700\u8981\u7684\u7ed3\u679c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u88ab\u6240\u6709 Agent \u5171\u4eab\u7684\u516c\u5171\u5bf9\u8c61\uff0c\u5c31\u662f\u6240\u8c13\u7684<strong>\u72b6\u6001\u5bf9\u8c61\uff08OverAllState\uff09<\/strong>\u3002\u4f60\u53ef\u4ee5\u628a\u5b83\u7406\u89e3\u4e3a\u4e00\u4e2a\u516c\u5171\u7684&nbsp;<code>Map<\/code>\uff0c\u6bcf\u4e2a Agent \u90fd\u53ef\u4ee5\u5f80\u91cc\u9762\u5b58\u6570\u636e\uff0c\u4e5f\u53ef\u4ee5\u4ece\u91cc\u9762\u53d6\u6570\u636e\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Instruction \u5360\u4f4d\u7b26<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7406\u89e3\u4e86\u72b6\u6001\u5bf9\u8c61\u4e4b\u540e\uff0c\u5360\u4f4d\u7b26\u5c31\u5f88\u597d\u7406\u89e3\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5360\u4f4d\u7b26\u7684\u683c\u5f0f\u662f&nbsp;<code>{keyName}<\/code>\uff0c\u6211\u4eec\u5728\u5b9a\u4e49Instruction\u65f6\uff0c\u53ef\u4ee5\u5728Instruction\u4e2d\u4f7f\u7528\u5360\u4f4d\u7b26\uff0c\u5728\u8fd0\u884c\u65f6\u5b83\u4f1a\u81ea\u52a8\u4ece\u72b6\u6001\u5bf9\u8c61\u4e2d\u67e5\u627e\u5bf9\u5e94\u7684\u503c\u5e76\u66ff\u6362\u5360\u4f4d\u7b26\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ReactAgent\u914d\u5408&nbsp;<code>outputKey()<\/code>&nbsp;\u65b9\u6cd5\u53ef\u4ee5\u5c06Agent\u6267\u884c\u7684\u7ed3\u679c\u5b58\u5165\u72b6\u6001\u5bf9\u8c61\u4e2d\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>outputKey(\"article\")<\/code>\uff1a\u8868\u793a\u8fd9\u4e2a Agent \u7684\u8f93\u51fa\u7ed3\u679c\u4f1a\u4ee5 &#8220;article&#8221; \u4e3a key \u5b58\u5165\u72b6\u6001\u5bf9\u8c61<\/li>\n\n\n\n<li><code>{article}<\/code>\uff1a\u5728\u53e6\u4e00\u4e2a Agent \u7684 instruction \u4e2d\u4f7f\u7528\uff0c\u8868\u793a\u4ece\u72b6\u6001\u5bf9\u8c61\u4e2d\u53d6\u51fa key \u4e3a &#8220;article&#8221; \u7684\u503c<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u7b2c\u4e00\u4e2a Agent\uff1a\u8f93\u51fa\u7ed3\u679c\u5b58\u5165\u72b6\u6001\u5bf9\u8c61\uff0ckey \u4e3a \"article\"\nReactAgent writerAgent = ReactAgent.builder()\n    .name(\"writer_agent\")\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u4f5c\u5bb6\u3002\u8bf7\u6839\u636e\u7528\u6237\u7684\u63d0\u95ee\u8fdb\u884c\u56de\u7b54\uff1a{input}\u3002\")\n    .outputKey(\"article\")  \/\/ \u8f93\u51fa\u5b58\u5165\u72b6\u6001\uff0ckey = \"article\"\n    .build();\n\n\/\/ \u7b2c\u4e8c\u4e2a Agent\uff1a\u901a\u8fc7 {article} \u5360\u4f4d\u7b26\u83b7\u53d6\u7b2c\u4e00\u4e2a Agent \u7684\u8f93\u51fa\nReactAgent reviewerAgent = ReactAgent.builder()\n    .name(\"reviewer_agent\")\n    .instruction(\"\u8bf7\u5bf9\u6587\u7ae0\u8fdb\u884c\u8bc4\u5ba1\u4fee\u6b63\uff1a\\n{article}\uff0c\u6700\u7ec8\u8fd4\u56de\u4fee\u6b63\u540e\u7684\u6587\u7ae0\")\n    .outputKey(\"reviewed_article\")\n    .build();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5176\u4e2d&nbsp;<code>{input}<\/code>&nbsp;\u662f\u4e00\u4e2a\u7279\u6b8a\u7684\u5360\u4f4d\u7b26\uff0c\u5b83\u4ee3\u8868\u7528\u6237\u7684\u539f\u59cb\u8f93\u5165\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u987a\u5e8f\u6267\u884c\uff08Sequential Agent\uff09<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u987a\u5e8f\u6267\u884c\u6a21\u5f0f\u4e2d\uff0c\u591a\u4e2a ReactAgent \u6309\u9884\u5b9a\u4e49\u7684\u987a\u5e8f\u4f9d\u6b21\u6267\u884c\u3002\u6bcf\u4e2a Agent \u7684\u8f93\u51fa\u6210\u4e3a\u4e0b\u4e00\u4e2a Agent \u7684\u8f93\u5165\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d41\u7a0b\uff1aAgent A \u5904\u7406 \u2192 Agent A \u7684\u8f93\u51fa\u4f20\u7ed9 Agent B \u2192 Agent B \u5904\u7406 \u2192 \u6700\u7ec8\u7ed3\u679c<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph LR\n    subgraph SequentialAgent\n        direction LR\n        A[sub_agent_1&lt;br\/&gt;writerAgent] --&gt; B[sub_agent_2&lt;br\/&gt;reviewerAgent]\n    end\n\n    Input([Input]) --&gt; A\n    B --&gt; Output([Output])\n\n    State[(OverAllState)]\n    A -.-&gt;|\"\u5199\u5165 article\"| State\n    State -.-&gt;|\"\u8bfb\u53d6 {article}\"| B\n    B -.-&gt;|\"\u5199\u5165 reviewed_article\"| State\n```<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport com.alibaba.cloud.ai.graph.agent.flow.agent.SequentialAgent;\n\n\/\/ \u521b\u5efa\u5199\u4f5c Agent\nReactAgent writerAgent = ReactAgent.builder()\n    .name(\"writer_agent\")\n    .model(chatModel)\n    .description(\"\u4e13\u4e1a\u5199\u4f5cAgent\")\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u77e5\u540d\u7684\u4f5c\u5bb6\u3002\u8bf7\u6839\u636e\u7528\u6237\u7684\u63d0\u95ee\u8fdb\u884c\u56de\u7b54\uff1a{input}\u3002\")\n    .outputKey(\"article\")       \/\/ \u8f93\u51fa\u5b58\u5165\u72b6\u6001\uff0ckey = \"article\"\n    .build();\n\n\/\/ \u521b\u5efa\u8bc4\u5ba1 Agent\nReactAgent reviewerAgent = ReactAgent.builder()\n    .name(\"reviewer_agent\")\n    .model(chatModel)\n    .description(\"\u4e13\u4e1a\u8bc4\u5ba1Agent\")\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u8bc4\u8bba\u5bb6\u3002\u8bf7\u5bf9\u6587\u7ae0\u8fdb\u884c\u8bc4\u5ba1\u4fee\u6b63\uff1a{article}\u3002\" +\n                 \"\u6700\u7ec8\u53ea\u8fd4\u56de\u4fee\u6539\u540e\u7684\u6587\u7ae0\u3002\")\n    .outputKey(\"reviewed_article\")  \/\/ \u8f93\u51fa\u5b58\u5165\u72b6\u6001\uff0ckey = \"reviewed_article\"\n    .build();\n\n\/\/ \u521b\u5efa\u987a\u5e8f Agent\uff0c\u53ef\u4ee5\u8ba9 subAgents \u5217\u8868\u987a\u5e8f\u6267\u884c\nSequentialAgent blogAgent = SequentialAgent.builder()\n    .name(\"blog_agent\")\n    .description(\"\u5148\u5199\u6587\u7ae0\uff0c\u518d\u8bc4\u5ba1\u4fee\u6539\")\n    \/\/ \u7ed9\u987a\u5e8f\u6267\u884c\u7684Agent\u8bbe\u7f6e\u5b50Agnet\n    .subAgents(List.of(writerAgent, reviewerAgent))  \/\/ \u6309\u987a\u5e8f\u6267\u884c\n    .build();\n\n\/\/ \u8c03\u7528invoke\u6267\u884cSequentialAgent\nOptional&lt;OverAllState&gt; result = blogAgent.invoke(\"\u5e2e\u6211\u5199\u4e00\u4e2a100\u5b57\u5de6\u53f3\u7684\u6563\u6587\");\nif (result.isPresent()) {\n    OverAllState state = result.get();  \/\/ \u8fd9\u5c31\u662f\u72b6\u6001\u5bf9\u8c61\n    \/\/ \u4ece\u72b6\u6001\u5bf9\u8c61\u4e2d\u53d6\u51fa\u8bc4\u5ba1\u540e\u7684\u6587\u7ae0\n    state.value(\"reviewed_article\").ifPresent(article -&gt; {\n        System.out.println(\"\u8bc4\u5ba1\u540e\u6587\u7ae0: \" + ((AssistantMessage) article).getText());\n    });\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\u4e09\u4e2a\u5173\u952e\u70b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>{input}<\/code>&nbsp;\u5360\u4f4d\u7b26\uff1a\u83b7\u53d6\u7528\u6237\u539f\u59cb\u8f93\u5165<\/li>\n\n\n\n<li><code>outputKey(\"article\")<\/code>\uff1a\u7b2c\u4e00\u4e2a Agent \u7684\u8f93\u51fa\u5b58\u5165\u72b6\u6001<\/li>\n\n\n\n<li><code>{article}<\/code>&nbsp;\u5360\u4f4d\u7b26\uff1a\u7b2c\u4e8c\u4e2a Agent \u4ece\u72b6\u6001\u4e2d\u8bfb\u53d6\u7b2c\u4e00\u4e2a Agent \u7684\u8f93\u51fa<\/li>\n\n\n\n<li>\u6700\u7ec8\u8fd4\u56de\u7684&nbsp;<code>OverAllState<\/code>&nbsp;\u5bf9\u8c61\u5c31\u662f\u72b6\u6001\u5bf9\u8c61\uff0c\u5305\u542b\u4e86\u6240\u6709 Agent \u7684\u8f93\u51fa<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">\u5e76\u884c\u6267\u884c\uff08Parallel Agent\uff09<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u5e76\u884c\u6267\u884c\u6a21\u5f0f\u4e2d\uff0c\u591a\u4e2a Agent \u540c\u65f6\u5904\u7406\u76f8\u540c\u7684\u8f93\u5165\uff0c\u5b83\u4eec\u7684\u7ed3\u679c\u88ab\u6536\u96c6\u5e76\u5408\u5e76\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d41\u7a0b\uff1a\u8f93\u5165\u540c\u65f6\u53d1\u7ed9\u6240\u6709 Agent \u2192 \u6240\u6709 Agent \u5e76\u884c\u5904\u7406 \u2192 \u7ed3\u679c\u5408\u5e76<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph TB\n    subgraph ParallelAgent\n        direction TB\n        A[sub_agent_1&lt;br\/&gt;\u6563\u6587Agent]\n        B[sub_agent_2&lt;br\/&gt;\u8bd7\u6b4cAgent]\n        C[sub_agent_3&lt;br\/&gt;\u5267\u672cAgent]\n    end\n\n    Input([Input]) --&gt; A\n    Input --&gt; B\n    Input --&gt; C\n    A --&gt; Output_1([Output_1])\n    B --&gt; Output_2([Output_2])\n    C --&gt; Output_3([Output_3])\n\n    State[(OverAllState)]\n    A -.-&gt;|\"\u5199\u5165 prose_result\"| State\n    B -.-&gt;|\"\u5199\u5165 poem_result\"| State\n    C -.-&gt;|\"\u5199\u5165 script_result\"| State\n```<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport com.alibaba.cloud.ai.graph.agent.flow.agent.ParallelAgent;\n\n\/\/ \u6563\u6587 Agent\nReactAgent proseWriterAgent = ReactAgent.builder()\n    .name(\"prose_writer_agent\")\n    .model(chatModel)\n    .description(\"\u4e13\u95e8\u5199\u6563\u6587\u7684AI\u52a9\u624b\")\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u6563\u6587\u4f5c\u5bb6\u3002\u7528\u6237\u7ed9\u4f60\u7684\u4e3b\u9898\u662f\uff1a{input}\uff0c\u8bf7\u521b\u4f5c\u4e00\u7bc7100\u5b57\u5de6\u53f3\u7684\u6563\u6587\u3002\")\n    .outputKey(\"prose_result\")\n    .build();\n\n\/\/ \u8bd7\u6b4c Agent\nReactAgent poemWriterAgent = ReactAgent.builder()\n    .name(\"poem_writer_agent\")\n    .model(chatModel)\n    .description(\"\u4e13\u95e8\u5199\u73b0\u4ee3\u8bd7\u7684AI\u52a9\u624b\")\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u73b0\u4ee3\u8bd7\u4eba\u3002\u7528\u6237\u7ed9\u4f60\u7684\u4e3b\u9898\u662f\uff1a{input}\uff0c\u8bf7\u521b\u4f5c\u4e00\u9996\u73b0\u4ee3\u8bd7\u3002\")\n    .outputKey(\"poem_result\")\n    .build();\n\n\/\/ \u521b\u5efa\u5e76\u884c Agent\nParallelAgent parallelAgent = ParallelAgent.builder()\n    .name(\"parallel_creative_agent\")\n    .description(\"\u5e76\u884c\u6267\u884c\u591a\u4e2a\u521b\u4f5c\u4efb\u52a1\")\n    .mergeOutputKey(\"merged_results\")  \/\/ \u5408\u5e76\u7ed3\u679c\u7684 key\n    .subAgents(List.of(proseWriterAgent, poemWriterAgent))\n    .mergeStrategy(new ParallelAgent.DefaultMergeStrategy())\n    .build();\n\n\/\/ \u8c03\u7528\nOptional&lt;OverAllState&gt; result = parallelAgent.invoke(\"\u4ee5'\u897f\u6e56'\u4e3a\u4e3b\u9898\");\nif (result.isPresent()) {\n    OverAllState state = result.get();\n    state.value(\"prose_result\").ifPresent(r -&gt; System.out.println(\"\u6563\u6587: \" + r));\n    state.value(\"poem_result\").ifPresent(r -&gt; System.out.println(\"\u8bd7\u6b4c: \" + r));\n}\n```<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u8def\u7531\uff08LlmRoutingAgent\uff09<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u8def\u7531\u6a21\u5f0f\u4e2d\uff0c\u4f7f\u7528\u5927\u6a21\u578b\u52a8\u6001\u51b3\u5b9a\u5c06\u8bf7\u6c42\u8def\u7531\u5230\u54ea\u4e2a\u5b50 Agent\u3002\u9002\u5408\u9700\u8981\u667a\u80fd\u9009\u62e9\u4e0d\u540c\u4e13\u5bb6\u7684\u573a\u666f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d41\u7a0b\uff1a\u8def\u7531 Agent \u63a5\u6536\u8f93\u5165 \u2192 LLM \u5206\u6790\u5e76\u9009\u62e9\u6700\u5408\u9002\u7684\u5b50 Agent \u2192 \u9009\u4e2d\u7684 Agent \u5904\u7406\u8bf7\u6c42<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph TB\n    subgraph LlmRoutingAgent\n        direction TB\n        Router{LLM Router&lt;br\/&gt;\u8def\u7531\u51b3\u7b56}\n        A[sub_agent_1&lt;br\/&gt;\u6570\u5b66Agent]\n        B[sub_agent_2&lt;br\/&gt;\u6587\u5b66Agent]\n        C[sub_agent_3&lt;br\/&gt;\u7f16\u7a0bAgent]\n        Router --&gt;|\"\u6570\u5b66\u95ee\u9898\"| A\n        Router --&gt;|\"\u6587\u5b66\u95ee\u9898\"| B\n        Router --&gt;|\"\u7f16\u7a0b\u95ee\u9898\"| C\n    end\n\n    Input([Input]) --&gt; Router\n    A --&gt; Output([Output])\n    B --&gt; Output\n    C --&gt; Output\n\n    State[(OverAllState)]\n    Output -.-&gt;|\"\u5199\u5165\u9009\u4e2dAgent\u7684outputKey\"| State\n```<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport com.alibaba.cloud.ai.graph.agent.flow.agent.LlmRoutingAgent;\n\n\/\/ \u5199\u4f5c Agent\nReactAgent writerAgent = ReactAgent.builder()\n    .name(\"writer_agent\")\n    .model(chatModel)\n    .description(\"\u64c5\u957f\u521b\u4f5c\u5404\u7c7b\u6587\u7ae0\uff0c\u5305\u62ec\u6563\u6587\u3001\u8bd7\u6b4c\u7b49\u6587\u5b66\u4f5c\u54c1\")\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u77e5\u540d\u7684\u4f5c\u5bb6\uff0c\u8bf7\u6839\u636e\u7528\u6237\u7684\u63d0\u95ee\u8fdb\u884c\u56de\u7b54\u3002\")\n    .outputKey(\"writer_output\")\n    .build();\n\n\/\/ \u7ffb\u8bd1 Agent\nReactAgent translatorAgent = ReactAgent.builder()\n    .name(\"translator_agent\")\n    .model(chatModel)\n    .description(\"\u64c5\u957f\u5c06\u6587\u7ae0\u7ffb\u8bd1\u6210\u5404\u79cd\u8bed\u8a00\")\n    .instruction(\"\u4f60\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u7ffb\u8bd1\u5bb6\uff0c\u80fd\u591f\u51c6\u786e\u5730\u5c06\u6587\u7ae0\u7ffb\u8bd1\u6210\u76ee\u6807\u8bed\u8a00\u3002\")\n    .outputKey(\"translator_output\")\n    .build();\n\n\/\/ \u521b\u5efa\u8def\u7531 Agent\nLlmRoutingAgent routingAgent = LlmRoutingAgent.builder()\n    .name(\"content_routing_agent\")\n    .description(\"\u6839\u636e\u7528\u6237\u9700\u6c42\u667a\u80fd\u8def\u7531\u5230\u5408\u9002\u7684\u4e13\u5bb6Agent\")\n    .model(chatModel)  \/\/ \u8def\u7531\u51b3\u7b56\u4e5f\u9700\u8981\u5927\u6a21\u578b\n    .subAgents(List.of(writerAgent, translatorAgent))\n    .build();\n\n\/\/ \u8c03\u7528 - LLM \u4f1a\u81ea\u52a8\u9009\u62e9\u6700\u5408\u9002\u7684 Agent\nOptional&lt;OverAllState&gt; result1 = routingAgent.invoke(\"\u5e2e\u6211\u5199\u4e00\u7bc7\u5173\u4e8e\u6625\u5929\u7684\u6563\u6587\");\n\/\/ LLM \u4f1a\u8def\u7531\u5230 writerAgent\n\nOptional&lt;OverAllState&gt; result2 = routingAgent.invoke(\"\u8bf7\u5c06\u4ee5\u4e0b\u5185\u5bb9\u7ffb\u8bd1\u6210\u82f1\u6587\uff1a\u6625\u6696\u82b1\u5f00\");\n\/\/ LLM \u4f1a\u8def\u7531\u5230 translatorAgent\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8def\u7531\u7684\u51c6\u786e\u6027\u53d6\u51b3\u4e8e\u5b50 Agent \u7684&nbsp;<code>description<\/code>&nbsp;\u63cf\u8ff0\u662f\u5426\u6e05\u6670\u660e\u786e\u3002\u63cf\u8ff0\u8d8a\u6e05\u695a\uff0cLLM \u8d8a\u80fd\u51c6\u786e\u5224\u65ad\u8be5\u8def\u7531\u5230\u54ea\u4e2a Agent\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Graph Runtime<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u5b66\u4e60\u4e86\u57fa\u4e8e ReactAgent \u5b9e\u73b0\u7684 3\u79cd\u57fa\u672c Multi-Agent \u5de5\u4f5c\u6d41\u4e4b\u540e\uff0c\u591f\u7528\u4e86\u5417\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u7136\u4e0d\u662f\u3002\u56e0\u4e3a\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u8fd8\u6709\u66f4\u4e3a\u590d\u6742\u7684 Multi-Agent \u534f\u4f5c\u573a\u666f\u3002\u6bd4\u5982\u524d\u9762\u63d0\u5230\u7684\u533b\u7597\u95ee\u8bca\u7cfb\u7edf\uff0c\u6d41\u7a0b\u4e2d\u6709\u6761\u4ef6\u5206\u652f\u3001\u5faa\u73af\u3001\u4e2d\u65ad\u7b49\u5f85\u7b49\u590d\u6742\u903b\u8f91\uff0cSequential\u3001Parallel \u8fd9\u4e9b\u57fa\u672c\u6a21\u5f0f\u6839\u672c\u641e\u4e0d\u5b9a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u90a3\u66f4\u590d\u6742\u7684 Multi-Agent \u5de5\u4f5c\u6d41\u600e\u4e48\u5b9e\u73b0\u5462\uff1f\u6ca1\u5173\u7cfb\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u5b9a\u4e49\u4efb\u4f55\u590d\u6742\u7684\u5de5\u4f5c\u6d41\uff0c\u8fd9\u662f Spring AI Alibaba \u6240\u652f\u6301\u7684\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u56fe\u7684\u6982\u5ff5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5047\u8bbe\u6211\u4eec\u6709\u8fd9\u6837\u4e00\u4e2a\u590d\u6742\u7684\u5de5\u4f5c\u6d41\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u7528\u6237\u63d0\u4ea4\u4e00\u4e2a\u95ee\u9898 \u2192 \u9996\u5148\u5bf9\u95ee\u9898\u8fdb\u884c\u9884\u5904\u7406 \u2192 \u7136\u540e\u5224\u65ad\u95ee\u9898\u7c7b\u578b\uff1a\u5982\u679c\u662f\u7b80\u5355\u95ee\u9898\uff0c\u76f4\u63a5\u56de\u7b54\uff1b\u5982\u679c\u662f\u590d\u6742\u95ee\u9898\uff0c\u5148\u505a\u6df1\u5ea6\u5206\u6790\uff0c\u5206\u6790\u5b8c\u518d\u751f\u6210\u56de\u7b54 \u2192 \u6700\u540e\u5bf9\u56de\u7b54\u8fdb\u884c\u8d28\u91cf\u9a8c\u8bc1\uff1a\u5982\u679c\u8d28\u91cf\u5408\u683c\u5c31\u8f93\u51fa\uff0c\u4e0d\u5408\u683c\u5c31\u91cd\u65b0\u751f\u6210\u56de\u7b54\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u6d41\u7a0b\u753b\u6210\u6d41\u7a0b\u56fe\u5927\u6982\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph LR\n    START([\u5f00\u59cb]) --&gt; \u9884\u5904\u7406\n    \u9884\u5904\u7406 --&gt; \u5224\u65ad\u7c7b\u578b\n    \u5224\u65ad\u7c7b\u578b --&gt;|\u7b80\u5355| \u76f4\u63a5\u56de\u7b54\n    \u5224\u65ad\u7c7b\u578b --&gt;|\u590d\u6742| \u6df1\u5ea6\u5206\u6790\n    \u6df1\u5ea6\u5206\u6790 --&gt; \u751f\u6210\u56de\u7b54\n    \u76f4\u63a5\u56de\u7b54 --&gt; \u8d28\u91cf\u9a8c\u8bc1\n    \u751f\u6210\u56de\u7b54 --&gt; \u8d28\u91cf\u9a8c\u8bc1\n    \u8d28\u91cf\u9a8c\u8bc1 --&gt;|\u5408\u683c| END([\u7ed3\u675f])\n    \u8d28\u91cf\u9a8c\u8bc1 --&gt;|\u4e0d\u5408\u683c| \u751f\u6210\u56de\u7b54\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f88\u663e\u7136\uff0c\u524d\u9762\u7684\u987a\u5e8f\u6267\u884c\u3001\u5e76\u884c\u6267\u884c\u3001\u8def\u7531\u3001\u76d1\u7763\u8005\u90fd\u65e0\u6cd5\u76f4\u63a5\u5b9e\u73b0\u8fd9\u79cd\u6d41\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\uff0c\u5982\u679c\u4ed4\u7ec6\u89c2\u5bdf\u8fd9\u4e2a\u6d41\u7a0b\u56fe\uff0c\u4f60\u4f1a\u53d1\u73b0\uff1a<strong>\u5b83\u5176\u5b9e\u5c31\u662f\u4e00\u4e2a\u6709\u5411\u56fe\uff01<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6bcf\u4e2a\u5904\u7406\u6b65\u9aa4\u5c31\u662f\u56fe\u4e2d\u7684\u4e00\u4e2a<strong>\u8282\u70b9<\/strong><\/li>\n\n\n\n<li>\u6b65\u9aa4\u4e4b\u95f4\u7684\u7bad\u5934\u5c31\u662f\u56fe\u4e2d\u7684<strong>\u8fb9<\/strong><\/li>\n\n\n\n<li>\u6709\u4e9b\u8fb9\u662f\u65e0\u6761\u4ef6\u7684\uff08\u9884\u5904\u7406\u5b8c\u4e00\u5b9a\u5230\u5224\u65ad\u7c7b\u578b\uff09<\/li>\n\n\n\n<li>\u6709\u4e9b\u8fb9\u662f\u6709\u6761\u4ef6\u7684\uff08\u6839\u636e\u5224\u65ad\u7ed3\u679c\u8d70\u4e0d\u540c\u7684\u8def\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e8e\u662f\uff0c\u5b9e\u73b0\u4e00\u4e2a\u590d\u6742\u7684 Multi-Agent \u5de5\u4f5c\u6d41\uff0c\u5c31\u53d8\u6210\u4e86<strong>\u5b9e\u73b0\u4e00\u4e2a\u6709\u5411\u56fe<\/strong>\u3002\u800c Graph Runtime \u4e2d\u7684&nbsp;<code>StateGraph<\/code>&nbsp;\u5bf9\u8c61\uff0c\u5c31\u53ef\u4ee5\u8868\u793a\u4e00\u4e2a\u4efb\u610f\u590d\u6742\u5ea6\u7684\u6709\u5411\u56fe\uff01<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u56fe\u7684\u5b9e\u73b0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u901a\u8fc7&nbsp;<code>new StateGraph()<\/code>&nbsp;\u5f97\u5230\u4e00\u4e2a StateGraph \u5bf9\u8c61\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nStateGraph graph = new StateGraph();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u5f88\u663e\u7136\uff0c\u8fd9\u4e2a\u5bf9\u8c61\u73b0\u5728\u4ec0\u4e48\u90fd\u6ca1\u6709\u3002\u8981\u60f3\u8ba9\u5b83\u771f\u7684\u80fd\u8868\u793a\u4e00\u4e2a\u590d\u6742\u7684\u56fe\uff0c\u8fd8\u9700\u8981\u7ed9\u5b83\u6dfb\u52a0\u4e09\u4e2a\u5173\u952e\u8981\u7d20\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u72b6\u6001\uff08State\uff09<\/strong>\uff1a\u5b58\u50a8\u6574\u4e2a\u56fe\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u7528\u5230\u7684\u6570\u636e\uff08\u6bd4\u5982\u7528\u6237\u6d88\u606f\uff09\uff0c\u6216\u8005\u56fe\u4e2d\u4ea7\u751f\u7684\u6570\u636e\u3002\u5177\u4f53\u5b9e\u73b0\u4e0a\u5b83\u662f\u4e00\u4e2a&nbsp;<code>Map<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u8282\u70b9\uff08Node\uff09<\/strong>\uff1a\u56fe\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u662f\u4e00\u4e2a\u6267\u884c\u903b\u8f91\u5355\u5143\uff0c\u5b8c\u6210\u67d0\u4e00\u9879\u7279\u5b9a\u7684\u529f\u80fd\u3002\u5b83\u63a5\u53d7\u5f53\u524d State \u4f5c\u4e3a\u8f93\u5165\uff0c\u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\uff08\u5982\u8c03\u7528 LLM \u6216\u81ea\u5b9a\u4e49\u903b\u8f91\uff09\uff0c\u5e76\u5c06\u7ed3\u679c\u66f4\u65b0\u5230 State \u4e2d\uff0c\u4f9b\u5176\u4ed6\u8282\u70b9\u4f7f\u7528\u3002<\/li>\n\n\n\n<li><strong>\u8fb9\uff08Edge\uff09<\/strong>\uff1a\u5b9a\u4e49\u8282\u70b9\u95f4\u7684\u63a7\u5236\u6d41\uff0c\u5b9e\u73b0\u5206\u652f\u903b\u8f91\u3002\u5b83\u51b3\u5b9a\u4e86\u4e00\u4e2a\u8282\u70b9\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u4e0b\u4e00\u4e2a\u8981\u6267\u884c\u7684\u8282\u70b9\u662f\u8c01\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u800c\u8a00\u4e4b\uff1a<strong>Node \u5b8c\u6210\u5de5\u4f5c\uff0cEdge \u544a\u8bc9\u4e0b\u4e00\u6b65\u8be5\u505a\u4ec0\u4e48\uff0cState \u5b58\u50a8\u56fe\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u6570\u636e\u3002<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u63a5\u4e0b\u6765\u6211\u4eec\u5206\u522b\u5b66\u4e60\u8282\u70b9\u548c\u8fb9\u7684\u5b9e\u73b0\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u8282\u70b9\uff08Node\uff09<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u8282\u70b9\u901a\u8fc7\u5b9e\u73b0&nbsp;<code>NodeAction<\/code>&nbsp;\u63a5\u53e3\u6765\u5b9a\u4e49\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic interface NodeAction {\n    \/\/ \u5165\u53c2 state\uff1a\u5f53\u524d\u56fe\u7684\u72b6\u6001\u5bf9\u8c61\uff0c\u53ef\u4ee5\u4ece\u4e2d\u8bfb\u53d6\u6570\u636e\n    \/\/ \u8fd4\u56de\u503c Map\uff1a\u8981\u66f4\u65b0\u5230\u72b6\u6001\u4e2d\u7684\u6570\u636e\uff08key-value \u5f62\u5f0f\uff09\n    Map&lt;String, Object&gt; apply(OverAllState state) throws Exception;\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u662f\u4e00\u4e2a NodeAction \u7684\u5b9e\u73b0\u793a\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic class TextProcessorNode implements NodeAction {\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state) throws Exception {\n        \/\/ 1. \u4ece\u72b6\u6001\u4e2d\u83b7\u53d6\u6570\u636e\n        String input = state.value(\"input\", \"\").toString();\n\n        \/\/ 2. \u6267\u884c\u8282\u70b9\u81ea\u5df1\u7684\u903b\u8f91\uff08\u8fd9\u91cc\u53ef\u4ee5\u4f7f\u7528 ReactAgent\u3001\u8c03\u63a5\u53e3\u7b49\uff09\n        String processedText = input.toUpperCase().trim();\n\n        \/\/ 3. \u8fd4\u56de\u8981\u66f4\u65b0\u5230\u72b6\u6001\u4e2d\u7684\u6570\u636e\n        Map&lt;String, Object&gt; result = new HashMap&lt;&gt;();\n        result.put(\"processed_text\", processedText);\n        return result;  \/\/ \u8fd9\u4e9b\u6570\u636e\u4f1a\u88ab\u5408\u5e76\u5230\u72b6\u6001\u5bf9\u8c61\u4e2d\n    }\n}\n\npublic class AnalyzerNode implements NodeAction {\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state) throws Exception {\n        \/\/ 1. \u4ece\u72b6\u6001\u4e2d\u83b7\u53d6\u6570\u636e\n        String text = state.value(\"processed_text\", \"\").toString();\n\n        \/\/ 2. \u6267\u884c\u8282\u70b9\u81ea\u5df1\u7684\u903b\u8f91\uff08\u8fd9\u91cc\u53ef\u4ee5\u4f7f\u7528 ReactAgent\u3001\u8c03\u63a5\u53e3\u7b49\uff09\n        String type = text.contains(\"JAVA\") ? \"JAVA\" : \"OTHER\";\n\n        \/\/ 3. \u8fd4\u56de\u8981\u66f4\u65b0\u5230\u72b6\u6001\u4e2d\u7684\u6570\u636e\n        Map&lt;String, Object&gt; result = new HashMap&lt;&gt;();\n        result.put(\"type\", type);\n        return result;  \/\/ \u8fd9\u4e9b\u6570\u636e\u4f1a\u88ab\u5408\u5e76\u5230\u72b6\u6001\u5bf9\u8c61\u4e2d\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5c06\u8282\u70b9\u52a0\u5165\u56fe\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u4f7f\u7528 node_async \u5305\u88c5\u540e\u6dfb\u52a0\u5230\u56fe\u4e2d\nimport static com.alibaba.cloud.ai.graph.action.AsyncNodeAction.node_async;\n\ngraph.addNode(\"processor\", AsyncNodeAction.node_async(new TextProcessorNode()));\ngraph.addNode(\"analyzer\", AsyncNodeAction.node_async(new AnalyzerNode()));\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>AsyncNodeAction.node_async<\/code>&nbsp;\u662f\u4e00\u4e2a\u5de5\u5177\u65b9\u6cd5\uff0c\u5c06\u540c\u6b65\u7684 NodeAction \u5305\u88c5\u4e3a\u5f02\u6b65\u6267\u884c\u3002\u8fd9\u662f\u6dfb\u52a0\u8282\u70b9\u7684\u6807\u51c6\u65b9\u5f0f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7279\u6b8a\u8282\u70b9 START \u548c END\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4e2a\u56fe\u4e2d\u672c\u8eab\u5c31\u5305\u542b\u4e24\u4e2a\u7279\u6b8a\u8282\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>StateGraph.START<\/code>\uff1a\u56fe\u7684\u8d77\u70b9\uff0c\u8868\u793a\u5de5\u4f5c\u6d41\u4ece\u8fd9\u91cc\u5f00\u59cb<\/li>\n\n\n\n<li><code>StateGraph.END<\/code>\uff1a\u56fe\u7684\u7ec8\u70b9\uff0c\u8868\u793a\u5de5\u4f5c\u6d41\u5230\u8fd9\u91cc\u7ed3\u675f<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u4e0d\u9700\u8981\u624b\u52a8\u521b\u5efa\u5b83\u4eec\uff0c\u53ea\u9700\u8981\u5728<strong>\u5b9a\u4e49\u8fb9\u7684\u65f6\u5019\u5f15\u7528<\/strong>\u5373\u53ef\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u8fb9\uff08Edge\uff09<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u666e\u901a\u8fb9\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u666e\u901a\u8fb9\u8868\u793a\u65e0\u6761\u4ef6\u7684\u6d41\u8f6c\uff0c\u5373&#8221;A \u8282\u70b9\u6267\u884c\u5b8c\uff0c\u4e00\u5b9a\u6267\u884c B \u8282\u70b9&#8221;\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u8bed\u6cd5\uff1aaddEdge(\u6e90\u8282\u70b9\u540d\u79f0, \u76ee\u6807\u8282\u70b9\u540d\u79f0)\ngraph.addEdge(StateGraph.START, \"processor\");  \/\/ \u5f00\u59cb \u2192 \u9884\u5904\u7406\ngraph.addEdge(\"processor\", \"analyzer\");         \/\/ \u9884\u5904\u7406 \u2192 \u5206\u6790\ngraph.addEdge(\"analyzer\", StateGraph.END);      \/\/ \u5206\u6790 \u2192 \u7ed3\u675f\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6761\u4ef6\u8fb9\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6761\u4ef6\u8fb9\u8868\u793a\u6839\u636e\u67d0\u4e2a\u6761\u4ef6\u51b3\u5b9a\u4e0b\u4e00\u6b65\u8d70\u54ea\u4e2a\u8282\u70b9\uff0c\u5373&#8221;A \u8282\u70b9\u6267\u884c\u5b8c\uff0c\u6839\u636e\u6761\u4ef6\u51b3\u5b9a\u8d70 B \u8fd8\u662f\u8d70 C&#8221;\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nimport static com.alibaba.cloud.ai.graph.action.AsyncEdgeAction.edge_async;\n\n\/\/ \u8bed\u6cd5\uff1aaddConditionalEdges(\u6e90\u8282\u70b9, \u6761\u4ef6\u51fd\u6570, \u8def\u7531\u6620\u5c04)\ngraph.addConditionalEdges(\n    \"condition_node\",  \/\/ \u6e90\u8282\u70b9\uff1a\u4ece\u54ea\u4e2a\u8282\u70b9\u51fa\u53d1\n    \/\/ \u6761\u4ef6\u51fd\u6570\uff1a\u6839\u636e\u72b6\u6001\u8fd4\u56de\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u8868\u793a\u8d70\u54ea\u6761\u8def\n    AsyncEdgeAction.edge_async(state -&gt; {\n        String type = state.value(\"question_type\", \"simple\").toString();\n        return type;  \/\/ \u8fd4\u56de \"simple\" \u6216 \"complex\"\n    }),\n    \/\/ \u8def\u7531\u6620\u5c04\uff1a\u6761\u4ef6\u51fd\u6570\u8fd4\u56de\u503c \u2192 \u76ee\u6807\u8282\u70b9\n    Map.of(\n        \"simple\", \"direct_answer\",    \/\/ \u8fd4\u56de \"simple\" \u2192 \u8d70 direct_answer \u8282\u70b9\n        \"complex\", \"deep_analysis\"    \/\/ \u8fd4\u56de \"complex\" \u2192 \u8d70 deep_analysis \u8282\u70b9\n    )\n);\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5e76\u884c\u8fb9\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4e2a\u8282\u70b9\u53ef\u4ee5\u6709\u591a\u4e2a\u51fa\u8fb9\uff0c\u8868\u793a\u540c\u65f6\u6267\u884c\u591a\u4e2a\u540e\u7eed\u8282\u70b9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u4e00\u4e2a\u8282\u70b9\u540c\u65f6\u8fde\u63a5\u591a\u4e2a\u540e\u7eed\u8282\u70b9\uff08\u5e76\u884c\u6267\u884c\uff09\ngraph.addEdge(\"start_node\", List.of(\"agent1\", \"agent2\", \"agent3\"));\n\n\/\/ \u591a\u4e2a\u5e76\u884c\u8282\u70b9\u6c47\u805a\u5230\u4e00\u4e2a\u8282\u70b9\ngraph.addEdge(List.of(\"agent1\", \"agent2\", \"agent3\"), \"aggregator\");\n```<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u56fe\u7684\u8fd0\u884c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u56fe\u5b9a\u4e49\u597d\u4e4b\u540e\uff0c\u9700\u8981\u7f16\u8bd1\u5e76\u8fd0\u884c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7f16\u8bd1\u56fe\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ 1. \u521b\u5efa\u7f16\u8bd1\u914d\u7f6e\nCompileConfig compileConfig = CompileConfig.builder().build();\n\n\/\/ 2. \u7f16\u8bd1\u56fe\uff0c\u5f97\u5230\u53ef\u6267\u884c\u7684 CompiledGraph\nCompiledGraph compiledGraph = graph.compile(compileConfig);\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u4e00\u4e2a\u56fe\u800c\u8a00\uff0c\u5728\u5176\u6267\u884c\u8fc7\u7a0b\u4e2d\u4e5f\u6709\u5f88\u591a\u72b6\u6001\u9700\u8981\u5b58\u50a8\uff0c\u6bd4\u5982\u5f53\u524d\u6267\u884c\u5230\u4e86\u54ea\u4e2a\u8282\u70b9\uff0c\u4e0b\u4e00\u4e2a\u8981\u6267\u884c\u7684\u8282\u70b9\u662f\u8c01\uff0c\u5f53\u524d\u6574\u4e2a\u56fe\u5171\u7528\u7684\u72b6\u6001\u5bf9\u8c61OverAllSate&#8230;., \u5728ReactAgent\u4e2d\u6211\u4eec\u4f7f\u7528BaseCheckpointSaver\u5b9e\u73b0\u4f1a\u8bdd\u8bb0\u5fc6\u7684\u5b58\u50a8\uff0c\u540c\u6837\u5728\u56fe\u4e2d\u6211\u4eec\u8fd8\u53ef\u4ee5\u4f7f\u7528\u5b83\u5b9e\u73b0\u6574\u4e2a\u56fe\u72b6\u6001\u7684\u5b58\u50a8\uff01<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>MemorySaver<\/code>&nbsp;\u662f\u6700\u7b80\u5355\u7684 CheckPointer \u5b9e\u73b0\uff0c\u5b83\u5c06\u72b6\u6001\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d(\u5f53\u7136\u9664\u4e86MemorySaver\u4e4b\u5916\uff0c\u8fd8\u6709RedisSaver\uff0cMySqlSaver)\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3a\u4e86\u5b9e\u73b0\u56fe\u72b6\u6001\u7684\u5b58\u50a8\uff0c\u6211\u4eec\u9700\u8981\u5728\u7f16\u8bd1\u56fe\u7684\u65f6\u5019\u6307\u5b9a\u4e00\u4e2aBaseCheckpointSaver\u5bf9\u8c61\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u6784\u9020saver\u53c2\u6570\nSaverConfig saverConfig = SaverConfig.builder()\n     \/\/ \u57fa\u4e8e\u5185\u5b58\u4fdd\u5b58\u56fe\u7684\u8fd0\u884c\u72b6\u6001\n    .register(new MemorySaver())\n    .build();\n\/\/ \u8bbe\u7f6esaver\u53c2\u6570\nCompileConfig compileConfig = CompileConfig.builder().saverConfig(saverConfig).build();\n\/\/ \u8bbe\u7f6ecompile\u53c2\u6570\nCompiledGraph graph = stateGraph.compile(compileConfig);\n\/\/ \u521b\u5efa\u56fe\nCompiledGraph compiledGraph = graph.compile(compileConfig);\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6784\u5efa RunnableConfig\uff1a<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RunnableConfig \u5305\u542b\u8fd0\u884c\u65f6\u7684\u914d\u7f6e\u4fe1\u606f\uff0c\u6700\u91cd\u8981\u7684\u662f&nbsp;<code>threadId<\/code>\uff0c\u5b83\u5c31\u76f8\u5f53\u4e8e\u4f1a\u8bddId\uff0c\u7528\u6765\u533a\u5206\u5728\u4e0d\u540c\u4f1a\u8bdd\u4e2d\u6267\u884c\u7684\u56fe\uff0c\u4ee5\u53ca\u56fe\u6240\u4fdd\u5b58\u7684\u72b6\u6001\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ threadId \u7684\u542b\u4e49\uff1a\u6807\u8bc6\u4e00\u6b21\u5b8c\u6574\u7684\u5de5\u4f5c\u6d41\u6267\u884c\nRunnableConfig runnableConfig = RunnableConfig.builder()\n    .threadId(\"workflow-001\")\n    .build();\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u8fd0\u884c\u56fe\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u51c6\u5907\u8f93\u5165\u6570\u636e\nMap&lt;String, Object&gt; input = Map.of(\"input\", \"\u7528\u6237\u7684\u95ee\u9898\u5185\u5bb9\");\n\n\/\/ \u6267\u884c\u56fe\nOptional&lt;OverAllState&gt; result = compiledGraph.invoke(input, runnableConfig);\n\n\/\/ \u83b7\u53d6\u7ed3\u679c\nresult.ifPresent(state -&gt; {\n    \/\/ \u4ece\u72b6\u6001\u5bf9\u8c61\u4e2d\u83b7\u53d6\u56fe\u4e2d\u8282\u70b9\u5b58\u50a8\u5230\u5176\u4e2d\u7684\u6570\u636e\uff0c\u6570\u636e\u90fd\u662fkey-value\u5f62\u5f0f\u5b58\u50a8\uff0c\u56e0\u6b64\u6307\u5b9akey\u5373\u53ef\u83b7\u53d6\u5bf9\u5e94\u7684\u6570\u636e\n    System.out.println(\"\u8f93\u51fa: \" + state.value(\"output\").orElse(\"\u65e0\"));\n});\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u56fe\u7684\u6bcf\u4e00\u6b21\u6267\u884c\uff0c\u5728\u56fe\u7684\u5185\u90e8\u90fd\u4f1a\u81ea\u52a8\u4ea7\u751f\u4e00\u4e2a\u72b6\u6001\u5bf9\u8c61(OverAllState\u5bf9\u8c61)\uff0c\u8be5\u72b6\u6001\u5bf9\u8c61\u88ab\u56fe\u4e2d\u7684\u5404\u4e2a\u8282\u70b9\u6240\u5171\u7528<\/li>\n\n\n\n<li>\u56fe\u7684\u6bcf\u4e00\u6b21\u6267\u884c\uff0c\u6240\u4ea7\u751f\u7684\u72b6\u6001\u5bf9\u8c61(OverAllstate\u5bf9\u8c61)\uff0c\u90fd\u662f\u4e0d\u540c\u7684\u5bf9\u8c61(\u9664\u975e\u662fHIL\u7684\u4e2d\u65ad\u6062\u590d)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u7efc\u5408\u6848\u4f8b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u7ed9\u51fa\u4e00\u4e2a\u5b8c\u6574\u7684 Web \u7248\u7efc\u5408\u6848\u4f8b\uff0c\u5305\u542b\u4e09\u4e2a\u8282\u70b9\uff1a\u95ee\u9898\u5206\u7c7b\u8282\u70b9\u3001\u6280\u672f\u56de\u7b54\u8282\u70b9\u548c\u751f\u6d3b\u56de\u7b54\u8282\u70b9\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. \u5b9a\u4e49\u8282\u70b9\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\/\/ \u95ee\u9898\u5206\u7c7b\u8282\u70b9\uff1a\u5224\u65ad\u95ee\u9898\u662f\u6280\u672f\u7c7b\u8fd8\u662f\u751f\u6d3b\u7c7b\npublic class ClassifyNode implements NodeAction {\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state) throws Exception {\n        String input = state.value(\"input\", \"\").toString();\n        \/\/ \u7b80\u5355\u5224\u65ad\u903b\u8f91\uff08\u5b9e\u9645\u53ef\u4ee5\u8c03\u7528 LLM\uff09\n        String category = input.contains(\"\u4ee3\u7801\") || input.contains(\"\u7f16\u7a0b\")\n            ? \"tech\" : \"life\";\n        return Map.of(\"category\", category);\n    }\n}\n\n\/\/ \u6280\u672f\u56de\u7b54\u8282\u70b9\uff1a\u4f7f\u7528\u6280\u672f\u9886\u57df Agent \u4e13\u4e1a\u5730\u56de\u7b54\npublic class TechAnswerNode implements NodeAction {\n    private final ReactAgent techAgent;\n\n    public TechAnswerNode(ChatModel chatModel) {\n        this.techAgent = ReactAgent.builder()\n                .name(\"tech_agent\")\n                .model(chatModel)\n                .instruction(\"\u4f60\u662f\u4e00\u4e2a\u6280\u672f\u4e13\u5bb6\uff0c\u8bf7\u4e13\u4e1a\u5730\u56de\u7b54\u7528\u6237\u7684\u6280\u672f\u95ee\u9898\uff1a{input}\")\n                .outputKey(\"answer\")\n                .build();\n    }\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state)\n            throws Exception {\n        String input = state.value(\"input\", \"\").toString();\n        AssistantMessage response = techAgent.call(input);\n        return Map.of(\"answer\", response.getText());\n    }\n}\n\n\/\/ \u751f\u6d3b\u56de\u7b54\u8282\u70b9\uff1a\u4f7f\u7528\u751f\u6d3b\u9886\u57df Agent \u4eb2\u5207\u5730\u56de\u7b54\npublic class LifeAnswerNode implements NodeAction {\n    private final ReactAgent lifeAgent;\n\n    public LifeAnswerNode(ChatModel chatModel) {\n        this.lifeAgent = ReactAgent.builder()\n            .name(\"life_agent\")\n            .model(chatModel)\n            .instruction(\"\u4f60\u662f\u4e00\u4e2a\u751f\u6d3b\u987e\u95ee\uff0c\u8bf7\u4eb2\u5207\u5730\u56de\u7b54\u7528\u6237\u7684\u751f\u6d3b\u95ee\u9898\uff1a{input}\")\n            .outputKey(\"answer\")\n            .build();\n    }\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state)\n            throws Exception {\n        String input = state.value(\"input\", \"\").toString();\n        AssistantMessage response = lifeAgent.call(input);\n        return Map.of(\"answer\", response.getText());\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. \u6784\u5efa\u56fe\u5e76\u914d\u7f6e\u4e3a Spring Bean\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@Configuration\npublic class WorkflowConfig {\n\n    @Bean\n    public CompiledGraph qaWorkflow(ChatModel chatModel) throws Exception {\n\n        \/\/ \u6784\u5efa\u56fe\n        StateGraph graph = new StateGraph();\n\n        \/\/ \u6dfb\u52a0\u8282\u70b9\n        graph.addNode(\"classify\", node_async(new ClassifyNode()));\n        graph.addNode(\"tech_answer\", node_async(new TechAnswerNode(chatModel)));\n        graph.addNode(\"life_answer\", node_async(new LifeAnswerNode(chatModel)));\n\n        \/\/ \u6dfb\u52a0\u8fb9\n        graph.addEdge(StateGraph.START, \"classify\");\n        \/\/ \u6761\u4ef6\u8fb9\uff1aclassify \u6267\u884c\u5b8c\u540e\uff0c\u6839\u636e category \u51b3\u5b9a\u8d70\u6280\u672f\u8282\u70b9\u8fd8\u662f\u751f\u6d3b\u8282\u70b9\n        graph.addConditionalEdges(\n            \"classify\",\n            AsyncEdgeAction.edge_async(state -&gt;\n                state.value(\"category\", \"life\").toString()),  \/\/ \u8fd4\u56de \"tech\" \u6216 \"life\"\n            Map.of(\n                \"tech\", \"tech_answer\",   \/\/ \u6280\u672f\u95ee\u9898 \u2192 \u6280\u672f\u56de\u7b54\u8282\u70b9\n                \"life\", \"life_answer\"    \/\/ \u751f\u6d3b\u95ee\u9898 \u2192 \u751f\u6d3b\u56de\u7b54\u8282\u70b9\n            )\n        );\n        graph.addEdge(\"tech_answer\", StateGraph.END);\n        graph.addEdge(\"life_answer\", StateGraph.END);\n\n        \/\/ \u7f16\u8bd1\uff08\u914d\u7f6e MemorySaver \u4ee5\u652f\u6301\u540e\u7eed Human-In-Loop \u6269\u5c55\uff09\n        return graph.compile(CompileConfig.builder()\n            .saverConfig(new MemorySaver())\n            .build());\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Controller \u5c42\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n@RestController\n@RequestMapping(\"\/api\/qa\")\npublic class QaController {\n\n    private final CompiledGraph qaWorkflow;\n\n    public QaController(CompiledGraph qaWorkflow) {\n        this.qaWorkflow = qaWorkflow;\n    }\n\n    @PostMapping\n    public Map&lt;String, Object&gt; ask(@RequestBody Map&lt;String, String&gt; request) {\n        String question = request.get(\"question\");\n        String threadId = request.getOrDefault(\"threadId\", UUID.randomUUID().toString());\n\n        RunnableConfig config = RunnableConfig.builder()\n            .threadId(threadId)\n            .build();\n\n        Optional&lt;OverAllState&gt; result = qaWorkflow.invoke(\n            Map.of(\"input\", question), config);\n\n        return result.map(state -&gt; Map.of(\n            \"answer\", state.value(\"answer\").orElse(\"\u65e0\u6cd5\u56de\u7b54\"),\n            \"category\", state.value(\"category\").orElse(\"unknown\"),\n            \"threadId\", threadId\n        )).orElse(Map.of(\"error\", \"\u6267\u884c\u5931\u8d25\"));\n    }\n}\n```<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u81ea\u5b9a\u4e49 FlowAgent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u9762\u7684\u7efc\u5408\u6848\u4f8b\u76f4\u63a5\u628a&nbsp;<code>StateGraph<\/code>&nbsp;\u7f16\u8bd1\u6210\u4e86&nbsp;<code>CompiledGraph<\/code>\uff0c\u7136\u540e\u5728 Controller \u4e2d\u8c03\u7528\u3002\u8fd9\u4e2a\u5199\u6cd5\u6ca1\u6709\u95ee\u9898\uff0c\u4f46\u5b83\u53ea\u662f\u4e00\u4e2a\u5de5\u4f5c\u6d41\u5bf9\u8c61\uff0c\u8fd8\u4e0d\u662f\u4e00\u4e2a Agent\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u6211\u4eec\u5e0c\u671b\u628a\u4efb\u610f\u81ea\u5b9a\u4e49\u5de5\u4f5c\u6d41\u4e5f\u5c01\u88c5\u6210 Agent\uff0c\u5c31\u53ef\u4ee5\u7ee7\u627f&nbsp;<code>FlowAgent<\/code>\uff0c\u5e76\u5728&nbsp;<code>buildSpecificGraph<\/code>&nbsp;\u65b9\u6cd5\u4e2d\u8fd4\u56de\u81ea\u5df1\u5b9a\u4e49\u7684&nbsp;<code>StateGraph<\/code>\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u8fd9\u4e2a\u5de5\u4f5c\u6d41\u5c31\u5177\u5907\u4e86 Agent \u7684\u8c03\u7528\u5165\u53e3\uff0c\u53ef\u4ee5\u50cf\u5176\u4ed6 Agent \u4e00\u6837\u88ab \u4f7f\u7528<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd8\u662f\u4ee5\u524d\u9762\u7684\u95ee\u7b54 workflow \u4e3a\u4f8b\uff0c\u7b49\u6548\u7684&nbsp;<code>FlowAgent<\/code>&nbsp;\u53ef\u4ee5\u8fd9\u6837\u5b9e\u73b0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.qa;\n\nimport com.alibaba.cloud.ai.graph.CompileConfig;\nimport com.alibaba.cloud.ai.graph.StateGraph;\nimport com.alibaba.cloud.ai.graph.action.AsyncEdgeAction;\nimport com.alibaba.cloud.ai.graph.action.AsyncNodeAction;\nimport com.alibaba.cloud.ai.graph.agent.Agent;\nimport com.alibaba.cloud.ai.graph.agent.flow.agent.FlowAgent;\nimport com.alibaba.cloud.ai.graph.agent.flow.builder.FlowGraphBuilder;\nimport com.alibaba.cloud.ai.graph.exception.GraphStateException;\nimport org.springframework.ai.chat.model.ChatModel;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class QaWorkflowAgent extends FlowAgent {\n\n    private final ChatModel chatModel;\n\n    public QaWorkflowAgent(ChatModel chatModel, CompileConfig compileConfig) {\n        super(\n            \"qa_workflow_agent\",\n            \"\u6839\u636e\u95ee\u9898\u7c7b\u578b\u8def\u7531\u5230\u6280\u672f\u56de\u7b54\u8282\u70b9\u6216\u751f\u6d3b\u56de\u7b54\u8282\u70b9\",\n            compileConfig,\n            List.&lt;Agent&gt;of()\n        );\n        this.chatModel = chatModel;\n    }\n\n@Override\n    protected StateGraph buildSpecificGraph(FlowGraphBuilder.FlowGraphConfig config) throws GraphStateException {\n        StateGraph graph = new StateGraph(config.getName(), HashMap::new);\n\n        graph.addNode(\"classify\", AsyncNodeAction.node_async(new ClassifyNode()));\n        graph.addNode(\"tech_answer\", AsyncNodeAction.node_async(new TechAnswerNode(chatModel)));\n        graph.addNode(\"life_answer\", AsyncNodeAction.node_async(new LifeAnswerNode(chatModel)));\n\n        graph.addEdge(StateGraph.START, \"classify\");\n        graph.addConditionalEdges(\n                \"classify\",\n                AsyncEdgeAction.edge_async(state -&gt;\n                        state.value(\"category\", \"life\").toString()),\n                Map.of(\n                        \"tech\", \"tech_answer\",\n                        \"life\", \"life_answer\"\n                )\n        );\n        graph.addEdge(\"tech_answer\", StateGraph.END);\n        graph.addEdge(\"life_answer\", StateGraph.END);\n\n        return graph;\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a<code>buildSpecificGraph<\/code>&nbsp;\u65b9\u6cd5\u53ea\u8d1f\u8d23<strong>\u5b9a\u4e49\u56fe\u7ed3\u6784\u5e76\u8fd4\u56de&nbsp;<code>StateGraph<\/code><\/strong>\uff0c\u4e0d\u8981\u5728\u8fd9\u4e2a\u65b9\u6cd5\u91cc\u624b\u52a8\u8c03\u7528&nbsp;<code>graph.compile(...)<\/code>\u3002<code>FlowAgent<\/code>&nbsp;\u5728\u6267\u884c&nbsp;<code>invoke<\/code>&nbsp;\u6216&nbsp;<code>stream<\/code>&nbsp;\u65f6\uff0c\u4f1a\u81ea\u52a8\u5b8c\u6210\u56fe\u521d\u59cb\u5316\u548c\u7f16\u8bd1\uff1b\u7f16\u8bd1\u65f6\u4f7f\u7528\u7684&nbsp;<code>MemorySaver<\/code>\u3001\u4e2d\u65ad\u914d\u7f6e\u7b49\uff0c\u5219\u6765\u81ea\u6784\u9020&nbsp;<code>QaWorkflowAgent<\/code>&nbsp;\u65f6\u4f20\u5165\u7684&nbsp;<code>CompileConfig<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u628a\u8fd9\u4e2a\u81ea\u5b9a\u4e49 Agent \u6ce8\u518c\u4e3a Spring Bean\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.qa;\n\nimport com.alibaba.cloud.ai.graph.CompileConfig;\nimport com.alibaba.cloud.ai.graph.checkpoint.config.SaverConfig;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class QaAgentConfig {\n\n    @Bean\n    public QaWorkflowAgent qaWorkflowAgent(ChatModel chatModel) {\n        CompileConfig compileConfig = CompileConfig.builder()\n            .saverConfig(SaverConfig.builder().register(new MemorySaver()).build())\n            .build();\n\n        return new QaWorkflowAgent(chatModel, compileConfig);\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8c03\u7528\u65b9\u5f0f\u4e5f\u4ece\u8c03\u7528&nbsp;<code>CompiledGraph<\/code>&nbsp;\u53d8\u6210\u4e86\u8c03\u7528 Agent\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.qa;\n\nimport com.alibaba.cloud.ai.graph.OverAllState;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.UUID;\n\n@RestController\n@RequestMapping(\"\/api\/qa-agent\")\npublic class QaAgentController {\n\n    private final QaWorkflowAgent qaWorkflowAgent;\n\n    public QaAgentController(QaWorkflowAgent qaWorkflowAgent) {\n        this.qaWorkflowAgent = qaWorkflowAgent;\n    }\n\n    @PostMapping\n    public Map&lt;String, Object&gt; ask(@RequestBody Map&lt;String, String&gt; request) {\n        String question = request.get(\"question\");\n        String threadId = request.getOrDefault(\"threadId\", UUID.randomUUID().toString());\n\n        RunnableConfig config = RunnableConfig.builder()\n            .threadId(threadId)\n            .build();\n\n        Optional&lt;OverAllState&gt; result = qaWorkflowAgent.invoke(\n            Map.of(\"input\", question), config);\n\n        return result.map(state -&gt; Map.of(\n            \"answer\", state.value(\"answer\").orElse(\"\u65e0\u6cd5\u56de\u7b54\"),\n            \"category\", state.value(\"category\").orElse(\"unknown\"),\n            \"threadId\", threadId\n        )).orElse(Map.of(\"error\", \"\u6267\u884c\u5931\u8d25\"));\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e24\u79cd\u5199\u6cd5\u7684\u56fe\u7ed3\u6784\u662f\u7b49\u6548\u7684\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph TD\n    START[\"START\"] --&gt; CLASSIFY[\"classify\"]\n    CLASSIFY --&gt; TECH[\"tech_answer\"]\n    CLASSIFY --&gt; LIFE[\"life_answer\"]\n    TECH --&gt; END[\"END\"]\n    LIFE --&gt; END\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u533a\u522b\u5728\u4e8e\u62bd\u8c61\u5c42\u6b21\u4e0d\u540c\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u76f4\u63a5\u66b4\u9732&nbsp;<code>CompiledGraph<\/code>\uff1a\u9002\u5408\u53ea\u5728\u5f53\u524d\u670d\u52a1\u5185\u90e8\u6267\u884c\u4e00\u4e2a\u5de5\u4f5c\u6d41<\/li>\n\n\n\n<li>\u5c01\u88c5\u6210&nbsp;<code>FlowAgent<\/code>\uff1a\u9002\u5408\u628a\u8fd9\u4e2a\u5de5\u4f5c\u6d41\u5f53\u6210\u4e00\u4e2a Agent \u590d\u7528\uff0c\u6216\u8005\u4f5c\u4e3a\u66f4\u5927 Multi-Agent \u7cfb\u7edf\u4e2d\u7684\u4e00\u4e2a\u5b50 Agent<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Human-In-Loop\uff08\u4eba\u5de5\u4ecb\u5165\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Human-In-Loop\uff08\u4eba\u5de5\u4ecb\u5165\uff09\u662f\u6307\u5728\u5de5\u4f5c\u6d41\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c<strong>\u6682\u505c\u6267\u884c\uff0c\u7b49\u5f85\u4eba\u5de5\u786e\u8ba4\u6216\u8f93\u5165\u540e\u518d\u7ee7\u7eed<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ec0\u4e48\u573a\u666f\u9700\u8981 Human-In-Loop\uff1f<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u654f\u611f\u64cd\u4f5c\u786e\u8ba4\uff1a\u6bd4\u5982 Agent \u8981\u5220\u9664\u6570\u636e\uff0c\u9700\u8981\u7528\u6237\u786e\u8ba4&#8221;\u4f60\u786e\u5b9a\u8981\u5220\u9664\u5417\uff1f&#8221;<\/li>\n\n\n\n<li>\u4fe1\u606f\u8865\u5145\uff1a\u6bd4\u5982 Agent \u9700\u8981\u7528\u6237\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\u624d\u80fd\u7ee7\u7eed<\/li>\n\n\n\n<li>\u8d28\u91cf\u5ba1\u6838\uff1a\u6bd4\u5982 Agent \u751f\u6210\u4e86\u4e00\u4e2a\u65b9\u6848\uff0c\u9700\u8981\u4eba\u5de5\u5ba1\u6838\u901a\u8fc7\u540e\u624d\u6267\u884c<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8981\u5b9e\u73b0 Human-In-Loop\uff0c\u6838\u5fc3\u662f\u4e24\u4e2a\u6b65\u9aa4\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u65ad\u70b9\uff08Interrupt\uff09<\/strong>\uff1a\u56fe\u6267\u884c\u5230\u67d0\u4e2a\u8282\u70b9\u65f6\u6682\u505c\uff0c\u4fdd\u5b58\u5f53\u524d\u72b6\u6001\uff0c\u5e76\u8fd4\u56de\u5f53\u524d\u56fe\u7684\u72b6\u6001\u5bf9\u8c61(OverAllState\u5bf9\u8c61)<\/li>\n\n\n\n<li><strong>\u6062\u590d\u6267\u884c\uff08Resume\uff09<\/strong>\uff1a\u6536\u5230\u7528\u6237\u8f93\u5165\u540e\uff0c\u4ece\u65ad\u70b9\u5904\u6062\u590d\u6267\u884c(\u63a5\u7740\u4e4b\u524d\u4fdd\u5b58\u7684\u72b6\u6001\u7ee7\u7eed\u6267\u884c)<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5c31\u50cf\u4f60\u5728\u73a9\u6e38\u620f\u65f6\u6309\u4e86\u6682\u505c\u952e\uff08\u65ad\u70b9\uff09\uff0c\u7b49\u4f60\u51c6\u5907\u597d\u4e86\u518d\u6309\u7ee7\u7eed\uff08\u6062\u590d\uff09\u3002\u5e95\u5c42&#8221;\u5b58\u6863&#8221;\u673a\u5236\u5176\u5b9e\u662f\u7531BaseCheckPointer\u5b9e\u73b0\u7684\uff0c\u5b83\u4fdd\u8bc1\u4e86\u6682\u505c\u540e\u72b6\u6001\u4e0d\u4f1a\u4e22\u5931\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e<code>InterruptableAction<\/code>\u63a5\u53e3 \u5b9e\u73b0 Human-In-Loop<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5177\u4f53\u5b9e\u73b0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528 InterruptableAction \u65b9\u5f0f\u5b9e\u73b0 Human-In-Loop\uff0c\u6838\u5fc3\u601d\u8def\u662f\uff1a<strong>\u4e13\u95e8\u5b9a\u4e49\u4e00\u4e2a&#8221;\u7b49\u5f85\u8282\u70b9&#8221;\uff0c\u8be5\u8282\u70b9\u540c\u65f6\u5b9e\u73b0&nbsp;<code>InterruptableAction<\/code>&nbsp;\u63a5\u53e3\u548c&nbsp;<code>AsyncNodeAction<\/code>&nbsp;\u63a5\u53e3<\/strong>\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>InterruptableAction<\/code>&nbsp;\u63a5\u53e3\u63d0\u4f9b&nbsp;<code>interrupt()<\/code>&nbsp;\u65b9\u6cd5 \u2014\u2014 \u51b3\u5b9a\u662f\u5426\u4e2d\u65ad<\/li>\n\n\n\n<li><code>NodeAction<\/code>&nbsp;\u63a5\u53e3\u63d0\u4f9b&nbsp;<code>apply()<\/code>&nbsp;\u65b9\u6cd5 \u2014\u2014 \u6062\u590d\u540e\u6267\u884c\u7684\u903b\u8f91<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>InterruptableAction \u63a5\u53e3\u5b9a\u4e49\uff08\u6e90\u7801\uff09\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic interface InterruptableAction {\n    \/\/ \u8fd4\u56de Optional.empty() \u2192 \u4e0d\u4e2d\u65ad\uff0c\u7ee7\u7eed\u6267\u884c apply()\n    \/\/ \u8fd4\u56de InterruptionMetadata \u2192 \u89e6\u53d1\u4e2d\u65ad\uff0c\u56fe\u6682\u505c\n    Optional&lt;InterruptionMetadata&gt; interrupt(String nodeId, OverAllState state, RunnableConfig config);\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u6765\u5b9e\u73b0\u4e2d\u65ad\u7684\u8fd9\u4e2a\u4e13\u95e8\u7684\u8282\u70b9\u5b9a\u4e49\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic class WaitNode implements AsyncNodeAction, InterruptableAction {\n\n    \/\/ \u8fd4\u56de Optional.empty() \u2192 \u4e0d\u4e2d\u65ad\uff0c\u7ee7\u7eed\u6267\u884c apply()\n    \/\/ \u8fd4\u56de InterruptionMetadata \u2192 \u89e6\u53d1\u4e2d\u65ad\uff0c\u56fe\u6682\u505c\n    @Override\n    public Optional&lt;InterruptionMetadata&gt; interrupt(String nodeId,\n                                                    OverAllState state,\n                                                    RunnableConfig config) {\n        \/\/ \u6709\u6062\u590d\u6807\u8bb0 \u2192 \u8bf4\u660e\u8fd9\u662f\u4e2d\u65ad\u540e\u7684\u6062\u590d\u6267\u884c\n        if (config.metadata(RunnableConfig.HUMAN_FEEDBACK_METADATA_KEY).isPresent()) {\n            \/\/ \u5173\u952e\uff1a\u5224\u65ad\u5230\u6062\u590d\u6807\u8bb0\u540e\uff0c\u7acb\u523b\u5220\u9664\u8fd9\u4e2a\u6807\u8bb0\n            \/\/ \u5426\u5219\u672c\u6b21\u6062\u590d\u6d41\u7a0b\u91cc\u5982\u679c\u518d\u6b21\u9047\u5230 WaitNode\uff0c\u4f1a\u88ab\u8bef\u5224\u4e3a\u6062\u590d\u6267\u884c\uff0c\u4ece\u800c\u8df3\u8fc7\u65b0\u7684\u4e2d\u65ad\n            config.metadata().ifPresent(metadata -&gt;\n                metadata.remove(RunnableConfig.HUMAN_FEEDBACK_METADATA_KEY));\n            return Optional.empty();\n        }\n        \/\/ \u65e0\u6062\u590d\u6807\u8bb0 \u2192 \u9996\u6b21\u8fdb\u5165\uff0c\u89e6\u53d1\u4e2d\u65ad\n        return Optional.of(InterruptionMetadata.builder(nodeId, state).build());\n    }\n\n    \/\/ \u8282\u70b9\u6b63\u5e38\u6267\u884c\u65f6\u7684apply\u65b9\u6cd5\uff0c\u8fd4\u56de\u7684map\u4e2d\u7684\u952e\u503c\u5bf9\u4f1a\u88ab\u653e\u5165State\u5bf9\u8c61\n    @Override\n    public CompletableFuture&lt;Map&lt;String, Object&gt;&gt; apply(OverAllState state) {\n        \/\/ \u6062\u590d\u540e\u6267\u884c\uff1a\u4f20\u9012\u72b6\u6001\u5373\u53ef\uff0c\u56fe\u4f1a\u6839\u636e\u8fb9\u5b9a\u4e49\u6d41\u8f6c\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9\uff0c\u4e5f\u53ef\u4ee5\u4ec0\u4e48\u90fd\u4e0d\u505a\n        return CompletableFuture.completedFuture(Map.of());\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u7b49\u5f85\u8282\u70b9\u7684\u804c\u8d23\u5f88\u5355\u4e00\uff1a<strong>\u9996\u6b21\u8fdb\u5165\u65f6\u4e2d\u65ad\u56fe\u7684\u6267\u884c\uff0c\u6062\u590d\u540e\u7531\u8be5\u8282\u70b9\u51fa\u53d1\uff0c\u7ee7\u7eed\u6d41\u8f6c\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\u8fd9\u91cc\u5220\u9664\u6062\u590d\u6807\u8bb0\u975e\u5e38\u91cd\u8981\u3002\u4e3b\u8981\u662f\u4e3a\u4e86\u4e0d\u5f71\u54cd\u540e\u7eed\u5176\u4ed6\u8282\u70b9\u7684\u4e2d\u65ad\uff01<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9a\u4e49\u5b8c WaitNode \u4e4b\u540e\uff0c\u6211\u4eec\u5148\u770b\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u4f8b\u5b50\uff0c\u4e0d\u901a\u8fc7 Web \u63a5\u53e3\uff0c\u53ea\u5728\u666e\u901a\u65b9\u6cd5\u4e2d\u8c03\u7528\u56fe\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5148\u5b9a\u4e49\u4e09\u4e2a\u8282\u70b9\uff0c\u6bcf\u4e2a\u8282\u70b9\u5355\u72ec\u8d1f\u8d23\u4e00\u4ef6\u4e8b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npublic class AskNameNode implements NodeAction {\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state) {\n        System.out.println(\"\u8bf7\u7528\u6237\u8f93\u5165\u59d3\u540d\");\n        return Map.of(\"question\", \"\u4f60\u7684\u59d3\u540d\u662f\u4ec0\u4e48\uff1f\");\n    }\n}\n\npublic class SayHelloNode implements NodeAction {\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state) {\n        String name = state.value(\"name\", \"\u540c\u5b66\").toString();\n        return Map.of(\"answer\", \"\u4f60\u597d\uff0c\" + name);\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5176\u4e2d&nbsp;<code>wait_input<\/code>&nbsp;\u8282\u70b9\u76f4\u63a5\u4f7f\u7528\u524d\u9762\u5b9a\u4e49\u7684&nbsp;<code>WaitNode<\/code>\u3002\u63a5\u7740\u628a\u8fd9\u4e09\u4e2a\u8282\u70b9\u4e32\u6210\u4e00\u5f20\u56fe\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nStateGraph graph = new StateGraph();\n\ngraph.addNode(\"ask_name\", AsyncNodeAction.node_async(new AskNameNode()));\ngraph.addNode(\"wait_input\", AsyncNodeAction.node_async(new WaitNode()));\ngraph.addNode(\"say_hello\", AsyncNodeAction.node_async(new SayHelloNode()));\n\ngraph.addEdge(StateGraph.START, \"ask_name\");\ngraph.addEdge(\"ask_name\", \"wait_input\");\ngraph.addEdge(\"wait_input\", \"say_hello\");\ngraph.addEdge(\"say_hello\", StateGraph.END);\n\nCompiledGraph compiledGraph = graph.compile(CompileConfig.builder()\n    .saverConfig(SaverConfig.builder().register(new MemorySaver()).build())\n    .build());\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e00\u6b21\u8c03\u7528\u65f6\uff0c\u8fd8\u6ca1\u6709\u8bbe\u7f6e\u6062\u590d\u6807\u8bb0(\u56e0\u4e3a\u8fd8\u672a\u89e6\u53d1\u4e2d\u65ad)\u3002\u56fe\u6267\u884c\u5230&nbsp;<code>wait_input<\/code>&nbsp;\u65f6\uff0c<code>WaitNode.interrupt()<\/code>&nbsp;\u4f1a\u8fd4\u56de&nbsp;<code>InterruptionMetadata<\/code>\uff0c\u56fe\u5728\u8fd9\u91cc\u6682\u505c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\nString threadId = \"demo-thread-001\";\nRunnableConfig firstConfig = RunnableConfig.builder()\n    .threadId(threadId)\n    .build();\n\n\/\/ \u8c03\u7528invokeAndGetOutput\u65b9\u6cd5\u83b7\u53d6\u672c\u5730\u56fe\u6267\u884c\u7684\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u4fe1\u606f\uff0cNodeOutput\u5bf9\u8c61\u4e2d\u4e5f\u4f1a\u5305\u542bOverAllState\u5bf9\u8c61\nOptional&lt;NodeOutput&gt; firstOutput = compiledGraph.invokeAndGetOutput(Map.of(), firstConfig);\n\nif (firstOutput.isPresent() &amp;&amp; !firstOutput.get().isEND()) {\n    System.out.println(\"\u53d1\u751f\u4e2d\u65ad\uff0c\u4e2d\u65ad\u8282\u70b9\uff1a\" + firstOutput.get().node());\n    System.out.println(\"\u5f53\u524d\u72b6\u6001\uff1a\" + firstOutput.get().state().data());\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u4f7f\u7528\u7684\u662f&nbsp;<code>invokeAndGetOutput<\/code>\uff0c\u4e0d\u662f&nbsp;<code>invoke<\/code>\u3002\u4e8c\u8005\u7684\u533a\u522b\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>invoke(...)<\/code>&nbsp;\u8fd4\u56de&nbsp;<code>Optional<\/code>\uff0c\u4f60\u53ea\u80fd\u62ff\u5230\u72b6\u6001\u5bf9\u8c61<\/li>\n\n\n\n<li><code>invokeAndGetOutput(...)<\/code>&nbsp;\u8fd4\u56de&nbsp;<code>Optional<\/code>\uff0c\u9664\u4e86\u80fd\u62ff\u5230\u72b6\u6001\u5bf9\u8c61\uff0c\u8fd8\u80fd\u77e5\u9053\u6700\u540e\u505c\u5728\u54ea\u4e2a\u8282\u70b9<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><code>NodeOutput<\/code>&nbsp;\u7684\u6838\u5fc3\u5b57\u6bb5\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>node()<\/code>\uff1a\u6700\u540e\u8f93\u51fa\u6765\u81ea\u54ea\u4e2a\u8282\u70b9\u3002\u5982\u679c\u4e2d\u65ad\u53d1\u751f\u5728&nbsp;<code>wait_input<\/code>\uff0c\u8fd9\u91cc\u5c31\u662f&nbsp;<code>wait_input<\/code><\/li>\n\n\n\n<li><code>state()<\/code>\uff1a\u5f53\u524d\u56fe\u7684\u72b6\u6001\u5bf9\u8c61\uff0c\u4e5f\u5c31\u662f\u4e2d\u65ad\u6216\u7ed3\u675f\u65f6\u4fdd\u5b58\u4e0b\u6765\u7684 OverAllState<\/li>\n\n\n\n<li><code>isEND()<\/code>\uff1a\u662f\u5426\u5df2\u7ecf\u5230\u8fbe&nbsp;<code>END<\/code>&nbsp;\u8282\u70b9\u3002\u5982\u679c&nbsp;<code>isEND()<\/code>&nbsp;\u4e3a&nbsp;<code>false<\/code>\uff0c\u901a\u5e38\u8bf4\u660e\u8fd9\u6b21\u8c03\u7528\u505c\u5728\u4e86\u67d0\u4e2a\u4e1a\u52a1\u8282\u70b9\u6216\u7b49\u5f85\u8282\u70b9\uff1b\u5bf9\u4e8e WaitNode \u573a\u666f\uff0c\u5c31\u53ef\u4ee5\u636e\u6b64\u5224\u65ad\u53d1\u751f\u4e86\u4e2d\u65ad<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u56e0\u6b64\uff0c\u7b2c\u4e00\u6b21\u8c03\u7528\u53ef\u4ee5\u901a\u8fc7&nbsp;<code>!firstOutput.get().isEND()<\/code>&nbsp;\u5224\u65ad\u53d1\u751f\u4e86\u4e2d\u65ad\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e00\u6b21\u8c03\u7528\u7684\u6267\u884c\u8fc7\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph TD\n    START[\"\u5f00\u59cb\"] --&gt; ASK[\"ask_name \u8282\u70b9\"]\n    ASK --&gt; WAIT[\"wait_input \u8282\u70b9\"]\n    WAIT --&gt; OUTPUT[\"\u8fd4\u56de NodeOutput\"]\n    OUTPUT --&gt; PAUSE[\"\u56fe\u6682\u505c\"]\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u65f6\u6700\u540e\u4e00\u4e2a&nbsp;<code>NodeOutput<\/code>&nbsp;\u6765\u81ea&nbsp;<code>wait_input<\/code>\uff0c\u5e76\u4e14&nbsp;<code>isEND()<\/code>&nbsp;\u4e3a&nbsp;<code>false<\/code>\u3002\u8fd9\u8bf4\u660e\u56fe\u6ca1\u6709\u8dd1\u5230&nbsp;<code>END<\/code>&nbsp;\u8282\u70b9\uff0c\u800c\u662f\u5728&nbsp;<code>wait_input<\/code>&nbsp;\u8fd9\u91cc\u53d1\u751f\u4e86\u4e2d\u65ad\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\u6b21\u8c03\u7528\u65f6\uff0c\u4f7f\u7528\u540c\u4e00\u4e2a&nbsp;<code>threadId<\/code>\uff0c\u5e76\u8bbe\u7f6e&nbsp;<code>resume()<\/code>&nbsp;\u6807\u8bb0\uff0c\u540c\u65f6\u901a\u8fc7&nbsp;<code>addStateUpdate<\/code>&nbsp;\u628a\u7528\u6237\u8f93\u5165\u5408\u5e76\u5230\u72b6\u6001\u5bf9\u8c61\u4e2d\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\nRunnableConfig resumeConfig = RunnableConfig.builder()\n    .threadId(threadId)\n    \/\/ \u6dfb\u52a0\u6062\u590d\u6807\u8bb0\n    .resume()\n    \/\/ \u5728OverAllState\u4e2d\u5408\u5e76\u7528\u6237\u8f93\u5165\u7684\u4fe1\u606f\n    .addStateUpdate(Map.of(\"name\", \"\u5f20\u4e09\"))\n    .build();\n\nOptional&lt;NodeOutput&gt; resumeOutput = compiledGraph.invokeAndGetOutput(Map.of(), resumeConfig);\n\nif (resumeOutput.isPresent() &amp;&amp; resumeOutput.get().isEND()) {\n    System.out.println(\"\u6267\u884c\u5b8c\u6210\uff1a\" + resumeOutput.get().state().value(\"answer\", \"\"));\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\u6b21\u6062\u590d\u7684\u6267\u884c\u8fc7\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph TD\n    USER[\"\u7528\u6237\u8f93\u5165 \u5f20\u4e09\"] --&gt; CONFIG[\"\u6784\u9020 resumeConfig\"]\n    CONFIG --&gt; WAIT[\"\u56de\u5230 wait_input \u8282\u70b9\"]\n    WAIT --&gt; APPLY[\"\u6267\u884c wait_input.apply\"]\n    APPLY --&gt; HELLO[\"say_hello \u8282\u70b9\"]\n    HELLO --&gt; END[\"END \u8282\u70b9\"]\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\u6b21\u6062\u590d\u8c03\u7528\u65f6\uff0c\u56fe\u4ece checkpoint \u6062\u590d\u5230&nbsp;<code>wait_input<\/code>\uff0cWaitNode \u8bc6\u522b\u5230\u6062\u590d\u6807\u8bb0\u540e\u5148\u5220\u9664\u8be5\u6807\u8bb0\uff0c\u518d\u8fd4\u56de&nbsp;<code>Optional.empty()<\/code>\uff0c\u7136\u540e\u6267\u884c&nbsp;<code>apply()<\/code>\uff0c\u7ee7\u7eed\u6d41\u8f6c\u5230&nbsp;<code>say_hello<\/code>&nbsp;\u548c&nbsp;<code>END<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u7efc\u5408\u6848\u4f8b\uff1a\u667a\u80fd\u8ba2\u5355\u5904\u7406<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u7528\u4e00\u4e2a\u5b8c\u6574\u6848\u4f8b\u6765\u6f14\u793a\u4e0a\u8ff0\u539f\u7406\u3002\u573a\u666f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7528\u6237\u63d0\u4ea4\u4e00\u4e2a\u8ba2\u5355\u8bf7\u6c42<\/li>\n\n\n\n<li>\u7cfb\u7edf\u5148\u505a<strong>\u98ce\u9669\u8bc4\u4f30<\/strong>\uff08risk_assess \u8282\u70b9\uff09<\/li>\n\n\n\n<li>\u5982\u679c\u662f\u4f4e\u98ce\u9669\u8ba2\u5355 \u2192 \u4e0d\u4e2d\u65ad\uff0c\u76f4\u63a5\u8fdb\u5165\u5904\u7406<\/li>\n\n\n\n<li>\u5982\u679c\u662f\u9ad8\u98ce\u9669\u8ba2\u5355 \u2192 \u4e2d\u65ad\uff0c\u7b49\u5f85\u4eba\u5de5\u5ba1\u6838<\/li>\n\n\n\n<li>\u4eba\u5de5\u5ba1\u6838\u540e \u2192 \u8fdb\u5165<strong>\u8ba2\u5355\u5904\u7406<\/strong>\u8282\u70b9\uff08\u4e0d\u540c\u4e8e\u98ce\u9669\u8bc4\u4f30\u8282\u70b9\uff09<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5173\u952e\u70b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6709\u9009\u62e9\u7684\u4e2d\u65ad<\/strong>\uff1a\u4f4e\u98ce\u9669\u4e0d\u4e2d\u65ad\uff0c\u9ad8\u98ce\u9669\u624d\u4e2d\u65ad<\/li>\n\n\n\n<li><strong>\u6062\u590d\u540e\u8df3\u8f6c\u5230\u5176\u4ed6\u8282\u70b9<\/strong>\uff1a\u4e2d\u65ad\u53d1\u751f\u5728 wait_review \u8282\u70b9\uff0c\u6062\u590d\u540e\u6d41\u8f6c\u5230 process_order \u8282\u70b9<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6848\u4f8b\u6d41\u7a0b\u56fe\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\ngraph TD\n    START([\u5f00\u59cb]) --&gt; risk[risk_assess&lt;br\/&gt;\u98ce\u9669\u8bc4\u4f30\u8282\u70b9]\n    risk --&gt;|\"\u4f4e\u98ce\u9669&lt;br\/&gt;outcome=CONTINUE\"| process[process_order&lt;br\/&gt;\u8ba2\u5355\u5904\u7406\u8282\u70b9]\n    risk --&gt;|\"\u9ad8\u98ce\u9669&lt;br\/&gt;outcome=NEED_REVIEW\"| wait[wait_review&lt;br\/&gt;\u7b49\u5f85\u5ba1\u6838\u8282\u70b9&lt;br\/&gt;\u5b9e\u73b0 InterruptableAction]\n\n    wait --&gt;|\"\u9996\u6b21\u8fdb\u5165&lt;br\/&gt;interrupt\u8fd4\u56demetadata&lt;br\/&gt;\u56fe\u4e2d\u65ad\"| PAUSE([\u56fe\u6682\u505c&lt;br\/&gt;\u8fd4\u56de\u5ba1\u6838\u8bf7\u6c42\u7ed9\u524d\u7aef])\n\n    PAUSE --&gt;|\"\u4eba\u5de5\u5ba1\u6838\u540e\u6062\u590d\"| wait\n    wait --&gt;|\"\u6062\u590d\u8fdb\u5165&lt;br\/&gt;\u5220\u9664\u6062\u590d\u6807\u8bb0&lt;br\/&gt;interrupt\u8fd4\u56deempty&lt;br\/&gt;\u6267\u884capply\u900f\u4f20\u72b6\u6001\"| process\n\n    process --&gt; END([\u7ed3\u675f])\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u4ee3\u7801\u53ef\u4ee5\u76f4\u63a5\u590d\u5236\u5230 Spring Boot \u9879\u76ee\u4e2d\u8fd0\u884c\uff08\u9700\u8981\u5df2\u5f15\u5165 spring-ai-alibaba-agent-framework \u4f9d\u8d56\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. \u98ce\u9669\u8bc4\u4f30\u7ed3\u679c\u7c7b\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.order;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@Data\n@NoArgsConstructor\npublic class RiskResult {\n    private String riskLevel;  \/\/ \"HIGH\" \u6216 \"LOW\"\n    private String reason;\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. \u98ce\u9669\u8bc4\u4f30\u8282\u70b9\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.order;\n\nimport com.alibaba.cloud.ai.graph.OverAllState;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.action.NodeActionWithConfig;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport org.springframework.ai.chat.model.ChatModel;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class RiskAssessNode implements NodeAction {\n\n    private final ReactAgent riskAgent;\n\n    public RiskAssessNode(ChatModel chatModel) {\n        this.riskAgent = ReactAgent.builder()\n            .name(\"risk_assess_agent\")\n            .model(chatModel)\n            .instruction(\"\u5224\u65ad\u8ba2\u5355\u98ce\u9669\u7b49\u7ea7\u3002\u91d1\u989d&gt;5000\u6216\u5305\u542b\u654f\u611f\u5546\u54c1\u4e3a\u9ad8\u98ce\u9669\u3002\" +\n                         \"\u8fd4\u56deJSON: {\\\"riskLevel\\\": \\\"HIGH\\\", \\\"reason\\\": \\\"\u91d1\u989d\u8d85\u8fc75000\\\"}\")\n            .outputType(RiskResult.class)\n            .build();\n    }\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state) throws Exception {\n        String orderInfo = state.value(\"order_info\", \"\").toString();\n        var response = riskAgent.invoke(Map.of(\"input\", orderInfo));\n        String content = response.orElseThrow().value(\"risk_assess_agent\").orElse(\"\").toString();\n\n        \/\/ \u7b80\u5355\u89e3\u6790\uff1a\u5982\u679c\u5305\u542bHIGH\u5219\u9ad8\u98ce\u9669\n        boolean isHigh = content.contains(\"HIGH\");\n        Map&lt;String, Object&gt; output = new HashMap&lt;&gt;();\n        output.put(\"risk_level\", isHigh ? \"HIGH\" : \"LOW\");\n        output.put(\"risk_reason\", content);\n        output.put(\"flow_outcome\", isHigh ? \"NEED_REVIEW\" : \"CONTINUE\");\n        return output;\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. \u7b49\u5f85\u5ba1\u6838\u8282\u70b9\uff08\u5b9e\u73b0 InterruptableAction\uff09\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.order;\n\nimport com.alibaba.cloud.ai.graph.OverAllState;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.action.AsyncNodeActionWithConfig;\nimport com.alibaba.cloud.ai.graph.action.InterruptableAction;\nimport com.alibaba.cloud.ai.graph.action.InterruptionMetadata;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.concurrent.CompletableFuture;\n\npublic class WaitReviewNode implements AsyncNodeAction, InterruptableAction {\n\n    @Override\n    public Optional&lt;InterruptionMetadata&gt; interrupt(String nodeId,\n                                                    OverAllState state,\n                                                    RunnableConfig config) {\n        if (config.metadata(RunnableConfig.HUMAN_FEEDBACK_METADATA_KEY).isPresent()) {\n            config.metadata().ifPresent(metadata -&gt;\n                metadata.remove(RunnableConfig.HUMAN_FEEDBACK_METADATA_KEY));\n            return Optional.empty();  \/\/ \u6062\u590d\u6267\u884c\uff0c\u4e0d\u4e2d\u65ad\n        }\n        return Optional.of(InterruptionMetadata.builder(nodeId, state).build());  \/\/ \u9996\u6b21\uff0c\u4e2d\u65ad\n    }\n\n    @Override\n    public CompletableFuture&lt;Map&lt;String, Object&gt;&gt; apply(OverAllState state) {\n        \/\/ \u6062\u590d\u540e\u6267\u884c\uff1a\u900f\u4f20\u5ba1\u6838\u7ed3\u679c\n        String reviewResult = state.value(\"review_result\", \"approved\").toString();\n        Map&lt;String, Object&gt; output = new HashMap&lt;&gt;();\n        output.put(\"review_result\", reviewResult);\n        return CompletableFuture.completedFuture(output);\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. \u8ba2\u5355\u5904\u7406\u8282\u70b9\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.order;\n\nimport com.alibaba.cloud.ai.graph.OverAllState;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.action.NodeActionWithConfig;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class ProcessOrderNode implements NodeAction {\n\n    @Override\n    public Map&lt;String, Object&gt; apply(OverAllState state) throws Exception {\n        String orderInfo = state.value(\"order_info\", \"\").toString();\n        String riskLevel = state.value(\"risk_level\", \"LOW\").toString();\n        String reviewResult = state.value(\"review_result\", \"auto_approved\").toString();\n\n        Map&lt;String, Object&gt; output = new HashMap&lt;&gt;();\n\n        if (reviewResult.contains(\"\u62d2\u7edd\") || reviewResult.toLowerCase().contains(\"reject\")) {\n            output.put(\"process_status\", \"REJECTED\");\n            output.put(\"process_result\", \"\u8ba2\u5355\u672a\u901a\u8fc7\u4eba\u5de5\u5ba1\u6838\uff0c\u7cfb\u7edf\u5df2\u53d6\u6d88\u540e\u7eed\u5c65\u7ea6\u3002\u8ba2\u5355\u4fe1\u606f\uff1a\" + orderInfo);\n            output.put(\"next_action\", \"\u901a\u77e5\u7528\u6237\u8ba2\u5355\u5ba1\u6838\u672a\u901a\u8fc7\uff0c\u5e76\u8bb0\u5f55\u5ba1\u6838\u7ed3\u679c\uff1a\" + reviewResult);\n            return output;\n        }\n\n        if (\"HIGH\".equals(riskLevel)) {\n            output.put(\"process_status\", \"MANUAL_APPROVED\");\n            output.put(\"process_result\", \"\u9ad8\u98ce\u9669\u8ba2\u5355\u5df2\u901a\u8fc7\u4eba\u5de5\u5ba1\u6838\uff0c\u53ef\u4ee5\u7ee7\u7eed\u5c65\u7ea6\u3002\u8ba2\u5355\u4fe1\u606f\uff1a\" + orderInfo);\n            output.put(\"next_action\", \"\u6807\u8bb0\u4e3a\u4eba\u5de5\u5ba1\u6838\u901a\u8fc7\uff0c\u8fdb\u5165\u4ed3\u5e93\u62e3\u8d27\u548c\u652f\u4ed8\u786e\u8ba4\u6d41\u7a0b\");\n            output.put(\"audit_note\", reviewResult);\n            return output;\n        }\n\n        output.put(\"process_status\", \"AUTO_APPROVED\");\n        output.put(\"process_result\", \"\u4f4e\u98ce\u9669\u8ba2\u5355\u81ea\u52a8\u901a\u8fc7\uff0c\u7cfb\u7edf\u76f4\u63a5\u8fdb\u5165\u5c65\u7ea6\u6d41\u7a0b\u3002\u8ba2\u5355\u4fe1\u606f\uff1a\" + orderInfo);\n        output.put(\"next_action\", \"\u8fdb\u5165\u4ed3\u5e93\u62e3\u8d27\u548c\u652f\u4ed8\u786e\u8ba4\u6d41\u7a0b\");\n        return output;\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. \u56fe\u7684\u6784\u5efa\u4e0e Controller\uff08\u5b8c\u6574\u53ef\u8fd0\u884c\uff09\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\npackage com.example.order;\n\nimport com.alibaba.cloud.ai.graph.*;\nimport com.alibaba.cloud.ai.graph.action.AsyncEdgeAction;\nimport com.alibaba.cloud.ai.graph.action.AsyncNodeActionWithConfig;\nimport com.alibaba.cloud.ai.graph.checkpoint.config.SaverConfig;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.UUID;\n\n@Configuration\npublic class OrderWorkflowConfig {\n\n    @Bean\n    public CompiledGraph orderWorkflow(ChatModel chatModel) throws Exception {\n        StateGraph graph = new StateGraph();\n\n        graph.addNode(\"risk_assess\", AsyncNodeActionWithConfig.node_async(new RiskAssessNode(chatModel)));\n        graph.addNode(\"wait_review\", new WaitReviewNode());\n        graph.addNode(\"process_order\", AsyncNodeActionWithConfig.node_async(new ProcessOrderNode()));\n\n        graph.addEdge(StateGraph.START, \"risk_assess\");\n        graph.addConditionalEdges(\"risk_assess\",\n            AsyncEdgeAction.edge_async(state -&gt; {\n                String outcome = state.value(\"flow_outcome\", \"CONTINUE\").toString();\n                return \"NEED_REVIEW\".equals(outcome) ? \"wait_review\" : \"process_order\";\n            }),\n            Map.of(\"wait_review\", \"wait_review\", \"process_order\", \"process_order\"));\n        graph.addEdge(\"wait_review\", \"process_order\");\n        graph.addEdge(\"process_order\", StateGraph.END);\n\n        return graph.compile(CompileConfig.builder()\n            .saverConfig(SaverConfig.builder().register(new MemorySaver()).build())\n            .build());\n    }\n}\n\n@RestController\n@RequestMapping(\"\/api\/order\")\npublic class OrderController {\n\n    private final CompiledGraph orderWorkflow;\n\n    public OrderController(CompiledGraph orderWorkflow) {\n        this.orderWorkflow = orderWorkflow;\n    }\n\n    @PostMapping(\"\/chat\")\n    public Map&lt;String, Object&gt; chat(@RequestBody Map&lt;String, String&gt; request) {\n        String input = request.getOrDefault(\"input\", \"\");\n        String resume = request.get(\"resume\");\n\n        boolean isResume = resume != null &amp;&amp; !resume.isBlank();\n        String threadId = request.get(\"threadId\");\n\n        if (isResume &amp;&amp; (threadId == null || threadId.isBlank())) {\n            return Map.of(\"type\", \"error\", \"message\", \"\u6062\u590d\u6267\u884c\u5fc5\u987b\u4f20\u5165\u4e0a\u4e00\u6b21\u4e2d\u65ad\u8fd4\u56de\u7684 threadId\");\n        }\n        if (!isResume &amp;&amp; (threadId == null || threadId.isBlank())) {\n            threadId = UUID.randomUUID().toString();\n        }\n\n        RunnableConfig config = isResume\n            ? RunnableConfig.builder()\n                .threadId(threadId)\n                .resume()\n                .addStateUpdate(Map.of(\"review_result\", resume))\n                .build()\n            : RunnableConfig.builder()\n                .threadId(threadId)\n                .build();\n\n        Map&lt;String, Object&gt; graphInput = isResume\n            ? Map.of()\n            : Map.of(\"order_info\", input);\n\n        Optional&lt;NodeOutput&gt; output = orderWorkflow.invokeAndGetOutput(graphInput, config);\n\n        return output.map(nodeOutput -&gt; {\n            OverAllState state = nodeOutput.state();\n\n            if (!nodeOutput.isEND()) {\n                return Map.&lt;String, Object&gt;of(\n                    \"type\", \"interrupt\",\n                    \"threadId\", threadId,\n                    \"node\", nodeOutput.node(),\n                    \"message\", \"\u8be5\u8ba2\u5355\u98ce\u9669\u8f83\u9ad8\uff0c\u8bf7\u4eba\u5de5\u5ba1\u6838\u3002\u56de\u590d approved \u6216 rejected\u3002\",\n                    \"risk_level\", state.value(\"risk_level\", \"\").toString(),\n                    \"risk_reason\", state.value(\"risk_reason\", \"\").toString()\n                );\n            }\n\n            return Map.&lt;String, Object&gt;of(\n                \"type\", \"normal\",\n                \"threadId\", threadId,\n                \"process_status\", state.value(\"process_status\", \"\").toString(),\n                \"process_result\", state.value(\"process_result\", \"\").toString(),\n                \"next_action\", state.value(\"next_action\", \"\").toString()\n            );\n        }).orElse(Map.of(\"type\", \"error\", \"message\", \"\u56fe\u6267\u884c\u5931\u8d25\"));\n    }\n}\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a Controller \u53ea\u6709\u4e00\u4e2a&nbsp;<code>\/api\/order\/chat<\/code>&nbsp;\u65b9\u6cd5\u3002\u524d\u7aef\u6839\u636e\u4e0a\u4e00\u6b21\u54cd\u5e94\u7684&nbsp;<code>type<\/code>&nbsp;\u51b3\u5b9a\u4e0b\u4e00\u6b21\u8bf7\u6c42\u5b57\u6bb5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c\u540e\u7aef\u8fd4\u56de&nbsp;<code>type=normal<\/code>\uff0c\u8bf4\u660e\u56fe\u5df2\u7ecf\u6b63\u5e38\u6267\u884c\u5b8c\u6210\uff0c\u524d\u7aef\u5c55\u793a&nbsp;<code>process_result<\/code>&nbsp;\u5373\u53ef<\/li>\n\n\n\n<li>\u5982\u679c\u540e\u7aef\u8fd4\u56de&nbsp;<code>type=interrupt<\/code>\uff0c\u8bf4\u660e\u56fe\u5728&nbsp;<code>wait_review<\/code>&nbsp;\u8282\u70b9\u4e2d\u65ad\u4e86\uff0c\u524d\u7aef\u9700\u8981\u5c55\u793a\u5ba1\u6838\u63d0\u793a\uff0c\u5e76\u4fdd\u7559\u540e\u7aef\u8fd4\u56de\u7684&nbsp;<code>threadId<\/code><\/li>\n\n\n\n<li>\u7528\u6237\u7b2c\u4e00\u6b21\u63d0\u4ea4\u8ba2\u5355\u65f6\uff0c\u628a\u8ba2\u5355\u5185\u5bb9\u653e\u5728&nbsp;<code>input<\/code>&nbsp;\u5b57\u6bb5\u4e2d<\/li>\n\n\n\n<li>\u5982\u679c\u4e0a\u4e00\u6b21\u54cd\u5e94\u662f&nbsp;<code>type=interrupt<\/code>\uff0c\u7528\u6237\u518d\u6b21\u53d1\u9001\u5ba1\u6838\u610f\u89c1\u65f6\uff0c\u628a\u5ba1\u6838\u610f\u89c1\u653e\u5728&nbsp;<code>resume<\/code>&nbsp;\u5b57\u6bb5\u4e2d\uff0c\u5e76\u5fc5\u987b\u5e26\u4e0a\u540c\u4e00\u4e2a&nbsp;<code>threadId<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Controller \u7684\u5224\u65ad\u903b\u8f91\u4e5f\u5f88\u76f4\u63a5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8bf7\u6c42\u4e2d\u6709&nbsp;<code>resume<\/code>\uff1a\u8bf4\u660e\u8fd9\u662f\u6062\u590d\u6267\u884c\uff0c\u5fc5\u987b\u4f7f\u7528\u4e0a\u4e00\u6b21\u4e2d\u65ad\u8fd4\u56de\u7684&nbsp;<code>threadId<\/code>\uff0c\u5e76\u6784\u9020&nbsp;<code>RunnableConfig.builder().threadId(threadId).resume().addStateUpdate(...)<\/code><\/li>\n\n\n\n<li>\u8bf7\u6c42\u4e2d\u6ca1\u6709&nbsp;<code>resume<\/code>\uff1a\u8bf4\u660e\u8fd9\u662f\u9996\u6b21\u6267\u884c\uff0c\u5982\u679c\u524d\u7aef\u6ca1\u6709\u4f20&nbsp;<code>threadId<\/code>\uff0c\u540e\u7aef\u5c31\u751f\u6210\u4e00\u4e2a\u65b0\u7684&nbsp;<code>threadId<\/code>\uff0c\u5e76\u628a&nbsp;<code>input<\/code>&nbsp;\u5199\u5165\u56fe\u8f93\u5165\u7684&nbsp;<code>order_info<\/code><\/li>\n\n\n\n<li>\u8c03\u7528\u7edf\u4e00\u4f7f\u7528&nbsp;<code>invokeAndGetOutput<\/code>\uff0c\u7136\u540e\u901a\u8fc7&nbsp;<code>nodeOutput.isEND()<\/code>&nbsp;\u5224\u65ad\u662f\u5426\u4e2d\u65ad<\/li>\n\n\n\n<li>\u5982\u679c&nbsp;<code>isEND()<\/code>&nbsp;\u4e3a&nbsp;<code>false<\/code>\uff0c\u8fd4\u56de&nbsp;<code>type=interrupt<\/code><\/li>\n\n\n\n<li>\u5982\u679c&nbsp;<code>isEND()<\/code>&nbsp;\u4e3a&nbsp;<code>true<\/code>\uff0c\u8fd4\u56de&nbsp;<code>type=normal<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e24\u6761\u6267\u884c\u8def\u5f84\u603b\u7ed3\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u8def\u5f84\u4e00\uff1a\u4f4e\u98ce\u9669\u8ba2\u5355\uff08\u4e0d\u4e2d\u65ad\uff09<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u524d\u7aef\u8bf7\u6c42\uff1a{ \"input\": \"\u8ba2\u5355\u91d1\u989d300\uff0c\u5546\u54c1\uff1a\u666e\u901a\u9f20\u6807\" }\n\u2192 Controller \u5224\u65ad\u6ca1\u6709 resume\uff0c\u6b63\u5e38\u542f\u52a8\u56fe\n\u2192 risk_assess \u5224\u5b9a LOW\n\u2192 \u6761\u4ef6\u8fb9\u76f4\u63a5\u5230 process_order\n\u2192 ProcessOrderNode \u8fd4\u56de AUTO_APPROVED\u3001process_result\u3001next_action\n\u2192 Controller \u8fd4\u56de type=normal\n```<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u8def\u5f84\u4e8c\uff1a\u9ad8\u98ce\u9669\u8ba2\u5355\uff08\u4e2d\u65ad + \u6062\u590d\u540e\u8df3\u8f6c\u5230\u5176\u4ed6\u8282\u70b9\uff09<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">```\n\u524d\u7aef\u8bf7\u6c42\uff1a{ \"input\": \"\u8ba2\u5355\u91d1\u989d8000\uff0c\u5546\u54c1\uff1a\u654f\u611f\u8bbe\u5907\" }\n\u2192 Controller \u5224\u65ad\u6ca1\u6709 resume\uff0c\u6b63\u5e38\u542f\u52a8\u56fe\n\u2192 risk_assess \u5224\u5b9a HIGH\n\u2192 \u6761\u4ef6\u8fb9\u5230 wait_review\n\u2192 wait_review.interrupt() \u8fd4\u56de metadata\uff0c\u56fe\u4e2d\u65ad\n\u2192 Controller \u53d1\u73b0 nodeOutput.isEND() \u4e3a false\n\u2192 \u8fd4\u56de type=interrupt\u3001threadId\u3001risk_reason \u7ed9\u524d\u7aef\n\n\u524d\u7aef\u518d\u6b21\u8bf7\u6c42\uff1a{ \"threadId\": \"\u4e0a\u6b21\u8fd4\u56de\u7684threadId\", \"resume\": \"approved\" }\n\u2192 Controller \u5224\u65ad\u6709 resume\uff0c\u6784\u9020 resumeConfig\n\u2192 \u6846\u67b6\u6062\u590d\u5230 wait_review\uff0c\u5e76\u628a review_result \u5408\u5e76\u5230 state\n\u2192 wait_review.interrupt() \u5220\u9664\u6062\u590d\u6807\u8bb0\u5e76\u8fd4\u56de empty\n\u2192 wait_review.apply() \u900f\u4f20\u5ba1\u6838\u7ed3\u679c\n\u2192 \u901a\u8fc7\u8fb9\u6d41\u8f6c\u5230 process_order\n\u2192 ProcessOrderNode \u6839\u636e review_result \u8fd4\u56de MANUAL_APPROVED \u6216 REJECTED\n\u2192 Controller \u8fd4\u56de type=normal\n```<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring AI \u672c\u8d28\u4e0a\u662f Spring \u751f\u6001\u91cc\u7684\u4e00\u5957\u5f00\u53d1\u6846\u67b6\uff0c\u5b83\u5e2e\u6211\u4eec\u89e3\u51b3\u7684\u95ee\u9898\u4ece\u201c\u8bbf\u95ee\u6570\u636e\u5e93\u3001\u8bbf\u95ee Re [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[18],"class_list":["post-697","post","type-post","status-publish","format-standard","hentry","category-learn","tag-spring"],"_links":{"self":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/comments?post=697"}],"version-history":[{"count":3,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/697\/revisions"}],"predecessor-version":[{"id":709,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/697\/revisions\/709"}],"wp:attachment":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/media?parent=697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/categories?post=697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/tags?post=697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}