包含关键字 typecho 的文章

“通用性不再是主要瓶颈,部署中的任务集熟练度和可靠性才是决定机器人能否真正落地的关键。”在近期的一场采访中,智元机器人合伙人、首席科学家罗剑岚称,2026 年是机器人从会做很多事但每个事做得不太好走向把事情做好并落地的关键节点,要求学习范式从静态离线训练升级为部署学习再部署的整套数据闭环系统。

 

他表示,正是基于这个判断,智元机器人具身研究中心提出了 SOP(Scalable Online Post-training),一套面向真实世界部署的在线后训练系统。SOP 的核心目标是,让机器人在真实世界中实现分布式、持续的在线学习。

 

据罗剑岚透露,智元今后会在所有机器人上应用 SOP。今年,智元计划部署比现在大几个数量级的机器人,真正找到机器人真实场景部署和真实场景落地的 Scaling law。

 

要在真实世界中大规模运行,通用机器人必须同时满足两个看似矛盾的要求:在复杂多变的环境中保持稳定性与可靠性;在处理差异巨大的任务时,仍具备良好的泛化能力。现有 VLA 预训练模型已经提供了强大的通用性,但真实世界的部署受困于更高的任务专精度要求以及离线数据采集方式的边际效益递减,往往需要通过后训练获得更高的任务成功率。

 

然而,当前主流的 VLA 后训练方法仍受离线、单机、串行采集等因素制约,难以支撑高效、持续的真实世界学习。这些限制并非源自具体算法,而是来自学习范式本身。智元方面介绍,SOP 改变的不仅是训练范式,更是机器人系统的生命周期。如果说 VLA 让机器人第一次具备了通用理解与行动能力,那么 SOP 所做的是让众多机器人的经验共同驱动智能的快速成长。

 

“SOP 目前不是完全开源的,但不排除未来开放的合作形式。”罗剑岚表示,智元从成立之初就坚持走生态开放的路线,希望跟更多厂商一起共建 SOP,把 SOP 的闭环真正接入到业务流程里。SOP 不是封闭系统,而是一种新的持续学习、在线学习、协同进化的方式,任意的后训练算法和模型都可以接进来,智元会开放一些 SOP 的关键模块和接口。

 

从长远来讲,智元的目标是构建一个开放的机器人在线学习生态,不同的机器人本体都可以接入,让数据共享上传到云端一个大脑,数据回传回来并不断进化,给大家使用。

SOP:分布式在线后训练框架

SOP 采用 Actor–Learner 异步架构,本身是一套通用的框架,可以即插即用的使用任意后训练算法,让 VLA 从在线经验数据中获益。智元选取 HG-DAgger(交互式模仿学习)与 RECAP(离线强化学习)作为代表性算法,将其接入 SOP 框架以进化为分布式在线训练。

 

据介绍,他们将 VLA 后训练从“离线、单机、顺序”重构为“在线、集群、并行”,形成一个低延迟的闭环系统:多机器人并行执行 → 云端集中在线更新 → 模型参数即时回流。

 

 SOP 架构设计图

SOP 的关键优势包括:

• 高效状态空间探索。分布式多机器人并行探索,显著提升状态–动作覆盖率,避免单机在线学习的局限。

• 缓解分布偏移。所有机器人始终基于低延迟的最新策略进行推理采集,提升在线训练的稳定性与一致性。

• 在提升性能的同时保留泛化能力。传统的单机在线训练往往会使模型退化为只擅长单一任务的“专家”, SOP 通过空间上的并行而非时间上的串行,在提升任务性能的同时保留 VLA 的通用能力,避免退化为单任务专家。

实验评估:性能、效率与 Scaling Law

实际效果方面,智元围绕三个方面对 SOP 进行了系统性评估。

 

首先是 SOP 能为预训练 VLA 带来的影响。实验结果说明,在各类测试场景下,结合 SOP 的后训练方法均得到了显著的性能提升。

 

相比预训练模型,结合 SOP 的 HG-Dagger 方法在物品繁杂的商超场景中实现了 33% 的综合性能提升。对于灵巧操作任务(叠衣服和纸盒装配),SOP 的引入不仅提升了任务的成功率,结合在线经验学习到的错误恢复能力还能明显提升策略操作的吞吐量。结合 SOP 的 HG-Dagger 方法让叠衣服的相比 HG-Dagger 吞吐量跃升 114%。SOP 让多任务通才的性能普遍提升至近乎完美,不同任务的成功率均提升至 94%以上,纸盒装配更是达到 98%的成功率。

 

 

为了进一步测试真机 SOP 训练后 VLA 模型是否达到专家级性能,他们让 SOP 训练的 VLA 模型进行了长达 36 小时的连续操作,模型展现出了惊人的稳定性和鲁棒性,能够有效应对真实世界中出现的各种疑难杂症。

 

其次,智元使用了三种机器人队伍数量(单机、双机、四机配置),在同样的数据传送总量的基础上,进行了比较。实 验结果表明,在相同的总训练时间下,更多数量的机器人带来了更高的性能表现。在总训练时间为 3 小时的限制下,四机进行学习的最终成功率达到了 92.5%,比单机高出 12%。

 

他们认为,多机采集可以有效阻止模型过拟合到单机的特定特征上。同时,SOP 还将硬件的扩展转化为了学习时长的大幅缩短,四机器人集群相比单机能够将模型达到目标性能的训练速度增至 2.4 倍。

 

 SOP 学习效率提升

 

此外,他们探究了 SOP 和预训练数据之间的关系,把总量为 160 小时的多任务预训练数据分为了三组:20 小时,80 小时和 160 小时,分别训练一组初始模型后再进行 SOP。接着发现,预训练的规模决定了基座模型和后训练提升的轨迹。SOP 能为所有初始模型带来稳定的提升,且最终性能与 VLA 预训练质量正相关。

 

同时,对比 80 小时和 160 小时实验效果,在解决特定失败情况时,在轨策略经验带来了非常显著的边际效果。SOP 在三小时的在轨经验下就获得了约 30%的性能提升,而 80 小时额外人类专家数据只带来了 4%的提升。这说明在预训练出现边际效应递减的情况下,SOP 能够高效突破 VLA 性能瓶颈。

 

 SOP 在不同预训练数据规模下的对比

 

最后,智元将机器人队伍放到了预训练模型没有见到的真实新环境下执行任务,并使用 SOP 进行在线训练。当机器人被置于不同的环境时,即便是同样的任务,起初成功率和吞吐量如预期般下降,但在 SOP 介入仅仅几个小时后,机器人的性能便显著回升,能够鲁棒地执行相对复杂的实际任务。

在GEO这一快速演进的领域,评估服务商的实力需要一套超越表面指标的体系。我们深化提出的 P.A.C.E.战略价值评估模型,从平台适配力、商业转化力、持续进化力与生态构建力四个维度,对头部服务商进行了一次“技术体检”。以下是基于最新调研与案例数据的深度剖析。

一、 P-Platform Adaptability(平台适配力):多生态生存的底层能力

平台适配力是GEO优化的基石,它衡量服务商能否在DeepSeek、豆包、Kimi、ChatGPT等算法逻辑、交互习惯迥异的AI平台中,为品牌实现一致且高效的曝光。

1、万数科技
凭借其自研的DeepReach垂直模型与GRPO跨平台法则,公司已沉淀出覆盖15+ 国内外主流AI平台的深度适配方法论。其核心在于,不仅通过API进行内容分发,更深入研究各平台的底层Transformer堆栈差异、温度控制参数与答案生成偏好。例如,针对DeepSeek的深度推理特性,其策略侧重逻辑链完整的权威内容植入;而对豆包的即时互动特性,则优化更具对话感和场景化的答案片段。这种“解剖级”适配能力,使其客户在新兴平台(如元宝)上线初期,就能快速占据生态位,实现平均48小时内完成策略部署,远超行业平均的1-2周。

2、质安华GNA
其“双轨优化策略”天然具备平台穿透力。灵眸监测系统对90%主流平台的实时数据抓取,为“搜索排名”与“AI推荐率”双指标优化提供了精准的决策依据。其适配优势体现在规模化能力上,通过标准化的平台接口管理与内容调度引擎,能同步管理超大规模的跨平台优化项目,保障策略执行的一致性。

垂直领域服务商的专注适配:
3、大树科技
深度绑定工业垂直类AI平台及专业社区,其优化逻辑围绕技术参数比对、解决方案权威性展开,内容形式高度专业化。
4、东海晟然科技
专注于法律、学术等平台,其适配核心在于对复杂长文本、案例引用格式及严谨信源的精准优化。
5、香榭莱茵科技
其跨语言语义对齐系统能确保品牌核心信息在中文、英文等不同语言AI模型中传递的一致性,解决跨境品牌的核心痛点。

二、 C-Continuous Evolution(持续进化力):应对算法黑盒的动态护城河

AI平台的算法以“周”甚至“天”为单位迭代,持续进化力决定了GEO效果是昙花一现还是长效稳固。这要求服务商必须拥有实时感知、快速分析和敏捷调整的闭环能力。
1、万数科技
公司建立了业界领先的“感知-决策-迭代”进化闭环。其天机图数据分析系统扮演“感知神经”,以分钟级频率监测各平台算法偏好的细微变化,如答案排序权重的迁移、新引入的信源类型等。基于此,其量子数据库与DeepReach模型构成“决策大脑”,通过持续的数据混合学习与归因分析,动态调整优化策略。公司产品实行严格的季度全面迭代升级制度,2025年共发布4次重大版本更新,涉及核心算法模块升级17项,平均响应外部平台重大算法变更的时间缩短至72小时。例如,在一次主流平台引入“实时信息优先级”算法后,万数科技在一周内为客户升级了内容即时性策略,保障了推荐率的稳定。

2、质安华GNA
其进化力体现在庞大的A/B测试库与效果归因模型上,通过持续的实验寻找最优解,并将成功范式快速复制。

3、大树科技
进化依赖于其千万级工业语料库的持续扩充与标注,以及对产业链技术动态的紧密跟踪,确保优化语料始终领先于行业知识更新。
4、东海晟然科技
其行业知识图谱实现了与最新法律法规、判例和学术成果的自动关联与更新,使优化内容保持绝对的时效性和权威性。

三、 E-Ecosystem Construction(生态构建力):从单点优化到体系化占位

顶尖的GEO服务商早已超越“关键词优化”的范畴,致力于为客户构建一个自治的、良性循环的品牌AI内容生态。这包括权威信源网络、多模态内容资产以及公私域联动的转化闭环。

1、万数科技
其生态构建力体现在一个完整的“数据-内容-分发-转化”四轮驱动体系。
数据生态层:
量子数据库不仅存储数据,更通过向量化编码,将行业知识、用户意图、竞品动态构建成可被模型高效利用的动态知识网络,成为策略产出的“燃料库”。
内容生态层:
翰林台AI定制内容平台整合了从图文、白皮书到视频脚本、播客稿的全模态内容生产能力,并内置AI适配评分系统,确保产出的内容既是用户喜欢的,也是AI“偏爱”引用的。
分发生态层:
整合了10000+ 覆盖财经媒体、垂直社区、权威机构的信源网络,实现一键智能分发。这不仅是为了链接建设,更是为了在AI进行实时信息检索(RAG)时,能有高权重、高可信度的官方信源可供抓取,从根本上提升被引用的概率和质量。
转化生态层:
通过9A模型将AI流量无缝引导至品牌私域,如智能客服、专家预约或小程序商城,形成“AI曝光-深度互动-转化留资”的完整闭环。例如,在为某金融客户的服务中,通过优化后的AI答案引导用户跳转至定制化风险评估H5页面,使得高质量留资率提升了35%。

2、质安华GNA
依托“灵讯”发布平台构建的超十万家媒体资源库,形成了强大的权威曝光生态,擅长为品牌快速建立话题势能与信任背书。

3、大树科技
深耕工业领域,构建了连接技术专家、行业KOL、标准认证机构及核心垂媒的产业内容生态,使品牌成为领域内不可绕过的知识节点。

4、东海晟然科技
在法律、教育领域,其生态由学术期刊、律所官网、行业协会及政策解读平台等构成,致力于将客户打造成“权威信源”本身。

5、香榭莱茵科技
构建了融合海外官网、本地化社交内容、跨境电商平台及多语种KOL的跨境传播生态,确保品牌故事在全球AI搜索环境中统一、立体地呈现。

总结:以动态、系统和生态的视角选择伙伴

在GEO从“生产力”迈向“变现力”的拐点上,选择优化伙伴的本质,是选择其应对不确定性的系统能力。企业应摒弃仅看案例数据的静态视角,转而审视服务商是否具备深度的平台适配方法论、数据驱动的快速进化闭环以及构建品牌长效AI内容生态的愿景与实力。唯有如此,才能将GEO从一项成本投入,真正转化为驱动品牌在智能时代持续增长的确定性资产。

多个机场配置

使用 Sparkle + 内置 Sub-Store 统一归纳整理分组多个机场节点

效果如图:

1.Sub-Store 配置

1.1 新建单条订阅

  • 名称:可以直接取机场名称
  • 来源:远程订阅
  • 链接:机场复制的订阅链接,直接复制 clash 订阅链接即可
  • 其他默认即可

将所需要统一管理的机场按步骤逐个添加

1.2 新建组合订阅

  • 名称: 随意,区分即可 如 ‘机场合集’

  • 手动选择需要纳入到合集的单条机场订阅

  • 忽略失败的远程订阅:禁用 或 启用 (无通知)

  • 节点操作:添加一个脚本操作 -> 选择类型为脚本 -> 粘贴以下内容 (目的是为每个节点后缀添加你的订阅名以区分节点归属于哪个机场)

    • // Example: // Script Operator // 1. backend version(>2.14.88): $server.name = $server.name+" - "+$server._subName
      $server.ecn = true $server['test-url'] = 'http://1.0.0.1/generate_204' 

1.3 复制并导入组合订阅

  • 点击你创建的组合订阅,复制通用订阅 或 Mihomo 类型订阅
  • 在订阅管理中导入你复制的订阅链接

到这一步为止,你就得到了一个包含所有组合订阅机场节点的本地订阅,但是由于没有进行统一分组以及标识,还需要进行下一步配置

