梦不遥远 發表於 2025-4-17 14:31:00

一键部署 Dify + MCP Server,高效开发 AI 智能体应用

<p>作者:黄刚(泽尘)&nbsp;|孙小涵(子照)|赵庆杰(卢令)|王霄霄(丛霄)</p>
<h1 id="前言">前言</h1>
<p><strong>全球&nbsp;AI&nbsp;开发者正在见证一场&nbsp;“AI&nbsp;智能体革命”。</strong></p>
<p>从&nbsp;2024&nbsp;年&nbsp;Dify.ai&nbsp;发布开源框架&nbsp;Dify以来,到全球开发者基于其快速构建的智能客服、企业知识库、AI&nbsp;营销助手等场景应用,GitHub&nbsp;上已有超过&nbsp;2.3&nbsp;万个&nbsp;AI&nbsp;应用项目诞生。</p>
<p>如今,MCP&nbsp;的协议也异军突起,大量基于&nbsp;MCP&nbsp;协议的&nbsp;MCP&nbsp;Server&nbsp;应用涌上市场,它解决了各个模块之间交互不统一的问题,让一切现有传统应用就像&nbsp;USB&nbsp;接口一样,随意在&nbsp;AI&nbsp;智能体上插拔使用。&nbsp;那如何快速的基于&nbsp;MCP&nbsp;Server&nbsp;构建出一个&nbsp;AI&nbsp;应用?我们大胆的猜测,Dify&nbsp;+&nbsp;MCP&nbsp;Server&nbsp;将是一个完美的结合,因为&nbsp;Dify&nbsp;有强大的编排能力,再加上&nbsp;MCP&nbsp;Server&nbsp;标准的接口协议,在&nbsp;Dify&nbsp;平台上,只需要进行简单的拖拽就可以快速的构建一个生产级别的&nbsp;AI&nbsp;智能体应用。</p>
<p>本次我们选择了阿里云&nbsp;Serverless&nbsp;应用引擎(下面简称&nbsp;SAE)来部署&nbsp;Dify、MCP&nbsp;应用,并且期望通过&nbsp;Dify&nbsp;快速编排&nbsp;MCP&nbsp;Server&nbsp;应用快速智能体,实现一套“免运维、全托管,生产级”的&nbsp;AI&nbsp;智能体解决方案。</p>
<p>在我们的方案里,将致力于解决以下问题:</p>
<ol>
<li>
<p>低成本:面向算力收费,不额外收费其它费用,并且基于&nbsp;SAE&nbsp;自身提供的弹性能力,可以更从容的应对业务流量高峰。</p>
</li>
<li>
<p>高可用:通过多可用区部署,快弹等&nbsp;SAE&nbsp;自有的优势,帮助&nbsp;Dify&nbsp;从社区版应用快速升级为生产级别的应用。</p>
</li>
<li>
<p>全链路无侵入监控:基于&nbsp;SAE&nbsp;提供的免费无侵入监控方案,让业务低成本的全链路监控你的&nbsp;AI&nbsp;应用。</p>
</li>
<li>
<p>简单易用:1&nbsp;分钟完成&nbsp;Dify,MCP&nbsp;Server&nbsp;的部署,5分钟基于Dify&nbsp;编排&nbsp;MCP&nbsp;快速构建&nbsp;AI&nbsp;应用。</p>
</li>
<li>
<p>单租安全:可独立部署&nbsp;Dify&nbsp;应用到自己的&nbsp;VPC&nbsp;内,用户业务的数据不会流出&nbsp;VPC,保证数据绝对安全。</p>
</li>
</ol>
<p>本文将着重介绍如何通过&nbsp;SAE&nbsp;快速搭建&nbsp;Dify&nbsp;AI&nbsp;研发平台,依托&nbsp;Serverless&nbsp;架构提供全托管、免运维的解决方案,高效开发&nbsp;AI&nbsp;智能体应用。</p>
<p><em>(PS:SAE&nbsp;还支持<strong>快速搭建&nbsp;Manus&nbsp;AI、MCP&nbsp;Server&nbsp;等&nbsp;AI&nbsp;场景应用</strong>,本文选取部署较为复杂的&nbsp;Dify&nbsp;应用来作为演示,有其他&nbsp;AI&nbsp;场景应用托管的需求可以联系&nbsp;钉钉群:32874633)</em></p>
<h1 id="在sae上快速部署difyai研发平台">在&nbsp;SAE&nbsp;上快速部署&nbsp;Dify&nbsp;AI&nbsp;研发平台</h1>
<h2 id="基于saectl模板一键部署">基于&nbsp;saectl&nbsp;模板一键部署</h2>
<p>下面以实际例子,演示如何使用&nbsp;saectl&nbsp;工具,通过一组&nbsp;YAML&nbsp;模板在&nbsp;SAE&nbsp;上轻松部署&nbsp;Dify。</p>
<h3 id="前置准备">前置准备</h3>
<h4 id="第一步saectl工具安装">第一步:saectl&nbsp;工具安装</h4>
<p>参考:如何安装与配置saectl工具_Serverless&nbsp;应用引擎(SAE)-阿里云帮助中心,完成&nbsp;saectl&nbsp;工具安装</p>
<h4 id="第二步前置资源准备">第二步:前置资源准备</h4>
<p>通过模版创建应用前,请确保您拥有以下资源(Dify&nbsp;部署依赖):</p>
<ul>
<li>
<p>数据库</p>
<ul>
<li>
<p>Redis&nbsp;数据库</p>
</li>
<li>
<p>Postgre&nbsp;SQL&nbsp;数据库</p>
</li>
<li>
<p>向量数据库</p>
</li>
</ul>
</li>
<li>
<p>存储</p>
<ul>
<li>NAS&nbsp;文件存储</li>
</ul>
</li>
<li>
<p>网络</p>
<ul>
<li>NAT&nbsp;网关</li>
</ul>
</li>
</ul>
<h3 id="saectl模版部署">saectl&nbsp;模版部署</h3>
<h4 id="第一步准备saedify模板">第一步:准备&nbsp;SAE&nbsp;Dify&nbsp;模板</h4>
<p>下载&nbsp;SAE&nbsp;Dify&nbsp;模板仓库,仓库结构如下,包含所有&nbsp;Dify&nbsp;应用组件所需的&nbsp;K8S&nbsp;资源定义。</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142802828-993060736.webp"></p>
<p>替换&nbsp;YAML&nbsp;模板中变量为您自己的资源,以&nbsp;dify-credential&nbsp;为例:</p>
<pre><code class="language-bash">apiVersion: v1
data:
DB_USERNAME: ${pg_database_username}# PGSQL 数据库用户名
DB_PASSWORD: ${pg_database_password}# PGSQL 数据库密码
PGVECTOR_USER: ${vector_database_username}# PGVector数据库用户名
PGVECTOR_PASSWORD: ${vector_database_password}# PGVector 数据库密码
REDIS_USERNAME: ${redis_database_username}# Redis 数据库用户名
REDIS_PASSWORD: ${redis_database_password}# Redis 数据库密码
kind: Secret
metadata:
name: dify-credentials
namespace: dify
type: Opaque
</code></pre>
<h4 id="第二步通过saectl工具一键部署dify至sae">第二步:通过&nbsp;saectl&nbsp;工具一键部署&nbsp;Dify&nbsp;至&nbsp;SAE</h4>
<p>YAML&nbsp;文件变量替换完成后,执行&nbsp;./install.sh,脚本会自动部署并检查上述&nbsp;K8S&nbsp;资源,并打印&nbsp;Dify&nbsp;公网访问地址。</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142812816-979969881.webp"></p>
<p>登录&nbsp;SAE&nbsp;控制台,可以看到已创建的&nbsp;Dify&nbsp;应用组件。</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142819465-1966228206.webp"></p>
<h3 id="使用dify服务">使用&nbsp;Dify&nbsp;服务</h3>
<p>打开浏览器,在地址栏中输入上一步骤打印出的&nbsp;${EXTERNAL-IP}😒{PORT},即可访问在&nbsp;SAE&nbsp;上一键部署的&nbsp;Dify&nbsp;服务。</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142826107-1868756266.webp"></p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142834223-173019574.webp"></p>
<h2 id="基于sae应用中心一键部署">基于&nbsp;SAE&nbsp;应用中心一键部署</h2>
<p>SAE&nbsp;应用中心为用户提供了&nbsp;Dify&nbsp;应用模板,您只需要在控制台填写表单,我们会为您自动创建并运行部署流水线,将&nbsp;Dify&nbsp;一键部署至&nbsp;SAE。</p>
<h3 id="前置准备-1">前置准备</h3>
<p>同上,需要准备&nbsp;Dify&nbsp;应用依赖的数据库、存储、网络资源:</p>
<ul>
<li>
<p>数据库</p>
<ul>
<li>
<p>Redis&nbsp;数据库</p>
</li>
<li>
<p>Postgre&nbsp;SQL&nbsp;数据库</p>
</li>
</ul>
</li>
<li>
<p>向量数据库</p>
</li>
<li>
<p>存储</p>
<ul>
<li>NAS&nbsp;文件存储</li>
</ul>
</li>
<li>
<p>网络</p>
<ul>
<li>NAT&nbsp;网关</li>
</ul>
</li>
</ul>
<h3 id="sae应用中心部署">SAE&nbsp;应用中心部署</h3>
<h4 id="第一步在sae应用中心选择dify社区版">第一步:在&nbsp;SAE&nbsp;应用中心选择&nbsp;Dify&nbsp;社区版</h4>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142842936-789926275.webp"></p>
<h4 id="第二步填写dify社区版部署的参数表单">第二步:填写&nbsp;Dify&nbsp;社区版部署的参数表单</h4>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142848563-1058836343.webp"></p>
<h4 id="第三步提交表单等待部署完成">第三步:提交表单,等待部署完成</h4>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142853742-1646871760.webp"></p>
<h3 id="使用dify服务-1">使用&nbsp;Dify&nbsp;服务</h3>
<p>同「基于&nbsp;saectl&nbsp;模版一键部署」</p>
<p>打开浏览器,在地址栏中输入控制台日志打印出的&nbsp;${EXTERNAL-IP}😒{PORT},即可访问在&nbsp;SAE&nbsp;应用中心一键部署的&nbsp;Dify&nbsp;服务。</p>
<h1 id="使用dify编排mcp应用">使用&nbsp;Dify&nbsp;编排&nbsp;MCP&nbsp;应用</h1>
<h3 id="第一步在sae上部署mcpserver">第一步:&nbsp;在&nbsp;SAE&nbsp;上部署&nbsp;MCP&nbsp;Server</h3>
<ul>
<li>基于&nbsp;MCP&nbsp;官方提供的&nbsp;Python&nbsp;SDK&nbsp;中的一个简单&nbsp;SSE&nbsp;协议的&nbsp;MCP&nbsp;Server</li>
</ul>
<p>https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/servers/simple-tool/mcp_simple_tool/server.py</p>
<p>它实现了&nbsp;SSE&nbsp;远端协议的一个具备网页抓取工具的服务,其中&nbsp;SseServerTransport&nbsp;是&nbsp;SDK&nbsp;中封装了&nbsp;SSE&nbsp;的交互,请求路径&nbsp;<code>/sse</code>完成连接建立,请求路径&nbsp;<code>/messages</code>路径是客户端服务端消息推送。</p>
<pre><code class="language-python">if transport == "sse":
    from mcp.server.sse import SseServerTransport
    from starlette.applications import Starlette
    from starlette.routing import Mount, Route

    sse = SseServerTransport("/messages/")

    async def handle_sse(request):
      async with sse.connect_sse(
            request.scope, request.receive, request._send
      ) as streams:
            await app.run(
                streams, streams, app.create_initialization_options()
            )

      starlette_app = Starlette(
            debug=True,
            routes=[
                Route("/sse", endpoint=handle_sse),
                Mount("/messages/", app=sse.handle_post_message),
            ],
      )
