微信扫码
添加专属顾问
我要投稿
企业级AI Agent如何从理论走向实践?3个月200+企业验证的构建方法论首次公开。 核心内容: 1. AI Agent与LLM双引擎驱动的企业级智能应用架构 2. 从AI网关到运行时观测的完整技术栈演进路径 3. MCP服务与Agent技能模块的有机协作方案
💡 目录 💡
01 什么是 AI 应用
02 AI Agent 概述
03 AI Agent 的构建模式与 AI Agent 类型
04 AI Agent 大脑 - LLM
05 AI Agent 技能 - MCP
06 AI 应用观测体系
01
我们先来尝试定义什么是 AI 应用。
对于应用而言,我们早已不陌生,从桌面软件到手机 App,它们是帮助我们处理特定任务的工具。然而,当我们谈论“AI 应用”时,我们所指的已不再是简单的工具,而是一种全新的、能够模拟甚至超越人类部分认知能力的智能实体。
传统的软件应用遵循着一套预设的、固定的逻辑。它们是被动的执行者,严格按照人类编写的规则运行。你点击“保存”,它就执行保存操作;你输入公式,它就计算出结果。其本质是一个高效的指令处理器。
而企业级的 AI 应用,则标志着一场根本性的范式转移。它不再仅仅被动地“听令”,而是能够主动地“理解”、“思考”和“行动”。想象一下:
在这些场景中,AI 应用扮演的不再是冰冷的工具,而更像一个不知疲倦、知识渊博、反应迅速的 “智能伙伴” 或 “数字员工”。这便是 AI 应用的魅力所在,也是其核心价值——将人类从重复性、流程化的工作中解放出来,聚焦于更高层次的创造、决策和战略规划。
那么,是什么赋予了 AI 应用如此强大的“智能”?
在 AI 应用中,LLM 扮演着认知核心,也就是“大脑”的角色。它负责处理所有与“思考”相关的任务:
简而言之,LLM 为 AI 应用提供了“智商”。然而,仅有“思考”能力是远远不够的。一个只能在“脑中”规划万千大事却无法付诸行动的大脑,在商业世界中价值有限。所以要让智慧落地,就需要 AI Agent 这个“执行官”的登场。
AI Agent 赋予了 LLM“手和脚”,让“思考”得以转化为“行动”。如果说 LLM 负责“思考做什么”,那么 AI Agent 则负责“如何去完成”。它的核心职责包括:
AI Agent + LLM 的组合,创造了一个既能深思熟虑又能高效行动的完整体。LLM 的智慧通过 Agent 的执行力在真实世界中产生了切实的业务价值。这正是现代 AI 应用区别于过去所有软件的根本所在。
AI Agent 的强大,并不在于其自身,而在于它能调动多少“资源”和“能力”。一个无法连接任何真实业务系统的 Agent,就像一个被关在“信息茧房”里的天才,空有智慧却无处施展。因此,为了让 AI Agent 能够真正在企业环境中大展拳脚,我们需要让其学习和成长。
我们构建 Agent,就好比我们玩角色扮演游戏,比如在博得之门里创建的角色,他/她有种族、职业、背景、属性点、技能和初始能力。但只有这些基础的初始能力是无法立足在充满危险的被遗忘的国度的。所以角色需要成长和学习新的技能,而同样是一名初始法师,随着学习的技能不同,会成长为不同能力的法师,比如学习了严酷收割、亡灵仆役等技能的死灵法师。学习了造水术、蛛网术的咒术法师。学习了火球术、闪电束的元素法师等等。
在大多数的角色扮演游戏中,都有着完善的技能系统。在今年年初,若想要给 AI Agent 构建技能系统和体系是有着很高成本的,AI Agent 要学习一项新技能(即使用一个新工具),开发者可能需要做两件成本很高的事:
然而一家客户的沉淀短则几年,长则十几年,内部已经有茫茫多的系统、服务、接口,也就是这些技能都是现成的,且都是上古秘法,没法改,也没人会改。那么就得改 AI Agent,带来的后果就是几乎没有复用性、没有扩展性、开发成本非常高。
所以 MCP 的出现,很好的解决了构建 AI Agent 技能系统的痛点问题:
所以,MCP 服务是企业 AI 应用的基石。它将企业零散的 IT 资产和服务,转化为AI可以理解和调用的标准化能力,从而为上层的 AI Agent 源源不断地输送技能。
在理解了 AI 应用的内在构成后,我们面临一个实际问题:如何将它构建出来?从逻辑上看,企业构建 AI 应用的路径主要有两条:
这指的是从零开始,为一个全新的业务场景或颠覆性的产品构想,原生设计和开发AI应用。这种模式不受历史技术债务的束缚,可以采用最先进的架构,最大化地发挥 AI Agent 的能力,是实现颠覆式创新的最佳路径。例如,打造一个面向金融行业的 AI 研究分析师,或者开发一个企业内部的“超级知识入口”。
这是绝大多数企业会选择的路径。它指的是在企业现有的、成熟的核心业务系统(如ERP、CRM、SCM)中,嵌入 AI Agent 的能力,对其进行“智能化升级”。这种方式能直接作用于核心业务流程,价值释放路径更短、更明确。
在我们和众多客户的交流中来看,改造现有业务,本质上是将业务入口从请求到传统服务改为请求到 AI Agent。
一个真正的企业级 AI 应用,是一个由“LLM 大脑”提供智慧,由“AI Agent 执行官”负责行动的智能系统。它的能力边界,取决于企业为其打造的 MCP 服务有多强大,数量有多少。而它的落地形式,既可以是开疆拓土的全新创造,也可以是为现有核心业务的深度赋能。理解这一全景,是开启企业 AI 转型之旅的第一步。
如我上文所说,大多数客户的诉求都是AI赋能现有业务,也就是将业务入口从请求到传统服务改为请求到 AI Agent,现存的传统服务都可以转为为 AI Agent 赋能的技能库。
所以将 AI 应用架构拆开来看,整体架构及调用链路如下图所示:
图中的8步核心调用链路解析:
实际生产中 ③ - ⑧ 步会多次循环交互。
所以从组成结构来看,AI 应用的核心有四点,AI Agent、LLM、MCP服务、AI 观测体系。并且核心中的核心是 AI Agent,因为用户、LLM、MCP 服务都是靠 AI Agent 连接的,AI 观测体系也是会以 Agent 为枢纽。本文后续也是持续围绕这四个核心的要素,和大家探讨如何实践落地上述架构。
02
同样,我们先来定义什么是 AI Agent,所谓一千个人眼中就有一千个哈姆雷特,大家对 AI Agent 的认知都不一样。Agent 可大可小,比如一套复杂的系统可以认为是一个 Agent,一个流程也可以认为是一个 Agent,甚至一行代码也可以认为是一个 Agent。那么 AI Agent 到底有没有定义呢?
其实这三家(Google,Anthropic,OpenAI)在 AI Agent 白皮书里都有定义,并且都有共性,所谓三个臭皮匠顶一个诸葛亮,我们可以从三个白皮书中抽象出 AI Agent 的定义。
一个 AI Agent 其实是一个系统,包括以下三个核心内容:
AI Agent 和 Chatbot 的最大区别是前者可以解决需要通过不同领域的知识和能力协同才可以解决的问题,通俗的说就是复合的、复杂的、多步骤的问题。
来看看 Google AI Agent 白皮书对 AI Agent 的定义:
来看看 Anthropic AI Agent 白皮书对 AI Agent 的定义:
来看看 OpenAI AI Agent 白皮书对 AI Agent 的定义:
所以 AI Agent 断然不可能是几行代码写的程序,而是一个相对复杂的系统。
一个 AI Agent 的构成有4个核心组件:
Google 定义的 AI Agent 架构:
Anthropic 定义的 AI Agent 架构:
OpenAI 定义的 AI Agent 的核心组件:
目前 AI Agent 的推理模式大体分为三类:
ReAct 是目前被验证最通用的 AI Agent 模式。需要具备以下四个要素:
Google 对 ReAct 的定义:
ReAct模式是目前从效果、通用性方面来说比较好的模式,基于该模式,我们可以抽象出AI Agent的通用模式,或者说构建AI Agent能力需要具备的核心要素。也许不同的领域,不同的业务场景可能需要基于ReAct模式做微调,但无论如何,都需要考虑AI Agent通用模式里的6大核心要素。
AI Agent 里的提示词链路其实本质上就是 Agent 内部的工作流,它将一个任务分解为一系列步骤,上一个任务的输出是下一个任务的输入,每个任务可能都会和 LLM 进行交互。
这种方式比较适合可以将任务清晰地分解为固定子任务的场景。比如市场营销,广告活动,CRM/ERP 中的问数流程等等。
Anthropic AI Agent 白皮书中对 Prompt Chaining 的定义:
Google AI Agent 白皮书中有编排层的概念:
AI Agent 里路由的作用是对输入进行分类,并将其导向一个专门的后续任务。这种模式可以使关注点分离,并构建更专业的提示词。
路由非常适用于那些具有明显不同类别、可以更好地分开处理的复杂任务(无论是通过 LLM 还是更传统的分类模型/算法)。最常见的场景就是智能客服,将不同类型的客户服务查询(一般问题、退款请求、技术支持)引导到不同的下游流程、提示和工具。
Anthropic AI Agent 白皮书中对 Routing 的定义:
工具是 AI Agent 与外部系统(例如 API)交互的关键。尽管基础模型在文本和图像生成方面表现出色,但目前它们依然无法与外部世界直接交互,或者说快速、低成本的交互(LLM Function Calling 受限 LLM 厂商的迭代)。工具弥补了这一差距,使 Agent 能够访问外部数据和服务,并执行超越底层模型自身能力的各种操作。而 MCP 的出现使得这个环节的能力、便利性、扩展性等有了质的提升。
Anthropic 在增强型 LLM 的构建块中强调了工具的使用 以及工具开发的最佳实践:
OpenAI 对工具做了专门的定义:
Google 详细介绍了工具(Extensions, Functions, Data Stores)及其在 Agent 架构中的作用:
评估循环指的是一个 LLM 调用生成响应,而另一个 LLM 在循环中提供评估和反馈。这种循环可以使 AI Agent 进行自我修正,甚至可能使用不同的 LLM 来协助修正。这种方式适用于具有明确评估标准,并且迭代改进能够带来可衡量价值的场景。
在翻译场景会常用到这种评估的模式,因为用来翻译的主 LLM 最初可能无法捕捉到细微差别,但评估 LLM 可以辅助提供评估信息,然后翻译 LLM 做修正。还有联网搜索或深度研究这类需要多轮搜索和分析的场景,也会用到这种评估模式,其中的评估 LLM 决定是否需要进一步搜索等。
Anthropic AI Agent 白皮书中专门介绍了评估循环这个模式:
OpenAI AI Agent 白皮书里里虽然没有明确说明评估循环这个模式,但是提出了护栏(Guardrails)概念,这部分也体现了类似的思想,例如通过批评节点评估 Agent 输出是否符合预期并进行重试。
AI Agent 协调器的作用是一个负责协调的 LLM 接收复杂任务,将其委托给工作器 LLM,并综合它们的结果。这适用于一个 AI Agent 管理其他 AI Agent 的场景。
这个场景和并行执行任务在拓扑结构上有点类似,但也有区别,这种模式更加灵活,因为子任务不是预先定义的,而是由协调器根据特定输入确定的。这种模式适合无法预测所需子任务数量的复杂任务。
Anthropic AI Agent 白皮书中详细介绍了“协调器”:
OpenAI 的“管理器模式”也描述了类似的架构,其中一个中心“管理器”Agent 通过工具调用协调多个专业 Agent:
AI Agent 系统是由 LLM 动态指导其行为和工具使用,保持对如何完成任务的控制的系统。自主循环指的是 AI Agent 初始接受人类的指令,明确任务,一旦任务明确,Agent 会独立规划和执行行动,直到返回人类最终的答案。
这种模式用于难以或不可能预测所需步骤数量,且无法硬编码固定路径的开放式问题。比较典型的就是 Chat 场景里的深度研究(DeepSearch)和 AI 编码场景。以及像 Manus 这种 Planning 的方式也是类似自主循环的模式。
但这种 AI Agent 的自主性有两个最大的问题:
解决这两个问题,业界也已经有较为成熟的方案,用一句话来总结:使用资源/数据隔离的沙箱环境来运行/训练/强化学习 AI Agent 的特定能力。
Anthropic AI Agent 白皮书里讨论了自主 Agent 的适用性和风险:
最后我们来看在任何时代,任何领域都非常核心的安全与防护,在 AI 时代同样不例外。大体可以抽象为四个方面:
03
目前构建 AI Agent 的方式大体可分为两类:
基于不同的客户类型和业务场景,AI Agent 的类型又可以大体分为三类:
至此,我们基本上了解了 AI 应用的定义,AI 应用的核心是什么。AI Agent 的定义和推理模式。在如何构建 AI Agent 方面,本文不会详细聚焦在如何通过编码的方式实现上述的六类推理模式,因为每个客户使用的开发语言不同、每个构建 AI Agent 的综合框架的使用方式不同。更重要的是这些推理模式的实现往往和客户的业务场景,客户的运维研发体系是强相关的。
另外,现如今,LLM 的 Coding 能力都是不弱的,Vibe Coding 的概念目前也是如火如荼,开发程序的门槛几乎已经触底。所以现在最简单的事反而就是写代码,但最难的事是让这坨代码能真真正正的承载业务并运行在线上。
所以本文核心聚焦在当客户想要实现某一类型的 AI Agent 时,该如何选择和使用 AI Agent 最合适的运行时,这一类的 AI Agent 都应该注意哪些核心问题,构建 AI Agent 的核心组件时该如何将上下游产品有机的结合起来配合使用。
04
如上文所述,我们正步入一个由 AI Agent 驱动的全新AI时代。AI Agent 运行时已不再是简单的代码执行环境,它演变成了一个动态、有状态且可能是事件驱动的复杂系统。这个运行时负责管理 AI Agent 的完整生命周期,包括其状态维护、与外部工具的交互以及多智能体间的协作行为。OpenAI 将 Agent 重新定义为“模型 + 指令 + 工具 + 运行时”的组合,这标志着 AI Agent 运行时本身已从附属组件跃升为不可或缺的核心基石。
AI Agent 的计算负载特征与传统应用截然不同。传统的Web服务通常具有可预测的请求-响应模式,而 AI Agent 的运行推理模式如上文所述,是有多种多样的,并非一次简单的模型推理,而是一个复杂的、多轮次的循环工作流,涵盖了持续的规划、工具调用、自省和迭代式推理。它不是一次性的问答,而是一个为达成目标而不断“思考”和“行动”的动态过程。比如 ReAct 模式在每一步都需要 LLM 进行推理以决定下一步是思考还是行动,而 CoT/ToT 为了做出更优决策,会模拟多条未来的推理路径,这都极大地增加了并行的推理调用需求。
正因为这些特性,AI Agent 的一次运行可能是一种“脉冲式”或“突发性”的资源消耗模式——即在极短时间内进行高强度计算,随后进入长时间的闲置状态。这种动态推理过程虽然功能强大,但也带来了显著的延迟波动和高昂的基础设施成本挑战。
另外 AI Agent 正从理论走向实践,预示着人机交互和任务自动化的根本性变革。然而,赋予这些 Agent 强大能力的自主性、学习能力和工具使用特性的同时,也引入了前所未有的安全风险。比如提示注入(Prompt Injection),工具滥用与不受控的系统命令,权限泄露,上下文泄露与级联故障等。所以运行 AI Agent 的环境需要是一个隔离的、访问控制与系统调用拦截的、可严格管理资源的、具备可观测与审计的环境,也就是沙箱环境(Sandbox)。
所以我们尝试通过函数计算 FC 这种 FaaS 形态的 Serverless 计算产品帮客户解决 AI Agent 运行的构建效率、资源成本、Sandbox 三大挑战。
AI Agent 的独特运行模式和对计算资源的需求在函数计算 FC 这种 FaaS 计算资源上找到相对完美的解决方案。这种对应关系可以通过下表清晰地展示出来:
AI Agent 运行时需求 | 函数计算 FC 的优势 |
事件驱动与异步执行 | 多种原生的事件触发器和异步任务执行模式 |
不可预测的突发性工作负载 | 自动、快速的弹性伸缩(从零到 N) |
高昂的计算资源闲置成本 | 按实际使用量计费 |
需要安全、隔离的执行环境 | 天然沙箱化的运行时 |
复杂、多步骤的工作流 | 与工作流引擎有深度集成 |
数据持久化 | 与 OSS,NAS,PolarFS 做好了深度集成 |
快速迭代与开发的需求 | 聚焦业务逻辑,而非基础设施 |
这里先来整体看一下函数计算 FC 作为 AI Agent 运行时的方案拓扑图:
函数计算 FC作为 AI Agent 的运行时有两种模式:
FC 作为 AI Agent 的运行时有两种类型:
FC 作为 AI Agent 运行时的优势:
很多客户做的Agent服务于 Chat 场景,本质上就是负责和用户对话交互的 Agent,用户和客户产品的一次对话就会产生一个任务,由 Agent 负责执行这个任务。
这种 Chat Agent 最大的特点是执行任务的两个不确定性,和一个一致性:
以上两个不确定的特性就是 AI Agent 运行时自身以及配合存储产品需要解决的问题。
这是因为这类 AI Agent 处理的任务是千奇百怪的,用户的问题是无法穷举的,所以无论是 AI Agent 的实现代码逻辑也好,还是运行 AI Agent 的运行时也好,都不可能事先预置所有的依赖。而是只实现 AI Agent 的主干核心逻辑,以及一个隔离并灵活的运行环境,在执行用户的任务时,当遇到需要使用三方依赖时,可以暂停执行任务,先安装所需依赖,然后再继续执行任务,所谓兵来将挡,水来土掩。
函数计算 FC 方案:函数计算 FC 天然具备这个能力,每个实例底层都是隔离的容器环境,通过 subProcess 可以直接执行像 pip 或者 npm 的包管理命令来动态安装依赖,因为每个实例都是完全资源隔离的,所以同一个 AI Agent 函数的不同实例都可以是独一无二的运行环境,有不同的依赖,既相当于每一次执行用户任务运行环境都是完全隔离和完全不相同的,完美匹配这类 AI Agent 的不确定特性。其实以前我们给一些做编程教育的在线教育客户已经做过很多次类似的方案。
这个不确定性特性的本质是用户数据隔离的问题。通常情况下,这类 Chat AI Agent 的文件路径是以用户(User ID)/会话(Session ID)/任务(Task ID)命名的,目的有两个:
这里就会涉及到如何选择存储产品,目前我们遇到的,或者说阿里云上适合的存储产品无非就是云盘,OSS,NAS 以及 PolarDB 新出的PolarFS。
会话(Session)请求亲和性除了上述的保证执行任务在上下文环境、上下文数据方面的一致性以外,同一个会话或任务复用同一个实例,也减少了动态安装依赖的时间耗费,从而提高了执行任务的效率。
在这个特性上,有几个细节点:
函数计算 FC 方案:
x-fc-session-id:<Session ID>
即可,带着相同 Session ID 的请求会被分配到同一个实例中。prestop
这钩子方法,用户可以在这个方法中做数据善后处理。整体架构图如下:
在这几个月时间里,我们遇到了大量使用开源 Dify 构建 AI Agent 或者 AI 应用的客户,这类客户需要快速构建出可以辅助存量业务的 AI Agent,他们的关注点在业务上,并不会投入过多精力研究编码式的构建方案,像 SaaS 类客户,泛企业类客户居多。
在前期 POC 阶段,使用开源 Dify 没有任何问题,可以快速的构建出 AI Agent 原型,但是一旦上生产(流程复杂,并发量大),就有诸多性能问题凸显出来,这和 Dify 底层是 Python 语言实现以及并没有一个标准的工作流引擎是密切相关的,即使是 Dify 企业版也无法解决这些硬伤。所以很多客户在寻求更加稳定的,有 SLA 保障的,但又和 Dify 操作界面类似的产品。
我们针对 Dify 社区现阶段的 Issue 和 Discussion 以及客户的真实反馈进行了调研归纳:
所属类别 | 问题类型 | 问题描述 | 相关issue |
性能 | 高可用性 | 并发吞吐低,难以支撑高并发、长耗时场景 | https://github.com/langgenius/dify/issues/20147 https://github.com/langgenius/dify/issues/20108 |
长文本/大图片/大文件输入输出 | 长文本/大文件/大图片等输入payload或输出内容过大的情况下,会话直接空返回或报错 | https://github.com/langgenius/dify/issues/20270 https://github.com/langgenius/dify/issues/19978 https://github.com/langgenius/dify-plugin-daemon/issues/309 https://github.com/langgenius/dify/issues/19489 https://github.com/langgenius/dify/issues/20096 https://github.com/langgenius/dify-official-plugins/issues/1002 https://github.com/langgenius/dify/issues/19327 https://github.com/langgenius/dify/issues/19489 https://github.com/langgenius/dify-official-plugins/issues/953 https://github.com/langgenius/dify/issues/19989 | |
安全 | 鉴权 | 不具备和自身业务结合的自定义鉴权、外部鉴权能力 | https://github.com/langgenius/dify/issues/20295 |
API Key | 不具备 API Key 超时、轮转等能力,安全性差 | https://github.com/langgenius/dify/issues/20271 https://github.com/langgenius/dify/issues/20150 | |
会话调用 | 会话历史 | 不支持自主传入会话历史,修改会话历史,提高会话记忆能力 | https://github.com/langgenius/dify/issues/20483 https://github.com/langgenius/dify/issues/20233 https://github.com/langgenius/dify/issues/19543 |
出入参格式与内容局限 | 输入、输出支持的字段类型有限,无法自定义会话返回字段,无法动态传入并使用参数以及动态修改返回参数 | https://github.com/langgenius/dify/issues/20282 https://github.com/langgenius/dify/issues/19508 https://github.com/langgenius/dify/issues/20138 https://github.com/langgenius/dify/issues/20629 https://github.com/langgenius/dify/issues/20703 https://github.com/langgenius/dify/issues/20661 https://github.com/langgenius/dify/issues/20354 https://github.com/langgenius/dify/issues/20127 https://github.com/langgenius/dify/issues/20011 https://github.com/langgenius/dify/issues/20790 | |
Agent 流程 | Agent 模式下,下游流式响应异常的情况下永远不退出 | https://github.com/langgenius/dify/issues/19664 | |
Cron Job | 不支持会话定时调用和运行机制 | https://github.com/langgenius/dify/issues/19409 https://github.com/langgenius/dify/discussions/5175 | |
Nginx | 流式输出受限 | 默认配置不支持sse stream同时存在请求缓冲,即使配置streaming也一次性返回,需对nginx配置文件额外设置 | https://github.com/langgenius/dify/discussions/19129 https://github.com/langgenius/dify/issues/19324 |
自定义域名+前缀 | 自定义访问Dify系统的域名和前缀操作困难,或不生效 | https://github.com/langgenius/dify/issues/13735 https://github.com/langgenius/dify/discussions/7463 https://github.com/langgenius/dify/discussions/6076 https://github.com/langgenius/dify/issues/262 https://github.com/langgenius/dify/issues/4622 https://github.com/langgenius/dify/discussions/19421 | |
自定义端口 | Nginx监听端口已被占用,修改监听端口无法全局生效,配置修改复杂 | https://github.com/langgenius/dify/discussions/17713 https://github.com/langgenius/dify/issues/5867 https://github.com/langgenius/dify/issues/1760 https://github.com/langgenius/dify/issues/6505 https://github.com/langgenius/dify/issues/4558 https://github.com/langgenius/dify/discussions/13998 https://github.com/langgenius/dify/discussions/13442#discussioncomment-12110485 | |
LLM | 自定义前置后置逻辑 | 调用LLM前后,希望添加自定义逻辑,支持前置和后置处理 | https://github.com/langgenius/dify/issues/19952 |
token 统计错误 | Dify平台的token数量统计明显不准确 | https://github.com/langgenius/dify/issues/20045 https://github.com/langgenius/dify/issues/20485 https://github.com/langgenius/dify/issues/19790 | |
动态结构化输出 | 不支持LLM调用的动态结构化输出,结构化输出丢失参数 | https://github.com/langgenius/dify/issues/20353 https://github.com/langgenius/dify/issues/19230 | |
Proxy 访问异常 | 使用Proxy访问OpenAI模型服务失败,需要手动修改环境变量 | https://github.com/langgenius/dify/issues/20520 | |
Model Alias | 访问同类型的模型时,无法动态选择和使用不同的密钥 | https://github.com/langgenius/dify/issues/20518 | |
RAG/知识库管理 | 知识库文件处理异常 | 知识库文件上传对token数、文件大小有限制,批量或大文本内容会被丢弃或报错 | https://github.com/langgenius/dify/issues/19519 https://github.com/langgenius/dify/issues/18772 https://github.com/langgenius/dify/issues/20604 https://github.com/langgenius/dify/issues/20772 |
分段效果不符合预期 | 用dify内值的能力进行分段之后,chunk内容不符合预期,如无chunk,标点消失,数字消失等 | https://github.com/langgenius/dify/issues/19776 https://github.com/langgenius/dify/issues/19666 https://github.com/langgenius/dify/issues/20768 https://github.com/langgenius/dify/issues/20789 https://github.com/langgenius/dify/issues/20400 | |
workder内存泄漏 | 知识库上传文件后,worker进程内存占用暴涨,上传结束后仍持续增长 | https://github.com/langgenius/dify/issues/19614 https://github.com/langgenius/dify/discussions/17654 https://github.com/langgenius/dify/discussions/16500 https://github.com/langgenius/dify/discussions/17511 | |
动态知识库召回 | 默认多路召回,无法根据不同的会话动态指定知识库,无法根据metadata等对知识库过滤,或召回效果不佳 | https://github.com/langgenius/dify/discussions/20640 https://github.com/langgenius/dify/discussions/20646 https://github.com/langgenius/dify/issues/20621 https://github.com/langgenius/dify/issues/20654 https://github.com/langgenius/dify/issues/20649 https://github.com/langgenius/dify/issues/20588 https://hustyichi.github.io/2024/07/08/compare/ | |
动态检索参数 | 创建知识库时参数有限,无法精细化处理 | https://github.com/langgenius/dify/issues/19941 https://github.com/langgenius/dify/issues/20501 | |
对接外部知识库异常 | 对接外部知识库进行检索时因为不兼容等问题报错,或执行参数和效果不符合预期 | https://github.com/langgenius/dify/issues/20748 https://github.com/langgenius/dify/issues/19503 https://github.com/langgenius/dify/issues/20735 https://github.com/langgenius/dify/issues/20676 https://blog.csdn.net/xx_nm98/article/details/144250145 |
AI Studio 是阿里云自研的可视化构建 AI Agent 的产品。底层的工作流引擎基于阿里云2018年就商业化的产品云工作流(CloudFlow),底层算力基于函数计算。而前端的可视化部分我们基本沿用的 Dify 的设计语言。目的很简单:让用户不改变使用习惯的前提下享受到更灵活、更稳定、性能更好的可视化构建 AI Agent 的产品。
易用的同时性能更强:
AI Studio 的优势和特点:
虽然目前 AI Studio 还有一些能力正在不断完善中,但是针对上述开源 Dify 的硬伤问题已经具备了彻底解决的能力:
诚然 AI Studio 目前还有很多需要打磨的地方,但是它最大优势是稳定性/性能和可触达的产品研发团队:
我们在与客户的交流中,遇到使用可视化方式构建 AI Agent 最多的场景有以下几类:
如上文所述,为了确保 AI Agent 能够安全、可控地运行,一个强大的沙箱环境(Sandbox)至关重要。这就像是为 AI Agent 提供一个安全的游乐场,让它在其中探索和执行任务,同时又不会对外部真实世界造成意外影响。
但除了运行 AI Agent 自身以外,还有一大类是编外的,用于辅助、提升 AI Agent 或基模能力的沙箱环境(Sandbox)场景,同样也是函数计算 FC 擅长的。
目前我们交流与落地实践的有四大类编外沙箱场景:
这一类场景的本质就是在一个隔离的环境中运行由用户生成的或者 LLM 生成的代码,分为两种业务场景:
Code Sandbox 场景的一些挑战点:
到目前为止,函数计算 FC 有大约16w核左右的资源在承载着不同客户 AI Agent 的 Code Sandbox 场景。
Browser Use 其实并不是一个很新的东西,早在2年前,函数计算 FC 就通过Chrom Server 无头浏览器帮助新东方等在线教育客户通过服务端做 Web 录制的场景。
在 AI 场景下,当前 Browser Use 主要有两类主要的应用场景:
当 AI Agent 的任务从封闭的模拟环境扩展到开放、动态且充满潜在诱惑的互联网时,其面临的安全挑战也随之升级。对于一个在 Web 上操作的 AI Agent 来说,互联网不再仅仅是信息的来源,它本身就是一个动态的、可能包含恶意内容的输入源。网页的内容直接影响 Agent 的感知和决策,所以这就是为什么 Browser Use 也需要沙箱环境的原因。
Browser Use Sandbox场景的一些挑战点:
prestop
钩子函数做Browser Use 收集数据的后处理操作。到目前为止,函数计算FC有大约6w核左右的资源在承载着不同客户 AI Agent 的 Browser Use Sandbox 场景。
有一些基模客户或做通用 AI Agent 的客户,会专注在垂直类场景,这类客户会针对特定场景对 LLM 或 AI Agent 算法做定向强化学习。
目前正在基于函数计算 FC 落地 RL Sandbox 的一个客户是做教育方面的Agent做强化学习,强化学习的内容是客户设计的“考题”,每个考题有自己完整的依赖,Python语言,客户会打好镜像推送到ACR,目前有1w多道考题。
客户的Agent是一个复杂的 Agent 系统,包含 LLM,自有算法,业务逻辑,每个考题除了有试题内容外,还有奖惩机制。是一个非常典型的强化学习场景。
这类强化学习场景对于客户来说,希望有一个独立的、隔离的运行环境,即沙箱环境,会有以下共同的诉求点:
函数计算 FC 作为 FaaS 形态的 Serverless 计算产品,天然的匹配以上这些需求,所以客户选择使用函数计算 FC 作为 RL Sandbox的底座。
运行一个考题需要4c的规格,峰值实例数在4000-5000个实例,也就是同时执行4000-5000道题目。预期每次强化学习时会消耗2w和左右资源。
RL Sandbox场景的一些挑战点:
仿真训练 Sandbox 场景目前主要聚焦在具身智能场景。
具身智能仿真训练基本流程:
函数计算 FC 具身智能仿真训练方案:方案分为两种类型。
05
无论是编码方式构建 AI Agent,还是可视化流程式构建 AI Agent,一旦脱离了 LLM,就不存在 AI 一说了,所以 AI Agent 如何合理的、生产级的与 LLM 结合是本章节的核心内容。
我们都知道现在大部分的 LLM 都是遵循 OpenAI 范式的请求方式,编码方式构建 AI Agent 和可视化流程式构建 AI Agent 虽然在使用方式上不同,但底层本质是一致的:
无论是上述哪种,都需要配置LLM服务的地址【4】和LLM服务用于认证鉴权的 API Key。所以 AI Agent 和 LLM 的交互本质上都是通过一层 Proxy,所有对 LLM 请求的管控、LLM 服务的管理都应该是这层Proxy协助做的事,这也正是 AI 网关做的事。
在当前 AI 普惠的阶段下,有一个显著的特点就是用户们选择使用 LLM 的方式变多了,自主可控能力变强了。比如可以购买 GPU 资源自己部署大模型,可以在线下机房部署大模型,也可以使用阿里云的 PAI 或者函数计算FC来部署大模型。也可以使用各个模型托管平台,通过API的方式来使用大语言模型。但无论选择哪种方式,在 LLM 应用上生产项目的过程中,必然都会遇到一系列问题:
以上问题都是实实在在的客户在使用过程中遇到的问题,有些是模型自身问题,有些是部署架构问题,如果要客户一个一个去解决,复杂度和时间成本都是比较高的。所以就需要AI网关的介入来快速的,统一的收敛掉这些核心问题。
AI Agent 与 LLM 交互遇到的问题和普通服务与 LLM 交互的问题基本一致,所以这个章节我们主要讨论使用 AI 网关代理模型服务如何解决目前与 LLM 交互遇到的问题。
阿里云 AI 网关和阿里云云原生 API 网关同属一个内核。
AI 网关的能力主要包括六部分:
从上图架构中可以看出,AI 网关代理 LLM 方案的架构并不复杂,但是在 AI 应用上生产的过程中通常会遇到10个核心的问题,然而在上面这个并不复杂的架构下,通过AI网关都可以很有效地解决。接下来我们通过 AI Agent 视角、用户视角、业务场景视角来逐一分析和说明。
现在大大小小的企业都在部署 LLM,想方设法的融入到业务中,或日常工作中,那么站在运维团队或者类似中台团队的视角下,可能会有两个核心的问题:
第一个问题很好解决,OpenAI API 的协议基本已经是标准协议,目前市场面上多大数 LLM 都支持 OpenAI API 协议。但也有例外,比如 AWS Bedrock 上的模型,Gemini 是不遵循 OpenAI API 协议的。另外还有 Embedding 和Rerank 模型,以及 Cosyvoice 和 SD、Flux 这类多模态模型都不是 OpenAI API 协议。所以对于一个通用 AI Agent 或者一个企业来说,更希望由统一的 Model API,可以统一管理和管控不同类型模型的 API。
目前上述这些类型的模型,AI 网关都支持代理,所以可以在同一个模型 API 管控平台上,统一管理和管控不同类型的模型 API。
对于第二个问题,AI 接口一旦暴露出去,基本上不可能只让一小部分人知道,所以需要对访问 LLM 服务的用户做以限制,只让能访问的人访问,不能访问的人即便知道了接口也无法访问。
所以可以使用 AI 网关具备的消费者认证的能力来解决这个问题。
核心逻辑是将一个人或一个 AI Agent 抽象为消费者的概念,可以对消费者做权限配置,既可以访问哪些模型 API,消费者下可以生成不同类型的 API Key,请求接口时需要带着 API Key,然后基于权限规则去校验 API Key 的合法性。通过这种就可以精细化的管理访问 AI 接口用户了。
消费者认证的核心价值:
典型鉴权场景与 API Key 应用场景:
灵活路由模型在实际项目中对应着两类问题:
AI 网关支持一个模型 API 下配置多个模型服务的能力,每个模型服务通过 Glob 语法来匹配模型名称,从而实现上述的第一个场景。
除此以外,AI 网关的模型 API 支持基于不同的匹配规则创建不同的路由,可以基于请求 Header 或者请求参数中的参数值做匹配规则。
这样,我们可以通过 Header 中的 x-higress-llm-model
和 x-mse-customer
这两个标识作为路由匹配规则,实现通过消费者和模型名称路由的功能。
然后再配合模型 API 的限流策略,针对同一个消费者做 Token 限流,从而实现上述的基于不同的用户和模型做 Token 配额管理的需求。
再延伸一下模型路由的核心价值:
像 ChatGPT,豆包这类闭源 LLM,或者百炼这种托管 LLM 平台,都是以提供 API 的方式供大家使用 LLM 的能力,但是受限底层 GPU 资源的压力,以及整体平台的稳定性,每个用户都有请求 QPS 的最大限制(基于平台的 API Key 的维度),且上调比较困难。所以很多客户都有这个核心问题:如何突破这个限制问题?
这个问题有两类解决方案:
AI 网关在 LLM 服务级别支持多 API Key 管理的能力,每次请求会轮循取一个 API Key 向后端模型服务请求。并且 API Key 可以动态新增和删除,极大减轻了用户自己维护多个 API Key 的问题。
AI网关提供了结果缓存的预置策略,可以将请求和响应的内容存储到DashVector做语义化缓存,或者存储到Redis做精确缓存,从而提升推理效率。
支持用户自己选择用于做Embedding的模型,需要用户实现开通DashVector服务。并且支持只取最新提问和整合历史提问两种缓存键生成策略。语义化缓存的适用范围更宽泛一些。
精确缓存不涉及到 Embedding,是把用户问题和 LLM 的响应直接存储到 Redis 中。精确匹配的适用范围更窄,只适合非常垂直的一些场景。
现在 GPU 的资源是昂贵的,所以无论是自购 GPU 部署 LLM 还是模型托管平台都不会基于流量峰值去储备资源,所以才会有上文中的 QPM/TPM 限制的情况。但是站在用户业务健壮性的角度来看,如何在成本、稳定性、健壮性之间找到一个平衡点是更需要考虑的事。比如:我们公司的主力模型是 PAI 上部署的 DS R1 671B,但 GPU 资源并不是基于流量峰值储备的,所以当高峰期时,DS 服务会请求失败,有什么办法可以保证业务健壮性?
这类问题可以有两种做法,并且可以搭配使用:
AI 网关在模型 API 维度支持 LLM 服务的 Fallback 机制,并且可以配置多个 Fallback LLM 服务。当主 LLM 服务因为各种原因出现异常,不能提供服务时,AI 网关侧可以快速将请求 Fallback 到配置的其他 LLM 服务,虽然可能推理质量有所下降,但是保证了业务的持续性,争取了排查主 LLM 服务的时间。
除了传统的 QPS 限流降级以外,AI 网关支持更贴合 LLM 推理场景的 Token 维度的限流能力。可以针对模型 API 级别配置一个下游 LLM 服务可以承载的请求量级,在一定程度上保证了整体业务的健壮性,至于被限流的请求,可以返回一些人性化的信息,比如之前 DeepSeek 官网的服务器繁忙。
我们可以再延伸一下基于 Token 维度限流的其他核心价值:
AI 应用场景下的内容安全问题是大家都很重视的核心问题,模型托管平台通常都自带好几层内容安全审核机制,但是我们在 IDC 部署或者在 PAI 部署的,如何能方便的接入内容安全审核服务?
AI 网关中的模型 API 集成了阿里云的内容安全防护服务和 AI 安全护栏能力,可以一键开启,支持请求内容检测和响应内容检测。不过安全防护的规则还是要在内容安全服务侧配置。比如“树中两条路径之间的距离”这个可以让 LLM 无限推理的问题,从内容安全的常规规则来看,它是合规的,但是它却能对 LLM 服务的稳定性造成隐患,所以在 AI 网关开启了内容安全防护后,便可以快速的在内容安全防护服务中添加自定义规则来杜绝这类有潜在风险的请求信息。
延伸到内容安全在 AI 领域的核心价值有五类:
有些个人用户或者企业用户可能会发现部署了 DeepSeek R1 671B 的模型,但推理的结果和 DS 官网推理的结果有差距,似乎不满血?
推理的结果和 DeepSeek 官网推理的结果有差距是因为 DeepSeek 官网开启了联网搜索。DeepSeek R1 671B 的模型推理能力是很强,但训练的数据也是有限的,所以要解决幻觉还需是要在推理前先搜索和处理出比较确切的信息后,再由 DeepSeek R1 推理,所以联网搜索是非常关键的。目前模型托管平台提供的 DeepSeek R1 API 和自己部署的 DeepSeek R1 都需要自己实现联网搜索。
其实不只是 DeepSeek,目前除了百炼上的通义千问 Max 以外,其他的模型在 API 层面都不支持联网搜索,即使 ChatGPT 是最早推出联网搜索功能的,但 OpenAI 的 API 协议目前也还没有支持联网搜索。
AI 网关目前在模型 API 维度支持了夸克的联网搜索能力,提供多种搜索策略,可将搜索结果自动如何进输入 Prompt,无需用户对后端 LLM 服务做额外处理,并且我们对输入的问题也通过 LLM 做了意图识别和问题拆分,避免了很多无效的联网搜索,以及提高搜索内容的精准度。
很多使用 PAI 或者 ACK 部署 LLM 的用户,经常会遇到 GPU 服务负载不均的情况,这也是 AI 领域中比较常见的问题。我们和做基模的六小龙都交流过 GPU 服务动态负载的问题,每家的实现方式各不相同,并且实现难度比较大,好几个头部客户的做法是使用 Redis 将请求和 GPU 服务分离,等 GPU 服务执行完之后主动去 Redis 拿任务,从而解决 GPU 负载不均的问题。也有一些客户是自研或魔改 vllm/sglang/trt 推理框架,在模型网关层从推理框架侧获取到 GPU 服务的执行状态以及 GPU 资源的使用情况,从而判断做动态负载。
目前 AI 网关内部已经实现了基于 vllm 和 sglang 两个推理框架提供的监控指标来动态负载 LLM 服务的能力,AI 网关可以基于这些指标来决定路由流量到哪个节点,帮助用户提升 GPU 的资源利用率,从而优化成本和提升推理效率。
可观测是任何一个领域都必不可少的需求,但是 AI 场景的可观测和传统场景的可观测是有很大区别的,监控和关注的指标都是不同的,AI 网关结合阿里云日志服务和可观测产品实现了贴合 AI 应用业务语义的可观测模块和 AI 观测大盘,支持比如 Tokens 消费观测,流式/非流式的 RT,首包 RT,缓存命中等可观指标。同时所有的输入输出 Tokens 也都记录在日志服务 SLS 中,可供用户做更详细的分析。
AI 网关模型 API 的可观测核心能力:
将近3个月,我们交流了200多个客户,无论是编码方式构建 AI Agent 还是流程方式构建 AI Agent,使用 LLM 时遇到的问题基本上逃不出我上面总结那些问题,所以使用 LLM 的最佳实践就是通过 AI 网关代理 LLM 这种方式,在 AI 网关的模型 API 上根据业务需求做各类管控,在稳定性、灵活扩展性(适配业务多样性)、成本优化等方面帮 AI Agent 的大脑具有足够的健壮性。
05
上文中解析了 AI Agent 的第二个核心组件是工具,它为 AI Agent 提供外部能力,各类业务服务,数据库服务,存储服务等等。既执行 LLM 做出的决策。
然而,无论是和各种 Tools(各类业务服务接口)交互,还是和各类各类存储服务接口交互,都是通过 HTTP 协议的,和各类 Tools 的交互都需要逐一了解它们的返回格式进行解析和适配。当一个 AI 应用包含多个 AI Agent 时,或者一个 AI 应用需要和多个业务服务接口和存储服务接口交互时,整体的开发工作量是很大的:
直到 MCP 的出现,让我们看到真正解决 AI Agent 使用和管理工具复杂度的问题。
MCP 是模型上下文协议(Model Context Protocol)的简称,是一个开源协议,由 Anthropic(Claude开发公司)开发,旨在让大型语言模型(LLM)能够以标准化的方式连接到外部数据源和工具。它就像 AI 应用的通用接口,帮助开发者构建更灵活、更具上下文感知能力的 AI 应用,而无需为每个 AI 模型和外部系统组合进行定制集成。MCP 被设计为一个通用接口,类似于 USB-C 端口,允许 LLM 应用以一致的方式连接到各种数据源和工具,如文件、数据库、API 等。
MCP 目前一共有3个核心概念:
要真正理解 MCP 是什么,我们需要了解它的运作机制,然后你就能知道 MCP 的调用方式和传统的 HTTP 调用方式有什么不同,可能也能隐约体会到为什么我说 MCP 可以让 AI Agent 进入第二阶段。
如上图所示,一次基于 MCP 的调用,一共有6个核心的步骤。我们先拟定一个前提:
调用步骤解析:
在 MCP 的整个调用过程中有一个非常核心的点就是 MCP Server 以及 MCP Tool 的信息。从第一步,第二步可以看出,这个信息非常关键,是它让 LLM 知道了该如何解决用户的问题,这个信息就是 MCP 中最重要的 System Prompt,本质上就是PE工程。
MCP 不像传统的协议定义,它没有一个确定的数据结构。它的核心是通过自然语言描述清楚有哪些 MCP Server,承担什么作用,有哪些 MCP Tool,承担什么作用,然后让大语言模型通过推理去选择最合适的 MCP Server 以及 MCP Tool。所以它的核心本质上还是提示词工程。
上面两张图是 Cline(一个MCP Client)中的 System Prompt,可以清晰的看到它对 MCP Server 和 MCP Tool 都有明确的描述。
上图是流程中的第一步,将用户的问题和 System Prompt 一起发送给 LLM 的内容。
上图是流程中的第二步,LLM 返回了解决用户问题明确的 MCP Server 和 MCP Tool 信息。
看到这,我想大家应该对 MCP 是什么有一定感觉了。MCP 是不是解决了找接口和解析接口的问题?因为这两个工作都交给了 LLM。
那么可能有小伙伴会问,MCP 和 LLM 的 Function Calling 又有什么区别呢?核心区别是是否绑定模型或模型厂商:
如上图所示,LLM Function Calling 需要 LLM 为每个外部函数编写一个 JSON Schema 格式的功能说明,精心设计一个提示词模版,才能提高 Function Calling 响应的准确率,如果一个需求涉及到几十个外部系统,那设计成本是巨大,产品化成本极高。而 MCP 统一了客户端和服务器的运行规范,并且要求 MCP 客户端和服务器之间,也统一按照某个既定的提示词模板进行通信,这样就能通过 MCP 加强全球开发者的协作,复用全球的开发成果。
根据上文的一些列解释,我们可以总结一下 MCP 的本质:模型上下文协议(Model Context Protocol)并不是一个确定的数据格式或数据结构,它是描述 MCP Server/MCP Tool 信息的系统提示词和 MCP Server 与 LLM 之间的协同关系的结合,解决的是找接口和解析接口的问题。
明确了 MCP 本质之后,将其带入到企业级生产应用中,你就会发现,这两个核心点上会有很多挑战,或者说不足。
Anthropic对MCP Registry的官方定义:The MCP Registry service provides a centralized repository for MCP server entries. It allows discovery and management of various MCP implementations with their associated metadata, configurations, and capabilities.
从官方的定义中可以抽象出两个核心定义:
Anthropic 公布的 MCP Registry 的特性:
我们还是将 AI Agent 类比为角色扮演游戏中的角色,目前绝大多数的游戏,无论哪种类型,都有自己的一套技能系统,只是复杂度的差别而已。既然是统一的技能系统,那么意味着无论是低阶技能还是高阶技能,玩家都是在同一个地方去查看技能,游戏角色都是在同一个地方去学习、升级、管理技能,我还没见过哪个游戏学习技能要去不同的地图,在不同的 NPC 处学习。
回到 MCP 范式,目前会有2个问题:
所以 Anthropic 定义了 MCP Registry,目的是就期望解决以上两个问题,从而让 AI Agent 在获取 MCP 时,只需要从一个地方找 MCP 服务即可。
但 Anthropic 在定义 MCP Registry 时又忽略了一些企业级的能力,所以这是需要 MSE Nacos 来补足的,也是 MSE Nacos 作为 MCP Registry 的核心优势。
我们团队是中间件开源最多的团队,比如 Nacos,Higress,Sentinel,RocketMQ,Seata 等,并且还维护着 Spring Cloud Alibaba,Spring AI Alibaba,Dubbo 等这些开源开发框架,在微服务架构领域有着丰富的经验。所以在 MCP Server 和 MCP 提示词统一管理这个点上,天然的就想到了微服务领域里基于 Nacos 做服务注册发现和配置统一管理的模式,我们将其转嫁到了 MCP 范式,大家可以想一下以下这些对应关系:
我们拿 MSE Nacos 现有的的功能和 Anthropic 对 MCP Registry 的定义做一下对照:
MSE Nacos 的现有能力和 Anthropic 对 MCP Registry 的定义几乎完全一致。除此以外,MSE Nacos 作为 MCP Registry 还有其他更贴近企业级的增量价值:
所以在 MSE Nacos 这个产品中,我们做了一系列增强 MCP 的能力,使 MSE Nacos 成为统一管理 MCP Server 的 MCP Register(MCP Server注册/配置中心),是 AI Agent 技能池的的核心组件。
Anthropic 对 MCP Registry 虽然有标准,但目前核心只关注在统一公共数据源和定义 MCP 服务元数据规范这两点。官方也明确了有一些问题是不会去解决的,比如:
所以MSE Nacos 3.0 带来的 MCP Registry 是官方 MCPRegistry 的一个超集,除了兼容官方定义的 MCP 元数据格式、和 API 外,MSE Nacos 3.0 同时提供了结合 AI 网关,HTTP 转换 MCP 的能力,结合阿里云 KMS 提供 MCP 服务敏感数据加密的能力,同时结合目前开源的 Nacos router 也可以实现智能路由检索的能力,解决多 MCP 服务检索 token 消耗量大的问题。
通过这种方式构建的技能池,当需要 AI Agent 学习新技能时,不需要 AI Agent 做任何改动,你只需要在 MSE Nacos 中创建新的 MCP 服务,通过 AI 网关同步,编辑组装后的逻辑 MCP 服务,添加新的工具,然后向 AI Agent 对应的消费者里增加新工具的授权。然后你的 AI Agent 就自动学会了新的技能。
MCP 范式默认的传输协议是 SSE(Server Sent Event),本质上是一种长连接,有状态的传输协议。这种协议在企业级应用中有很多弊端:
好在 MCP 官方也意识到了该问题,所以在3月下旬,发布了新的 Streamable HTTP 协议。Streamable HTTP 改变了 MCP 的数据传输方式,让协议变得更灵活、更易用、更兼容:
简单来说,原来的 MCP 传输方式就像是你和客服通话时必须一直保持在线(SSE 需要长连接),而新的方式更像是你随时可以发消息,然后等回复(普通 HTTP 请求,但可以流式传输)。
这里大家可以思考一下:
所以 Streamable HTTP 传输协议是 MCP 服务赋能 AI Agent 的基石。而在上文中,大家应该不难发现,无论是AI网关直接转换,还是基于 MSE Nacos MCP Registry 转换,都是支持 Streamable HTTP 的,甚至可以让一个不支持 Streamable HTTP 传输协议的三方 MCP 服务具备 Streamable HTTP 的能力。
AI 网关侧对 MCP 服务的代理,无论是原生 MCP 服务的代理,还是 HTTP 服务转换而来的 MCP 服务,都可以复用 AI 网关内核的插件机制,可以对 MCP 服务灵活的设置预置策略或插件,如果有更贴近业务的需求,还可以开发自定义插件来实现。通常客户会使用插件机制实现 MCP 服务的限流降级,一方面做后端服务安全保障,另一方面是实现 MCP 服务的成本管控(三方原生 MCP 服务)。
身份认证和权限管控在任何架构,任何业务场景下都是刚需,在 MCP 范式下也不例外,这里有三个层面的权限管控:
大家设想一下,当传统业务可以0代码转换为 MCP 服务后,注册在 Nacos 中的 MCP 服务和工具肯定会有很多,从业务领域来说,可能有和财务相关的 MCP 服务,有和销售相关的 MCP 服务,有和售后服务相关的 MCP 服务。在返回 MCP 服务和工具信息时不可能将所有信息都返回,肯定只能返回 AI Agent(Client)身份有权使用的 MCP 服务信息。
目前 MCP 服务和工具的数量管控,主要通过 AI 网关的消费者认证体系来实现,每个消费者可以授权 MCP 服务及工具,然后将消费者分配给某 AI Agent(即 AI Agent 从 AI 网关请求 MCP 服务信息时 Header 里需要带着消费者的API Key),那么该 AI Agent 能获取到哪些 MCP 服务和工具的信息就可以被灵活的管控和配置了。
MCP 服务自身的鉴权认证同样分原生 MCP 服务和 HTTP 服务转 MCP 服务两种类型来说:
当 MCP 服务是数据类服务时会比较常见,比如 Mysql MCP Server,Redis MCP Server 等。权限会下探到库级别,表级别。在这种场景下,AI 网关可以通过插件机制,改写或增加 Request Header 的值,结合 MSE 治理将 Header 的值透传下去,然后在服务内部进一步做数据权限管控。
我举例一个通过这种方式实现的数据库读写分离的场景:
Anthropic 提供了各编程语言的 MCP SDK,目前支持 C#,Java,Kotlin,Python,Ruby,Swift,TypeScript 这7种语言。如果是一个初创公司,没有基础服务的积累,那么使用 MCP SDK 开发新的 MCP 服务是合理的。但是如果是一个存在了几年甚至十几年的公司,已经积累了很多业务服务,希望这些业务服务的能力能作为 AI Agent 的左膀右臂,那么使用 MCP SDK 将这么多的存量业务重新开发一遍,显然是不可能的,况且 MCP SDK 现在还没有支持 Go 语言。
所以 MCP 服务的类型,从构建的角度,可以分为两类:
众所周知,AI Agent 里涉及到 LLM 推理的场景,相比传统业务,其实是相对稀疏调用的场景。所以这里可以延伸出两个问题:
在所有的计算产品中,函数计算 FC 这种 Serverless FaaS 类型的计算产品,在资源粒度、弹性策略、弹性效率方面都是最适合稀疏调用场景的。和上文中作为 AI Agent 的运行时的逻辑是一致的。
函数计算 FC 目前支持了 Python、NodeJS 和 Java 三种语言的 MCP 运行环境(其他语言的 MCP 运行环境也马上会支持)。用户选择 MCP 运行环境创建函数后,只需要编写 MCP 工具的业务逻辑即可,不需要考虑如何使用 MCP SDK。并且 AI 网关和函数计算 FC 有深度集成,可以天然适配 AI Agent 开发的新范式。
阿里云百炼平台的 MCP 服务,底层运行时使用的就是函数计算 FC。
在 FunctionAI 的项目中,可以直接创建 MCP 服务。
这里创建的 MCP 服务底层就是基于函数计算 FC 实现的,所以除了 MCP 需要的传输协议类型、认证、语言(目前支持 Java、Python、NodeJS)外,还可以灵活的设置运行该 MCP 服务的资源规格大小,以及弹性策略、网络配置等。
创建好 MCP 服务后,我们只需要填写业务代码即可。
基于函数计算 FC 构建的 MCP 服务在弹性效率方面可以从两个维度来看:
函数计算 FC 的实例规格从 0.05C 128MB 到 16C 32GB 不等(也可以支持更大的规格),有几十种规格的组合方式,可以灵活的根据不同 MCP 服务承载的业务选择合适的资源规格。另外,在 AI 应用中,尤其是流程式构建的模式中,除了带有 Palnning 的 AI Agent 外,大多数 AI Agent 的职责都相对单一,计算逻辑都不复杂,所以都可以用较小资源规格的函数承载。资源规格小,在资源调度,弹性效率方面自然就会有优势。
再看函数计算 FC 的弹性机制,它是完全按照请求弹性的,有多少 QPS,就拉起对应数量的实例,并且实例可以复用,当 QPS 降下来后,空闲的实例会自动释放,整个过程完全不需要用户介入参与。在默认按请求弹性的的基础上,用户还可以自行设置按照时间定时弹,或按照指标阈值扩容的策略,进一步满足复杂多变的业务场景,做到资源成本最优。
除此以外,Serverless 计算产品,不需要用户关注底层 IaaS 资源,几乎没有运维的接入,由研发就可以快速创建函数拉起资源做业务开发和测试,所以大幅度提升了研发运维的效率,映射到成本方面,虽然不好量化,但是人力成本,时间成本也是不容忽视的。
函数计算FC有完善的可观测体系,也就意味着,基于函数计算FC构建的MCP服务同样具备指标、链路、日志三个维度的可观测能力。
通过这套可观测体系,用户可以清晰的了解每个MCP服务的各类运行状态。
在这段时间我们和客户的交流来看,几乎所有的客户都认为最有价值的是使用 AI 增强、提升现存业务,使其变成一个 AI 应用或 AI 加持的业务,而不是完全新开发一套 AI 应用。所以开发一个 AI 应用或者做现存业务的 AI 增强,AI Agent 是需要和大量现存业务做交互的,MCP 虽然统一的协议,但将现存业务重构为 MCP 服务的成本是非常高的,并且目前支持的开发语言有限,像Go,PHP 都没有对应的 MCP SDK,所以会让很多企业想拥抱 MCP,但又无从下手。
网关最擅长做的事情就是协议转换,所以 AI 网关的第二个核心功能就是 MCP服务管理,包括:
在这个章节,我们主要讨论如何将普通的 HTTP 服务0代码改造的转为 MCP 服务,这种转换有两种方式。
AI 网关支持所有主流的服务来源发现方式,可以将部署在各种计算资源上的传统服务接入进 AI 网关:
当后端服务接入 AI 网关后,便可以在 MCP 管理中创建 MCP 服务,选择接入的后端服务。
创建好 MCP 服务后,因为普通服务中有的是各个接口或方法,没有工具的概念,所以第二步是需要对该 MCP 服务创建工具,也就是将该 MCP 服务的工具和代理的普通服务的接口做映射关系。
配置好工具后,这个 MCP 服务其实就已经是可用状态了,用户可以通过调试功能对该 MCP 服务做测试。AI 网关负责做普通服务接口和 MCP 服务工具映射关系的协同和转换,并且同时提供 SSE 和 Streamable HTTP 两种传输协议。
除此以外,用户可以基于业务需求对该 MCP 服务添加更丰富的插件和策略,比如对 MCP 服务做限流降级保护、设置超时策略、设置 IP 黑白名单、数据脱敏等等。如果我们预置的策略和插件依然不满足用户需求,那么用户可以开发自定义插件上传到 AI 网关使用。所以,整体灵活性和可扩展性是非常强的。
从整个流程大家应该不难看出,通过 AI 网关将一个传统的现存服务转换为 MCP 服务不需要修改任何业务代码,只需要在控制台白屏化的操作即可,唯一的工作量就是编写接口和工具映射的那个 Yaml 文件。针对这一唯一工作量,我们也还在持续探索,找到更好的帮用户自动生成 Yaml 的方案。
另一种更加推荐的企业级 HTTP 服务转换 MCP 服务的方式是引入 MSE Nacos 作为 MCP Registry,无论是原生 MCP 服务还是普通服务,都由 MSE Nacos 作为 MCP 注册中心统一管理。普通服务和 MCP 服务之间的映射关系由 MSE Nacos 完成,AI 网关和 MSE Nacos 深度集成,动态发现注册在 MSE Nacos 中的 MCP 服务,然后代理暴露出去。
将服务注册进 Nacos 有两种方式:
我们来看看白屏化手动注册的方式,相对比较直观。注册服务这部分和之前使用 Nacos 的方式一样,创建服务,然后在服务中创建实例。
注意:上图的 IP 字段可以填写 IP,也可以填写域名。
后端服务注册好之后,在 MCP Registry 功能中创建 MCP 服务,这里同样支持 HTTP 服务转 MCP 服务,和直接创建原生 MCP 服务。
选择 HTTP 转化 MCP 服务后,展现出来的基本信息和使用 AI 网关比较类似,MCP 服务的核心元素都一样,但唯一的一个区别是多了服务版本,这就是上文中我说的企业级的特性之一。
然后是给该 MCP 服务添加工具,工具和参数的基本信息做了白屏化的配置方式,工具和后端服务接口的映射关系(requestTemplate)配置还是黑屏化的方式,如上图所示。
至此一个简单的 MCP 服务在 MSE Nacos MCP Registry 中就创建完成了,我们可以回到 Nacos 的配置管理/配置列表模块,可以看到每个 MCP 服务都有三个对应的配置信息。
Nacos 作为主流的注册配置中心,配置信息是支持加密的,所以这也就意味着 MCP 服务工具的Prompt也都是加密存储的,这也企业级的特性之一。
在我们和客户的交流过程中,几乎和左右的客户都能达成一个一致的观点,那就是在 MCP 范式下,发布一个 MCP 服务的新版本,不一定要修改该 MCP 服务后端服务的代码,而大概率只需要调整 MCP 服务工具的描述(Prompt)即可,因为同一个 MCP 服务工具的同一个参数,修改了描述后,对于 LLM 来说,可能就已经变成了服务于另一个领域的 MCP 工具了。并且在我们协助客户的落地过程中,调整测试 MCP 服务工具的描述(Prompt)本质上就是一个 PE 工程,所以 MCP 服务的版本管理至关重要。
我们编辑刚才创建的 MCP 服务,修改其版本号。
然后修改工具参数的描述,将“风控根据项目 wbs 查询开工项目信息,成本跟踪人员信息”,改为“风控根据项目 orderId 查询开工项目信息,成本跟踪人员信息”。
此时,该 MCP 服务就出现了多个版本,可以灵活切换不同的版本。无论是做 MCP 服务的灰度,还是在调试测试阶段都是非常有用的。
MSE Nacos 作为 MCP Registry 的核心能力是 MCP 服务的统一管理,包括MCP 服务版本管理和工具Prompt加密管理,对外暴露 MCP 服务和针对 MCP 服务添加策略/插件、消费者认证等还是需要通过AI网关,所以 AI 网关和 MSE Nacos 做了深度集成来实现这一企业级的链路。
首先在 AI 网关中,需要将 MSE Nacos 对应实例作为服务来源。
然后在 MCP 管理模块中,同步 Nacos MCP 服务
在 MCP 管理列表中会有明确的标识,方便用户识别每个 MCP 服务的构建方式。
AI 网关中,从 MSE Nacos MCP Retistry 动态发现的 MCP 服务,同样可以对其设置各类策略和配置各种插件、支持 SSE/Streamable HTTP 两种传输协议、消费者认证、查看日志等功能。
综上所述,构建 MCP 服务有两种方式:
06
AI 应用观测体系
在 AI 时代,随着模型和应用侧的快速演化,对于推理过程,成本和性能显得尤为重要,而端到端的 AI 可观测是其中至关重要的一环,当前的 AI 应用生态主要可以分为三个方面:
在 AI 应用的开发的时候,主要会面临哪些痛点呢?主要总结了以下三个方面。
第一个就是怎么把它用起来。第二个是要用的省,第三个是用得好。
基本上我们就在解决这三个问题,通过一些可观测性的手段去解决这三个问题。对在这个解决问题之前,先介绍下我们的 AI 应用开发里面一个典型的应用架构。
基本上可以划分为 3 个大板块,从用户业务层,到 AI 应用层,也就是我们的 AI Agent(图中中间这部分),到我们的模型服务层,其实基本上可以划分为三个大的板块。首先我们从用户界面进来,可以通过iOS、Android、小程序等入口进来,我们的生产环境里面会有一个 API 网关来完成流量的防护,API 管理能力,这和传统微服务是一致的,这里的 API 网关可以通过像开源的 Higress 的能力,能够去帮大家做统一 API 管理。流量从 API 网关进入到 AI 应用层,我们有各种用 Python 或者 Java编写的应用程序。这些程序会去调用不同的模型,从模型的高可用以及对比层面,我们通常会部署多个模型,然后根据一定的策略,在各种模型之间做一些切换,例如按照成本,按照重要程度,按照流量策略,分别调用不同的模型。这个时候,就需要一个统一的代理来实现通用的能力,也就是我们这里展示的 AI 网关。它可以去帮助我们做统一的流量防护,Token 的限流,以及敏感信息的过滤,模型内容的缓存等等。这样的话,AI 应用就不需要感知在多个模型中去做各种切换了。
我们首先要解决的是一次调用到底经过了哪些组件,通过调用链把这些组件全部串联起来。要实现全链路的诊断,首先要把这些链路能打通,一个请求出现问题的时候,到底是哪个环节出问题了,是在AI 应用出问题了,还是这个模型内部推理出现了问题,我们需要能够快速定界。
第二需要构建一个全栈的可观测数据的平台,它能够把所有的这些数据,不仅是链路,还包括指标,例如模型内部的一些 GPU 利用率,数据之间能够很好关联起来,通过关联分析能够去知道到底是应用层出问题,还是模型底层出问题了。
最后我们还需要通过一些模型日志,了解每次调用的输入输出是什么,并利用这些数据做一些评估和分析,来来验证 AI 应用的质量。
从这三个手段入手,从监控的这个领域来说的话,我们在不同的层面上提供了不同的一些观察的手段和核心的关注点。
例如在用户层的话,我们可能通常需要分析会话是不是有卡顿,对用户体验是否造成了影响。在应用层里面,我们通常会关注响应的耗时,是否出现了异常,还有推理的延时等等。在网关层面,或者依赖的一些组件,包括 MCP/Tools,以及一些其他的向量数据库等,我们会去关注它的一些可用性,在模型服务层,我们通常会关注它的推理的效果和成本,最好在基础设施这层,我们会关注这些资源的一些利用率,缓存的一些命中率的一些情况。
在阿里云,我们提供了一套完整的全栈解决方案,来确保整体观测是没有盲区的。
从最底层智算服务器,提供基础设施的监控能力,到通过容器服务自行部署的一些模型能力,再到 AI 平台像 PAI 这样的 PaaS 产品,覆盖了从训练到推理的各个阶段,到像百炼这样的大模型服务平台 MaaS,以及再往上到 AI 应用开发,都能够有一个从上到下的立体化的一个全栈的可观测的能力。
接下来的话给大家介绍一下具体的一些实践。第一个就是基于 Trace 的全链路诊断能力,如何去打通刚才说的全链路调用的。我们基于 OpenTelemetry 这套追踪的规范,从用户端侧开始,到 API 网关,到 AI 应用层,到 AI 网关,再到模型层,都进行了埋点,这些有一部分是手动的埋点,比如网关层,在应用层和模型内部层采用的是无侵入的自动埋点,最终把各个环节的追踪数据,上报到阿里云的可观测平台。
在 AI 应用内部,我们对常用的 AI 开发框架都进行了埋点,其实一个典型的 AI 应用内部的流转还是非常复杂的,包括 RAG, 工具的使用,以及模型调用等多种复杂场景,我们会针对这些关键的节点进行埋点,能够抓取到每一步的详细执行过程。无论应用采用 Python 还是 Java 进行开发,我们可以通过一些无侵入的方式,挂载可观测数据采集的探针,挂载到 Python 或者Java 程序里面,去采集AI 应用本身内部的一些实现细节。另外,在模型推理阶段,它底层其实也是一个 Python 程序在运行,我们发现数据采集探针也可以部署到模型推理层,去采集了很多模型内部推理过程的一些信息。因此我们能够从这个用户终端开始到模型最底层推理这一条整个链路给串起来。
在这个过程中,由于 AI 应用的迭代速度非常快, OpenTelemtry 社区的语义规范也在不断演进,我们基于社区的规范和内部的实践,定义了一套面向 AI应用的一个语义规范,这个规范其实可以理解为我们需要采集哪些指标,在调用链中需要记录哪些数据,将他们以怎样的形式存储下来。在此基础上,我们也在跟社区紧密沟通,把我们的一些能力也往社区去反馈和贡献。
跟传统微服务应用所关注的黄金三指标(请求数,错误,耗时)相比,AI 应用的黄金三指标是什么?可能是 Token,Error,Duration。耗时主要关注的是模型推理延迟,比如就是在推理过程中,我们通常需要关注模型的首包延迟,就是叫做 TTFT(Time to first token),这个指标反映了相应的速度,还有像 TPOT 反应的生成的效率和流畅度,在下一页会具体介绍。
Token 可能是 AI 应用最重要的一个指标,每次请求会记录 Token 的消耗情况,另外甚至我们需要精确地区分 Input token 和 Output token 的消耗情况,到底为什么呢?因为大家知道模型的定价里面 input token 的 output token 的定价都是不一样的,我们在成本核算的时候,会将输入 token 和输出 token 分别进行统计。还有像系统的利用率,包括 GPU 使用率,模型 KV 缓存的命中率等。在每一个领域,都会有一些比较黄金的指标。
接下来重点介绍下,在模型推理阶段比较重要的两个关键指标,TTFT 和 TPOT,这两个东西其实分别反映了模型推理时两个关键阶段的性能。
模型推理时有两个核心的阶段,第一个叫 Prefill,其实就是在我们把提示词输入给模型的时候,它会把提示词作一个输入,然后去进行 tokenize,也就是把你的那些自然语言变成一个模型的 token,然后这些 token 之间会计算它的一些相似度,然后把它的结果保存在一个 KV Cache 里面,从input 到了模型,然后模型吐出第一个 token 为止,这个阶段叫做 Prefill。TTFT,就是首包延迟时间,是衡量这个阶段的耗时,去衡量我们的推理效率的一个非常核心的指标。
第二个阶段就是在吐出第一个 token 以后,接下来每一个新的 token 都需要把这个 token 的过去生成的那些结果作为一个输入,再喂给模型,然后计算下一个 token,它是一个不断迭代的过程。所以他这个过程中会有模型的推理过程,会有一些缓存,能够帮我们去缓存中间的结果。从第二 token 开始到最后一个 token 出来,整个阶段就是我们叫做 decode,这是第二个比较重要的阶段。在这里面它每一个 token 出来的平均间隔时间,我们叫做 TPOP(Time Per Output Token)。TTFT + TPOT * (总token 数-1),基本就能推导出推理的关键耗时。
针对单个请求来说,最关注的就是这两个指标,一个TTFT,一个 TPOT。然后还有一个指标比较重要的就是我们的吞吐率。吞吐率的话其实就是衡量我们这个模型本身,同时能够去支撑多少个推理请求。所以这几个指标其实它是有一些平衡在里面,也不可能就是这三个指标同时满足的特别好。比如说在线推理的场景下,我们会通常会关注更快的 TTFT 和 TPOT。但是在离线分析的时候,我们可能一批一批量会为给模型一批数据他去做分析。我们希望模型能够提供更好的吞吐率,而 TTFT 反而就没有那么关注了。这些关键指标,我们都会采集上报上来,并且重点展示出来。
接下来介绍下我们是如何实现对上述数据的采集的。其实作为一个 Python 程序的话,它其实有一些机制能够让我们去实现一个无侵入的一个埋点,我们的方案基本上基于这个 OpenTelemetry 的Python agent 为底座,然后在上面做了一些扩展和增强,首先就是我们对于一些常用的国内的一些开发框架,比如说国内比较流行的 Dify、LangChain 或者 LlamaIndex 等框架进行了埋点的支持,使得我们通过无侵入的方式能够把这些数据信息给采集上来。其次,我们在开源探针的基础上,做了一些稳定性和性能优化的一些事情,能够帮助探针以一个非常低成本的方式进入到 AI 框架的工作流程里面,去采集到各种各样的想要的那些调用链、指标和日志等信息。
这里是对探针的埋点原理的一个简单的介绍。
左边是一个 Python 程序,简单的 hello 方法。Python语言,它本身提供了一个叫做 monkey patch 的一种机制,允许我们的程序在运行的时候去动态地修改一个函数,包括它的属性和方法。所以我们只需要去在它的外层重新定义一个包装的方法,这个方法可以在原始方法执行前后做一些事情。这有点像我们在设计模式中见到过的装饰器模式。
这个 hello 就是原始的方法定义,Python 程序运行的初始化的阶段,可以把原来那个函数的类似于引用给替换掉。这样的话其实实际执行的就是替换后的包装方法。在包装后的方法里面,还会去调原来的那个方法。最后的结果,就像第 4 步看到的,可以实现在原始的方法的前后去插入一些我们想要的一些逻辑。然后通过这种方式,我们就能够实现一个在用户的代码不修改的情况下去采集各种数据。
那阿里云提供的 Python 探针能力和开源的有什么区别呢?
第一个就是我们在刚才说的在 AI 应用开发框架中,在一些常见的开发框架的支持上是最为全面的,包括大模型的一些核心指标。TTFT/TPOT 等指标,以及在模型的输入输出这些数据上,做了一个非常完整的支持,包括流式场景下的数据采集能力也是完整的支持。
另外,我们还支持一些生产实践上的特性,很多 Python 应用会使用多进程来提升并发度,例如 unicorn 或者 gunicorn。在这种模式下,开源的 OpenTelemetry 探针在支持上面都会有一些问题,某些场景下挂载了探针之后有可能导致应用无法启动,或者数据无法采集等等一些问题。在更严重的情况下,它可能还会把一些进程给搞挂。另一方面,很多 Python 进程还会使用 gevent 来实现协程,来进一步提高程序整体的吞吐率,比如 Dify 就会使用这个能力。当开了 gevent 能力之后,开源的 OTel 探针,会让这个进程卡住,业务无法工作,更不要说去采集数据了等等一系列问题。这些场景下我们都提供了完整支持。基本上能够让这些 Python 程序很好的在生产实践上能够部署起来,能够比较安全稳定地采集可观测数据。
此外,针对流式上报的场景,我们也做了一些优化。在阿里云的内部很多业务也使用了这个数据采集的探针,当一些大流量的场景下,比如网关想要去采集这个流式的数据,模型的返回结果可能是比较大的,一次调用可能会有几千上万个 token 产生,流式场景下 token 是一批一批的返回的,如果要完整的采集输入输出,需要在网关中去缓存这些 token 数据,一直等到结束以后再把数据往上报,在高并发的情况下,这种方式会对我们的应用有一些内存占用造成一些压力,因此我们也做了一些优化方案,将数据进行拆分上报,把这些数据分批地上报到服务端,然后在服务端把这些内容再组合还原,起到降低内存占用的效果。
接下来专门介绍下 Dify 这块的实践。就我们目前接触下来,大量的开发者都在使用 Dify 做这个AI Agent 的开发平台,包括我们内部也用到了 Dify,给大家分享下在生产中遇到的一些问题以及建议。首先简单介绍下 Dify 的系统架构。请求从前端进来,通过 Nginx 反向代理,达到 API 后端,这个后端是由 Flask 部署的后端。这个 API 后端会将一些复杂的任务,放到 Redis,再由另外一个 worker 组件去执行这些后台任务,同时把一些数据存储在对象存储和 PGSQL 当中。
1.在做 RAG 的过程中,在上传一些文档的时候,有时候会超过 Nginx 默认的上传的限制,此时建议的话是调大 NGINX_CLIENT_MAX_BODY_SIZE 这个值。
2.就是数据库的连接池,Dify 的 workflow 在运行的时候,一个请求就会一直保持一个数据库连接,Dify 默认的这个 PGSQL 的连接池的大小是比较小的。如果一旦那个连接打满了,就会出现整个业务卡住的这个情况。当平台上运行的应用任务变多的时候,很容易出现连接池打满的情况,所以我们建议的话是把这个 PGSQL 的数据库连接池调大到 300 或者以上。
3.Dify 中的 Redis 同时承担了两个职责,一个是做缓存,同时也做消息堆列,可以使用 Redis 的哨兵模式来提升高可用性。同时,我们通过挂载探针,采集到的数据,也观察到它的架构上使用不合理的地方,比如通过 Redis 去管理任务的时候,一次 workflow 的请求,实际我们观察到可能会访问上千次 Redis,原因是 Dify 一直在轮询 Redis,去获取这个任务的状态是否结束。这个本质上就是一个消息队列,是一个非常常用的场景,完全可以用消息队列去实现它。只要在这个任务结束之后发一个消息,然后另外的一个组件就可以去直接消费它,不需要去频繁地查询 Redis。我们建议在大规模的场景下,用这个消息队列 RocketMQ 来替换 Redis。
4.Dify 内部使用的是存放在本地的,也建议替换为第三方向量数据库,还有内置的一些存储,其实在高可用性,稳定性上面都是有问题的,建议替换为云存储。
5.最后是可观测性, Dify 本身内置的一定的可观特能力。开启之后,每次执行一个 workflow,都能看到每一个阶段它的一个耗时这些情况。但是这个功能需要每个应用单独去配置。然后,观测维度上相对比较单一,就是在 workflow 的每一步能观测到,但如果这个程序又跟外部的一些微服务,比如说传统的 Java 应用互相调用的话,或者调用了模型侧的能力,它的调用链就没法串起来的,也就是数据相对比较孤立。另外,它的可观测性的数据是存到 PGSQL 数据库中,在规模量很大的时候,它的查询效率也很低,如果要去拉长时间去查询,结果会发现查询会非常卡。
使用阿里云的探针在采集可观测数据,可以解决上述的问题,一次接入,所有应用全体生效,并且支持将多个 APP 的观测数据进行拆分。同时,基于 OpenTelemetry 可以将 Dify 内部的流程和外部的微服务调用和模型推理完整的穿起来,包括每个流程的 input/output 和 token 消耗,能够支持多层级的全局维度进行分析,并且解决了高可用和稳定性的问题。我们在实践的过程中发现,当 Dify 开启 gevent 协程的时候,挂载开源的探针会造成程序 hang 住业务无法继续运行的问题,对业务造成了严重的影响,我们也解决了这个问题,能够让业务低成本稳定的采集可观测数据。
针对模型推理这一侧,我们也进行了可观测数据的采集,能够观测到模型内部推理过程中的细节。目前市面上开源的 vLLM 和 SGLang 这两个比较著名的推理加速框架,通过内存分块,KV 缓存复用等方式大幅度模型的推理的效率。
由于它本身也是一个 Python 程序,我们可以用同样的方式去观测采集到 vLLM 内部的流转的细节,去采集到它内部的一些执行路径,能够采集到调用链和前面提到的核心指标例如 TTFT 和 TPOT 等。这里也介绍一个通过我们的可观测能力定位问题的真实案例,某个业务通过 AI 网关发现调用自建的 Deepseek 模型耗时特别高的场景。
首先通过全链路追踪,分析调用链能够看到定位到底是哪一个阶段的问题,由于 Dify 和模型都接入了探针,通过耗时分析发现不是应用层的问题,而是模型推理那一层的问题。然后再看模型侧的一些黄金指标,包括 TTFT 和 TPOT,发现都比较正常。那再进一步的检查,由于我们记录了单个推理请求运行相关的信息,包括推理引擎里面的一些排队的情况,可以发现当时这个请求本身在推理引擎里面在排队,所以确认是这个推理请求排队导致的耗时升高。解决办法就是调大推理引擎中请求队列的大小配置,所以通过这个可观测性,我们就能够定位到一些推理的根本原因,同时指导下一步的动作和建议。
然后接下来讨论一下这个模型的质量的问题,我们想要解决模型回答得好不好,每次模型的升级和优化,我们都需要建立一个基线,并且确保模型的迭代满足这个基线,否则回答的质量会导致用户体验的受损。为此,我们把模型的 input/output 全部都采集到阿里云的日志平台中,然后接下来我们可以拆选出一批记录,通过一些数据加工,引用外部的裁判员模型,对当前这个模型的回答的输入输出结果进行一个评估。这个评估我们有一些系统内置的评估模板,当然未来也支持自定义的评估模板,比如说我们可以去分析这个模型的回答到底有没有敏感词,有没有幻觉,有没有 MCP 投毒攻击等等情况。
大概的效果如上图所示,比如说我们的这个提示词是这样的,然后它去调一个模型,这是模型返回的结果。然后我们可以从一个模型的模板去评估它是不是正确地回答了这个问题,它的回答到底靠不靠谱,是否有毒等等。然后我们还可以对评估的结果进行一些分类和聚类。也就是说可以对这些结果,进行一些语义化的标签的孵化。比如说这个模型的可能这次回答同时是一个友善的回答,属于一个文化类的问题等等。
最后聊一聊 MCP 的问题,MCP 解决了 AI 应用调用 Tools 的标准化问题。在实践 MCP 的过程中,我们也发现有一个很大的问题,我们叫做 MCP 的 Token 黑洞问题。
这个最核心的问题就是当我们构建了一个使用 MCP 工具的 AI Agent,当输入问了一个问题,模型最终给出了一个回答,这个回答可能能耗 1000 个 token。但实际上他背后可能掉了几十次模型,背后调用非常多的 MCP tools,实际消耗了可能有上万个 token。如果我们只看最终它的输出,很容易忽略背后的细节,而中间的计算过程,每次和模型的对话,都会把历史的对话以及 MCP tools 的调用结果,一起作为 input 再发给大模型,这个过程是不断叠加的,次数越多消耗的 token 越大。因此我们非常需要 MCP tools 的可观测性,需要采集到每一个 MCP tools 的调用的耗时,消耗的 token 情况。
这是阿里云的云监控 2.0 平台,这是我们的大模型可观测产品页面。我们提前部署了一个 Dify 应用,并预先编排了一些 workflow,并且挂载了探针,接入了云监控 2.0 平台,可以看到应用概览,能够展示模型的调用次数,Token 消耗,调用排行等信息。
查看关联的拓扑信息,从 Client 到 Dify,再到 vLLM 部署的一个 7b 模型都看到关联关系,并且支持进一步的下钻。
调用量分析视图,能够看到 input/output 的情况,Dify 中 workflow 的每一步执行情况,这里的每一步都对应了 Dify 中的一个流程,以及 vLLM 内部的推理执行情况。
这个 vLLM 7b 的模型是部署在 PAI 平台上的,通过实体关联,可以进一步分析 PAI 底层模型的指标信息,例如 GPU 利用率,KV cache 命中率等。
通过会话分析,展示多轮对话的每一个轮的对话详情。
通过外部裁判员模型对历史的模型输入输出,进行评估。
对模型的回答进行语义提取,并进行聚类展示。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-08-30
大模型的“思维链”(Chain-of-Thought):AI 是怎么一步步“推理”的
2025-08-30
Agentic AI与WorkFlow的相互成就
2025-08-29
刚刚,xAI 发布 Grok Code Fast 1 编程模型,快、便宜、免费
2025-08-29
大模型时代有了自己的「价值高速公路」
2025-08-29
A I智能革命——上下文工程新突破
2025-08-29
知识库检索准不准,关键看模型选没选对!一份评测指南请收好
2025-08-29
我如何用Prompt工程将大模型调教成风控专家
2025-08-29
度小满金融大模型技术创新与应用探索
2025-08-21
2025-06-21
2025-08-21
2025-08-19
2025-06-07
2025-06-12
2025-06-19
2025-06-13
2025-07-29
2025-06-15
2025-08-28
2025-08-28
2025-08-28
2025-08-28
2025-08-27
2025-08-26
2025-08-25
2025-08-25