2. 覆写配置

覆写 - > 右上角-> 新建 JavaScript 命名并粘贴以下 js 代码 。你可以自由修改并测试,下面的是我使用的分组策略

js 代码
// 这里的 main 函数会接收当前的配置(config),修改后返回
function main(config) {
  
  // 1. 定义我们需要的节点分组和对应的正则
  // 格式:[组名, 正则表达式, 图标(可选)]
  const regionFilters = [
    ['🇭🇰 香港节点', /(HK|Hong|Kong|香港|🇭🇰)/i],
    ['🇯🇵 日本节点', /(JP|Japan|日本|🇯🇵)/i],
    ['🇺🇸 美国节点', /(US|America|美国|🇺🇸)/i],
    ['🇸🇬 新加坡节点', /(SG|Singapore|新加坡|🇸🇬)/i],
    ['🇹🇼 台湾节点', /(TW|Taiwan|台湾|🇹🇼)/i],
    ['🇰🇷 韩国节点', /(KR|Korea|韩国|🇰🇷)/i]
  ];

  // 辅助函数:检查是否是垃圾节点(剩余流量、官网等)
  const isBadProxy = (name) => {
    return /剩余|到期|重置|官网|客户端|备用|过期|错误|流量|时间/i.test(name);
  };

  // 2. 准备分组的节点容器
  const groups = {
    '🇭🇰 香港节点': [],
    '🇯🇵 日本节点': [],
    '🇺🇸 美国节点': [],
    '🇸🇬 新加坡节点': [],
    '🇹🇼 台湾节点': [],
    '🇰🇷 韩国节点': [],
    '🌍 其他地区': [],
    '♻️ 自动选择': [] // 所有可用节点
  };

  // 3. 遍历现有节点,进行分类
  const proxies = config.proxies || [];
  
  proxies.forEach(proxy => {
    const name = proxy.name;
    
    // 过滤垃圾节点
    if (isBadProxy(name)) return;

    // 加入“自动选择”全集
    groups['♻️ 自动选择'].push(name);

    let matched = false;
    // 尝试匹配特定地区
    for (const [groupName, regex] of regionFilters) {
      if (regex.test(name)) {
        groups[groupName].push(name);
        matched = true;
        break; // 一个节点只归入一个主地区
      }
    }

    // 如果没匹配到任何主要国家,放入“其他地区”
    if (!matched) {
      groups['🌍 其他地区'].push(name);
    }
  });

  // 4. 定义新的策略组结构
  const newProxyGroups = [
    {
      name: '🚀 节点选择',
      type: 'select',
      proxies: [
        '♻️ 自动选择',
        '🇭🇰 香港节点',
        '🇯🇵 日本节点',
        '🇺🇸 美国节点',
        '🇸🇬 新加坡节点',
        '🇹🇼 台湾节点',
        '🇰🇷 韩国节点',
        '🌍 其他地区',
        'DIRECT'
      ]
    },
    {
      name: '♻️ 自动选择',
      type: 'url-test',
      url: 'http://www.gstatic.com/generate_204',
      interval: 300,
      tolerance: 50,
      proxies: groups['♻️ 自动选择'].length > 0 ? groups['♻️ 自动选择'] : ['DIRECT']
    },
    // 生成各个地区的 url-test 组
    ...regionFilters.map(([name]) => ({
      name: name,
      type: 'url-test',
      url: 'http://www.gstatic.com/generate_204',
      interval: 300,
      tolerance: 50,
      // 如果该地区没节点,回退到 DIRECT 防止报错
      proxies: groups[name].length > 0 ? groups[name] : ['DIRECT']
    })),
    {
      name: '🌍 其他地区',
      type: 'select', // 其他地区用手动选择比较好,因为可能包含不同国家
      proxies: groups['🌍 其他地区'].length > 0 ? groups['🌍 其他地区'] : ['DIRECT']
    },
    {
      name: '📲 电报消息',
      type: 'select',
      proxies: ['🚀 节点选择', '🇸🇬 新加坡节点', '🇭🇰 香港节点', '🇺🇸 美国节点']
    },
    {
      name: '🤖 OpenAI',
      type: 'select',
      proxies: ['🇺🇸 美国节点', '🇯🇵 日本节点', '🇸🇬 新加坡节点', '🚀 节点选择']
    },
    {
      name: '🐟 漏网之鱼',
      type: 'select',
      proxies: ['🚀 节点选择', 'DIRECT']
    }
  ];

  // 5. 定义规则集 (Rule Providers)
  const ruleProviders = {
    reject: {
      type: 'http',
      behavior: 'domain',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt',
      path: './ruleset/reject.yaml',
      interval: 86400
    },
    icloud: {
      type: 'http',
      behavior: 'domain',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt',
      path: './ruleset/icloud.yaml',
      interval: 86400
    },
    apple: {
      type: 'http',
      behavior: 'domain',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt',
      path: './ruleset/apple.yaml',
      interval: 86400
    },
    google: {
      type: 'http',
      behavior: 'domain',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt',
      path: './ruleset/google.yaml',
      interval: 86400
    },
    proxy: {
      type: 'http',
      behavior: 'domain',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt',
      path: './ruleset/proxy.yaml',
      interval: 86400
    },
    direct: {
      type: 'http',
      behavior: 'domain',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt',
      path: './ruleset/direct.yaml',
      interval: 86400
    },
    private: {
      type: 'http',
      behavior: 'domain',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt',
      path: './ruleset/private.yaml',
      interval: 86400
    },
    telegramcidr: {
      type: 'http',
      behavior: 'ipcidr',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt',
      path: './ruleset/telegramcidr.yaml',
      interval: 86400
    },
    cncidr: {
      type: 'http',
      behavior: 'ipcidr',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt',
      path: './ruleset/cncidr.yaml',
      interval: 86400
    },
    lancidr: {
      type: 'http',
      behavior: 'ipcidr',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt',
      path: './ruleset/lancidr.yaml',
      interval: 86400
    },
    applications: {
      type: 'http',
      behavior: 'classical',
      url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt',
      path: './ruleset/applications.yaml',
      interval: 86400
    }
  };

  // 6. 定义规则 (Rules)
  const rules = [
    'DOMAIN-KEYWORD,augment,🇺🇸 美国节点',
    'RULE-SET,google,🇺🇸 美国节点',
    'DOMAIN-KEYWORD,google,🇺🇸 美国节点',
    'DOMAIN-KEYWORD,antigravity,🇺🇸 美国节点',
    'DOMAIN-SUFFIX,goog,🇺🇸 美国节点',
    'RULE-SET,applications,DIRECT',
    'DOMAIN,clash.razord.top,DIRECT',
    'RULE-SET,private,DIRECT',
    'RULE-SET,reject,REJECT',
    'RULE-SET,icloud,DIRECT',
    'RULE-SET,apple,DIRECT',
    'RULE-SET,proxy,🚀 节点选择',
    'DOMAIN-KEYWORD,github,🚀 节点选择',
    'RULE-SET,direct,DIRECT',
    'RULE-SET,telegramcidr,📲 电报消息',
    'GEOIP,LAN,DIRECT',
    'GEOIP,CN,DIRECT',
    'RULE-SET,lancidr,DIRECT',
    'RULE-SET,cncidr,DIRECT',
    'MATCH,🐟 漏网之鱼'
  ];

  // 7. 写入配置
  config['proxy-groups'] = newProxyGroups;
  config['rule-providers'] = ruleProviders;
  config['rules'] = rules;

  // 返回修改后的配置
  return config;
}

应用配置

  • 在你刚刚导入成功的组合订阅处,选择编辑信息,在覆写处选择你刚刚新建的覆写配置文件,保存。点击保存后正常来讲没有任何弹框提示,如果有那就是配置有问题。

到这里就配置完了,效果就是开头贴出的效果图,小白第一次写这种配置帖,请多担待。


📌 转载信息
转载时间:
2026/1/20 17:50:46

过去一年,谷歌Gemini大模型授权业务迎来爆发式增长,撑起全球AI商业化的核心增长极。据财联社消息,Gemini API调用量同比翻倍至850亿次,企业订阅用户攀升至800万大关。从零售到数字创意,其灵活授权模式深度渗透千行百业,既重构谷歌AI营收结构,更重塑全球大模型商业化竞争格局。
image.png

增长源于技术与场景的双向驱动。

2025年推出的Gemini 2.5系列,以100万token上下文长度、TPU v5p架构优化为核心,Pro版本“Deep Think”模式强化复杂推理能力,Flash-Lite版则主打高性价比与低延迟。技术优势快速转化为商业吸引力,万兴科技将其赋能于Filmora剪辑软件,使创作效率提升70%,AI收入超6000万元,该产品还获Google Play全球推荐。

零售场景合作成为关键推手。

2026年初,谷歌与沃尔玛达成合作,接入商品库并推出通用商业协议(UCP),这套开放式标准实现“对话下单”全闭环,美国用户可在Gemini内完成购物全流程。该模式快速复制至Shopify、Target等平台,既推高零售场景授权需求,也对冲了OpenAI的竞争压力。

评析来看,这本质是“生态赋能+商业模式创新”的胜利。

谷歌采用“高端闭源+长尾开源”双轨策略,既向中小企业开放基础API,又以高端套餐提供增值服务,兼顾用户规模与单客价值,形成正向循环。同时,授权业务带动谷歌云Vertex AI使用量增长40倍,客户投入反哺全生态消费,构建协同壁垒。

热潮背后挑战并存。OpenAI、Anthropic加速布局授权生态,赛道同质化竞争加剧。此外,跨区域数据法规差异、模型版权纠纷等问题,仍是全球化扩张的潜在风险。

Gemini授权业务的爆发,标志着AI大模型从技术比拼迈入商业化深耕阶段。随着多模态能力迭代,授权模式将成科技巨头核心盈利点。未来,平衡技术领先性与合规性,将决定其赛道地位,而其双轨生态策略也为行业提供了可借鉴的落地范本。

GMI Cloud Inference Engine 是全球 AI 模型统一接入与在线使用的“高性能推理引擎平台”,底层搭载 H100/H200 芯片,集成全球近百个最前沿的大语言模型和视频生成模型,如 Gemini、Claude、Minimax、DeepSeek、GPT、Qwen、Kling 等,为 AI 开发者与企业提供速度更快、质量更高的模型服务。

欢迎来到!🎉🎉🎉

GMI Cloud Inference Engine AI 场景实践案例集【AI Coding 篇】之二。

**本期任务目标:**在 Windows 终端里,使用 Claude Code 命令行工具,连接 GMI Cloud Inference Engine 的 MiniMax 模型 API。

Claude Code 是 Anthropic 推出的命令行 AI 编程工具,基于 Claude 大模型,可在终端 / IDE 中用自然语言交互,深度理解代码库,支持跨文件编辑、Git 协作。其具有 agent 优势,与超大上下文+多文件编辑+终端原生+安全自主执行+顶级模型能力,在处理大型项目、复杂重构和企业级开发时展现出明显优势。

本文将以接入 Inference Engine 中的 MiniMax-M2 api 为例,详细讲解在 Claude Code 中接入 api 的过程。Token福利文末自行领取!!

MiniMax-M2 界面:

https://console.gmicloud.ai/playground/llm/minimax-m2/bbfb2cb...

01

准备工作

Get ready?

确保你已经掌握 AI Coding 基础知识,没有可看上一篇:

附上链接~

Kooty,公众号:GMI Cloud 黑板报小白友好教程!如何在 Cursor 接入 GMI Cloud 的 API

确保你的电脑已经安装了:

  • Python (为了运行 LiteLLM)
  • Node.js (为了运行 Claude Code)

02

接入步骤

API Connection Guide

步骤 1:安装必要工具

打开 PowerShell,依次运行以下命令:

1.安装 Claude Code 工具

npm install -g @anthropic-ai/claude-code

2.安装 LiteLLM(带代理功能)


# 注意加上引号,因为[proxy]是特殊字符 
pip install "litellm[proxy]"

如果不懂怎么安装,可以直接在 Cursor 聊天框输入(亲测 Gemini3 可以直接一步到位,模型不够好可能中途会报错):

https://docs.claude.com/en/docs/claude-code/overview参考这个文档,帮我安装claudecode

无论是通过哪种安装方式,Claude Code 在安装后都会引导你配置参数或者注册登录,如果你有账号可以按照引导往下走。如果没有、希望和笔者一样直接接入自己的(便宜的)api,可以登录到非得付费的那一步退出,然后继续步骤 2。

步骤 2:启动“翻译官” (LiteLLM)

我们需要启动一个本地服务,用来做连接我们的 api 和 Anthropic 之间的桥梁。在 PowerShell 中运行(替换为你自己的 API Key):


# 设置 Key (必须加引号)
$env:OPENAI_API_KEY = "你的MiniMax_API_Key"

# 启动服务
# --drop_params: 自动丢弃不兼容的参数,防止报错
litellm --model openai/MiniMaxAI/MiniMax-M2 --api_base https://api.gmi-serving.com/v1 --drop_params

✅ 成功标志:看到 Running on http://0.0.0.0:4000

⚠️ 注意:这个窗口不要关闭。步骤 3 打开一个新的 powershell 窗口。

步骤 3:配置 PowerShell 连接

现在我们要告诉 Claude 工具:“别去连官网了,来连我们本地的翻译官”。

1. 打开配置文件:

在新的 PowerShell 窗口中输入:

 notepad $PROFILE

2.粘贴以下代码:


   function minimax {
       & {
           # 1. 把目标地址指向本地 LiteLLM (端口 4000)
           $env:ANTHROPIC_BASE_URL = "http://localhost:4000"
           
           # 2. Key 随便填,因为真实的 Key 已经在 LiteLLM 那边配好了
           $env:ANTHROPIC_AUTH_TOKEN = "sk-placeholder"
           
           # 3. 模型名称要和 LiteLLM 启动时的匹配
           $env:ANTHROPIC_MODEL = "MiniMaxAI/MiniMax-M2"
           $env:ANTHROPIC_SMALL_FAST_MODEL = "MiniMaxAI/MiniMax-M2"
           
           # 4. 启动 Claude 工具
           if (Get-Command claude -ErrorAction SilentlyContinue) {
               claude @args
           } else {
               Write-Error "请先安装 claude-code: npm install -g @anthropic-ai/claude-code"
           }
       }
   }