</code></pre>
<pre><code class="language-python"># 使用 app.call_tool() 装饰器定义 call_tool 工具调用的方法
@app.call_tool()
async def fetch_tool(
    name: str, arguments: dict
) -&gt; list:
    if name != "fetch":
      raise ValueError(f"Unknown tool: {name}")
      if "url" not in arguments:
            raise ValueError("Missing required argument 'url'")
    return await fetch_website(arguments["url"])

# 使用 app.list_tools() 装饰器定义列出所有工具的方法
@app.list_tools()
async def list_tools() -&gt; list:
    return [
      types.Tool(
            name="fetch",
            description="Fetches a website and returns its content",
            inputSchema={
                "type": "object",
                "required": ["url"],
                "properties": {
                  "url": {
                        "type": "string",
                        "description": "URL to fetch",
                  }
                },
            },
      )
    ]
</code></pre>
<p>将上述&nbsp;MCP&nbsp;Server&nbsp;打包为镜像,部署到&nbsp;SAE&nbsp;上,可以直接用&nbsp;saectl&nbsp;一键部署,支持按照暴露&nbsp;CLB&nbsp;类型的&nbsp;MCP&nbsp;Service&nbsp;地址,SAE&nbsp;平台内置了应用的监控、日志等,围绕应用提供了的全套运维体系,在&nbsp;SAE&nbsp;界面可以看到应用已经创建出来,并且处于&nbsp;Running&nbsp;状态,日志标准输出显示服务器运行中。</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142904214-334201207.webp"></p>
<h3 id="第二步在saedify平台创建agent并使用mcp协议进行工具调用">第二步:&nbsp;在&nbsp;SAE&nbsp;Dify&nbsp;平台创建&nbsp;Agent&nbsp;,并使用&nbsp;MCP&nbsp;协议进行工具调用</h3>
<ul>
<li>在&nbsp;Dify&nbsp;的插件中,选择&nbsp;“Agent&nbsp;策略”,选择官方的“Dify&nbsp;Agent&nbsp;部署”&nbsp;(注:Dify&nbsp;暂时官方没有支持&nbsp;MCP&nbsp;协议,都是按照插件的形式由第三方开发者提供&nbsp;)</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142910960-1300763354.webp"></p>
<ul>
<li>创建一个工作流应用,添加&nbsp;Agent&nbsp;节点,并对&nbsp;Agent&nbsp;节点进行配置,选择&nbsp;ReAct&nbsp;的模式,并配置&nbsp;MCP&nbsp;工具方法。这是&nbsp;Dify&nbsp;内部封装了一层&nbsp;MCP&nbsp;服务的方法调用。</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142919921-1828505345.webp"></p>
<p>在&nbsp;Dify&nbsp;工具市场中安装&nbsp;MCP&nbsp;工具,然后回到工作流界面,在&nbsp;MCP&nbsp;服务配置这里填写&nbsp;SAE&nbsp;MCP&nbsp;Server&nbsp;绑定的&nbsp;CLB&nbsp;地址,作为访问地址。</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142926324-1326465904.webp"></p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142933359-662152026.webp"></p>
<pre><code class="language-json">{
    "mcp_server": {
      "url": "http://8.135.243.229:80/sse",
      "headers": {

      },
      "timeout": 5,
      "sse_read_timeout": 300
    }
}
</code></pre>
<h3 id="第三步测试agent">第三步:&nbsp;测试&nbsp;Agent</h3>
<p>点击运行, Dify&nbsp;提供了调试功能,以可视化的形式看到&nbsp;Agent&nbsp;的思考运行过程:</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142942202-1020130146.webp"></p>
<h3 id="第四步查看saemcpserver应用输出日志">第四步:&nbsp;查看&nbsp;SAE&nbsp;MCP&nbsp;Server&nbsp;应用输出日志</h3>
<p>可以看到&nbsp;MCP&nbsp;客户端和服务端交互了&nbsp;List&nbsp;Tool&nbsp;和&nbsp;Call&nbsp;Tool&nbsp;等方法。</p>
<p><img src="https://img2024.cnblogs.com/blog/1411156/202504/1411156-20250417142948427-268636888.webp"></p>
<h1 id="总结云上托管dify的核心挑战与sae解决方案">总结:云上托管&nbsp;Dify&nbsp;的核心挑战与&nbsp;SAE&nbsp;解决方案</h1>
<p>在企业级应用中,Dify&nbsp;作为一款功能强大的&nbsp;LLM&nbsp;应用研发平台,其云上托管需要应对弹性伸缩、高可用性和快速迭代等核心挑战。阿里云&nbsp;Serverless&nbsp;应用引擎(SAE)凭借其原生&nbsp;Serverless&nbsp;架构和企业级服务能力,为这些问题提供了高效解决方案。</p>
<p><em>(如果您对于产品有更多建议或者对&nbsp;Dify&nbsp;云端托管有更多想法可以加入钉钉群(群号:32874633)与我们取得联系。)</em></p>
<h2 id="cicd与快速迭代加速开发与交付效率">CI/CD&nbsp;与快速迭代:加速开发与交付效率</h2>
<p><strong>挑战:</strong><br>
Dify&nbsp;用户需频繁迭代模型、优化工作流或修复问题。传统&nbsp;CI/CD&nbsp;流程复杂,且部署环境一致性难以保证,导致迭代周期长、风险高。</p>
<p><strong>SAE&nbsp;解决方案:</strong></p>
<ol>
<li><strong>深度集成&nbsp;CI/CD&nbsp;工具链</strong></li>
</ol>
<ul>
<li>支持与主流&nbsp;DevOps&nbsp;工具(如&nbsp;GitLab、GitHub、Jenkins、阿里云&nbsp;CodePipeline)无缝对接,实现代码提交&nbsp;→&nbsp;构建&nbsp;→&nbsp;镜像推送&nbsp;→&nbsp;自动部署的全链路自动化。</li>
</ul>
<ol start="2">
<li><strong>一键部署与灰度发布</strong></li>
</ol>
<ul>
<li>通过&nbsp;SAE&nbsp;控制台或&nbsp;API&nbsp;实现一键部署,结合&nbsp;金丝雀发布(Canary&nbsp;Release)&nbsp;功能,将新版本逐步推广至&nbsp;10%、50%、100%&nbsp;流量,降低上线风险。</li>
</ul>
<ol start="3">
<li><strong>滚动更新与无损升级</strong></li>
</ol>
<ul>
<li>支持滚动部署策略,在更新过程中保持服务高可用,避免因版本切换导致的中断。</li>
</ul>
<ol start="4">
<li><strong>环境一致性与镜像管理</strong></li>
</ol>
<ul>
<li>通过镜像仓库(如阿里云&nbsp;ACR)统一管理应用版本,确保开发、测试、生产环境配置一致,减少“环境差异”导致的故障。</li>
</ul>
<h2 id="弹性能力适配动态资源需求">弹性能力:适配动态资源需求</h2>
<p><strong>挑战:</strong><br>
Dify&nbsp;平台需支持开发者高频次的应用测试及多场景部署,资源需求波动显著(如突发的模型推理任务或团队协作高峰期)。若资源固定分配,可能导致成本浪费或性能瓶颈。</p>
<p><strong>SAE&nbsp;解决方案:</strong></p>
<ol>
<li><strong>自动弹性扩缩容</strong></li>
</ol>
<ul>
<li>基于负载的自动伸缩:通过&nbsp;HPA(Horizontal&nbsp;Pod&nbsp;Autoscaler)根据&nbsp;CPU、内存或自定义指标(如&nbsp;API&nbsp;调用频率)动态调整&nbsp;Dify&nbsp;实例数量,应对突发流量或密集计算任务。</li>
</ul>
<ol start="2">
<li><strong>冷启动优化</strong></li>
</ol>
<ul>
<li>SAE&nbsp;的镜像预热与层共享技术,将容器启动时间缩短至秒级,加速开发环境初始化或突发请求响应。</li>
</ul>
<ol start="3">
<li><strong>按需付费模式</strong></li>
</ol>
<ul>
<li>Serverless&nbsp;架构按实际资源使用计费,避免为闲置资源付费,降低企业级&nbsp;Dify&nbsp;部署的长期成本。</li>
</ul>
<h2 id="高可用保障平台稳定运行与数据安全">高可用:保障平台稳定运行与数据安全</h2>
<p><strong>挑战:</strong><br>
Dify&nbsp;作为企业级&nbsp;LLM&nbsp;应用基础设施,需确保持续可用性。任何节点故障或区域级中断可能导致开发流程中断、模型训练数据丢失或&nbsp;API&nbsp;服务不可用。</p>
<p><strong>SAE&nbsp;解决方案:</strong></p>
<ol>
<li><strong>多可用区容灾部署</strong></li>
</ol>
<ul>
<li>自动将&nbsp;Dify&nbsp;实例分布于多个可用区(AZ),实现跨&nbsp;AZ&nbsp;的流量负载均衡与故障无缝切换,规避单点故障风险。</li>
</ul>
<ol start="2">
<li><strong>健康检查与自愈机制</strong></li>
</ol>
<ul>
<li>实时监控&nbsp;Dify&nbsp;实例健康状态,自动重启异常容器并触发告警,确保服务高可用性。</li>
</ul>
<ol start="3">
<li><strong>数据持久化与备份</strong></li>
</ol>
<ul>
<li>结合阿里云存储服务(如&nbsp;OSS、NAS、RDS、Tair),确保模型数据、配置信息等内容的持久化存储与跨地域容灾,满足企业级数据安全要求</li>
</ul><br><br>
来源:https://www.cnblogs.com/alisystemsoftware/p/18830788
頁: [1]
查看完整版本: 一键部署 Dify + MCP Server,高效开发 AI 智能体应用