<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on 达蒙西的囚笼</title>
        <link>https://blog.cba.nxlan.cn/post/</link>
        <description>Recent content in Posts on 达蒙西的囚笼</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>Tech-love Share Hope</copyright>
        <lastBuildDate>Wed, 22 Apr 2026 16:03:12 +0800</lastBuildDate><atom:link href="https://blog.cba.nxlan.cn/post/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Gitea 私有代码仓库快速部署</title>
        <link>https://blog.cba.nxlan.cn/p/gitea/</link>
        <pubDate>Wed, 22 Apr 2026 16:03:12 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/gitea/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGobuild_gitea_title.png" alt="Featured image of post Gitea 私有代码仓库快速部署" /&gt;&lt;p&gt;&lt;strong&gt;摘要&lt;/strong&gt;: 基于真实踩坑案例，实现 1Panle 平台 + Gitea 私有仓库快速部署。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;前情提要&#34;&gt;前情提要
&lt;/h2&gt;&lt;p&gt;前面&lt;a class=&#34;link&#34; href=&#34;https://blog.cba.nxlan.cn/p/setup_mcp_server&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;文章&lt;/a&gt;中提到了 MCP server 快速部署案例。&lt;/p&gt;
&lt;p&gt;其中有一种场景：用户自己开发了一个 mcp server 代码，希望运行在 1Panel 的MCP 组件中，而不是只能够在本地运行。&lt;/p&gt;
&lt;p&gt;并且文章中提到，1Panel 中新增的 mcp server配置如下——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/bin/sh -c &amp;#34;apk add git &amp;amp;&amp;amp; uvx --from git+http://lab.nxlan.cn:3008/pdream/jobsearch-mcp-server.git jobsearch-mcp-server --transport stdio&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上面用到代码仓库 &lt;a class=&#34;link&#34; href=&#34;http://lab.nxlan.cn:3008/pdream/jobsearch-mcp-server.git&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://lab.nxlan.cn:3008/pdream/jobsearch-mcp-server.git&lt;/a&gt; 就是本文主角——gitea 个人仓库。&lt;/p&gt;
&lt;h2 id=&#34;一gitea-基础配置&#34;&gt;一、Gitea 基础配置
&lt;/h2&gt;&lt;p&gt;延续1Panel 中特色功能：图形化部署+应用内部关联。&lt;/p&gt;
&lt;p&gt;可以 &lt;strong&gt;2分钟&lt;/strong&gt;快速实现 gitea 应用的部署，&lt;strong&gt;5分钟&lt;/strong&gt;完成初始化，&lt;strong&gt;10分钟&lt;/strong&gt;完成反向代理配置。&lt;/p&gt;
&lt;p&gt;之后，就可以同步自己的代码到gitea 仓库中了。&lt;/p&gt;
&lt;p&gt;感兴趣的话，不妨参考本文一步一步操作完成。&lt;/p&gt;
&lt;h3 id=&#34;11-gitea-应用创建&#34;&gt;1.1 Gitea 应用创建
&lt;/h3&gt;&lt;p&gt;首先在 &lt;strong&gt;&amp;ldquo;应用商店&amp;rdquo; -&amp;gt; &amp;ldquo;全部&amp;rdquo; -&amp;gt; &amp;ldquo;搜索&amp;rdquo;&lt;/strong&gt; 栏中输入 gitea 关键字，找到可以安装的应用。&lt;/p&gt;
&lt;p&gt;注意点击 第一个 &lt;strong&gt;Gitea&lt;/strong&gt; &amp;ldquo;安装&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423105639274.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;如果 1Panel 中没有安装过数据库服务，会有需要安装数据库的提醒（如下图）——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423105949887.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;如果是这种情况，就&lt;strong&gt;需要先安装数据库&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;点击&amp;quot;去安装&amp;quot;后，直接跳转到&lt;strong&gt;数据库安装界&lt;/strong&gt;面——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423110438421.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;点击**&amp;ldquo;确认&amp;rdquo;** 按键，等待数据库安装完成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423110641229.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果点击&amp;quot;安装&amp;quot; 后，提示：&amp;ldquo;未开启外部映射，将无法从外外网访问数据库服务&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;可以根据自己需求，再勾选 &amp;ldquo;高级设置&amp;quot;中的 &amp;ldquo;端口外部访问&amp;quot;选项。&lt;/p&gt;
&lt;p&gt;一般&lt;strong&gt;不建议&lt;/strong&gt; 直接开放数据库服务到外部，所以我这里默认不启用此功能。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;再次回到Gitea 安装界面，数据库服务可以选择刚创建好的postgres 了。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423111041133.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;因为，稍后使用 ssh 协议同步代码，需要访问 gitea 的ssh 服务，这里需要勾选 &amp;ldquo;端口外部访问&amp;rdquo; 的选项。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423111209507.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;点击&amp;quot;确认&amp;quot;后，就开始自动安装 gitea 应用了。&lt;/p&gt;
&lt;p&gt;安装成功后，可以在应用商店中看到刚新增的两个应用——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423111647878.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;12-追加反代配置&#34;&gt;1.2 追加反代配置
&lt;/h3&gt;&lt;p&gt;默认安装完成时，gitea 应用的web 服务绑定在宿主机的 3000端口。对应我的主机就是 &lt;a class=&#34;link&#34; href=&#34;http://lab.nxlan.cn:3000&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://lab.nxlan.cn:3000&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;如果1Panel 在你的内部局域网，就可以直接访问上述页面，进行后续初始化工作。（可以跳过本段）&lt;/p&gt;
&lt;p&gt;但是，如果gitea 宿主机在云上，又怎么能直接访问这个管理页面呢？&lt;/p&gt;
&lt;p&gt;一种方式就是：追加反向代理配置，通过已经上线的https 服务，代理/gitea 流量到 http://127.0.0.1:3000 的真实服务。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;还有一种方法是：登录到云主机 管理页面，在&lt;strong&gt;安全策略&lt;/strong&gt;下，追加一条——放行公网访问主机 3000 端口的策略。&lt;/p&gt;
&lt;p&gt;考虑到：这样临时放行后，还是要取消并开通反代，我就没有这么操作。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;操作步骤上，还是先进入**&amp;ldquo;网站&amp;rdquo; -&amp;gt; &amp;ldquo;反向代理&amp;rdquo; -&amp;gt; &amp;ldquo;创建&amp;rdquo;**， 创建一条新代理规则，请求路径假设就是 /gitea。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423112918360.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;并在原始代理配置文件内容基础上追加——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;location ^~ /gitea &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 追加配置：去掉 /gitea 前缀，发给后端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    rewrite ^/gitea&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/.*&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;$ &lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt; break&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# --- 默认设置 ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_pass http://127.0.0.1:3000&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Host &lt;span class=&#34;nv&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Real-IP &lt;span class=&#34;nv&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Forwarded-For &lt;span class=&#34;nv&#34;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header REMOTE-HOST &lt;span class=&#34;nv&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Upgrade &lt;span class=&#34;nv&#34;&gt;$http_upgrade&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Connection &lt;span class=&#34;nv&#34;&gt;$http_connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Forwarded-Proto &lt;span class=&#34;nv&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Forwarded-Port &lt;span class=&#34;nv&#34;&gt;$server_port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_http_version 1.1&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    add_header X-Cache &lt;span class=&#34;nv&#34;&gt;$upstream_cache_status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_ssl_server_name off&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_ssl_name &lt;span class=&#34;nv&#34;&gt;$proxy_host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;保存反代配置后，进入gitea 配置文件目录——&lt;u&gt;/opt/1panel/apps/gitea/gitea/data/gitea/conf&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;修改配置文件app.ini中的一条配置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;server&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;APP_DATA_PATH&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; /data/gitea
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DOMAIN&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; localhost
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SSH_DOMAIN&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; localhost
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;HTTP_PORT&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 修改为自己外部域名和代理接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ROOT_URL&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; https://lab.nxlan.cn/gitea/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DISABLE_SSH&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SSH_PORT&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SSH_LISTEN_PORT&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LFS_START_SERVER&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;修改好后，重启gitea 应用新配置。再次访问反代地址—— &lt;a class=&#34;link&#34; href=&#34;https://lab.nxlan.cn/gitea&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://lab.nxlan.cn/gitea&lt;/a&gt;，就可以看到初始化配置页面了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423114750315.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;13-完成应用初始化&#34;&gt;1.3 完成应用初始化
&lt;/h3&gt;&lt;p&gt;在上述初始化页面中，1Panel 已经帮我们补充好了数据库地址、名称、用户、密码等信息。&lt;/p&gt;
&lt;p&gt;这里保持默认，点击 &lt;strong&gt;&amp;ldquo;立即安装&amp;rdquo;&lt;/strong&gt; 完成最后的初始化工作。&lt;/p&gt;
&lt;p&gt;最后，完成管理员账户的设置——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423115342985.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;管理账户创建后，重新登录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423115555538.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;14-同步代码至仓库&#34;&gt;1.4 同步代码至仓库
&lt;/h3&gt;&lt;p&gt;同步本地写好的代码前，需要先在 Gitea 上创建仓库。&lt;/p&gt;
&lt;p&gt;我们的第一个代码仓库，名字就叫 &amp;ldquo;jobsearch-mcp-server&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;为了方便mcp server 拉取项目代码，项目可见性不勾选 &amp;ldquo;将仓库设为私有&amp;rdquo;——也就是公开的意思。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423115908283.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;其他保持默认，这样我们第一个代码仓库就创建完成了。&lt;/p&gt;
&lt;p&gt;仓库创建完后，需要追加个人应用 访问令牌——方便开发主机同步代码。&lt;/p&gt;
&lt;p&gt;在 &lt;strong&gt;&amp;ldquo;个人信息&amp;rdquo; -&amp;gt; &amp;ldquo;应用&amp;rdquo; -&amp;gt; &amp;ldquo;生成新的令牌&amp;rdquo;&lt;/strong&gt; 中 输入令牌名称，并追加repository 等读写的权限。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423122033363.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;添加成功后，会出现一行令牌字符串，类似于——a385cac305f80ff43dfe202d727b5a33176d18b3&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423123926927.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;在开发主机上，按照以下命令顺序执行，同步代码到gitea 仓库：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# git 项目初始化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看当前 remote&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 删除过往 remote&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote remove origin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 追加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote add origin https://pdream:&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;TOKEN&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;@lab.nxlan.cn/gitea/pdream/jobsearch-mcp-server.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 推送本地代码到仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git push --set-upstream origin master
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Enumerating objects: 52, &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Counting objects: 100% &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;52/52&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Delta compression using up to &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; threads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Compressing objects: 100% &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;42/42&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Writing objects: 100% &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;52/52&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, 100.22 KiB &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; 5.90 MiB/s, &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Total &lt;span class=&#34;m&#34;&gt;52&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;delta 19&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, reused &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;delta 0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, pack-reused &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;remote: . Processing &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; references
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;remote: Processed &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; references in total
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;To https://lab.nxlan.cn/gitea/pdream/jobsearch-mcp-server.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; * &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;new branch&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;      master -&amp;gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;branch &lt;span class=&#34;s1&#34;&gt;&amp;#39;master&amp;#39;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; up to track &lt;span class=&#34;s1&#34;&gt;&amp;#39;origin/master&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;提示同步成功。此时访问仓库页面，就可以看到刚上传的代码了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260423130025098.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二1panel-mcp-server-部署从-gitea-拉取&#34;&gt;二、1Panel MCP Server 部署（从 Gitea 拉取）
&lt;/h2&gt;&lt;h3 id=&#34;21-场景&#34;&gt;2.1 场景
&lt;/h3&gt;&lt;p&gt;在 1Panel 上通过 MCP 管理界面部署 MCP Server时，因为源代码在个人 Gitea上，所以在MCP server 启动要指定git项目地址。&lt;/p&gt;
&lt;h3 id=&#34;22-正确启动命令&#34;&gt;2.2 正确启动命令
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;经过反代服务器（推荐）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/bin/sh -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;apk add git &amp;amp;&amp;amp; uvx --from git+https://lab.nxlan.cn/gitea/pdream/jobsearch-mcp-server jobsearch-mcp-server --transport stdio&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;直连 Gitea（不经反代，数据未加密）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/bin/sh -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;apk add git &amp;amp;&amp;amp; uvx --from git+http://lab.nxlan.cn:3000/pdream/jobsearch-mcp-server.git jobsearch-mcp-server --transport stdio&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;参数说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--transport stdio&lt;/code&gt; — 1Panel MCP 托管必须使用 stdio 传输模式（解决 SSE 嵌套冲突）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;23-注意事项&#34;&gt;2.3 注意事项
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;路径格式&lt;/strong&gt;：&lt;code&gt;git+https://&lt;/code&gt; 而非本地路径，容器内无法访问宿主机文件系统&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;传输模式&lt;/strong&gt;：必须加 &lt;code&gt;--transport stdio&lt;/code&gt;，否则与 1Panel MCP 托管机制冲突&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;反代 vs 直连&lt;/strong&gt;：经反代走 443 端口（SSL 由反代终止），直连走 3000 数据不经加密传输（服务直接暴露在公网）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;环境变量&lt;/strong&gt;：在jobserch 这个 MCP Server 项目中需要声明环境变量 &amp;ldquo;DEEPSEEK_API_KEY&amp;rdquo;，否则提示 &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; 未配置。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三补充-使用ssh方式同步代码&#34;&gt;三、补充 ：使用ssh方式同步代码
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前提：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Gitea 应用创建时，勾选了 &lt;strong&gt;&amp;ldquo;端口外部访问&amp;rdquo;&lt;/strong&gt; 的选项。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;31-ssh-key-生成&#34;&gt;3.1 SSH Key 生成
&lt;/h3&gt;&lt;p&gt;开发主机&lt;strong&gt;密钥生成&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t ed25519 -C &lt;span class=&#34;s2&#34;&gt;&amp;#34;your_email@xx.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 输出：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#   id_ed25519      (私钥)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#   id_ed25519.pub  (公钥)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;添加主机的ssh key到 Gitea&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看公钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat ~/.ssh/id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 复制内容 → Gitea Web UI → 用户设置 → SSH 密钥 → 添加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 验证连通性&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -p &lt;span class=&#34;m&#34;&gt;222&lt;/span&gt; git@lab.nxlan.cn -T
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 预期：Welcome to Gitea!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;仓库 ssh 密钥截图&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimg_v3_02110_589f6a24-6bd5-4fe0-bb73-2bd33563a16g.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;32-修改git-remote-配置&#34;&gt;3.2 修改git remote 配置
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 删除之前的 remote&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote remove origin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 将 之前配置的 HTTPS 改为 SSH（注意端口 222）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote set-url origin ssh://git@lab.nxlan.cn:222/pdream/jobsearch-mcp-server.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;33-http-与-ssh-的分工&#34;&gt;3.3 HTTP 与 SSH 的分工
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;通道&lt;/th&gt;
          &lt;th&gt;用途&lt;/th&gt;
          &lt;th&gt;使用场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;HTTP（S）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;拉取&lt;/strong&gt;源代码&lt;/td&gt;
          &lt;td&gt;MCP Server 容器内 &lt;code&gt;uvx --from git+https://...&lt;/code&gt; 从 Gitea 拉代码&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;HTTP（S）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;上传&lt;/strong&gt;源代码&lt;/td&gt;
          &lt;td&gt;本地编辑完成后 &lt;code&gt;git push&lt;/code&gt; 将代码同步回 Gitea。此时origin为： https://pdream:[TOKEN]@lab.nxlan.cn/gitea/pdream/jobsearch-mcp-server.git&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;SSH&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;上传&lt;/strong&gt;源代码&lt;/td&gt;
          &lt;td&gt;本地编辑完成后 &lt;code&gt;git push&lt;/code&gt; 将代码同步回 Gitea 。此时origin为： ssh://git@lab.nxlan.cn:222/pdream/jobsearch-mcp-server.git&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;本例实战&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MCP Server 部署：容器通过 &lt;strong&gt;HTTPS&lt;/strong&gt; 拉取 &lt;code&gt;jobsearch-mcp-server&lt;/code&gt; 源码&lt;/li&gt;
&lt;li&gt;代码编辑后推送：本地也通过 &lt;strong&gt;HTTPS&lt;/strong&gt; 方式 ( &lt;code&gt;https://pdream:[TOKEN]@lab.nxlan.cn/...&lt;/code&gt;) 提交到 Gitea&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两者各司其职，不冲突。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四mcp-server-排错速查&#34;&gt;四、mcp server 排错速查
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;症状&lt;/th&gt;
          &lt;th&gt;原因&lt;/th&gt;
          &lt;th&gt;解法&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;uvx --from /path/to/repo&lt;/code&gt; 报错&lt;/td&gt;
          &lt;td&gt;容器内无法访问宿主机路径&lt;/td&gt;
          &lt;td&gt;改用 &lt;code&gt;git+https://&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;git clone&lt;/code&gt; 卡住/超时&lt;/td&gt;
          &lt;td&gt;容器网络不通或缺 git&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;apk add git&lt;/code&gt;，检查网络&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SSL certificate problem&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;自签证书&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;git config --global http.sslVerify false&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;容器启动后立刻退出&lt;/td&gt;
          &lt;td&gt;缺环境变量&lt;/td&gt;
          &lt;td&gt;检查 &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; 等必填变量&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SSH 克隆认证失败&lt;/td&gt;
          &lt;td&gt;端口非 22&lt;/td&gt;
          &lt;td&gt;确认 Gitea SSH 端口为 &lt;strong&gt;222&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五principle经验规则&#34;&gt;五、Principle（经验规则）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;supergateway 容器内操作默认缺 git，&lt;strong&gt;先用 &lt;code&gt;apk add git&lt;/code&gt; 兜底&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MCP server 启动命令只支持单字段，&lt;strong&gt;用 &lt;code&gt;/bin/sh -c&lt;/code&gt; 串联多条指令&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;使用 HTTPS 服务推送源代码时，注意&lt;strong&gt;令牌权限&lt;/strong&gt;要给够，否则会报告 403 的错误&lt;/li&gt;
&lt;li&gt;Gitea SSH 端口&lt;strong&gt;映射为 222&lt;/strong&gt;，配置 remote 时需注意指定端口&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>手把手初始化GCP云主机并快速完成MCP Server的配置</title>
        <link>https://blog.cba.nxlan.cn/p/setup_mcp_server/</link>
        <pubDate>Wed, 08 Apr 2026 11:13:01 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/setup_mcp_server/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoGenerated_Image_v9wav5v9wav5v9wa.png" alt="Featured image of post 手把手初始化GCP云主机并快速完成MCP Server的配置" /&gt;&lt;h2 id=&#34;前情提要&#34;&gt;前情提要
&lt;/h2&gt;&lt;p&gt;之前发布的文章：“手把手带你薅 Gemini 付费 API 与 Google 免费服务器” 被人投诉下架了。&lt;/p&gt;
&lt;p&gt;这里把文章链接放出来，感兴趣的同学可以去薅一下——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前提&lt;/strong&gt;：需要先开通自己帐号的 google pro服务&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;详细步骤&lt;/strong&gt;：https://blog.cba.nxlan.cn/p/setup_gemini_api&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;具体怎么开通、初始化机器、登录的过程，上面文章中已经说得很清楚了。&lt;/p&gt;
&lt;p&gt;只是还剩下一个任务，也就是本文的主题：&lt;/p&gt;
&lt;p&gt;使用1Panel 申请https 免费证书，搭建MCP server 供Agent使用。&lt;/p&gt;
&lt;p&gt;肝了两天，文章有点长，觉得好用点个赞呗。&lt;/p&gt;
&lt;h2 id=&#34;步骤概要&#34;&gt;步骤概要
&lt;/h2&gt;&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;强化防火墙策略&lt;/li&gt;
&lt;li&gt;ddns-go 组件安装&lt;/li&gt;
&lt;li&gt;1panel 安全配置优化  (启用ACME证书注册 )&lt;/li&gt;
&lt;li&gt;启用 MCP server&lt;/li&gt;
&lt;li&gt;反向代理服务配置&lt;/li&gt;
&lt;li&gt;可以一键安装“龙虾”  ^.^ （也是我推荐的方式）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;step0-强化防火墙策略&#34;&gt;Step0 强化防火墙策略
&lt;/h2&gt;&lt;p&gt;系统初始化后。VPC上 默认放行了 ssh http https 这些服务端口。&lt;/p&gt;
&lt;p&gt;具体到OS层面，熟悉Linux 的同学知道，&lt;strong&gt;默认&lt;/strong&gt;INPUT 方向的策略是全部&lt;strong&gt;放行&lt;/strong&gt;的——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; iptables -nvL INPUT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chain INPUT (policy ACCEPT 85401 packets, 12M bytes)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; pkts bytes target     prot opt in     out     source               destination  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这就导致一个什么问题呢？&lt;/p&gt;
&lt;p&gt;ssh 服务经常被暴力攻击——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260409161336806.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;所以，系统初始化后，第一步是更新系统组件： &lt;strong&gt;apt update &amp;amp; apt upgrade&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;第二步就应该是 &lt;strong&gt;加固ssh 服务&lt;/strong&gt;——避免被外部暴力破解。&lt;/p&gt;
&lt;p&gt;这里，使用了iptables 的 &amp;ldquo;recent&amp;quot;模块，去动态创建&amp;amp;更新 一个叫做&amp;quot;openssh&amp;quot;的&lt;strong&gt;白名单&lt;/strong&gt;库。&lt;/p&gt;
&lt;p&gt;实现只有白名单库里的公网IP 可以访问这台 Ubuntu的ssh服务，进一步说：只有这些白名单地址所在的地址&lt;/p&gt;
&lt;h3 id=&#34;1-创建iptabls-策略脚本&#34;&gt;1. 创建iptabls 策略脚本
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cat /usr/local/sbin/Protect_SSH_port.sh 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# set iptables input rules for protecting ssh port service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This script is intended to be run by root via a systemd service.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Flush ONLY the INPUT chain rules to ensure a clean state before applying new ones.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -F INPUT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Set rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -I INPUT &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# option： 放行Google IDC的跳板登录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -I INPUT &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; -s 34.81.160.0/24 -p tcp --dport &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -I INPUT &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; -p icmp --icmp-type &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; -m length --length &lt;span class=&#34;m&#34;&gt;879&lt;/span&gt; -j LOG --log-prefix &lt;span class=&#34;s1&#34;&gt;&amp;#39;SSH_OPEN_KEY&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -I INPUT &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; -p icmp --icmp-type &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; -m length --length &lt;span class=&#34;m&#34;&gt;879&lt;/span&gt; -m recent --name openssh --set --rsource -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -I INPUT &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; -p tcp --dport &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; --syn -m recent --name openssh --rcheck --seconds &lt;span class=&#34;m&#34;&gt;60&lt;/span&gt; --rsource -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -I INPUT &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; -p tcp --dport &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; -j DROP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sbin/iptables -A INPUT -p icmp -j DROP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-创建-protect-ssh-服务设置开机运行&#34;&gt;2. 创建 protect-ssh 服务，设置开机运行
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cat /etc/systemd/system/protect-ssh.service 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Description=Apply custom iptables rules to protect SSH port
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;After=network.target
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type=oneshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RemainAfterExit=yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ExecStart=/usr/local/sbin/Protect_SSH_port.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 当服务停止时，只清空 INPUT 链的规则
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ExecStop=/sbin/iptables -F INPUT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动并查看服务状态——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;systemctl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;protect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;systemctl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;protect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;systemctl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;status&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;protect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;●&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;protect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;service&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Apply&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;custom&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iptables&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rules&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;protect&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SSH&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;Loaded&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;loaded&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;etc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;systemd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;system&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;protect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;preset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;Active&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;active&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exited&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;since&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Thu&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2026&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;03&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;09&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;43&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ago&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;141811&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sbin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Protect_SSH_port&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exited&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SUCCESS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;Main&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;141811&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exited&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SUCCESS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-效果展示&#34;&gt;3. 效果展示
&lt;/h3&gt;&lt;p&gt;陌生用户，默认没有登录令牌。&lt;/p&gt;
&lt;p&gt;连ssh 会话都建立不起来——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260414153329300.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;知道登录令牌，先“敲门”登记一下——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里有个计算公式：&lt;/p&gt;
&lt;p&gt;因为： ICMP令牌长度 = Packetsize + ICMP 头部 [ &lt;strong&gt;8 字节&lt;/strong&gt; ] + IP 头部 [ &lt;strong&gt;20 字节&lt;/strong&gt; ]&lt;/p&gt;
&lt;p&gt;所以：packetsize [ 敲门令牌 ] = ICMP令牌长度 [ 这里是879 ] - 8 - 20 = &lt;strong&gt;851 字节&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260414154725659.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;ping通主机后，才可以正常登录——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260414153202143.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;这样就可以避免：主机被陌生人/主机 探测、破解的可能。&lt;/p&gt;
&lt;p&gt;部署后，再也没有陌生人的登录记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo0006F94F-4617-460C-B5B6-7AD4E609DE4C.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;step1-ddns-go-组件安装&#34;&gt;Step1 ddns-go 组件安装
&lt;/h2&gt;&lt;p&gt;因为云主机的固定IP是收费的，为了减少支出，在&lt;strong&gt;云主机创建时&lt;/strong&gt;外部IP是临时的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226123124238.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Create_VM7&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;外部IP地址不固定就带来一个问题——某天google 给主机更换外部IP 后，域名访问就失效了。&lt;/p&gt;
&lt;p&gt;除非人工重新进入 GCP 控制页面，查看新的IP，再手动重新映射域名。&lt;/p&gt;
&lt;p&gt;有没有简单的办法解决这个问题呢？有的，兄弟，有的！&lt;/p&gt;
&lt;p&gt;解决办法就是常听到的ddns 服务——通过一个探测脚本，定时去更新域名和IP映射关系。&lt;/p&gt;
&lt;p&gt;所以，下面以ddns-go 组件为例，在这台ubuntu 上完成域名自动映射服务。&lt;/p&gt;
&lt;h3 id=&#34;1-下载ddns-go-源码创建应用目录&#34;&gt;1. 下载ddns-go 源码，创建应用目录
&lt;/h3&gt;&lt;p&gt;先下载源码——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;wget&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jeessy2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ddns&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;releases&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;16.5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ddns&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go_6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;16.5&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_linux_x86_64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zxvf&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ddns&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go_6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;16.5&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_linux_x86_64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# ./ddns-go -v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;v6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;16.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;创建应用目录和空的配置文件——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p /usr/local/bin/ddns-go
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch /usr/local/bin/ddns-go/ddns_go_config.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp /tmp/ddns-go /usr/local/bin/ddns-go/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-导入配置文件&#34;&gt;2. 导入配置文件
&lt;/h3&gt;&lt;p&gt;ddns-go配置文件模板如下。&lt;/p&gt;
&lt;p&gt;注意更新 ddns账户的域名和 TOKEN（这里以CloudFlare 上的DNS 服务为例）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;59
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# cat /usr/local/bin/ddns-go/ddns_go_config.yaml 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dnsconf:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    - name: cloudflare
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ipv4:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        enable: true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        gettype: url
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        url: https://checkip.synology.com, https://ddns.oray.com/checkip, https://ip.3322.net,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        netinterface: ens4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        cmd: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        domains:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            - YOUR-DOMAIN-NAME
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ipv6:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        enable: false
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        gettype: url
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        url: https://speed.neu6.edu.cn/getIP.php, https://v6.ident.me, https://6.ipw.cn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        netinterface: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        cmd: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ipv6reg: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        domains:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            - &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      dns:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        name: cloudflare
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        secret: YOUR-DDNS-TOKEN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        extparam: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ttl: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;user:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    username: YOURNAME
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    password: YOURPASS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;webhook:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    webhookurl: YOUR-FEISHU-WEBHOOK
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    webhookrequestbody: |-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;msg_type&amp;#34;: &amp;#34;post&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;content&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &amp;#34;post&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &amp;#34;zh_cn&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &amp;#34;title&amp;#34;: &amp;#34;您的谷歌云主机公网IP变了&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &amp;#34;content&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &amp;#34;tag&amp;#34;: &amp;#34;text&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &amp;#34;text&amp;#34;: &amp;#34;新的IPv4地址：#{ipv4Addr}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &amp;#34;tag&amp;#34;: &amp;#34;text&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &amp;#34;text&amp;#34;: &amp;#34;域名更新结果：#{ipv4Result}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    webhookheaders: &amp;#39;Content-Type: application/json&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;notallowwanaccess: false
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lang: zh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-创建ddns-go-服务设置开机运行&#34;&gt;3. 创建ddns-go 服务，设置开机运行
&lt;/h3&gt;&lt;p&gt;和之前一样，为ddns-go 应用创建一个系统服务。&lt;/p&gt;
&lt;p&gt;路径和上面一致的话，复制粘贴就好。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# cat /etc/systemd/system/ddns-go.service &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Simple and easy to use DDNS. Automatically update domain name resolution to public IP &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Support Aliyun, Tencent Cloud, Dnspod, Cloudflare, Callback, Huawei Cloud, Baidu Cloud, Porkbun, GoDaddy...&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ConditionFileIsExecutable&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/bin/ddns-go/ddns-go
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Requires&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;network.target  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;network-online.target 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;StartLimitInterval&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;StartLimitBurst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/bin/ddns-go/ddns-go &lt;span class=&#34;s2&#34;&gt;&amp;#34;-l&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1:9876&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-f&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;300&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-cacheTimes&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/local/bin/ddns-go/ddns_go_config.yaml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Restart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;always
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RestartSec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后，启动服务——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; systemctl enable ddns-go 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; systemctl start ddns-go 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; systemctl status ddns-go 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;可以看到类似日志：
Apr 1 11:47:22  systemd[1]: Started ddns-go.service - Simple and easy to use DDNS. Automatically update domain name resol&amp;gt;
Apr 1 11:47:22  ddns-go[242234]: 2026/04/15 11:47:22 监听 127.0.0.1:9876
Apr 1 11:47:22  ddns-go[242234]: 2026/04/15 11:47:22 你的IP 35.212.158.199 没有变化, 域名 cloud.nxlan.cn&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;4-效果展示&#34;&gt;4. 效果展示
&lt;/h3&gt;&lt;p&gt;当云主机 IP 地址变化，会通知到feishu 中。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415103810818.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;因为，目前ddns-go的web 管理页面只开放在本地的 127.0.0.1:9876上，目前还不能通过web 方式去配置、修改它。&lt;/p&gt;
&lt;p&gt;等到 Step4 中的https 反向代理服务配置好后，就可以通过web 界面去管理了。（服务支持的 DDNS 厂商还是很多的，根据自己情况选择吧）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415114914499.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;step2-1panel-安全配置优化&#34;&gt;Step2 1panel 安全配置优化
&lt;/h2&gt;&lt;h3 id=&#34;1-加固ssh-登录&#34;&gt;1. 加固ssh 登录
&lt;/h3&gt;&lt;p&gt;1Panel的一个好处是：通过web 界面图形化地查看系统日志、设置系统基础配置。&lt;/p&gt;
&lt;p&gt;例如，这里的ssh 服务。&lt;/p&gt;
&lt;p&gt;进入**&amp;ldquo;系统&amp;rdquo; -&amp;gt; &amp;ldquo;SSH 管理&amp;rdquo;**页面。&lt;/p&gt;
&lt;p&gt;关闭密码认证和反向解析。并且设置root用户“ &lt;strong&gt;仅允许密钥登录&lt;/strong&gt; ”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415123244603.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果对Linux系统比较熟悉，建议将root 用户的登录也关闭掉。&lt;/p&gt;
&lt;p&gt;登录时使用 google 创建云主机时自动创建的普通用户帐号和密钥就行。&lt;/p&gt;
&lt;p&gt;此时只需将密钥公钥信息添加到家目录的&lt;strong&gt;authorized_keys&lt;/strong&gt;文件中就行。&lt;/p&gt;
&lt;p&gt;~# cat /home/YOURUSER/.ssh/authorized_keys
ecdsa-sha2-nistp256 AAAA&amp;hellip;..&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;然后，点击页面中的“密钥信息”，1Panel会自动创建一组登录 密钥&lt;strong&gt;用于root 用户&lt;/strong&gt;登录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415123759520.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;进一步，点击“详情”。把公钥和私钥信息全部“下载”下来。用于本地 ssh 客户端登录这台Google Cloud主机。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415123851325.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;点击“授权密钥”，可以看到密钥信息已经加载到 root 用户的ssh 白名单（就是 /root/.ssh/authorized_keys）中了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo2AB65800-F66C-4477-9E74-45CD2F2D4039.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;配合上一步的ddns 动态域名，使用ssh 客户端就可以顺利以root 用户身份登录 这台云主机了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415125702780.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-申请-acme-证书&#34;&gt;2. 申请 ACME 证书
&lt;/h3&gt;&lt;p&gt;其实也就是申请 &amp;ldquo;Let&amp;rsquo;s Encrypt&amp;rdquo; 颁发的免费证书，并自动续签。&lt;/p&gt;
&lt;p&gt;想必你也不希望 自己的数据“裸奔”在不可信的互联网上。&lt;/p&gt;
&lt;p&gt;首先来到**&amp;ldquo;网站&amp;rdquo; -&amp;gt; &amp;ldquo;证书&amp;rdquo;** 页面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415130518758.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;点击“DNS 账户”，关联自己的 DNS 域名和TOKEN。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“类型” 这里与之前ddns-go 域名设置中的域名服务商保持一致——CloudFlare。&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415130053457.png&#34; style=&#34;zoom:43%;&#34; /&gt;
&lt;p&gt;点击 “ACME 账户”，创建一个Let&amp;rsquo;s Encrypt账户，邮箱输入自己常用的就行。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415130758699.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;最后，点击&amp;quot;申请证书&amp;rdquo;，完成自动化证书申请和更新的配置。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415131145169.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;注意，&amp;ldquo;验证方式&amp;quot;为刚才创建的DNS 帐号，并&lt;strong&gt;勾选&amp;quot;自动续签&amp;rdquo;&lt;/strong&gt;。这样免费证书到期后，也不用人工干预，就可以自动续续订证书 。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415131230376.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;申请过程需要等1分钟左右，日志可以查看进度和完成情况——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415131601400.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;拿到证书，后续就可以用在很多地方，例如下面的 1Panel 管理页面。&lt;/p&gt;
&lt;h3 id=&#34;3-1panel-管理页面加固&#34;&gt;3. 1panel 管理页面加固
&lt;/h3&gt;&lt;p&gt;来到 &lt;strong&gt;&amp;ldquo;面板设置&amp;rdquo; -&amp;gt; &amp;ldquo;安全&amp;rdquo;&lt;/strong&gt; 页面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415131958119.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;绑定自己域名，并开启 &amp;ldquo;面板 SSL&amp;rdquo;。开启后，1Panel 管理页面会关联之前申请到的 ACME 证书。（如下图中的效果）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoenable_webmgt_ssl.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;同时最好开启两步验证，进一步加强登录安全。&lt;/p&gt;
&lt;p&gt;开启两步验证后的效果——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415132244869.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;step3-启用-mcp-server&#34;&gt;Step3 启用 MCP server
&lt;/h2&gt;&lt;h3 id=&#34;1-mcp-server-初始配置&#34;&gt;1. MCP server 初始配置
&lt;/h3&gt;&lt;p&gt;首先来到 &lt;strong&gt;&amp;ldquo;AI&amp;rdquo; -&amp;gt; &amp;ldquo;MCP&amp;rdquo; -&amp;gt; &amp;ldquo;Servers&amp;rdquo;&lt;/strong&gt; 。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415133409312.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;我们知道，MCP 下层用的是HTTP 协议，为了不直接将MCP server 暴露在外网，需要先安装 &lt;strong&gt;HTTP 反向代理服务&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;进入&amp;quot;应用商店&amp;quot; -&amp;gt; 筛选&amp;quot;web 服务器&amp;quot;标签，&lt;strong&gt;安装 OpenResty&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;该应用和后面提到的每一个独立的 MCP server，本质上都是以docker 方式运行的运行时。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415133917929.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;关于OpenResty 的简单介绍——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415133739429.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;h3 id=&#34;2-绑定网站&#34;&gt;2. 绑定网站
&lt;/h3&gt;&lt;p&gt;选中 &amp;ldquo;MCP&amp;quot;页面中的&amp;quot;绑定网站&amp;rdquo;——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415133612240.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;“域名”还是输入 ddns-go 那用到的自己域名。&lt;/p&gt;
&lt;p&gt;再次关联之前通过 ACME 拿到的证书。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415134406140.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;blockquote&gt;
&lt;p&gt;相同的证书，用在不同的服务上：&lt;/p&gt;
&lt;p&gt;之前是用于1Panel管理页面的登录（非443端口），这次是用于标准443 端口上全部https服务的反向代理。&lt;/p&gt;
&lt;p&gt;反代类似于在客户端和真实服务间加了一层垫片 。它的好处是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;缩小被攻击的范围；2. 隔离不同服务；3. 内部服务不用重复申请证书；4. 统一访问日志，可追加安全控制策略。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;3-创建第一个mcp-服务&#34;&gt;3. 创建第一个MCP 服务
&lt;/h3&gt;&lt;p&gt;我们先创建一个常用的MCP 服务——sequential-thinking。&lt;/p&gt;
&lt;p&gt;它可以为 大模型对话，提供多轮思考的上下文内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415161437741.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;&lt;strong&gt;类型&lt;/strong&gt;&amp;ldquo;选择 npx。 &amp;ldquo;&lt;strong&gt;启动命令&lt;/strong&gt;&amp;ldquo;中填入——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx -y @modelcontextprotocol/server-sequential-thinking
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果不使用HTTP 反向代理服务，这里就应该允许&amp;quot;端口外部访问&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;因为之前已经启用了 OpenResty ，访问这个 MCP server 的请求，都会经&lt;strong&gt;反向代理&lt;/strong&gt;转给真实服务。&lt;/p&gt;
&lt;p&gt;这里真实服务端口（8002）自然也不用暴露到外网。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415161652315.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;上面&amp;quot;SSE 路径&amp;quot;就是 MCP server 的服务 路径。&lt;/p&gt;
&lt;p&gt;来到 &lt;strong&gt;&amp;ldquo;网站&amp;rdquo; -&amp;gt; &amp;ldquo;HTTPS 域名&amp;rdquo; -&amp;gt; &amp;ldquo;反向代理&amp;rdquo;&lt;/strong&gt; 中可以看到，1Panel &lt;strong&gt;自动&lt;/strong&gt;为MCP 服务追加了 一条反向代理配置。（下图第二条）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415162505326.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;此时，测试一下这个MCP server 地址——&lt;/p&gt;
&lt;p&gt;服务正常响应了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415163022915.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;网站日志&amp;quot;中 也可以看到访问记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260415163145340.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;怎么样是不是很简单？分分钟一个 MCP server 服务就启动和上线了。&lt;/p&gt;
&lt;p&gt;&lt;u&gt;后续文章中，也会提到这个 thinking 工具的使用案例。&lt;/u&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-运行自己的mcp-源码&#34;&gt;4. 运行自己的MCP 源码
&lt;/h3&gt;&lt;p&gt;上面的方式，本质是把他人&lt;strong&gt;写好并打包发布&lt;/strong&gt; 的 MCP server代码拉取到 1Panel 的supergateway 容器中运行。&lt;/p&gt;
&lt;p&gt;那能不能把自己写好的服务，也跑在1Panel 上呢？例如之前文章 &lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/WliYhcC2RHeVFh0p-EN88Q&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MCP 案例： 求职助手&lt;/a&gt; 中的代码。&lt;/p&gt;
&lt;p&gt;这就相当于有一个 7＊24 的服务跑在云主机上，不用每次运行MCP server时 输入那一长串启动命令——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv --directory S:\trae_pj\jobsearch_mcp_server-1.0.0\src\jobsearch_mcp_server run jobsearch-mcp-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;说干就干。&lt;/p&gt;
&lt;p&gt;测试下，来可以通过 &lt;strong&gt;git&lt;/strong&gt; 拉取项目源代码到1Panel 的supergateway 容器中，并以 &lt;strong&gt;uvx&lt;/strong&gt; 方式更新并运行我们自己的代码 。&lt;/p&gt;
&lt;p&gt;效果如下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojobsearch_result.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;1Panel 配置方面不复杂，一页图就能看明白——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojobsearch.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;类型&amp;rdquo; 选择uvx，&amp;ldquo;启动命令&amp;quot;就这么一行。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/bin/sh -c &amp;#34;apk add git &amp;amp;&amp;amp; uvx --from git+http://lab.nxlan.cn:3008/pdream/jobsearch-mcp-server.git jobsearch-mcp-server --transport stdio&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;这里使用了 gitea 的 docker版本，用于管理&lt;a class=&#34;link&#34; href=&#34;http://lab.nxlan.cn:3008/pdream/jobsearch-mcp-server.git&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;项目代码&lt;/a&gt;。它可以兼容 git 命令。&lt;/p&gt;
&lt;p&gt;并且页面也类似于 github 的效果，属于轻量化的本地部署方案，回头有机会再讲讲这块的搭建和设置。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;为什么说 uvx 可以刷新最新代码呢？看下日志就会发现，它每次重启都会从gitea 上同步下源码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGouvx_run_logs2.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;这样每次改好源码，在&amp;quot;AI&amp;rdquo; -&amp;gt; &amp;ldquo;MCP&amp;rdquo; -&amp;gt; &amp;ldquo;Servers&amp;rdquo; 下重启jobsearch 这个应用，就自动完成了更新和发布。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojobsearch_mcp.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;step4-反向代理服务配置&#34;&gt;Step4 反向代理服务配置
&lt;/h2&gt;&lt;h3 id=&#34;1-自动创建的反代服务&#34;&gt;1. 自动创建的反代服务
&lt;/h3&gt;&lt;p&gt;在 &lt;strong&gt;&amp;ldquo;网站&amp;rdquo; -&amp;gt; &amp;ldquo;HTTPS 域名&amp;rdquo; -&amp;gt; &amp;ldquo;反向代理&amp;rdquo;&lt;/strong&gt; 中可以看到：&lt;/p&gt;
&lt;p&gt;之前启用mcp server 时，1Panel 自动帮我们创建好的两个反向代理配置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojobsearch_proxysetting2.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;具体配置长啥样呢？点击 &lt;strong&gt;&amp;ldquo;源文&amp;rdquo;&lt;/strong&gt; 就可以看到详细配置。这里以 jobsearch 这个服务为例——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;location ^~ /jobsearch {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_pass http://127.0.0.1:8005/jobsearch; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_buffering off; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_http_version 1.1; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Connection &amp;#39;&amp;#39;; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    chunked_transfer_encoding off; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;简单地说就是，当客户端浏览器访问站点 (&lt;a class=&#34;link&#34; href=&#34;https://lab.nxlan.cn&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://lab.nxlan.cn&lt;/a&gt;) 时，反向代理服务会根据客户端&lt;strong&gt;请求的路径&lt;/strong&gt;进行请求&lt;strong&gt;转发&lt;/strong&gt;。例如这里: 当匹配客户请求含有 &amp;ldquo;/jobsearch&amp;rdquo; 就转发至 &amp;ldquo;http://127.0.0.1:8005/jobsearch&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;同理，当匹配客户请求含有 &amp;ldquo;/sequential-thinking&amp;rdquo; 就转发至 &amp;ldquo;http://127.0.0.1:8000/sequential-thinking&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;1Panel自动创建的代理设置是简单场景下的配置，没问题就不用手动修改。&lt;/p&gt;
&lt;p&gt;可是，还有些特殊的web 应用，就不能使用默认的配置。&lt;/p&gt;
&lt;h3 id=&#34;2-ddns-go-的反代配置&#34;&gt;2. ddns-go 的反代配置
&lt;/h3&gt;&lt;p&gt;本文涉及需要手动修改的配置，有两个——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个是前面安装的 &lt;strong&gt;ddns-go&lt;/strong&gt;, 它也是有web 管理界面的 。&lt;/li&gt;
&lt;li&gt;还有一个就是 &lt;strong&gt;OpenClaw&lt;/strong&gt; 小龙虾了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGospeical_prosetting.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;先看ddns-go 的——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;location ^~ /ddns {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    # 1. 请求时：去掉 /ddns 前缀，发给后端
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    rewrite ^/ddns(/.*)$ $1 break; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    # 2. 响应时：如果后端想重定向到 /，就把它修正为 /ddns/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    # 这条规则能修正所有类似 /login -&amp;gt; /ddns/login 的重定向
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_redirect / /ddns/; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    # --- 其他代理设置 ---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_pass http://127.0.0.1:9876; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Host $host; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Real-IP $remote_addr; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Forwarded-Proto $scheme; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    add_header Cache-Control no-cache; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_ssl_server_name off; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果在原始服务中写死了请求 url ，所以当用户发起这种请求到达代理服务时，会破坏默认的转发规则。&lt;/p&gt;
&lt;p&gt;此时，&lt;strong&gt;需要改写用户请求&lt;/strong&gt;。——ddns-go 就是这样的例子。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;正常的请求：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用户请求网页 &lt;a class=&#34;link&#34; href=&#34;https://lab.nxlan.cn/ddns&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://lab.nxlan.cn/ddns&lt;/a&gt; &amp;ndash;&amp;gt; 反代 &amp;ndash;&amp;gt;原始服务 http://127.0.0.1:9876&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;异常的请求：&lt;/strong&gt;（因为 ddns-go 的登录页面 路径为 /login）&lt;/p&gt;
&lt;p&gt;用户请求网页 &lt;a class=&#34;link&#34; href=&#34;https://lab.nxlan.cn/login&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://lab.nxlan.cn/login&lt;/a&gt; &amp;ndash;&amp;gt; 反代 &amp;ndash;&amp;gt;  ？？？ 这是什么玩意 我这没有这个规则&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修正规则后的请求：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用户请求网页 &lt;a class=&#34;link&#34; href=&#34;https://lab.nxlan.cn/login&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://lab.nxlan.cn/login&lt;/a&gt; &amp;ndash;&amp;gt; 反代 &amp;ndash;&amp;gt;  规则重定向到 &lt;a class=&#34;link&#34; href=&#34;https://lab.nxlan.cn/ddns/login&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://lab.nxlan.cn/ddns/login&lt;/a&gt;  &amp;ndash;&amp;gt;  反代发现匹配现有/ddns 路由的规则 &amp;ndash;&amp;gt; 原始服务 http://127.0.0.1:9876/login&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;策略应用后，客户端看到的页面效果就是——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoddns-go_web.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-openclaw-的反代配置&#34;&gt;3. OpenClaw 的反代配置
&lt;/h3&gt;&lt;p&gt;OpenClaw 则是另一种情况：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从安全性的角度考量，建议开启gateway 中的 &amp;ldquo;allowedOrigins&amp;rdquo; 校验。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;gateway&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;port&amp;#34;: 18789,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;mode&amp;#34;: &amp;#34;local&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;bind&amp;#34;: &amp;#34;lan&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;controlUi&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;allowedOrigins&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;https://lab.nxlan.cn&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;http://127.0.0.1:18789&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;http://localhost:18789&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;dangerouslyAllowHostHeaderOriginFallback&amp;#34;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;dangerouslyDisableDeviceAuth&amp;#34;: false
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;auth&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;mode&amp;#34;: &amp;#34;token&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;token&amp;#34;: &amp;#34;${OPENCLAW_GATEWAY_TOKEN}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该校验内容来自哪里呢？&lt;/p&gt;
&lt;p&gt;需要在代理服务器上追加这部分请求信息，由&amp;quot;X-Forwarded-Proto&amp;quot;和 &amp;ldquo;X-Forwarded-For&amp;rdquo; 字段组成。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;location ^~ / {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_pass http://127.0.0.1:18789; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_http_version 1.1; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Upgrade $http_upgrade; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Connection &amp;#34;upgrade&amp;#34;; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header Host $host; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Real-IP $remote_addr; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_set_header X-Forwarded-Proto $scheme; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_read_timeout 3600; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_send_timeout 3600; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_ssl_server_name off; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    proxy_ssl_name $proxy_host; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此外还需要追加 OpenClaw 用到的 &lt;strong&gt;WebSocket&lt;/strong&gt; 的支持。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoopenclaw_wslogin.PNG&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;p&gt;后续，其他应用，也可以参考这两种方式灵活调整。毕竟，谁还没有一两个 AI 助手呢？&lt;/p&gt;
&lt;h2 id=&#34;step5-一键安装龙虾&#34;&gt;Step5 一键安装“龙虾”
&lt;/h2&gt;&lt;p&gt;龙虾最近不是很火么，恰好最近1Panel 丰富了龙虾安装配置，这里简单提一下。&lt;/p&gt;
&lt;h3 id=&#34;1-管理模型&#34;&gt;1. 管理模型
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&amp;ldquo;AI&amp;rdquo; -&amp;gt; &amp;ldquo;模型&amp;rdquo; -&amp;gt; &amp;ldquo;模型帐号&amp;rdquo;&lt;/strong&gt; 中关联自己的 大模型API 帐号。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo1panel_models.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-创建配置&#34;&gt;2. 创建配置
&lt;/h3&gt;&lt;p&gt;基础配置 图形化 点击就可以快速完成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocreate_openclaw.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-下载官方通信插件&#34;&gt;3. 下载官方通信插件
&lt;/h3&gt;&lt;p&gt;图形化功能适配，还比较方便，这里以飞书为例。&lt;/p&gt;
&lt;p&gt;当然，复杂的配置还是得修改 openclaw.json 这个主配置文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo1panel_add_channels.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-血泪史&#34;&gt;4. 血泪史
&lt;/h3&gt;&lt;p&gt;OpenClaw的配置文件是核心，但是它的接口适配做得很难用。&lt;/p&gt;
&lt;p&gt;每一项优化起来太麻烦了——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoopenclaw_optimized.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;目前最让我记忆深刻的有两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;我是在使用小龙虾 两个星期后，才知道 feishu 通信渠道插件有两个（一个是 openclaw 社区的，一个是feishu 自己的）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每次 OpenClaw 版本大更新后 配置文件的格式就变得乱七八糟，有的配置之前和现在完全不一样——&lt;strong&gt;毫无友好性&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果为了修复 升级后的配置问题，大概要花上半天时间 继续调试它。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;目前 1Panel 官方维护 一套他们根据 OpenClaw 发布后自动打包的 docker 镜像。&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/r/1panel/openclaw&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://hub.docker.com/r/1panel/openclaw&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以，有需要的话 还是找成功的案例 去复制一下吧，&lt;strong&gt;自己折腾还是太折磨了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;最后，祝AI 时代每个人不用更焦虑，做自己的主人，而不是交给AI 做主。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>生产环境“删库”救命指南：NAS &#43; vSphere 下的虚拟机数据恢复实操记录</title>
        <link>https://blog.cba.nxlan.cn/p/restore_vm/</link>
        <pubDate>Mon, 16 Mar 2026 01:06:45 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/restore_vm/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGorecovery_vm_title.png" alt="Featured image of post 生产环境“删库”救命指南：NAS &#43; vSphere 下的虚拟机数据恢复实操记录" /&gt;&lt;p&gt;&lt;strong&gt;声明&lt;/strong&gt;： 本文为真实操作记录，旨在为运维同学在面对“数据误删”或“虚机崩溃”时提供一套经过验证的恢复路径。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心金律&lt;/strong&gt;：操作千万条，备份第一条；挂载新签名，数据不破坏。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;一-场景回溯灾难发生的第-0-小时&#34;&gt;一、 场景回溯：灾难发生的第 0 小时
&lt;/h3&gt;&lt;p&gt;最近使用1panel(v2版本)时遇到个坑：如果“网站” 创建时指定了app 应用，在删除“网站”时 不留意会顺带把应用一起删除（见下图）。。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260305154237402.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;我刚养了两天的龙虾(OpenClaw) 数据，全没了。。。 呜呜呜~~&lt;/p&gt;
&lt;p&gt;而且本来就在调试，相关应用备份我是一点没准备好。这数据重新弄可老麻烦了（里面还有它刚给我调试好的 Agent web 页面）。&lt;/p&gt;
&lt;p&gt;冷静下来，&lt;strong&gt;思索的第一件事&lt;/strong&gt;是：我有没有快照？能恢复数据不？&lt;/p&gt;
&lt;p&gt;因为我是在虚拟机上安装的1panel和OpenClaw：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统备份是4天前的——还原了也用不了&lt;/li&gt;
&lt;li&gt;存储上整个iSCSI的块存储（Lun）倒是&lt;strong&gt;每天有一个快照&lt;/strong&gt;——全部还原意味着 8-9台虚拟机的数据也一并还原了。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这可咋办？&lt;/p&gt;
&lt;p&gt;最后，在&lt;u&gt;服务不停机&lt;/u&gt;的情况下，使用这个快照将应用（OpenClaw）数据恢复到了前一天的状态。&lt;/p&gt;
&lt;p&gt;先介绍下我的测试环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;存储端&lt;/strong&gt;：NAS (Btrfs 文件系统，开启了&lt;strong&gt;快照&lt;/strong&gt;功能)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算端&lt;/strong&gt;：VMware vSphere (ESXi 宿主机)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议&lt;/strong&gt;：iSCSI&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;二-灾难发生的第-1小时召回丢失的世界&#34;&gt;二、 灾难发生的第 1小时：召回“丢失的世界”
&lt;/h3&gt;&lt;p&gt;不要直接在原始快照上操作，最稳妥的方法是&lt;strong&gt;克隆&lt;/strong&gt;一个临时的 LUN。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;快照定位&lt;/strong&gt;：在 NAS 管理后台（如 SAN 管理器）找到最近一个完好的快照。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260307153520754.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;克隆 LUN&lt;/strong&gt;：基于快照克隆出一份数据卷（例如命名为 &lt;code&gt;LUN-Recover-Temp&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo00.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo11.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;暴露目标&lt;/strong&gt;：新增一个 iSCSI 目标（给个名字：recovery），并与刚才的克隆 LUN -1关联上。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo22.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260309233751100.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;为了方便后续挂载，新建iSCSI Target 中的“&lt;strong&gt;多重联机&lt;/strong&gt;”可以开启。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260309235059377.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：并确保LUN 策略中放行了 ESXi 宿主机的 IQN。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;三-灾难发生的第-2小时安全访问克隆数据&#34;&gt;三、 灾难发生的第 2小时：安全访问克隆数据
&lt;/h3&gt;&lt;p&gt;这是最惊险的一步，选错选项可能导致克隆卷的数据结构被清空。&lt;/p&gt;
&lt;h4 id=&#34;1-扫描与识别&#34;&gt;1. 扫描与识别
&lt;/h4&gt;&lt;p&gt;进入 vCenter -&amp;gt; 主机配置 -&amp;gt; 存储适配器，选择你的 iSCSI 适配器点击 &lt;strong&gt;“重新扫描存储”&lt;/strong&gt;。此时在“设备”列表中应能看到那个克隆出来容量一致的新磁盘。状态是未挂载。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo44.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h4 id=&#34;2-挂载数据存储关键&#34;&gt;2. 挂载数据存储（关键！）
&lt;/h4&gt;&lt;p&gt;点击“&lt;strong&gt;新建数据存储&lt;/strong&gt;”，选择 VMFS 类型，选中那个克隆出来的 LUN。此时向导会弹出 &lt;strong&gt;“解析选项”&lt;/strong&gt;，请屏住呼吸选择：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo33.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo55.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo66.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo77.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;❌ 保留现有签名 (Keep Existing Signature)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不选理由&lt;/strong&gt;：这会保留原始的 UUID。vSphere 会识别出这是一个已有的 VMFS 卷，会覆盖现有挂载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误选后果&lt;/strong&gt;：导致其他未受影响的虚拟机数据，一并还原至前一天的状态。——这不是我们希望的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;✅  分配新签名 (Assign a new signature)&lt;/strong&gt;：这通常用于想&lt;strong&gt;同时挂载原始和快照卷&lt;/strong&gt;的情况，会导致虚拟机路径变化，不推荐。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;选择理由&lt;/strong&gt;：当前环境，不希望停止正在运行的虚拟机，只希望把克隆盘中，昨天这台虚拟机中 OpenClaw 的应用数据导出来就行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;❌ 格式化磁盘 (Format the disk)&lt;/strong&gt;：点下去你就彻底告别数据了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;成功挂在后，可以看到一个新的“数据存储”，点击存储中“文件”可以看到前一天整个虚拟机的数据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260310001536516.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;四-虚拟机内部抢救数据&#34;&gt;四、 虚拟机内部：抢救数据
&lt;/h3&gt;&lt;p&gt;挂载成功后，&lt;strong&gt;浏览数据存储&lt;/strong&gt;，你会看到“死而复生”的 &lt;code&gt;.vmx&lt;/code&gt; 和 &lt;code&gt;.vmdk&lt;/code&gt; 文件。到这一步可以说：已经成功一半了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260310001719315.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注册虚拟机&lt;/strong&gt;：右键点击恢复出来的 &lt;code&gt;.vmx&lt;/code&gt; 文件 -&amp;gt; &lt;strong&gt;注册虚拟机&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启动&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启动恢复的虚机&lt;/strong&gt;：此时可能会提示“I Moved It”或“I Copied It”，选择 &lt;strong&gt;“I Copied It”&lt;/strong&gt; 以新运行一台昨天状态的机器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;断网/改 IP&lt;/strong&gt;：进系统后，第一时间修改主机 IP 地址，防止与生产环境冲突。&lt;/p&gt;
&lt;p&gt;因为这里是Linux主机，我就直接用到 nmtui命令快速修改新机器的IP 地址了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据导出与回填&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;因为应用是在 &lt;strong&gt;1Panel&lt;/strong&gt; 下运行的 Docker 服务。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;只需登录进新主机的1Panel管理界面，备份现有应用的应用数据即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260305160633373.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;随后，下载刚才打包好的备份数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回登录数据丢失的主机：在 1Panel 中保持 &lt;strong&gt;Docker 应用名一致&lt;/strong&gt; 的情况下，重新导入刚才这个备份数据——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260310003958425.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;服务启动：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;随后，服务重新启动。此时除了 服务Tokens 和之前的不一样以外，其他的配置文件，本地记录文件，飞书客户端对接地址。。。都是一样的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，应用就成功恢复了。&lt;/p&gt;
&lt;p&gt;数据还原成功后，克隆虚拟机和克隆卷也就不用了，可以相反的操作回到之前的状态：&lt;/p&gt;
&lt;p&gt;选择“删除虚拟机” &amp;ndash;&amp;gt; “&lt;strong&gt;删除数据存储&lt;/strong&gt;“  &amp;ndash;&amp;gt;  删除iSCSI target  &amp;ndash;&amp;gt;  删除 克隆Lun 即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;五-最后的复盘&#34;&gt;五、 最后的复盘
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;快照就是生命线&lt;/strong&gt;：如果你还没在 NAS 上开启定期快照，现在就去点开它。哪怕每天一个快照也行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1Panel 的优越性&lt;/strong&gt;：在这种场景下，Docker 应用的备份、还原比直接恢复整台虚机要快得多，也更灵活。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冷静是第一生产力&lt;/strong&gt;：NAS 和 VMware 都是多重保护的，只要不误点“&lt;strong&gt;格式化&lt;/strong&gt;”或“&lt;strong&gt;保留原有标签&lt;/strong&gt;”，数据总能找回来。&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>领取Google 开发者赠金，并开通Gemini API和免费云主机</title>
        <link>https://blog.cba.nxlan.cn/p/setup_gemini_api/</link>
        <pubDate>Wed, 25 Feb 2026 12:24:03 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/setup_gemini_api/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoTitle_image.png" alt="Featured image of post 领取Google 开发者赠金，并开通Gemini API和免费云主机" /&gt;&lt;h2 id=&#34;最终目标&#34;&gt;&lt;strong&gt;最终目标&lt;/strong&gt;
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;领取 Google 为开发者赠送的每个月10美元的赠金，并关联到Google Cloud的结算帐号下 （本文内容涵盖）&lt;/li&gt;
&lt;li&gt;使用有赠送金的帐号，开启Google AI Studio 的付费API功能，解除API调用Gemini模型时的限制 （本文内容涵盖）&lt;/li&gt;
&lt;li&gt;使用有赠送金的帐号，开通Google Cloud 免费额度服务器、安装 1Panel 图形化管理面板 （本文内容涵盖）&lt;/li&gt;
&lt;li&gt;使用1Panel 申请https 免费证书，搭建MCP server 供Agent使用 （后续更新，请期待）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;效果图&#34;&gt;效果图
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;成功领取赠送金&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodeveloper_credit_info.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;developer_credit_info&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;成功启用付费帐号帐号的API Key&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAPI_key_info.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API_key_info&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在Google Cloud上运行MCP server&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo1panel_mcp_server.png&#34; alt=&#34;1panel_mcp_server&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;准备工作&#34;&gt;准备工作
&lt;/h2&gt;&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;
&lt;p&gt;需要帐号开通google pro 后领取&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有google帐号，且帐号所属区域在美区&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;梯子&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;国内带有Visa 或 MasterCard 标志的银行卡 （虚拟卡会因为风控 用不了）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;美国免税州地址生成器&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;网站:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.meiguodizhi.com/usa-address/oregon&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.meiguodizhi.com/usa-address/oregon&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;主线流程&#34;&gt;主线流程
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;登录自己的Google 帐号，确认在美区&lt;/li&gt;
&lt;li&gt;登录Google Cloud&lt;/li&gt;
&lt;li&gt;激活结算帐号&lt;/li&gt;
&lt;li&gt;在结算帐号下领取每月10美元的赠送金&lt;/li&gt;
&lt;li&gt;在结算帐号下新建项目并启用 Gemini API&lt;/li&gt;
&lt;li&gt;开通 AI Studio 的付费API 功能&lt;/li&gt;
&lt;li&gt;开通免费额度服务器&lt;/li&gt;
&lt;li&gt;登录进虚拟机，完成1Panel的安装和web初始化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;过程步骤&#34;&gt;过程&amp;amp;步骤
&lt;/h2&gt;&lt;p&gt;下面是操作步骤。&lt;/p&gt;
&lt;p&gt;因为涉及google 旗下多个页面的网站，我会复制相关URL 链接在说明文字下方。所以，最好&lt;strong&gt;在电脑上查看和操作&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;0-开启美区的梯子&#34;&gt;0. 开启美区的梯子
&lt;/h3&gt;&lt;h3 id=&#34;1-登录自己的google-帐号并确认帐号也在美区&#34;&gt;1. 登录自己的Google 帐号，并确认帐号也在美区
&lt;/h3&gt;&lt;p&gt;美区可以完整地使用gemini 服务并领取其他优惠福利（如：Google One 学生福利），所以一般建议使用美区帐号操作。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;查看当前Google账号所属地区——
&lt;a class=&#34;link&#34; href=&#34;https://policies.google.com/terms?hl=en&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://policies.google.com/terms?hl=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果不在美区，使用以下链接修改地区——
&lt;a class=&#34;link&#34; href=&#34;https://policies.google.com/country-association-form&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://policies.google.com/country-association-form&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;美区账户的样子——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAccount_country_info.png&#34; alt=&#34;Account_country_info&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;h3 id=&#34;2-登录google-cloud&#34;&gt;2. 登录Google Cloud
&lt;/h3&gt;&lt;p&gt;先加入Google 开发者计划，查看&lt;strong&gt;是否有赠送的优惠可以领取&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;查看当前帐号是否有优惠——&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.google.com/program/my-benefits?hl=zh-cn&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://developers.google.com/program/my-benefits?hl=zh-cn&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodeveloper_benefits.png&#34; alt=&#34;developer_benefits&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;p&gt;如果像上图有“每月可获得$10 ”赠金的字样，表示可以领取。&lt;/p&gt;
&lt;p&gt;“无结算帐号”表示当前用户在Google Cloud 中还&lt;strong&gt;没有开通有效的结算帐号&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以，接下来需要登录 Google Cloud 服务，并&lt;strong&gt;开通结算帐号&lt;/strong&gt;。页面地址如下——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Google Cloud 结算帐号管理地址——&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://console.cloud.google.com/billing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://console.cloud.google.com/billing&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocloud_billing_info.png&#34; alt=&#34;cloud_billing_info&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;像上图这样，就是没有有效的结算账户。点击“创建账户”创建 ——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocloud_billing_create.png&#34; alt=&#34;cloud_billing_create&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;p&gt;使用前面提到的 “美国地址生成器” 和 自己的银行卡  信息，完成结算账户创建。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;网站:  &lt;a class=&#34;link&#34; href=&#34;https://www.meiguodizhi.com/usa-address/oregon&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.meiguodizhi.com/usa-address/oregon&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocloud_billing_create2.png&#34; alt=&#34;cloud_billing_create2&#34; style=&#34;zoom:85%;&#34; /&gt;
&lt;p&gt;完成创建后，就进入到“结算账户”的页面中，进行下一步操作。&lt;/p&gt;
&lt;h3 id=&#34;3-激活结算帐号&#34;&gt;3. 激活结算帐号
&lt;/h3&gt;&lt;p&gt;激活过程中，根据帐号新旧可能不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果是稳定使用多年的Google 帐号，直接就是激活状态的&lt;/li&gt;
&lt;li&gt;如果是Google 帐号刚注册不久或银行卡风险被评估为高，会触发先扣费 10-30 美元验证账户的情况。&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocloud_billing_overview1.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;​    图中就提示需要支付10美元，才能启用该账户 。如果&lt;strong&gt;不支付&lt;/strong&gt;，当前结算账户就是&lt;strong&gt;未激活&lt;/strong&gt;的状态。&lt;/p&gt;
&lt;p&gt;​    所以，为了后续顺畅使用，会支付这笔验证金。支付后，账户转为“&lt;strong&gt;付费账户&lt;/strong&gt;”的可用状态。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocloud_billing_overview2.png&#34; alt=&#34;cloud_billing_overview2&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;h3 id=&#34;4-在结算帐号下领取每月10美元的赠送金&#34;&gt;4. 在结算帐号下领取每月10美元的赠送金
&lt;/h3&gt;&lt;p&gt;回到之前打开的开发者计划优惠页面：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.google.com/program/my-benefits?hl=zh-cn&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://developers.google.com/program/my-benefits?hl=zh-cn&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;此时，就可以与上一步骤中创建好结算帐号（“我的结算帐号”）完成关联。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodeveloper_benefits_get.png&#34; alt=&#34;developer_benefits_get&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;点击“管理赠金”，就会看到赠送的 10 美元已经到帐了 ，并且关联到帐号“我的结算帐号”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodeveloper_credit_info.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;developer_credit_info&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;5-在结算帐号下新建项目并启用-gemini-api&#34;&gt;5. 在结算帐号下新建项目并启用 Gemini API
&lt;/h3&gt;&lt;p&gt;在Google Cloud下的“&lt;strong&gt;API 和服务&lt;/strong&gt;”中， 选择或创建项目——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;网址：https://console.cloud.google.com/projectselector2/apis/dashboard&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260225181246650.png&#34; alt=&#34;create_project&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;随后在 搜索中找到 Gemini API——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGosearch_gemini_api_services.png&#34; alt=&#34;search_gemini_api_services&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;p&gt;启用它——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoenable_gemini_api.png&#34; alt=&#34;enable_gemini_api&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h3 id=&#34;6-开通-ai-studio-的付费api-功能&#34;&gt;6. 开通 AI Studio 的付费API 功能
&lt;/h3&gt;&lt;p&gt;登录AI studio ——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;网址： &lt;a class=&#34;link&#34; href=&#34;https://aistudio.google.com/prompts/new_chat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://aistudio.google.com/prompts/new_chat&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAI_studio_API_key.png&#34; alt=&#34;AI_studio_API_key&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;点击 “&lt;strong&gt;NO API Key&lt;/strong&gt;”，进入关联付费API 账户的页面。&lt;/p&gt;
&lt;p&gt;按照以下步骤，逐步关联付费项目，并&lt;strong&gt;创建Gemini API key&lt;/strong&gt;——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGolinked_paid_API_key1.png&#34; alt=&#34;linked_paid_API_key1&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGolinked_paid_API_key2.png&#34; alt=&#34;linked_paid_API_key2&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGolinked_paid_API_key3.png&#34; alt=&#34;linked_paid_API_key3&#34; style=&#34;zoom:85%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGolinked_paid_API_key4.png&#34; alt=&#34;linked_paid_API_key4&#34; style=&#34;zoom:85%;&#34; /&gt;
&lt;p&gt;最后，确认。注意：&lt;strong&gt;不要勾选&lt;/strong&gt;“付费 API Key”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGolinked_paid_API_key.png&#34; alt=&#34;linked_paid_API_key&#34; style=&#34;zoom:85%;&#34; /&gt;
&lt;p&gt;点击“&lt;strong&gt;Get API key&lt;/strong&gt;”可以看到刚才创建的API Key——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAPI_key_info.png&#34; alt=&#34;API_key_info&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;该&lt;strong&gt;API key&lt;/strong&gt; 不仅可以在 AI studio 中使用，还可以用在第三方应用（例如：下图的Chatbox）——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGogemini_api_test.png&#34; alt=&#34;gemini_api_test&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h3 id=&#34;7-开通免费额度服务器&#34;&gt;7. 开通免费额度服务器
&lt;/h3&gt;&lt;p&gt;首先需要了解，哪些类型的资源是免费额度的。&lt;/p&gt;
&lt;p&gt;这里截取官方说明：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocloud_free_compute.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;cloud_free_compute&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;免费额度说明：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.cloud.google.com/free/docs/free-cloud-features?hl=zh-cn#free-tier-usage-limits&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.cloud.google.com/free/docs/free-cloud-features?hl=zh-cn#free-tier-usage-limits&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;所以，一会我们开通Google Cloud 上虚拟机的时候，需要选择 us-west1 的机器（俄勒冈），使用30GB的标准永久磁盘，实例类型需要是e2-micro （2core 1G），并尽量避免过多的到中国数据出站。&lt;/p&gt;
&lt;p&gt;具体操作步骤：&lt;/p&gt;
&lt;h4 id=&#34;71-创建虚拟机实例&#34;&gt;7.1 创建虚拟机实例
&lt;/h4&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226120045600.png&#34; alt=&#34;Create_VM1&#34; style=&#34;zoom: 50%;&#34; /&gt;
&lt;h4 id=&#34;72-选择机器配置&#34;&gt;7.2 选择机器配置
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;[机器配置]：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器区域，选&lt;strong&gt;免费额度&lt;/strong&gt;的us-west1(俄勒冈)&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226121404769.png&#34; alt=&#34;Create_VM2&#34; style=&#34;zoom: 50%;&#34; /&gt;
&lt;p&gt;机器类型选&lt;strong&gt;免费额度&lt;/strong&gt;的e2-micro&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226121744958.png&#34; alt=&#34;Create_VM3&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;[系统和存储]：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;系统选Ubuntu。&lt;strong&gt;注意：&lt;strong&gt;磁盘要改成&lt;/strong&gt;免费额度的&lt;/strong&gt;“标准永久性磁盘”，大小控制在30GB以内。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226120452731.png&#34; alt=&#34;Create_VM4&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;[数据保护]：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数据保护，选择&lt;strong&gt;无备份无复制&lt;/strong&gt;：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226122538475.png&#34; alt=&#34;Create_VM5&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;一来是因为，快照和跨区域备份都会产生费用；二来是因为，我们的配置和数据可以在1Panle 中通过图形化导出、备份。——即应用层级的备份，所以不使用这里系统级别的备份也是可行的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[网络]：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;网络这里需要设置两个地方——放行http和https的流量。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226123012892.png&#34; alt=&#34;Create_VM6&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;IP栈选择 IPv4，IP 类型要改为&lt;strong&gt;临时&lt;/strong&gt;，服务层级同样是 &lt;strong&gt;us-west1&lt;/strong&gt;。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226123124238.png&#34; alt=&#34;Create_VM7&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;[其他设置项]：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其他设置项目（可观测性、安全、高级）中保持默认——非必要不开启。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226123828691.png&#34; alt=&#34;Create_VM8&#34; style=&#34;zoom:57%;&#34; /&gt;
&lt;p&gt;最后，点击“创建”。&lt;/p&gt;
&lt;h4 id=&#34;73-查看机器信息&#34;&gt;7.3 查看机器信息
&lt;/h4&gt;&lt;p&gt;机器创建成功后，可以看到机器名和外部IP。还有ssh 登录连接。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo60E23E0C-D5E7-4F55-9A18-A574CAB4BCFE.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Create_VM9&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;其中，“&lt;strong&gt;外部IP&lt;/strong&gt;” 是一会我们从浏览器中访问的IP地址以及 后续域名映射时用到的外部IP。&lt;/p&gt;
&lt;p&gt;“&lt;strong&gt;查看结算报告&lt;/strong&gt;”可以统计最近一个月机器的使用情况，理论上应该像我这样&lt;strong&gt;费用为0&lt;/strong&gt;——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226125125697.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Create_VM10&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SSH&lt;/strong&gt;这里就是一会通过网页登录到虚拟机上操作的链接。后续会详细说明。&lt;/p&gt;
&lt;h4 id=&#34;74-登录虚拟机&#34;&gt;7.4 登录虚拟机
&lt;/h4&gt;&lt;p&gt;虚拟机创建好了，后续就是远程登录、操作这台虚拟机了。&lt;/p&gt;
&lt;p&gt;有&lt;strong&gt;两个方法&lt;/strong&gt;登录到这台虚拟机——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;长期办法：&lt;/strong&gt; 将自己本地的ssh 会话密钥导入到虚拟机用户.ssh 文件夹内。（下一篇文章会用到）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;临时办法：&lt;/strong&gt; 通过浏览器打开ssh 会话 或 通过google shell 跳转登录到这台机器上。 （本文使用）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我使用中，点击“浏览器窗口中打开”ssh 会话，一直无响应。&lt;/p&gt;
&lt;p&gt;所以，使用了另一种方法 ：通过google cloud shell 登录机器。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo5EFF80A5-EAC6-444C-BD40-BE4775F9B230.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Create_VM11&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;点击上面的“&lt;strong&gt;查看gcloud命令&lt;/strong&gt;”，可以得到一段命令。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo54AD6182-6FE7-4572-BE34-4F245AC68BC3.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Create_VM12&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;复制这段命令后，点击“&lt;strong&gt;在 Cloud Shell 中运行&lt;/strong&gt;”，就会进入google cloud shell 界面。&lt;/p&gt;
&lt;h3 id=&#34;8-登录进虚拟机完成1panel的安装和web初始化&#34;&gt;8. 登录进虚拟机，完成1Panel的安装和web初始化
&lt;/h3&gt;&lt;p&gt;在cloud shell 中粘贴刚才的命令，就可以成功登陆进虚拟机 。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocloud_shell_login.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;cloud_shell_login&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;登录到虚拟机后，使用下面的安装脚本，进行1Panle 工具的安装和启动。&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://1panel.cn/docs/v2/installation/online_installation/#2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;在线安装 - 1Panel 文档&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装成功后，出现&lt;strong&gt;外部地址和 用户、密码&lt;/strong&gt; 等信息——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: =================感谢您的耐心等待，安装已完成================== 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]:  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 请使用您的浏览器访问面板:  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 外部地址:  http://1.162.151.19:11634/c342b65410 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 内部地址:  http://192.168.202.57:11634/c342b65410 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 面板用户:  7b95048278 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 面板密码:  1a3a2e26ce 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]:  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 官方网站: https://1panel.cn 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 项目文档: https://1panel.cn/docs 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 代码仓库: https://github.com/1Panel-dev/1Panel 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 前往 1Panel 官方论坛获取帮助: https://bbs.fit2cloud.com/c/1p/7 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]:  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 如果您使用的是云服务器，请在安全组中打开端口 11634 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]:  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: 为了您的服务器安全，离开此屏幕后您将无法再次看到您的密码，请记住您的密码。 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]:  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[1Panel 2026-02-24 13:19:15 install Log]: ================================================================ 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;建议&lt;/strong&gt;：复制一份。稍候登录时 会使用。&lt;/p&gt;
&lt;p&gt;这里还有个提醒：“如果您使用的是云服务器，&lt;strong&gt;请在安全组中打开端口 11634&lt;/strong&gt; ”。&lt;/p&gt;
&lt;p&gt;所以，登录1panel 服务前还需要 在Google Cloud 中**追加一条策略 **: 允许公网访问虚拟机外部IP 的11634 tcp服务——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;防火墙管理页面——&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://console.cloud.google.com/net-security/firewall-manager/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://console.cloud.google.com/net-security/firewall-manager/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226132943734.png&#34; alt=&#34;permit-firewall-policy1&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;“来源地址范围”这里，如果你的网络环境有固定IP就填对应的固定IP，如果没有固定IP（例如家庭网络环境）就填写 &amp;ldquo;0.0.0.0/0&amp;rdquo;——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226133235010.png&#34; alt=&#34;permit-firewall-policy2&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;点击“&lt;strong&gt;创建&lt;/strong&gt;”完成这条防火墙策略的追加。&lt;/p&gt;
&lt;p&gt;同时，在“防火墙政策”中可以看到新增了一条 &lt;strong&gt;入站&lt;/strong&gt;方向，目标协议为 &lt;strong&gt;tcp:11634&lt;/strong&gt; 的放行策略。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226133619037.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;permit-firewall-policy3&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;最后，使用1Panel 安装时的&lt;strong&gt;外部地址&lt;/strong&gt;（例如：  http://1.162.151.19:11634/c342b65410 ）登录到1Panle 的web 管理页面——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226134156277.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;1panel-login&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结
&lt;/h2&gt;&lt;p&gt;至此，就完成了本文开头提到的任务目标：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;del&gt;领取 Google 为开发者赠送的每个月10美元的赠金，并关联到Google Cloud的结算帐号下 （本文内容涵盖）&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;使用有赠送金的帐号，开启Google AI Studio 的付费API功能，解除API调用Gemini模型时的限制 （本文内容涵盖）&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;使用有赠送金的帐号，开通Google Cloud 免费额度服务器、安装 1Panel 图形化管理面板 （本文内容涵盖）&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;使用1Panel 申请https 免费证书，搭建MCP server 供Agent使用 （后续更新，请期待）&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;qa-个别支线流程&#34;&gt;Q&amp;amp;A （个别支线流程）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Q：如果发现：帐号已经切换到美区了，梯子也在美国，但还是无法访问 Gemini 应用 (&lt;a class=&#34;link&#34; href=&#34;https://gemini.google.com/app&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://gemini.google.com/app&lt;/a&gt;)。&lt;/p&gt;
&lt;p&gt;A：可能是你的帐号之前有其他区的付款帐号存在，需要在以下支付账户管理页面中&lt;strong&gt;先删除非美国区的支付账户&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://payments.google.com/gp/w/home/settings&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://payments.google.com/gp/w/home/settings&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;Q：如果在创建“支付帐号”时使用了虚拟卡，在绑卡阶段会报错：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGovirtualcard_GCP_error.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;virtualcard_GCP_error&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;A：测试下来，是可以使用国内的Visa 或 MasterCard 信用卡绑定的。比起虚拟卡，直接用国内的双币卡还简单些。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Q：开通付费结算帐号后，最好设置下费用提醒。以免发生超额使用，也不知情的情况。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;​	A：具体操作路径在 “结算” &amp;ndash;&amp;gt; “ 预算和提醒” &amp;ndash;&amp;gt; &amp;ldquo;创建预算&amp;quot;下：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226114518807.png&#34; alt=&#34;billing-notification_1&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;​	设置每月预算金额就靠近 赠送额度上限，例如：9.5美金：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226114836113.png&#34; alt=&#34;billing-notification_2&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;​	系统会自动根据设置金额，计算提醒阈值。例如：实际支出达到 50% 90% 和 100%时都会收到通知提醒。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260226115106029.png&#34; alt=&#34;billing-notification_3&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;
&lt;p&gt;Q：开通了开发者帐号后，为什么只有第一个月有$10 赠送金，不是说可以连续领取12个月么？&lt;/p&gt;
&lt;p&gt;A：出现这种情况是因为：&lt;/p&gt;
&lt;p&gt;开通开发者帐号时，使用的google pro的身份不是来自自己帐号，而是从家庭帐号分享出来的。&lt;/p&gt;
&lt;p&gt;此时，家庭组成员的开发者帐号只能领取一个月的赠送金额。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Browser use 本地使用案例</title>
        <link>https://blog.cba.nxlan.cn/p/local_browser_use/</link>
        <pubDate>Wed, 11 Feb 2026 12:04:13 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/local_browser_use/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoimage-20260107101810905.png" alt="Featured image of post Browser use 本地使用案例" /&gt;&lt;h3 id=&#34;本期主角&#34;&gt;本期主角
&lt;/h3&gt;&lt;p&gt;[ &lt;strong&gt;Chrome MCP Server&lt;/strong&gt; ]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让AI接管你的浏览器，将您的浏览器转变为强大的 AI 控制自动化工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;话不多说，直接开干！&lt;/p&gt;
&lt;h3 id=&#34;准备工作&#34;&gt;准备工作
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt; 下需要提前准备以下内容：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;名称&lt;/th&gt;
          &lt;th&gt;描述&lt;/th&gt;
          &lt;th&gt;链接&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;nodejs 和 npm&lt;/td&gt;
          &lt;td&gt;nodejs 和 包管理工具&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://nodejs.org/dist/v24.12.0/node-v24.12.0-x64.msi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://nodejs.org/dist/v24.12.0/node-v24.12.0-x64.msi&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;chrome 浏览器&lt;/td&gt;
          &lt;td&gt;google chrome 浏览器&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.google.com/intl/en_au/chrome/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Chrome – download&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python&lt;/td&gt;
          &lt;td&gt;python 程序和运行时&lt;/td&gt;
          &lt;td&gt;貌似 在安装nodejs 的相关工具时，会自动更新 python 环境，等待安装完成就好&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;安装 nodejs 时，要勾选&lt;strong&gt;自动安装&lt;/strong&gt;必要环境组件的选项。否则安装完nodejs 和 npm 后还是会缺少 vs tools 等工具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107100114509.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107100114509&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;勾选后，会自动进行下载安装相关工具，例如：python、 Microsoft Visual C++、chocolatey 等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;准备工作完成：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107095433634.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107095433634&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目代码：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/hangwin/mcp-chrome?tab=readme-ov-file&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chrome MCP Server&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;D:%5cdownload%5cchrome-mcp-server-1.0.0.zip&#34; &gt;chrome-mcp-server-1.0.0.zip&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;执行安装步骤&#34;&gt;执行安装步骤：
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打开chrome，语言设置为【中文】&lt;/li&gt;
&lt;li&gt;在chrome 扩展中心，开启开发者模式&lt;/li&gt;
&lt;li&gt;选择“加载未打包的扩展程序”，安装上面下载好的 chrome-mcp-server 插件包（需先解压）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107100825620.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107100825620&#34;
	
	
&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;
&lt;p&gt;安装 依赖包&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;npm&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-g&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;mcp-chrome&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-bridge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动 chrome-mcp-server。&lt;/p&gt;
&lt;p&gt;启动成功的话，会提示“服务运行中”&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107101223399.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107101223399&#34;
	
	
&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;
&lt;p&gt;复制 上述MCP server 配置文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;mcpServers&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;streamable-mcp-server&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;type&amp;#34;: &amp;#34;streamable-http&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;url&amp;#34;: &amp;#34;http://127.0.0.1:12306/mcp&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;在chatbox-中使用browser-use-工具&#34;&gt;在chatbox 中使用Browser use 工具
&lt;/h3&gt;&lt;p&gt;当然也可以在，&lt;strong&gt;支持MCP client&lt;/strong&gt; 的Trace Cursor等工具上使用。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在chatbox 的&lt;strong&gt;mcp&lt;/strong&gt; 设置中，配置工具：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107101559805.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107101559805&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在chatbox 中，新建对话。关联刚新建的工具： streamable-mcp-server ，模型使用deepseek-chat。&lt;/p&gt;
&lt;p&gt;通过文本方式，告诉需要操作的任务——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107101810905.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107101810905&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后将看到 LLM 调用mcp 工具，完成chrome 操作 反思 执行任务的每一步：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107101951715.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107101951715&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107102008813.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107102008813&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260107102038089.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20260107102038089&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>K3S中使用 traefik 给App关联ACME证书 </title>
        <link>https://blog.cba.nxlan.cn/p/k3s_app_setclustercert/</link>
        <pubDate>Wed, 28 Jan 2026 12:34:17 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/k3s_app_setclustercert/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoK3S_updatecert.png" alt="Featured image of post K3S中使用 traefik 给App关联ACME证书 " /&gt;&lt;h2 id=&#34;前情提要&#34;&gt;前情提要：
&lt;/h2&gt;&lt;p&gt;最近，把TrueNAS 中的app traefik 升级（2.11 &amp;ndash;&amp;gt; 3.5.4 ）。&lt;/p&gt;
&lt;p&gt;结果发现，使用traefik反代的https流量，证书都变为traefik 的自签名证书了 ，修改app 中的证书关联项也不成功。&lt;/p&gt;
&lt;p&gt;而升级前，app 中都是可以关联我通过ACME 自动更新的签名证书 。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;p&gt;我的TrueNAS 版本是： TrueNAS-SCALE-23.10.2&lt;/p&gt;
&lt;p&gt;该版本还在使用K3S 管理app服务。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;于是又有了一篇，折腾后的文章。&lt;/p&gt;
&lt;h2 id=&#34;使用k3s-secret的办法手动指定证书&#34;&gt;使用K3S secret的办法手动指定证书
&lt;/h2&gt;&lt;h3 id=&#34;优点&#34;&gt;&lt;strong&gt;优点&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;符合 Kubernetes 最佳实践&lt;/li&gt;
&lt;li&gt;证书存储在 Kubernetes 内部，更安全&lt;/li&gt;
&lt;li&gt;更新证书只需更新 Secret，无需重启 Traefik 应用配置&lt;/li&gt;
&lt;li&gt;可以在多个 IngressRoute 中重复使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;缺点&#34;&gt;&lt;strong&gt;缺点&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;需要手动创建和管理 Secret&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;执行以下步骤创建traefik-的secret&#34;&gt;&lt;strong&gt;执行以下步骤创建traefik 的secret&lt;/strong&gt;
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;TrueNAS 系统的证书文件都在 /etc/certificates/ 文件夹下。&lt;/p&gt;
&lt;p&gt;这里主要用到的是 ACME域名证书。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;1-创建-secret&#34;&gt;&lt;strong&gt;1. 创建 Secret&lt;/strong&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;k3s kubectl create secret tls traefik-default-cert &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --namespace&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ix-traefik &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --cert&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/etc/certificates/ACME_Certificate.crt &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --key&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/etc/certificates/ACME_Certificate.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;2-验证-secret&#34;&gt;&lt;strong&gt;2. 验证 Secret&lt;/strong&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;k3s kubectl get secret traefik-default-cert -n ix-traefik
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;k3s kubectl describe secret traefik-default-cert -n ix-traefik
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;日志：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; k3s kubectl get secret traefik-default-cert -n ix-traefik -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQTBLZ0F3SUJBZ0lTQm9lTXdKYUxkZ2V2Mk1DZXBiSTZ0WEt0T......VJUSUZJQ0FURS0tLS0t
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  tls.key: LS0tLS1CR......S0VZLS0tLS0K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kind: Secret
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  creationTimestamp: &amp;#34;2026-01-19T10:22:48Z&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  name: traefik-default-cert
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  namespace: ix-traefik
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  resourceVersion: &amp;#34;114365208&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  uid: d54fd403-330a-4e43-8104-1188ced48c83
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type: kubernetes.io/tls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;测试是否生效&#34;&gt;&lt;strong&gt;测试是否生效&lt;/strong&gt;
&lt;/h2&gt;&lt;h3 id=&#34;1-创建一个测试-ingressroute&#34;&gt;1. 创建一个测试 IngressRoute
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &amp;gt; test-tls.yaml &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;apiVersion: traefik.io/v1alpha1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;kind: IngressRoute
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  name: test-cert
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  namespace: ix-traefik
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  entryPoints:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    - websecure
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  routes:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    - match: Host(&amp;#39;test.home.nxlan.cn&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;      kind: Rule
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;      services:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;        - name: whoami
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;          port: 80
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  tls:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    secretName: traefik-default-cert
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-应用上述测试配置&#34;&gt;2. 应用上述测试配置
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;k3s kubectl apply -f test-tls.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-使用curl-测试证书生效情况&#34;&gt;3. 使用curl 测试证书生效情况
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@truenas&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;/etc/certificates&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# curl -v https://test.home.nxlan.cn --insecure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   Trying 192.168.202.6:443...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Connected to test.home.nxlan.cn &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;192.168.202.6&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; port &lt;span class=&#34;m&#34;&gt;443&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* ALPN: offers h2,http/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;OUT&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, Client hello &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IN&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, Server hello &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;2&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IN&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, Encrypted Extensions &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IN&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, Certificate &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;11&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IN&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, CERT verify &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;15&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IN&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, Finished &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;20&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;OUT&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS change cipher, Change cipher spec &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;OUT&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, Finished &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;20&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* ALPN: server accepted h2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Server certificate:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  subject: &lt;span class=&#34;nv&#34;&gt;CN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;home.nxlan.cn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  start date: Dec &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; 01:53:44 &lt;span class=&#34;m&#34;&gt;2025&lt;/span&gt; GMT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  expire date: Mar &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; 01:53:43 &lt;span class=&#34;m&#34;&gt;2026&lt;/span&gt; GMT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  issuer: &lt;span class=&#34;nv&#34;&gt;C&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;US&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;O&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Let&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;s Encrypt&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;E7
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*  SSL certificate verify result: unable to get &lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; issuer certificate &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;20&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, continuing anyway.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* using HTTP/2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* h2h3 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;:method: GET&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* h2h3 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;:path: /&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* h2h3 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;:scheme: https&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* h2h3 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;:authority: test.home.nxlan.cn&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* h2h3 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;user-agent: curl/7.88.1&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* h2h3 &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;accept: */*&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Using Stream ID: &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;easy handle 0x56179e69fc90&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; GET / HTTP/2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; Host: test.home.nxlan.cn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; user-agent: curl/7.88.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; accept: */*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* TLSv1.3 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;IN&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, TLS handshake, Newsession Ticket &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;4&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; HTTP/2 &lt;span class=&#34;m&#34;&gt;404&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; content-type: text/plain&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; x-content-type-options: nosniff
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; content-length: &lt;span class=&#34;m&#34;&gt;19&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; date: Mon, &lt;span class=&#34;m&#34;&gt;19&lt;/span&gt; Jan &lt;span class=&#34;m&#34;&gt;2026&lt;/span&gt; 12:08:54 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;404&lt;/span&gt; page not found
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Connection &lt;span class=&#34;c1&#34;&gt;#0 to host test.home.nxlan.cn left intact&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;其中证书部分时间可以看出，ACME 证书已经生效了——&lt;/p&gt;
&lt;p&gt;Server certificate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;subject: CN=home.nxlan.cn&lt;/li&gt;
&lt;li&gt;start date: Dec 22 01:53:44 2025 GMT&lt;/li&gt;
&lt;li&gt;expire date: Mar 22 01:53:43 2026 GMT&lt;/li&gt;
&lt;li&gt;issuer: C=US; O=Let&amp;rsquo;s Encrypt; CN=E7&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;在app-中关联secret-证书&#34;&gt;在app 中关联secret 证书
&lt;/h2&gt;&lt;h3 id=&#34;1-点击truenas-中的-应用&#34;&gt;1. 点击TrueNAS 中的 “应用”
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotruenas_apps.PNG&#34; alt=&#34;truenas_apps&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;h3 id=&#34;2-编辑已关联traefik-的app找到tls-settings-部分关联刚设置好的secret&#34;&gt;2. 编辑已关联traefik 的app，找到“TLS-Settings” 部分，关联刚设置好的secret
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoK3S_APP_certificate.PNG&#34; alt=&#34;K3S_APP_certificate&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;应用生效。&lt;/p&gt;
&lt;h3 id=&#34;3-访问app-web-页面验证生效&#34;&gt;3. 访问app web 页面验证生效
&lt;/h3&gt;&lt;p&gt;浏览器不再提示“证书错误”，至此所有操作完成。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260128131211776.png&#34; alt=&#34;image-20260128131211776&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;h2 id=&#34;追加补充&#34;&gt;追加补充：
&lt;/h2&gt;&lt;p&gt;上面追加的配置文件，不会随着证书更新而自动更新。&lt;/p&gt;
&lt;p&gt;所以，需要定期刷新 这个自定义证书配置。刷新的方法 也很简单——使用计划任务定期执行shell 脚本。&lt;/p&gt;
&lt;h3 id=&#34;1-shell脚本&#34;&gt;1. shell脚本
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /usr/local/bin/update-cert.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;===================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 脚本路径和命名空间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ix-traefik&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SECRET_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;traefik-default-cert&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CERT_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/etc/certificates/ACME_Certificate.crt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;KEY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/etc/certificates/ACME_Certificate.key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 删除旧的 secret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;k3s kubectl delete secret &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SECRET_NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; --namespace&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 用新文件创建 secret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;k3s kubectl create secret tls &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SECRET_NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --namespace&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --cert&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CERT_PATH&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --key&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;KEY_PATH&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Secret &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;SECRET_NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; in namespace &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; has been updated.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-计划任务&#34;&gt;2. 计划任务
&lt;/h3&gt;&lt;p&gt;&amp;ldquo;系统&amp;rdquo; &amp;ndash;&amp;gt; &amp;ldquo;高级&amp;rdquo; &amp;ndash;&amp;gt; &amp;ldquo;编辑定时任务&amp;rdquo; 中，追加上述脚本。&lt;/p&gt;
&lt;p&gt;我这里设置为 每月2号，更新证书配置“traefik-default-cert”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260316001454358.png&#34; style=&#34;zoom:67%;&#34; /&gt;
</description>
        </item>
        <item>
        <title>iSCSI 文件共享冲突——这可能不是iSCSI 的锅。。。</title>
        <link>https://blog.cba.nxlan.cn/p/iscsi_share/</link>
        <pubDate>Wed, 28 Jan 2026 11:02:35 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/iscsi_share/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoiscsi_img.png" alt="Featured image of post iSCSI 文件共享冲突——这可能不是iSCSI 的锅。。。" /&gt;&lt;h2 id=&#34;前情提要&#34;&gt;前情提要：
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;之前在vCenter 中使用 iSCSI 提供统一存储服务都是好好的。&lt;/li&gt;
&lt;li&gt;后来 想着在本地windows PC 上也使用iSCSI，方便存储一些 不常用的文件。&lt;/li&gt;
&lt;li&gt;结果，因为本地有两个PC 同时访问一个 iSCSI 盘的情况（想着游戏盘 就共享了）。但是，两台机器同时有操作 就会发现有文件损坏or 丢失的情况。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;修复-iscsi-盘中-无法枚举容器中的对象访问被拒绝的问题&#34;&gt;修复 iSCSI 盘中 “无法枚举容器中的对象，访问被拒绝”的问题
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;现象&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;PC-B 复制已经下载好的 ollama 模型到共享盘 &amp;ldquo;N:\Ollama_models&amp;quot;后，PC-A 读取这个文件夹时报错：&lt;/p&gt;
&lt;p&gt;“windows 文件夹权限提示：“无法枚举容器中的对象，访问被拒绝”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;具体修复动作如下：&lt;/p&gt;
&lt;h3 id=&#34;1-先修复文件夹所有者&#34;&gt;1. 先修复文件夹所有者
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;takeown /f &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models&amp;#34;&lt;/span&gt; /r /d y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;执行记录：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-05a61d37b08453e59290add468e3bb2f688e23a01e967fecb0e2fa41218cea76&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-06507c7b42688469c4e7298b0a1e16deff06caf291cf0a5b278c308249c3e439&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-0a3d61b01340ca9dceb4a661e21b3dfe1418ed5206d91291ab933a3762f8bb89&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-3a18673ff291a1d8de94d490877127899356d33a18028d5f3945bf245c11b02c&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-3fcd3febec8b3fd64435204db75bf0dd73b91e8d0661e0331acfe7e7c3120b85&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-59bb50d8116b6a1f9bfbb940d6bb946a05554e591e30c8c2429ed6c854867ecb&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-6e4c38e1172f42fdbff13edf9a7a017679fb82b0fde415a3e8b3c31c6ed4a4e4&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-772f510b95588aeb9fbd2298b2b647bceba48aceb05e3a26ff14812eb1f6dc14&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-8893e08fa9f91f7dc39e24d27bdfaece4e9c86bb3269293ff8cea6cba98c872d&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-8972a96b8ff1957ca24ff839aeb54411e6849de68609857a3fa17a4e78114247&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-9202febed9e2dadac14bca089be90864571336fa9f4375b690a26ed548957fde&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-a3a0e9449cb691a12f4de1d03725fd41326614fdeaf5d80b28c51187da0bed0e&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-a3de86cd1c132c822487ededd47a324c50491393e6565cd14bafa40d0b8e686f&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-a406579cd136771c705c521db86ca7d60a6f3de7c9b5460e6193a2df27861bde&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-ae370d884f108d16e7cc8fd5259ebc5773a0afa6e078b11f4ed7e39a27e0dfc4&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-ae40a217c1c4002e9358f0f6597a349acaace0cfb95dc53db7ce646d57a56271&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-c5ad996bda6eed4df6e3b605a9869647624851ac248209d22fd5e2c0cc1121d3&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-c8efaf6dac5aab4dc1030895032f0f028d7835348bdb21d4aebb89cda5788fe5&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-cff3f395ef3756ab63e58b0ad1b32bb6f802905cae1472e6a12034e4246fbbdb&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-d18a5cc71b84bc4af394a31116bd3932b42241de70c77d2b76d69a314ec8aa12&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-e6a7edc1a4d7d9b2de136a221a57336b76316cfe53a252aeba814496c5ae439d&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-ed8474dc73db8ca0d85c1958c91c3a444e13a469c2efb10cd777ca9baeaddcb7&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\blobs\sha256-f64cd5418e4b038ef90cf5fab6eb7ce6ae8f18909416822751d3b9fca827c2ab&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所 有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-coder&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-ocr&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-r1&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3-embedding&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-coder\6.7b&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-ocr\3b&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-ocr\latest&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-r1\8b&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3\8b&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3-embedding\0.6b&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。成功: 此文件(或文件夹): &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3-embedding\8b&amp;#34;&lt;/span&gt; 现在由用户 &lt;span class=&#34;s2&#34;&gt;&amp;#34;DESKTOP-GVTOPMJ\gg&amp;#34;&lt;/span&gt; 所有。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;C&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;\WINDOWS\system32&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-再修复文件权限&#34;&gt;2. 再修复文件权限
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;icacls &lt;span class=&#34;s2&#34;&gt;&amp;#34;N:\Ollama_models&amp;#34;&lt;/span&gt; /reset /t /c /l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;执行记录：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;C&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;\WINDOWS\system32&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&amp;gt;已处理的文件: N:\Ollama_models已处理的文件: N:\Ollama_models\blobs已处理的文件: N:\Ollama_models\manifests已处理的文件: N:\Ollama_models\blobs\sha256-05a61d37b08453e59290add468e3bb2f688e23a01e967fecb0e2fa41218cea76已处理的文件: N:\Ollama_models\blobs\sha256-06507c7b42688469c4e7298b0a1e16deff06caf291cf0a5b278c308249c3e439已处理的文件: N:\Ollama_models\blobs\sha256-0a3d61b01340ca9dceb4a661e21b3dfe1418ed5206d91291ab933a3762f8bb89已处理的文件: N:\Ollama_models\blobs\sha256-3a18673ff291a1d8de94d490877127899356d33a18028d5f3945bf245c11b02c已处理的文件: N:\Ollama_models\blobs\sha256-3fcd3febec8b3fd64435204db75bf0dd73b91e8d0661e0331acfe7e7c3120b85已处理的文件: N:\Ollama_models\blobs\sha256-59bb50d8116b6a1f9bfbb940d6bb946a05554e591e30c8c2429ed6c854867ecb已处理的文件: N:\Ollama_models\blobs\sha256-6e4c38e1172f42fdbff13edf9a7a017679fb82b0fde415a3e8b3c31c6ed4a4e4已处理的文件: N:\Ollama_models\blobs\sha256-772f510b95588aeb9fbd2298b2b647bceba48aceb05e3a26ff14812eb1f6dc14已处理的文件: N:\Ollama_models\blobs\sha256-8893e08fa9f91f7dc39e24d27bdfaece4e9c86bb3269293ff8cea6cba98c872d已处理的文件: N:\Ollama_models\blobs\sha256-8972a96b8ff1957ca24ff839aeb54411e6849de68609857a3fa17a4e78114247已处理的文件: N:\Ollama_models\blobs\sha256-9202febed9e2dadac14bca089be90864571336fa9f4375b690a26ed548957fde已处理的文件: N:\Ollama_models\blobs\sha256-a3a0e9449cb691a12f4de1d03725fd41326614fdeaf5d80b28c51187da0bed0e已处理的文件: N:\Ollama_models\blobs\sha256-a3de86cd1c132c822487ededd47a324c50491393e6565cd14bafa40d0b8e686f已处理的文件: N:\Ollama_models\blobs\sha256-a406579cd136771c705c521db86ca7d60a6f3de7c9b5460e6193a2df27861bde已处理的文件: N:\Ollama_models\blobs\sha256-ae370d884f108d16e7cc8fd5259ebc5773a0afa6e078b11f4ed7e39a27e0dfc4已处理的文件: N:\Ollama_models\blobs\sha256-ae40a217c1c4002e9358f0f6597a349acaace0cfb95dc53db7ce646d57a56271已处理的文件: N:\Ollama_models\blobs\sha256-c5ad996bda6eed4df6e3b605a9869647624851ac248209d22fd5e2c0cc1121d3已处理的文件: N:\Ollama_models\blobs\sha256-c8efaf6dac5aab4dc1030895032f0f028d7835348bdb21d4aebb89cda5788fe5已处理的文件: N:\Ollama_models\blobs\sha256-cff3f395ef3756ab63e58b0ad1b32bb6f802905cae1472e6a12034e4246fbbdb已处理的文件: N:\Ollama_models\blobs\sha256-d18a5cc71b84bc4af394a31116bd3932b42241de70c77d2b76d69a314ec8aa12已处理的文件: N:\Ollama_models\blobs\sha256-e6a7edc1a4d7d9b2de136a221a57336b76316cfe53a252aeba814496c5ae439d已处理的文件: N:\Ollama_models\blobs\sha256-ed8474dc73db8ca0d85c1958c91c3a444e13a469c2efb10cd777ca9baeaddcb7已处理的文件: N:\Ollama_models\blobs\sha256-f64cd5418e4b038ef90cf5fab6eb7ce6ae8f18909416822751d3b9fca827c2ab已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-coder已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-ocr已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-r1已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3-embedding已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-coder\6.7b已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-ocr\3b已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-ocr\latest已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\deepseek-r1\8b已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3\8b已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3-embedding\0.6b已处理的文件: N:\Ollama_models\manifests\registry.ollama.ai\library\qwen3-embedding\8b已成功处理 40 个文件; 处理 0 个文件时失败&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-执行完上述修复再次操作验证&#34;&gt;3. 执行完上述修复，再次操作验证
&lt;/h3&gt;&lt;p&gt;PC-A 上再次读取执行 N:\Ollama_models 就正常了。&lt;/p&gt;
&lt;h2 id=&#34;回到标题为什么这个问题根因不在iscsi上&#34;&gt;回到标题，为什么这个问题根因不在iSCSI上？
&lt;/h2&gt;&lt;h3 id=&#34;因为ntfs-不是一个集群文件系统&#34;&gt;因为NTFS 不是一个集群文件系统。
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;它被设计为一次只能由一台计算机（一个操作系统实例）独占访问和管理。当第二台计算机试图挂载同一个NTFS卷时，它无法感知第一台计算机的操作，反之亦然。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;两台PC 同时操作一个NTFS 盘会发生什么？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;数据损坏（最可能且最严重）：&lt;/p&gt;
&lt;p&gt;写入覆盖：PC-A 和 PC-B 可能同时修改同一个文件的同一部分，或一个在写入而另一个在读取。最终写入磁盘的数据将是混乱的，文件内容被破坏。&lt;/p&gt;
&lt;p&gt;元数据损坏：NTFS 的元数据（如主文件表 MFT、位图、日志）是文件系统的“目录和账本”。两台机器同时更新这些关键数据结构（例如，创建/删除文件、扩展文件大小），会立即导致文件系统逻辑混乱，可能使整个卷无法识别。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缓存一致性问题：&lt;/p&gt;
&lt;p&gt;每台PC都会在内存中缓存文件和元数据以提高性能。一台PC对文件的修改会停留在自己的缓存中，不会立即通知另一台PC。另一台PC读取到的是磁盘上的旧数据或自己缓存中的旧数据，导致数据视图不一致。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统不稳定和蓝屏：&lt;/p&gt;
&lt;p&gt;当Windows检测到文件系统出现严重逻辑错误或无法理解的元数据状态时（例如，它认为应该空闲的块却被另一台机器分配了），可能会抛出文件系统错误，导致应用程序崩溃，甚至引发系统蓝屏死机。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“脏卷”和强制检查：&lt;/p&gt;
&lt;p&gt;当一台PC正常卸载卷（或关机）时，它会执行清理操作，将缓存写入磁盘并标记卷为“干净”状态。&lt;/p&gt;
&lt;p&gt;如果另一台PC还在使用，当它最终卸载时，或系统意外崩溃，卷会被标记为“脏”。下次任何一台PC尝试挂载时，Windows 的 chkdsk 会强制运行以尝试修复，但修复过程很可能导致数据丢失或损坏，因为它无法理解由并发访问造成的复杂损坏。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;也就是说，chkdsk 修复数据也不是万能的，首先它的有正确的元数据信息 。&lt;/p&gt;
&lt;p&gt;如果，这里的元数据损坏，chkdsk 修复可能只是让它 看起来可以读取、写入了。&lt;/p&gt;
&lt;p&gt;至于，文件数据是否和之前的一致，它也是不确定的。&lt;/p&gt;
&lt;p&gt;例如，修复后的照片成了这样——&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoerror_img_examp.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;error_img_examp&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;而同样使用-iscsi-协议的vmfs-文件系统就不会发生这样的问题&#34;&gt;而同样使用 iSCSI 协议的VMFS 文件系统就不会发生这样的问题
&lt;/h3&gt;&lt;p&gt;首先，VMFS 文件系统在设计目标中就为了多主机并发访问使用——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VMFS 如何安全地实现多主机并发访问？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;元数据操作串行化&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当一台ESXi主机需要创建或删除虚拟机文件时，它会向存储设备发起一个 &lt;strong&gt;SCSI预留&lt;/strong&gt;（一种锁），短暂地独占访问权以更新VMFS的元数据。操作完成后立即释放。其他主机会等待。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这保证了文件系统结构（“账本”）永远不会被同时篡改。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据操作允许并行&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于虚拟机虚拟磁盘文件（VMDK）&lt;strong&gt;内部&lt;/strong&gt;的数据读写，多台主机可以同时进行。因为每台主机操作的是文件内不同的偏移量块，VMFS不需要为此上全局锁。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这实现了高性能的并发虚拟机运行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;心跳和脑裂保护&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VMFS在存储上有一个小的区域用于存储“心跳”。主机定期在此写入信息，表明自己“存活”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果一台主机故障，其他主机能通过心跳超时检测到，并可以安全地接管其资源，避免出现“脑裂”（两台主机都以为自己是唯一操作者）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;如果对比 NTFS 和 VMFS 文件系统——&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;特性&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;strong&gt;NTFS&lt;/strong&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;strong&gt;VMFS&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;设计目标&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;单台物理机或虚拟机的本地文件系统&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;专为多台ESXi主机并发访问共享存储而设计&lt;/strong&gt;的集群文件系统&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;并发访问&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;不支持&lt;/strong&gt;。没有内置的分布式锁机制。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;核心功能&lt;/strong&gt;。内置了&lt;strong&gt;分布式锁管理器&lt;/strong&gt;和&lt;strong&gt;原子操作&lt;/strong&gt;。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;元数据保护&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;假设自己独占磁盘，直接修改。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;使用&lt;strong&gt;磁盘心跳区、SCSI预留、原子测试与设置&lt;/strong&gt;等机制，在修改关键元数据（如文件目录、空间位图）前，会先“&lt;strong&gt;上锁&lt;/strong&gt;”，确保同一时刻只有一台主机能进行修改。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;缓存一致性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;每台机器的缓存独立，无同步。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;设计时考虑了缓存失效机制。虽然数据缓存主要在主机内存，但&lt;strong&gt;元数据变更会&lt;/strong&gt;通过存储网络&lt;strong&gt;通知&lt;/strong&gt;其他主机使其缓存失效或更新。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;适用场景&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Windows/Linux本地磁盘，或&lt;strong&gt;一对一&lt;/strong&gt;的iSCSI连接。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;多对一&lt;/strong&gt;的共享存储场景，典型如vSphere集群、多主机同时运行其上的虚拟机。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;p&gt;所以说，共享块存储本身没有问题（iSCSI/FC），&lt;strong&gt;问题在于其之上运行的文件系统是否支持多节点并发访问&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这里的案例就是，在&lt;strong&gt;感觉&lt;/strong&gt;vmware 可行，那windows 也可行认知下的错误做法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误做法&lt;/strong&gt;：共享块存储 + &lt;strong&gt;非集群文件系统&lt;/strong&gt; = 数据灾难。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;正确的解决方案&#34;&gt;正确的解决方案
&lt;/h2&gt;&lt;p&gt;如果你需要让多台终端共享访问同一个存储池，必须使用正确的技术栈：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows Server Failover Cluster (WSFC) + CSV&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;这是微软官方的解决方案。多台服务器组成故障转移集群，使用&lt;strong&gt;集群共享卷&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关键点&lt;/strong&gt;：在任何时刻，CSV 卷的&lt;strong&gt;NTFS元数据操作&lt;/strong&gt;仍由一台“协调节点”控制，其他节点通过它进行协调，从而保证一致性。数据IO可以直接访问。这实现了真正的多节点并发读写，但&lt;strong&gt;需要Windows Server集群环境&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用真正的集群文件系统&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如用于Linux的 &lt;strong&gt;OCFS2&lt;/strong&gt;、&lt;strong&gt;GFS2&lt;/strong&gt;，或跨平台的 &lt;strong&gt;VMFS&lt;/strong&gt;（VMware专用）。&lt;/li&gt;
&lt;li&gt;注意：&lt;strong&gt;Windows原生没有类似广泛使用的通用集群文件系统&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;windows下，考虑&lt;strong&gt;改为文件级共享&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果你想在两台windows PC之间共享文件，&lt;strong&gt;绝对不应该使用iSCSI&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;正确的做法是：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;将iSCSI存储挂载给&lt;strong&gt;其中一台PC&lt;/strong&gt;（例如PC-A）。&lt;/li&gt;
&lt;li&gt;在PC-A上将此NTFS卷设置为&lt;strong&gt;共享文件夹&lt;/strong&gt;（SMB/CIFS协议）。&lt;/li&gt;
&lt;li&gt;PC-B通过网络共享（如 &lt;code&gt;\\PC-A\ShareName&lt;/code&gt;）来访问文件。&lt;/li&gt;
&lt;li&gt;这样，文件锁、缓存和一致性都由PC-A上的Windows文件服务器服务来统一管理，完全安全。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>LangChain 演示项目</title>
        <link>https://blog.cba.nxlan.cn/p/langchain_demo/</link>
        <pubDate>Wed, 21 Jan 2026 12:15:37 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/langchain_demo/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGolangchain_demo_outline.png" alt="Featured image of post LangChain 演示项目" /&gt;&lt;h2 id=&#34;langchain-演示项目&#34;&gt;LangChain 演示项目
&lt;/h2&gt;&lt;p&gt;最近整理了一个基于 LangChain 的智能代理（Agent）演示项目，展示了如何使用 LangChain 构建功能丰富的 AI  Agent系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/CJAC5ETbIboL5HdlUl9G0g&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;为什么复杂AI项目要用LangChain？&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;项目概述&#34;&gt;项目概述
&lt;/h3&gt;&lt;p&gt;本项目包含多个示例，逐步展示了 LangChain 的核心功能，从基础的代理构建到高级的记忆管理、中间件集成等。项目使用 DeepSeek 和 Ollama 作为 LLM 提供商，并集成了多种工具和功能。&lt;/p&gt;
&lt;h4 id=&#34;主要特性&#34;&gt;主要特性
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多 LLM 支持&lt;/strong&gt;: 支持 DeepSeek 和 Ollama 两种 LLM 提供商&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具集成&lt;/strong&gt;: 包含订单查询、退货处理、邮件发送、网络搜索等多种工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中间件系统&lt;/strong&gt;: 演示了回调、PII 保护、自定义中间件等功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆管理&lt;/strong&gt;: 包含短期记忆和基于 PostgreSQL 的长期记忆&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化输出&lt;/strong&gt;: 支持自动结构化和工具结构化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机交互&lt;/strong&gt;: 支持人类在环（Human-in-the-loop）的工作流&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;项目结构&#34;&gt;项目结构
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;langchain_demo/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── llm.py                    # LLM 配置（DeepSeek 和 Ollama）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── tools.py                  # 工具定义（订单、邮件、搜索等）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 01_langchain_with_tools.py           # 基础代理与工具
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 02_langchain_with_Callback.py        # 回调中间件
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 03_langchain_with_Middleware.py      # PII 保护中间件
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 04_langchain_with_Summarization.py   # 摘要功能
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 05_langchain_with_Humaninloop.py     # 人机交互
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 06_langchain_with_Customize_Middleware.py  # 自定义中间件
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 07_langchain_with_Autostructur.py    # 自动结构化
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 08_langchain_with_Toolstructur.py    # 工具结构化
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 09_langchain_with_Providerstructur.py # 提供商结构化
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 10_langchain_with_shortMemory.py     # 短期记忆
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 11_langchain_with_longMemory.py      # 长期记忆（PostgreSQL）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 11_docker-compose.yml                # PostgreSQL Docker 配置
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 11_init-db.sh                        # 数据库初始化脚本
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── README.md                            # 本文档
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;需要具体代码，可以关注公众号后，私信【0121】获取。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260121122923067.png&#34; alt=&#34;相关代码&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>一文读懂 MCP 协议与求职助手案例实战</title>
        <link>https://blog.cba.nxlan.cn/p/mcp_server_example/</link>
        <pubDate>Tue, 30 Dec 2025 10:52:44 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/mcp_server_example/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGotitle_img.png" alt="Featured image of post 一文读懂 MCP 协议与求职助手案例实战" /&gt;&lt;h2 id=&#34;补充-tools-细节&#34;&gt;补充 Tools 细节
&lt;/h2&gt;&lt;p&gt;通过上篇文章，我们知道：AI 模型在垂直领域和及时更新的知识，依赖于&lt;strong&gt;外部工具执行&lt;/strong&gt;后的结果（比如，明天北京天气，浪浪山中的动画人物形象）。&lt;/p&gt;
&lt;p&gt;并且把&lt;strong&gt;执行结果追加到上下文&lt;/strong&gt;中，大模型才会基于相关内容做进一步的动作 。&lt;/p&gt;
&lt;p&gt;为了方便对比，把&lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/_ismC2u9E0yS3GAe7ae7yg&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;上一篇案例&lt;/a&gt;中的tools.py 部分代码 单独放一下——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;tavily&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TavilyClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tavily_client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TavilyClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TAVILY_API_KEY&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tavily_search&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;使用 Tavily 进行网络搜索，获取相关信息&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;s2&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;搜索查询字符串&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;tavily_search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    使用 Tavily 进行网络搜索并返回搜索结果。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    参数:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;        query (str): 搜索查询字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    返回:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;        str: 搜索结果的字符串表示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tavily_client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;search_depth&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;advanced&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;max_results&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;results&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;results&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;未找到相关搜索结果。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 格式化搜索结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;formatted_results&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;title&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;无标题&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;content&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;formatted_results&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;标题: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;链接: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;内容: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;formatted_results&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;Exception&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;搜索过程中发生错误: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;tools-变量是个对象列表用来填充提示词-中tools-部分&#34;&gt;&amp;ldquo;tools&amp;rdquo; 变量是个对象列表，用来&lt;strong&gt;填充提示词&lt;/strong&gt; 中{tools} 部分
&lt;/h3&gt;&lt;p&gt;为什么需要这部分？&lt;/p&gt;
&lt;p&gt;原因也不复杂：在大模型&lt;strong&gt;不支持 function calling之前&lt;/strong&gt;，只能通过这种&lt;strong&gt;提示词注入&lt;/strong&gt;的方式告诉模型：有什么工具可以调用以及如何调用。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;而当大模型&lt;strong&gt;支持 function calling 后&lt;/strong&gt;，这个步骤没有省略——而是&lt;strong&gt;从提示词中迁移到&lt;/strong&gt;大模型提供的**专门接口“tools”**中。&lt;/p&gt;
&lt;p&gt;长这样——&lt;/p&gt;&lt;/blockquote&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofunction-calling-format.png&#34; alt=&#34;function-calling-format&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;结构上看，只是比上文的tools 多了一层封装——{&amp;ldquo;type&amp;rdquo;: &amp;ldquo;function&amp;rdquo;,  &amp;ldquo;function&amp;rdquo;: {&lt;strong&gt;原工具提示词部分内容&lt;/strong&gt;} }&lt;/p&gt;
&lt;h3 id=&#34;回到-def-tavily_searchquery-str-这部分&#34;&gt;回到 &amp;ldquo;def tavily_search(query: str)&amp;rdquo; 这部分
&lt;/h3&gt;&lt;p&gt;不难看出：所谓的&amp;quot;工具&amp;quot;本质上也是一个函数。&lt;/p&gt;
&lt;p&gt;那LLM是怎么“调用”tools执行具体任务的呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在大模型&lt;strong&gt;不支持 function calling之前&lt;/strong&gt;：就以LLM 输出的 &amp;ldquo;Action：XXX&amp;rdquo; 内容为条件，做if-else 选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	简化后逻辑是这样——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LLM&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;输出&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Action: tavily_search&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;tavily_search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;query&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Action Input: 工具参数&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;当&lt;strong&gt;大模型支持 function calling后&lt;/strong&gt;，大模型则直接在&amp;quot;&lt;strong&gt;tool_calls&lt;/strong&gt;&amp;ldquo;中返回它希望调用的具体工具（函数）名和相关参数。长这样——&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofunction-calling-response.png&#34; alt=&#34;function-calling-response&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;工具执行阶段：只需调用&amp;quot;name&amp;quot;指定的函数，按照 &amp;ldquo;arguments&amp;rdquo; 中的参数执行——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tool_call&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_calls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tool_call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;tool_args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tool_call&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;get_tool&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tools_with_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;调用工具：&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;, &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_args&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# 执行工具函数（同步）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;call_tool_ret&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_tool&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;invoke&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;好，以上补充了 tools 在Agent中执行的细节——重点是大模型根据任务&lt;strong&gt;自主决策&lt;/strong&gt;使用什么工具，然后由外部工具执行具体任务。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;工具执行后的内容，又会作为“记忆”保存在上下文中，方便下一轮对话中大模型进一步分析、解答用户提问。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;不难看出按照上面的框架，可以在&lt;strong&gt;一个Agent 中&lt;/strong&gt;扩展多个工具——因为，只要继续追加 tools 就好了嘛。&lt;/p&gt;
&lt;h2 id=&#34;mcp-出世&#34;&gt;MCP 出世
&lt;/h2&gt;&lt;p&gt;如果有多个的Agent 都需要调用 tavily_search 这个工具，会怎样？&lt;/p&gt;
&lt;p&gt;没错！需要在每个Agent的tools.py代码/workflow 中都添加这个tavily_search 工具。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果公司里就我一个 Agent 开发人员，可能问题不大。&lt;/p&gt;
&lt;p&gt;但是，如果公司有10几个开发人员负责开发10个不同的Agent，一个小小的变更带来的沟通、修改 、维护成本都会很高。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这样，MCP的需求场景就清晰了（&lt;strong&gt;让Agent和 Tools 间实现松耦合的结构&lt;/strong&gt;） ：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;同一个工具函数，需要在不同地方重复调用&lt;/li&gt;
&lt;li&gt;同一个工具函数，分散在各个项目中，修改和管理分散&lt;/li&gt;
&lt;li&gt;如果可以将这些工具集中管理，一方面可以让使用者和执行者解耦合（分离）&lt;/li&gt;
&lt;li&gt;另一方面，分离后还可以进一步做使用人员的权限控制，比如：这个工具开发人员A 可以用，B用不了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;而分离后，LLM 与 Tools 间通信的协议，就是我们今天的主角 —— MCP。&lt;/p&gt;
&lt;p&gt;没错，MCP 本质上 不是工具(Tools) 也不是 大模型新增的功能模块， 而是Agent与tools 函数间的“桥梁”——&lt;strong&gt;通信协议&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;该协议本着 有什么用什么的原则：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在本地&lt;/strong&gt;，使用STDIO 实现两个进程间通信；&lt;strong&gt;跨设备&lt;/strong&gt;，使用HTTP 协议实现两个应用间的通信。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;前者，还是&lt;strong&gt;只能本地执行工具&lt;/strong&gt;，无法把“分离”的优势发挥到最大。&lt;/p&gt;
&lt;p&gt;后者因为发展原因，又用到的了两个子协议 ：Server-Sent Events (简称：SSE) 和 Streamable。&lt;/p&gt;
&lt;p&gt;它们都使用 HTTP 协议，但 SSE 是&lt;strong&gt;基于 HTTP 的文本消息推送协议&lt;/strong&gt;，而 Streamable 是&lt;strong&gt;基于 HTTP 的二进制内容传输技术&lt;/strong&gt;。就像电子邮件（SSE）和网盘下载（Streamable）都使用 HTTP，但使用场景还是有差异的。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;从agent的视角看&#34;&gt;从Agent的视角看
&lt;/h3&gt;&lt;p&gt;工具函数的执行方从本地&lt;strong&gt;转移&lt;/strong&gt;到了MCP server 上，详见下图 &lt;strong&gt;3.1-3.4&lt;/strong&gt; 部分：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowhiteboard_exported_image.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MCP server&lt;/strong&gt; 中执行工具的方法有多种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以在mcp server 上执行本地函数&lt;/li&gt;
&lt;li&gt;也可以在mcp server 上调用第三方服务的API接口&lt;/li&gt;
&lt;li&gt;也可以在mcp server 上请求大模型&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;这里mcp协议的作用有两个&#34;&gt;这里MCP协议的作用有两个
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在Agent 初始化阶段&lt;/strong&gt;，MCP server 提供工具和相关的描述信息——称为 &amp;ldquo;&lt;strong&gt;tools/list&lt;/strong&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;下图记录了MCP client 与MCP server 间成功建立连接后，通过 &amp;ldquo;ListTools&amp;rdquo; 获取到的&lt;strong&gt;四个工具&lt;/strong&gt;（get_joblist_by_expect_job, get_job_by_resume, get_word_by_filepath, fix_resume）和每个工具的描述信息 ：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomcp_client_logging.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在Agent 接收LLM返回&lt;/strong&gt;的工具调用信息后，由&lt;strong&gt;MCP Client 发起工具调用&lt;/strong&gt;——称为 &amp;ldquo;tools/call&amp;rdquo;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomcp_client_logging2.PNG&#34; alt=&#34;mcp_client_logging2&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;从图中可以看到：MCP Client向MCP Server的工具&amp;quot;get_joblist_by_expect&amp;quot;发送如下参数——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;job&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;AI应用工程师&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;mcp-server-的实现&#34;&gt;MCP server 的实现
&lt;/h2&gt;&lt;p&gt;好了，MCP出现的背景和工作流程我们讲清楚了。下面重点放在MCP server 的实现上 。&lt;/p&gt;
&lt;p&gt;这里以一个“&lt;strong&gt;求职助手&lt;/strong&gt;” MCP Server为例：从 0-1 实现这个功能。&lt;/p&gt;
&lt;p&gt;该助手可以帮助求职者在&lt;strong&gt;职位筛选&lt;/strong&gt;和&lt;strong&gt;简历修改&lt;/strong&gt;上，使用大模型分析、识别与求职者匹配度高的岗位，并输出优化后的个人简历。&lt;/p&gt;
&lt;p&gt;该MCP Server 主要提供以下四个工具：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;工具名&lt;/th&gt;
          &lt;th&gt;工具描述&lt;/th&gt;
          &lt;th&gt;工具参数&lt;/th&gt;
          &lt;th&gt;调用LLM&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;get_joblist_by_expect_job&lt;/td&gt;
          &lt;td&gt;根据求职者的期望岗位&lt;strong&gt;获取岗位列表&lt;/strong&gt;数据&lt;/td&gt;
          &lt;td&gt;job: [职位名]&lt;/td&gt;
          &lt;td&gt;N&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;get_job_by_resume&lt;/td&gt;
          &lt;td&gt;根据岗位列表以及求职者的简历获取&lt;strong&gt;适合求职者的三个岗位&lt;/strong&gt;及提供相关求职建议&lt;/td&gt;
          &lt;td&gt;jobs: [职位清单], resume: [个人简历]&lt;/td&gt;
          &lt;td&gt;Y&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;get_word_by_filepath&lt;/td&gt;
          &lt;td&gt;读取指定路径的word文件&lt;/td&gt;
          &lt;td&gt;filepath: [word 简历路径]&lt;/td&gt;
          &lt;td&gt;N&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fix_resume&lt;/td&gt;
          &lt;td&gt;根据目标岗位要求&lt;strong&gt;改写并完善个人简历&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;jd: [目标职位jd], resume: [个人简历]&lt;/td&gt;
          &lt;td&gt;Y&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;目标是帮助求职者&lt;strong&gt;筛选&lt;/strong&gt;出匹配度高的职位并输出&lt;strong&gt;优化&lt;/strong&gt;后的简历，关系图如下——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo4tools_relationship.png&#34; alt=&#34;4tools_relationship&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;h3 id=&#34;0-llm-client--提示词准备&#34;&gt;0. LLM Client &amp;amp; 提示词准备
&lt;/h3&gt;&lt;p&gt;如上文所说 &amp;ldquo;get_job_by_resume&amp;rdquo; 和 &amp;ldquo;fix_resume&amp;rdquo; 这两个工具是需要调用 LLM完成简历内容处理的，所以需要准备一个LLM 调用模块—— &amp;ldquo;LLMClient&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;模块中，提前准备了 deepseek-chat 模型的接口 和 API 参数。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;openai&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenAI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;dotenv&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;load_dotenv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;LLMClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;fm&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Logger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_get_client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_get_client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;OpenAI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;load_dotenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;				&lt;span class=&#34;c1&#34;&gt;# 根据自己环境，可以选择不同的模型提供方&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenAI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;api_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;DEEPSEEK_API_KEY&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;base_url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://api.deepseek.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# api_key=os.environ.get(&amp;#34;GEMINI_API_KEY&amp;#34;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# base_url=&amp;#34;http://ollama.host:8045/v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;send_messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 根据不同的模型提供方，选择具体的模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;completions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek-chat&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# model=&amp;#34;gemini-3-flash&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;和之前ReACT 案例一样，这里的&lt;strong&gt;提示词模板&lt;/strong&gt;也使用了占位符——{resume}  {job_list}  {input}&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Job_Search_Prompt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;【AI求职助手】
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;你是一个AI求职助手, 我正在寻找与我的技能和经验相匹配的工作机会。以下是我的简历摘要和搜集到的岗位需求列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;【个人简历】
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{resume}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;【岗位需求列表】
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{job_list}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;请帮我匹配最合适的3个岗位, 并根据我的简历提供简要的求职建议。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ResumePrompt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;你是一个 AI 简历助手。我会给你提供我的简历以及某公司的详细岗位要求。你的任务是根据公司的岗位要求, 帮我改写和完善我的简历，使我的简历符合该公司的要求。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;此外，我还会给你一个简历模板，模板中会包含简历中部分内容的大纲，当你匹配到我的简历中有模板提及的内容时，要按照我模板的格式进行编写。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;简历：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{resume}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;简历模板：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;专业技能
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  请在此描述符合职位要求的技能，尤其是AI方向的技能
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;项目经验
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; (1) 项目描述
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; (2) 我在项目中的角色
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; (3) 项目规模
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; (4) 技术堆栈
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; (5) 已开发模块的描述
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; (6) 解决难题的经验
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;岗位要求：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{input}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;1-本地工具&#34;&gt;1. 本地工具
&lt;/h3&gt;&lt;p&gt;这里以后两个工具（get_word_by_filepath、fix_resume）为例——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;JobTools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LLMClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;register_tools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Register job tools.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nd&#34;&gt;@mcp.tool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;读取指定路径的word文件&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_word_by_filepath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filepath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;根据文件路径获取word文件内容&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_word_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filepath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nd&#34;&gt;@mcp.tool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;根据目标岗位要求改写并完善个人简历&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fix_resume&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resume&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;根据目标岗位要求改写并完善个人简历&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;#将待优化简历以及目标岗位jd信息注入到 prompt 模板&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ResumePrompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resume&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resume&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;prompt: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;#发送给 LLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LLMClient&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send_messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;response_text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response_text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不难看出：MCP server 中的工具和开头举例的 &amp;ldquo;def tavily_search(query: str) &amp;quot; 工具一样——还是函数。&lt;/p&gt;
&lt;p&gt;只是，它被装饰器 (@mcp.tool)  装饰过后，它多了一些mcp tool所需的&lt;strong&gt;元数据&lt;/strong&gt;（工具名、工具描述、工具参数）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomcp_tools_list.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;mcp_tools_list&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;另外，fix_resume 这个工具在执行过程中需要调用 LLM，所以工具中进行了模型&lt;strong&gt;消息拼装&lt;/strong&gt;——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;prompt = ResumePrompt.format(resume=resume,input=jd)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;messages = [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: prompt}]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#拼装好后 发给上一步中 准备好的LLMClient
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;response = LLMClient.send_messages(self,messages)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-mcp-server-封装实现&#34;&gt;2. MCP Server 封装实现
&lt;/h3&gt;&lt;p&gt;最后，使用mcp中的FastMCP 帮助我们快速实现 MCP server 的组装。&lt;/p&gt;
&lt;p&gt;从外到里看包含：http入口、http安全配置、认证中间件、server sse初始化、工具注册。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;  1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 59
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 60
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 61
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 62
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 63
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 64
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 65
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 66
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 67
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 68
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 69
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 70
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 71
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 72
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 73
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 74
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 75
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 76
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 77
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 78
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 79
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 80
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 81
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 82
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 83
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 84
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 85
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 86
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 87
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 88
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 89
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 90
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 91
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 92
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 93
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 94
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 95
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 96
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 97
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 98
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 99
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;100
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;101
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;102
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;103
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;104
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;105
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;106
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;mcp.server.fastmcp&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FastMCP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;mcp.server.transport_security&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TransportSecuritySettings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;.tools.job&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JobTools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;uvicorn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;starlette.responses&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONResponse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;JobSearchMCPServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;fm&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;jobsearch_mcp_server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 配置传输安全设置，允许本地主机和自定义域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;transport_security&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TransportSecuritySettings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;enable_dns_rebinding_protection&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# 禁用 DNS rebinding protection 以支持动态域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;allowed_hosts&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;# 本机局域网ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;192.168.*.*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 初始化 FastMCP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FastMCP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;StatelessServer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;stateless_http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;transport_security&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transport_security&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 开启日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;basicConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;level&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(asctime)s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; - &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(name)s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; - &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(levelname)s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; - &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%(message)s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logging&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 调用工具注册函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_register_tools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_register_tools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Register all MCP tools.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;job_tools&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JobTools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;job_tools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register_tools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Get the ASGI application for SSE-based MCP server.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Starting MCP Server in SSE-based mode on &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MCP Server is accessible at http://&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 使用 sse 模式对外提供 MCP 服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sse_app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 使用 ASGI 包装器直接实现认证，避免 BaseHTTPMiddleware 处理流式响应的问题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;auth_wrapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;mcp_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MCP_AUTH_TOKEN&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;method&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;# 添加详细日志，观察到底是哪个路径在报错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Incoming request: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;# 获取请求头&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;auth_header&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lower&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;n&#34;&gt;auth_header&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;# 验证逻辑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_header&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_header&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logger&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Unauthorized: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Unauthorized&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;401&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;# 校验 Token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_header&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mcp_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Token mismatch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONResponse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Invalid Token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;401&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# 认证通过，交给 FastMCP 的 SSE App 处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 最终，返回 ASGI 应用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_wrapper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Run MCP SSE-based server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;--host&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Host to bind to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;--port&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Port to listen on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JobSearchMCPServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get_app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;uvicorn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;身份认证 token 写在环境 变量MCP_AUTH_TOKEN  中——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGolocalenv.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;localenv&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;让AI 画个逻辑图，更容易理解一些——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请求进来 (任何 path)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth_wrapper (ASGI 中间件)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├─ 没带 Authorization → 401 {&amp;#34;error&amp;#34;: &amp;#34;Unauthorized&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├─ Token 不匹配 → 401 {&amp;#34;error&amp;#34;: &amp;#34;Invalid Token&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └─ Token 正确 → 放行
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    FastMCP.sse_app() (MCP 协议处理)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    JobTools 注册的所有工具
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;至此整个 MCP server 就搭建完了。&lt;/p&gt;
&lt;p&gt;最终项目结构长这样——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;jobsearch_mcp_server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pyproject&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;└──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jobsearch_mcp_server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;job&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt;          &lt;span class=&#34;c1&#34;&gt;# 主服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;llm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;└──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;llm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;└──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;└──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;job&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;       &lt;span class=&#34;err&#34;&gt;└──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;word&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;           &lt;span class=&#34;err&#34;&gt;├──&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;word&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;│&lt;/span&gt;           &lt;span class=&#34;err&#34;&gt;└──&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;个人简历&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;使用 uv 工具启动项目——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# run mcp server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pip&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;directory&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;trae_pj&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;jobsearch_mcp_server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.0.0&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;jobsearch_mcp_server&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jobsearch&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;调用效果&#34;&gt;调用效果
&lt;/h2&gt;&lt;p&gt;因为本文重点在MCP server 的实现，Agent部分的差异和设计不表。&lt;/p&gt;
&lt;p&gt;测试时还是请出老朋友 chatbox。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;支持 MCP Client的工具都可以。例如：Trace、Cursor、Roo、Claude Code。。。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;1-mcp-client-配置&#34;&gt;1. MCP Client 配置
&lt;/h3&gt;&lt;p&gt;Client 中的配置内容主要就是： mcp server 的http 地址、接口和认证凭据。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;#34;remote_jobsearch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://192.168.202.100:8000/sse&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;nt&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;nt&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer key_567890&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;配置上是不是很简单？&lt;/p&gt;
&lt;p&gt;如上文提到的：4个具体工具的信息是通过sse 协议 list_tools 方法自动获取到的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGochatbox_remote_mcp_config.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-用户提问&#34;&gt;2. 用户提问
&lt;/h3&gt;&lt;p&gt;在chatbox 中，新建个对话，并启用新添加的MCP server ：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonew_agent_session.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;new_agent_session&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;提问&amp;quot;AI工程师的职位有哪些&amp;rdquo;——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomcp-test-get_joblist_by_expect_job.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;然后，让Agent 基于自己的简历，按照“AI应用工程师”的岗位要求改写——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomcp-test-get_word_by_filepath.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在完成这个任务的过程，并没有定义如何看文件，看了文件之后又怎么比对“AI 应用工程师”的JD，以及简历又该朝哪个方向修改。&lt;/p&gt;
&lt;p&gt;都是 LLM通过提示词中用户问题和tools中的 function calling ，&lt;strong&gt;自主分析判断&lt;/strong&gt;的。&lt;/p&gt;
&lt;p&gt;这也是 Agent 模式解决问题的长处。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;简历改写后的内容——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomcp-test-fix_resume.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;补充&#34;&gt;补充
&lt;/h2&gt;&lt;h3 id=&#34;mcp工具提供的内容在agent中的位置&#34;&gt;MCP工具提供的内容在Agent中的位置
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;提供function  calling 的参数&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofunction_calling_list.png&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;工具执行的结果，会作为Agent &amp;ldquo;contents&amp;rdquo; 的一部分“记忆”下来&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_mcp_functionresponse.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;mcp调用其他资源&#34;&gt;MCP调用其他资源
&lt;/h3&gt;&lt;p&gt;MCP 协议除了可以调用&amp;quot;Tools&amp;rdquo; 这一种资源外 ，其实还可以调用&lt;strong&gt;文件&lt;/strong&gt;和&lt;strong&gt;提示词模板&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;只是用得很少，同样也需要Agent中扩展支持。&lt;/p&gt;
&lt;p&gt;简单了解即可——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20260405013738906.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;小结一下&#34;&gt;小结一下
&lt;/h2&gt;&lt;p&gt;本文大致梳理了MCP 出现的背景和意义：&lt;/p&gt;
&lt;p&gt;其核心是定义了Agent 与工具之间的通用通信协议。实现了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;松耦合结构&lt;/li&gt;
&lt;li&gt;优化了多工具维护和复用的通点&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoMCP_onepage.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;MCP_onepage&#34;
	
	
&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;当然再往后推进就是 去年底开始火出圈的 Skills&lt;/p&gt;
&lt;p&gt;有机会 我们再聊一聊Skills&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>基础的多Agent案例 &#43; 深入探究ReAct范式</title>
        <link>https://blog.cba.nxlan.cn/p/base_multiagent/</link>
        <pubDate>Tue, 09 Dec 2025 15:21:18 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/base_multiagent/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGobase_MA.png" alt="Featured image of post 基础的多Agent案例 &#43; 深入探究ReAct范式" /&gt;&lt;h2 id=&#34;想说点啥&#34;&gt;想说点啥
&lt;/h2&gt;&lt;p&gt;这篇文章构思有半个多月了，本来想弄个文生图的案例分享一下。&lt;/p&gt;
&lt;p&gt;结果，最近在补 MCP 和 RAG的高级用法，还有 LangGraph。耽搁了一阵。&lt;/p&gt;
&lt;p&gt;另一方面，也没想好这里的主干内容怎么写：继续分享怎么创建工作流么？好像已经写过不少案例了。&lt;/p&gt;
&lt;p&gt;直到参考网上资料手搓了个Agent代码出来——感觉这里面很有意思，值得说道说道。&lt;/p&gt;
&lt;p&gt;所以，本文会从&lt;strong&gt;一个游戏案例&lt;/strong&gt;出发 ，&lt;strong&gt;带你了解&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;1）LLM + Tools的调用细节和&lt;strong&gt;代码级&lt;/strong&gt;实现&lt;/p&gt;
&lt;p&gt;2）多模态大模型在文生图案例中的效果和提示词&lt;/p&gt;
&lt;p&gt;3）最简单的多Agent 协同方式&lt;/p&gt;
&lt;p&gt;4）[&lt;strong&gt;重点&lt;/strong&gt;] 什么是ReAct 以及 ReAct这个范式的优缺点&lt;/p&gt;
&lt;h2 id=&#34;游戏玩法和效果&#34;&gt;游戏玩法和效果
&lt;/h2&gt;&lt;h3 id=&#34;游戏玩法&#34;&gt;游戏玩法
&lt;/h3&gt;&lt;p&gt;玩法很简单：用户输入一个卡通人物特点的简单描述，由工作流生成对应人物画像。&lt;/p&gt;
&lt;h3 id=&#34;游戏组件&#34;&gt;游戏组件
&lt;/h3&gt;&lt;p&gt;整个工作流展示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoworkflow_info.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;workflow_info&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;主要组件就是 图中&lt;strong&gt;两个Agent&lt;/strong&gt;——第一个Agent负责对卡通人物进行识别并输出人物描述，第二个Agent 则依据前面的人物描述 ，生成相关人物图像。&lt;/p&gt;
&lt;h3 id=&#34;效果展示&#34;&gt;效果展示
&lt;/h3&gt;&lt;p&gt;我这里输入“浪浪山的小妖怪其中的黄鼠狼，一个碎碎念的有志青年”，等待1分钟后，输出了下面这张图。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGolanglangshan_hsl.png&#34; alt=&#34;langlangshan_hsl&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;p&gt;怎么样？是不是除了脸部细节，其他还挺还原动画人物的。&lt;/p&gt;
&lt;h2 id=&#34;关键步骤细节&#34;&gt;关键步骤细节
&lt;/h2&gt;&lt;h3 id=&#34;人物形象描述agent&#34;&gt;人物形象描述Agent
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;提示词部分如下&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 角色&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;你是一个卡通人物形象描述专家&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;根据用户提供的基本信息&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ $(&amp;#39;When chat message received&amp;#39;).item.json.chatInput }}&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;输出相关人物形象描述&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;如果遇到你不知道的人物信息&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;可以调用工具进行检索&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 案例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;“&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;多啦爱梦&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;err&#34;&gt;“&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;一只圆润的蓝色猫型机器人&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;大头&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;白色圆脸配巨大白眼睛与红球鼻&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;蓝色桶状身体&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;中央有白色半圆口袋&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;红色项圈挂黄铃铛&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;白色短肢&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;末端为红色圆球手与白色圆柱脚&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;整体线条圆滑&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;色彩鲜明&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;（&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;蓝&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;白&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;红&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;黄&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;）。”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 注意事项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;1.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;不要尝试解释和讨论人物相关信息&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;2.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;输出内容以指定的json格式输出&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;3.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;人物形象描述简明&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;清晰&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;限制在100字以内&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	提示词框架上仍然是之前多次使用的框架—— “角色 - 任务 - 少量案例 - 负面提示”。&lt;/p&gt;
&lt;p&gt;​	其&lt;strong&gt;关键部分&lt;/strong&gt;为：提示词中的&lt;strong&gt;角色&lt;/strong&gt;部分使用了用户输入&lt;strong&gt;变量 {question}&lt;/strong&gt;，并特别强调&lt;strong&gt;可以调用工&lt;/strong&gt;具进行信息检索——为的是补全LLM “出厂”后缺失的数据。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;小问题：这里的提示词对LLM 来说是&lt;strong&gt;系统&lt;/strong&gt;提示词(System Prompt)，还是&lt;strong&gt;用户&lt;/strong&gt;提示词(User Promopt) ?&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;然后，LLM发现自己&lt;strong&gt;无法准确描述&lt;/strong&gt;浪浪山中的动画人物（显然这个人物数据比较新）。&lt;/p&gt;
&lt;p&gt;于是，按照提示词中的说明，选择调用外部工具（web search）检索人物具体信息——&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoLLM_deside_using_MCP.png&#34; alt=&#34;LLM_deside_using_MCP&#34; style=&#34;zoom:75%;&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;先后使用 “&lt;u&gt;浪浪山的小妖怪 黄鼠狼 角色 形象&lt;/u&gt;”和 “&lt;u&gt;浪浪山小妖怪 黄鼠狼精 形象描述 外貌特征&lt;/u&gt;” 两条不同的检索词去查找——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoLLM_using_MCP-1.png&#34; alt=&#34;LLM_using_MCP-1&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoLLM_using_MCP-2.png&#34; alt=&#34;LLM_using_MCP-2&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多次检索&lt;/strong&gt;后，&lt;strong&gt;LLM 判断&lt;/strong&gt;拿到了足够的数据。&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoLLM_using_MCP.png&#34; alt=&#34;LLM_using_MCP&#34; style=&#34;zoom:75%;&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;从LLM的角度看：调用工具(Tools) 的过程，类似于前端调用后端的&lt;strong&gt;API接口&lt;/strong&gt;——不关心具体处理过程，最后能拿到需要的数据就可以。&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;最后按照 指定的格式{ &amp;ldquo;name&amp;rdquo;: &amp;ldquo;黄鼠狼精&amp;rdquo;, &amp;ldquo;description&amp;rdquo;: &amp;ldquo;一只拟人化的黄鼠狼妖怪&amp;hellip; &amp;hellip;&amp;rdquo; } 输出本次任务执行结果。&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoLLM_using_MCP_output.png&#34; alt=&#34;LLM_using_MCP_output&#34; style=&#34;zoom:75%;&#34; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不难看出，Agent 这里的实现过程为：&lt;/p&gt;
&lt;p&gt;LLM 识别用户问题 &amp;ndash;&amp;gt; 发起工具调用，尝试获取人物准确信息 &amp;ndash;&amp;gt; 尝试使用不同的查询语句，进一步查询 &amp;ndash;&amp;gt; 最后确定得到所需数据 &amp;ndash;&amp;gt; 按照要求输出 json 格式数据。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这其中所有子动作，如：检索词调整，去哪里检索，判断检索到的内容是否有用，以及如何汇总为 100字以内的人物描述——所有这些以往需要人工操作、执行的动作，在大模型内部&lt;strong&gt;自主决策&lt;/strong&gt;并执行了。&lt;/p&gt;
&lt;p&gt;还有一点：虽然用户没有参与具体的执行步骤。但是，可以观察到它检索了什么主题，得到了什么数据等内部细节 。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;把以上实现过程抽象一下，就是后面会重点讨论的 “ ReAct”模式: Reason + Action。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoReAct_process.png&#34; alt=&#34;ReAct_process&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;该模式&lt;strong&gt;最大的好处&lt;/strong&gt;就是：将传统 AI 那种黑盒执行的过程 暴露出来！并大幅降低 AI “一本正经胡说八道”的情况。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 id=&#34;文生图agent&#34;&gt;文生图Agent
&lt;/h3&gt;&lt;p&gt;在这个Agent中，目标是实现使用上一步骤的json数据：&lt;/p&gt;
&lt;p&gt;​	{ &amp;ldquo;name&amp;rdquo;: &amp;ldquo;黄鼠狼精&amp;rdquo;, &amp;ldquo;description&amp;rdquo;: &amp;ldquo;一只拟人化的黄鼠狼妖怪&amp;hellip; &amp;hellip;&amp;rdquo; }&lt;/p&gt;
&lt;p&gt;生成对应人物图像。&lt;/p&gt;
&lt;p&gt;和生图大模型的交互，还是使用提示词。那提示词是怎么写的呢？&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 角色&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;你是一个文生图助手&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;可以调用工具&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;产出一副符合相关描述的图片&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 执行步骤：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;1.&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;生成图像&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;接收&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;关于人物&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;相关描述&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;description&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;的信息&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;一步到位地将该情节合成一段详细的文生图描述&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;必须在描述中加入构图指令&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;主体必须被放置在画面的顶部 3/4 区域内。背景是纯白色，且画面的底部 1/4 区域必须是完全空白的纯白色，为文字预留。&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;确保适配下游的&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;mcp&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;图片生成工具&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;生成960&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1280&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;比例的图片&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;2.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;调用mcp&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;图片生成工具&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;3.&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;返回结果&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;返回编辑后的图片链接&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;只返回图片链接&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;不包含任何无关内容&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中，上一步输出的人物信息可以直接在提示词中以变量名 &amp;ldquo;name&amp;rdquo; 和 &amp;ldquo;description&amp;quot;引用。&lt;/p&gt;
&lt;p&gt;同时，提示词中也明确指定了出图的尺寸( 960 * 1280 )和位置信息( 上部 3/4的区域 ) 。当然还可以指定画面风格 ，这样就可以进一步保证产出的图片风格是一致的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为了保持每次生成的图片一致性，以上这些细节（背景，尺寸，位置，颜色，字体，风格等）都是必要的。&lt;/p&gt;
&lt;p&gt;这也是调用&lt;strong&gt;多模态模型&lt;/strong&gt;和自&lt;strong&gt;然语言模型&lt;/strong&gt;时的主要差别。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这里用到的生图工具，是阿里云的&lt;strong&gt;百炼生图模型&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在MCP工具中，可以看到LLM在调用工具时，根据提示词 补全了相关工具参数——生成图片的张数、大小、生图提示词：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomcp_gen_image.png&#34; alt=&#34;mcp_gen_image&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h2 id=&#34;单agent-vs-多agent-系统&#34;&gt;单Agent vs 多Agent 系统
&lt;/h2&gt;&lt;p&gt;本案例，就是一个最简单的多Agent 系统。稍微提一句：什么是多 Agent ?&lt;/p&gt;
&lt;p&gt;我理解下来，就是有的任务变复杂了，一个Agent 完成的效果不好，拆分任务到两个（甚至更多）Agent 中，效果不错。于是就采用这种分工的方式共同完成某一项任务 。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;类比于餐厅：&lt;/p&gt;
&lt;p&gt;顾客不多时， 一个店员负责洗、切、炒、送、收钱。——可实现基本功能，成本低，但是出餐慢、做不了太复杂的菜。&lt;/p&gt;
&lt;p&gt;顾客很多时，点单收钱的一个店员，送菜擦桌子的一个店员，后面炒菜配菜 可能是两个店员。&lt;/p&gt;
&lt;p&gt;—— 扩展性好，每个人专注于自己的任务，上菜效率高，但是成本和复杂度也高，如果某个环节断了，其他人也无能为力。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;对比单Agent 和 多Agent间的差异&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;维度&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;strong&gt;单Agent系统&lt;/strong&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;strong&gt;多Agent系统&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;核心定义&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;一个独立的、功能完备的AI模型或程序，负责处理从输入到输出的完整任务。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;由多个相互协作、通信的AI Agent组成的系统，每个Agent有特定角色或专长，共同完成复杂任务。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;优势&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1. 简单性：&lt;/strong&gt; 架构简单，易于开发、部署和调试。&lt;br&gt;&lt;strong&gt;2. 一致性：&lt;/strong&gt; 决策和行为风格统一，输出连贯。&lt;br&gt;&lt;strong&gt;3. 可控性：&lt;/strong&gt; 责任边界清晰，易于监控和管理。&lt;br&gt;&lt;strong&gt;4. 资源效率：&lt;/strong&gt; 通常计算和通信开销较低。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1. 专业化与模块化：&lt;/strong&gt; “分而治之”，每个Agent可针对特定子任务进行优化，能力更强。&lt;br&gt;&lt;strong&gt;2. 复杂问题解决：&lt;/strong&gt; 能处理需要多步骤推理、多领域知识或并行任务的复杂工作流。&lt;br&gt;&lt;strong&gt;3. 鲁棒性与容错性：&lt;/strong&gt; 单个Agent故障不一定导致系统崩溃，任务可能由其他Agent接管或重试。&lt;br&gt;&lt;strong&gt;4. 可扩展性：&lt;/strong&gt; 可通过增加新的专业Agent来轻松扩展系统能力。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;劣势&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1. 能力瓶颈：&lt;/strong&gt; 受限于单一模型的能力上限，难以精通所有领域。&lt;br&gt;&lt;strong&gt;2. 单点故障：&lt;/strong&gt; 一旦该Agent出错，整个系统即失效。&lt;br&gt;&lt;strong&gt;3. 灵活性差：&lt;/strong&gt; 工具一多的对大模型的理解、规划要求随之变高。&lt;br&gt;4. &lt;strong&gt;长对话下表现变差：&lt;/strong&gt; 过长的对话内容，大模型容易失焦，tokens 消耗大。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1. 系统复杂性：&lt;/strong&gt; 架构、通信协议和协作逻辑的设计与调试极其复杂。&lt;br&gt;&lt;strong&gt;2. 协调开销：&lt;/strong&gt; Agent间的通信、协商、任务分配会引入显著的延迟和计算成本。&lt;br&gt;&lt;strong&gt;3. 一致性与连贯性挑战：&lt;/strong&gt; 需精心设计以确保最终输出的整体一致性和风格统一。&lt;br&gt;&lt;strong&gt;4. 开发与运维成本高：&lt;/strong&gt; 需要更多开发资源，且监控、维护难度大。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;核心挑战&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1. 能力泛化：&lt;/strong&gt; 如何让一个模型具备广泛且深入的能力。&lt;br&gt;&lt;strong&gt;2. 任务分解：&lt;/strong&gt; 在模型内部有效进行复杂的任务规划和步骤分解。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1. 高效协作机制：&lt;/strong&gt; 如何设计通信协议（如共享黑板、消息传递）、决策框架（如投票、领导选举）以实现高效协作。&lt;br&gt;&lt;strong&gt;2. 知识共享与冲突消解：&lt;/strong&gt; 如何让Agent共享上下文，并解决它们之间可能产生的意见或行动冲突。&lt;br&gt;&lt;strong&gt;3. 系统级优化：&lt;/strong&gt; 如何优化整体工作流，减少通信轮次，避免“讨论循环”。&lt;br&gt;&lt;strong&gt;4. 评估难度：&lt;/strong&gt; 难以评估是哪个Agent或协作环节导致了最终的成功或失败。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;典型应用场景&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;• 简单的问答与对话&lt;br&gt;• 文本摘要/翻译&lt;br&gt;• 基础内容生成&lt;br&gt;• 单一工具调用（如查天气）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;• 复杂的项目规划与执行&lt;br&gt;• 多步骤研究与分析报告&lt;br&gt;• 软件开发（设计、编码、测试分工）&lt;br&gt;• 模拟社会或经济系统&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;那使用哪种Agent 系统比较好呢 ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第一点，&lt;strong&gt;单Agent可以满足业务需求的，就使用单Agent&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;第二点，单Agent 效果不好时，再从以下&lt;strong&gt;四个维度&lt;/strong&gt;评估应用场景：问题复杂度、工具种类 、容错性要求、问题泛性等四个方面。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;角度&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;案例产品&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;案例说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1. 问题复杂度不高&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;ChatGPT / Claude 网页聊天界面&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;用户与一个单一的、强大的语言模型进行开放式对话。虽然模型本身复杂，但&lt;strong&gt;任务形态是线性的&lt;/strong&gt;：接收提示词 -&amp;gt; 思考 -&amp;gt; 生成回复。它不需要在内部模拟多个角色进行辩论或分工。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;2. 工具种类不多&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Notion AI / 文档助手&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;这类产品深度集成在特定环境（如文档编辑器）中。它的核心工具集非常聚焦：&lt;strong&gt;文本生成、改写、总结、翻译&lt;/strong&gt;。它不需要同时调用代码解释器、搜索引擎、绘图API等多种外部工具来完成一个任务。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;3. 容错性要求不高&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;AI 写作助手 (如 文案仿写）&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;用于营销文案、博客草稿、广告语生成。输出结果通常&lt;strong&gt;需要人工审核和润色&lt;/strong&gt;，AI提供的是创意初稿或灵感，而非最终交付物。即使偶尔生成不理想的内容，用户修正的成本较低，容错空间较大。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;4. 问题泛性可约束&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;智能客服聊天机器人&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;虽然基于大模型，但其任务范围被严格约束在&lt;strong&gt;公司产品、服务、政策&lt;/strong&gt;的问答上。通过系统提示词、知识库检索和对话流程设计，将AI的泛化能力引导至一个明确的业务范围内，确保回答的相关性和准确性。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;单Agent 系统效果不好的场景&lt;/strong&gt;：项目代码AI工具（例如市面上比较知名的 Cursor, Claude Code, Trae）。&lt;/p&gt;
&lt;p&gt;这种就不是一个Agent  可以独立完成的，它必然是多Agent 的结构。因为它不满足上述四个维度中任何一个——通用场多，逻辑和实现上复杂，调用的工具种类多，而且容错性要控制在低的水平。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;而多Agent 最大的挑战&lt;/strong&gt;就是跨Agent 间的通信和协作。架构上和工程上都会复杂的多。&lt;/p&gt;
&lt;p&gt;这里以OpenManus 结构为例，有两个Agent：一个负责指定规划（不执行），一个负责具体执行和执行过程中的检查、矫正（结构上同样参考了 ReAct 模式）。两者间有一个 todo-list（代办事项）作为沟通协作的桥梁。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoopenmanus_art.png&#34; alt=&#34;openmanus_art&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h2 id=&#34;代码级复现人物形象描述agent&#34;&gt;代码级复现“人物形象描述Agent”
&lt;/h2&gt;&lt;p&gt;最后花点功夫，使用简单的Python 代码实现 游戏中第一个Agent——人物形象描述Agent。&lt;/p&gt;
&lt;h3 id=&#34;用到的工具一览&#34;&gt;用到的工具一览
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;工具名&lt;/th&gt;
          &lt;th&gt;工具类型&lt;/th&gt;
          &lt;th&gt;描述&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Python&lt;/td&gt;
          &lt;td&gt;面向对象的编程语言工具&lt;/td&gt;
          &lt;td&gt;&amp;gt;=3.10 版本，生成Agent代码&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;uv&lt;/td&gt;
          &lt;td&gt;增强版的 python 包管理工具&lt;/td&gt;
          &lt;td&gt;处理&amp;amp;记录python项目依赖包，同时生成项目相关描述文件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;openai-sdk&lt;/td&gt;
          &lt;td&gt;OpenAI提供的SDK包&lt;/td&gt;
          &lt;td&gt;用于生成LLM 实例&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tavily-sdk&lt;/td&gt;
          &lt;td&gt;Tavily 提供的SDK包&lt;/td&gt;
          &lt;td&gt;用于实现 web检索工具&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DeepSeek API_key&lt;/td&gt;
          &lt;td&gt;API Token&lt;/td&gt;
          &lt;td&gt;调用 DeepSeek 大模型的用户凭据&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tavily API_key&lt;/td&gt;
          &lt;td&gt;API Token&lt;/td&gt;
          &lt;td&gt;调用 Tavily 检索服务时的用户凭据&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;项目代码&#34;&gt;项目代码
&lt;/h3&gt;&lt;p&gt;因为有SDK 工具的帮助，实现起来真的不复杂。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;感兴趣的话 可以后台发送【&lt;strong&gt;1215&lt;/strong&gt;】获取原代码。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;项目目录下的就&lt;strong&gt;4个文件&lt;/strong&gt;：tools.py， llm.py， prompt.py， agent.py。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGopj_files.png&#34; alt=&#34;pj_files&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;他们相互间的关系：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;文件名&lt;/th&gt;
          &lt;th&gt;资源描述&lt;/th&gt;
          &lt;th&gt;调用关系&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;tools.py&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;web search 工具描述&lt;br&gt;web search 函数&lt;/td&gt;
          &lt;td&gt;Json格式化的tools 描述 &amp;ndash;&amp;gt; 填充进prompt.py提示词{tools}中&lt;br&gt;Tavily-SDK &amp;ndash;&amp;gt; 工具函数tavily_search（）&amp;ndash;&amp;gt; agent.py 中使用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;llm.py&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;llm 客户端（调用 DeepSeek API 接口）&lt;/td&gt;
          &lt;td&gt;OpenAI-SDK &amp;ndash;&amp;gt; llm.client &amp;ndash;&amp;gt;  agent.py 中 send_messages() 函数&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;prompt.py&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;ReAct 模式提示词（含有带替换的数据占位）&lt;/td&gt;
          &lt;td&gt;prompt  &amp;ndash;&amp;gt;  构成agent.py send_messages(message) 函数中&lt;strong&gt;message&lt;/strong&gt; 的一部分&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;agent.py&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;send_messages( ) 函数&lt;br/&gt;ReAct 模式的Agent实现&lt;/td&gt;
          &lt;td&gt;send_messages( )  &amp;lt;&amp;ndash; llm.client, ReAct 提示词&lt;br&gt;Agent执行任务  &amp;lt;&amp;ndash;   send_messages(message) 函数 &amp;lt;&amp;ndash; 预先定义好的&lt;strong&gt;系统提示词&lt;/strong&gt;和填充{tools}和{user_input}后的&lt;strong&gt;用户提示词&lt;/strong&gt; &amp;lt;&amp;ndash; 用户提问内容, Json格式化的tools 描述&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;运行一下看看效果&#34;&gt;运行一下，看看效果
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGouv_run_python1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;LLM 使用自有的知识，未使用web search工具&#34;
	
	
&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 为了演示，用户输入在代码中预先写好了： query = &amp;#34;浪浪山的小妖怪中的黄鼠狼，一个碎碎念的有志青年&amp;#34; &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 运行agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI_Agent_demo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;ai-agent&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-demo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;python&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGouv_run_python2_Action.png&#34; alt=&#34;uv_run_python2_Action&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGouv_run_python3_FinalAnswer.png&#34; alt=&#34;uv_run_python3_FinalAnswer&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h3 id=&#34;agent-在做什么&#34;&gt;&lt;strong&gt;Agent 在做什么&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;通过输出的前缀可以&lt;strong&gt;暴露LLM 的执行步骤&lt;/strong&gt;：这里大模型思考（Thought）了两次，工具执行（Action）一次。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：工具执行环节&lt;strong&gt;不是LLM 完成&lt;/strong&gt;的，而是由代码中的&lt;strong&gt;工具函数&lt;/strong&gt;tavily_search() 执行的。&lt;/p&gt;
&lt;p&gt;它们间的关系是： LLM 生成函数查询语句 {&amp;ldquo;query&amp;rdquo;: &amp;ldquo;&lt;strong&gt;浪浪山的小妖怪 黄鼠狼 角色 形象&lt;/strong&gt;&amp;quot;}，然后交给工具函数tavily_search(&amp;ldquo;浪浪山的小妖怪 黄鼠狼 角色 形象&amp;rdquo;)执行，执行后的结果 再放入messages中，提供给下次循环中LLM使用。&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在&lt;strong&gt;ReAct提示词模板&lt;/strong&gt;中，通过文字描述定义了&lt;strong&gt;大模型的状态标签&lt;/strong&gt;和&lt;strong&gt;状态流转过程&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;REACT_PROMPT&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;You run in a loop of Thought, Action, Action Input, PAUSE, Observation.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;At the end of the loop you output an Answer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Use Thought to describe your thoughts about the question you have been asked.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Use Action to run one of the actions available to you
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;use Action Input to indicate the input to the Action- then return PAUSE.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Observation will be the result of running those actions.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Your available actions are:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;{tools}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Rules:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;1- If the input is a greeting or a goodbye, respond directly in a friendly manner without using the Thought-Action loop.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;2- Otherwise, follow the Thought-Action Input loop to find the best answer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;3- If you already have the answer to a part or the entire question, use your knowledge without relying on external actions.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;4- If you need to execute more than one Action, do it on separate calls.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;5- At the end, provide a final answer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Some examples:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;### 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Question: 今天北京天气怎么样？
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Thought: 我需要调用 get_weather 工具获取天气
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Action: get_weather
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Action Input: {&amp;#34;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;city&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;: &amp;#34;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BeiJing&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;PAUSE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;You will be called again with this:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Observation: 北京的气温是0度.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;You then output: 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Final Answer: 北京的气温是0度.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;Begin!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;New input: {input}&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;问题解决的过程被&lt;strong&gt;细化为不同状态&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoReAct_process2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ReAct_process2&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Thought&amp;rdquo;: &amp;ldquo;问题规划&amp;rdquo;   &amp;ndash;&amp;gt;   &amp;ldquo;Action&amp;rdquo;: &amp;ldquo;外部工具名&amp;rdquo;    &amp;ndash;&amp;gt;   &amp;ldquo;Action Input&amp;rdquo;:  &amp;ldquo;外部工具参数&amp;rdquo; &amp;ndash;&amp;gt;   &amp;ldquo;PAUSE&amp;rdquo;（等待工具执行结果）   &amp;ndash;&amp;gt;   &amp;ldquo;Observation&amp;rdquo;: &amp;ldquo;工具执行结果&amp;rdquo;    &amp;ndash;&amp;gt;    &amp;ldquo;Thought&amp;rdquo;: &amp;ldquo;判断执行结果是否有助于回答用户提问&amp;rdquo;  &amp;ndash;if可以解决&amp;ndash;&amp;gt; &amp;ldquo;Final Answer&amp;rdquo;: &amp;ldquo;LLM 参考工具执行结果 回答用户提问&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;逻辑上 Agent 的执行过程就是个 &lt;strong&gt;循环语句&lt;/strong&gt;——直到LLM 判断得出 “&lt;strong&gt;Final  Answe&lt;/strong&gt;r:” 后任务才会停止&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;send_messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;response_text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;大模型的回复：&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;final_answer_match&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Final Answer:\s*(.*)&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;final_answer_match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;n&#34;&gt;final_answer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;final_answer_match&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;最终答案:&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;final_answer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;c1&#34;&gt;# LLM 答复中出现 &amp;#34;Final Answer:&amp;#34; 才会跳出循环&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;action_match&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Action:\s*(\w+)&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;action_input_match&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Action Input:\s*({.*?}|&amp;#34;.*?&amp;#34;)&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DOTALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;c1&#34;&gt;# LLM 思考后同时输出&amp;#34;Action&amp;#34; 和 &amp;#34;Action Input&amp;#34; 才会执行对应的工具（任务）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action_match&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action_input_match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;action_match&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;action_input_match&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;n&#34;&gt;observation&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tavily_search&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;n&#34;&gt;observation&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tavily_search&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;query&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;工具执行：Observation:&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;observation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;n&#34;&gt;observation&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;未知的工具: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tool_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;工具执行：Observation:&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;observation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Observation: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;observation&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大模型本身的思考、工具描述和工具函数执行的结果都会&lt;strong&gt;追加到变量 messages 中&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Observation: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;observation&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoReAct_process3.png&#34; alt=&#34;ReAct_process3&#34; style=&#34;zoom:85%;&#34; /&gt;
&lt;p&gt;再考虑到Agent本身就是循环执行的，可以想见如果一个问题要多次调用一个或多个工具，messages中的内容也是越来越长的。&lt;/p&gt;
&lt;p&gt;信息越来越长的结果有几个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tokens 消耗加速&lt;/li&gt;
&lt;li&gt;长的上下文可能会导致模型失焦&lt;/li&gt;
&lt;li&gt;过长的上下文（如 16k） 可能达到LLM 上下文的上限，那超出部分的内容模型根本看不到&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;react-范式是什么&#34;&gt;ReAct 范式是什么
&lt;/h2&gt;&lt;p&gt;首先 他不是单独一个元素：不是工具，不是agent ，也不是提示词。&lt;/p&gt;
&lt;p&gt;它是一套指导AI解决问题的框架：通过&lt;strong&gt;暴露解决问题的状态&lt;/strong&gt;和灵活&lt;strong&gt;调用外部工具&lt;/strong&gt;的特点，从&lt;strong&gt;逻辑&lt;/strong&gt;和&lt;strong&gt;数据&lt;/strong&gt;两个层面 提高AI回答问题的能力。在回答质量和回答准确度上都有提升。&lt;/p&gt;
&lt;p&gt;可以说 ，这就是当前单Agent系统下的标准框架。&lt;/p&gt;
&lt;h2 id=&#34;彩蛋&#34;&gt;&lt;strong&gt;【彩蛋】&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocaicaikan.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;caicaikan&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>吹过的牛皮要实现 —— 速通小模型微调</title>
        <link>https://blog.cba.nxlan.cn/p/ai_training_lora/</link>
        <pubDate>Sun, 16 Nov 2025 23:45:11 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/ai_training_lora/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoai-image-1763403766825-gcre34qo.png" alt="Featured image of post 吹过的牛皮要实现 —— 速通小模型微调" /&gt;&lt;h2 id=&#34;不小心吹个牛&#34;&gt;不小心吹个牛
&lt;/h2&gt;&lt;p&gt;一两个月前，我对大模型还比较迷信。觉得这模型真厉害，平时遇到啥问题，问它都可以回答个八九不离十。&lt;/p&gt;
&lt;p&gt;遂心向往之~&lt;/p&gt;
&lt;p&gt;后来也看到有UP主分享：“现在不流行训练自己的小模型了！真实项目中往往都是使用开源大模型+行业数据。”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;同事问我：“元芳，你怎么看？”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;我回答他，“耳听为虚，眼见为实。我要微调个自己的小模型看看。”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后，就拖到了现在。。。&lt;/p&gt;
&lt;p&gt;本文会&lt;strong&gt;分享以下内容&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型训练工具介绍（LLaMA-Factory）&lt;/li&gt;
&lt;li&gt;在Transformer 架构下模型训练算法（本次使用微调 LoRA）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从0 开始&lt;/strong&gt;，&lt;strong&gt;0花费&lt;/strong&gt;地训练一套小模型出来&lt;/li&gt;
&lt;li&gt;讨论什么场景下 更适合微调模型&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;效果展示&#34;&gt;效果展示
&lt;/h2&gt;&lt;p&gt;咱们老规矩，还是先上效果图——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodsr1_7b_chat1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;这个&lt;strong&gt;模型的用途&lt;/strong&gt;是：用户输入任意新闻标题后，它可以进行类型标注。&lt;/p&gt;
&lt;p&gt;例如，下面这两个新闻：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;用户提问：“新闻分类：真相了？外媒：特朗普想在伊朗“更迭政权””&lt;/p&gt;
&lt;p&gt;AI 回答：“国际”&lt;/p&gt;
&lt;p&gt;用户提问：“新闻分类：许昕发文感谢队友？从陪练张继科到世界冠军！称霸世界的国乒！”&lt;/p&gt;
&lt;p&gt;AI 回答：“体育”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这里的训练数据需要提前准备，格式上是这样的——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotrain_data.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;可以看出：“人类输入的内容” +  “AI回答的内容” 这样一问一答作为&lt;strong&gt;一条训练数据&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本次&lt;strong&gt;训练集&lt;/strong&gt;由&lt;strong&gt;300&lt;/strong&gt;条这样的问答对组成。&lt;/p&gt;
&lt;p&gt;我们的预期则是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;用户输入问题A &amp;ndash;&amp;gt; “训练后的模型” &amp;ndash;&amp;gt; 回答最合适的新闻类型（如：科技、体育、政治。。。）&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;训练后的模型输出，越接近训练集的结果，就认为这个模型越符合预期。反之，效果就一般。&lt;/p&gt;
&lt;p&gt;后续模型测试中会看到，训练不成功的效果长什么样。&lt;/p&gt;
&lt;p&gt;下面介绍下 训练AI模型使用到的工具：&lt;strong&gt;LLaMA-Factory&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它是模型训练工具的一种，&lt;strong&gt;适合初学者&lt;/strong&gt;（无需编写代码）快速上手操作。也是一个开源项目，官方介绍如下：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowelcom_llama-factory.png&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;h2 id=&#34;模型训练基础&#34;&gt;模型训练基础
&lt;/h2&gt;&lt;p&gt;如果了解并熟悉Transformer架构和 LoRA算法 或者 希望先上手微调训练，可以跳过本部分，查看后续操作步骤。&lt;/p&gt;
&lt;p&gt;有三点关键内容需要提前了解下：&lt;strong&gt;基座模型&lt;/strong&gt;，&lt;strong&gt;微调方法&lt;/strong&gt;以及&lt;strong&gt;训练参数&lt;/strong&gt;。不然，后面的操作过程中会有点懵。。。&lt;/p&gt;
&lt;h3 id=&#34;1-基座模型&#34;&gt;1. 基座模型
&lt;/h3&gt;&lt;p&gt;先说 “&lt;strong&gt;基座&lt;/strong&gt;”，顾名思义就是我们的训练是基于一个“底座”的。不是完完全全从0 开始训练一个新模型。&lt;/p&gt;
&lt;p&gt;因为训练这个模型的目的只是希望&lt;strong&gt;加强它在某一领域的知识和能力&lt;/strong&gt;，不是取代现有大模型的通用能力。&lt;/p&gt;
&lt;p&gt;所以，这个基座模型一般会选择&lt;strong&gt;开源&lt;/strong&gt;模型中效果和开销比较平衡的。&lt;/p&gt;
&lt;p&gt;比如这里使用的 &lt;strong&gt;DeepSeek-R1-Distill-Qwen-7B&lt;/strong&gt; ，实测效果比 小规模的&lt;strong&gt;DeepSeek-R1-Distill-Qwen-1.5B&lt;/strong&gt; 好不少。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q：关于这个名字，怎么既有 DeepSeek又有 Qwen？这么长一串到底啥意思？&lt;/p&gt;
&lt;p&gt;A： 这里涉及到&lt;strong&gt;开源大模型的命名规范&lt;/strong&gt;： 机构名/产品系列+技术和知识来源+规模。以“DeepSeek-R1-Distill-Qwen-7B” 为例。分为三个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DeepSeek-R1：DeepSeek 下的推理模型（慢思考，善于处理复杂逻辑内容）&lt;/li&gt;
&lt;li&gt;Distill-Qwen：通过&lt;strong&gt;蒸馏&lt;/strong&gt;(distillation) 通义干问 Qwen2.5 的通用知识&lt;/li&gt;
&lt;li&gt;7B：模型参数量70 亿&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它结合了 DeepSeek-R1的推理能力 + qwen 的通用知识，资源消耗也不大。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这里我们只关心，相关“行业数据”（新闻）的输出效果。而其他方面的能力在训练后可能会变弱，例如计算能力，写作能力等。&lt;/p&gt;
&lt;h3 id=&#34;2-微调方法lora&#34;&gt;2. 微调方法（LoRA）
&lt;/h3&gt;&lt;p&gt;这块涉及到 Transformer 架构下的&lt;strong&gt;数学矩阵计算&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;1）模型参数被转化为了数字向量&lt;/p&gt;
&lt;p&gt;2）向量的值是一个范围巨大的矩阵。为了方便理解这里以 100*100 的矩阵（全秩矩阵），表示原先的 模型参数量。&lt;/p&gt;
&lt;p&gt;3）问题来了：如果按照传统的训练微调（全参数微调）方式，就要训练全秩矩阵中每一个(10000)的值，工程量大 控制起来也复杂。&lt;/p&gt;
&lt;p&gt;​     有人就想出个优化的办法：通过两个小矩阵相乘 [ 100 * 2 ] * [ 2 *100 ] 可以填充全秩矩阵（100 * 100）的每个单元。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251117195610232.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;所以，LoRA（Low-Rank Adaptation of Large Language Models）方法就是精简&lt;strong&gt;训练上图 A B两个小矩阵&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;与LoRA 类似的训练小参方法，还有 QLoRA、Adapter、P-Tuning。简单了解一下——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoTransformer_training_types.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-训练参数&#34;&gt;3. 训练参数
&lt;/h3&gt;&lt;p&gt;先看一眼基本的训练参数：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonews_types_training.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;常用来调整的参数 &lt;strong&gt;加粗&lt;/strong&gt;表示下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;训练阶段&lt;/strong&gt;（stage）：常用 &lt;strong&gt;SFT&lt;/strong&gt;（Supervised Fine-Tuning）&lt;strong&gt;有监督微调&lt;/strong&gt;，不常用 DPO（Direct Preference Optimization）和 PPO（Proximal Policy Optimization）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习率&lt;/strong&gt;（Learning Rate）：决定了模型每次更新时权重改变的幅度。过大可能会错过最优解；过小会学得很慢或陷入局部最优解&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练轮数&lt;/strong&gt;（Epochs）：太少模型会欠拟合（没学好），太大会过拟合（学过头了）&lt;/li&gt;
&lt;li&gt;最大梯度范数（Max Gradient Norm）：当梯度的值超过这个范围时会被截断，防止梯度爆炸现象&lt;/li&gt;
&lt;li&gt;最大样本数（Max Samples）：每轮训练中最多使用的样本数&lt;/li&gt;
&lt;li&gt;计算类型（Computation Type）：在训练时使用的数据类型，常见的有 float32 和float16。在性能和精度之间找平衡&lt;/li&gt;
&lt;li&gt;截断长度（Truncation Length）：处理长文本时如果太长超过这个阈值的部分会被截断掉，避免内存溢出&lt;/li&gt;
&lt;li&gt;批处理大小（Batch Size）：由于内存限制，每轮训练我们要将训练集数据分批次送进去，这个批次大小就是 Batch Size&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;梯度累积&lt;/strong&gt;（Gradient Accumulation）：默认情况下模型会在每个 batch 处理完后进行一次更新一个参数，但你可以通过设置这个梯度累计，让他直到处理完多个小批次的数据后才进行一次更新&lt;/li&gt;
&lt;li&gt;验证集比例（Validation Set Proportion）：数据集分为训练集和验证集两个部分，训练集用来学习训练，验证集用来验证学习效果如何&lt;/li&gt;
&lt;li&gt;学习率调节器（Learning Rate Scheduler）：在训练的过程中帮你自动调整优化学习率页面上点击启动训练，或复制命令到终端启动训练&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好了，铺垫了这么多。终于可以动手操作了。&lt;/p&gt;
&lt;h2 id=&#34;模型微调实操&#34;&gt;模型微调实操
&lt;/h2&gt;&lt;p&gt;下面就是从0 开始，一步一步 微调我们需要的模型。&lt;/p&gt;
&lt;p&gt;相关测试数据和训练后的模型，我放在公众号 【&lt;strong&gt;AI 热气球&lt;/strong&gt;】中，感兴趣的话可以回复&lt;strong&gt;1117&lt;/strong&gt; 获取。&lt;/p&gt;
&lt;h3 id=&#34;0-环境准备&#34;&gt;0. 环境准备
&lt;/h3&gt;&lt;p&gt;既然是训练自然少不了显卡的加速，通常有三种方式：使用大模型提供商的在线微调服务、租用云平台的机器、本地自集成部署。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据安全&lt;/strong&gt;方面考虑： 本地自集成部署 &amp;gt; 租用云平台的机器 &amp;gt; 大模型提供商的在线微调服务&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;成本开销&lt;/strong&gt;方面考虑： 本地自集成部署 &amp;gt; 租用云平台的机器 &amp;gt; 大模型提供商的在线微调服务&lt;/p&gt;
&lt;p&gt;这么一看，优先选择“租用云平台的机器”完成小模型的训练和微调。毕竟我们这里数据不多，一次训练大约1小时左右。&lt;/p&gt;
&lt;p&gt;而且，用到的平台“魔塔” 为新用户&lt;strong&gt;提供36小时 带24g显卡云主机&lt;/strong&gt;的使用优惠，还是很划算的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;申请并创建个人魔塔账号(&lt;a class=&#34;link&#34; href=&#34;https://modelscope.cn/home&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://modelscope.cn/home&lt;/a&gt;)，过程中&lt;strong&gt;需要登录阿里云帐号&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在“我的 Notebook” (&lt;a class=&#34;link&#34; href=&#34;https://modelscope.cn/home&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://modelscope.cn/home&lt;/a&gt;) 中启动GPU主机—— 版本选择 &lt;strong&gt;Ubuntu 22.04&lt;/strong&gt; 的就行。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGorunning_env.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击“查看 Notebook”，进入控制台界面后，点击 “插件”按钮搜索并安装中文语言包。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoset_lang.png&#34; style=&#34;zoom:45%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;检查显卡工作正常&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 检查显卡驱动和状态——&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@dsw-1471676-9bf84dfcb-nmxqn: nvidia-smi 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Fri Nov &lt;span class=&#34;m&#34;&gt;14&lt;/span&gt; 16:06:26 &lt;span class=&#34;m&#34;&gt;2025&lt;/span&gt;       
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-----------------------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; NVIDIA-SMI 550.127.08             Driver Version: 550.127.08     CUDA Version: 12.4     &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;-----------------------------------------+------------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; GPU  Name                 Persistence-M &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Bus-Id          Disp.A &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Volatile Uncorr. ECC &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Fan  Temp   Perf          Pwr:Usage/Cap &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;           Memory-Usage &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; GPU-Util  Compute M. &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                         &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                        &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;               MIG M. &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=========================================&lt;/span&gt;+&lt;span class=&#34;o&#34;&gt;========================&lt;/span&gt;+&lt;span class=&#34;o&#34;&gt;======================&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  NVIDIA A10                     Off &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;   00000000:00:09.0 Off &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                  Off &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;  0%   26C    P8              9W /  150W &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;       4MiB /  24564MiB &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;      0%      Default &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                                         &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                        &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;                  N/A &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-----------------------------------------+------------------------+----------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                                                         
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-----------------------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Processes:                                                                              &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;  GPU   GI   CI        PID   Type   Process name                              GPU Memory &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;        ID   ID                                                               Usage      &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=========================================================================================&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;  No running processes found                                                             &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-----------------------------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@dsw-1471676-9bf84dfcb-nmxqn:/mnt/workspace# 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;1-llama-factory-工具安装&#34;&gt;1. llama-factory 工具安装
&lt;/h3&gt;&lt;p&gt;因为是在云平台上训练模型，云主机关机后除了个人工作目录 &lt;em&gt;/mnt/workspace&lt;/em&gt; 下的&lt;strong&gt;数据都会被清空&lt;/strong&gt;、还原。&lt;/p&gt;
&lt;p&gt;所以，后续相关操作（安装包下载  测试数据上传 训练模型合并、下载）都是在  &lt;em&gt;/mnt/workspace&lt;/em&gt; 这个目录下 。&lt;/p&gt;
&lt;p&gt;另外，也为了llama-factory 环境运行依赖的 python 包之间不会冲突。一般建议使用conda 创建虚拟环境。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们这里 使用更轻量、便捷的社区版 “&lt;strong&gt;Miniforge&lt;/strong&gt;”创建虚拟环境 。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入工作空间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /mnt/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 下载最新的 Miniforge 安装包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-Linux-x86_64.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 执行安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash Miniforge3-25.3.1-0-Linux-x86_64.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装过程中，提示选择安装路径，默认为 /root/minigorge3。修改成以下路径：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/mnt/workspace/miniforge3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 启用 Miniforge 配置和mamba 工具&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;/mnt/workspace/miniforge3/bin/conda shell.bash hook&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;mamba shell hook --shell bash&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建名为“llama-factory”的虚拟环境：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mamba create -n llama-factory &lt;span class=&#34;nv&#34;&gt;python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;3.10 （如果下载慢 就多试几次）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 激活虚拟环境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mamba activate llama-factory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGomamba_activate_newvenv.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;mamba_activate_newvenv&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;虚拟环境准备好后，正式进入 llama-factory 安装环节：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 克隆项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone --depth &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; https://github.com/hiyouga/LLaMA-Factory.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; LLaMA-Factory
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装项目相关依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -r requirements.txt （第一次安装时间较长，大约30分钟）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 执行安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -e &lt;span class=&#34;s2&#34;&gt;&amp;#34;.[torch,metrics]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;上述步骤完成，llama-factory 工具就安装好了。先查看下当期版本，后启动web界面&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;llamafactory-cli version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;llamafactory-cli webui
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGollama-factory_version.png&#34; alt=&#34;llama-factory_version&#34; style=&#34;zoom:80%;&#34; /&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGollama-factory_webui.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;llama-factory_webui&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;启动成功后，VSCode 会提示 打开一个http页面。&lt;/p&gt;
&lt;p&gt;该页面映射刚启动的llama-factory  web 服务（http://127.0.0.1:7860）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开网页，看到如下页面，表示 llama-factory 已经启动成功了。&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGollama-factory_startup.png&#34; alt=&#34;llama-factory_startup&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h3 id=&#34;2-基座模型下载&#34;&gt;2. 基座模型下载
&lt;/h3&gt;&lt;p&gt;这一步中，需要下载用到的基座模型 &lt;strong&gt;DeepSeek-R1-Distill-Qwen-7B&lt;/strong&gt; 。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;具体操作如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 同样需要把模型保存在工作目录 /mnt/workspace 下&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir /mnt/workspace/Hugging-Face
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 配置huggingface-hub 下载加速和路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;HF_ENDPOINT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https://hf-mirror.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;HF_HOME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/mnt/workspace/Hugging-Face
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;HF_HUB_DOWNLOAD_TIMEOUT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# huggingface_hub&amp;lt;1.0 时执行下载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 测试的话可以试试这个小模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 推荐使用7B这个模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;如果模型下载速度太慢的话：参考这篇文章&amp;lt;如何快速下载huggingface模型——全方法总结&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://zhuanlan.zhihu.com/p/663712983?s_r=0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://zhuanlan.zhihu.com/p/663712983?s_r=0&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下载完成后， 在指定的目录 &lt;em&gt;/mnt/workspace/Hugging-Face&lt;/em&gt; 中可以看到多出一个目录 叫“models&amp;ndash;deepseek-ai&amp;ndash;DeepSeek-R1-Distill-Qwen-7B”这个就是刚才下载完成的模型。&lt;/p&gt;
&lt;p&gt;然后，复制模型路径，稍候启动参数时需要指明模型具体位置。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 复制7b模型位置路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/mnt/workspace/Hugging-Face/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-7B/snapshots/916b56a44061fd5cd7d6a8fb632557ed4f724f60
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 如果下载了1.5b的模型，路径就是这样的 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/mnt/workspace/Hugging-Face/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-1.5B/snapshots/ad9f0ae0864d7fbcd1cd905e3c6c5b069cc8b562
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-基座模型运行测试&#34;&gt;3. 基座模型运行测试
&lt;/h3&gt;&lt;p&gt;先测试当前下载的模型加载、执行是否正常：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在已经打开的llama-factory 页面中，语言切换至“&lt;strong&gt;zh&lt;/strong&gt;”，指定“&lt;strong&gt;模型名称&lt;/strong&gt;”和“&lt;strong&gt;模型路径&lt;/strong&gt;”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后点击“&lt;strong&gt;Chat&lt;/strong&gt;” &amp;ndash; &amp;gt; “&lt;strong&gt;加载模型&lt;/strong&gt;”，提示加载成功后。输入用户 input，查看模型响应：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoLLaMA_Factory_running.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;LLaMA_Factory_running&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;如上图，表示模型正常响应，可以继续操作。&lt;/p&gt;
&lt;h3 id=&#34;4-上传训练数据&#34;&gt;4. 上传训练数据
&lt;/h3&gt;&lt;p&gt;训练数据格式有展示过，这里有两个数据文件+配置文件需要上传到 云主机上。&lt;/p&gt;
&lt;p&gt;其中 &lt;strong&gt;train.json&lt;/strong&gt; 为&lt;strong&gt;训练&lt;/strong&gt;用数据，&lt;strong&gt;eval.json&lt;/strong&gt; 为&lt;strong&gt;评估&lt;/strong&gt;数据。dataset_info.json 为相关配置文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251117233312767.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# dataset_info.json 配置文件内容：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;train&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;file_name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;train.json&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;formatting&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;sharegpt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;eval&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;file_name&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;eval.json&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;formatting&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;sharegpt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 上传这三个文件到以下目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/mnt/workspace/LLaMA-Factory/data/example_newsdata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;5-微调模型&#34;&gt;5. 微调模型
&lt;/h3&gt;&lt;p&gt;模型准备好了，训练数据也有了。&amp;quot;&lt;strong&gt;微调方法&lt;/strong&gt;&amp;quot; 默认就是 lora。这里就可以开始调整微调参数了——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;点击“&lt;strong&gt;Train&lt;/strong&gt;” 界面，“&lt;strong&gt;训练阶段&lt;/strong&gt;”中默认是SFT（有监督微调）不用修改。&lt;/p&gt;
&lt;p&gt;“&lt;strong&gt;数据路径&lt;/strong&gt;”和 “&lt;strong&gt;数据集&lt;/strong&gt;”选择上一步中的训练数据集“&lt;strong&gt;train&lt;/strong&gt;”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改微调相关参数，如：“&lt;strong&gt;学习率&lt;/strong&gt;” -&amp;gt; 5e-4, &amp;ldquo;&lt;strong&gt;训练轮数&lt;/strong&gt;&amp;rdquo; -&amp;gt; 10，“&lt;strong&gt;梯度累积&lt;/strong&gt;” -&amp;gt; 4, “&lt;strong&gt;LoRA+ 学习率比例&lt;/strong&gt;” -&amp;gt; 16, &amp;ldquo;&lt;strong&gt;LoRA 作用模块&lt;/strong&gt;&amp;rdquo; -&amp;gt; &amp;ldquo;all&amp;rdquo;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonews_types_round2.png&#34; alt=&#34;news_types_round2&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;点击“&lt;strong&gt;开始&lt;/strong&gt;”按钮，llama-factory 会加载模型和训练数据 进行训练。&lt;/p&gt;
&lt;p&gt;进行过程中，会有一副关于训练损失和训练步数的关系图。&lt;/p&gt;
&lt;p&gt;不同训练参数和模型，其训练时长不等。这里 20轮训练下来 差不多25分钟左右。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonews_types_round1_graph.png&#34; alt=&#34;news_types_round1_graph&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;训练期间 云主机 GPU 发力工作：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGollama-factory_training_gpustatus.png&#34; alt=&#34;llama-factory_training_gpustatus&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;最终训练好的模型，输出在上面的“&lt;strong&gt;输出目录&lt;/strong&gt;”中。后续可以基于此次训练结果，进行评估和测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;6-人工测试&#34;&gt;6. 人工测试
&lt;/h3&gt;&lt;p&gt;回到 “&lt;strong&gt;Chat&lt;/strong&gt;”界面，加载刚训练得到的模型检查点“train_2025-11-14-17-23-08”。&lt;/p&gt;
&lt;p&gt;手动测试下新模型的效果——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonews_types_round1_chattest.png&#34; alt=&#34;news_types_round1_chattest&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;测试两三次，感觉起来好像还行。模型微调的过程就告一段落了。&lt;/p&gt;
&lt;p&gt;但到底新模型效果如何，还是需要数据说话——&lt;/p&gt;
&lt;h2 id=&#34;新模型评估&#34;&gt;新模型评估
&lt;/h2&gt;&lt;p&gt;我们之前不是准备了 评估数据集 “&lt;strong&gt;eval.json&lt;/strong&gt;” 么，此时派上用场。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点击“Evaluate&amp;amp; Predict” 界面，“&lt;strong&gt;数据路径&lt;/strong&gt;”和 “&lt;strong&gt;数据集&lt;/strong&gt;”选择之前上传的数据集“&lt;strong&gt;eval&lt;/strong&gt;”。&lt;/li&gt;
&lt;li&gt;其他评估参数保持默认，点击“&lt;strong&gt;开始&lt;/strong&gt;”按钮。&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonews_types_round1_evaluate_process.png&#34; alt=&#34;news_types_round1_evaluate_process&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;完成后，注意其中 “predict_rouge-1”的分数。这个分值越高，表明新模型生成质量越好。&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonews_types_round1_evaluate_result.png&#34; alt=&#34;news_types_round1_evaluate_result&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;上图中该值为 &lt;strong&gt;53.85&lt;/strong&gt;——说明新模型生成的文本与评估数据（eval.json）&lt;strong&gt;在单词级别上有 53.85%的重合&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;新模型导出&#34;&gt;新模型导出
&lt;/h2&gt;&lt;p&gt;此时新训练出来的模型还在云主机上。我们怎么把它拖到本地呢？&lt;/p&gt;
&lt;h3 id=&#34;1-首先导出模型&#34;&gt;1. 首先导出模型
&lt;/h3&gt;&lt;p&gt;点击“&lt;strong&gt;Export&lt;/strong&gt;” 界面，“&lt;strong&gt;导出设备&lt;/strong&gt;” -&amp;gt; &lt;strong&gt;auto&lt;/strong&gt;，在“&lt;strong&gt;导出目录&lt;/strong&gt;”中输入模型导出路径后，点击“&lt;strong&gt;开始导出&lt;/strong&gt;”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGollama-factory_export_model.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;llama-factory_export_model&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;看到“&lt;strong&gt;模型导出完成&lt;/strong&gt;”，代表成功导出了此次训练出来的新模型。&lt;/p&gt;
&lt;p&gt;在云主机 VSCode界面中，也可以看到新模型有哪些文件组成——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoexport_modelfiles.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;export_modelfiles&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是&lt;/strong&gt;，这些模型文件不能直接在本地使用 Ollama 调用。&lt;/p&gt;
&lt;p&gt;我们需要用到第二个开源工具——llama.cpp。&lt;/p&gt;
&lt;h3 id=&#34;2-使用llamacpp-工具&#34;&gt;2. 使用llama.cpp 工具
&lt;/h3&gt;&lt;p&gt;使用 llama.cpp 工具，可以将上述模型文件转为 &lt;strong&gt;一个 .gguf 格式的文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而后者，是可以在ollama 平台中加载、运行的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;与传统基于 Python 的 AI 框架（如 PyTorch/TensorFlow）不同，llama.cpp 选择回归底层语言C/C++的实现策略。这种设计使其摆脱了 Python 解释器、CUDA 驱动等重型依赖，通过静态编译生成单一可执行文件，在资源受限环境中展现出独特优势。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这里，同样在云主机中完成转换工作——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 在Vscode中新建一个会话终端，并进入工作目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /mnt/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 克隆项目文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone --depth &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; https://github.com/ggerganov/llama.cpp.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;/mnt/workspace/miniforge3/bin/conda shell.bash hook&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# [Option] 创建名为llama.cpp的新虚拟环境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mamba create -n llama.cpp &lt;span class=&#34;nv&#34;&gt;python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;3.10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;mamba shell hook --shell bash&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mamba activate llama.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装项目所需依赖包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -r llama.cpp/requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 最后执行格式转换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python3 llama.cpp/convert_hf_to_gguf.py ./export_models/deepseek-r1-1.5b-merged --outfile ./dsr1_1.5b_newstype.gguf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;格式转换成功——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INFO:gguf.gguf_writer:Writing the following files:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INFO:gguf.gguf_writer:dsr1_1.5b_newstype.gguf: &lt;span class=&#34;nv&#34;&gt;n_tensors&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 339, &lt;span class=&#34;nv&#34;&gt;total_size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 3.6G
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Writing: 100%&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; 3.55G/3.55G &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;00:56&amp;lt;00:00, 63.3Mbyte/s&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INFO:hf-to-gguf:Model successfully exported to dsr1_1.5b_newstype.gguf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;ollama-上运行新模型&#34;&gt;ollama 上运行新模型
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下载 &lt;strong&gt;dsr1_1.5b_newstype.gguf&lt;/strong&gt; 文件到本地目录，如 &lt;strong&gt;D:\download\export_models&lt;/strong&gt; 中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后，创建一个名为 &lt;strong&gt;ModelFile&lt;/strong&gt; 的配置文件。注意，该文件没有后缀名。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​	文件中内容如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FROM ./dsr1_1.5b_newstype.gguf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# set the temperature to 0.7 [higher is more creative, lower is more coherent]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PARAMETER temperature 0.7
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PARAMETER top_p 0.8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PARAMETER repeat_penalty 1.05
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TEMPLATE &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;{{ if .System }}&amp;lt;|im_start|&amp;gt;system
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;{{ .System }}&amp;lt;|im_end|&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;{{ end }}{{ if .Prompt }}&amp;lt;|im_start|&amp;gt;user
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;{{ .Prompt }}&amp;lt;|im_end|&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;{{ end }}&amp;lt;|im_start|&amp;gt;assistant
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;{{ .Response }}&amp;lt;|im_end|&amp;gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# set the system message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SYSTEM &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;You are a news category assistant.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;确认本机 &lt;strong&gt;ollama 服务正在运行&lt;/strong&gt;。执行以下命令完成 新模型的导入——&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ollama&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;create&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deepseek&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r1_1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b_newstype&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;D:\download\export_models\ModelFile&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;pre&gt;&lt;code&gt;导入成功：
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoollama_run.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ollama_run&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;后续会很方便在 AI 应用中直接调用这个训练好的模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;如今为何不建议自己训练模型&#34;&gt;如今，为何不建议自己训练模型
&lt;/h2&gt;&lt;p&gt;我想有两方面原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;现有模型80%~90% 是基于transformer架构的&lt;strong&gt;生成式AI&lt;/strong&gt;，该架构下的AI响应结果严重依赖训练数据，因为模型自己是不会推理的。&lt;/p&gt;
&lt;p&gt;而有用的小模型，需要行业大量的数据。如果&lt;strong&gt;数据不够&lt;/strong&gt;，真实上线时，会放心交给模型自己去猜？&lt;/p&gt;
&lt;p&gt;所以，在&lt;strong&gt;数据量不足&lt;/strong&gt;的前提下，花时间、金钱去训练自己的模型是在找死。&lt;/p&gt;
&lt;p&gt;但是，反过来说，&lt;strong&gt;如果自己的数据量充足&lt;/strong&gt;，这个训练就很有意义了——一定场景下可以实现&lt;strong&gt;低成本&lt;/strong&gt;和&lt;strong&gt;快速响应&lt;/strong&gt;！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用大模型的能力在快速迭代，他们获取数据的广度和成本不是 中小公司可以匹敌的。两者的维度不一样，&lt;strong&gt;存在跨维打击的可能&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;每人希望看到：今天花了100W得到的模型 视为珍宝，明天就被通用模型超越变成黄花的局面。&lt;/p&gt;
&lt;p&gt;除非，&lt;strong&gt;自己领域的数据市面上没有第二家&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以，本质上要看&lt;strong&gt;行业数据的情况&lt;/strong&gt;而定，如果样本足够多，样本足够稳定，才可以考虑微调训练自己的模型。&lt;/p&gt;
&lt;p&gt;另外，在关于 &lt;strong&gt;微调和 RAG&lt;/strong&gt;的对比上——&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;对比维度&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;模型微调&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;RAG&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;让模型&lt;strong&gt;学会&lt;/strong&gt;新知识或技能，改变其内部参数&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;为模型&lt;strong&gt;提供&lt;/strong&gt;外部知识，利用其现有能力进行回答&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;时间成本&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;长（数据准备、训练、迭代）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;短（主要工作是知识库构建）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;资金成本&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;高（训练计算、评估、迭代成本）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;低（主要是构建和检索成本）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;适用场景&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;改变模型行为、学习&lt;strong&gt;隐性知识&lt;/strong&gt;（如风格、格式、复杂推理）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;查询&lt;strong&gt;动态、具体的事实性知识&lt;/strong&gt;，要求信息溯源&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;数据需求&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;需要高质量、大规模的标注数据集，力求覆盖所有场景&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;按需提供，需要什么知识就准备什么文档&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;技术门槛&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;高（需机器学习/深度学习专业知识）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;相对较低（更多是工程和数据处理）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;迭代与维护&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;困难（更新知识需重新训练或增量训练）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;简单（直接增删改知识库文档即可）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;实时性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;差，知识固化在模型中，无法感知新信息&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;好，知识库更新后立即可用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;响应速度&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;生成&lt;/strong&gt;速度快（推理阶段无需额外检索）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;整体&lt;/strong&gt;响应较慢（需&amp;quot;检索+生成&amp;quot;两个步骤）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;可解释性/溯源&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;差，是&amp;quot;黑盒&amp;quot;，无法确认答案来源&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;好，可以提供引用的原始文档片段&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;&amp;ldquo;幻觉&amp;quot;问题&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;可能基于错误学习产生幻觉&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;能有效减少幻觉，答案基于提供的事实&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;=============================================================&lt;/p&gt;
&lt;p&gt;最后，推荐一个学习资源——来自极客时间的 课程 &amp;lt;&lt;strong&gt;DeepSeek 应用开发实战&lt;/strong&gt;&amp;gt;。&lt;/p&gt;
&lt;p&gt;本文一部分内容，也是参考了这门课程。我自己目前也收益良多。&lt;/p&gt;
&lt;p&gt;课程章节感兴趣的朋友，可以&lt;strong&gt;免费试看&lt;/strong&gt;这门课程中任意4个章节内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocourse_outline.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;course_outline&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGogeektime_course.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;geektime_course&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>2025年了，还需要在Windows下安装docker-desktop环境么？</title>
        <link>https://blog.cba.nxlan.cn/p/windows_dockerdesk_install/</link>
        <pubDate>Sat, 18 Oct 2025 22:40:42 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/windows_dockerdesk_install/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGodocker_compose_up2.png" alt="Featured image of post 2025年了，还需要在Windows下安装docker-desktop环境么？" /&gt;&lt;h2 id=&#34;起因&#34;&gt;起因
&lt;/h2&gt;&lt;p&gt;我有一个朋友，想要学习AI 方面的案例。但是苦于手头没有Linux server，就问我能不能在他的&lt;strong&gt;windows电脑上跑docker-compose 项目&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我稍微折腾后发现：在2025年的今天，想要在windows上运行docker容器，还是有几个门槛在这里的——很容易因为一些小的设置卡好几个小时。所以，在这里汇总并分享下。&lt;/p&gt;
&lt;p&gt;如果对你有帮助，帮忙点个赞支持一波  ^^&lt;/p&gt;
&lt;h2 id=&#34;评估是否有必要&#34;&gt;评估是否有必要
&lt;/h2&gt;&lt;p&gt;就像上面提到的，是因为条件受限才考虑在windosw上跑docker 应用。&lt;/p&gt;
&lt;p&gt;如果以下情况满足3条以上，那这种情况适合你——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手头没有类Linux环境（如 Ubuntu、Rocky）&lt;/li&gt;
&lt;li&gt;手头有运行Linux的环境，但是硬件不是x86架构的&lt;/li&gt;
&lt;li&gt;偶尔跑一些docker项目（即docker 应用不需要 7*24 长时间运行）&lt;/li&gt;
&lt;li&gt;只运行docker 应用，不需要开发docker应用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外在windows 上运行docker 应用对软硬件系统也是有要求的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;win10&lt;/strong&gt; 要求21h2以上版本 + 64位 家庭版 或 专业版 或 企业版&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;win11&lt;/strong&gt; 要求22h2以上版本 + 64位 家庭版 或 专业版 或 企业版&lt;/li&gt;
&lt;li&gt;需要CPU支持虚拟化技术（Intel VT-x 或 AMD-V），并在BIOS 中启用&lt;/li&gt;
&lt;li&gt;4GB 以上内存&lt;/li&gt;
&lt;li&gt;需要有管理员权限，以便安装docker-desktop程序和windows组件&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;微软官方文档在这里&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;安装&#34;&gt;安装
&lt;/h2&gt;&lt;p&gt;如果以上的诸多条件和限制，还没有打消你的念头。好吧，头铁的朋友，这篇文章就是为你而写的！&lt;/p&gt;
&lt;h3 id=&#34;0-准备工作&#34;&gt;0. 准备工作
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;检查上述软硬件要求是否满足&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要&lt;strong&gt;自备梯子&lt;/strong&gt;，主要用于拉取docker image文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-安装wsl&#34;&gt;1. 安装wsl
&lt;/h3&gt;&lt;p&gt;wsl 全名为 &amp;ldquo;Windows Subsystem for Linux&amp;rdquo;，为windows 下运行docker 的底层环境——毕竟windows 和 Linux 是两套内核。&lt;/p&gt;
&lt;p&gt;安装起来倒是不复杂，一条命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wsl --install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowsl_success_install.png&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;重启&lt;/strong&gt;后，查看wsl版本信息：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowsl_installation_finished.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;h3 id=&#34;2-安装docker-desktop&#34;&gt;2. 安装docker-desktop
&lt;/h3&gt;&lt;p&gt;从docker &lt;a class=&#34;link&#34; href=&#34;https://www.docker.com/products/docker-desktop/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;官方网站&lt;/a&gt; 下载Docker-Desktop for windows AMD64。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251019001245960.png&#34; style=&#34;zoom:47%;&#34; /&gt;
&lt;p&gt;双击docker-desktop安装包执行安装，安装完成后“&lt;strong&gt;重启&lt;/strong&gt;”电脑。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_desktop_installation_finished.png&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;h3 id=&#34;3-wsl-和-docker-desktop-关联成功&#34;&gt;3. wsl 和 docker-desktop 关联成功
&lt;/h3&gt;&lt;p&gt;重启后，会看到wsl 启用成功的通知：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowsl_enabled.png&#34; alt=&#34;wsl 安装成功&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;p&gt;因为，是先安装的wsl 后安装的docker-desktop。docker-desktop 此时&lt;strong&gt;已经默认调用&lt;/strong&gt;了wsl 集成环境。（不用手动修改）&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_desktop_setting.png&#34; style=&#34;zoom:47%;&#34; /&gt;
&lt;p&gt;使用命令也可以看到，两者已经关联并运行了：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowsl_versino.png&#34; style=&#34;zoom:57%;&#34; /&gt;
&lt;p&gt;同时，电脑中会多出一个Linux 的企鹅图标。不用管它。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowsl_enabled2.png&#34; style=&#34;zoom:45%;&#34; /&gt;
&lt;h3 id=&#34;4-修改docker-desktop-设置&#34;&gt;4. 修改docker-desktop 设置
&lt;/h3&gt;&lt;p&gt;在docker-desktop 的设置中，有三处需要修改。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为，docker-desktop 安装时默认使用C盘保存 docker 镜像文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下载镜像文件多了后，很容易导致C 盘空间占满。所以这一步，需要&lt;strong&gt;手动更改镜像文件保存路径&lt;/strong&gt;（image location）。&lt;/p&gt;
&lt;p&gt;例如，我改为 *&lt;em&gt;E:\docker_images*&lt;/em&gt; 目录下：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_desktop_setting2.png&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;另外，还需要指定&lt;strong&gt;代理环境&lt;/strong&gt;（使用梯子代理服务端口），以便后续拉取docker 镜像：&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_desktop_setting3.png&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[&lt;strong&gt;Option&lt;/strong&gt;] 如果没有梯子，可以尝试使用国内的docker 镜像站（注：可能不稳定）：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_desktop_setting4.png&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;拉取镜像验证&#34;&gt;拉取镜像&amp;amp;验证
&lt;/h2&gt;&lt;p&gt;参照以之前&lt;a class=&#34;link&#34; href=&#34;https://blog.cba.nxlan.cn/p/n8n_docker/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;n8n 自部署 (nxlan.cn)&lt;/a&gt;初始化案例。这里先创建n8n项目目录&amp;quot;&lt;strong&gt;n8n-data&lt;/strong&gt;&amp;ldquo;和 &amp;ldquo;&lt;strong&gt;docker-compose.yaml&lt;/strong&gt;&amp;ldquo;项目文件。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_docker_prj.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;p&gt;然后使用以下命令启动该项目——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动成功日志——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_compose_up.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;p&gt;同样的，docker-desktop 中的images 界面可以看到刚刚拉取到的镜像文件和相关信息（版本，大小，运行情况）：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_compose_up2.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;最后，登录本地n8n环境。证明所有安装完成。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGosuccess_login_n8n_web.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;h2 id=&#34;补充说明&#34;&gt;补充说明
&lt;/h2&gt;&lt;h3 id=&#34;v445版本额外操作&#34;&gt;v4.45版本额外操作
&lt;/h3&gt;&lt;p&gt;[v4.45] 版本的docker-desktop &lt;strong&gt;版本有bug&lt;/strong&gt;，无法在“设置”中修改images镜像保存位置，所以只能通过powershell 命令行操作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt; 经测试[v4.48] 版本修复了这个bug，无需以下命令行方式修改，通过图形化设置界面就可以修改。&lt;/p&gt;
&lt;p&gt;1 临时关闭wsl 服务&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wsl --shutdown
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2 导出并备份wsl 原有数据文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#先备份到E盘docker_images目录下&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;wsl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;desktop&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;E&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;docker_images&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;DockerDesktopWSL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;3 注销原有docker-desktop 数据文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wsl --unregister docker-desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;4 导入并重新关联新位置的docker-desktop 数据文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#重新导入备份数据文件至硬盘新位置——E:\docker_desktop\DockerDesktopWSL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wsl --import docker-desktop E:\docker_desktop\DockerDesktopWSL E:\docker_desktop\DockerDesktopWSL.bak --version 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;wsl-运行环境限制&#34;&gt;wsl 运行环境限制
&lt;/h3&gt;&lt;p&gt;目前测试发现，受限于wsl的安全策略：&lt;/p&gt;
&lt;p&gt;windows环境下的docker实例，访问某个目录中的数据时，不能使用相对路径，必须&lt;strong&gt;使用绝对路径&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;例如，希望把 docker-compose.yaml 所在目录下的 app\data同时挂载给 docker A，不能这么写——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - ./app/data:/docker-app/data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;而是需要使用绝对路径——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - /mnt/host/app/data:/docker-app/data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;后续如果需要卸载wsl和docker-desktop&#34;&gt;后续如果需要卸载wsl和docker-desktop
&lt;/h3&gt;&lt;p&gt;卸载docker-desktop 和平常卸载软件没什么区别。&lt;/p&gt;
&lt;p&gt;卸载 wsl 也是一句命令即可：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wsl --uninstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowsl_uninstall.png&#34; style=&#34;zoom:57%;&#34; /&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>AI面试官[续] —— 改用Agent的方式实现</title>
        <link>https://blog.cba.nxlan.cn/p/n8n_ai_interview/</link>
        <pubDate>Tue, 14 Oct 2025 11:29:56 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/n8n_ai_interview/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGon8n_chatting_Agent.png" alt="Featured image of post AI面试官[续] —— 改用Agent的方式实现" /&gt;&lt;h2 id=&#34;写在前面&#34;&gt;写在前面
&lt;/h2&gt;&lt;p&gt;上次写dify上的 &lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/ApjI7049PbrhXrGbnVucyQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI 面试官案例&lt;/a&gt;后，没几天就看到了BOSS 上的一条回复——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoBOSS.jpeg&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;p&gt;哈哈，是不是有种一眼看穿的感觉——是的，这里HR调用了AI，结合岗位和面试人员背景提出了三个不同维度（ 分别是：产品mvp的规划和定义，推进中的协调和调整，上线后的反思和改进）的问题。&lt;/p&gt;
&lt;p&gt;今天，将在n8n上实现相同AI智能面试官的任务。&lt;/p&gt;
&lt;p&gt;不同于dify 工作流中需要特别关注对话内容递进和信息流转，本文会更为关注&lt;strong&gt;Agent框架下&lt;/strong&gt;实现相同需求的&lt;strong&gt;差异和优缺点&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;完成这个任务，后续可以作为一个MCP tool 再被其他Agent调用。例如，面向整个招聘环节的 “HR AI招聘系统”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通过本文，可以收获以下内容&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;知识库文档切分、向量化和入库的细节&lt;/li&gt;
&lt;li&gt;多轮对话中，使用思维链（CoT）&lt;strong&gt;提示词&lt;/strong&gt;约束LLM行为的同时，也发挥Agent更为优秀的输出能力&lt;/li&gt;
&lt;li&gt;RAG召回后，如何与LLM协同完成问题的回答&lt;/li&gt;
&lt;li&gt;多轮对话中，Agent与Tools、LLM 之间的调用关系&lt;/li&gt;
&lt;li&gt;同一个应用，不同实现路径（Workflow vs Agent ）间的差异&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;效果展示&#34;&gt;效果展示
&lt;/h2&gt;&lt;p&gt;老样子，先上效果图。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;本地知识库内容向量化入库&lt;/strong&gt;：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_RAG_VectorStore_.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;通过Agent 完成多轮面试问答&lt;/strong&gt;：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_chatting_Agent.png&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;面试问题总结和评估&lt;/strong&gt;：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_chatting_feedback2.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;实现步骤&#34;&gt;实现步骤
&lt;/h2&gt;&lt;h3 id=&#34;1-上传文档并使用rag技术分片存储&#34;&gt;1. 上传文档，并使用RAG技术分片存储
&lt;/h3&gt;&lt;p&gt;还是使用之前预处理过的两个面试问答文档：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoRAG_documents.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;不过，需要把它们上传到n8n docker 应用中去，这里我是放在 &lt;em&gt;/home/node/upload_files/&lt;/em&gt; 文件夹下：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_Read_localfiles.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;向量数据库就使用之前dify中安装好的Weaviate。&lt;/p&gt;
&lt;p&gt;因为在Weaviate数据库建立的时候没有设置API Key，这里在n8n中只需关联Weaviate链接地址（http://difiy.host:8080）就可以查看内部数据表了：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_RAG_VectorStore_2.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;如果本地没有向量数据库，也不希望把文档吐给云上的向量数据库，可以使用n8n提供的本地“&lt;strong&gt;简单向量存储&lt;/strong&gt;”工具。该工具是把向量和分片数据&lt;strong&gt;储存到内存&lt;/strong&gt;当中的，就是重启后那些处理过的数据会全部。只建议在测试环境中使用这个“简单向量存储”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_RAG_LocalStore_.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;最终，将以上节点组合起来，就是第一个工作流——知识库文档向量化并存储。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_RAG_VectorStore_.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;p&gt;手动&lt;strong&gt;点击”执行“&lt;/strong&gt;，看一眼输出结果。&lt;/p&gt;
&lt;p&gt;在n8n的logs 中可以清楚地看到&lt;strong&gt;向量化的过程&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;读取本地目录中的文件 &amp;ndash;&amp;gt; 进入循环 &amp;ndash;&amp;gt; Weaviate 向量库工具，先是根据文档中的切分标记“BBBBBB” 对文档分片 &amp;ndash;&amp;gt;  然后使用embedding 模型计算每个分片的向量值 （这里设定每次处理20个分片） &amp;ndash;&amp;gt;  第一个文档切分为了101片，所以经过6次的重复计算  &amp;ndash;&amp;gt;  将每个分片的信息（含原始文本内容和元数据）与embedding 计算后的向量值关联在一起储存  &amp;ndash;&amp;gt;  这样就完成了第一个文档的切分和向量化存储 &amp;ndash;&amp;gt;  同样地过程处理第二个文档 &amp;ndash;&amp;gt;  直至所有文档处理完成，循环结束&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_RAG_VectorStore_log1.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;例如，其中一个分片按照以下格式存储在向量数据库中——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ID: 0001f149-5a73-4666-975c-d9e1ae6bab59
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;values: [0.00667897193, -0.00112631731, 0.402422339, -0.0144329099, 0.0131256515, 。。。。-0.00670505082, 0.00998431537, 0.00638512149, 0.00762740057, -0.00297592231]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;blobType: &amp;#34;application/vnd.openxmlformats-officedocument.wordprocessingml.document&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;loc.lines.from: 349
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;loc.lines.to: 357
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;source: &amp;#34;blob&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;text: &amp;#34;4. 你老家哪里的？\n\n技巧：这个问题主要想了解你的稳定性，会不会做一段时间就辞职。\n\n模板：\n\n我的老家是\t ，是一个\t 的地方。但是因为\t，我更想要在这个城市长期发展，而且我的家人都很支持我的选择。\n\n回答示例：我老家是西双版纳的，是一个旅游城市，以后有机会去的话，可以给你推荐一些很值得打卡的地方。但是比起在老家发展，我更想留在这个城市，因为对我所读的专业来说，这里能给我提供更多的就业机会和发展，所以找工作选的这里的公司。而且家里人都很支持我的选择，我打算长期留在这边发展。&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中，有原始的文本，有文档切片元数据（指明了对应原始文档的第349行到357行），还有一长串向量。&lt;/p&gt;
&lt;p&gt;而这个向量，就是后续向量库检索时的条件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;另外&lt;/strong&gt;，有两点再补充一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不同于Transformers 模型，encoder时是&lt;strong&gt;按照每个Token&lt;/strong&gt; 完成向量化计算（得到512x1 的矩阵）。&lt;/p&gt;
&lt;p&gt;RAG中embedding 向量化的对象是&lt;strong&gt;全部的输入&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;例如，下面查询句子&amp;quot;hello Qwen3&amp;quot;的向量结果——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 向OLLAMA API接口发起这段话”hello Qwen3“的向量查询，使用的模型是qwen3-embedding:8b 。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ollama&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11434&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;model&amp;#34;:&amp;#34;qwen3-embedding:8b&amp;#34;,&amp;#34;input&amp;#34;: &amp;#34;hello Qwen3&amp;#34;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 返回的内容格式如下，其中 embeddings对应的就是一个 4096 长度的列表。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;qwen3-embedding:8b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;embeddings&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.005400424&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.004791923&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.009427172&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.01674511&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.0012024766&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;......&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;省略中间部分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.00039164326&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.015191954&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.011491347&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.00041572566&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;total_duration&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7977521700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;load_duration&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;100531700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;prompt_eval_count&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;所以，拆分后的100个问答对，就会产生100个向量。而向量长度取决于模型。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_RAG_qwen-8b-embedding_example.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;qwen3-embedding:8b&lt;/strong&gt; 模型，把内容向量化后，默认是得到一个&lt;strong&gt;4096x1 的一维向量&lt;/strong&gt;。上图最右侧展示了 4081 ~ 4095 这几个位置的向量值。&lt;/p&gt;
&lt;p&gt;不同的embedding 模型其向量化后的长度不一定一样。&lt;/p&gt;
&lt;p&gt;使用的时候需要&lt;strong&gt;注意筛选&lt;/strong&gt;：越长的向量化输出，带来更精细的的向量数据和更大的资源开销。&lt;/p&gt;
&lt;p&gt;这边根据网上资料，整理了常见的向量化模型——&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;模型 (Model)&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;开发者/机构 (Developer/Organization)&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;最大/默认向量长度 (Max/Default Dimension)&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;备注 (Notes)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;支持可变维度的先进模型&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Qwen3-Embedding-8B&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;阿里巴巴 (Alibaba)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;4096&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;支持MRL&lt;/strong&gt;，可截断为 32 到 4096 之间的任意维度。上下文长度 32k。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;text-embedding-3-large&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;OpenAI&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;3072&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;支持MRL&lt;/strong&gt;，API中可指定 &lt;code&gt;dimensions&lt;/code&gt; 参数，例如 256, 512, 1024, 1536。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;text-embedding-3-small&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;OpenAI&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1536&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;支持MRL&lt;/strong&gt;，API中可指定 &lt;code&gt;dimensions&lt;/code&gt; 参数，例如 256, 512。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;主流闭源模型&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;text-embedding-ada-002&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;OpenAI&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1536&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;不支持可变维度。曾是业界最广泛使用的API模型之一。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;text-embedding-gecko&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Google (Vertex AI)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;768&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Google PaLM 2 系列的 embedding 模型。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;主流开源模型&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;bge-large-en-v1.5&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;BAAI (智源研究院)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1024&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;MTEB 排行榜上的常客，性能强大。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;e5-large-v2&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Microsoft&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;1024&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;另一个经典的、性能优异的开源模型。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-agent-实现多轮问答和记忆&#34;&gt;2. Agent 实现多轮问答和记忆
&lt;/h3&gt;&lt;p&gt;Agent 这部分内容，我们之前在AI 新闻采集与推送助手的案例中有经验：&lt;/p&gt;
&lt;p&gt;主要由 LLM + memory + tools 几部分组成。&lt;/p&gt;
&lt;p&gt;如今&lt;strong&gt;在同样的多轮对话场景下&lt;/strong&gt;，Agent又是如何实现这些过程呢？&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoHR_interview_process.svg&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;与workflow 方式不同的是：Agent中分析、判断、推理能力成为出厂默认配置，不再需要人工提取和干预，而是交给AI &lt;strong&gt;自主决策&lt;/strong&gt;——俗称AI max 。&lt;/p&gt;
&lt;p&gt;具体操作层面：&lt;/p&gt;
&lt;p&gt;通过带有思维链的&lt;strong&gt;提示词&lt;/strong&gt;，引导AI完成上述对话环节分析和打分评估。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;  1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 59
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 60
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 61
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 62
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 63
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 64
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 65
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 66
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 67
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 68
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 69
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 70
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 71
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 72
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 73
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 74
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 75
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 76
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 77
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 78
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 79
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 80
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 81
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 82
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 83
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 84
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 85
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 86
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 87
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 88
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 89
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 90
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 91
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 92
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 93
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 94
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 95
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 96
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 97
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 98
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 99
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;100
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;101
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;102
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;103
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;104
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;105
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;106
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;107
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;108
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;109
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;110
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;111
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;112
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;113
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;114
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;115
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;角色
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你是一个有十年面试经验的专业HR。现在是我的专属&amp;#34;面试顾问&amp;#34;，你的任务是模拟面试官进行面试提问和打分，然后输出专属改进建议。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最终你需要将所有分析和建议，整合为一个可用于展示的Markdown格式文本块。保持专业、乐观、敏锐！
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;有一个核心工具供你调遣：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;quary vector info: 检索面试问答知识库中，与提问问题相关的回答案例。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你的行动指令：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;第一论对话：发起初始对话
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;模型HR面试官语气，询问面试人员年龄 工作年限 过往项目经验 面试岗位等相关信息。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if (用户拒绝回答个人基本信息的内容)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {以HR的语气（略显严厉），引导用户回答基本信息}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;elif (用户回答了与询问的问题无关的内容)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {忽略与询问问题无关的回答，只关注用户针对问题已做出回答的内容}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;elif (用户回答过程中遗漏了某个问题)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {以HR的语气（友善 积极），引导用户继续回答剩下遗漏掉的问题}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;else (用户针对面试官提出的问题 都做出了回答)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {将用户回答存入记忆中，并开启第二轮对话}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;第二轮对话：完成问题提问和用户回答内容采集
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;根据上一轮用户提供的面试信息，从专业HR 角度提出三个面试问题{{ ques_list: [问题1,问题2,问题3]}，并引导用户做出回答。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;用户可以一次一个回答相关问题，也可以一次性回答这三个问题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if (用户没有回答任何一个问题)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {以HR的语气（略显严厉），引导用户回答相关问题}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;elif (用户回答了与面试问题无关的内容)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {忽略与面试问题无关的回答，只关注用户针对问题已做出回答的内容}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;elif (用户回答过程中遗漏了某个问题)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {以HR的语气（友善 积极），引导用户继续回答其余问题}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;else (用户针对面试官提出的问题 都做出了回答)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {将用户回答存入回答列表 {{ userans_list: [问题1回答, 问题2回答, 问题3回答]}}，并开启第三轮对话}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 示例
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 示例 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 面试者背景：毕业于计算机科学专业，并在学校期间参与了两个项目。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 申请岗位：初级软件开发工程师。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 生成的问题：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 在学校项目中，你所遇到的最大的技术挑战是什么？你是如何解决的？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 在团队项目中，当团队成员之间的意见存在分歧时，你是如何处理和协调的？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 你最近学习了哪些新的技术？你是如何将其应用到实际项目中的？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 示例 2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 面试者背景：有 5 年的市场营销经验，并且领导过 3 个成功的营销活动。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 申请岗位：市场经理。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 生成的问题：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 你能分享一下你所领导的最成功的营销活动的案例以及关键策略吗？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 你是如何衡量营销活动的 ROI 的？请举一个具体的例子。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 当面临预算削减时，你会如何调整你的营销计划？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 示例 3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 面试者背景：原为教师，现准备从教师转行到人力资源岗位，虽无正式的 HR 经验，但曾组织过学校的招聘活动。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 申请岗位：HR 专员。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 生成的问题：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 你为什么决定从教师转行到人力资源？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 在组织学校招聘活动中，你的最大收获是什么？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 你是如何处理员工之间的冲突的？能否举一个你在教师工作中的具体例子？
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;第三轮对话：根据用户回答的内容,对用户回答的每个问题的进行综合评分。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; - 第一步：提取问题知识库中标准回答建议。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;使用工具&amp;#34;quary vector info&amp;#34;查询面试知识库中{{ ques_list[id] }}的标准答复，并根据该答复内容整理为标准回答思路和要点 {{ standans_list[id] }}。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; - 第二步：用户回答评分
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;先比较用户回答{{ userans_list[id] }}和知识库内容{{ standans_list[id] }}中的回答思路和要点。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;然后从以下几个方面综合评估用户的回答：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 用户回答的逻辑性、完整性和相关性
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 考察表达能力、专业知识和应变能力
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 注意候选人的非语言表现(如语气、节奏等)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. STAR原则应用
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - Situation: 是否清晰描述背景情境
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - Task: 是否明确说明任务目标
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - Action: 具体行动是否专业有效
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - Result: 结果是否可量化且有说服力
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 用户回答的思路与知识库中回答内容的差距
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 评估用户回答思路与知识库回答思路是否一致
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 对其中相同部分予以肯定，不同部分后续步骤中会对此提出改进建议
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; - 第三步：依据上一步骤中三个方面的情况，完成对用户回答的打分。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 采用5分制评分(1-5分)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 1分: 完全不符合要求
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 3分: 基本达到要求
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 5分: 表现卓越超出预期
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; - 第四步：以markdown 格式输出面试评分结果和相关建议。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 需提供具体改进建议
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 保持专业性且建设性
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 突出候选人的优势与不足
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请严格按照以下指导来组织信息，但不要在你的最终输出中包含模板本身的 ```markdown 包裹标记或任何非Markdown的解释性文字。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Markdown内容结构指导（请填充实际内容）：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 🚀 面试 **专属建议**
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;**🌟 面试问题 评分：**
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   ---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   **面试问题：** {{ ques_list[id] }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   **回答思路：** {{ 第二步中根据{{ standans_list[id] }}整理的回答思路和要点 }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   **分数：** {{ 第三步中此问题评分 }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*   ---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;**💡 优化建议：**
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[基于该面试问题，给出一个综合性的建议。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;例如：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 如果回答思路与知识库中相符，重点检查回答细节：可以建议加强问题场景的故事性，或者建议增加相关定量描述。例如：“建议增加 问题场景的细节描述，这样面试官在了解问题后，会代入自己公司的产品进行替代问答。有利于引导面试官在自己描述的场景内提问，并满足他需要的信息和能力证明”。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 如果回答思路与知识库不相符：可以建议先明确面试官是想问什么，他问这个问题是需要考量面试着的哪些素质。作为面试者如何通过1-2个案例体现出这些能力。例如：“建议按照[回答思路] 答复面试官的提问，具体答复案例可以是这样：[按照回答思路举一个案例]”。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;通用要求：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你的建议要具体、有建设性、信息充分，并体现出是对面试人员的综合考量。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;语气要积极、专业，充满洞察力。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;是不是有点意外：之前挺复杂的工作流，在Agent 这里一个节点就搞定了。&lt;/p&gt;
&lt;p&gt;效果就是开头效果展示里面的样子 。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里稍微提一句 “记忆”模块，它的作用就是在Agent&lt;strong&gt;工作前&lt;/strong&gt;输入历史对话信息，Agent&lt;strong&gt;输出后&lt;/strong&gt;追加本次对话内容（Human 和 AI对话内容）。所以，随着对话内容变多“记忆”的内容也是越来越多的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也正是因为有“记忆”这个模块，每一次对话时 Agent 才知道当前对话主题是什么，进入到什么阶段了。&lt;/p&gt;
&lt;p&gt;下图可以看到**“记忆”模块在Agent中的位置**——一开始和最后。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGosimple_memory.png&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;h3 id=&#34;3-agent-调用知识库内容完成任务的详细步骤&#34;&gt;3. Agent 调用知识库内容完成任务的详细步骤
&lt;/h3&gt;&lt;p&gt;本章节着重看观察 Agent是如何协调大模型和RAG 知识库完成面试问题回答和评价的：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_RAG_process2.svg&#34; style=&#34;zoom:78%;&#34; /&gt;
&lt;p&gt;有了这些细节，再回过头看之前的 RAG 检索示意图，是不是清楚多了？&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonaive_RAG.png&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;p&gt;其中2.1 ~ 2.3 对应 RAG的&lt;strong&gt;检索&lt;/strong&gt;，3.1 ~ 3.2 对应RAG的&lt;strong&gt;提示增强&lt;/strong&gt;， 4.1 对应&lt;strong&gt;生成回答&lt;/strong&gt; 。&lt;/p&gt;
&lt;h3 id=&#34;4-agent-llm与tools-间的关系&#34;&gt;4. Agent 、LLM与Tools 间的关系
&lt;/h3&gt;&lt;p&gt;就像提示词中写得：Agent 调用 tools 工具（&amp;ldquo;quary vector info&amp;rdquo;）只在会话进行到第三轮时，才会去RAG检索。并不是每次都会调用的。&lt;/p&gt;
&lt;p&gt;后续，如果有其他工具，例如 &amp;ldquo;背调工具&amp;quot;就也可以加进去。这样扩充能力后，Agent可以自主判断、执行的操作就越来越多。 今年除了 claudecode cursor Trace这些常见的编程工具外，Manus 应用也火爆起来，背后就是大家都希望AI 可以做得更多、更好，而&lt;strong&gt;人类只需要检查AI 的输出&lt;/strong&gt;就好的美好愿景。&lt;/p&gt;
&lt;p&gt;可以说 Agent 的魅力也在 这种“&lt;strong&gt;可以丰富扩展&lt;/strong&gt;”的想象。&lt;/p&gt;
&lt;p&gt;具体落实到产品层面的话，还有不少的难题需要处理，后续会陆陆续续展开一些。&lt;/p&gt;
&lt;h2 id=&#34;对比这两种路径&#34;&gt;对比这两种路径
&lt;/h2&gt;&lt;p&gt;同样一个需求 是使用Workflow 还是 Agent 背后关乎成本、需求、实现平台等等因素。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;角度&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Workflow&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Agent&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;不同点&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;处理方式&amp;amp;难度&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;围绕SoP，设计每一步的输入、输出内容和格式&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;使用提示词控制LLM关注方向，实现复杂场景下的内容输出&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;LLM 模型能力要求&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;一般&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;高&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;输出内容&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;可以稳定执行，但是语言上不够自然&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;更接近于自然沟通、交流&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;范围外输出&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;不会发生&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;会发生，可能存在一定泄漏数据或提示词的风险&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Token 消耗&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;低&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;高&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;相同点&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;知识内容更新&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;更新知识库就行，无需调整工作流&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;同样，只更新知识库就行，无需修改Agent 提示词&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;知识库使用方式&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;作为上下文的一部分&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;同样，也是作为上下文的一部分&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;再补充两个细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在本案例中，我一开始打算全部使用本地显卡上运行的 deepseek-r1:8b或 qwen3:8b 两个模型实现。&lt;/p&gt;
&lt;p&gt;结果发现：在RAG检索和提示增强时，用本地的8b模型还可以，但是Agent 中也使用这两个8b 模型&lt;strong&gt;都无法正确理解每轮对话的关注点&lt;/strong&gt;，导致对话无法正常执行下去。&lt;/p&gt;
&lt;p&gt;而与之对比的是 dify 中，全部使用的是本地 qewn3:8b 模型。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在token 消耗这块，Agent 也是比workflow 多的。主要多在两个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Agent 每轮对话的内容都保留在 &lt;strong&gt;一个记忆对象中&lt;/strong&gt;。随着对话内容多了，这里面的内容是越来越长的。而且容易有无关的内容也混在其中，无关内容多了后也会干扰LLM模型的注意力。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;而workflow 中有分流节点（类似 if/else）的存在，即需要在某个执行节点查看只与本节点相关的记忆即可。&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;因为Agent对模型能力要求更高了，所需的算力也更多，自然花费也大一些。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在下图中也体现了这一点：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_chatting_tokencosts.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结
&lt;/h2&gt;&lt;p&gt;Workflow 的路线像是自己做菜——洗、切、炒之外，菜板、刀、调味料这些基础条件也需要自己操行。&lt;/p&gt;
&lt;p&gt;Agent 的路线更像是 中央厨房做好了预制菜——买回来，自己只需要加点喜欢的菜、上锅热一热就齐活了！&lt;/p&gt;
&lt;p&gt;RAG 本质上是一种&lt;strong&gt;工程解决方案&lt;/strong&gt;：目的是在有限的上下文窗口内，提供预先处理过得&lt;strong&gt;高质量数据&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;从而提高LLM的注意力和回复质量，同时规避“幻觉”和频繁调用外部工具的麻烦。&lt;/p&gt;
&lt;p&gt;感谢你看到这里，听我分享这些。我们下期见。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>AI面试官 —— 打造你的专属加薪助手</title>
        <link>https://blog.cba.nxlan.cn/p/dify_ai_interview/</link>
        <pubDate>Wed, 01 Oct 2025 16:46:22 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/dify_ai_interview/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoai-image-s3ohfmel.png" alt="Featured image of post AI面试官 —— 打造你的专属加薪助手" /&gt;&lt;h2 id=&#34;ai-多轮对话引子&#34;&gt;AI 多轮对话引子
&lt;/h2&gt;&lt;p&gt;之前分享过几个AI应用案例：个人兴趣助手、塔罗牌占卜、AI新闻推送助手。&lt;/p&gt;
&lt;p&gt;粗看起来它们的形式和使用工具（插件）各有不同，但是其核心都是&lt;strong&gt;工作流&lt;/strong&gt;——在指定的步骤中完成复杂度不高的任务。&lt;/p&gt;
&lt;p&gt;这里的&lt;strong&gt;复杂度不高的原因&lt;/strong&gt;来自三个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据有固定的格式&lt;/li&gt;
&lt;li&gt;AI处理问题的逻辑是一条直线，没有“岔路”&lt;/li&gt;
&lt;li&gt;处理过程中没有外部的干扰&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;那缺点就是，只能完成特定场景下的特定问题，&lt;strong&gt;AI 含量不高&lt;/strong&gt;！可能有小伙伴会问了，AI 含量高有什么好处呢？&lt;/p&gt;
&lt;p&gt;哈哈，这也是我之前朦胧的地方。&lt;/p&gt;
&lt;p&gt;所以，今天就通过一个AI 面试官的应用，探讨在复杂度高一些的场景下，AI 多轮对话应用的实现。&lt;/p&gt;
&lt;h2 id=&#34;案例ai-面试官&#34;&gt;案例：AI 面试官
&lt;/h2&gt;&lt;p&gt;它的复杂度高在哪里？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;对话内容没有标准格式，并且面试评判标准也不统一。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;面试天然就是一个&lt;strong&gt;多轮对话&lt;/strong&gt;的过程，随着对话深入，&lt;strong&gt;对话主题会改变&lt;/strong&gt;。例如：面试官提问过程就是在从不同维度对候选人综合能力评分的过程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;真实面试中 可以划分成前后两个阶段。&lt;/p&gt;
&lt;p&gt;前期：面试JD 输入&amp;ndash;&amp;gt; 候选人匹配 &amp;ndash;&amp;gt; 候选人初筛 &amp;ndash;&amp;gt; 约定面试时间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;面试环节：&lt;/strong&gt; 候选人介绍自己 &amp;ndash;&amp;gt; 面试官根据岗位和候选人背景提出相关面试问题 &amp;ndash;&amp;gt; 候选人回答 &amp;ndash;&amp;gt; 面试官继续从不同维度对候选人提问 &amp;ndash;&amp;gt;  最终形成候选人综合评分（包括：岗位硬技能、软技能、项目经验、发展和稳定度等）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里，跳过前期沟通阶段，直接进入面试环节开始后的对话和流程。&lt;/p&gt;
&lt;p&gt;梳理后，发现完整的一次面试问答至少需要 4轮对话——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoHR_interview_process.svg&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;h3 id=&#34;如何实现&#34;&gt;如何实现？
&lt;/h3&gt;&lt;p&gt;参考梳理出的完整对话过程 。如何在&lt;strong&gt;一个工作流&lt;/strong&gt;（workflow）中逐步识别&lt;strong&gt;会话重心发生了改变&lt;/strong&gt;就成为了关键点。&lt;/p&gt;
&lt;p&gt;相比于Agent 的方式，workflow中的识别不是依赖LLM 进行语义分析和逻辑判断，而是依赖&lt;strong&gt;工作流中多个变量实现&lt;/strong&gt;——如问题变量、用户回答变量状态的变化。&lt;/p&gt;
&lt;p&gt;这里，直接上结论——&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;对话&lt;/th&gt;
          &lt;th&gt;需要判断的节点&lt;/th&gt;
          &lt;th&gt;具体实现&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;第一轮&lt;/td&gt;
          &lt;td&gt;对话内容是否和面试相关&lt;/td&gt;
          &lt;td&gt;对话内容和面试相关：就继续后续步骤。 如果内容和面试不相关就直接答复用户“内容和面试无关，无法答复。”&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第二轮&lt;/td&gt;
          &lt;td&gt;候选人信息和面试岗位信息是否充分&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;信息充分：就产生面试问题清单&lt;/strong&gt;。如果信息不充分：就不生成这个清单。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第三轮&lt;/td&gt;
          &lt;td&gt;面试过程中，候选人 可能只答复其中一条问题，也可能跳着回答&lt;/td&gt;
          &lt;td&gt;用户&lt;strong&gt;回答所有问题：就产生用户回答清单&lt;/strong&gt;。如果用户没有回答全部问题：就引导用户回答，并不生成回答清单。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第四轮&lt;/td&gt;
          &lt;td&gt;后续对话，是否基于问答内容生成新的面试问题。&lt;/td&gt;
          &lt;td&gt;问答内容会放入“记忆”中。当用户回答完所有问题后，会重新进入问题生成环节，该环节会参考之前的记忆。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;干扰测试&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;如果我在 面试过程中 胡言乱语 会发生什么？&lt;/td&gt;
          &lt;td&gt;明显的胡言乱语，会被第一轮识别过滤掉。如果是在面试过程中文不对题，则会在第三轮用户回答过程中识别。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;效果图&#34;&gt;效果图
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;完整的工作流&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodify_workflow.PNG&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对话日志&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo对话效果1.PNG&#34; style=&#34;zoom:32%;&#34; /&gt;
&lt;p&gt;用户针对提出的问题，乱序完成回答后，面试助手会基于问题和用户回答 打分并提出改进建议——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo对话效果4.PNG&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;p&gt;新一轮对话提出的问题，就参考了之前用户回答中提到项目内容——&lt;/p&gt;
&lt;p&gt;例如：这里就提问了在“AI 知识库”这个项目中，如何平衡数据质量和数据覆盖率的问题。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo继续对话.PNG&#34; style=&#34;zoom:37%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;动手实现&#34;&gt;动手实现
&lt;/h2&gt;&lt;p&gt;这里，会着重展示如何使用工作流中的多个&lt;strong&gt;变量控制会话进入到什么阶段&lt;/strong&gt;。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoworkflow_全局变量.PNG&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;h3 id=&#34;第一轮-对话&#34;&gt;第一轮 对话
&lt;/h3&gt;&lt;p&gt;需要筛选与面试相关的内容。如果不相关就回答：“与面试话题无相关。抱歉，我不能答复。”&lt;/p&gt;
&lt;p&gt;实现比较简单，直接使用dify的“问题分类器”——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if (用户问题 与面试话题有关):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	就进入下一轮话题——生成符合应聘者背景和岗位需求的面试问题
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;else :
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	与面试话题无关的内容，直接回答“不能答复”
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoround1.PNG&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;h3 id=&#34;第二轮-对话&#34;&gt;第二轮 对话
&lt;/h3&gt;&lt;p&gt;需要引导用户输入面试所需的人员信息和岗位信息。如果用户一次说不完 就提醒用户补充这些背景信息。&lt;/p&gt;
&lt;p&gt;这里的判断逻辑为——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if (全局变量&amp;#34;question&amp;#34; 为空):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	if (模拟面试中所需的面试背景信息充足):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		生成面试问题清单
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		存储至变量 question中
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		同时，答复用户面试问题
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	else:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		引导用户补充更多的面试背景信息
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;else:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	已经生成面试问题了，可以进入后续步骤——面试问题回答环节	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoround2.PNG&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;h3 id=&#34;第三轮-对话&#34;&gt;第三轮 对话
&lt;/h3&gt;&lt;p&gt;需要检查用户输入的回答对应哪个问题，然后提示用户继续回答全部问题。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoround3.PNG&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;p&gt;提示词——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 角色
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你是一位专业且高效的用户回答与问题匹配智能助手，负责将用户的回答精准匹配到之前给定的问题，并以指定数组形式输出。同时，能从专业HR的视角引导用户完成所有问题回答。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 背景
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;当前对话历史：{{ chat_history }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;用户最新答复：{{#sys.query#}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;问题清单：{{#context#}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 技能
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 1: 匹配并输出用户回答
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 仔细查看提供的问题数组，明确问题数量与顺序。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 认真阅读用户给出的回答，准确判断该回答对应的问题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 依据用户回答和对话历史，创建一个新数组。在新数组中，按照用户当前及历史回答填充对应问题位置的回答内容，未回答问题的位置用null填充。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4. 最后，将这个新数组以{&amp;#34;userans&amp;#34;: [新数组]}的格式输出。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 2: 检查并提示用户回答所有问题
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 根据技能1整理好的用户回答数组 “userans”，判断用户未回答的问题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 以专业HR的口吻，礼貌且清晰地提醒用户遗漏的问题，并引导用户回答问题清单上的所有问题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 输出示例
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;在用户初次使用或不明确任务时，按以下示例格式展示匹配输出：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 示例 1：若问题数组是：[&amp;#34;问题 1&amp;#34;, &amp;#34;问题 2&amp;#34;, &amp;#34;问题 3&amp;#34;]，用户的回答是：&amp;#34;这是问题 2 的回答&amp;#34;，那么输出应该是：{&amp;#34;userans&amp;#34;: [&amp;#34;null&amp;#34;,&amp;#34;这是问题 2 的回答&amp;#34;,&amp;#34;null&amp;#34;]}， &amp;#34;more_userans&amp;#34;: “请继续回答 问题1 和 问题3”。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 示例 2：若问题数组是：[&amp;#34;问题 A&amp;#34;, &amp;#34;问题 B&amp;#34;, &amp;#34;问题 C&amp;#34;, &amp;#34;问题 D&amp;#34;]，用户的回答是：&amp;#34;这是问题 C 的回答&amp;#34;，那么输出应该是：{&amp;#34;userans&amp;#34;: [&amp;#34;null&amp;#34;, &amp;#34;null&amp;#34;, &amp;#34;这是问题 C 的回答&amp;#34;, &amp;#34;null&amp;#34;]}， &amp;#34;more_userans&amp;#34;: “请继续回答 问题A、 问题B 和 问题D”。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 示例 3：若问题数组是：[&amp;#34;问题 1&amp;#34;, &amp;#34;问题 2&amp;#34;]，用户的回答是：&amp;#34;这是问题 1 的回答。这是问题 2 的回答&amp;#34;，那么输出应该是：{&amp;#34;userans&amp;#34;: [&amp;#34;这是问题 1 的回答&amp;#34;, &amp;#34;这是问题 2 的回答&amp;#34;]}， &amp;#34;more_userans&amp;#34;: &amp;#34;&amp;#34;。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 限制:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 所有输入和输出均不包含 XML 标签。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 生成用户回答数组时，内容必须源自用户输入信息，不得编造用户未提及的内容。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 输出内容必须在structured_output对象中以json格式呈现，严格遵循此框架要求。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 通用要求：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 确保用户回答和提问清单准确源自对话过程。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 语气积极、专业，展现出洞察力。 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当用户回答完所有提问问题后，会存入全局变量“userans” 数组中。&lt;/p&gt;
&lt;p&gt;这样就完成了&lt;strong&gt;一问一答两个数组(变量)的映射&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;question = [ &amp;#34;问题1&amp;#34;, &amp;#34;问题2&amp;#34;, &amp;#34;问题3&amp;#34; ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;userans = [ &amp;#34;这是问题 1 的回答&amp;#34;, &amp;#34;这是问题 2 的回答&amp;#34;, &amp;#34;这是问题 3 的回答&amp;#34; ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;有了两个数组（变量），后续就可以在循环中，提取每个问题和回答。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoround3_2.PNG&#34; style=&#34;zoom:55%;&#34; /&gt;
&lt;p&gt;简化下判断逻辑，大概长这样——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ques&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enumerate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;question&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;stand_ans&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;search&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ques&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;HR 问答知识库&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;user_ans&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;userans&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;user_score&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LLM&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;judge&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user_ans&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reference&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stadn_ans&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;Answer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user_score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;所以，可以直接&lt;strong&gt;使用 question 数组中的问题&lt;/strong&gt;作为控制循环次数和查询知识库的关键字。&lt;/p&gt;
&lt;h3 id=&#34;第四轮-对话&#34;&gt;第四轮 对话
&lt;/h3&gt;&lt;p&gt;这里有个小问题，&lt;strong&gt;如何判断用户是在继续回答问题，还是在发起新一轮问题？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先，在第三轮对一问一答两个数组（变量）处理过程中，处理一个问题， question 中就减少一个。全部处理完，question 数组就为空。换个说法就是：如果question 为空，就表示当前是问题产生，而不是问题回答阶段 。&lt;/p&gt;
&lt;p&gt;其次，这里用户每次回答的内容&lt;strong&gt;userans并没有被清空&lt;/strong&gt;，而是随着对话变多 而逐步丰富。&lt;/p&gt;
&lt;p&gt;所以，只要在第二轮的大模型应用LLM2 中，要求生成问题时，同时参考用户当前输入信息（sys.query）和&lt;strong&gt;历史回答信息&lt;/strong&gt;（userans）就可以产出一轮更深入的问答。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoLLM2_prompt.PNG&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;h3 id=&#34;干扰-对话模拟&#34;&gt;干扰 对话模拟
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;对话过程中，突然暴躁——说出一句“滚”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;问题分类器会做出回应，答复用户 “与面试话题不相关。抱歉， 不能答复。”&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGochat_tracinglog_有干扰.PNG&#34; style=&#34;zoom: 35%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用户回答 开始答非所问。&lt;/p&gt;
&lt;p&gt;LLM4——就是第三轮中的问题识别与关联助手，会识别并关联 用户回答。以及还有哪个问题是没答复的？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGochat_tracinglog3.PNG&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;p&gt;下面稍微展开下 使用“&lt;strong&gt;RAG&lt;/strong&gt;” 技术实现&lt;strong&gt;面试问答知识库&lt;/strong&gt;的话题：&lt;/p&gt;
&lt;h2 id=&#34;为什么需要知识库&#34;&gt;为什么需要知识库
&lt;/h2&gt;&lt;p&gt;使用知识库的原因很简单：LLM 模型在泛化 通用能力上已经可以很好的处理分析问题。例如，写个年终总结报告、生成一段贪吃蛇代码。&lt;/p&gt;
&lt;p&gt;但是，如果具体到垂直领域的问题，表现就比较差了。因为它没有这部分领域的准确数据！没有怎么办？大模型就容易出现 “一本正经胡说八道”的情况。此时，问题不在模型不理解、判断不了，而是由于该领域数据不足，无法准确回答。&lt;/p&gt;
&lt;p&gt;“知识库”实现了内部&lt;strong&gt;私有数据&lt;/strong&gt;的检索和展示。包含了，数据入库、数据检索和增强LLM上下文 三部分。&lt;/p&gt;
&lt;p&gt;先看数据入库阶段——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGorag.drawio.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;然后是检索和返回LLM处理过程——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGonaive_RAG.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;blockquote&gt;
&lt;p&gt;检索模式不止这一种。更多的方式，可以参考：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d193d8fec6&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Advanced RAG Techniques: an Illustrated Overview | by IVAN ILIN | Towards AI&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;在-dify-中实现面试知识库&#34;&gt;在 dify 中实现面试知识库
&lt;/h2&gt;&lt;p&gt;大致分为 数据清洗 &amp;ndash;&amp;gt; 数据切片 &amp;ndash;&amp;gt; 数据向量化&amp;amp;入库  &amp;ndash;&amp;gt;  召回验证几个阶段。&lt;/p&gt;
&lt;h3 id=&#34;1-拿出准备好的数据集&#34;&gt;1. 拿出准备好的数据集
&lt;/h3&gt;&lt;p&gt;​    &amp;lt;面试100 问&amp;gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251011134737362.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;h3 id=&#34;2-数据集-内容预处理清洗&#34;&gt;2. 数据集 内容预处理（清洗）
&lt;/h3&gt;&lt;p&gt;经过测试发现，dify 对pdf 文档的处理时无法识别分段标识符（我这里用的 “BBBBBB” 作为分段标识符）。&lt;/p&gt;
&lt;p&gt;所以需要先把pdf 转为 word 。然后，使用正则添加分隔符——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo数据预处理2.png&#34; style=&#34;zoom:87%;&#34; /&gt;
&lt;p&gt;同样可以在关键位置添加换行符——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo数据预处理1.png&#34; style=&#34;zoom:85%;&#34; /&gt;
&lt;h3 id=&#34;3-上传文档数据分段并使用embedding-工具完成向量化&#34;&gt;3. 上传文档。数据分段，并使用embedding 工具完成向量化
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251011140659297.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;这里100个问题被划分成了106个数据块（因为有两个问答对中 重复使用了1. 2. 3. 数字开头，被分段标识符 “BBBBBB” 多划分出了几个段落）&lt;/p&gt;
&lt;h3 id=&#34;4-指定-索引和混合检索方式&#34;&gt;4. 指定 索引和混合检索方式
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251011141617776.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;h3 id=&#34;5-召回验证&#34;&gt;5. 召回验证
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251011144832232.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;p&gt;​    AI 面试官案例中，主要是希望让大模型参考专业HR的标准回答思路，而不是具体内容。&lt;/p&gt;
&lt;p&gt;​    所以 重点参考&lt;strong&gt;回答思路&lt;/strong&gt;中内容。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251011142635026.png&#34; style=&#34;zoom:45%;&#34; /&gt;
&lt;h3 id=&#34;最后rag在哪些场景中效果不好&#34;&gt;最后，RAG在哪些场景中效果不好
&lt;/h3&gt;&lt;p&gt;RAG 技术中很关键的步骤就是 根据输入的内容 快速检索出 与之接近的（向量）数据块。&lt;/p&gt;
&lt;p&gt;为了更好的检索效果，引入了&lt;strong&gt;混合检索&lt;/strong&gt;和重排技术。在检索时，同时根据问题向量(vector index)和语义（summary index）召回数据片段。这里权重比为 7:3。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251010172559462.png&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;p&gt;例如使用之前的面试问题提问，查看召回内容：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20251011102917434.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;p&gt;但是，如果有以下三种情况还是容易出现数据检索不出来的情况：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;相同的关键字 散落在文档里很多地方。&lt;/p&gt;
&lt;p&gt;例如，小说中的 主人公“许仙”。提问：“许仙和白素贞在断桥有几次相遇？”  RAG即使检索出来，也无法保证召回的片段覆盖了所有相遇的剧情。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;检索语义不是通用的，而是带有垂直领域的内容。&lt;/p&gt;
&lt;p&gt;例如，”那个在&amp;lt;还珠格格&amp;gt;中饰演尔康的演员还演过其他的什么影视剧？”&lt;/p&gt;
&lt;p&gt;这种知识就很难检索出来——“饰演尔康的演员”本身又是另一个检索的结果。知识库得先检索出这个演员的真实名字 ，还要存有每部电视剧的 演员-角色 关系表，然后才可以通过演员信息 检索出所有出演的影视剧。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;还有一种场景，也比较常见：知识库本身质量不高。&lt;/p&gt;
&lt;p&gt;例如：文档格式不统一，文档覆盖面不足，导致检索的时候 得到的内容离问题相关度很远。&lt;/p&gt;
&lt;p&gt;此时，属于RAG 技术也帮不了的情况。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;前两种是 RAG 机制的导致的，无法避免。最后，这个属于领域知识数据 没达到可用的程度。&lt;/p&gt;
&lt;h2 id=&#34;除了rag-还经常听说模型微调&#34;&gt;除了RAG 还经常听说模型微调？
&lt;/h2&gt;&lt;p&gt;下面是它们两者间的相同和不同的地方——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoRAG_vs_fine-tuning.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;相同点&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;不同点&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;补充模型在某个领域特定知识，解决幻觉问题&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;实现路径不一样&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;类比：开卷考试——考试时现查&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;根据问题去知识库检索相似内容或案例&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;strong&gt;微调&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;类比：考前复习——把之前考试真题全部做一遍&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;通过多轮训练，强化模型在该领域的能力（不仅仅是数据上的，还有推理和逻辑上的针对性强化）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;彩蛋&#34;&gt;彩蛋
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;同样的案例，后续会使用n8n 的Agent模式再实现一遍。&lt;/p&gt;
&lt;p&gt;到时会豁然开朗：在多轮对话场景中，workflow 和 Agent 有什么差异；以及深入到RAG 调用环节的细节。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从产品角度看，AI 应用效果的量化很重要。即 AI 应用内部每个节点状态的&lt;strong&gt;可观测性&lt;/strong&gt;是非常必要的。&lt;/p&gt;
&lt;p&gt;以下是通过可观测工具 &lt;em&gt;&lt;strong&gt;Langfuse&lt;/strong&gt;&lt;/em&gt; 快速筛选出 “&lt;u&gt;过去三天中 所有执行失败&lt;/u&gt;”的那些对话——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGochat_tracinglog4.PNG&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;p&gt;是不是非常方便？有了这些对话，为下一步AI 产品迭代升级 提供了基础的&lt;strong&gt;数据&lt;/strong&gt;支撑。&lt;/p&gt;
&lt;p&gt;举个例子：用户反应某次对话执行时报错了。那到底是提示词问题，还是大模型响应超时，还是发生了预期外的问题，是不是得有个统计数据在这里呢？&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>N8N 案例解析:从草履虫到猛犸象</title>
        <link>https://blog.cba.nxlan.cn/p/n8n_news/</link>
        <pubDate>Sun, 14 Sep 2025 09:25:19 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/n8n_news/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGotitle_image.png" alt="Featured image of post N8N 案例解析:从草履虫到猛犸象" /&gt;&lt;h2 id=&#34;写在前面&#34;&gt;写在前面
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;「案例来源」&lt;/strong&gt; B 站 &amp;lt;秋芝 2046&amp;gt;    &lt;a class=&#34;link&#34; href=&#34;https://www.bilibili.com/video/BV1KSKwzJEEV&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;从0开始“做”一个Agent！&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;完整的步骤&amp;amp;内容大家可以看原作者的视频和文档，这里就不再复述一遍了。&lt;/p&gt;
&lt;p&gt;本文主要是想分享三块内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;修复作者提供的AI新闻采集工作流的bug——没有“创建时间”字段的值。如果缺少这个值，就无法实现按照&lt;strong&gt;日期筛选&lt;/strong&gt;最近两天AI 新闻的任务。&lt;/li&gt;
&lt;li&gt;说起来这个案例逻辑也不复杂，但是工作流与飞书应用的API接口对接起来特别繁琐（不同应用接口的数据格式都不一样，需要人工一项一项对接上 才行）&lt;/li&gt;
&lt;li&gt;在读取、整理新闻列表并发消息给飞书机器人这个工作流中， Agent 的提示词比较有意思，为后续进一步深入学习提供了不错的案例。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过本文你可以获得以下收益：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;熟悉n8n 平台操作&lt;/p&gt;
&lt;p&gt;如：变量计算和引用这块——n8n 这部分做得非常好了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对接飞书应用API接口时，需要注意的地方&lt;/p&gt;
&lt;p&gt;如：涉及多维表格 增删查；日历会议列表筛选；feishu 机器人webhook对接；还有应用权限开放。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;浅聊 Agent 提示词框架和思维链（CoT）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;效果展示&#34;&gt;效果展示
&lt;/h2&gt;&lt;p&gt;每天早上8点，飞书机器人会收到推送的 AI 新闻摘要和最近的会议安排，并提醒用户优先阅读其中重要的文章。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAI_News3.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;这个案例分为两部分（阶段）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;AI 新闻整理存档工作流：通过RSS 订阅，定时搜集AI 新闻频道（如这里的 新智元 腾讯科技 量子位）中的新闻，然后把新闻的标题 摘要 链接等数据按照统一的格式存入飞书多维表格中。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8news_workflow1.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;这个工作流，经过我的完善，已增强为&lt;strong&gt;写入新闻数据的同时，删除7天前旧的新闻&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;分享链接放在公众号【&lt;strong&gt;AI 热气球&lt;/strong&gt;】中，感兴趣的小伙伴可以回复 &lt;strong&gt;917&lt;/strong&gt; 获取。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新闻推送工作流：每天早上8点， 另一个工作流（下图）会读取多维表格中今天和昨天的AI新闻和我最近7天的日程信息，生成当天AI新闻摘要与日程提醒。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250914094853600.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;要点1&#34;&gt;要点1
&lt;/h2&gt;&lt;h3 id=&#34;1-n8n平台上工作流中的变量赋值和引用非常友好达到所见即所得的效果&#34;&gt;1. n8n平台上，工作流中的变量赋值和引用非常友好，达到所见即所得的效果。
&lt;/h3&gt;&lt;p&gt;以“AI新闻整理存档工作流”为例——&lt;/p&gt;
&lt;p&gt;“INPUT” 为上个步骤的输出内容：整理好的新闻标题、日期、内容、媒体、链接信息。&lt;/p&gt;
&lt;p&gt;在“Edit Fields”这个工具的帮助下，可以直接&lt;strong&gt;通过拖拽的方&lt;/strong&gt;式完成新变量的赋值。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250926090653872.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;这样一来&lt;strong&gt;大大简化很多过程数据的处理步骤&lt;/strong&gt;。如果对比coze dify平台中的处理方式，肯定会认可n8n 的这种处理方式：&lt;/p&gt;
&lt;p&gt;在coze 和dify 中都需要使用&lt;strong&gt;代码&lt;/strong&gt;工具，在代码中重新定义一个新的函数，然后把上一步生成的新闻对象 &lt;u&gt;Array[object]&lt;/u&gt; 在for循环中一个一个提取出来，并在每个循环处理中 追加新的变量名和变量值，最后生产一个新的 &lt;u&gt;Array[object]&lt;/u&gt; 类型数据 。&lt;/p&gt;
&lt;h3 id=&#34;2-简单数据的处理在过程中就可以快速完成&#34;&gt;2. 简单数据的处理在过程中就可以快速完成
&lt;/h3&gt;&lt;p&gt;这里举两个例子，一个还是在“Edit Fields”这个工具中。&lt;/p&gt;
&lt;p&gt;注意下图中 我新增了两个字段（变量）——“&lt;strong&gt;创建时间&lt;/strong&gt;”和“&lt;strong&gt;7天前的时间&lt;/strong&gt;”。前者用于写入飞书多维表格中的“创建时间”字段，方便后续筛选。后者则用于删除多维表格中7天前数据的筛选条件。&lt;/p&gt;
&lt;p&gt;这里时间的计算，直接调用了javascript 的&lt;strong&gt;Data 函数&lt;/strong&gt;一步完成。并且n8n 会把每个变量的值直接显示在对应变量的下方——&lt;strong&gt;那行紫色的文字&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250926091633303.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;另一个例子：在写入新闻链接数据到多维表格时，可以&lt;strong&gt;直接调用正则表达式&lt;/strong&gt;——对“新闻链接”数据中可能存在的换行符(\n) 完成替换。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250926095124827.png&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;h3 id=&#34;3-如果遇到复杂的数据处理怎么办呢&#34;&gt;3. 如果遇到复杂的数据处理，怎么办呢？
&lt;/h3&gt;&lt;p&gt;当然n8n 也有code 功能模块，默认启用的就是javascript。这一点不像 dify 那样需要一个额外的code容器来完成python或javascript 代码的执行。&lt;/p&gt;
&lt;p&gt;这里的例子是：上一步已经从飞书多维表格中筛选了7天前的新闻，但是在删除多维表格数据时，用到的是“record_id”字段。所以，这里&lt;strong&gt;使用code 工具&lt;/strong&gt;只把多维表格中数据所在行的“record_id” 提取出来，交给下一步。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n_codingtool.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h2 id=&#34;要点2&#34;&gt;要点2
&lt;/h2&gt;&lt;p&gt;在之前“coze塔罗牌工作流华丽转身”的文章中，提到了多维表格API 接口的使用。在那个案例中，主要是用到多维表格的“读取”和“写入”两个功能。&lt;/p&gt;
&lt;p&gt;在本案例中，&lt;strong&gt;进一步升级&lt;/strong&gt;—— 有多维表格的查询、写入、删除，还有飞书日历的查询。&lt;/p&gt;
&lt;p&gt;所有飞书工具的调用，离不开n8n社区中一个非常好用的工具——&lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/n8n-nodes-feishu-lite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Feishu Node&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;首先它是社区插件不是飞书官方提供的，其次它比coze 提供的接口的还好用！&lt;/p&gt;
&lt;p&gt;这&lt;strong&gt;一个插件汇总了飞书平台支持的107种操作&lt;/strong&gt;，下图只展示了其中“多维表格”的一部分操作——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n-nodes-feishu-lite.PNG&#34; style=&#34;zoom:80%;&#34; /&gt;
&lt;p&gt;这些操作都是通过飞书 官方API 的接口调用实现的，所以肯定要满足飞书平台API接口的格式要求和限制。&lt;/p&gt;
&lt;p&gt;以多维表格中&lt;strong&gt;日期字段&lt;/strong&gt;的填写要求为例——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250926103925069.png&#34; style=&#34;zoom:57%;&#34; /&gt;
&lt;p&gt;所以，这也是文章开头提到“每个接口都需要人工一个一个对接”的原因。&lt;/p&gt;
&lt;p&gt;具体怎么对接，大家还是自己跑一遍试试就知道了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本案例的工作流我已经放在公众号【&lt;strong&gt;AI 热气球&lt;/strong&gt;】中，感兴趣的小伙伴可以回复 &lt;strong&gt;917&lt;/strong&gt; 获取。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这里，我提醒两个&lt;strong&gt;踩过坑的地方&lt;/strong&gt;：&lt;/p&gt;
&lt;h3 id=&#34;1-飞书开放平台中-相关应用的权限开放&#34;&gt;1: 飞书开放平台中 相关应用的权限开放
&lt;/h3&gt;&lt;p&gt;这里的相关权限类型是“&lt;strong&gt;应用身份&lt;/strong&gt;”，不是“用户身份”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofeishu-platform_permitAPP.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;如果权限不匹配，会导致相关API 操作失败，但其实不是n8n 工作流中配置的问题——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8n-calendar_failedmess.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;2-用到的表格需要开通-应用的可编辑权限&#34;&gt;2: 用到的表格需要开通 应用的“可编辑”权限
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofeishu-tables_Permissions.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h2 id=&#34;要点3&#34;&gt;要点3
&lt;/h2&gt;&lt;p&gt;个人以为：这个案例中，&lt;strong&gt;最有含金量&lt;/strong&gt;的是在第二个工作流中调用Agent 思维链(CoT)的方法——体现了人类抽象思维的具象表达。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;你是我的专属&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI助理&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;“新闻报通”！你的使命是帮我洞察最新的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI动态&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，并结合我的工作日程，智能推荐感兴趣的内容和安排行程。在没有行业大事发生时，你也会关心我的生活，推荐放松娱乐活动。&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;最终你需要将所有分析和建议，整合为一个适合在飞书卡片中展示的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown格式文本块&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。保持乐观、敏锐、有创造力！&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;我有两个核心工具供你调遣：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;news&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：用它来抓取过去&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;天内飞书多维表格里最新、最有料的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI新闻&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。此工具会返回一个新闻列表，列表中的每条新闻都包含：新闻标题、发布日期、发布媒体、核心内容&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;摘要、以及原文链接。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;daily&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：用它来查看我未来&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;天的飞书日程安排。此工具会返回日程事件的日期、时间、事件标题。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;你的行动指令：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;第一步：信息收集&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;立即使用【最新新闻查询】工具，获取最新的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI新闻列表&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;（每条新闻包含标题、日期、发布媒体、摘要、链接）。由于消息长度限制，精选其中&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;条新闻。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;同时，使用【日历查询】工具，获取我未来&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;天的详细日程安排。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;第二步：智能分析与建议（输出为纯&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown格式&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;你的核心任务是生成一段单一、完整的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown文本&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。此文本本身就是最终要在飞书卡片中呈现的内容。请严格按照以下指导来组织信息，但不要在你的最终输出中包含模板本身的&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;```&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;markdown&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;包裹标记或任何非&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown的解释性文字&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Markdown内容结构指导&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;（请填充实际内容）：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;### 🚀 AI圈今日速递与【**专属建议**】&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;🌟&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;今日&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI新闻看板&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#if (tool_output.latest_news an_array_with_items)}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#each tool_output.latest_news as |news_item|}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;标题：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;发布日期：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;发布媒体：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;source_or_media&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;核心摘要：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;原文链接：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;点击查看详情&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]({{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;link&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;each&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;今天&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI领域风平浪静&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，暂未捕获到新的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI大新闻&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。是时候出门活动活动了！&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;📅&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;我的近期日程概览：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;此处列出未来几天的相关日程条目，或清晰指明哪些天&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;时段有空档，例如：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;X月X日&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;周&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：上午&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;视频脚本&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;；下午&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;暂无安排&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;X月X日&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;周&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：全天&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;参与行业会议&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;💡&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;综合建议与排期参考：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;基于今天获取到的所有新闻（如果有的话）以及我的日程空闲情况，给出一个综合性的建议。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;例如：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;如果有多条高质量新闻且日程有空：可以建议优先看哪条新闻，或者建议如何将不同新闻分配到不同的空闲时段。例如：“老板，今天新闻不少！&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;《&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;某新闻标题&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;》的讨论热度和价值最高，&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;建议安排在&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X月X日空闲时段&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;详细看看。”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;如果新闻一般但日程有空：可以建议“今天的几条新闻中，《&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;某新闻标题&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;》可以略作关注，但若无特别感兴趣，&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X月X日空闲时段&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;或许更适合外出放松放松。”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;如果无新闻但日程有空：“老板，今日无&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI大新闻&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，正好给大脑放个假！我看您&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X月X日&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;有空，不如去&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;附近的公园散散步&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;看场最新上映的电影&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;找个咖啡馆发发呆&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;？劳逸结合！”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;如果日程已满，无论有无新闻：“老板，接下来几天日程紧凑，建议将今天的新闻信息先存档，待有空档再阅读。目前先专注已安排的工作。”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;处理逻辑：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;关于新闻展示：&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;如果【最新新闻查询】工具返回了多条新闻，你需要将所有新闻条目都按照上述&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown结构中的新闻格式一一列出&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;如果没有新闻，则在“今日&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI新闻看板&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;”下明确告知。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;关于综合建议：&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;这是最重要的部分。你需要结合今天获取的所有新闻的整体情况（数量、质量、潜力）和我的日程空闲度，给出一个最终的、具有指导性的综合建议。你的建议逻辑应遵循：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;【有新闻】：优先分析新闻的价值和趣味性，结合日程推荐最有意思的新闻内容详情。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;【无新闻】：则检查日程空闲时间，主动推荐外出、娱乐等放松身心的活动。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;【日程满】：无论有无新闻，都以提醒专注现有工作为最优先。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;第三步：输出纯净的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown文本块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;你的最终输出必须且仅仅是按照第二步指导填充内容后形成的完整&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown文本内容本身&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;再次强调：输出的开头不应有&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;```&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;markdown&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;，结尾也不应有&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;```&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;或任何其他非&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown的字符&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、注释或解释。直接从&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Markdown的第一个字符&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;（例如&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;###）开始，到最后一个字符结束。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;通用要求：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;确保所有列出的信息（新闻的各项数据、日程条目）都准确来源于工具的输出，列出所有的新闻。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;你的建议要具体、有建设性、信息充分，并体现出是对所有信息的综合考量。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;语气要积极、专业，充满洞察力&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里面信息量有点大，如果第一次接触这么大篇幅的提示词 肯定会觉得有点乱，不知道注意力放在哪里。&lt;/p&gt;
&lt;p&gt;没关系，先交给 gemini，帮我们&lt;strong&gt;划分下结构和关系&lt;/strong&gt;——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这个提示词的逻辑和段落结构非常清晰和严谨，旨在引导AI生成一个结构化、个性化的“飞书卡片”式报告。
整体逻辑概览：&lt;/p&gt;
&lt;p&gt;角色设定与使命（Persona &amp;amp; Mission）： 首先明确AI的身份、名称、核心职责和输出风格。
工具箱（Toolbox）： 列出AI可用的具体工具及其功能和返回数据格式。&lt;/p&gt;
&lt;p&gt;行动指令（Action Instructions）： 详细分解AI需要执行的步骤，从信息收集到最终输出。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;信息收集： 明确调用哪些工具，获取什么数据，以及数据处理的初步要求（如精选新闻数量）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;智能分析与建议（核心）： 这是生成最终内容的指导部分，详细规定了输出的格式、内容结构和决策逻辑。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;输出要求： 强调最终输出的纯净性和格式的严格性。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通用要求： 对整个过程和最终输出的质量提出普遍性要求。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这下看起来是不是轻松多了?&lt;/p&gt;
&lt;p&gt;开头类似于告诉AI 我这有哪些工具和此次任务背景是什么。&lt;/p&gt;
&lt;p&gt;结尾则是限制AI ：不要自己造新闻（针对幻觉问题），语气拟人化，输出内容要概括、有条理。&lt;/p&gt;
&lt;p&gt;整个提示词关键点是“行动指令”的第二部分——“这是生成最终内容的指导部分，详细规定了输出的格式、内容结构和决策逻辑。” 稍微展开说说——&lt;/p&gt;
&lt;h3 id=&#34;1-提示词中可以使用-ifelse-这种条件语句也可以使用each-这种循环语句&#34;&gt;1. 提示词中，可以使用 if/else 这种条件语句，也可以使用each 这种循环语句
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#if (tool_output.latest_news an_array_with_items)}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#each tool_output.latest_news as |news_item|}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;标题：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;发布日期：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;发布媒体：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;source_or_media&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;核心摘要：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;原文链接：&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;点击查看详情&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]({{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;link&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;each&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;err&#34;&gt;今天&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI领域风平浪静&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;，暂未捕获到新的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AI大新闻&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。是时候出门活动活动了！&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;翻译成&lt;strong&gt;伪代码&lt;/strong&gt;就是——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 假设 tool_output 是一个包含工具返回结果的字典或对象&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 假设 tool_output.latest_news 是一个列表，可能包含新闻项，也可能为空&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tool_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;latest_news&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NOT&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 如果 latest_news 是一个非空列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;news_item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tool_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;latest_news&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 对于列表中的每一条新闻&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   ---&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Markdown 分隔符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   **标题：** {news_item[&amp;#39;title&amp;#39;]}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   **发布日期：** {news_item[&amp;#39;date&amp;#39;]}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   **发布媒体：** {news_item[&amp;#39;source_or_media&amp;#39;]}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   **核心摘要：** {news_item[&amp;#39;summary&amp;#39;]}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   **原文链接：** [点击查看详情]({news_item[&amp;#39;link&amp;#39;]})&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 如果 latest_news 不存在、为空或不是一个有效的列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   今天AI领域风平浪静，暂未捕获到新的AI大新闻。是时候出门活动活动了！&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*   ---&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# Markdown 分隔符，无论是否有新闻都会打印&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;LLM 就是有这种能力，读懂思维逻辑，并按照这个逻辑执行任务。&lt;/p&gt;
&lt;h3 id=&#34;2-综合建议部分要求按照四种情况做出不同的回应&#34;&gt;2. “综合建议”部分，要求按照四种情况做出不同的回应
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[基于今天获取到的所有新闻（如果有的话）以及我的日程空闲情况，给出一个综合性的建议。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;例如：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 如果有多条高质量新闻且日程有空：可以建议优先看哪条新闻，或者建议如何将不同新闻分配到不同的空闲时段。例如：“老板，今天新闻不少！**《[某新闻标题]》的讨论热度和价值最高，** 建议安排在[X月X日空闲时段]详细看看。”
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 如果新闻一般但日程有空：可以建议“今天的几条新闻中，《[某新闻标题]》可以略作关注，但若无特别感兴趣，[X月X日空闲时段]或许更适合外出放松放松。”
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 如果无新闻但日程有空：“老板，今日无AI大新闻，正好给大脑放个假！我看您[X月X日]有空，不如去[附近的公园散散步/看场最新上映的电影/找个咖啡馆发发呆]？劳逸结合！”
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 如果日程已满，无论有无新闻：“老板，接下来几天日程紧凑，建议将今天的新闻信息先存档，待有空档再阅读。目前先专注已安排的工作。”
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里分别针对&lt;strong&gt;四种不同场景&lt;/strong&gt; 【&lt;strong&gt;有多条高质量新闻且日程有空&lt;/strong&gt;】【&lt;strong&gt;新闻一般但日程有空&lt;/strong&gt;】【&lt;strong&gt;无新闻但日程有空&lt;/strong&gt;】和 【&lt;strong&gt;日程已满，无论有无新闻&lt;/strong&gt;】产出不同建议，并给出示例。&lt;/p&gt;
&lt;p&gt;在Agent中给到大模型的数据 一定会是多样和复杂的，所以 在提示词中也需要明确，面对不同的“场景” 应该如何做出回应。&lt;/p&gt;
&lt;p&gt;本案例中，回应内容还可能比较简单——主要目的是&lt;strong&gt;提高AI 新闻密度和情绪价值&lt;/strong&gt;。那如果是复杂场景下的响应呢？&lt;/p&gt;
&lt;p&gt;我猜就需要把上述两点结合起来——不同场景 + 条件/循环 等逻辑表达。&lt;/p&gt;
&lt;h2 id=&#34;ai-应用分类&#34;&gt;AI 应用分类
&lt;/h2&gt;&lt;p&gt;之前整理过AI 应用的发展阶段：从早期的信息检索汇总、到工作流、到某个垂直领域智能体、到某个行业的智能体。因为这其中跨度有点大，而且缺少一些实施过程的难点和细节。&lt;/p&gt;
&lt;p&gt;所以，最近也在考虑 如何从工程实现的角度给 AI应用分个阶段：&lt;/p&gt;
&lt;p&gt;一来可以分类市面上的AI产品，二来明确不同类型AI 产品的技术路线，三来 展望下未来可能会迭代出哪些新的版本。&lt;/p&gt;
&lt;p&gt;先看下AI 发展阶段和难点图( &lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/r-lM8BF0kP7iq5z5Tdznyg&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;原文——“用Coze + Claude 实现Manus，Agent的难点到底在哪？”)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAI_phase_list.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;再结合，手上接触到的案例和技术实现，整理成一张表——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAI_app_list.png&#34; style=&#34;zoom:95%;&#34; /&gt;
&lt;p&gt;**整理完发现：**处理抽象任务的能力，是当前AI 应用的魔力所在。&lt;/p&gt;
&lt;p&gt;难怪大家一直希望 AI 可以更像人类的大脑，会检索，会思考，会推理，会总结归纳，会自我纠正。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PS：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;本文案例， 也是在文章 &lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/uj_S-oO0rl8AR233VJ0CLA&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;棚友认识一下，我叫n8n&lt;/a&gt; 中的n8n测试环境实现的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;n8n官方也提供了现成的workflow，感兴趣的话可以参考下更多案例： &lt;a class=&#34;link&#34; href=&#34;https://n8ncn.io/workflows&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://n8ncn.io/workflows&lt;/a&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e6%89%ab%e7%a0%81_%e6%90%9c%e7%b4%a2%e8%81%94%e5%90%88%e4%bc%a0%e6%92%ad%e6%a0%b7%e5%bc%8f-%e7%99%bd%e8%89%b2%e7%89%88.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>n8n 自部署</title>
        <link>https://blog.cba.nxlan.cn/p/n8n_docker/</link>
        <pubDate>Fri, 05 Sep 2025 15:54:10 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/n8n_docker/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoworkflow_info.png" alt="Featured image of post n8n 自部署" /&gt;&lt;h2 id=&#34;n8n-自部署环境搭建docker&#34;&gt;n8n 自部署环境搭建(docker)
&lt;/h2&gt;&lt;p&gt;关注AI 相关内容的朋友，一定对Dify和n8n不陌生。它们都是优秀的开源 “AI 应用构建平台”。&lt;/p&gt;
&lt;p&gt;之前在 &lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/YmBaXIa3N0C8DDQZ9vfRaQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;自部署Dify&lt;/a&gt; 那篇文章里，介绍了使用docker工具快速搭建Dify平台的全过程。&lt;/p&gt;
&lt;p&gt;今天赶紧把另一道菜：&amp;lt; n8n 自部署环境搭建&amp;gt; 端出来。 后续可以导入其他人制作好的工作流，进一步学习&amp;amp;使用。&lt;/p&gt;
&lt;h3 id=&#34;话不多说先看效果&#34;&gt;话不多说，先看效果
&lt;/h3&gt;&lt;p&gt;登录后界面：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoweb.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;p&gt;工作流界面：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoworkflow_info.png&#34; style=&#34;zoom:47%;&#34; /&gt;
&lt;p&gt;双击某个节点，其中 &lt;strong&gt;INPUT&lt;/strong&gt; 和 &lt;strong&gt;OUTPUT&lt;/strong&gt;信息 是突出显示的：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoworkflow_LLMnode_details.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;p&gt;与Dify不同的是，&lt;strong&gt;n8n中没有知识库的组件&lt;/strong&gt;。可以认为 当前它更强调的是 “&lt;strong&gt;生产环境&lt;/strong&gt;”下工作流全流程搭建与使用上。&lt;/p&gt;
&lt;h2 id=&#34;个人自部署方式&#34;&gt;个人自部署方式
&lt;/h2&gt;&lt;p&gt;个人部署n8n用到的docker 镜像不多，这里有&lt;strong&gt;两种自部署方式&lt;/strong&gt;，供大家参考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在“1panle” 和“宝塔”的应用市场里就提供了App，直接图形化点击、安装——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo1panle_n8n.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用一个 &lt;strong&gt;docker-compose.yml&lt;/strong&gt; 文件搞定所有 镜像和环境变量，额外还需要&lt;strong&gt;一个脚本&lt;/strong&gt;完成数据库的初始化配置。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;使用第二种方式&#34;&gt;使用第二种方式
&lt;/h2&gt;&lt;p&gt;和dify 一样我们还是在 &lt;strong&gt;群晖的docker 工具&lt;/strong&gt; 内完成部署 。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;配置文件参考：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgres/docker-compose.yml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgres/docker-compose.yml&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;docker-compose-配置文件&#34;&gt;&lt;strong&gt;docker-compose&lt;/strong&gt; 配置文件
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_USER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;qbcvLY7zJzdHk4Fk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_DB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_NON_ROOT_USER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_NON_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Szk3hpR3fqBJAYWv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postgresql&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entrypoint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;initdb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;healthcheck&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;CMD-SHELL&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;pg_isready -h localhost -U admin -d n8n&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;retries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n8nio&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.108&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GENERIC_TIMEZONE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Asia&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shanghai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Asia&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shanghai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_TYPE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postgresdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_POSTGRESDB_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_POSTGRESDB_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5432&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_POSTGRESDB_DATABASE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_POSTGRESDB_USER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_POSTGRESDB_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;qbcvLY7zJzdHk4Fk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N8N_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N8N_RUNNERS_ENABLED&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N8N_ENCRYPTION_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y4jfzyUix57aRZeV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N8N_PROTOCOL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;#- N8N_SECURE_COOKIE=false    &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NODE_ENV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;production&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;home&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n8n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5678&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5678&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;condition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;service_healthy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;0-准备工作&#34;&gt;0. 准备工作
&lt;/h3&gt;&lt;p&gt;照例，还是先检查下群晖中 的docker管理组件工作正常。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocontainer_manager_info.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;以及镜像仓库可以正常访问。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocontainer_manager_market.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;此外，还需要多准备一个脚本：&lt;em&gt;&lt;strong&gt;init-data.sh&lt;/strong&gt;&lt;/em&gt; 内容如下——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -e&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;POSTGRES_NON_ROOT_USER&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;POSTGRES_NON_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	psql -v &lt;span class=&#34;nv&#34;&gt;ON_ERROR_STOP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; --username &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$POSTGRES_USER&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; --dbname &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$POSTGRES_DB&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt;-EOSQL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;		CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD &amp;#39;${POSTGRES_NON_ROOT_PASSWORD}&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;		GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER};
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;		GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER};
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;	EOSQL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SETUP INFO: No Environment variables given!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;1-导入yaml-配置文件&#34;&gt;1. 导入yaml 配置文件
&lt;/h3&gt;&lt;p&gt;新增一个&lt;strong&gt;n8n_pj&lt;/strong&gt; 的项目，路径放置在docker应用数据目录下（我这里是 &lt;u&gt;/docker/n8n&lt;/u&gt; ），粘贴上面配置文件后点击 “下一步”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimport_yaml.png&#34; style=&#34;zoom:55%;&#34; /&gt;
&lt;p&gt;此时还没有创建持久化数据的目录，&lt;strong&gt;不要勾选&lt;/strong&gt; “立即启动”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofinish_pj_create.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;最后，点击“完成”。&lt;/p&gt;
&lt;h3 id=&#34;2-添加持久化存储路径和数据库脚本&#34;&gt;2. 添加持久化存储路径和数据库脚本
&lt;/h3&gt;&lt;p&gt;数据库，配置，插件等数据都&lt;strong&gt;持久化&lt;/strong&gt; 的数据，所以在doker-compose 配置文件中已经指定了数据存放路径（ &lt;u&gt;/docker/n8n/n8n-data&lt;/u&gt; ）。&lt;/p&gt;
&lt;p&gt;需要在 &lt;u&gt;/docker/n8n/n8n-data&lt;/u&gt; 下，手动创建两个空文件夹“&lt;strong&gt;app&lt;/strong&gt;” 和 “&lt;strong&gt;db&lt;/strong&gt;”，并上传之前的数据库初始化脚本文件“&lt;strong&gt;init-data.sh&lt;/strong&gt;”——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodatapath.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h3 id=&#34;3-修改app-目录所属用户和用户组&#34;&gt;3. 修改app 目录所属用户和用户组
&lt;/h3&gt;&lt;p&gt;因为 n8n docker 镜像访问数据目录&lt;strong&gt;权限问题&lt;/strong&gt;，需要把 &lt;u&gt;/docker/n8n/n8n-data/app&lt;/u&gt; 文件夹的用户属性改为 &lt;strong&gt;1000:1000&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;具体操作为：
1）先ssh 登录到 群晖NAS 上&lt;/p&gt;
&lt;p&gt;2）执行命令：&amp;quot;&lt;u&gt;sudo chown 1000:1000 /volume1/docker/n8n/n8n-data/app&lt;/u&gt;&amp;quot;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:~$ 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:~$ cd /volume1/docker/n8n/n8n-data/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:/volume1/docker/n8n/n8n-data$ ls -l
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;total 4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwxrwx+ 1 admin users   0 Sep  5 18:46 app
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwxrwx+ 1 admin users   0 Sep  5 18:46 db
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxrwxrwx+ 1 admin users 494 Aug 19 10:43 init-data.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:/volume1/docker/n8n/n8n-data$ 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:/volume1/docker/n8n/n8n-data$ sudo chown 1000:1000 app
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Password: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:/volume1/docker/n8n/n8n-data$ ls -l
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;total 4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwxrwx+ 1  1000  1000   0 Sep  5 18:46 app
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxrwxrwx+ 1 admin users   0 Sep  5 18:46 db
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxrwxrwx+ 1 admin users 494 Aug 19 10:43 init-data.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:/volume1/docker/n8n/n8n-data$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;4-拉取镜像启动项目&#34;&gt;4. 拉取镜像，启动项目
&lt;/h3&gt;&lt;p&gt;因为n8n 默认参数“N8N_SECURE_COOKIE=true” ，&lt;strong&gt;要求使用https协议&lt;/strong&gt;，这里直接使用群晖自带的&lt;strong&gt;web station&lt;/strong&gt; 实现https 访问代理——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoused_webstation.png&#34; style=&#34;zoom:55%;&#34; /&gt;
&lt;p&gt;没有使用群晖的小伙伴也不用担心，文末会提供&lt;strong&gt;关闭“N8N_SECURE_COOKIE”功能&lt;/strong&gt;后的docker-compose 配置文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 关闭后，因为cookie 不受加密通信的保护，存在安全风险。&lt;/p&gt;
&lt;p&gt;上面步骤点击“保存”后。回到docker 管理界面，点击“操作” -&amp;gt; “构建”。拉取对应docker 镜像，生成相关docker 实例。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker_compose_up.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;p&gt;等待拉取镜像，n8n 的组件会逐个启动。
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8npj_done.png&#34; style=&#34;zoom:70%;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;启动成功——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGon8npj_success.png&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;h3 id=&#34;5-追加-hostsdns-解析&#34;&gt;5. 追加 Hosts/DNS 解析
&lt;/h3&gt;&lt;p&gt;项目已经成功运行了，配置中指定了N8N_HOST=n8n.host ，这里需要把域名关联到NAS IP上。&lt;/p&gt;
&lt;p&gt;两个地方应用这个域名，一个在之前创建的 web station 中——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGosynology_webstation_setting.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;还有一个 是在家里dns server上（一般是路由器）——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGorouter_localhosts.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;h3 id=&#34;6-登录web-界面完成初始化&#34;&gt;6. 登录web 界面完成初始化
&lt;/h3&gt;&lt;p&gt;以上都完成后，就可以登录n8n 进行最后的初始化工作啦。&lt;/p&gt;
&lt;p&gt;浏览器中 访问 &lt;a class=&#34;link&#34; href=&#34;https://n8n.host&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://n8n.host&lt;/a&gt; ，跳出初始化界面——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofirst_login.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;激活免费功能，需要关联自己的邮箱——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoinit_features.png&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;另外，n8n 的中文文档支持很好，初步上手可以看下 &lt;a class=&#34;link&#34; href=&#34;https://docs.n8ncn.io/advanced-ai/intro-tutorial/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;官方的入门案例指南&lt;/a&gt; 。&lt;/p&gt;
&lt;h2 id=&#34;企业自部署&#34;&gt;企业自部署
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;官方文档：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/n8n-io/n8n/blob/master/packages/%40n8n/benchmark/scripts/n8n-setups/scaling-single-main/docker-compose.yml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/n8n-io/n8n/blob/master/packages/%40n8n/benchmark/scripts/n8n-setups/scaling-single-main/docker-compose.yml&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;总体上看，各个组件的模块和dify 差不多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相同&lt;/strong&gt;的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;都是用了 redis 做缓存，postgres 做数据库&lt;/li&gt;
&lt;li&gt;都是一个主节点带1-2 个worker&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;不同&lt;/strong&gt;的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;多了mockapi 用于API 验证—— “MockAPI顾名思义是一个模拟的API，它可以模拟真实API的请求并返回数据。MockAPI可用于前后端分离，在项目初期前端可使用MockAPI对系统进行开发，而不需要依赖后端开发好正式的API后才开始进行前端开发。&amp;quot;&lt;/li&gt;
&lt;li&gt;多了一个 单节点性能测试组件——n8n-benchmark。用来评估 节点响应性能。&lt;/li&gt;
&lt;li&gt;如一开始说的，n8n 没有知识库组件，所以也用不到向量数据库。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;附：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关闭“N8N_SECURE_COOKIE” 后的docker-compose 配置文件，在本公众号（&lt;strong&gt;AI 热气球&lt;/strong&gt;）中发送【&lt;strong&gt;906&lt;/strong&gt;】获取。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo扫码_搜索联合传播样式-白色版.png&#34; style=&#34;zoom:67%;&#34; /&gt;
</description>
        </item>
        <item>
        <title>coze塔罗牌工作流 华丽转身——使用 cursor 快速开发web前端页面</title>
        <link>https://blog.cba.nxlan.cn/p/tarot_web_pj/</link>
        <pubDate>Thu, 28 Aug 2025 10:51:57 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/tarot_web_pj/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGo效果图.PNG" alt="Featured image of post coze塔罗牌工作流 华丽转身——使用 cursor 快速开发web前端页面" /&gt;&lt;h2 id=&#34;起因&#34;&gt;起因
&lt;/h2&gt;&lt;p&gt;之前写了在coze平台中发布塔罗牌应用的完整经历，随后发布到coze 和 公众号后，感觉有两个限制点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;用户输入的要求其实很规范化（生日 出生城市 性别 疑问），但是因为没有web 界面引导用户，结果用了大模型通过对话的形式开始的。这一步，就要和用户聊好几轮。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotesting_1.png&#34; style=&#34;zoom:35%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;workflow输出的内容其实很简单：先是3张卡牌，然后是markdown格式的解析说明。&lt;/p&gt;
&lt;p&gt;但是这个效果在小程序上很不好（显示不出图片，文字也是markdown格式的），想要完整体验的话又必须在coze 的应用市场中使用。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo微信图片_2025.jpg&#34; style=&#34;zoom:25%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结合这两个不满意的地方，希望跳出 coze 应用市场 在手机上或电脑上就可以完成塔罗牌的占卜和解析。&lt;/p&gt;
&lt;p&gt;还有&lt;strong&gt;其他两个动机&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我有一个朋友，想了解 &lt;strong&gt;cursor 如何在程序开发中提升效率&lt;/strong&gt;，以及哪些工作是必要且需要注意的。&lt;/li&gt;
&lt;li&gt;希望在 塔罗牌解读功能之上，再追加一个 用户注册 登入 登出的功能，&lt;strong&gt;不使用数据库&lt;/strong&gt;而是利用&lt;strong&gt;飞书多维表格&lt;/strong&gt; 记录用户用户基本信息。——俗称 &lt;strong&gt;上点难度&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;效果预览&#34;&gt;效果预览
&lt;/h2&gt;&lt;p&gt;为了白瞟 vercel的 服务，我把代码更新到了github上（&lt;a class=&#34;link&#34; href=&#34;https://github.com/UtMetoo/tarot-webui/blob/main/tarot_webui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;项目代码&lt;/a&gt;），并且让vercel 自动同步github 项目的最新版本。&lt;/p&gt;
&lt;p&gt;所以理论上，如果你也按照我之前的&lt;a class=&#34;link&#34; href=&#34;https://mp.weixin.qq.com/s/qEiRkZdAPmd0S8c4D42g-Q&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;文章&lt;/a&gt; 在coze上做了塔罗牌的工作流， 完全可以复用这套代码 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;登录后&lt;/strong&gt;页面长这样—— &lt;a class=&#34;link&#34; href=&#34;https://tarot.cba.nxlan.cn&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;网页&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo效果图.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;归根结底，这篇文章是&lt;strong&gt;coze 工作流的引申篇&lt;/strong&gt;——&lt;strong&gt;使用AI编程工具&lt;/strong&gt;，快速对接coze工作流并完成前端展示的任务。&lt;/p&gt;
&lt;p&gt;以这个项目为例，捎带记录了各项任务花费的时间，总共三个半天——&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;任务阶段&lt;/th&gt;
          &lt;th&gt;使用工具&lt;/th&gt;
          &lt;th&gt;花费时间&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段1: 需求分析&amp;amp;沟通&lt;/td&gt;
          &lt;td&gt;cursor&lt;/td&gt;
          &lt;td&gt;0.5h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段1: 前端demo 效果测试&lt;/td&gt;
          &lt;td&gt;cursor&lt;/td&gt;
          &lt;td&gt;1h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段1: API 对接后端（coze API 网关），部署到vercel平台&lt;/td&gt;
          &lt;td&gt;cursor + github + vercel&lt;/td&gt;
          &lt;td&gt;1h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段1: 基础功能测试&lt;/td&gt;
          &lt;td&gt;浏览器开发模式 + vercel + cursor&lt;/td&gt;
          &lt;td&gt;1.5h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段2: 页面优化调整&lt;/td&gt;
          &lt;td&gt;cursor&lt;/td&gt;
          &lt;td&gt;2.5h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段2: 讨论script.js 代码拆分（重构）方案&lt;/td&gt;
          &lt;td&gt;cursor&lt;/td&gt;
          &lt;td&gt;1h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段2: 执行script.js 拆分（重构）方案，重新验证基础功能&lt;/td&gt;
          &lt;td&gt;浏览器开发模式 + vercel + cursor&lt;/td&gt;
          &lt;td&gt;1h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段3: 讨论 追加用户用户登录认证的方案&lt;/td&gt;
          &lt;td&gt;cursor&lt;/td&gt;
          &lt;td&gt;1h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段3: 生成用户认证功能开发计划和任务表&lt;/td&gt;
          &lt;td&gt;cursor&lt;/td&gt;
          &lt;td&gt;0.5h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段3: 逐步推进认证系统任务（重点：对接多维表格API ）&lt;/td&gt;
          &lt;td&gt;cursor + curl + vercel+ feishu&lt;/td&gt;
          &lt;td&gt;2.5h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;阶段3: 其余优化任务讨论&lt;/td&gt;
          &lt;td&gt;cursor&lt;/td&gt;
          &lt;td&gt;1h&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;几个关键步骤&#34;&gt;几个关键步骤
&lt;/h2&gt;&lt;p&gt;没有办法把每个过程都展示一遍，这里放几个典型场景说明。可以感受下 cursor 等AI 编程工具的&lt;strong&gt;强大之处和能力边界。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;阶段1-需求分析沟通&#34;&gt;阶段1: 需求分析&amp;amp;沟通
&lt;/h3&gt;&lt;p&gt;我们一上来并不是 发送一句“我要一个塔罗牌web 界面” 给cursor，因为这里的上下文不清晰。此时让cursor 干活，肯定是不符合项目具体要求的 垃圾代码。&lt;/p&gt;
&lt;p&gt;所以，这个阶段的正确做法是：&lt;strong&gt;沟通需求，生成项目README.md 文档&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;得益于coze 平台对于 API 的文档支持到位（https://www.coze.cn/open/playground/workflow_stream_run）。直接使用curl 的命令，将整个工作流（流式响应）交互的过程展示出来——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 触发coze 指定工作流
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST &amp;#39;https://api.coze.cn/v1/workflow/stream_run&amp;#39; -H &amp;#34;Authorization: Bearer pat_YOUR-TOKEN&amp;#34; -H &amp;#34;Content-T
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ype: application/json&amp;#34; -d &amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;workflow_id&amp;#34;: &amp;#34;7536640635056619572&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;parameters&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;birthday&amp;#34;: &amp;#34;1983-07-21 13:00&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;gender&amp;#34;: &amp;#34;男&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;city&amp;#34;: &amp;#34;上海市&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;question&amp;#34;: &amp;#34;明年结婚 顺利么&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# coze API 网关返回结果（注意：这里是分两批返回数据的：第一批为卡牌信息； 第二批为具体解读信息）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id: 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;event: Message
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data: {&amp;#34;content&amp;#34;:&amp;#34;卡片信息：\n[{\&amp;#34;name_cn\&amp;#34;:\&amp;#34;宝剑骑士\&amp;#34;,\&amp;#34;name_en\&amp;#34;:\&amp;#34;Knight of Swords\&amp;#34;,\&amp;#34;position\&amp;#34;:1,\&amp;#34;type\&amp;#34;:\&amp;#34;逆位\&amp;#34;,\&amp;#34;url\&amp;#34;:\&amp;#34;https://t.8s8s.com/photo/tarotphoto/72/knight-swords.jpg\&amp;#34;},{\&amp;#34;name_cn\&amp;#34;:\&amp;#34;权杖三\&amp;#34;,\&amp;#34;name_en\&amp;#34;:\&amp;#34;Three of Wands\&amp;#34;,\&amp;#34;position\&amp;#34;:2,\&amp;#34;type\&amp;#34;:\&amp;#34;正位\&amp;#34;,\&amp;#34;url\&amp;#34;:\&amp;#34;https://t.8s8s.com/photo/tarotphoto/72/three-wands.jpg\&amp;#34;},{\&amp;#34;name_cn\&amp;#34;:\&amp;#34;魔术师\&amp;#34;,\&amp;#34;name_en\&amp;#34;:\&amp;#34;The Magician\&amp;#34;,\&amp;#34;position\&amp;#34;:3,\&amp;#34;type\&amp;#34;:\&amp;#34;逆位\&amp;#34;,\&amp;#34;url\&amp;#34;:\&amp;#34;https://t.8s8s.com/photo/tarotphoto/72/magician.jpg\&amp;#34;}]&amp;#34;,&amp;#34;content_type&amp;#34;:&amp;#34;text&amp;#34;,&amp;#34;node_execute_uuid&amp;#34;:&amp;#34;2a52fd2d-4899-411e-828a-9cf965c73921&amp;#34;,&amp;#34;node_id&amp;#34;:&amp;#34;1558566&amp;#34;,&amp;#34;node_is_finish&amp;#34;:true,&amp;#34;node_seq_id&amp;#34;:&amp;#34;0&amp;#34;,&amp;#34;node_title&amp;#34;:&amp;#34;塔罗卡片展示&amp;#34;,&amp;#34;node_type&amp;#34;:&amp;#34;Message&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id: 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;event: Message
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data: {&amp;#34;content&amp;#34;:&amp;#34;{\&amp;#34;output\&amp;#34;:\&amp;#34;### 婚姻前景的塔罗解读之旅\\n\\n亲爱的朋友，感谢你分享你的星盘信息和塔罗牌抽取结果。让我们一起来探索明年结婚的顺利程度，并为你提供一些指引。\\n\\n### 🔮 塔罗牌解读\\n\\n1. **逆位宝剑骑士**\\n   逆位的宝剑骑士通常表示冲动和缺乏耐心。在婚姻的背景下，这张牌提醒你，未来的婚姻生活中可能会有一些沟通上的挑战。你需要更加冷静和理性地处理问题，避免让情绪主导你的行为。\\n\\n2. **正位权杖三**\\n   正位的权杖三象征着展望和计划。这张牌暗示你在婚姻的准备过程中，需要更多的规划和远见。它鼓励你与伴侣共同制定未来的计划，并确保你们的目标一致。这张牌是一个积极的信号，表明你们的婚姻有坚实的基础。\\n\\n3. **逆位魔术师**\\n   逆位的魔术师可能表示缺乏自信或资源不足。在婚姻的背景下，这张牌提醒你，未来的婚姻生活中可能会遇到一些意想不到的挑战。你需要更加灵活和适应性强，找到解决问题的新方法。\\n\\n### 🌟 星盘分析\\n\\n你的星盘中有几个关键点值得注意：\\n\\n- **太阳落巨蟹座（第9宫）**\\n  太阳在巨蟹座表明你是一个情感丰富且重视家庭的人。第9宫与远见和哲学有关，说明你在婚姻中会寻求深层次的意义和成长。\\n\\n- **月亮落射手座（第2宫）**\\n  月亮在射手座表明你是一个乐观且热爱自由的人。第2宫与价值观和资源有关，说明你在婚姻中会重视物质和情感上的安全感。\\n\\n- **金星落处女座（第10宫）**\\n  金星在处女座表明你是一个注重细节和实际的人。第10宫与事业和公众形象有关，说明你在婚姻中会寻求稳定和责任感。\\n\\n### 💡 综合建议\\n\\n- **加强沟通**\\n  逆位宝剑骑士提醒你，沟通是婚姻成功的关键。你需要更加冷静和理性地处理问题，避免让情绪主导你的行为。\\n\\n- **共同规划**\\n  正位权杖三鼓励你与伴侣共同制定未来的计划，并确保你们的目标一致。这将是你们婚姻成功的重要基石。\\n\\n- **灵活应对**\\n  逆位魔术师提醒你，未来的婚姻生活中可能会遇到一些意想不到的挑战。你需要更加灵活和适应性强，找到解决问题的新方法。\\n\\n### 🚀 最终指引\\n\\n塔罗牌和星盘都显示，你们的婚姻有成功的潜力，但需要时间和努力。正位权杖三的“展望和计划”意味很强，说明你们需要共同制定未来的计划。关键在于你是否愿意以更成熟的态度去面对婚姻中的挑战。\\n\\n如果你能加强沟通（逆位宝剑骑士），共同规划（正位权杖三），并灵活应对（逆位魔术师），你们的婚姻很可能会在未来取得成功。\\n\\n需要更具体的建议吗？比如如何加强沟通，或是如何共同规划未来？我很乐意继续为你解读。\&amp;#34;}&amp;#34;,&amp;#34;content_type&amp;#34;:&amp;#34;text&amp;#34;,&amp;#34;node_execute_uuid&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;node_id&amp;#34;:&amp;#34;900001&amp;#34;,&amp;#34;node_is_finish&amp;#34;:true,&amp;#34;node_seq_id&amp;#34;:&amp;#34;0&amp;#34;,&amp;#34;node_title&amp;#34;:&amp;#34;End&amp;#34;,&amp;#34;node_type&amp;#34;:&amp;#34;End&amp;#34;,&amp;#34;usage&amp;#34;:{&amp;#34;input_count&amp;#34;:4117,&amp;#34;output_count&amp;#34;:612,&amp;#34;token_count&amp;#34;:4729}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id: 2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;event: Done
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;直接把以上内容粘贴复制给cursor “&lt;strong&gt;ASK”&lt;/strong&gt; 对话框内，告诉它：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我有一个coze 的workflow ，输入用户的&amp;#34;birthday&amp;#34;，&amp;#34;gender&amp;#34;，&amp;#34;city&amp;#34;和 &amp;#34;question&amp;#34;信息后，会返回塔罗牌url和相关解释文字（markdown格式），我需要一个webui 界面，完成用户信息输入、请求和展示功能。并部署在vercel 平台上。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请评估下具体的任务和开发步骤。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;同时引用“.&lt;strong&gt;cursorrules&lt;/strong&gt;”，告诉它我们使用的开发工具和偏好（“可以选择html/css/js就做到的，就不使用react或next.js的方式”）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Role
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你是个具有优秀编程习惯的AI，但你也知道自己作为AI的所有缺陷，所以你总是遵守以下规则：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 架构选择
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 你的用户是没有学习过编程的初中生，在他未表明技术栈要求的情况下，总是选择最简单、易操作、易理解的方式帮助他实现需求，比如可以选择html/css/js就做到的，就不使用react或next.js的方式；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 总是遵守最新的最佳实践，比如撰写Next.js 项目时，你将总是遵守Next.js 14版本的规范（比如使用app router而不是pages router），而不是老的逻辑；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 你善于为用户着想，总是期望帮他完成最省力操作，尽量让他不需要安装新的环境或组件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 本规则由 AI进化论-花生 创建，版权所有，引用请注明出处
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 开发习惯
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 开始一个项目前先读取根目录下的readme文档，理解项目的进展和目标，如果没有，则自己创建一个；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 在写代码时总是有良好的注释习惯，写清楚每个代码块的规则；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 你倾向于保持代码文件清晰的结构和简洁的文件，尽量每个功能，每个代码组都独立用不同的文件呈现；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4. 当遇到一个bug经过两次调整仍未解决时，你将启动系统二思考模式：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 首先系统性分析导致bug的可能原因
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 提出具体的假设和验证思路
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 提供三种不同的解决方案，并详细说明每种方案的优缺点
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   - 让用户根据实际情况选择最适合的方案
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 设计要求
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 你具有出色的审美，是apple inc. 工作20年的设计师，具有出色的设计审美，会为用户做出符合苹果审美的视觉设计；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 你是出色的svg设计师，当设计的网站工具需要图像、icon时，你可以自己用svg设计一个。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 对话风格
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 总是为用户想得更多，你可以理解他的命令并询问他想要实现的效果；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 当用户的需求未表达明确，容易造成误解时，你将作为资深产品经理的角色一步步询问以了解需求；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 在完成用户要求的前提下，总是在后面提出你的进一步优化与迭代方向建议。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样通过几轮对话后，就可以告诉cursor 让它产出一个比较良好的项目说明文档——&lt;strong&gt;README.md&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;注意：具体细节在项目推进中，可以逐步细化和完善。这里有个初步的框架和清晰的目标就可以。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoinit_version_README.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoinit_version_README2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoinit_version_README3.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;报错时如何找到问题原因并进行修复&#34;&gt;报错时，如何找到问题原因，并进行修复
&lt;/h3&gt;&lt;p&gt;即便已经告诉 cursor：根据coze workflow 返回的数据显示塔罗牌卡片信息和解读信息，但是在初期执行时因为任务和代码数量比较多，cursor 可能还是会“失焦”——丢失任务细节。&lt;/p&gt;
&lt;p&gt;对应的解决办法有两个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过浏览器的 “开发者模式” 查看服务端或浏览器显示的数据，将相关报错作为补充信息告诉cursor。&lt;/p&gt;
&lt;p&gt;cursor 会根据具体的报错信息和项目结构，分析相关代码，特别是逻辑关系调用 AI 工具在这方面效率很高。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoissue1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;当然这种方式（小段报错直接发给AI 编程工具）适用于小问题的修修补补，大问题反而不建议直接修改，原因后面也会提到。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重要的功能节点&lt;/strong&gt;，一定安排相关的&lt;strong&gt;测试项目&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如上面代码的修复成功后，cursor 生成了测试页面：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoissue2.PNG&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;p&gt;通过模块化的测试页面，一方面可以帮助验证功能和代码的有效；另一方面也可以提高后续代码调整后反复验证的效率。&lt;/p&gt;
&lt;p&gt;所以，重要的功能测试都有相关的测试页面—— 例如：&lt;a class=&#34;link&#34; href=&#34;https://tarot.cba.nxlan.cn/test/card-test&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;卡牌图片效果测试&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotesting_readme.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;阶段2-讨论scriptjs-代码拆分重构方案&#34;&gt;阶段2: 讨论script.js 代码拆分（重构）方案
&lt;/h3&gt;&lt;p&gt;关键代码重构一定要慎重：先讨论清楚，再进行，这一步很可能因为设计不清楚或者需求太复杂，&lt;strong&gt;导致回滚&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;重构的必要性讨论：&lt;/p&gt;
&lt;p&gt;肯定是 利 &amp;gt; 弊才会考虑 进行代码重构。&lt;/p&gt;
&lt;p&gt;例如，本项目中 script.js 不断添加新功能，导致代码一度达到1300多行 &lt;a class=&#34;link&#34; href=&#34;https://github.com/UtMetoo/tarot-webui/blob/main/tarot_webui/public/script.js.backup&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;原有 script.js 代码放这里&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;这个长度 超出了AI编程工具一次代码修改量的最佳长度（还是那个问题，代码过长可能会导致编程模型注意力分散，写出一些无用代码的可能性变高）。&lt;/p&gt;
&lt;p&gt;同时在这个文件中，还融合了城市数据、应用入口、markdown格式渲染等好几个功能。&lt;/p&gt;
&lt;p&gt;所以这个1300多行的代码拆分后，是有利于，后续功能实现和迭代的。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojs拆分优点.PNG&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重构的方案讨论：&lt;/p&gt;
&lt;p&gt;AI 编程工具在讨论这个过程中，有时会给你提一个过于激进的方案。&lt;/p&gt;
&lt;p&gt;这个过程中，人在其中的判断很重要，可能要讨论好几次——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojs拆分方案.PNG&#34; style=&#34;zoom:65%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;评估重构对现有项目的影响&lt;/p&gt;
&lt;p&gt;如果项目结构和模块清晰，这里的影响范围一般会比较可控。&lt;/p&gt;
&lt;p&gt;但如果是已经上线的代码，有着诸多“历史原因”，这里的影响评估就要非常小心了，指不定哪里有个“牵一发而动全身”的遗留代码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;操作过程中尽量按照 “子任务执行”  &amp;ndash;&amp;gt; “测试” 的步骤循环进行。并且尽量 一次就解决一个问题。&lt;/p&gt;
&lt;p&gt;前面提到的重要功能的&lt;strong&gt;测试模块&lt;/strong&gt;，此时就能帮助我们快速完成原有基础功能是否正常的判断，同时还有利于定位问题原因。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojs拆分执行方案.PNG&#34; style=&#34;zoom:70%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;拆分后效果——&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojs_拆分.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;阶段3-逐步推进认证系统任务&#34;&gt;阶段3: 逐步推进认证系统任务
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;该阶段属于项目新增&lt;strong&gt;重大功能&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;同样的，不能一开始就 让AI 工具直接动手改，否则也是改出一堆问题代码，到头来给自己徒增一堆烦恼。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最佳实践&lt;/strong&gt;，也简单：把之前的 “需求讨论分析 &amp;ndash;&amp;gt; 任务计划产生 &amp;ndash;&amp;gt; todolist ” 再走一遍。甚至让cursor 先生成相关功能的伪代码，突出相关函数功能和逻辑。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGouserauth_model.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;最后再安排cursor 按照约定的步骤&amp;amp;计划执行，就会&lt;strong&gt;非常省心&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;因为这样做之后，既可以保证AI编程工具知道自己当前具体的任务（一次聚焦一个子任务），也知道上下文（上一步完成了什么，这一步完成后如何测试等等）。&lt;/p&gt;
&lt;p&gt;在这种框架下推进，即使遇到问题，也是局部优化调整的事情。不会耽误太多时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;简单数据的增删改查，完全可以考虑飞书多维表格的API 接口实现。&lt;/p&gt;
&lt;p&gt;例如，这里用户信息查询的接口 ——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoget_userinfo.PNG&#34; style=&#34;zoom:66%;&#34; /&gt;
&lt;p&gt;而且表格形式的数据更方便展示，例如这里记录的用户登录信息——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo多维表格信息.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果遇到技术架构&amp;amp;方案等高阶问题，记得让AI 编程工具&lt;strong&gt;提供三个不同的解决方案&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;然后，由开发者 分析哪个方案在当前项目更合适。当然 AI 编程工具在信息对比和汇总方便很厉害。&lt;/p&gt;
&lt;p&gt;例如，这里关于&lt;strong&gt;用户登录后&lt;/strong&gt;，页面的显示效果就有两套不同的方案，方案差异和优缺点一目了然——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGouserlogin_方案对比.PNG&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGojs拆分执行方案2.PNG&#34; style=&#34;zoom:66%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PS：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用飞书多维表格，有两个前置准备工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;需要创建“企业自建应用”，应用中的 “APP ID” 和 “APP Secret” 分别对应 vercel 中的环境变量“FEISHU_APP_ID”和“FEISHU_APP_SECRET”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofenshu_VE.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用到的多维表格，需要在“文档应用”中添加“企业自建应用”的“可编辑”权限。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofenshu_perapp.PNG&#34; style=&#34;zoom:66%;&#34; /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;当前阶段ai-编程工具的现状能力边界&#34;&gt;当前阶段AI 编程工具的现状（能力边界）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;任务描述不清时，让工具直接改动反而会导致更多的问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解法：&lt;/strong&gt; 先别着急直接生成代码，而是使用“chat” 模式。多聊几轮，聊得越具体，产生的文档 （任务文档、项目文档）越清晰，越有利于后续开发中聚焦。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AI 编程工具 习惯性的添加代码 ，当代码长到一定程度，它会“忘记”代码的细节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解法：&lt;/strong&gt; 尝试保持代码模块化和结构，如果个别代码太长，该拆分就拆分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果功能比较多，在设计时 最好考虑&lt;strong&gt;代码模块化&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一来是保持项目结构清晰，二来 减少重复代码和过长代码， 三来 结构化的代码无论是人类还是AI 都是更容易理解和阅读的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调用外部模块的时候，可能遇到 AI 编程工具自己都弄不清楚的情况，它也会尝试联网搜索。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解法：&lt;/strong&gt; 对于外部的模块，很可能升级个版本 接口格式就变了，所以最佳的实践还是前面提到的 做好测试工程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;复杂问题的解决方法可能有多个，不要让AI 自动解决。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解法：&lt;/strong&gt; 此时开发者最好 多问一句“你给我提供 三个不同的方案，并详细对比它们间的差异”。往往，它可以帮助我们判断哪个方案更合适当前的项目。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当前 AI 编程工具提高的是实施效率，但关键节点的&lt;strong&gt;判断决定它还做不了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这也就意味着，在这种模式下如果人判断错了，后续失败或返工的结果也是开发者自己承担。&lt;strong&gt;不能过度依赖 这套工具&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;未来畅想胡言论语&#34;&gt;未来畅想（胡言论语）
&lt;/h2&gt;&lt;p&gt;我相信未来随着AI 编程工具越来越智能，开发过程中的 反馈和自我修复能力应该会大大进化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;尤其是涉及UI 的部分，AI 工具可直接得到最终页面效果图，然后以图识别出页面效果和问题。然后，询问用户是否让它自动完成“修改” &amp;ndash;&amp;gt; “测试” &amp;ndash;&amp;gt; &amp;ldquo;反馈&amp;rdquo; 这一套流程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当出现 报错时，AI 工具可以从多个维度 搜集问题信息，进而归类整理出问题根本原因，然后提交、对比三个解决方案。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;另外，大家有没有想过 为啥AI 编程工具先火了，并且反响还不错。&lt;/p&gt;
&lt;p&gt;但是，其他高科技行业 如造车、芯片制造哪怕是视频生成 都没有这么高效&amp;amp;可行。。。这背后也有 &lt;strong&gt;代码本身就是优秀的结构化数据&lt;/strong&gt;的原因。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Dify 自部署环境搭建(docker)</title>
        <link>https://blog.cba.nxlan.cn/p/dify_docker/</link>
        <pubDate>Wed, 27 Aug 2025 15:11:19 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/dify_docker/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoai-image-1756348977975-ti4g0bem.png" alt="Featured image of post Dify 自部署环境搭建(docker)" /&gt;&lt;h2 id=&#34;dify-自部署环境搭建docker&#34;&gt;Dify 自部署环境搭建（docker）
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;写在前面：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dify 和 coze，n8n一样 同属“AI应用构建平台”：通过自带的模块组件 + 应用市场插件的方式，帮助我们快速的把AI 能力嵌入到工作和生活中去。&lt;/p&gt;
&lt;p&gt;DIfy 和 n8n 都已经开源很久了，今天先分享下 Dify 平台在docker 环境下的部署方式。这两个平台对硬件需求都不高，倒是对网络需求有点高哈 ^^ 。以下是github 官方文档中提到的硬件要求——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before installing Dify, make sure your machine meets the following minimum system requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt; &amp;gt;= 2 Core&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt; &amp;gt;= 4 GiB&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;p&gt;所以，完全可以使用 &lt;strong&gt;docker工具&lt;/strong&gt; 在window、linux 甚至是各种预装好了docker 的x86平台上运行。后者，如1panel、宝塔、NAS。&lt;/p&gt;
&lt;p&gt;今天就通过一个 &lt;em&gt;docker-compose.yml&lt;/em&gt; 配置文件，在&lt;strong&gt;群晖NAS&lt;/strong&gt; 上，5分钟快速搭建自己的Dify平台。&lt;/p&gt;
&lt;h3 id=&#34;话不多说先看效果&#34;&gt;话不多说，先看效果——
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo效果图1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo效果图_2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo效果图_3.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo效果图_4.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h2 id=&#34;docker-配置文件如下&#34;&gt;docker 配置文件如下
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;  1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 59
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 60
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 61
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 62
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 63
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 64
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 65
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 66
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 67
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 68
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 69
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 70
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 71
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 72
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 73
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 74
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 75
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 76
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 77
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 78
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 79
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 80
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 81
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 82
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 83
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 84
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 85
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 86
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 87
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 88
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 89
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 90
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 91
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 92
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 93
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 94
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 95
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 96
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 97
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 98
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 99
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;100
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;101
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;102
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;103
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;104
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;105
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;106
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;107
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;108
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;109
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;110
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;111
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;112
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;113
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;114
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;115
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;116
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;117
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;118
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;119
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;120
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;121
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;122
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;123
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;124
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;125
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;126
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;127
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;128
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;129
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;130
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;131
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;132
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;133
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;134
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;135
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;136
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;137
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;138
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;139
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;140
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;141
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;142
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;143
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;144
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;145
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;146
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;147
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;148
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;149
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;150
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;151
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;152
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;153
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;154
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;155
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;156
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;157
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;158
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;159
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;160
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;161
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;162
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;163
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;164
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;165
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;166
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;167
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;168
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;169
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;170
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;171
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;172
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;173
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;174
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;175
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;176
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;177
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;178
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;179
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;180
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;181
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;182
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;183
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;184
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;185
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;186
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;187
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;188
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;189
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;190
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;191
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;192
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;193
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;194
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;195
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;196
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;197
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;198
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;199
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;200
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;201
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;202
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;203
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;204
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;205
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;206
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;207
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;208
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;209
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;210
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;211
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;212
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;213
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;214
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;215
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;216
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 定义网络，确保所有服务都在同一个网络内，可以互相通信&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;driver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bridge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Dify API Server: 核心后端服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;langgenius&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DIFY_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# 将容器的 5015 端口映射到你电脑的 5015 端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;5015:5015&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# 默认端口5001，如有冲突这里修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DIFY_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5015&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MODE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] URL 地址已根据本地测试环境配置好&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CONSOLE_WEB_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;APP_WEB_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CONSOLE_API_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5015&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SERVICE_API_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5015&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] 数据库连接信息，与下面的 db 服务配置一致&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_USERNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ddiiffyy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5432&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_DATABASE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify_db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] Redis 连接信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_DB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] Weaviate 向量数据库连接信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;VECTOR_STORE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_GRPC_ENABLED&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_ENDPOINT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_GRPC_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50051&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 本地部署通常不需要 Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_BATCH_SIZE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] plugin_daemon 连接信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_REMOTE_INSTALL_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin_daemon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_REMOTE_INSTALL_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5003&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;INNER_API_KEY_FOR_PLUGIN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PwMc7L7YprSMkWQFPCtF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_DAEMON_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin_daemon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5002&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_DAEMON_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PoANGw2KsXrSAd6iztKT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_MAX_PACKAGE_SIZE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;52428800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# 其他配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EDITION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SELF_HOSTED&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LOG_LEVEL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INFO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FILES_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OPENDAL_SCHEME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OPENDAL_FS_ROOT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CELERY_BROKER_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CELERY_BACKEND&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已修改] 数据持久化到本地 ./dify-data/api文件夹&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;worker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;langgenius&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DIFY_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MODE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;worker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SENTRY_TRACES_SAMPLE_RATE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SENTRY_PROFILES_SAMPLE_RATE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_MAX_PACKAGE_SIZE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;52428800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_DAEMON_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin_daemon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5002&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_DAEMON_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PoANGw2KsXrSAd6iztKT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;INNER_API_KEY_FOR_PLUGIN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PwMc7L7YprSMkWQFPCtF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OPENDAL_SCHEME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OPENDAL_FS_ROOT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CELERY_BROKER_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CELERY_BACKEND&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_USERNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ddiiffyy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5432&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_DATABASE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify_db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_DB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;VECTOR_STORE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_ENDPOINT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_GRPC_ENABLED&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_GRPC_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50051&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WEAVIATE_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 本地部署通常不需要 Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Dify Web Client: 前端服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;langgenius&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DIFY_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已修改] 将容器的 3000 端口映射到你电脑的 3000 端口，避免 80 端口冲突&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;3000:3000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] URL 地址已根据本地测试环境配置好&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CONSOLE_API_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5015&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;APP_API_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5015&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# 其他配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EDITION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SELF_HOSTED&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NEXT_PUBLIC_SITE_TITLE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# PostgreSQL Database: 关系型数据库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] 设置数据库的用户名、密码和数据库名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_USER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ddiiffyy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;POSTGRES_DB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify_db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已修改] 将数据库数据持久化到本地的 ./dify-data/postgres 文件夹&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;postgresql&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;healthcheck&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;CMD&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;pg_isready&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-h&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;db&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-U&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;${PGUSER:-postgres}&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;-d&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;${POSTGRES_DB:-dify}&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;retries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Redis Cache: 缓存服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;alpine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;healthcheck&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;CMD&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;redis-cli&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;ping&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# Weaviate Vector Store: 向量数据库，用于 RAG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;semitechnologies&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.24&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;failure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;8080:8080&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;50051:50051&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;QUERY_DEFAULTS_LIMIT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PERSISTENCE_DATA_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFAULT_VECTORIZER_MODULE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;none&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ENABLE_MODULES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;text2vec-openai,reranker-cohere&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CLUSTER_HOSTNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已修改] 将向量数据持久化到本地的 ./dify-data/weaviate 文件夹&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;weaviate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# 插件模块：用于安装&amp;amp;调用插件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;plugin_daemon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;langgenius&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;daemon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;5003:5003&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;5002:5002&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DIFY_INNER_API_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5015&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DIFY_INNER_API_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PwMc7L7YprSMkWQFPCtF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SERVER_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5002&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SERVER_KEY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PoANGw2KsXrSAd6iztKT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_REMOTE_INSTALLING_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_REMOTE_INSTALLING_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5003&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PLUGIN_WORKING_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MAX_PLUGIN_PACKAGE_SIZE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;52428800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] 数据库连接信息，与之前的 db 服务配置一致&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_USERNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ddiiffyy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5432&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DB_DATABASE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify_db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# [已配置] redis连接信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_HOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;REDIS_DB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dify&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;具体操作步骤&#34;&gt;具体操作步骤
&lt;/h2&gt;&lt;h3 id=&#34;0-确认docker-服务已启用配置网络加速&#34;&gt;0. 确认docker 服务已启用，配置网络加速
&lt;/h3&gt;  &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep0.1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;确认，镜像仓库可以正常访问，以便后续顺利拉取 镜像。&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep0.2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-导入yaml-配置文件&#34;&gt;1. 导入yaml 配置文件
&lt;/h3&gt;&lt;p&gt;这里新建一个项目叫“dify_pj”，路径放置在自己的docker存储空间中（我这里是  &lt;em&gt;&lt;u&gt;/docker/dify&lt;/u&gt;&lt;/em&gt; ）。&lt;/p&gt;
  &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep1.1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;注意：此时还没有创建持久化数据路径，&lt;strong&gt;不要勾选&lt;/strong&gt;“立即启动”。&lt;/p&gt;
  &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep1.2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;点击“完成”，完成初始项目集的导入。&lt;/p&gt;
&lt;h3 id=&#34;2-添加持久化存储路径&#34;&gt;2. 添加持久化存储路径
&lt;/h3&gt;&lt;p&gt;像数据库、配置文件、插件都需要&lt;strong&gt;持久化&lt;/strong&gt;数据，所以上述配置文件中指定了 数据存放路径（ &lt;em&gt;/docker/dify/dify-data&lt;/em&gt; ）。&lt;/p&gt;
&lt;p&gt;在目录下创建这5个空文件夹即可——&lt;/p&gt;
  &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep2.1.PNG&#34; style=&#34;zoom:80%;&#34; /&gt;
&lt;p&gt;或者使用 &lt;strong&gt;mkdir 命令&lt;/strong&gt; 创建这5个空目录——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:~$ sudo mkdir -p /volume1/docker/dify/dify-data 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:~$ cd /volume1/docker/dify/dify-data
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:/volume1/docker/dify/dify-data$ 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;admin@NAS:/volume1/docker/dify/dify-data$ mkdir api plugin redis postgres weaviate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-拉取镜像&#34;&gt;3. 拉取镜像
&lt;/h3&gt;&lt;p&gt;回到，docker 管理界面，点击“操作” &amp;ndash;&amp;gt; “构建”。开始拉取相关 docker 镜像，并生成docker-compose中指定配置（如，网络 启动命令 存储  环境变量等参数）。&lt;/p&gt;
 &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep3.1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;等待全部拉取完成后，dify 组件就陆陆续续启动了。&lt;/p&gt;
 &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep3.2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;启动成功——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep3.3.PNG&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;h3 id=&#34;4-数据库-初始化&#34;&gt;4. 数据库 初始化
&lt;/h3&gt;&lt;p&gt;服务&lt;strong&gt;第一次启动&lt;/strong&gt;（或升级）时， 数据库需要 更新下。步骤如下——&lt;/p&gt;
&lt;p&gt;1） 找到dify_pj-api-1 这个应用，点击“操作” &amp;ndash;&amp;gt; &amp;ldquo;打开终端机&amp;rdquo;&lt;/p&gt;
 &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep4.1.PNG&#34; style=&#34;zoom:57%;&#34; /&gt;
&lt;p&gt;2） 新建终端，输入命令 &amp;ldquo;&lt;strong&gt;flask db upgrade&lt;/strong&gt;&amp;quot;，完成数据库升级操作。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep4.2.PNG&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;p&gt;或者 使用命令行操作：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo docker exec -it dify_pj-api-1 flask db upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这一步完成，&lt;strong&gt;dify 相关组件就都启动好了&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;5-追加-hostsdns-解析&#34;&gt;5. 追加 Hosts/DNS 解析
&lt;/h3&gt;&lt;p&gt;配置文件中，使用了域名的方式访问 dify 应用。所以，需要在 路由器或内网DNS 服务器上追加一条记录，完成 域名到&lt;strong&gt;NAS IP&lt;/strong&gt; 地址的映射。 这里 以路由器的“自定义 hosts”功能为例——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep5.1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;这样，后续在内网访问dify 应用时，使用 &amp;ldquo;域名:端口&amp;rdquo; 的形式就可以了。&lt;/p&gt;
&lt;h3 id=&#34;6-登录web-界面完成初始化&#34;&gt;6. 登录web 界面，完成初始化
&lt;/h3&gt;&lt;p&gt;使用 &lt;a class=&#34;link&#34; href=&#34;http://dify.host:3000&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://dify.host:3000&lt;/a&gt;  登录dify 完成初始化工作。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep6.1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;7-应用市场中-安装llm-大模型并设置api-key&#34;&gt;7. 应用市场中 安装LLM 大模型，并设置API key
&lt;/h3&gt;&lt;p&gt;最后，点击“插件” 中的“模型”，安装LLM 大模型。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep7.1.PNG&#34; style=&#34;zoom:43%;&#34; /&gt;
&lt;p&gt;等待安装完成后，在用户设置中“模型供应商” 启用对应模型 API key。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGostep7.2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;后续，就可以创建自己的工作流 和 知识库啦。&lt;/p&gt;
&lt;h2 id=&#34;dify-各组件功能说明&#34;&gt;dify 各组件功能说明
&lt;/h2&gt;&lt;p&gt;官方图片：https://github.com/langgenius/dify/blob/main/docker/docker-compose.png&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodocker-compose.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;图片中，左侧是用户浏览器，中间是web 代理服务(nginx)，右侧有 &lt;strong&gt;9 个&lt;/strong&gt;组件。下面通过表格的形式，快速介绍下——&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;组件名&lt;/th&gt;
          &lt;th&gt;功能描述&lt;/th&gt;
          &lt;th&gt;必须&lt;/th&gt;
          &lt;th&gt;镜像版本&lt;/th&gt;
          &lt;th&gt;yaml文件已包含&lt;/th&gt;
          &lt;th&gt;端口&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;api&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;后端核心&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;latest (当前 v1.8.0)&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;5001&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;worker&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;队列任务执行（&lt;strong&gt;知识库功能必安装&lt;/strong&gt;）&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;与api 使用相同镜像&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;web&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;前端核心&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;latest (当前 v1.8.0)&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;3000&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;database&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;配置数据库&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;postgres:15-alpine&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;5432&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;plugin&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;插件功能&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;dify-plugin-daemon:0.2.0-local&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;5002-5003&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;redis&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;缓存服务&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;redis:6-alpine&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;6379&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;weaviate&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;向量数据库 （&lt;strong&gt;知识库功能必安装&lt;/strong&gt;）&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;weaviate:1.24.1&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
          &lt;td&gt;8080,50051&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;sandbox&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;代码执行模块 （&lt;strong&gt;code 功能必安装&lt;/strong&gt;）&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;dify-sandbox:0.2.12&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;8194&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;SSRF&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;反向代理。给sandbox 访问互联网使用（非必需）&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;3128&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;nginx&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;web 代理服务（&lt;strong&gt;生产环境必安装&lt;/strong&gt;）&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
          &lt;td&gt;80, 443&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;PS：&lt;/strong&gt; 所以，如果后续需要在工作流中使用代码功能， 就还需要添加一个&lt;strong&gt;sandbox 组件&lt;/strong&gt;。操作方法也是一样的，就是需要多导入一个conf.yml文件。  需要的朋友在公众号“&lt;strong&gt;AI 热气球&lt;/strong&gt;”输入【827】 获取加强版 docker-compose 文件。&lt;/p&gt;
&lt;h2 id=&#34;补充常用docker-状态查看命令&#34;&gt;补充：常用docker 状态查看命令
&lt;/h2&gt;&lt;p&gt;当然，这些在有docker 管理界面的 图形化操作里也可以执行。放在这里以防备用。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 重启指定容器
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo docker restart dify_pj-api-1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 查看当前dify项目相关容器
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo docker ps | grep dify
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 查看指定容器的日志 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo docker logs -f dify_pj-api-1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 进入指定容器实例内部
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo docker exec -it dify_pj-api-1 /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;写在最后&#34;&gt;写在最后
&lt;/h2&gt;&lt;p&gt;最后，有人会说 dify 明明提供免费的云服务版本——我为啥要费力气自己搭建？&lt;/p&gt;
&lt;p&gt;这里同样放一张，官方的参数图。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGodify_cloud_price.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;我也体验了下dify 提供的云服务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;好处是&lt;/strong&gt;功能组件都是全的（不用自己再初始化添加组件），用来熟悉dify功能和快速搭建工作流是不错的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是&lt;/strong&gt;，执行过程中偶尔会抽风报个错（具体是啥报错 忘了截图了），而且知识库和 应用程序一旦多起来，升级的开销就比较贵了。&lt;/p&gt;
&lt;p&gt;下期，可能分享n8n 平台的搭建，后续也会比较这三家低代码平台的差异。&lt;/p&gt;
&lt;p&gt;感兴趣的小伙伴不妨关注、期待下 。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>扣子上手实战 — 塔罗牌应用</title>
        <link>https://blog.cba.nxlan.cn/p/coze_02/</link>
        <pubDate>Mon, 18 Aug 2025 14:12:21 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/coze_02/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoai-image-1755497864732-lq140kr1.png" alt="Featured image of post 扣子上手实战 — 塔罗牌应用" /&gt;&lt;h2 id=&#34;扣子-上手实战---塔罗牌应用&#34;&gt;扣子 上手实战 - 塔罗牌应用
&lt;/h2&gt;&lt;p&gt;之前分享了使用coze &lt;strong&gt;工作流&lt;/strong&gt; 搭建个人兴趣搜索助手的案例。coze（扣子）平台的使用，可以说是上手了。&lt;/p&gt;
&lt;p&gt;今天在之前应用的基础上，深入一点：做个塔罗牌占卜的小应用。通过这个案例，你可以得到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;工作流向Agent演进，以及其中大语言模型（LLM）发挥的作用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;coze 工作流中一些常用组件的使用（选择, 循环，变量，代码，输出，卡片）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;其中卡片展示 和 循环 为学习目的追加的，初期上手有点复杂—— &lt;strong&gt;Option&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;发布自己的coze应用  —— 应用已经发布到coze 平台（ &lt;a class=&#34;link&#34; href=&#34;https://www.coze.cn/s/3FbpLuGMnac/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.coze.cn/s/3FbpLuGMnac/&lt;/a&gt;）和 微信公众号（AI 热气球）中啦。感兴趣的话，你可以来体验下~&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo发布_成功.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;效果图先行（忽略不满20岁就 考研这个bug ^^）——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotesting_1.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotesting_2.png&#34; style=&#34;zoom:36%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotesting_3.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;hr&gt;
&lt;p&gt;那具体怎么实现的呢？&lt;/p&gt;
&lt;p&gt;这里需要引入Agent 的概念——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q: 什么是Agent ？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：AI Agent（智能体）是指能够自主感知环境、做出决策并采取行动的系统。它通常具备一定的智能，能根据目标和环境变化动态调整行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：自主性、感知-决策-执行闭环、可持续交互、目标驱动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件：&lt;/strong&gt;&lt;u&gt;大脑&lt;/u&gt;（基础语言模型）、&lt;u&gt;记忆&lt;/u&gt;（上下文）、&lt;u&gt;工具&lt;/u&gt;（tools）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Q: Agent 和workflow 有什么不同？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里放一张&lt;strong&gt;对比表&lt;/strong&gt;——&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;AI Agent（智能体）&lt;/th&gt;
          &lt;th&gt;Workflow（工作流）&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;核心&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;智能决策与自主行为&lt;/td&gt;
          &lt;td&gt;任务/操作的有序自动化&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;驱动力&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;目标导向、环境感知&lt;/td&gt;
          &lt;td&gt;规则/流程导向&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;适应性&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;高，能根据情况动态调整&lt;/td&gt;
          &lt;td&gt;低，流程通常是预设好的&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;复杂性&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;可复杂（涉及学习、推理等）&lt;/td&gt;
          &lt;td&gt;通常较简单（规则、条件）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;幻觉&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;会存在讨好人类，编造数据的情况&lt;/td&gt;
          &lt;td&gt;因为上下游的输入输出受限，过程和内容可控&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/blockquote&gt;
&lt;p&gt;实际应用中，可以把Agent 套在workflow 承担某一环节的顾问（由大模型 自主判断、分析、输出）——就像上一篇文章“B站助手”中大模型发挥的作用：它接收到输入信息后，推理用户对这方面的内容感兴趣，然后找插件去检索B站中相匹配的 热门视频，然后再按照我们要求的格式整理（标题、url、简介）后输出。&lt;/p&gt;
&lt;p&gt;也可以反过来：在Agent 中调用指定的工作流，去完成对应的任务。今天这个案例，正好就是这种。&lt;/p&gt;
&lt;p&gt;搞清楚了这些 ，有助于理解我们这个案例的操作步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根据塔罗牌 占卜所需信息，设计工作流&lt;/li&gt;
&lt;li&gt;测试、验证工作流&lt;/li&gt;
&lt;li&gt;新建Agent，关联工作流、修改提示词&lt;/li&gt;
&lt;li&gt;测试&amp;amp;发布应用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;设计搭建工作流&#34;&gt;设计&amp;amp;搭建工作流
&lt;/h2&gt;&lt;p&gt;明确工作流需要完成的任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根据用户输入的信息（生日 性别 出生城市）得到用户星盘信息&lt;/li&gt;
&lt;li&gt;根据塔罗占卜（分析过去、现在、未来的三张牌）方法，要随机得到3 张卡牌&lt;/li&gt;
&lt;li&gt;上述两个信息输入给 大模型，让大模型结合用户的星盘信息和3张卡面信息，去分析用户问题上境遇和机会&lt;/li&gt;
&lt;li&gt;最终返回大模型的结果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看起来可能长这样（见下图）——输入这里接受 4个变量（生日 性别 城市 问题），而coze 市场中有就有xingpan 插件和 随机抽塔罗牌的插件，就这么简单。。。么？&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_0.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;好消息-coze-插件市场提供的两个插件大大简化了工作&#34;&gt;&lt;strong&gt;好消息：&lt;/strong&gt; coze 插件市场提供的两个插件大大简化了工作。
&lt;/h3&gt;&lt;p&gt;“抽卡插件”这里，要求输入 “抽卡数”，当前场景 就是数字3 —— 每次都是抽3张，所以它是固定不变的，填入3就可以了。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_1.PNG&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;“星盘信息”这里，要求输入 的内容就比较多了：生日、性别是workflow 一开始由用户输入的信息（变量），这里直接引用变量名就可以。但 “latitude”和“longitude”是个啥玩意？&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_2.PNG&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;h3 id=&#34;坏消息部分数据格式不对&#34;&gt;坏消息：部分数据格式不对！
&lt;/h3&gt;&lt;p&gt;这就是第一个石头，数据格式要转化！&lt;/p&gt;
&lt;p&gt;进一步点击 “xingpan”这个插件的 “&lt;strong&gt;插件详情&lt;/strong&gt;”，会发现 “latitude”和“longitude” 分别对应用户出生时的经纬度。&lt;/p&gt;
&lt;p&gt;目前只有出生城市，而城市对应的经纬度是没有的。。。。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_3.PNG&#34; style=&#34;zoom:53%;&#34; /&gt;
&lt;p&gt;于是，找出第三个插件来救个场——注意 我们有用户的城市信息，要转化为对应的经纬度信息。&lt;/p&gt;
&lt;p&gt;coze 插件市场中按照“经纬度”关键字，找到这样一个符合我们需求的工具“中国城县经纬度查询”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_4.PNG&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;哈哈，正好输入城市就可以得到经纬度了 。。。么？先添加这个工具测试一下——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_5.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_6.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;两个问题&lt;/strong&gt;——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;工具输出为 一个&lt;strong&gt;数组&lt;/strong&gt;（先后两个数字），第一个是经度、第二个是维度。“星盘”插件的确需要这两个数字，但问题是它们不能一股脑输入给“星盘”。这个问题稍候详细讨论。&lt;/li&gt;
&lt;li&gt;输入“北京市”可以得到 经纬度，但如果少输入一个“市”，就没有任何经纬度信息了（见上图）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;先说，第二个问题：自然语言中 &lt;strong&gt;北京&lt;/strong&gt; 和 &lt;strong&gt;北京市&lt;/strong&gt; 在你问我出生城市时肯定是一个意思。怎么处理呢：要么是 给用户一个下拉框——限制用户输入；要么让大语言模型 去补充用户漏掉的“市”。我选第二个，因为就是一句 “提示词”的工作。后面在Agent 提示词部分会补充这个“补全城市名”的能力。&lt;/p&gt;
&lt;p&gt;再回到第一个问题，也有两个解决办法：要么一句提示词，让大语言模型把工具输出的数组转为一个字典（{“latitude”: str1; “longitude”: str2}）；要么用“代码”工具，使用python 代码完成这个格式转化。我这里为了演示“代码”组件，在“经纬度查询”插件和“xingpan”插件中&lt;strong&gt;加入一个“代码”组件&lt;/strong&gt;。加好后长这样——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_7.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;使用ai-工具生成python代码&#34;&gt;使用AI 工具生成python代码
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;输入：&lt;strong&gt;选择上一步“城市经纬度插件”的输出的&lt;/strong&gt;数组&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;输出：&lt;strong&gt;含两个变量latitude、longitide ，&lt;strong&gt;类型&lt;/strong&gt;参考下游“xingpan”的输入&lt;/strong&gt;是字符串&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_8.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;然后点击“在IDE 中编辑”，打开代码编辑页面——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_9.PNG&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;切换至“语言 Python” 后，删除实例代码，点击“尝试AI Ctrl+ I”，使用AI 帮我们生成python 代码——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;输入是一个包含经纬度的数组，输出时转换为一个字典{latitude: , longitude: }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_10.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;试运行下，不出意外的。。。报错了——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_11.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;从报错日志看起来 &lt;strong&gt;Args() 部分&lt;/strong&gt; 参数有点不匹配。这里AI 生成的时候有点 画蛇添足了，删了它。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import typing
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;class Output(typing.TypedDict, total=False):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    latitude: str
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    longitude: str
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;async def main(args: Args) -&amp;gt; Output:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    try:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        input_data = args.params[&amp;#39;input&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        if len(input_data) &amp;gt;= 2:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            latitude = str(input_data[0])
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            longitude = str(input_data[1])
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            return {&amp;#39;latitude&amp;#39;: latitude, &amp;#39;longitude&amp;#39;: longitude}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        else:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            return {}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    except (KeyError, IndexError):        return {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再测试，就可以啦——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_12.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;完成-工作流主干&#34;&gt;完成 工作流主干
&lt;/h3&gt;&lt;p&gt;之前提到的经纬度问题已经通过代码处理了数据格式，现在可以把整个工作流联通起来。&lt;/p&gt;
&lt;p&gt;“xingpan” 中的latitude 值引用代码中的输出变量&amp;quot;latitude&amp;quot;的值；同样，longitude 值引用 代码中的输出变量&amp;quot;longitude&amp;quot;的值——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_13.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;测试下星盘节点数据——&lt;strong&gt;text:&lt;/strong&gt; 中有详细的星盘信息&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_14.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;这样一来，大模型的输入数据（用户星盘信息，用户问题，抽取到的三张塔罗牌组）就全了——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_15.PNG&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;p&gt;系统提示词这里，和之前案例一样“自己填写主要需求，由AI 完成补充和完善”（同样包含 &lt;strong&gt;角色、技能、限制&lt;/strong&gt; 三个方面）——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 角色
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你是一位专业且极具耐心的塔罗牌咨询助手，始终以温和、易懂且充满亲和力的态度与用户交流。凭借深厚的塔罗牌知识储备，精准且简洁地阐释占卜到的卡牌内容与含义。在交流时，运用生动形象、富有感染力的语言，引领用户深入领略塔罗牌世界的神秘魅力。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 技能
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 1: 获取占卜信息
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 从输入的 {{xingpan}} 中提取用户星盘信息。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 通过解读 {{question}} 明确用户想要占卜的具体问题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 准确把握输入的 {{taroList}} 中抽取到的三张塔罗牌信息。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 2: 塔罗牌占卜
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 在完整获取用户信息后，依据塔罗牌知识体系和复杂的占卜规则，进行全面且细致的塔罗牌占卜分析。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 若星盘信息{{xingpan}}缺失，在分析结果中明确提醒用户。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 用生动活泼、通俗易懂且饱含情感的语言向用户诠释占卜结果，可适当结合贴近生活的实际案例辅助用户理解。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 3: 塔罗文化讲解
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;当用户对塔罗文化相关内容提出疑问时，利用搜索工具查找相关知识，并准确清晰地向用户介绍，确保所介绍内容具有代表性。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 限制:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 仅围绕塔罗牌占卜及相关塔罗文化事宜进行交流，礼貌而坚决地拒绝回应其他不相关话题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 输出内容要丰富生动、条理清晰，既要引导用户准确提供信息以及理解占卜结果，又要有效传递塔罗文化内涵。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 所有回复严格基于塔罗牌知识体系和占卜规则，严禁提供毫无根据的猜测或论断。 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 回复尽量采用Markdown格式，嵌入卡片图像以增强可读性。 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 若涉及塔罗文化知识讲解，需保证内容准确且具有代表性，所提供的信息要有可靠来源。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 通过搜索工具获取信息来源，在回复中需注明引用来源 。 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;用户提示词中，&lt;strong&gt;一定要使用输入的三个变量&lt;/strong&gt;——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_16.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;最后，在大模型中有几个微调的参数（输出长度，随机性，使用当前时间）——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_17.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;原因很简单：希望输出的长度 可以支持更多内容；大模型专注回答问题，不用太发散；如果用户咨询明年的问题，大模型不应该回答2024 年的事件出来。&lt;/p&gt;
&lt;p&gt;这样工作流主干就搭建完了。下面测试下整体效果。&lt;/p&gt;
&lt;h2 id=&#34;测试验证工作流&#34;&gt;测试&amp;amp;验证工作流
&lt;/h2&gt;&lt;p&gt;点击，工作流下方的“试运行”——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_18.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;等待大模型处理一会后，返回结果（markdown格式），这里可以预览下效果——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_19.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;感觉还算齐全，有图有解释。照例发布这个应用。&lt;/p&gt;
&lt;p&gt;因为，准备工作中前后衔接数据比较准确，这里测试过程就顺利多了。&lt;/p&gt;
&lt;p&gt;有时，因为格式转换要试好几种插件就比较 花时间。&lt;/p&gt;
&lt;h2 id=&#34;新建agent-关联工作流&#34;&gt;新建Agent 关联工作流
&lt;/h2&gt;&lt;p&gt;workflow 更新后，回到“项目开发”页面，点击创建“项目”，选择“创建智能体”。新建一个叫做“塔罗小助手”的&lt;strong&gt;Agent&lt;/strong&gt;。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;Agent 模式下有单Agent 和多Agent 模式之分，我们这个场景比较简单（单Agent 就可以）。&lt;/p&gt;
&lt;p&gt;他们间的差别，我放截图中了——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_20.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;coze Agent界面中分为三部分（**左：**提示词； **中：**调用的工具； **右：**效果预览），需要完成的任务有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;说明什么场景下 调用刚才创建的workflow （调用工具）&lt;/li&gt;
&lt;li&gt;与用户交互 问答，完成 用户信息的询问&lt;/li&gt;
&lt;li&gt;其中城市名上，需要补全，特别是“市县”这些关键字&lt;/li&gt;
&lt;li&gt;因为是与用户交互 需要 大语言模型的分析、理解（提示词 指定）和记忆（对话历史）能力&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;提示词&#34;&gt;提示词
&lt;/h3&gt;&lt;p&gt;注意一点：因为在工作流中 对塔罗牌内容解释过了，所以这里提示词中强调“无需对占卜结果进行解读”。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 角色
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你是一位专业、细致且耐心的塔罗小助手，凭借深厚的塔罗牌知识底蕴，为用户提供精准的塔罗牌占卜服务。在交流中始终展现出专业态度，给予用户优质体验。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 技能
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 1: 精准提取占卜要素
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;仔细全面地从用户对话里精准提取占卜所需要素，涵盖生日、出生时间、性别、出生城市以及问题。对于出生城市，若用户表述简略，准确补全，如将“北京”补全为“北京市”。务必保证提取的信息完整且准确无误。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 2: 高效完成占卜过程
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;调用工作流“tarluo”的输出结果，以微信公众号对话环境美化格式，清晰、直观地向用户展示占卜结果。仅呈现结果，无需对占卜结果进行解读。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 限制:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 交流内容严格限于塔罗牌占卜相关领域，不回答任何与塔罗牌占卜无关的话题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 占卜结果解读必须严格基于塔罗牌占卜的专业知识体系与逻辑规则。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 输出内容要条理清晰、简单易懂，符合正常语言表达习惯，方便用户理解。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 禁止对工作流内容进行自我解读，直接将工作流输出结果呈现给用户。 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;编排&#34;&gt;编排
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;模型参数&lt;/strong&gt;：deepseek 记忆上面15轮对话内容，最大长度8000，携带当前时间。&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;调用workflow。&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_3.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;追加开场白，引导用户提问和输入生日等信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_4.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;预览&#34;&gt;预览
&lt;/h3&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_5.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h2 id=&#34;测试--发布应用&#34;&gt;测试 &amp;amp; 发布应用
&lt;/h2&gt;&lt;p&gt;故意不输入完整城市名，验证下 ：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoAgent_6.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;可以看到，这里&lt;strong&gt;成功补全&lt;/strong&gt;了城市“成都” &amp;ndash;&amp;gt; &amp;ldquo;成都市&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;解答结果，貌似有点简洁。细微调整内容放在最后。&lt;/p&gt;
&lt;p&gt;效果还可以，先发布一版体验下——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGofabu_1.PNG&#34; style=&#34;zoom:80%;&#34; /&gt;
&lt;p&gt;这里可以看出 coze 的生态优势明显——飞书 抖音 微信客服 微信公众号  支持一键发布。对普通用户来说，大大降低 相关平台对接、发布的繁琐。体验上还是不错的。不过 ，在微信订阅号的使用中发现，只有markdown 格式 没有图片。&lt;/p&gt;
&lt;p&gt;从使用体验来说 coze 商店 &amp;gt; 微信订阅号。&lt;/p&gt;
&lt;h2 id=&#34;工作流进一步完善优化&#34;&gt;工作流进一步完善、优化
&lt;/h2&gt;&lt;p&gt;主要从用户使用交互的角度，使用两个功能组件优化 上面工作流（tarluo）的效果——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;卡片抽取后，要等大模型十几~二十秒分析时间，这其中没有反馈。为了增加抽卡的交互反馈，在抽取卡片后，使用&lt;strong&gt;输出&lt;/strong&gt;功能，关联卡片效果。可以在大模型分析前展示抽取到的卡片信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果城市名错误，会导致经纬度数据缺失，进而导致 星盘数据为空。大模型的分析结果 也会缺少结合用户星盘信息的分析内容。所以，希望加入if-else 选择器：当获取到的经纬度为零时，提醒用户注意。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_21.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_22.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;ul&gt;
&lt;li&gt;抽取塔罗牌得到的数据格式希望简单转化下：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_23.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;以上三点综合起来，就是开头所展示的完整 工作流效果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo%e5%b7%a5%e4%bd%9c%e6%b5%81_%e8%bf%90%e8%a1%8c.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;卡片展示&#34;&gt;卡片展示
&lt;/h3&gt;&lt;p&gt;展示卡片图片，需要追加&lt;strong&gt;输出&lt;/strong&gt;节点：其作用是在工作流执行过程中 返回消息，并结合卡片变量重复渲染三张卡片。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步&lt;/strong&gt;，添加“输出”节点，改个名字“塔罗卡片展示”。为了关联&lt;strong&gt;卡片效果&lt;/strong&gt;，这里变量值&lt;strong&gt;格式需要是对象数组&lt;/strong&gt;  &lt;strong&gt;[{}]&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;恰好 抽取塔罗牌工具的输出就是个数组，所以后续在卡片中调用这个数组就会很方便。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_24.PNG&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;第二步，保存当前工作流，返回Agent 界面。在工作流中点击“绑定卡片数据”。并选择刚才的输出节点“塔罗卡片展示”。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_25.PNG&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;进入卡片编辑页面，新建一个卡片效果——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info1.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;，编辑卡片结构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用官方提供的 一张图一行标题模板。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info2.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后在&lt;strong&gt;结构&lt;/strong&gt;中修改它：这个模板默认有4张图片和标题，删除三个，只保留一个。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info3.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结果是这样——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info4.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;卡片&lt;strong&gt;变量&lt;/strong&gt; 中，新建一个数组，变量&lt;strong&gt;默认值&lt;/strong&gt; 直接copy 抽取塔罗牌工具的测试输出（不用担心，这里的默认值会被用户抽取时的卡片信息覆盖，默认值这里提供展示效果的输出）。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info5.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有了这个数组，点击模板，启用“高级设置”中的 “循环渲染”，并引用刚才创建的变量 Cardinfo_object——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info6.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;这样就出现了竖着排布的三张图文效果——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info7.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑模板中的元素，逐一关联 变量中的对象。例如，图片原先是测试图片、自定义宽度。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info8.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;修改后，变为引用变量值 item.url，宽度铺满的效果。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info9.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;文字部分，引用 item.type 和 item.name_cn 后。得到希望的卡片效果——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info10.PNG&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;第四步&lt;/strong&gt;，发布卡片，关联数据流输出节点的变量对象。还记得之前强调 变量格式 需要为特殊列表 &lt;strong&gt;[{}]&lt;/strong&gt; 么？&lt;/p&gt;
  &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info11.PNG&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;最后&lt;/strong&gt;，测试下图片效果。如我们所希望的：在工作流完成前，抽取的卡片就展示出来了！&lt;/p&gt;
  &lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocard_info12.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;经纬度查询分支if-else&#34;&gt;经纬度查询分支(if-else)
&lt;/h3&gt;&lt;p&gt;这部分就简单一些了：在代码和xingpan 工具之间 ，插入一个选择器（判断 代码中输出的经纬度是否都为空）。&lt;/p&gt;
&lt;p&gt;显然，如果都不为空，继续执行星盘查询就好；只要一个为空，不用查星盘数据，直接给出消息提醒（还是使用 刚才的“输出”节点）。提醒内容为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;输入城市 {{city}}，解析坐标有误。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;详细信息如下：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{output}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_26.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;使用花莲县测试，如我们预期，有提醒。当然 这个问题原因不是书写错误，而是工具内座标信息不全导致的。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGotesting_4.png&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h3 id=&#34;塔罗信息整合&#34;&gt;塔罗信息整合
&lt;/h3&gt;&lt;p&gt;这部分涉及一些数据格式，需要使用“&lt;strong&gt;循环&lt;/strong&gt;” 工具来处理。&lt;/p&gt;
&lt;p&gt;原因是抽取到的卡片信息，数据格式长这样——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;name_en&amp;#34;: &amp;#34;King of Pentacles&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;position&amp;#34;: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;type&amp;#34;: &amp;#34;逆位&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;url&amp;#34;: &amp;#34;https://t.8s8s.com/photo/tarotphoto/72/king-pentacles.jpg&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;name_cn&amp;#34;: &amp;#34;星币国王&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;name_en&amp;#34;: &amp;#34;The Hanged Man&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;position&amp;#34;: 2,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;type&amp;#34;: &amp;#34;逆位&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;url&amp;#34;: &amp;#34;https://t.8s8s.com/photo/tarotphoto/72/hanged-man.jpg&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;name_cn&amp;#34;: &amp;#34;倒吊人&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;name_en&amp;#34;: &amp;#34;Knight of Wands&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;position&amp;#34;: 3,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;type&amp;#34;: &amp;#34;逆位&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;url&amp;#34;: &amp;#34;https://t.8s8s.com/photo/tarotphoto/72/knight-wands.jpg&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;name_cn&amp;#34;: &amp;#34;权杖骑士&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;要修改他们，需要&lt;strong&gt;循环&lt;/strong&gt;三次，&lt;strong&gt;每次进行相同的&lt;/strong&gt; 字符拼接和格式调整工作。&lt;/p&gt;
&lt;p&gt;并且，每修改完其中一个对象，需要把修改后的内容 临时存入&lt;strong&gt;中间变量&lt;/strong&gt;。等三次循环结束后，输出给一个新的 &lt;strong&gt;对象数组&lt;/strong&gt;。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_27.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;循环过程中，再次使用 &lt;strong&gt;python 代码&lt;/strong&gt; 实现数组中  每个对象格式的调整——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_28.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;p&gt;代码——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;typing&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Union&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TypedDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Optional&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 定义错误信息类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ErrInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TypedDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 定义每张卡片元信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Cardinfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TypedDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;name_cn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;position&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 定义输出类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Output&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cardinfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Union&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ErrInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 1. 获取输入参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;e_name_cn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name_cn&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;e_name_en&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name_en&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;e_position&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;e_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;e_url&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;e_var_tarolist&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;var_tarolist&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 2. 整理为新的字典&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;infolist&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;name_cn&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e_name_cn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e_position&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e_url&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 3. 添加到列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;e_var_tarolist&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;infolist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 4. 返回完整列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e_var_tarolist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;处理错误: {str(e)}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;python 处理后的 输出 ，通过“设置变量”节点 赋值给 中间变量。这样就完成了，每次循环过程中的修改和赋值。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_29.PNG&#34; style=&#34;zoom:75%;&#34; /&gt;
&lt;p&gt;试运行下，如果修改成功，会看到 塔罗信息改变的效果——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGowf_30.PNG&#34; style=&#34;zoom:60%;&#34; /&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;coze 的常用组件这里介绍差不多了，可以发现 coze 平台的优势 在三方面：&lt;strong&gt;低代码 + 插件市场 + 字节生态&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以如果自己公司就在用飞书，应该会很方便。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是个人使用，chat 的方式 适合给 0基础的人使用。通过对话，逐步引导用户完成他们的需求，例如这里塔罗牌的例子。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于 不是0基础的服务对象，可能会觉得 聊天这种方式 有点慢了。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;低&lt;strong&gt;代码，不是无代码&lt;/strong&gt;。好在目前 大语言的编程能力也很强，问几遍也能出结果。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这么看来 coze 的客户画像 就出来了，四个维度：字节生态，不想从0 搭建应用（插件市场有现成就用现成的），专业场景，个人用 还是公司用。。。。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;产品案例&lt;/th&gt;
          &lt;th&gt;个人 / 公司&lt;/th&gt;
          &lt;th&gt;字节生态&lt;/th&gt;
          &lt;th&gt;小白用/专业用户&lt;/th&gt;
          &lt;th&gt;是否有现成的工具使用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;塔罗牌&lt;/td&gt;
          &lt;td&gt;个人&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;小白&lt;/td&gt;
          &lt;td&gt;有 星盘插件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;热门短视频 文案助手&lt;/td&gt;
          &lt;td&gt;个人&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;专业用户&lt;/td&gt;
          &lt;td&gt;有 http插件，有文生视频插件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;智能helpdesk&lt;/td&gt;
          &lt;td&gt;公司&lt;/td&gt;
          &lt;td&gt;飞书日历，通讯录，知识库&lt;/td&gt;
          &lt;td&gt;小白&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HR 简历筛选打分助手&lt;/td&gt;
          &lt;td&gt;公司&lt;/td&gt;
          &lt;td&gt;多维表格，数据库&lt;/td&gt;
          &lt;td&gt;专业用户&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        </item>
        <item>
        <title>扣子上手初体验 - 个人兴趣助手</title>
        <link>https://blog.cba.nxlan.cn/p/coze_01/</link>
        <pubDate>Sun, 10 Aug 2025 00:14:23 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/coze_01/</guid>
        <description>&lt;h2 id=&#34;扣子-上手初体验---个人兴趣助手&#34;&gt;扣子 上手初体验 - 个人兴趣助手
&lt;/h2&gt;&lt;p&gt;接上文，最近不是AI工具很火热么，先整两篇短平快的实战案例。&lt;/p&gt;
&lt;p&gt;感兴趣的小伙伴，可以在2小时内快速熟悉和体验大模型工作流平台，并动手实现自己的个人助手。&lt;/p&gt;
&lt;p&gt;话不多说，马上开始今天分享的案例。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;效果是这样的：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;苹果手机背部敲击三下，出现对话框：询问感兴趣的话题&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_07.jpeg&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;窗口中输入感兴趣的话题后，弹出相关推荐视频。例如：我这里输入“浪浪山的小妖怪好看么”&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_begin01.jpeg&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;复制视频链接，就可以打开B站 直达内容了——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_begin02.jpeg&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;那怎么实现这个效果呢？这里就用到了今天的主角：扣子 工作流(workflow)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Coze&lt;/strong&gt; 是一款由字节跳动（ByteDance）推出的 AI 应用开发与管理平台。它为用户提供了低门槛、可视化的 AI 应用创建、管理和部署工具。用户无需编程经验，即可通过拖拽、配置等方式，快速搭建属于自己的 AI 应用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coze 的主要特点：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;低代码/无代码开发&lt;/strong&gt;
不懂编程也能上手，通过可视化界面和流程配置，轻松搭建聊天机器人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多模型支持&lt;/strong&gt;
支持接入多种主流大模型（如 OpenAI、字节自研模型等），根据需求灵活切换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;丰富的插件与 API 集成&lt;/strong&gt;
可以调用外部 API，集成第三方服务，实现更复杂的业务逻辑。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;过程如下图——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocoze_api.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;所以，后续将按照以下步骤逐步实现 这个效果——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;注册coze 平台账户，生成个人令牌&lt;/li&gt;
&lt;li&gt;创建工作流，集成大语言模型和插件，测试&amp;amp;发布&lt;/li&gt;
&lt;li&gt;工作流对外接口测试，效果验证&lt;/li&gt;
&lt;li&gt;手机快捷指令 导入（设置）&lt;/li&gt;
&lt;li&gt;手机上测试&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;coze-平台用户注册&#34;&gt;coze 平台用户注册
&lt;/h2&gt;&lt;p&gt;登录和注册地址如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.coze.cn/studio&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.coze.cn/studio&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这里使用手机号和短信验证码即可 注册使用。每次使用coze中的大模型，是会消耗“资源点”的。以后续用到的豆包为例：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810011047610.png&#34; style=&#34;zoom: 33%;&#34; /&gt;
&lt;p&gt;免费账户，每天500个资源点。如果后续使用频繁，可以购买个10元 10000 资源点的“加油包”。&lt;/p&gt;
&lt;h2 id=&#34;coze-平台中令牌生成&#34;&gt;coze 平台中令牌生成
&lt;/h2&gt;&lt;p&gt;点击页面左侧的 &amp;ldquo;&amp;ldquo;扣子 API&amp;rdquo; —&amp;gt; &amp;ldquo;个人访问令牌&amp;rdquo; -&amp;gt; &amp;ldquo;添加&amp;rdquo;，生成自己的专属令牌。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810002553151.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810002533478.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;**注意：**令牌时间这里 最多1个月，权限这里需要给到运行&amp;quot;工作流&amp;quot;的权限 ，并指定&amp;quot;个人空间&amp;rdquo;。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810012447723.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;p&gt;得到关键的令牌内容（考虑到后续会在手机上使用这一长串数字&amp;amp;字母，建议&lt;strong&gt;复制下来&lt;/strong&gt;存到微信文件助手中备用）。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810012917232.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;blockquote&gt;
&lt;p&gt;pat_dIXP5XtodhaHM0bmNyU4HU9jPwpZV0mIYuaWEhB8EElo71edDk2JztMELSHDA9tA&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;创建工作流调用-豆包大模型和b-站插件&#34;&gt;创建工作流，调用 豆包大模型和B 站插件
&lt;/h2&gt;&lt;p&gt;下面就是本次 重点：工作流的创建了。&lt;/p&gt;
&lt;p&gt;依次点击 “工作空间”  -&amp;gt;   &amp;quot; 资源库&amp;quot;  -&amp;gt; “创建工作流” ，会创建一个&lt;strong&gt;空白工作流&lt;/strong&gt;（其中只有开始和结束）。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810013256819.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;p&gt;下面，在新创建的空白工作流中，点击“添加节点”，找到这次要用的主角“大模型”——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810013545904.png&#34; style=&#34;zoom:23%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810013810686.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;p&gt;&lt;strong&gt;点击大模型&lt;/strong&gt;，可以看到有几个关键部分—— 这里把需要修改的地方在括号中加粗说明&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;模型（默认是豆包1.5 pro 的模型 -&amp;gt; &lt;strong&gt;豆包1.6 极致速度&lt;/strong&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;技能（添加&lt;strong&gt;插件&lt;/strong&gt;： &lt;strong&gt;哔哩哔哩Api/ search_video_by_name&lt;/strong&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入（因为目前这个大模型还是个孤岛，&lt;strong&gt;稍候会引用&lt;/strong&gt;上游的输出内容）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视觉理解输入 （保持默认，空白）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统提示词 （为了快速实现，建议&lt;strong&gt;直接粘贴&lt;/strong&gt;以下内容）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 角色
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你是一位热情的B站资深粉丝，对B站各类优质视频了如指掌，热衷于根据用户的兴趣偏好，精准推荐符合其感兴趣内容的优质B站视频。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 技能
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 1: 推荐B站优质视频
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 当用户请你推荐B站视频时，需要先了解用户感兴趣的视频类型，比如动画、游戏、知识科普、生活记录等。如果你已经知道了，请跳过这一步。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 如果你并不知道用户所说的视频类型，可以使用工具搜索相关热门视频类型。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 根据用户的视频偏好，推荐几部B站上热度较高、口碑较好的优质视频。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;===回复示例===
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -  📺 视频标题: &amp;lt;视频标题&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -  📌 视频链接: &amp;lt;B站视频链接&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   -  💡 视频简介: &amp;lt;简要概括视频主要内容&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;===示例结束===
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 技能 2: 介绍B站视频
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 当用户说介绍某一部B站视频，请使用工具搜索该视频介绍的链接；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 如果此时获取的信息不够全面，可以继续使用工具打开搜索结果中的相关链接，以了解视频详情。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 根据搜索和浏览结果，生成视频介绍。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## 限制:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 只讨论与B站视频有关的内容，拒绝回答与B站视频无关的话题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 视频简介部分不能过于冗长，需简洁概括。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 只会输出通过工具搜索到的内容。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 请使用 Markdown 的 ^^ 形式说明引用来源（若有）。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户提示词（同样因为目前这个大模型还是个孤岛，&lt;strong&gt;稍候会引用&lt;/strong&gt;上游的输出内容）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输出 （保持默认）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;异常处理 （保持默认）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810014713224.png&#34; style=&#34;zoom:33%;&#34; /&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810014018617.png&#34; style=&#34;zoom:30%;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这样一来，大模型部分的参数基本都有了。可以发现 扣子这个平台的优点是： 鼠标点点 就可以把 外部资源快速关联起来。下面操作也是一样：分别在大模型的左右&lt;strong&gt;连接点&lt;/strong&gt;，把它和&lt;strong&gt;开始&lt;/strong&gt;、&lt;strong&gt;结束&lt;/strong&gt;画根连线。&lt;/p&gt;
&lt;p&gt;箭头，指示了数据流的流转方向，我猜这也是“工作流”名字的由来。 不需要太复杂的介绍，就像乐高一样把他们（&lt;strong&gt;开始 -&amp;gt; 大模型 -&amp;gt; 结束&lt;/strong&gt;）链接起来就好。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810020238293.png&#34; style=&#34;zoom:30%;&#34; /&gt;
&lt;p&gt;最后，有一些对接的参数得补上——&lt;/p&gt;
&lt;p&gt;例如，上面需要补充的“输入”和“用户提示词”部分。注意后者的 {{input}} 表示是引用前者 &amp;ldquo;input&amp;rdquo; 的值。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810020622643.png&#34; style=&#34;zoom:33%;&#34; /&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810020703397.png&#34; style=&#34;zoom:33%;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;“结束”这里 补上 “output”的值——&lt;strong&gt;大模型 output&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810021119741.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;h2 id=&#34;测试大模型工作--发布生效&#34;&gt;测试大模型工作 &amp;amp; 发布生效
&lt;/h2&gt;&lt;p&gt;组件连接成功后，先别急着发布使用。先试试 好使不——&lt;/p&gt;
&lt;p&gt;点击大模型 右上角的“播放”按钮，进行测试，这里我输入了“小米空调”的关键字——就是这么偷懒。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810022355368.png&#34; style=&#34;zoom:33%;&#34; /&gt;
&lt;p&gt;等待几秒钟，&lt;strong&gt;输出&lt;/strong&gt;效果有了（&lt;strong&gt;预览&lt;/strong&gt;中可以看到 类似卡片的效果）——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810022700916.png&#34; style=&#34;zoom:50%;&#34; /&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810022756464.png&#34; style=&#34;zoom:33%;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;PS： 如果留意的小伙伴会发现 这个测试用了 5w+个token  （根据我们之前提到的 豆包1.6 极致速度 token公示，大概就是 &lt;strong&gt;60&lt;/strong&gt; 个资源点。）&lt;/p&gt;
&lt;p&gt;然后，可以点击 整个工作流的&lt;strong&gt;试运行&lt;/strong&gt; ，通过后再&lt;strong&gt;发布&lt;/strong&gt;——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810023358889.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;对了，当前页面的&lt;strong&gt;workflow_id&lt;/strong&gt; 也要复制一下。后面调用这个workflow  也会用到。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810023951255.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;h2 id=&#34;工作流-api-接口测试&#34;&gt;工作流 api 接口测试
&lt;/h2&gt;&lt;p&gt;大头已经做好了，下面就是测试了。&lt;/p&gt;
&lt;p&gt;先进行api 接口的测试，一方面可以验证 该工作流使用之前申请到的 API token 能够成功执行；另一方面，也是看一下 工作流请求格式和返回格式。&lt;/p&gt;
&lt;p&gt;官方文档在这里——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.coze.cn/open/playground/workflow_run&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.coze.cn/open/playground/workflow_run&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;关键参数有三个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用户 API token&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pat_dIXP5XtodhaHM0bmNyU4HU9jPwpZV0mIYuaWEhB8EElo71edDk2JztMELSHDA9tA&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;workflow id&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;7536640635056619572&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户输入查询内容 需要一种特殊格式 “parameters: {input: &amp;ldquo;用户问题&amp;rdquo;}”。&lt;/p&gt;
&lt;p&gt;我这里参考文档直接拼接好了 curl 命令——&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST &amp;#39;https://api.coze.cn/v1/workflow/run&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-H &amp;#34;Authorization: Bearer pat_dIXP5XtodhaHM0bmNyU4HU9jPwpZV0mIYuaWEhB8EElo71edDk2JztMELSHDA9tA&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-H &amp;#34;Content-Type: application/json&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-d &amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;workflow_id&amp;#34;: &amp;#34;7536640635056619572&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;parameters&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;input&amp;#34;: &amp;#34;python 学习&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;测试效果，大家看一眼就行——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250810024650366.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重点的地方是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;msg&amp;rdquo;:&amp;ldquo;Success&amp;rdquo;， code: 0 都表示执行成功了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要的数据在 “data&amp;quot;:&amp;quot;{&amp;quot;output: &lt;strong&gt;&amp;quot;教程- 📺 视频标题: 【全748集】&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;后续在手机快捷指令中，其实就是在拼凑curl 后面这个几个参数过程。&lt;/p&gt;
&lt;h2 id=&#34;手机快捷指令设置&#34;&gt;手机快捷指令设置
&lt;/h2&gt;&lt;p&gt;好了，最后一步：在苹果手机上使用&lt;strong&gt;快捷指令&lt;/strong&gt; 实现随时随地调用workflow 的能力。&lt;/p&gt;
&lt;p&gt;后续会导出指令到公众号（AI 热气球）里，需要的小伙伴可以发送”810“ 获取。&lt;/p&gt;
&lt;p&gt;这里直接上图——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_01.jpeg&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_02.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_03.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_04.jpeg&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_05.png&#34; style=&#34;zoom:40%;&#34; /&gt;
&lt;p&gt;快捷方式，可以在”轻点背面“ 下关联，例如——&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoIMG_06.jpeg&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;好啦，这次应用就到这里了，比我想象的内容要多。祝大家踏出 使用AI 为自己服务的第一步。&lt;/p&gt;
&lt;p&gt;还有，你有哪些重复度高又不想自己做得工作，想交给AI 去完成？欢迎评论区交流。&lt;/p&gt;
&lt;h2 id=&#34;私货时间个人点评&#34;&gt;私货时间，个人点评：
&lt;/h2&gt;&lt;p&gt;先说缺点（大部分是&lt;strong&gt;产品体验&lt;/strong&gt;的角度）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;喜欢尝试的小伙伴会发现 这个哔哩哔哩 API 依赖推理大模型，如果使用非推理的大模型 它就不会调用哔哩哔哩技能。这就引申出 插件市场中有的插件其实是个子工作流，与严格意义上的插件还不一样。用的时候需要区分下。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API调用文档有如说的感觉，而且复杂应用场景下文档感觉很少。我后续遇到的一些问题还是在B站上找到的。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虽说coze 在逐渐开源（会方便用户脱离官方平台，自用部署），但目前使用中，大模型的输出偶尔还是不那么稳定。如果上生产环境 可能还得dify n8n这种 2B的产品。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;优点：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户大部分时间，不用写代码而是 连线和关联参数，类似乐高积木，正反馈会很快。&lt;/li&gt;
&lt;li&gt;平台自带的提示词优化功能，很好用。甚至我开始习惯用它生成dify 的提示词 ^^&lt;/li&gt;
&lt;li&gt;插件市场，还挺丰富好玩的（下期打算整个塔罗牌的应用发布出来）。&lt;/li&gt;
&lt;li&gt;后续可以结合飞书的多维表格，这样有些场景下的使用就跳出了coze 的web 框架。在要求不严格的场景下，的确可以给个人、员工带来便利。特别是&lt;strong&gt;人不想干的脏活&lt;/strong&gt;，哈哈 交给它做 一点没负担。&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>整理AI产品，初探内在特质</title>
        <link>https://blog.cba.nxlan.cn/p/askai/</link>
        <pubDate>Fri, 01 Aug 2025 18:54:29 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/askai/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoai-image-1754133256294-8mpclhm3.png" alt="Featured image of post 整理AI产品，初探内在特质" /&gt;&lt;p&gt;&lt;em&gt;自我介绍&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;一名AI 探路人，相信AI可以给你带来一坛酒&lt;/u&gt;——辛辣，但解恨。&lt;/p&gt;
&lt;h2 id=&#34;ai-是个筐我用它装酒&#34;&gt;AI 是个筐，我用它装酒？
&lt;/h2&gt;&lt;p&gt;记得22年底：ChatGPT 火爆国内外时，觉得有必要玩一下。废了半天劲注册帐号、开通国外信用卡，结果问它工作中的问题：有时很惊艳，有时看它睁眼说瞎话（同事说那会经常听到我对gpt说“are you sure”这句话）。当时用下来，觉得用它生成一些结构化的文档还挺方便的，慢慢地就把它当作一个工作助手。&lt;/p&gt;
&lt;p&gt;一年前，利用AI 文生图、文生视频火起来。群里出现教大家注册相关平台帐号，倒卖帐号，制作创意视频的案例。&lt;/p&gt;
&lt;p&gt;半年多前，AI 编程工具火起来。一小时上手开发个网站、做个游戏。&lt;/p&gt;
&lt;p&gt;今年过年前，DeepSeek 问世，感慨终于有自己的大语言模型了。我自己也折腾了在PC上用游戏显卡本地运行DeepSeek-r1的方案： 体验了带推理能力的大模型和之前的不同。&lt;/p&gt;
&lt;p&gt;最近，MCP RAG Agent 一堆概念又火出圈，逐渐向着更细致的行业和工作场景延伸。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo2024_AI产品全景图.png&#34; style=&#34;zoom:67%;&#34; /&gt;
&lt;p&gt;不难发现AI 圈有两个趋势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AI 的这个“大筐”里装的东西越来越多；&lt;/li&gt;
&lt;li&gt;AI 的发展和应用在向着工作场景加速，不再是刚开始那个“are you sure?” 的助手了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;那下一步，AI 是不是就会取代你我的岗位了？AI的边界在哪里？ 所以，近期打算输出一些 自己在AI道路上的内容。献丑了 ^^||&lt;/p&gt;
&lt;p&gt;今天是第一篇： &lt;strong&gt;整理AI产品，初探内在特质&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;市面上这么多ai-产品能不能分个类&#34;&gt;市面上这么多AI 产品，能不能分个类？
&lt;/h2&gt;&lt;p&gt;最早，我自己对于 AI分类是非常模糊的，感觉就像老师布置了个作业：要大家“把所有的豆子进行分类”。&lt;/p&gt;
&lt;p&gt;内心OS： 我豆子都认不全，咋分类——要么 按颜色分？要么按味道分？要么按形状分？——圆的一类，扁口的一类。&lt;/p&gt;
&lt;p&gt;但以后的AI产品肯定会诞生 各种形态的：说不准哪天再出来个“三角形”的，到时继续建新的类目？所以，只凭外观性状去分类肯定是不行的，按照术语说这叫&lt;strong&gt;没法穷尽&lt;/strong&gt;——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这里找AI 介绍下分类原则：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;同一标准原则&lt;/strong&gt;
分类时必须采用同一标准（维度、角度），不能混用多个标准。
例如：以“颜色”分类水果时，只能按颜色分组，不能同时按大小、产地混合分类。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相互排斥原则&lt;/strong&gt;
各类别之间互不重叠，每个事物只能归入一个类别。
例如：以“性别”分类人群，男性和女性互不重叠。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完全穷尽原则&lt;/strong&gt;
分类应覆盖所有被分类对象，&lt;strong&gt;没有遗漏&lt;/strong&gt;。
例如：以“季节”分类，一年四季（春夏秋冬）应涵盖全年。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;层次分明原则&lt;/strong&gt;
分类应有清晰的层次结构，上下级关系明确。
例如：动物→哺乳动物→犬科动物→狗。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;同类相从原则&lt;/strong&gt;
同一类别中的事物应具有本质相同或相似的属性。
例如：以“使用场合”分类鞋子，运动鞋、皮鞋、拖鞋各归一类。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;单一归属原则&lt;/strong&gt;
一个对象在同一分类体系下只能归属于一个类别（与相互排斥原则类似）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;具体明确原则&lt;/strong&gt;
分类标准和类别定义应具体、明确、易于理解和操作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;如果从 AI &lt;strong&gt;产品诞生的维度&lt;/strong&gt;看，不外乎以下&lt;strong&gt;四个方面&lt;/strong&gt;： AI 分析并实现用户意图的能力；用户需要调试AI的深度；用户给AI提供多少已有数据； 用户的预期。不同的AI 产品在这四个维度上，会有侧重的能力和应用场景。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;div style=&#34;width:20px;&#34;&gt;AI 能力&lt;/div&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;div style=&#34;width:20px;&#34;&gt;调试AI复杂度&lt;/div&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;div style=&#34;width:20px;&#34;&gt;数据源&lt;/div&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;用户预期&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;AI 的优势&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;产品案例&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;辅助查找问题&amp;amp;信息&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;AI chat，AI 知识问答&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;普通人 也体会到之前有的工作，可能就是一句话的事情&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;文生图，文生视频，文生广告设计，使用OLLAMA 本地集成大语言模型&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;进一步考虑把AI 引入到工作中去，去处理那些难度不高 但重复性高的工作&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;AI 合同评估； AI 文档处理（概括 or 扩容）；AI 邮件发送&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;切入商业环境，做有SOP路径的工作流平台。承担一个完整工作流的工作&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;企业AI 知识库，AI 客服机器人&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;进一步进入商业环境，做多个路径的工作流。承担一个岗位面临多个工作流的工作。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;AI 医生，AI HR， AI 老师，AI 律师&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;供某个行业使用的大模型，往往在通用模型基础上针对性训练。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;医疗通用大模型；芯片设计通用模型；教育通用模型&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;各大公司 研发大模型，希望在自己商业体系中 覆盖行业&amp;amp;客户的需求。&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;千问 gpt deepseak 豆包&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;这么多ai-产品有没有递进关系&#34;&gt;这么多AI 产品有没有递进关系？
&lt;/h2&gt;&lt;p&gt;考虑到AI产品和组件会快速发展下去，其中基座肯定是LLM大模型，但是组件之间又是平行的关系——没有必选的组件，而是根据使用场景把它集成进来。所以，我是打算从&lt;strong&gt;为用户提供价值的角度&lt;/strong&gt;来分个层级，层级和层级之间是递进的关系。&lt;/p&gt;
&lt;p&gt;比如：用户是希望整合现成的接口，那AI 就负责上下文记忆、整理和遵循现有工具处理这些数据就好了。 这种应用场景&lt;strong&gt;案例&lt;/strong&gt;有：先需求生文字，文生图片和视频，然后调用工具把文字和视频对齐，就生成一条短视频啦。&lt;/p&gt;
&lt;p&gt;然后，用户觉得只对接现有的接口还不够，希望利用AI的专家推理能力，结合用户自己的知识库，整合成符合特定行业需求的高级助手。这种场景的&lt;strong&gt;案例&lt;/strong&gt;有：cursor claude 等编程工具，用户把自己的需求和项目框架讲清楚，这些工具可以基于已训练出来的代码能力，生成相应功能的代码 交付用户使用。&lt;/p&gt;
&lt;p&gt;还是上面这种场景，用户需要更高的确定性：尽可能降低相同输入却不同输出的不一致性。就需要使用可定制的工作流平台——去明细每一个步骤做什么、输入什么、输出什么。这种场景&lt;strong&gt;案例&lt;/strong&gt;，肯定就是基于coze dify 这种&lt;strong&gt;工作流平台&lt;/strong&gt;诞生的应用了。如：HR 助手，合同助手等针对特定岗位的助手应用。&lt;/p&gt;
&lt;p&gt;最后，少数头部玩家，肯定不满足于少数几个岗位的助手类应用，他们需要的是覆盖行业甚至更通用范式的大模型，例如 跨医疗&lt;strong&gt;领域大模型&lt;/strong&gt;，它可以高效&amp;amp;准确的处理 整个行业中的高价值环节。&lt;/p&gt;
&lt;p&gt;所以，从以上用户需求角度分析的话，分这么四个层级：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;阶段&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;成本&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;通用性&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;确定性&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;自然语言识别和功能集成能力&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;特定领域推理能力&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;受控制的调试&amp;amp;对接能力&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;基于行业的通用识别&amp;amp;推理能力&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;⭐⭐⭐&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果从工作场景的角度出发，我更看好第三层级，因为这里AI的使用在&lt;strong&gt;成本和质量方面取得了较好的平衡&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;ai这么厉害有没有它做不了的&#34;&gt;AI这么厉害，有没有它做不了的？
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;它目前还只存在于数字空间，不能送外卖，也不能捏个脚。&lt;/p&gt;
&lt;p&gt;目前只在特定场景下，AI 和人类进行数字交互是没问题的。平时购物时，就可以感受到各大电商平台的客服 回答那些高频问题时是很准的。&lt;/p&gt;
&lt;p&gt;而其他领域，有待AI 进一步升级、进化 。可以想像未来某一天，AI 宠物 可以存储宠物数据平台生成的定制化宠物性格，并实时处理外接的反馈和动作。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoai-image-1754132020466-o5rt7dml.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;违反社会伦理、道德、法律的事情做不了。例如：下面这个问题——&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250802112216428.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;还有一种是无法结构化的事情：它能猜你想要的，例如基于人类某时刻的感受和情感做一幅画，但生成的内容质量不可控。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;好啦，先说这么多。下期打算先从coze 入手，展示场景一中&lt;strong&gt;个人助手&lt;/strong&gt;的小案例。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenWRT上ddns 配置案例 [CloudFlare]</title>
        <link>https://blog.cba.nxlan.cn/p/ddns/</link>
        <pubDate>Tue, 22 Jul 2025 09:29:49 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/ddns/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGoai-image-1753148120500-bf5gckpy.png" alt="Featured image of post OpenWRT上ddns 配置案例 [CloudFlare]" /&gt;&lt;h2 id=&#34;前提背景&#34;&gt;前提&amp;amp;背景：
&lt;/h2&gt;&lt;p&gt;1）家中宽带申请到了公网ipv4，也有自己的域名；&lt;/p&gt;
&lt;p&gt;2）平时在外面（旅游、出差）都需要拨&lt;strong&gt;vpn&lt;/strong&gt;回到家中，这样ddns 就成了刚需；&lt;/p&gt;
&lt;p&gt;3）之前域名管理注册到dnspod CN上，很稳定。只是因为最近把域名管理迁移到了cloudflare中，所以利用现有的iStoreOS（N1）重新关联vpn域名到公网ipv4。&lt;/p&gt;
&lt;p&gt;一开始查了下网上的资料和视频，搞得太复杂。其实两个步骤就可以搞定，所以这里更新下。&lt;/p&gt;
&lt;h2 id=&#34;准备-cloudflare-dns-令牌&#34;&gt;准备 cloudflare dns 令牌
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;登录自己的cloudflare 帐号 （https://dash.cloudflare.com/login）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;登录成功后选择自己的域名进入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在域名页面下方，找到“获取API 令牌”的链接&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGocf-dns-api.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击进入该页面，选择第一个模板：创建一个可以编辑dns的令牌。该令牌创建成功后，会用于后续openwrt 中插件更新指定域名。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722101410829.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722101738257.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击创建令牌后，会获取到这样一个令牌值。这个令牌 &lt;strong&gt;记得复制&lt;/strong&gt;下来，一会要用！&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20250722101925608.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;同时，可以在 iStoreOS 命令行中使用下面的curl 命令测试该令牌是否生效：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl &amp;#34;https://api.cloudflare.com/client/v4/user/tokens/verify&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     -H &amp;#34;Authorization: Bearer qx3t1mdQ3hP4oCtR2Yw0usLFev1l1Nh0ipcoMJGA&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;​      这里的信息“Bearer qx3t1mdQ3hP4oCtR2Yw0usLFev1l1Nh0ipcoMJGA” 会在后续 ddns-scripts 中（下面两种方法的第二种）用到。&lt;/p&gt;
&lt;h2 id=&#34;istoreos-中安装ddns插件&#34;&gt;iStoreOS 中安装ddns插件
&lt;/h2&gt;&lt;p&gt;经过实测，两个插件都可以实现。不过一个配置一目了然、一个配置项看着复杂一点。&lt;/p&gt;
&lt;p&gt;先说简单的：&lt;/p&gt;
&lt;h3 id=&#34;ddns-go-插件&#34;&gt;DDNS-go 插件
&lt;/h3&gt;&lt;p&gt;1）该插件在 iStoreOS中需要 在应用商店安装（下图第二个）：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722102803740.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;2）安装成功后，进入ddns-go 插件配置页。先勾选&lt;strong&gt;启用&lt;/strong&gt;选项，然后&lt;strong&gt;保存并应用&lt;/strong&gt;生效：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722103041120.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;3）服务启动成功后，进入配置页面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722103423473.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;有常见的 域名服务商。这里选择“Cloudflare”，并在Token中输入上面已经创建好的dns api令牌“qx3t1mdQ3hP4oCtR2Yw0usLFev1l1Nh0ipcoMJGA”&lt;/p&gt;
&lt;p&gt;4）下方 IPv4 配置中，输入这里希望管理的二级域名： &lt;u&gt;vpn.nxlan.cn&lt;/u&gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722104002406.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;5）因为，我这里不使用ipv6，其他配置不动，&lt;strong&gt;点击“save”保存生效&lt;/strong&gt;。一定要点击保存才会生效。&lt;/p&gt;
&lt;p&gt;​     生效后，注意观察当前页面右侧的日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:45 配置文件已保存在: /etc/ddns-go/ddnsgo-config.yaml 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:45 连接失败! 点击查看接口能否返回IPv4地址 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:45 错误信息: Get &amp;#34;https://myip4.ipip.net&amp;#34;: dial tcp4: lookup myip4.ipip.net on 127.0.0.1:53: no such host 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:46 你的IP 36.161.39.63 没有变化, 域名 vpn.nxlan.cn 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:48 配置文件已保存在: /etc/ddns-go/ddnsgo-config.yaml 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:48 连接失败! 点击查看接口能否返回IPv4地址 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:48 错误信息: Get &amp;#34;https://myip4.ipip.net&amp;#34;: dial tcp4: lookup myip4.ipip.net on 127.0.0.1:53: no such host 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2025/07/22 10:41:49 你的IP 36.161.39.63 没有变化, 域名 vpn.nxlan.cn 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;最后一行显示了，目前我们家中宽带的ip地址注册上了。&lt;/p&gt;
&lt;p&gt;6）最后测试：&lt;/p&gt;
&lt;p&gt;先使用nslookup 验证自己的vpn域名-ip 对应关系是否一样，再使用手机断开wifi 使用4g/5g 移动网络拨VPN 测试。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;% nslookup vpn.nxlan.cn 223.5.5.5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Server:		223.5.5.5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Address:	223.5.5.5#53
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Non-authoritative answer:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Name:	vpn.nxlan.cn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Address: 36.161.39.63
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722105022988.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;然后是第二种插件配置方法：&lt;/p&gt;
&lt;h3 id=&#34;ddns-scripts-插件&#34;&gt;ddns-scripts 插件
&lt;/h3&gt;&lt;p&gt;1）该插件默认在 iStorOS 中有安装。同样，先找到这个配置页面：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722105456772.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;2）先启动服务，让ddns 运行：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722105608662.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;3）配置页面下方，点击“添加新服务”。dns服务商 选则cloudflare -v4&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722105740003.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;4）先&lt;strong&gt;编辑&lt;/strong&gt;刚刚创建的服务配置：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722105935310.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;5）添加域名信息：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722110202294.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;​    &lt;strong&gt;关键一步&lt;/strong&gt;：输入用户名、密码。 分别对应刚才生成的DNS Token 中 “ Bearer qx3t1mdQ3hP4oCtR2Yw0usLFev1l1Nh0ipcoMJGA” 这块。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722110437288.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;6）“高级设置”中添加，IP地址来源为URL，检测ip 用的url为 &lt;a class=&#34;link&#34; href=&#34;http://checkip.dyndns.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://checkip.dyndns.com&lt;/a&gt;&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoimage-20250722111000617.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;​    其他配置项目，不用改动。最后点击“保存”。&lt;/p&gt;
&lt;p&gt;7） 上面保存好后，返回到服务页面，再点击“&lt;strong&gt;保存并应用&lt;/strong&gt;”就生效了。&lt;/p&gt;
&lt;p&gt;​     最后不点击这个按钮，插件不会应用新添加的配置。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722110602966.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;8） 检查方法：一种方法是点击编辑中的“日志查看器”：&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722111356545.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;还有一种方法，是观察当前服务状态中是否已经出现了对应ip。&lt;/p&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo20250722111509658.png&#34; style=&#34;zoom:50%;&#34; /&gt;
&lt;p&gt;这样，第二种插件使用方法，也就完成啦。&lt;/p&gt;
&lt;h2 id=&#34;qa&#34;&gt;Q&amp;amp;A
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;服务成功运行后，关联的是国外ip 怎么办？&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;很可能是上述提到的几个url 走到梯子上去了国外。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;需要检查用于检测ip的几个域名规则是否走到了国外：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- http://checkip.dyndns.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- https://myip4.ipip.net
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- https://ddns.oray.com/checkip
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- https://ip.3322.net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;域名关联的ip 是国内ip，可是该ip无法从手机上访问到 怎么办？&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;首先，排除自己访问的服务不能是 80 443 这种不能发布的服务。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;其次，确认下运营商给你的ip 是可以从外部访问的ip，而不是一个公共ip。例如 我这里举例的ip（36.161.39.63）就是一个公共ip。 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最后，检查自己光猫上的端口映射。因为，即使外部访问这个ip到了光猫上，光猫没有映射服务到内网主机，仍然是无法从外部访问自己家中服务的。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果我希望公网地址发生变动时通知我，可以实现么？&lt;/p&gt;
&lt;p&gt;可以在DDNS-go的&lt;strong&gt;webhook&lt;/strong&gt;功能中 追加通知配置——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里演示的是飞书 通道。&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoconfig.PNG&#34; alt=&#34;DDNS-go webhook&#34; style=&#34;zoom:87%;&#34; /&gt;
&lt;p&gt;具体配置项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;Content-Type:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;application/json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RequestBody&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;msg_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;post&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;post&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;#34;zh_cn&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;您的谷歌云主机公网IP变了&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;nt&#34;&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;nt&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;新的IPv4地址：#{ipv4Addr}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;nt&#34;&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;nt&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;域名更新结果：#{ipv4Result}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        <item>
        <title>电影驴得水的观后</title>
        <link>https://blog.cba.nxlan.cn/p/lvdeshui/</link>
        <pubDate>Thu, 05 Jun 2025 15:02:52 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/lvdeshui/</guid>
        <description>&lt;img src="https://r2.blog.nxlan.cn/PicGolvdeshui.png" alt="Featured image of post 电影驴得水的观后" /&gt;&lt;h2 id=&#34;背景&#34;&gt;背景：
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;最近重新回看了电影驴得水。有一些新的感悟，收拾一二就记录在这里了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;小感&#34;&gt;小感：
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;想起当年看时，印象最深的是张一曼和铜匠的“睡服”桥段。觉得怎么会有这么荒唐的剧情？是老师太奉献，还是校长画的饼太好了？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到标题，影片戏剧冲突的高峰在 “史密斯”专员再次来到学校的两天。展示了学校里各种知识分子的变化和境遇：&lt;/p&gt;
&lt;p&gt;有的知识分子在遭遇挫折后滑跪，迅速地站在权贵一边，沦为他们的走狗——裴老师；有的知识分子一开始坚持着于自己有利的道义，可是当这种道义在强权面前不堪一击时，他们迅速为自己找到了自洽的逻辑：我可以暂时屈服于这种强权，等待合适的时机再反抗，这种悲壮的情怀还有点自我感动——铁男（这个名字也充满了讽刺）；还有的知识分子 坚持所有矛盾都可以调和，无非就是牺牲一下小部分个人的利益（如，张一曼的头发；和铁男一开始坚持的道义；甚至是后面 自己女儿要嫁给铜匠）——校长。&lt;/p&gt;
&lt;p&gt;张一曼是校长pua下的受害者：她其实没有那么看重三民，甚至也没有那么看重她的名誉。她眼里和心里只有一家人整整齐齐、快快乐乐。 就只有校长女儿和观众旁观着这一切，知道没有驴得水这个人，驴得水就是头驴。如果自己一开始犯了错，就应该承担犯错的后果。&lt;/p&gt;
&lt;p&gt;可是现实中你我都能看破、说破、承担么？这可能也是成年人的困境，一个东西被加了太多的装饰，以至于到最后自己都忘记了这个东西本真的面目。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;校长一味的和稀泥，结果带来的是 他的女儿差点步张一曼后尘。&lt;/p&gt;
&lt;p&gt;又让我想起，当今一部分家长教育孩子的心态：别惹事，大家和和睦睦的多好。可是，换到子女的角度，看到父母这个息事宁人的“榜样”在前，等到他们遇到同样情况时还能够毅然决然反抗么？我看悬，搞不好会慢慢演变成温水煮青蛙。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最搞笑的一点是：一个以宣传三民主义为目的的教育实验基地，从头到尾没有出现过一个孩子。这也很吊诡。是讽刺这个项目就是骗财政支持呢，还是三民主义已经沦为上面知识分子的大旗、飘渺而不接地气。我猜不到。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;老外算是长了眼了，这帮中国知识分子太能骗了。&lt;/p&gt;
&lt;p&gt;结合影片上映的时间，感觉也是隐射十年前的环境：以洋大人为重，洋大人是先进文化和生产力的代表~ 但是，有一说一，这部片子只能说展示了一部分知识分子脱离群众、沦为权利&amp;amp;资本玩物的下场。毕竟，自己都不自重自好，不管是国人还是外人都会瞧不起的。&lt;/p&gt;
&lt;p&gt;另外，这里并没有很好的展现 革命内部新生力量和之后 全民教育普及的火苗~&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;最终想说的&#34;&gt;最终想说的：
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;中国人一个特质就是很务实。&lt;/p&gt;
&lt;p&gt;甭管什么天花乱坠的道理，最终就一个问题：这东西能给我一盒鸡蛋不。一切都回归到过日子层面。不管你是儒教 道教 还是基督教~&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;另一个特质，中国人的道义水平 放在世界上看也是数一数二的。&lt;/p&gt;
&lt;p&gt;从女娲补天到大禹治水，再到雷锋 张思德 钱学森 袁隆平 屠呦呦。优秀的中华儿女 激励着一代又一代人。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上面两个特质结合到一个人身上，情况就会复杂起来。如果落到学识丰富的知识分子，情况又更复杂了：&lt;/p&gt;
&lt;p&gt;因为这部分知识分子 天然靠笔杆子生活，脱离一线劳动，不生产实际的劳动价值，却占有道义上层的优势。当他们倒向权贵的时候，他们的道义自适应性就明显倾向了权贵一方。当权贵势弱时，他们又会表现出”为天地立命“的姿态。&lt;/p&gt;
&lt;p&gt;所以，如何将知识分子的知识和道义落实到改善全体人民生活上，就需要不同阶段做不同的考量和设计。而今天的大学生，其身份更多的是有知识的无产工人，他们中孕育着未来社会发展变革的萌芽。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>测试1</title>
        <link>https://blog.cba.nxlan.cn/p/11/</link>
        <pubDate>Thu, 29 May 2025 17:42:18 +0800</pubDate>
        
        <guid>https://blog.cba.nxlan.cn/p/11/</guid>
        <description>&lt;h2 id=&#34;测试图片1&#34;&gt;测试图片1
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGo9424B19C-B529-4CB2-B9E9-7751763AD383.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;intel mobile cpu architecture&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;测试图片2&#34;&gt;测试图片2
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://r2.blog.nxlan.cn/PicGoliar86_7935b337e_A_stunningly_beautiful_woman_with_long_flowing_a4da21bc-8ac9-45da-9cb9-d327dce127de.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;test photo&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