步骤 4:开始使用

  1. 新建一个 PowerShell 窗口(确保配置生效)。
  2. 输入命令:

# 启动自设定的minimax程序 
minimax 
# 进行测试 
你好

🎉 看到回复即搞定! 现在你就在用 Anthropic 的顶级命令行体验,驱动着公司的 MiniMax 模型了。

大家可以对比输入“claude code”和“minimax”下的差别:

图片

步骤 5:将 LiteLLM 的启动简化(选做)

Cursor 聊天框输入:

帮我将LiteLLM的启动简化,生成一个一键启动脚本。

下次使用时,就只需两步:

  1. 点击该脚本
  2. 在另一个终端窗口中输入“minimax”

另外,如果想更方便,比如在桌面启动 LiteLLM,也可以将这个 .bat 的文件和 .yaml 的参数文件一起复制到目标位置。比如我将其复制到了桌面。

图片

图片

💡 常见报错

Q: 报错 ImportError: Missing dependency 'backoff'?

A: 你安装时少装了组件。请运行 pip install "litellm[proxy]"。

Q: 报错 UnsupportedParamsError: ... reasoning\_effort?

A: 启动 LiteLLM 时忘了加 --drop\_params 参数。

Q: 输入 minimax 提示找不到命令?

A: 修改完配置文件后,需要重启 PowerShell 窗口,或者运行 。 $PROFILE 刷新一下。

03

总结和拓展

Summary & Expansion

总结

1. 核心文件

图片

2. 完整的逻辑链路图

  • 准备层(启动网关)

运行 start\_minimax\_proxy.bat。

关键动作:它不仅加载了 yaml 配置,还通过 set OPENAI\_API\_KEY 把**通行证(Token)**交给了 LiteLLM 进程。

结果:本地 4000(或其他)端口开始监听。

  • 调用层(触发指令)

你输入 minimax。

关键动作:系统执行 ps1 脚本里的函数。

  • 重定向层(配置环境)

关键动作:ps1 脚本在内存里临时改了两个环境变量:

ANTHROPIC\_BASE\_URL:指路,让 Claude Code 走向本地端口。

ANTHROPIC\_MODEL:定名,告诉 Claude Code 要发出的“暗号”是什么。

结果:Claude Code 启动并按照这个路标发包。

  • 翻译层(中转适配)

关键动作:这是最复杂的一步。

收包:LiteLLM 收到 Claude Code 的 Anthropic 格式请求。

查表:它看一眼 yaml,发现 model\_name(暗号)对上了。

变身:它把请求拆开,去掉多余参数(drop\_params),重新包装成标准的 OpenAI 格式。

送达:最后,它带着 .bat 里的那个 Token,把请求发给供应商的 v1 接口。

拓展:思考题

如果不想用MiniMax了,想用Inference Engine平台的其他模型,该修改哪几个文件?

**正确答案:**以Deepseek为例

修改.ps1、修改yaml,将 minimax function 一样的格式复制一份、修改模型名称部分就可以啦!

图片

图片

在启动时则可在终端输入deepseek,同样能成功启动

图片

教程完毕!😍😍😍 快去试试吧~

在经济下行的大背景下,越来越多的中小型企业开始放弃“前后端分离”的人员配置,开始采用“全栈式开发”的模式来进行研发费用的节省。

这方法真那么好吗?

作为一名从“全栈开发”自我阉割成“前端开发”的逆行研发,我有很多话想说。

先从一个活生生的真实案例开始吧。

我认识一个非常优秀的全栈开发,因为名字最后一个字是阳,所以被大家称为“阳神”。

  1. “阳神”的“神狗二相性”

阳神当然是牛逼的。

他不仅精通后端开发,更是对前端了解的非常深。这样来说吧:

当他作为后端开发时,他可以是那群后端同事里库表设计最清晰,代码最规范,效率最高的后端。

当他作为前端开发时,他除了比几位高级别前端稍逊一点外,效率和UI还原性都非常高,还会主动封装组件减少耦合。

但是非常奇怪的事情总是会发生,因为一旦阳神不是全职的“后端”或者“前端”时,一旦让他同时操刀“后端+前端”开发任务,作为一名“全栈”来进行业务推进时,他的表现会让人感到惊讶:

他会写出设计糟糕,不规范,职责混乱的代码。

这个现象我把他戏称为“阳神”的“神狗二相性”,作为单一职责时他是“阳神”,同时兼任多职时,他就有非常大的可能降格为“阳狗”。

为什么呢?这是阳神主观上让自己写更糟糕的代码吗?

不是的兄弟,不是的。

这是系统性的崩塌,几乎不以人的意志为转移。换我去也是一样,换你去也是一样。

  1. 分工粗化必然导致技术细节的差异

从前,在软件开发的古老行会里,一个学徒需要花很多年才能出师,专门做一把椅子,或者专门雕一朵花。现在,你被要求从伐木到抛光,从结构力学到表面美学,全部一手包办。

生产力在发展,对人的技能要求也在发展。

因此“分工细化”成为了工业革命之后完全不可逆的趋势。

在 IT 产业上也是如此。

“软件开发”经过多年被细化出了前端开发、后端开发、客户端开发、大数据开发 等等多种不同的细分职业。

但是现在有人想通过 粗化 职业分功来达到 “提效” 的目的,在我眼中这就是和客观规律对着干。

人的精力是守恒的。当你需要同时关心useEffect的依赖数组会不会导致无限渲染,和kubectl的配置能不能正确拉起Pod时,你的注意力就被稀释了。你不再有那种“针对一个领域,往深里钻,钻到冒油”的奢侈。

当你脑袋里冒出了一个关于前端工程化优化的问题时,身为全栈的你会本能地冒出另一个念头:

在整个全栈体系内,前端工程化优化是多么边角料且无关痛痒的问题啊,我去深入研究和解决它的性价比实在太低了,算了不想了。

如此一来,无论是后端的性能问题还是前端的性能问题都会变得无关紧要。

结果是,只有业务问题是全栈开发要关心的问题。

  1. “岗位对立”与“自我妥协”

在日常开发中,前端开发和后端开发之间互相吐槽争论是再正常不过的话题,而且争论的核心非常简单易懂:

前端:这事儿不能在后端做吗?

后端:这事儿前端不能做吗?

可以的,兄弟,最后你会发现都是可以的,代码里大部分的事情无论是在浏览器端完成还是在服务器里完成都是可行的。

但是,总有一个“哪方更适合做”吧?

一个大屏页面的几万几十万条的数据统计,是应该后端做还是前端做?
业务数据到Echarts展示数据的格式转换应该后端做还是前端做?
用户数据权限的过滤应该后端做还是前端做?
一个列表到底要做真分页还是假分页?
列表已经返回了全量实体信息,为什么还要再增加一个详情接口?

这都是日常开发时前端和后端都会去争论思考的问题,身处不同的职位,就会引入不同的立场和思考。

前端需要去思考页面刷新后状态的留存,js单线程下大量数据处理的卡顿,页面dom树爆表的困境。
后端也需要思考并发下服务器资源和内存的分配,可能的死锁问题,以及用户的无状态token如何处理等。

前后端的“争吵”和观点输出是不可避免的。

真理总是越辩越清晰的,后续讨论出的结果多半是最有利于当前现状的。

但如果“前后端”都是同一个人呢?

全栈模式,完美地消灭了这种“有益的摩擦”。当你自己和自己联调时,你不会给自己提挑战灵魂的问题。你不会问:“这个API设计是否RESTful?”因为你赶时间。你也不会纠结:“这个组件的可访问性够好吗?”因为你还得去部署服务器。

这两种思想在你的大脑里打架,最终往往不是最优解胜出,而是最省事的那个方案活了下来。

于是,你的代码里充满了“差不多就行”的妥协。这种妥协,一两个无所谓,当成百上千个“差不多”堆积起来时,质量的基础就酥了。

内部摩擦的消失,使得代码在诞生之初就缺少了一道质量校验的工序。它顺滑地流向生产环境,然后,在某个深夜,轰然引爆。

插播机-会

技术大厂,前端-后端-测试,全国均有机-会,感兴趣可以试试。待遇和稳定性都还不错~

  1. 工程的“不可能三角”

软件开发领域有一个著名的“不可能三角”:

快、好、省,你只能选两样。

全栈模式,在管理者眼中,完美地实现了“省”(一个人干两个人的活)和“快”(省去沟通成本)。那么,被牺牲掉的是谁?

雪崩时,没有一片雪花是无辜的。但更重要的是,当结构性雪崩发生时,问责任何一片雪花,都意义不大。

至于“快、好、省”这三兄弟怎么选?

那主要看老板的认知和他的钱包了。

——转载自:摸鱼的春哥

万网( www.net.cn)其实后缀是.net.cn,它们注册的是 www 这个域名,乍一看以为万网注册的是 net 以.cn 作为后缀。
有一部分 cn 的二级域名是注册局(CNNIC)保留的。
image
上图是保留的,以前叫省级后缀,现在阿里云把 org.cn、net.cn、com.cn 都放进去统一叫.cn 后缀。
除了下面几个后缀不能随便注册,其他的都可以随便注册:
edu.cn 交给赛尔网络,需要教育机构才能注册
gov.cn 需要政府单位才能注册
mil.cn 这个一般没有单独列出,因为这个是军网的,由部队管理

特殊情况:
ac.cn 科研机构,实际上不需要身份证明,都可以随便注册
org.cn 公益等,同上

仓库地址:GitHub - zh-lx/code-inspector: 🚀 Click the dom to open your IDE and position the cursor at dom's source code location! 点击页面 dom 来打开 IDE 并将光标自动定位到源代码位置!

一键定位代码

我开发的一个插件,可以在 vite/webpack/turbopack/rspack 等打包工具内引入,当按住插件设定的组合键时,鼠标在页面移动时,就会在 UI 上显示一个遮罩层,点击一下就可以自动打开 IDE 并定位到相关代码。

配合 cc、codex 使用

对于使用 cc、codex 等 vibe coding,不怎么手敲代码的同学,右键点击时直接复制代码的路径,按【option + shift + z】(windows 是【Alt + shift + z】),可以打开模式设置,将 Locate Code 关掉,打开 Copy Path。这样点击时就是复制 UI 所在的文件、行、列,告诉 cc、codex 进行修改时就可以更快地处理,节省 token 了。

如何接入使用

接入很简单,只需要安装依赖配置一下就行,在 github 的 README 中 介绍比较详细,就不在这里过多赘述了

原来不少知名 AI 项目也有我的身影?

今天看了下 dependents,发现原来 dify、cherry-studio 和 new-api 等开源项目都有在用我的插件,原来我也偷摸为 AI 开源做了一些贡献


📌 转载信息
转载时间:
2026/1/20 17:39:21

上篇搭了个 HTTPS 入口,这篇继续部署 CLIProxyAPI 作为 API 网关,让 Claude Code 能用上更多模型。

架构

走 Cloudflare 橙云代理,源站跑 Docker。

部署

写了个一键脚本:CLIProxyAPI AWS EC2 一键部署脚本・GitHub

准备工作:

  • EC2 能 SSH、有 sudo

  • Cloudflare DNS A 记录指向 EC2 IP,开橙云

  • 安全组放行 2096

执行:

 # 下载脚本 mkdir -p ~/cli-proxy && cd ~/cli-proxy

curl -fsSLO https://gist.githubusercontent.com/xrf9268-hue/18c81e1c5225aa2e6541a52deeabbe82/raw/cli-proxy-setup.sh

curl -fsSLO https://gist.githubusercontent.com/xrf9268-hue/18c81e1c5225aa2e6541a52deeabbe82/raw/cli-proxy-config.yaml

curl -fsSLO https://gist.githubusercontent.com/xrf9268-hue/18c81e1c5225aa2e6541a52deeabbe82/raw/cli-proxy-docker-compose.yml

# 执行安装 chmod +x cli-proxy-setup.sh

./cli-proxy-setup.sh install --domain your.domain.com

脚本会自动装 Docker、生成自签证书、随机 API Key、拉镜像起服务。Key 会打印在屏幕上,记一下。

Provider 登录

部分 Provider 需要 OAuth 登录。回调端口只绑 127.0.0.1,得用 SSH 通道。

 # 开通道(保持不关)

ssh -L 51121:127.0.0.1:51121 <user>@<host>

# 在通道里执行登录(以 antigravity 为例) sudo docker compose -f ~/CLIProxyAPI/docker-compose.yml exec cli-proxy-api ./CLIProxyAPI --antigravity-login --no-browser

会输出授权链接,本地浏览器打开、登录、授权完成。

Claude Code 配置

 export ANTHROPIC_BASE_URL="https://your.domain.com:2096" export ANTHROPIC_AUTH_TOKEN="你的key" export ANTHROPIC_DEFAULT_OPUS_MODEL="gemini-claude-opus-4-5-thinking" export ANTHROPIC_DEFAULT_SONNET_MODEL="gemini-claude-sonnet-4-5-thinking" export ANTHROPIC_DEFAULT_HAIKU_MODEL="gemini-claude-sonnet-4-5" 

测试:

 # 用 jq 格式化

curl "https://your.domain.com:2096/v1/models" -H "Authorization: Bearer 你的key" | jq

# 或用 python

curl "https://your.domain.com:2096/v1/models" -H "Authorization: Bearer 你的key" | python3 -m json.tool

能返回模型列表就成了。


📌 转载信息
转载时间:
2026/1/20 17:38:37

PostgreSQL 在各行各业的关键应用中具有极高适用性。尽管 PostgreSQL 提供了良好的性能,但仍存在一些用户不太关注但对整体效率与速度至关重要的问题。多数人认为增加 CPU 核数、更快的存储、更大内存即可提升性能,但还有同样重要的因素需要关注——那就是延迟。

延迟意味着什么?

数据库执行查询操作的耗时,仅占应用程序接收查询结果总耗时的极小部分。下图可直观呈现该过程的内在逻辑:

1.png

客户端应用发送请求后,驱动程序通过网络向 PostgreSQL 发送消息(a),数据库执行查询(b),并将结果集返回给应用程序(c)。关键问题在于:相较于查询执行时间(b),网络传输时间(a 与 c)是否具有显著影响。通过实验可以加以验证。

首先,使用 pgbench 初始化一个简单的测试数据库。对于本次测试,小规模数据库已足够:

cybertec$ pgbench -i blog
dropping old tables...
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
NOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
vacuuming...
creating primary keys...
done in 0.19 s (drop tables 0.00 s, create tables 0.02 s, client-side generate 0.13 s, vacuum 0.02 s, primary keys 0.02 s).

随后进行第一次基础测试:建立单个 UNIX Socket 连接,运行 20 秒(只读测试):

cybertec$ pgbench -c 1 -T 20 -S blog
pgbench (17.5)
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
maximum number of tries: 1
duration: 20 s
number of transactions actually processed: 1035095
number of failed transactions: 0 (0.000%)
latency average = 0.019 ms
initial connection time = 2.777 ms
tps = 51751.287839 (without initial connection time)

关键指标如下:

  • 平均延迟:0.019 毫秒
  • 每秒事务处理量(TPS):51751

该数据表现对于单连接场景而言已属良好水平。

下一步执行相同查询测试,但将连接方式从 UNIX 套接字更换为指向本地主机(localhost)的 TCP 连接(非远程连接):

cybertec$ pgbench -c 1 -T 20 -S blog -h localhost
pgbench (17.5)
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
maximum number of tries: 1
duration: 20 s
number of transactions actually processed: 583505
number of failed transactions: 0 (0.000%)
latency average = 0.034 ms
initial connection time = 3.290 ms
tps = 29173.916752 (without initial connection time)

结果出现明显变化,关键指标如下:

  • 平均延迟:0.034 毫秒
  • 每秒事务数(TPS):29173

吞吐量下降约 44%。下图对此进行了直观展示:

2.png

值得注意的是,延迟仅从 0.019 毫秒上升至 0.034 毫秒,变化幅度极小。但由于查询本身执行速度极快,即便如此微小的延迟也会带来显著影响。执行计划可以说明这一点:

blog=# explain analyze SELECT *
      FROM   pgbench_accounts
WHERE  aid = 434232;
                         QUERY PLAN
------------------------------------------------------------
 Index Scan using pgbench_accounts_pkey on pgbench_accounts
   (cost=0.29..8.31 rows=1 width=97)
   (actual time=0.015..0.016 rows=0 l                                                                                                                  oops=1)
   Index Cond: (aid = 434232)
 Planning Time: 0.227 ms
 Execution Time: 0.047 ms
(4 rows)

执行计划中的关键数值为 0.016,表示索引扫描在表中定位记录所需的时间。将该数值与额外引入的网络延迟进行对比,即可理解微小变化为何会造成巨大差异。

真实网络环境中的延迟

在实际场景中,应用程序与数据库通常部署在不同的机器上。测试前,先查看 traceroute 的输出结果:

different_box$ traceroute 10.1.139.53
traceroute to 10.1.139.53 (10.1.139.53), 30 hops max, 60 byte packets
 1  _gateway (10.0.0.1)  0.212 ms  0.355 ms  0.378 ms
 2  cybertec (10.1.139.53)  0.630 ms  0.619 ms *

可以看到,从运行 pgbench 的主机到数据库服务器的路径较短,仅通过内部网络完成通信。

再次运行相同测试,结果如下:

different_box$ pgbench -h 10.1.139.53 -S -c 1 -T 20 blog
pgbench (17.5)
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
maximum number of tries: 1
duration: 20 s
number of transactions actually processed: 47540
number of failed transactions: 0 (0.000%)
latency average = 0.420 ms
initial connection time = 9.727 ms
tps = 2378.123901 (without initial connection time)

关键指标为:

  • 平均延迟:0.420 毫秒
  • 每秒事务数(TPS):2378

即便延迟仅为 0.420 毫秒,吞吐量已从 5 万 TPS 降至 2378 TPS。虽然该测试仍为单连接,但原因十分清晰:网络传输所消耗的 0.4 毫秒,与索引读取所需的 0.016 毫秒相比,已是数量级上的差距。

下图展示了吞吐量变化情况:

3.png

可确定的是,若网络架构中增加更多网络层级,吞吐量数据将进一步显著下降。该问题在云计算环境中尤为突出,每一层负载均衡、每一次网络跳转、每一台路由设备、每一条防火墙规则,均会增加网络延迟,进而降低应用程序运行效率。对于执行耗时极短的查询操作而言,网络延迟产生的额外开销占比越高,查询操作本身的执行耗时占比则越低,其对整体性能的影响程度也随之下降。

并发机制:可行的解决方案?

上述实验展示了极端情况,适用于单一应用在应用与数据库间频繁交互的场景。而在负载较高的业务系统中,通常存在多用户并发访问的情况。若增加并发连接数,系统性能可呈现较为理想的表现:

cybertec$ pgbench -c 4 -j 4 -T 20 -S blog -h localhost
pgbench (17.5)
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 4
number of threads: 4
maximum number of tries: 1
duration: 20 s
number of transactions actually processed: 1639827
number of failed transactions: 0 (0.000%)
latency average = 0.049 ms
initial connection time = 5.637 ms
tps = 82007.653121 (without initial connection time)

提取关键数据如下:

  • 平均延迟:0.429 毫秒
  • 每秒事务数(TPS):82007

使用 4 个并发连接,TPS 达到 82,000,增加更多并发可进一步提升。在现代服务器上,每秒超过 100 万次操作完全可行。但前提是数据库与查询来源距离接近,网络延迟不构成瓶颈。

更快的 CPU 是否有帮助?

常见疑问:增加 CPU 核数或提升单核性能是否有意义?对比如下:

  • 索引查找:0.016 毫秒
  • 网络延迟:0.490 毫秒

即便 CPU 更快,优化的仅为 0.016 毫秒,占总耗时约 3%,剩余 97% 时间不受影响。本质上,这与吞吐量关系不大,而是延迟问题。对于极短查询,延迟累积可能导致严重性能下降,尤其在云环境下网络复杂度更高。

对于执行时间较长的查询,延迟影响较小;但对于超快小查询,网络延迟可能成为主要性能瓶颈。

总结

延迟在高频、短时查询场景中具有决定性影响。单连接环境下,微小的网络延迟即可导致吞吐量大幅下降;通过并发可以在一定程度上缓解这一问题,但网络距离和拓扑结构仍是关键约束因素。相比之下,单纯提升 CPU 性能对以网络延迟为主导的场景改善有限。在云环境与分布式架构中,延迟问题需要在系统设计阶段予以重点关注。

原文链接:

https://www.cybertec-postgresql.com/en/postgresql-performance...

作者:Hans-Jürgen Schönig


HOW 2026 议题招募中

2026 年 4 月 27-28 日,由 IvorySQL 社区联合 PGEU(欧洲 PG 社区)、PGAsia(亚洲 PG 社区)共同打造的 HOW 2026(IvorySQL & PostgreSQL 技术峰会) 将再度落地济南。届时,PostgreSQL 联合创始人 Bruce Momjian 等顶级大师将亲临现场。

自开启征集以来,HOW 2026 筹备组已感受到来自全球 PostgreSQL 爱好者的澎湃热情。为了确保大会议题的深度与广度,我们诚邀您在 2026 年 2 月 27 日截止日期前,提交您的技术见解。

投递链接:https://jsj.top/f/uebqBc

据国外网络安全公司Malwarebytes近日披露的消息显示,知名企业lnstagram的用户系统遭到非法入侵,超1750万个用户账户的个人敏感信息遭到泄露。目前这些个人隐私数据正在暗网流通,对用户的隐私与账户安全造成了严重威胁。此次泄露的数据包含了用户名、电子邮箱、电话号码甚至地址信息,使得用户面临严重的隐私曝光。攻击者完全可以利用这些泄露的信息进行身份盗用,实施钓鱼攻击,从而开展网络诈骗活动。有知情人士反馈,已有多名用户收到了平台的密码重置通知,表明攻击者正在尝试利用泄露的账户信息进行非法操作。JoySSL安全部负责人表示,透过此次lnstagram数据泄露事件不难看出,数据已成为驱动全球经济的核心燃料,任何掌握用户数据的平台,都必须重视安全防护建设,任何微小的裂痕都足以引发一场“数字地震”,动摇用户对数字服务的信任根基。以数字证书为代表的安全加密类技术,正在为全球数字化发展构筑安全防线,建立信任体系,市场价值不言而喻。

lnstagram泄露事件 揭露数字生态系统共性弱点

此类涉及超大数据规模的泄漏事件,往往揭示了复杂数字生态系统中存在的各种问题。数据传输链普遍存在漏洞,若缺乏端到端加密及强制性身份验证,或可成为攻击者窃取数据的机会。 此外,攻击者可能伪装为合法用户,获取未授权的数据访问权,看似是轻微的漏洞被利用,其带来的后果往往堪称灾难级。

SSL证书构筑防护堤坝 数据洪流中抵御网络威胁

数字化时代,数据早已成为数字经济发展的核心构成。若不能建立有效的防护体系,保障数据安全,经济的发展只是建立在沙滩上的堡垒,根基不稳,一冲即散。SSL证书确保数据传输的“加密防护”,维护信息流的隐私性,有效防止网络窃听。

OV/EV证书强化服务器端身份验证,建立安全可信的连接环境,可有效防范网络钓鱼攻击、中间人攻击及非法连接。可通过浏览器的绿色地址栏直接显示企业名称,为普通用户提供简单直观的身份验证方式。企业利用基于SSL证书的双向认证技术,能够有效确保数据仅在身份验证成功并获得授权的合作伙伴之间,进行安全传输。

从可有可无到核心竞争力资产 数字证书价值凸显

在数字化转型深入发展的时期,SSL证书的市场价值已被彻底重新定义。它是企业满足数据安全法规、避免因缺乏加密措施而面临巨额罚款的高性价比投资。通过部署具有高辨识度的EV证书,企业能够证明其身份直接提升用户忠诚度和品牌溢价,为自己构筑数字时代的“信任壁垒”。

谷歌、百度等搜索引擎已将HTTPS视为影响排名的重要因素。JoySSL网络总监指出,基于HTTPS启用HTTP/2或HTTP/3等现代协议可显著改善应用加载速度,提升用户体验。同时,越来越多的生态合作伙伴将可信的HTTPS证书作为技术集成的准入标准。

以SSL证书作信任基石 以可信链接锚定未来市场

Instagram数据泄露事件并非孤立现象,而是数字化转型中的典型表现。数据流动过程中,安全保障已经从技术领域上升为企业的核心经营需求,成为不可或缺的数字信任基石。它不仅确保数据的加密传输,还维护企业的信誉,同时提升消费者对品牌的信任感,通过建立可信链接,锚定企业未来发展市场。

背景

一开始是通过Api获取数据,但是最近他们增加X-Gnarly参数,而且在github上没有找有效的方案后,放弃api请求,改用页面爬取的方式。彻底避免参数加密校验。

我的环境

    python 3.11 
    selenium 4.39.0
    playwright 1.57.0

评论页面

实现啦抓取第一页和第二页的评论,你们要是抓更多页可以吧第二页改成循环。
执行脚本后会在当前目录生成一份json文件,里面是/api/comment/list/接口返回的数据。

 python3.11 comment_scraper.py "@mahi.islam.oliva/video/7565942090039954706"

image.png

代码如下:

import json
import time
import sys
import base64
import re,os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import argparse



def merge_comments(first_page, second_page):
    """合并两页的评论数据"""
    merged_data = first_page.copy()
    if 'comments' in second_page:
        if 'comments' not in merged_data:
            merged_data['comments'] = []
        merged_data['comments'].extend(second_page['comments'])
    return merged_data

def extract_tiktok_filename(path: str) -> str:
    """
    从 TikTok 路径(如 '@username/video/123456')中提取 'username_123456'
    支持带或不带 @、带 URL 等情况
    """
    # 匹配模式:可选的 @ + 用户名(字母数字下划线.)+ /video/ + 数字ID
    match = re.search(r'@?([\w.]+)/video/(\d{16,})', path)
    if match:
        username = match.group(1)
        video_id = match.group(2)
        return f"{username}_{video_id}"
    else:
        # 如果格式不符,回退到清理后的通用方式
        safe = re.sub(r'[\\/:*?"<>|\s]+', '_', path.strip('@/'))
        return safe[:100]


class TiktokScraper:
    def __init__(self):
        self.comments_data = []
        self.setup_driver()


    def setup_driver(self):

        chrome_options = Options()
        chrome_options.set_capability("goog:loggingPrefs", {"performance": "ALL"})

        chrome_options.add_argument("--start-maximized")
        chrome_options.add_argument("--no-sandbox")
        chrome_options.add_argument("--headless=new")
        chrome_options.add_argument("--disable-dev-shm-usage")
        chrome_options.add_argument("--disable-blink-features=AutomationControlled")
        chrome_options.add_argument("--disable-infobars")
        chrome_options.add_argument("--disable-extensions")
        chrome_options.add_argument("--disable-gpu")  # 减少 WebGL 差异(可选)
        chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
        chrome_options.add_experimental_option('useAutomationExtension', False)

        user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
        chrome_options.add_argument('user-agent={0}'.format(user_agent))

        self.driver = webdriver.Chrome(options=chrome_options)

        self.driver.execute_cdp_cmd("Emulation.setDeviceMetricsOverride", {
            "width": 1440,
            "height": 900,
            "deviceScaleFactor": 2,  # macOS Retina
            "mobile": False
        })

        # 覆盖 WebGL 参数(关键!)
        self.driver.execute_cdp_cmd("Emulation.setHardwareConcurrencyOverride", {"hardwareConcurrency": 8})
        # 1. 设置基础 UA(CDP 安全方式)
        self.driver.execute_cdp_cmd("Emulation.setUserAgentOverride", {
            "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
            "platform": "MacIntel"
        })

        # 2. 用 JS 覆盖高级指纹(包括 userAgentData)
        self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
#             delete navigator.__proto__.webdriver;

            Object.defineProperty(navigator, 'platform', { get: () => 'MacIntel' });
            Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });

            // 伪造 userAgentData
            if (!navigator.userAgentData) {
                Object.defineProperty(navigator, 'userAgentData', {
                    value: {
                        brands: [
                            { brand: "Chromium", version: "120" },
                            { brand: "Google Chrome", version: "120" },
                            { brand: "Not:A-Brand", version: "99" }
                        ],
                        mobile: false,
                        platform: "macOS",
                        getHighEntropyValues: async (hints) => ({
                            architecture: "x86_64",
                            model: "",
                            platform: "macOS",
                            platformVersion: "13.5",
                            uaFullVersion: "120.0.6099.0"
                        })
                    },
                    writable: false,
                    configurable: false
                });
            }
            """
        })

        # 覆盖 WebGL 渲染器(防指纹关键)
        self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
            const getParameter = WebGLRenderingContext.prototype.getParameter;
            WebGLRenderingContext.prototype.getParameter = function(param) {
                if (param === 37445) return 'Apple Inc.'; // UNMASKED_VENDOR_WEBGL
                if (param === 37446) return 'Apple GPU';   // UNMASKED_RENDERER_WEBGL
                return getParameter.call(this, param);
            };
            """
        })
        self.driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "America/New_York"})
        self.driver.execute_cdp_cmd("Emulation.setLocaleOverride", {"locale": "en-US"})

    def extract_comment_response_from_logs(self):
        """从 performance 日志中提取评论 API 的完整响应"""
        try:
            logs = self.driver.get_log("performance")
        except Exception as e:
            print(f"获取日志失败: {e}")
            return None

        request_id_to_url = {}
        finished_request_ids = set()

        for entry in logs:
            try:
                message = json.loads(entry["message"])
                method = message.get("message", {}).get("method")
                params = message.get("message", {}).get("params", {})

                if method == "Network.responseReceived":
                    url = params.get("response", {}).get("url", "")
                    request_id = params.get("requestId")
                    if request_id and re.search(r'comment.*list|comments.*aweme', url, re.I):
                        request_id_to_url[request_id] = url

                elif method == "Network.loadingFinished":
                    request_id = params.get("requestId")
                    if request_id:
                        finished_request_ids.add(request_id)
            except Exception:
                continue

        for req_id, url in request_id_to_url.items():
            if req_id in finished_request_ids:
                try:
                    body = self.driver.execute_cdp_cmd(
                        "Network.getResponseBody",
                        {"requestId": req_id}
                    )
                    raw = body.get("body", "{}")
                    if body.get("base64Encoded"):
                        raw = base64.b64decode(raw).decode("utf-8")
                    data = json.loads(raw)
                    if isinstance(data, dict) and ("comments" in data or "item_comments" in data):
                        print(f"✅ 捕获评论接口: {url}")
                        return data
                except Exception as e:
                    print(f"获取响应体失败 (req_id={req_id}): {e}")

        return None

    def scroll_comment_section(self):
        """在 .TUXTabBar-content 内部查找并滚动真正的评论列表容器"""
        script = """
            const tabContent = document.querySelector('.TUXTabBar-content');
            if (!tabContent) {
                console.log('❌ .TUXTabBar-content not found');
                return false;
            }

            // 获取所有子 div
            const candidates = Array.from(tabContent.querySelectorAll('div'));

            // 按 DOM 层级深度排序(优先选深层级的,通常是列表)
            candidates.sort((a, b) => {
                let depthA = 0, depthB = 0;
                let p = a; while (p && p !== tabContent) { depthA++; p = p.parentElement; }
                p = b; while (p && p !== tabContent) { depthB++; p = p.parentElement; }
                return depthB - depthA; // 深的优先
            });

            for (const el of candidates) {
                const style = window.getComputedStyle(el);
                const overflowY = style.overflowY;
                // 必须满足:可滚动 + 有溢出内容
                if ((overflowY === 'auto' || overflowY === 'scroll') &&
                    el.scrollHeight > el.clientHeight) {
                    el.scrollTop = el.scrollHeight+100;
                    console.log('✅ Scrolled real comment container');
                    return true;
                }
            }

            console.log('⚠️ No scrollable child found in .TUXTabBar-content');
            return false;
        """
        try:
            result = self.driver.execute_script(script)
            return result is True
        except Exception as e:
            print(f"滚动执行异常: {e}")
            return False

    def auto_play_and_load_more_comments(self, user_input):

        url = 'https://www.tiktok.com/' + user_input
        print(f"打开视频页面: {url}")
        self.driver.get(url)
        wait = WebDriverWait(self.driver, 20)
        # wait.until(EC.presence_of_element_located((By.TAG_NAME, "video")))
        # 等待评论tab加载完毕
        # wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.TUXTabBar-list")))
        wait.until(EC.presence_of_element_located((By.XPATH, "//span[@data-e2e='comment-icon']")))

        print("视频评论已加载")

        # 点击评论按钮
        try:
            comment_span = wait.until(
                EC.element_to_be_clickable((By.XPATH, '//span[@data-e2e="comment-icon"]'))
            )
            print("正在点击评论图标 (span[@data-e2e='comment-icon'])...")
            self.driver.execute_script("arguments[0].click();", comment_span)
        except Exception as e:
            print(f"无法点击评论按钮: {e}")
            return

#         time.sleep(2)
#         debug_prefix = extract_tiktok_filename(user_input)
#         try:
#             # 保存 HTML
#             with open(f"{debug_prefix}_after_click.html", "w", encoding="utf-8") as f:
#                 f.write(self.driver.page_source)
#             print(f"页面 HTML 已保存: {debug_prefix}_after_click.html")
#
#             # 保存截图
#             self.driver.save_screenshot(f"{debug_prefix}_after_click.png")
#             print(f"页面截图已保存: {debug_prefix}_after_click.png")
#         except Exception as e:
#             print(f"保存调试文件失败: {e}")

        # 加载第一页评论
        first_page_data = self.wait_for_comments(10)
        if not first_page_data:
            print("未捕获到第一页评论")
            return
        self.comments_data.append(first_page_data)

        # 模拟滚动加载更多评论
        # self.driver.execute_script("document.querySelector('.TUXTabBar-content').scrollTo(0, document.querySelector('.TUXTabBar-content').scrollHeight);")
        # 改为调用新方法
        time.sleep(1)
        if self.scroll_comment_section():
            print("已滚动加载更多评论...")
            time.sleep(1)  # 等待新评论加载
        else:
            print("无法滚动评论区,可能结构变化")

        # 加载第二页评论
        second_page_data = self.wait_for_comments(10)
        if second_page_data:
            # 假设每页返回的数据结构相似,合并 comments 字段
            merged_comments = merge_comments(first_page_data, second_page_data)
        else:
            merged_comments = first_page_data
            print("未捕获到第二页评论")


        filename = f"{extract_tiktok_filename(user_input)}.json"
        print(filename)
        with open(filename, "w", encoding="utf-8") as f:
            json.dump(merged_comments, f, ensure_ascii=False, indent=2)
        print(f"评论数据已保存到: {filename}")
        print(f"   共 {len(merged_comments.get('comments', []))} 条评论")

    def wait_for_comments(self, timeout_seconds=10):
        """等待并捕获评论API响应"""
        start_time = time.time()
        while time.time() - start_time < timeout_seconds:
            comment_data = self.extract_comment_response_from_logs()
            if comment_data:
                return comment_data
            time.sleep(0.5)
        return None

    def close(self):
        if hasattr(self, "driver"):
            self.driver.quit()


def main():
    parser = argparse.ArgumentParser(
        description="Scrape TikTok comments via /api/comment/list/ ")
    parser.add_argument(
        "video_input",
        help="TikTok video URL or video_id, e.g., '/@user/video/7318855966163275054' "
    )
    args = parser.parse_args()

    video_input = args.video_input.strip()
    print(video_input)

    if not video_input:
        print("Error: Video input cannot be empty")
        sys.exit(1)


    scraper = TiktokScraper()
    try:
        scraper.auto_play_and_load_more_comments(video_input)
        time.sleep(1)  # 保持窗口打开以便观察
    finally:
        scraper.close()

    sys.exit(0)

if __name__ == "__main__":
    main()

用户页面发布的视频

这里只实现啦只第一页接口的数据, /api/post/item_list/把这个接口的数据放到啦一个json文件中。
这个页面我做了根据cookie的登陆,其实不登陆应该也可以。cookie 文件是通过chrome扩展 Cookies.txt 生成。登陆TikTok后点击这个扩展下载文件下来就行。
image.png

python3.11 post_item_list.py @dlw2026
image.png

post_item_list.py 代码如下:

# scraper.py
import asyncio
import json
import sys
import argparse
from playwright.async_api import async_playwright
from cookies import load_cookies_safely


# 这是用来抓取用户主页的 /api/post/item_list/


async def scrape_tiktok_user(username):
    target_responses = []
    clean_username = username.lstrip("@")
    output_json = clean_username + "_posts.json"
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        context = await browser.new_context(
            viewport={"width": 1920, "height": 1080},
            user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
        )

        cookies = load_cookies_safely()
        await context.add_cookies(cookies)
        page = await context.new_page()

         # 隐藏自动化特征
        await page.add_init_script("""
            // 隐藏 webdriver 标志
            delete navigator.__proto__.webdriver;
            window.chrome = { runtime: {} };
            // 伪造 platform 为 Mac
            Object.defineProperty(navigator, 'platform', {
                get: () => 'MacIntel'
            });
            // 伪造 userAgentData(高熵指纹)
            if (!navigator.userAgentData) {
                Object.defineProperty(navigator, 'userAgentData', {
                    value: {
                        brands: [
                            { brand: "Chromium", version: "120" },
                            { brand: "Google Chrome", version: "120" },
                            { brand: "Not:A-Brand", version: "99" }
                        ],
                        mobile: false,
                        platform: "macOS",
                        getHighEntropyValues: async (hints) => ({
                            architecture: "x86_64",
                            model: "",
                            platform: "macOS",
                            platformVersion: "13.5",
                            uaFullVersion: "120.0.6099.0"
                        })
                    },
                    writable: false,
                    configurable: false
                });
            }
        """)

        # ✅ 关键:宽松匹配 API(不再检查 content-type)
        def handle_response(response):
            url = response.url
            if (
                    "/api/post/item_list/" in url
                    and response.status == 200
                    and "tiktok.com" in url
            ):
                if not target_responses:
                    target_responses.append(response)
                    print(f"捕获 API: {url.split('?')[0]}")

        page.on("response", handle_response)

        url = f"https://www.tiktok.com/{username}"
        print(f"打开页面: {url}")
        await page.goto(url, wait_until="domcontentloaded", timeout=50000)

        # 等待用户信息出现
        try:
            await page.wait_for_selector('h1[data-e2e="user-title"]', timeout=15000)
            print("用户主页加载成功")
        except:
            print("用户信息未加载,继续尝试...")

        # 滚动一下,触发懒加载(重要!)
        await page.evaluate("window.scrollTo(0, document.body.scrollHeight / 3)")

        # 等待 API(最多 20 秒)
        for i in range(40):
            if target_responses:
                break
            if i % 10 == 0:
                print(f"⏳ 等待 API 中... ({i * 0.5}s)")
            await asyncio.sleep(0.5)

        api_data = None
        if target_responses:
            try:
                api_data = await target_responses[0].json()
                print("✅ 成功解析 JSON 数据")
            except Exception as e:
                # 如果 .json() 失败,可能是 text/plain,手动解析
                try:
                    text = await target_responses[0].text()
                    api_data = json.loads(text)
                    print("✅ 通过 .text() 成功解析 JSON")
                except:
                    print(f"❌ 完全无法解析响应: {e}")

        if api_data:
            with open(output_json, "w", encoding="utf-8") as f:
                json.dump(api_data, f, ensure_ascii=False, indent=2)
            items = api_data.get("itemList", [])
            print(f"抓取到 {len(items)} 个视频,已保存至 {output_json}")
        else:
            print("未捕获到任何 API 数据")
            # 调试:打印所有请求(可选)
#             await page.route("**/*", lambda route: print("REQ:", route.request.url) or route.continue_())
#         screenshot_path = f"{clean_username}_homepage.png"
#         await page.screenshot(path=screenshot_path, full_page=True)
#         print(f"已保存页面截图: {screenshot_path}")

        await page.wait_for_timeout(5000)
        await browser.close()
        if api_data:
            return True
        else:
            return False


def main():
    parser = argparse.ArgumentParser(description="Scrape TikTok user profile")
    parser.add_argument("username", help="TikTok username (with or without @), e.g., @dishilife or dishilife")
    args = parser.parse_args()

    username = args.username.strip()
    if not username:
        print("Error: Username cannot be empty")
        sys.exit(1)
    if not username.startswith('@'):
        username = '@' + username
    success = asyncio.run(scrape_tiktok_user(username))
    sys.exit(0 if success else 1)


if __name__ == "__main__":
    main()

cookies.py脚本:

import os
from datetime import datetime



COOKIES_FILE = "cookies.txt"

def load_cookies_safely():
    filepath = COOKIES_FILE
    if not os.path.exists(filepath):
        raise FileNotFoundError(f"❌ Cookie 文件不存在: {os.path.abspath(filepath)}")

    cookies = []
    current_ts = int(datetime.now().timestamp())
    tiktok_domains = {".tiktok.com", "www.tiktok.com"}

    with open(filepath, "r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith("#"):
                continue
            parts = line.split("\t")
            if len(parts) < 7:
                continue

            domain = parts[0]
            if domain.startswith("#HttpOnly_"):
                domain = domain[len("#HttpOnly_"):]
            if not domain.startswith("."):
                domain = "." + domain.lstrip(".")

            if not any(t in domain for t in tiktok_domains):
                continue

            cookie = {
                "name": parts[5],
                "value": parts[6],
                "domain": domain,
                "path": parts[2],
                "secure": parts[3].upper() == "TRUE",
            }

            expires_str = parts[4]
            if expires_str.isdigit():
                expires = int(expires_str)
                if expires > current_ts:
                    cookie["expires"] = expires

            cookies.append(cookie)

    if not cookies:
        raise ValueError("❌ 未加载有效 Cookie!请确认包含 sessionid。")
    return cookies

if __name__ == "__main__":
    print('不可以直接执行')

祝 jQuery 20岁生日快乐。

自 John Resig 在 2006 年发布 jQuery 以来,这个库已经陪伴 Web 开发走过了二十个年头。而在距离上一次主要版本发布近十年后,jQuery 团队正式推出了 jQuery 4.0.0

image.png

很多人可能觉得 jQuery 已经是时代的眼泪,但看到 jQuery 4.0.0 正式发布的消息时,还是不得不感叹法拉利老了还是法拉利。

这次更新可不是简单的修修补补,这次团队清理了多年的技术债务,移除了过时的 API,这个经典库终于也能跟上现代 Web 开发的节奏。

以下是这次更新中几个最值得关注的变化:

告别旧版的浏览器

这应该是最喜闻乐见的改动了。jQuery 4.0.0 正式停止支持 IE 10 及以下版本。目前仅保留对 IE 11 的支持,但这只是暂时的,团队计划在未来的 jQuery 5.0 中彻底移除 IE 支持。此外,旧版 Edge(Edge Legacy)、iOS 11 以下版本、Firefox 65 以下版本以及旧版 Android 浏览器的支持也被移除。

只要不是做古董级项目,包体积会更小,运行速度也会更快。

移除过时的 API

随着原生 JavaScript(ES6+)功能的完善,许多 jQuery 早期的辅助函数已失去存在的意义。4.0 版本移除了大量此类 API,包括用于去除字符串空格的 jQuery.trim、判断数组的 jQuery.isArray、解析 JSON 的 jQuery.parseJSON 等。

image.png

此外,一些仅供内部使用的数组方法(如 pushsortsplice)也从 jQuery 原型中移除。现在,开发者应直接使用原生的 JavaScript 方法来替代这些旧功能。

源码 迁移至 ES Modules

jQuery 的源码终于从旧式的 AMD 模块系统迁移到了 ES Modules。 这下 jQuery 能更丝滑地融入 Vite、Rollup 或 Webpack 等现代构建工具链。而且,在浏览器中可以通过模块化的方式直接加载和运行 jQuery,符合现代开发流程。

焦点事件顺序回归 W3C 标准

在很长一段时间里,不同浏览器对焦点事件(focus/blur/focusin/focusout)的触发顺序存在分歧。jQuery 曾为了统一行为而强制了一套自己的顺序。

现在,所有主流浏览器已达成一致,jQuery 4.0.0 决定不再进行人工干预,直接遵循 W3C 标准顺序,blur -> focusout -> focus -> focusin。这属于破坏性更新,如果现有项目严重依赖特定的事件触发顺序,升级时需格外注意。

更轻量的 Slim 版本

新的 Slim 版本(精简版)移除了 Deferreds 和 Callbacks 模块,体积进一步缩小(gzip 后减少约 8KB)。

由于现代浏览器(除 IE11 外)都已原生支持 Promise,大多数异步操作已不再需要 jQuery 的 Deferreds。如果是面向现代浏览器的项目,Slim 版本将是更优的选择。

快速上手体验

即使不为了新项目,仅仅为了情怀,很多人也想试试这个 4.0 版本。最快的方法就是通过 npm 安装 jquery@4.0.0 跑个 Demo,那一个稳定且配置好的 Node.js 环境必不可少。

如果你不想为了尝鲜就在本地折腾一堆 Node.js 配置,或者单纯觉得配环境很麻烦,可以试试 ServBay。它能一键把 Node.js 环境部署好,自动搞定路径配置和版本管理。

image.png

环境弄好后,直接在目录里运行 npm 命令拉取最新的 jQuery 就能直接玩,省时省力。

结语

jQuery 4.0.0 的发布证明了它并躺平,而是在努力适应现代 Web 标准,就像一个武林高手,闭关10年,出关后变得更强了。

无论是为了维护现有资产,还是为了在特定场景下快速开发,这个新版本都交出了一份合格的答卷。

最后,这个时代的眼泪还有多少用户知道?

在这个行业里摸爬滚打了十多年,我常常感觉,我们这些做邮件营销的人,就像是在客户的邮箱里“开小店”。每一天,无数个“店铺招牌”(也就是邮件主题)在客户眼前闪过。想让客户在匆匆一瞥中为你驻足,甚至推开你这扇门,真的需要点真功夫。
图片
今天,我就和大家聊聊这个决定“开门率”的第一关——邮件主题行。这不仅仅是一行字,这是你和客户之间最精炼、最关键的对话开端。
一、信任是基石:先让客户认识你,再期待他打开
你在琢磨怎么让主题更吸引人之前,我们必须先回到一个更根本的问题:客户凭什么相信你?想象一下,你收到两封邮件,一封来自陌生的个人邮箱,另一封来自规范的service@知名品牌.com,你会本能地更信任谁?研究显示,发件人信息的可信度直接影响打开率,使用企业官方域名邮箱能显著提升专业形象。我的实践心得:从早期创业开始,我就坚持使用专业的邮件营销平台来管理发件域名和身份认证(如SPF、DKIM)。这不仅是技术配置,更是建立品牌信任的门面。我长期合作的U-Mail邮件营销平台,在这一点上给我的帮助很大。它允许企业直接使用自己的域名作为发件后缀,这不仅让每一封邮件都成为品牌宣传,更重要的是,它联合了国内外主流邮箱运营商,建立了专属的“绿色通道”。这意味着我们的邮件能更安全、更稳定地进入客户的收件箱,而不是垃圾箱。信任,始于抵达。
二、主题行心法:像朋友一样说话,像顾问一样思考
当信任的基石打好后,主题行就是那句脱口而出的问候或提醒。它必须精准有吸引力,并且尊重对方的时间。我认为,好的主题行要做到以下三点:
图片

1、关联与价值,缺一不可一个冰冷的“产品推荐”远不如一句“为您上周关注的XX问题,找到了三个解决方案”。主题行必须瞬间建立“与我有关”的链接。这可以是客户的姓名、公司名,也可以是您洞察到的他的业务痛点。通过U-Mail的“自定义变量”功能,我可以轻松地在主题和内容中插入客户的名字、公司或其他属性,实现基础个性化。更进一步,基于平台的地址池分类和用户行为追踪报告,我能对不同分组(比如已打开某类邮件的用户、点击过某链接的用户)设计完全不同角度的主题。例如,对互动过的客户,主题可以是“继我们上次的讨论…”,而对新客户,则突出行业解决方案价值。
2、激发好奇,但保持真诚提问和数字是制造好奇的经典技巧。“如何将季度成本降低15%?” 比 “我们的服务很好” 有力得多。引用具体数字,如“3个技巧提升您的团队效率”,能增加信息的可信度和吸引力。但切记,不要做“标题党”。过度使用“免费!”“惊天优惠!”等词汇,极易触发垃圾邮件过滤器,并损害长期信任。我常用的一个检验方法是:问自己,这个主题承诺的内容,我的邮件正文是否能够毫无水分地兑现?
3、简洁有力,移动端友好客户可能在手机上快速浏览,据统计超过60%的邮件在移动设备上打开。过长的主题会被截断。我的经验是,将主题行核心控制在30-50个字符(大约6-10个词)为佳,确保核心价值在手机通知栏或收件箱列表中就一目了然。
三、进阶的艺术:用数据让直觉更靠谱
多年的经验会形成直觉,但直觉需要用数据来验证和优化。这是我职业生涯中后期提升最大的一个环节。1、A/B测试是黄金准则:我从不凭感觉决定最终用哪个主题。对于重要邮件,我会准备2-3个不同角度(例如,一个侧重“提问”,一个侧重“价值声明”)的主题,发给一小部分用户进行A/B测试。U-Mail邮件营销平台内置的统计功能可以非常清晰地告诉我,哪个版本的打开率更高、哪个链接点击更多。用数据说话,让每一次发送都成为下一次优化的养分。
2、智能发送,事半功倍:找到最佳发送时间能显著提升打开率。除了参考通用数据(如避开周一早高峰和周末),更重要的是分析你的特定受众。通过U-Mail邮件营销平台生成的详细数据报告,我可以观察我的用户通常在哪个时间段最活跃、打开率最高。基于这些洞察,再利用平台的“定时发送”任务系统,让邮件在用户最可能查阅的时间精准送达,效果立竿见影。
四、温情提示:比技巧更重要的是“心法”
最后,我想分享几个比技术更重要的原则:
图片
1、提供价值,而非仅仅推销:客户愿意打开的,永远是那些能为他解决问题、带来启发的内容。让你的主题成为价值预告片。
2、保持一致性:稳定的发送频率和稳定的品牌语气,会让客户逐渐熟悉并期待你的邮件。
3、尊重选择:在邮件中提供清晰、便捷的退订链接,这不仅是法律要求,也是一种尊重。维护一个干净、自愿的订阅列表,长远来看打开率和转化率会更高。
EDM邮件营销是一场与用户建立长期关系的慢舞,主题行就是优雅邀请的第一步。它需要技术工具的保障,需要数据思维的优化,但归根结底,需要的是一颗真正想为用户提供价值的心。
工欲善其事,必先利其器。像U-Mail邮件营销平台这样的专业工具,对我来说就像一个可靠的伙伴。它从确保送达的底层通道开始,到内容个性化、数据统计分析,再到基于数据的自动化任务管理,覆盖了整个营销闭环,让我能更专注于策略和创意本身,把“敲门”这件事,做得更得体、更有效。

摘要: 随着大模型从“对话时代”迈向“任务执行时代”,智能体工作流(Agentic Workflow)已成为企业级 AI 应用的核心。本文深度拆解 Agent 的感知、规划、记忆与行动闭环,结合 GartnerMcKinsey 的最新权威数据,为开发者提供一套可落地的 AI 智能体架构指南。

🚀 快速回答 (Golden Answer)

智能体工作流 (Agent Workflow) 是将大语言模型(LLM)从静态文本生成工具转化为动态任务执行核心的编排逻辑。其核心在于引入了“感知-决策-行动-观测”的闭环机制。通过思维链(CoT)自我反思(Self-Reflection),Agent 能够自主拆解复杂目标并在动态环境中实现闭环执行。


一、 认知重塑:从大模型到智能体的技术演进

1.1 范式转移:第二代 AI 的兴起

根据 Stanford HAI 定义的演进路径,AI 正在经历从“概率拟合”到“目标达成”的跨越。
Standard_LLM_vs_AI_Agent.png

  • Gartner 趋势预测: 根据 Gartner 发布的《2026 年十大战略技术趋势》“多智能体系统 (MAS)” 被列为年度核心趋势,预测到 2028 年,全球 90% 的 B2B 采购将由 AI 智能体介入。
  • McKinsey 调研数据: McKinsey Digital 2025 年末报告《The state of AI in 2025》显示,全球 88% 的组织已常规使用 AI,且 62% 的受访企业正积极部署 AI 智能体。

二、 核心架构:驱动 Agent 的“四元引擎”

AI_Agent_Four_Engines_Blueprint.png

2.1 规划系统 (Planning)

利用 LLM 的逻辑推理能力,将模糊指令拆解为原子任务。其数学表达为路径的最优概率选择:

2.2 记忆系统 (Memory)

  • 短期记忆: 依赖上下文窗口(Context Window)维护当前任务状态。
  • 长期记忆: 结合向量数据库实现 RAG(检索增强生成)

2.3 执行系统 (Action)

通过 MCP 协议等标准接口,Agent 操作外部软件、调用 API 或执行 Python 脚本,打破“离线”限制。

2.4 反思系统 (Reflection)

通过对比“预期输出”与“实际观测(Observation)”,启动自我修正逻辑:


三、 主流开发框架与选型矩阵

针对不同业务需求,2026 年的主流开发路径如下表所示:

框架名称技术路线核心优势推荐场景
LangGraph有向循环图状态控制极强,支持复杂循环自动编程、复杂审计
Coze (扣子)零代码可视化门槛极低,插件生态丰富个人助理、社交媒体
AutoGen多智能体协作角色分工明确,降低幻觉软件工程、内容流水线

ChatGPT Image 2026年1月20日 11_29_12.jpeg

国内已有团队开始围绕“Agentic Workflow”构建企业级智能体产品线,其中包括专注于智能体工作流的公司——智能体来了,其重点在于将规划、工具调用与工作流调度整合为可交付模块。

这一类公司代表着智能体从研究走向产业化的趋势。


四、 实战视角:构建具备“自愈能力”的原型

以下是基于 Python 的工业级 Agent 逻辑骨架,展示了如何处理执行异常并触发自动重规划(Re-planning)。

"""
# 依赖环境:langchain>=0.3.0, openai>=1.50.0
# 官方参考文档: https://python.langchain.com/
"""
from typing import List, Dict

class LogicAgent:
    def __init__(self, model_name="deepseek-v3"):
        self.model = model_name
        self.history = []

    def run_workflow(self, task_goal: str):
        # 1. 初始规划 (Planning)
        current_plan = self.generate_initial_plan(task_goal)
        
        while not self.is_task_complete(current_plan):
            # 2. 执行原子任务 (Action)
            step = current_plan.get_next_step()
            observation = self.execute_step(step)
            
            # 3. 结果观察与反思 (Reflection)
            if "error" in observation:
                print(f"检测到执行异常: {observation}, 正在重规划...")
                current_plan = self.replan(task_goal, observation)
            else:
                self.history.append(observation)
        
        return self.finalize_output()
工程化优化提示: 在实际生产环境中,建议添加 最大迭代次数(Max_Iterations)超时机制(Timeout),避免 Agent 在 Observation 环节获取模糊反馈时陷入逻辑死循环。

五、 FAQ:AI 智能体落地路径与优化技巧

Q1:如何有效缩短 AI 智能体落地路径?
答: 遵循“从小到大”原则。先在 CozeDify 验证逻辑闭环,确认有效后再迁移至 LangGraph 进行深度定制。

Q2:有哪些核心的 Agent 工作流优化技巧?

  • 引入反思节点: 对每个 Action 结果进行置信度评分。
  • 长短记忆分离: 滑动窗口维护状态,向量索引调用历史。
  • 动态路径切换: 赋予模型根据反馈跳过步骤或回溯的权限。

六、 参考文献与权威索引 (References)

  1. Gartner: Top Strategic Technology Trends for 2026
  2. McKinsey: The state of AI in 2025
  3. Stanford HAI: AI Index Report 2025
  4. LangGraph Docs: State Machine Framework

本工具仅限学术交流使用,严格遵循相关法律法规,符合平台内容的合法及合规性,禁止用于任何商业用途!

1. 项目背景与核心功能整合

开发初衷

小红书作为国内头部的社区种草平台,其海量笔记数据蕴含着极高的商业与学术价值。此前,为了满足不同场景的采集需求,我曾分别开发了针对评论、博主主页以及UID转换的三款独立工具。然而,许多用户反馈在处理复杂任务(如同时采集评论和主页笔记)时,频繁切换软件带来了操作上的不便。

为了解决这一痛点,我将上述三个核心模块进行了深度融合,推出了全新的 “爬小红书聚合软件v1.0”。这是一款集成了“评论采集”、“达人笔记采集”及“UID转换”的一体化数据解决方案。

适用场景

本工具严格遵循相关法律法规,仅限于学术交流与合规性研究,具体适用场景包括:

  • 获客截流: 从行业热门作品评论区精准挖掘目标用户画像。
  • 舆情分析: 用于社会舆情挖掘、网络传播规律等学术研究。
  • 内容优化: 辅助内容创作者分析优质博主风格与热门话题。
  • 运营辅助: 解决跨平台协作中链接与ID转换的痛点。

2. 技术架构与实现逻辑

本软件完全由 Python 语言独立开发,采用模块化设计以保证高效运行与维护。

核心模块分工

序号模块名称功能描述
1tkinter构建GUI图形用户界面
2requests负责发送HTTP请求
3json解析服务器返回的响应数据
4pandas处理并保存为CSV数据结果
5logging记录运行日志,便于异常回溯

核心代码实现

以下是软件中处理数据请求与保存的关键代码片段:

发送请求与解析:

# 发送请求
r = requests.get(url, headers=h1, params=params)
# 解析数据
json_data = r.json()

数据解析示例(评论内容):

for c in json_data['data']['comments']: 
    # 评论内容 
    content = c['content'] 
    self.tk_show('评论内容:' + str(content)) 
    content_list.append(content)

数据保存至CSV:

# 保存数据到DF
df = pd.DataFrame( {  
    '笔记链接': 'https://www.xiaohongshu.com/explore/' + note_id,  
    '笔记链接_长': note_url2,  
    '页码': page,  
    '评论者昵称': nickname_list,  
    '评论者id': user_id_list,  
    '评论者主页链接': user_link_list,  
    '评论时间': create_time_list,  
    '评论IP属地': ip_list,  
    '评论点赞数': like_count_list,  
    '评论级别': comment_level_list,  
    '评论内容': content_list, })
# 设置csv文件表头
if os.path.exists(self.result_file3): 
    header = False
else: 
    header = True
# 保存到csv
df.to_csv(self.result_file3, mode='a+', header=header, index=False, encoding='utf_8_sig')
self.tk_show('文件保存成功:' + self.result_file3)

采用logging模块记录日志运行过程,方便debug回溯场景:

def get_logger(self):    
    self.logger = logging.getLogger(__name__)    
    # 日志格式
    formatter = '[%(asctime)s-%(filename)s][%(funcName)s-%(lineno)d]--%(message)s'    
    # 日志级别
    self.logger.setLevel(logging.DEBUG)    
    # 控制台日志
    sh = logging.StreamHandler()    
    log_formatter = logging.Formatter(formatter, datefmt='%Y-%m-%d %H:%M:%S')    
    # info日志文件名
    info_file_name = time.strftime("%Y-%m-%d") + '.log'    
    # 将其保存到特定目录
    case_dir = r'./logs/'    
    info_handler = TimedRotatingFileHandler(filename=case_dir + info_file_name,                                        
                                          when='MIDNIGHT',                                        
                                          interval=1,                                        
                                          backupCount=7,                                        
                                          encoding='utf-8')

3. 功能详解与数据产出

本软件通过接口协议进行数据交互,相比模拟浏览器(RPA)具有更高的稳定性。采集过程中,系统会实时(每页请求间隔1~2s)将数据存入CSV文件,有效防止因网络异常导致的数据丢失。

功能一:搜索笔记与评论采集

该模块支持根据关键词或笔记链接采集评论区数据。在这里插入图片描述

  • 笔记数据字段(19个): 包含关键词、笔记ID、标题、正文、点赞/收藏/评论数、发布时间及IP属地等。
  • 评论数据字段(11个): 包含评论者昵称/ID、评论内容、点赞数、IP属地及评论级别等。
  • 多媒体支持: 自动下载搜索到的笔记封面图片。

功能二:博主主页笔记采集

支持根据博主主页链接批量抓取其发布的历史笔记。在这里插入图片描述

  • 采集字段(18个): 包含作者信息、笔记ID、链接、类型、互动数据及正文内容等。
  • 结果展示: 生成结构化的CSV文件及对应的图片素材包。

功能三:UID与链接转换工具

提供高频使用的转换功能,无需打开网页即可完成:在这里插入图片描述

  1. 主页链接 $\leftrightarrow$ 小红书号(xhs号)互转。
  2. App端作品链接 $\rightarrow$ PC端作品链接转换。

4. 使用指南

前置准备

  • 在开始采集前,用户需获取并填写自己的Cookie值。
  • 打开浏览器开发者工具(F12),复制Cookie值。
  • 将其粘贴至软件同级目录下的 cookie.txt 文件中。

操作流程

  • 登录界面: 启动软件并完成登录验证。
  • 选择模块: 根据需求选择“搜索采集”、“主页采集”或“转换工具”。
  • 配置参数: 填写关键词、时间范围或博主链接等信息。
  • 执行任务: 点击「开始执行」,实时监控进度条。
  • 查看结果: 任务完成后,在软件所在文件夹查看生成的CSV文件及图片文件夹。

5.演示视频

为了方便用户上手,附带了完整的操作演示视频:

mp.weixin.qq.com/s/t9cKGsgJoI9rca3I1w5RdA

END. 版权声明

本软件及文章均为本人独立原创开发与编写。请尊重原创成果,严禁任何形式的二创、转载或盗发,违者必究!

【2026年01月19日】 FlowyAIPC 现已更新至 v4.0.5 版本。本次更新聚焦于 AI 创作体验与本地推理使用门槛的优化,带来了全新的 文生图功能,同时对 WinML NPU 系列模型的使用引导进行了加强,让更多用户可以更清楚、更安心地使用本地 AI 能力。

新功能上线:文生图(Text to Image)

在 v4.0.5 中,FlowyAIPC 正式支持 文生图功能。用户只需输入文字描述,即可生成对应图片,用于创意设计、内容配图、灵感草稿等多种场景。

FlowyAIPC文生图功能具有更丰富的生成控制能力,包括:

    • 支持设置生成风格(如人像摄影、经典日漫、赛博朋克等)
    • 支持自定义图片比例(如1:1、3:2、9:16等),适配不同使用场景
    • 同时支持 本地模型生成 与 云端模型生成

其中,本地文生图基于 Z-image 模型,生成过程在本地完成,更加注重数据可控性与隐私安全。


⚠️ 文生图功能使用说明(请务必查看)

FlowyAIPC本地文生图最低配置:Intel Core Ultra系列芯片 + 内存 32GB 及以上

如果设备暂不满足本地文生图功能最低配置,也可直接使用云端文生图模式,无需额外配置即可体验完整功能。

FlowyAIPC文生图效果展示

WinML · NPU 模型使用引导优化

在 v4.0.5 版本中,FlowyAIPC 还针对 WinML 的 NPU 系列模型 增加了更多用户引导与提醒,包括硬件适配提示、使用条件说明等,帮助用户在使用本地模型时更清楚地了解设备支持情况,降低上手成本,减少试错。

FlowyAIPC 将持续围绕 本地 AI、可控数据、真实效率提升不断迭代与完善。
欢迎大家更新至 v4.0.5,体验全新的文生图能力,也欢迎在使用过程中向我们反馈你的建议。

访问FlowyAIPC官网:www.flowyaipc.cn

微软已将其模型上下文协议(MCP)对Azure Functions的支持提升至一般可用性,标志着向标准化、身份安全的代理式工作流程的转变。通过集成原生 OBO 认证和流式 HTTP 传输,本次更新旨在解决历史上阻碍 AI 智能体访问敏感下游企业数据的“安全痛点”。

 

MCP 扩展于2025年 4 月进入公开预览,现支持.NETJava、JavaScript、PythonTypeScript,而新的自托管选项允许开发者在不修改代码的情况下部署现有的基于 MCP SDK 的服务器。

 

由 Anthropic 开发的模型上下文协议(Model Context Protocol)提供了一个标准化的接口,使 AI 智能体能够访问外部工具、数据源和系统。自 2024 年 11 月推出以来,包括 OpenAI、谷歌 DeepMind 和微软在内的主要 AI 平台已采用该协议,到 2025 年 4 月,服务器下载量从大约10万次增长到超过800万次。

 

然而,正如 Mirantis 的 Randy Bias所指出的那样:“安全和合规团队不能允许运行在开发人员笔记本电脑上的未经审查的‘影子代理’访问电子医疗记录或客户个人身份信息等关键数据系统”——这推动了对具有内置治理的托管平台的需求。

 

一般可用的 MCP 扩展引入了几个为生产部署设计的功能。对流式 HTTP 传输协议的支持取代了旧的服务器发送事件(SSE)方法,微软建议除非客户端特别需要 SSE,否则使用新的传输。该扩展暴露了两个端点:/runtime/webhooks/mcp 用于流式 http 和/runtime/webhooks/mcp/sse 用于遗留的 SSE 连接。

 

对于 Java 开发人员,Maven 构建插件(版本 1.40.0)提供了构建时对 MCP 工具注释的解析和验证,自动生成正确的扩展配置。根据微软的说法,这种构建时分析可以防止运行时反射在 Java 应用程序中引入的冷启动时间增加。

 

内置的认证和授权实现了MCP授权协议要求,包括发出 401 挑战和托管受保护资源元数据文档。开发者可以为服务器认证配置 Microsoft Entra 或其他 OAuth 提供商。该功能还支持代表用户(OBO)认证,使工具能够使用用户的身份而不是服务账户访问下游服务。

 

首席软件工程师 Den Delimarsky 在 2025 年 4 月分享了关于使用 Azure Functions 和 API 管理实现安全的 MCP 服务器的见解

 

开发者面临的一个主要痛点是实现与认证和授权相关的任何内容。如果你没有安全专业知识,这本质上是痛苦且有风险的。你可能会错误地配置一些东西,最终将所有数据暴露给不能看到它们的人。

 

Sitecore 的云架构师 Victor Karabedyants详细说明了实践中的认证流程。当客户端连接到远程 MCP 服务器时,Azure Functions 会以包含受保护资源元数据路径的 401 响应拒绝初始匿名请求。客户端读取此元数据,触发 Microsoft Entra ID 登录流程,获得 OAuth 令牌,并用令牌重试请求。“你的 Python 或 Node 脚本永远不会看到认证逻辑,”Karabedyants 解释说。“平台负责处理繁重的工作。”

 

对于 Java 开发者,Maven Build Plugin(版本 1.40.0)在构建时提供 MCP 工具注释的解析和验证,自动生成正确的扩展配置。据微软称,这种构建时分析可以防止 Java 应用程序中运行时反射引入的冷启动时间增加。

 

新的自托管MCP服务器功能目前处于公开预览阶段,允许团队将使用官方SDK构建的 MCP 服务器部署到 Azure Functions 作为自定义处理程序;轻量级 Web 服务器代理请求到开发者的现有进程。微软将此描述为“提升和转移”方法,只需要一个 host.json 配置文件来定义 Functions 应该如何运行服务器。该功能目前支持使用 Python、TypeScript、C#或 Java SDK 实现的流式 http 传输的无状态服务器。

 

(来源:Microsoft Learn

 

微软的高级云倡导者 Yohan Lasorsa 在开发者社区博客文章中强调了自托管方法的简单性:

 

在 Azure Functions 上托管 MCP 服务器,可以让你兼得两者的优点:无服务器基础设施的简单性和官方 Anthropic SDK 的强大功能。只需一个简单的配置步骤,你就可以将现有的 Node.js MCP 服务器部署到一个生产就绪、自动扩展的平台。

 

Gaurav Rawat 在 Medium 上一篇关于生产部署模式的详细文章中,强调了在大规模运行 MCP 服务器时的几个运维考虑因素。他指出,对于 P95 延迟超过 1 秒、错误率超过 2%以及 SSE 连接频繁掉线等监控指标,需要在生产环境中立即进行调查。

 

Rawat 还记录了实践者应该意识到的当前限制:在与 Azure AI Foundry 集成时,嵌套数组和复杂类型必须序列化为逗号分隔的字符串,并且由于 UI 基础的批准在自动化部署中不持久,因此需要使用 require_approval="never"进行程序化工具批准以用于生产工作流程。

 

Azure Functions 提供了多种托管计划,以满足不同的 MCP 服务器需求。Flex消费计划根据需求自动扩展,采用按执行付费的计费模式和零规模经济。当 MCP 工具闲置时,成本降至零,同时保持快速的唤醒时间。Premium计划支持“始终就绪”的实例,这些实例保持预初始化状态,消除了冷启动延迟,这对于初始化延迟可能导致 SSE 连接超时和代理响应时间差的关键时刻工具至关重要。Rawat 建议为关键的 24/7 工具设置两到三个始终就绪的实例,以确保故障转移能力。开发人员还可以使用专用计划来满足需要可预测性能或与虚拟网络集成的工作负载。

 

微软已经发布了多种语言的快速入门模板,涵盖这两种托管方法。MCP 扩展快速入门覆盖了C# (.NET)PythonTypeScript (Node.js),Java 快速入门即将推出。该平台直接与Azure AI Foundry集成,允许智能体在无需额外配置层的情况下发现和调用 MCP 工具。

 

原文链接:

https://www.infoq.com/news/2026/01/azure-functions-mcp-support/

背景


娃刚出生两个月,每天哄娃睡觉是一大困难,最近发现哄娃的时候放白噪音还是挺有效的。

网上白噪音资源不少,但用起来挺麻烦:要么刷小红书/抖音,要么下载各种 app ,跨设备使用也很不方便。

于是用 H5 写了个简单的播放器,手机、平板、电脑都能直接用。

功能


  • 白噪音循环播放(雨声、风声、海浪等)

  • 支持后台播放

  • 响应式设计,移动端友好

  • 无需下载,打开即用

目前只在 iOS 上认真测试过,Android 上不知道会不会有 bug (欢迎反馈)

访问地址:宝宝哄睡音频播放器

开源地址:[baby-sleep-player](baby-sleep-player)

有一点点用的话给个 ⭐️ 就更好了~

继续哄娃去咯~ 👶

iOS 界面

iOS 界面

科技云报到原创。

2026年伊始,港股市场被AI热潮彻底点燃。

1月8日,智谱AI以“全球通用大模型第一股”身份登陆港交所,1164倍超额认购、首日528亿港元市值,拉开国产AI企业资本化序幕。

仅隔一天,MiniMax接力挂牌,1837倍超额认购、盘中涨幅超109%、市值破千亿港元,刷新港股AI新股热度纪录。

短短48小时,两家头部企业募资近百亿港元,市值总和逼近1700亿港元,这场资本盛宴背后,是市场对AI产业价值的集体押注。

同时,北京智源人工智能研究院发布《2026十大AI技术趋势》,明确指出AI发展的核心转变:从“预测下一个词”的语言游戏,迈向“预测世界状态”的物理规律探索。

当资本泡沫与技术突破碰撞、商业化探索与产业需求对接,2026年的AI行业不再是单一技术的狂欢,而是一场涉及认知范式、智能形态、商业逻辑的全面重构。

 

 

技术成熟度与产业需求的双重共振

AI企业的密集上市,标志着行业正式告别“依赖融资续命”的草莽阶段,迈入“资本化造血”的关键转折期。

这一转变,是技术成熟度与产业需求的深度契合,更暗藏着行业发展的逻辑变化。

从技术层面看,大模型已从参数竞赛进入能力沉淀期,智源报告指出,2026年AI将实现从“感知”到“认知”的跨越,NSP(Next-State Prediction)范式让模型具备物理世界规律理解能力,为商业化提供了技术基础。

从产业需求看,全球AI市场规模将从2025年的7575.8亿美元增至9000亿美元,同比增长18.7%,延续了高增长态势。

国务院“人工智能+”行动将AI定位为新型工业化 “必答题”,工业、金融、医疗等领域的智能化需求迫切,为技术落地提供了广阔场景。

资本的选择也暗藏趋势密码,AI应用与多模态世界模型正成为AGI共识方向。

这意味着,资本不再盲目追逐参数规模,而是聚焦“技术落地能力”与“场景适配性”,这种理性回归将推动行业从野蛮生长走向高质量发展。

从“预测文本”到“理解世界”

智源十大趋势的核心洞察,是AI技术范式从NTP(Next Token Prediction)到NSP(Next-State Prediction)的转变。

这一变革不仅重塑了技术研发逻辑,更将AI的应用边界从数字空间拓展至物理世界,催生了一系列颠覆性创新。

2026年,“能否理解世界运转规律”将成为衡量大模型实力的核心标准。

不同于传统语言模型仅能生成连贯文本,世界模型通过多模态数据统一编码,自主学习物理动态、时空连续性与因果关系,实现“理解-预测-规划”的完整认知闭环。

这一技术突破,让AI从“文字工具”升级为“世界模拟器”。

在海外,OpenAI的Sora 2展现出对真实世界的深度模拟能力,World Labs的RTFM 模型可从单幅图像创建3D空间;在国内,智源悟界・Emu3.5成为NSP范式的标杆,蚂蚁百灵大模型在多模态生成、方言识别领域逼近GPT-5水平。

世界模型的成熟将重构多个行业。自动驾驶领域,通过模拟复杂路况降低实车测试成本;机器人训练中,虚拟场景预训练大幅提升实体机器人的环境适应能力;科研领域,模拟分子运动加速新药研发。

智源报告指出,这一技术将成为AGI的核心共识方向,2026年将有更多企业加入布局,推动认知智能进入规模化应用阶段。

如果说世界模型是AI的“大脑”,具身智能就是让大脑“走进现实”的载体。

2025年的“百机大战”后,2026年具身智能行业进入“出清期”,同质化企业因资金断裂或技术不足被淘汰,头部企业凭借订单优势与技术积累形成格局。

技术层面,“世界模型+强化学习”的闭环进化模式成为主流,智源发布的通用具身大脑RoboBrain2.0与小脑基座RoboBrain-X0,实现跨场景多任务轻量化部署;海外Tesla Optimus 2.5已应用于工厂生产、农场运营等真实场景。

商业化方面,行业从实验室验证转向量产交付,智元、乐聚智能等企业推进上市进程,标志着具身智能从“技术演示”走向“产业工具”。

值得注意的是,具身智能的爆发离不开AI大模型的支撑。大模型赋予机器人自然语言交互能力与复杂任务规划能力,让机器人从“专用设备”升级为“通用助手”。

2026年,工业制造中的精密装配、服务业的个性化服务、医疗领域的辅助诊疗,将成为具身智能落地的核心场景,推动实体产业智能化转型进入深水区。

面对日益复杂的任务需求,单智能体的能力天花板逐渐显现,多智能体系统(MAS)成为解决复杂问题的关键路径。

不同于单智能体的独立工作模式,MAS通过智能体间的协作分工,实现“1+1>2”的认知升级,其逻辑契合“多样性预测定理”——足够多且独立的智能体协作,可使系统准确率逼近100%。

2026年,多智能体发展的核心突破是“协议标准化”。

MCP与A2A通信协议被捐赠给Linux基金会后实现分层融合,成为Microsoft、Google等巨头及LangChain、AutoGen等框架的原生支持协议,IBM计划将ACP协议并入A2A,推动行业标准统一。

这意味着,不同企业开发的智能体将拥有通用语言,能够跨平台协作完成复杂任务流。

应用层面,MAS正从科研领域向产业场景渗透。例如,金融领域的智能体团队可协同完成风险评估、投资分析、客户服务;工业场景中,生产智能体、质检智能体、物流智能体形成协作网络,优化全产业链效率。

ToC与ToB的价值兑现期来临

技术突破最终要通过应用落地实现价值闭环。2026年,AI应用将呈现“ToC超级应用竞逐+ToB垂直突破”的双轨格局,经历早期概念验证的“幻灭期”后,真正可衡量的商业价值将集中爆发。

“All in One”的超级应用成为C端AI竞争的核心战场。这种以单一入口实现信息获取、任务规划、问题解决的闭环模式,依托高算力成本与庞大用户数据迭代,正在重塑互联网流量格局。

海外,ChatGPT、Gemini日活过亿,Gemini已取代Google Maps原生语音助手,实现功能内化;国内,蚂蚁“灵光”AI助手上线6天下载量破200万,支持30秒生成小应用与全模态输出;字节豆包依托抖音生态引流,月活位居全球第二,仅次于 ChatGPT。

 

超级应用的竞争本质是生态整合能力的较量。

字节跳动凭借短视频流量优势,将AI助手深度融入内容创作、社交互动、生活服务场景;阿里以千问App为核心,整合消费、支付、物流等电商生态资源;蚂蚁集团则依托金融科技优势,让“灵光”助手具备理财咨询、生活缴费、政务办理等复合功能。

2026 年,超级应用将进入“生态闭环决战”阶段,能够实现跨场景无缝衔接、个性化精准服务的产品,将定义AI时代的“新BAT”格局。

与此同时,垂直赛道成为中小玩家的突围机会。多模态、大健康、教育等高ROI领域呈现“低频高价值”特征,Google Nano Banana Pro单次调用价格为文本模型的几十倍,但仅需1.5%调用量即可实现同等收入。

国内,蚂蚁“蚂蚁阿福”健康App聚焦慢病管理、健康咨询等场景;MiniMax的海螺AI深耕视频创作赛道,成为自媒体、设计师的必备工具;字节即梦AI在教育领域的个性化辅导功能,精准击中用户痛点。

 

这些垂直应用凭借高用户粘性与强付费意愿,正在构建可持续的盈利模式,成为C端AI商业化的重要补充。

2025年,95%的GenAI Pilot项目未产生可衡量影响,B端AI应用进入“幻灭低谷期”,核心症结集中在数据质量、系统集成、成本失控三大问题:46%企业将“现有系统集成”列为首要障碍,AI应用仍依赖手动操作ERP/CRM;多智能体的涌现行为失控、调试困难导致落地受阻;死循环通信、自我对话等问题造成高额成本损耗,曾有4个LangChain智能体11天消耗4.7万美元的案例。

但行业拐点已现,2026年下半年将迎来V型反转。随着数据治理工具的成熟与行业标准接口的统一,AI与企业现有系统的集成效率大幅提升,多智能体协议标准化解决了互操作性问题,算法优化与硬件升级降低了推理成本,让AI应用的ROI可量化、可追踪。

2026年,B端AI的落地将呈现三大特征:一是行业定制化深化,通用大模型通过微调适配特定场景,例如金融领域的风控模型、制造领域的质检模型;二是轻量化部署成为主流,边缘计算与模型压缩技术让中小企业无需高额算力投入即可享受AI服务;三是价值闭环明确,从“降本”向“增效”“创新”延伸。

 

繁荣背后的隐忧与破局之道

AI产业的爆发式增长,并未掩盖底层矛盾与潜在风险。盈利模式模糊、算力瓶颈、安全合规压力、人才缺口等问题,正在考验行业的可持续发展能力,也成为2026年AI企业必须突破的关键关卡。

智谱与MiniMax的上市招股书,揭开了AI企业的盈利难题。MiniMax三年累计亏损近13亿美元,C端业务依赖营销投放驱动增长,“高投入-高增长-低盈利”模式难以持续,用户留存困境导致营销效率低下。

智谱虽实现亿级收入,但仍未实现全面盈利,大模型研发的高额算力成本与人力成本,对现金流构成持续压力。

这并非个例,当前全球头部AI企业中,除少数企业通过生态协同实现盈利外,多数仍处于“投入大于产出”的阶段。

破局路径集中在三个方向。一是成本优化,通过MoE架构、混合注意力机制等技术创新提升模型效率;二是商业模式创新,B端企业从“一次性部署”转向“订阅制服务”,C端产品深化“免费+增值”模式,提升ARPU值;三是场景深耕,聚焦高价值垂直领域,例如AI制药等高毛利场景成为盈利突破口。

2026年,盈利能力将成为AI企业的核心竞争力,无法构建可持续盈利模式的企业,将在行业洗牌中被淘汰。

算力是AI产业的核心基础设施,2026年将迎来“需求爆发+格局重构”的双重变革。

随着生成式AI与智能体的大规模落地,推理算力需求首次超过训练算力。根据IDC发布的《全球人工智能算力发展白皮书》数据显示,2025年全球AI算力市场规模已突破60万亿元,预计到2026年底将达到120万亿元,正式迈入百万亿规模时代。

但当前算力格局仍受海外垄断,国内高阶AI芯片缺口明显,成为制约产业发展的关键瓶颈。

为突破算力困境,国内正从技术创新与生态建设双管齐下。

一方面,开源芯片架构成熟与国产AI芯片崛起,打破英伟达垄断,2026年中国高阶AI芯片本土份额有望接近 50%,中芯国际、华虹的BCD工艺产能利用率满载;

另一方面,国家层面加快“东数西算”工程建设,推动训练推理分离架构普及,这些举措共同推动算力成本持续下降,为AI普惠奠定基础。

AI技术的快速发展,让安全风险从“模型幻觉”升级为更隐蔽的“系统性欺骗”,深度伪造、模型投毒、数据泄露等问题频发。

据国际刑警组织数据,2025年全球深度伪造诈骗案件数量同比增长87%,涉案金额超30亿美元,安全合规成为企业落地的“生死线”。

2026年,传统网络安全防御体系已难以抵御AI原生攻击,行业正面临从“被动修补”到“原生免疫”的紧急转型,AI安全攻防正式进入“军备竞赛”新阶段。

技术层面,Anthropic的回路追踪研究致力于从内部理解模型机理,OpenAI推出自动化安全研究员,智源研究院联合国际顶尖机构发布全球首个AI欺骗系统性国际报告。

监管层面,欧盟《人工智能法案》已于2025年2月生效,中国出台生成式AI版权保护细则,全球形成差异化监管框架,要求企业公开训练数据清单、建立内容审核机制,合规成本成为企业必须承担的运营成本。

2026,AI成为社会基础设施的元年

站在2026年的时间节点回望,AI产业已完成从“技术概念”到“社会基础设施”的蜕变。

智谱与 MiniMax 的上市,标志着资本对 AI 价值的认可;智源十大趋势的落地,展现了技术从 “实验室” 到 “产业界” 的跨越;ToC与ToB应用的爆发,让AI深度融入日常生活与生产经营。

2026年,AI将实现从“认知”到“创造”的跨越,AI+新能源、AI+医疗、AI+制造等跨界融合深化,推动实体经济高质量发展,重塑就业结构与生活方式,新岗位不断涌现,智能化服务覆盖各个角落。

但AI的发展并非坦途,盈利模式的探索、安全风险的防控、伦理边界的界定,仍需要行业、政府、社会的共同努力。

正如智源研究院理事长黄铁军所言,AI的发展要重视“结构决定功能,功能塑造结构”的相互作用,只有让技术发展与社会需求同频共振,才能推动AI稳健迈向价值兑现的新阶段。

2026年,既是AI产业的价值爆发年,也是行业规范的奠基年。当资本的热度褪去、技术的泡沫消散,真正能够解决社会痛点、创造实际价值的AI企业,将在时代浪潮中脱颖而出。

而我们每个人,既是这场智能革命的见证者,也是参与者和受益者,AI与人类的共生共荣,正在开启新的篇章。

【关于科技云报道】

专注于原创的企业级内容行家——科技云报道。成立于2015年,是前沿企业级IT领域Top10媒体。获工信部权威认可,可信云、数博会、国家网安周与全球云计算等大型活动的官方指定传播媒体之一。深入原创报道云计算、人工智能、大模型、网络安全、大数据、区块链等企业级科技领域。