在上一篇 Flink SQL 极简入门 中,我们体验了 Flink SQL 的基础用法。但在流处理中,最核心、最迷人(也最让人头秃)的概念莫过于“时间”“窗口(Window)”

你可能经常听到这样的业务需求:

  • “每 5 分钟统计一次订单总量”
  • “实时统计过去 1 小时内的热门商品,每 10 秒更新一次”
  • “每天 0 点到当前时刻的累计 PV”

这些需求都离不开窗口。今天,我们就来深入 Flink SQL 的窗口机制,看看它是如何驯服无限数据流的。

什么是窗口 (Window)?

流数据(Stream)是无限的,像水流一样源源不断。我们无法计算“无限流”的总和(因为永远算不完)。为了计算,我们需要把无限的流“切”成有限的块,这个“切”的操作就是开窗(Windowing)

在 Flink SQL 中,窗口主要用于将时间序列上的数据分桶,然后在桶内进行聚合计算(如 SUM, COUNT, AVG)。

新一代标准:Window TVF

在 Flink 1.13 之前,我们主要使用 GROUP WINDOW(如 TUMBLE(rowtime, ...) 在 GROUP BY 子句中)。但从 Flink 1.13 开始,官方推荐使用 Window TVF (Table-Valued Functions)

Window TVF 符合 SQL 2016 标准,语法更自然,功能更强大(支持 TopN、去重等复杂操作)。本文将以 Window TVF 为主进行讲解。

核心语法结构通常如下:

SELECT window_start, window_end, SUM(price)
FROM TABLE(
    -- 窗口函数
    TUMBLE(TABLE my_table, DESCRIPTOR(ts), INTERVAL '5' MINUTE)
)
GROUP BY window_start, window_end;

三大核心窗口类型

1. 滚动窗口 (Tumble Window)

特点:窗口大小固定,窗口之间不重叠,首尾相接。
场景:每隔 5 分钟统计一次。

Tumble Window

语法
TUMBLE(TABLE data, DESCRIPTOR(time_col), INTERVAL '10' MINUTE)

2. 滑动窗口 (Hop Window)

特点:窗口大小固定,但窗口之间可以重叠。它有两个参数:

  1. Window Size (窗口大小):统计多长时间的数据(如“过去 1 小时”)。
  2. Window Slide (滑动步长):多久更新一次结果(如“每 5 分钟”)。

场景:每 5 分钟,统计过去 1 小时的 PV。

Hop Window

语法
HOP(TABLE data, DESCRIPTOR(time_col), INTERVAL '5' MINUTE, INTERVAL '1' HOUR)
注意:参数顺序是先 Slide (步长),后 Size (大小)。

3. 累积窗口 (Cumulate Window)

特点:这是 Flink 特有的窗口,用于解决“每天 0 点至今的累计值”这类需求。它会按步长输出一个个不断变大的窗口,直到达到最大窗口大小。

场景:每天的实时累计销售额(每 10 分钟更新一次看到当天的累计值)。

Cumulate Window

语法
CUMULATE(TABLE data, DESCRIPTOR(time_col), INTERVAL '10' MINUTE, INTERVAL '1' DAY)


实战:处理“过去 5 分钟的订单总额”

让我们回到开头的经典需求。假设我们有一个订单流 orders

0. 准备数据环境

首先,我们启动 SQL Client

./bin/sql-client.sh

创建一个模拟的订单源表(使用 DataGen 连接器):

CREATE TABLE orders (
    order_id INT,
    price DOUBLE,
    order_time TIMESTAMP(3),
    -- 定义水位线,基于 order_time,延迟 0 秒
    WATERMARK FOR order_time AS order_time - INTERVAL '0' SECOND
) WITH (
    'connector' = 'datagen',
    'rows-per-second' = '1',
    'fields.price.min' = '10',
    'fields.price.max' = '100'
);

需求一:每 5 分钟,统计该 5 分钟内的订单总额

这是一个典型的滚动窗口 (Tumble)。比如 12:00-12:05 一个结果,12:05-12:10 一个结果。

SELECT 
    window_start, 
    window_end, 
    COUNT(*) as total_orders, 
    SUM(price) as total_amount
FROM TABLE(
    TUMBLE(TABLE orders, DESCRIPTOR(order_time), INTERVAL '5' MINUTE)
)
GROUP BY window_start, window_end;

运行结果示例
5分钟内订单总额

需求二:实时统计“过去 5 分钟”的订单总额,每 1 分钟更新一次

这是一个典型的滑动窗口 (Hop)

  • 窗口大小:5 分钟
  • 滑动步长:1 分钟

这样,12:00 输出 [11:55, 12:00] 的数据;12:01 输出 [11:56, 12:01] 的数据。

SELECT 
    window_start, 
    window_end, 
    SUM(price) as total_amount
FROM TABLE(
    HOP(TABLE orders, DESCRIPTOR(order_time), INTERVAL '1' MINUTE, INTERVAL '5' MINUTE)
)
GROUP BY window_start, window_end;

运行结果示例
过去5分钟订单总额

注意
HOP 函数的参数中,第一个时间是滑动步长 (Slide)第二个时间是窗口大小 (Size)。千万别搞反了!
INTERVAL '1' MINUTE = Slide (更新频率)
INTERVAL '5' MINUTE = Size (统计范围)

总结

Flink SQL 的 Window TVF 极大地简化了窗口聚合的写法。

  • TUMBLE: 规规矩矩,互不干扰(分批统计)。
  • HOP: 藕断丝连,频繁更新(移动平均/最近 N 分钟)。
  • CUMULATE: 聚沙成塔,越积越多(日报/大屏累计)。

掌握了这三种窗口,你就能覆盖 90% 的实时统计需求了。

下一篇,我们将挑战更复杂的场景:双流 JOIN,看看当“订单流”遇到“用户流”,Flink 该如何处理?


原文来自

22 年底 chatgpt 刚出来的时候,我就用上了,但是一直到上个月,我都把 github copilot 当成 AI 的标准用法,就是你给他一些提示词,他给你写成代码,整体的架构和数据还是要程序员自己设计的,相当于司机还是自己,但是载具已经由马车变成了汽车。

后来看油管有人介绍后用了 RooCode ,WCAO 直接惊掉下巴,很复杂的 C++项目,直接对他说产品经理要什么 feature ,不到两三分钟就把项目完成了,编译出现几个小错误,改了一改编译通过,成品稍有瑕疵,让 AI 重新调整一下,基本上就可以交付了。

写的代码质量比我高,一些错误的处理都是在我预估的范围之外的,它都能考虑到。即使有一些没考虑周全,但对于这个 feature 它只花了不到 3 刀,对公司来说肯定比我便宜多了。

以前时候认为为了更好的在公司发展,除了技术外,理解业务代码也很重要。现在 AI 直接把我对工作的理解给冲掉了。我在想如果我是老板,我只需要雇佣我加一个 AI ,就可以有三个我的工作量。不必说 AI 不能担责任,员工才能担责任之类的话,只要让驾驭 AI 的那个人担责任即可,就好像小组长对上面要担着组员做错事的责任一样。

AI 是软件和算法工程的人搞出来的,所以 AI 在软件开发的领域做得非常好。之前我是觉得 AI 只能应付下力扣刷题,现在真切感觉到 AI 能替代自己工作的七七八八了。不知道其他人有没有同感,现在招聘都已经不用做题了

例如 如何保证店子换的机油,刹车油,变速箱油是否是指定品牌,是否更换了?
现在不接受预约,不让线上下单,不让用券. 主要联系了线下的途虎,京东门店(老修车铺子合作挂牌加盟那种)

用车少,每次都是按公里时间要求计划保养套餐.
但是每次去做保养总能检测出很多计划外项目,总超出预算.
我也没那么多时间在那守着,守着看着也不太懂. 总有一种不太透明的感觉.

也许是我多想了,想问下大家有没有好的方法提升体验..或者懂行的介绍介绍.
像 15w 左右的家用代步车 小保(机油机滤),大保(机油机滤 刹车油 变速箱油)多少算合理

在做IT架构规划时,很多团队都会面临一个核心选择题:到底该用本地服务器,还是走云部署路线?其实这两种方式没有绝对的好坏,关键要看你的业务特性、团队配置和长期规划。

先说说成本结构。本地服务器一般前期投入比较大,包括硬件采购、机房改造这些一次性支出,不过后面每年的运维成本相对可控。而云服务基本是“开箱即用”,起步门槛低,但随着业务规模扩大,月度或年度的费用会逐步上升,长期来看未必更省。

性能方面,本地服务器由于资源独享,通常延迟更低、稳定性也更可控,特别适合对实时性要求高的场景。不过云服务的弹性都是实打实的优势——流量突增时能快速扩容,高峰期过了又能及时缩容,资源利用率更高。

数据安全是很多人关心的话题。本地部署等于把所有数据都握在自己手里,权限管控更直接,适合金融、医疗这类强监管行业。而现在的云服务商在安全上的投入也越来越大,像加密传输、漏洞防护、跨区域容灾这些能力,可能比很多企业自建的水平还要专业。

运维管理上的差异也很明显。本地服务器需要配备专门的IT团队做日常维护,出了问题也得自己排查,技术门槛不低。云服务就省心不少,大部分运维工作都由平台承担,团队可以更专注于业务开发,对技术人员配置要求也没那么高。

那到底该怎么选呢?如果你对数据管控、性能稳定性有强要求,而且有专门的运维团队,本地部署可能更踏实。如果你的业务波动大、增长快,或者希望降低运维复杂度,那云服务的灵活性和便捷性会更合适。

其实现在很多企业都在采用混合架构——核心系统放在本地,弹性业务上云,两边优势互补。不管选哪种方案,找个靠谱的IDC服务商都很重要。毕竟从方案设计到后期运维,专业的团队能帮你避开不少坑,让整个系统跑得更稳更省心。

去年在支付宝上买的半年(¥340), 半年用下来感觉速度是满足我了的, 但支付宝上已经下架相关业务了, 最近宽带快到期了, 给当时给我安猫的师傅打电话问了一下, 续费一年¥600

随着生成式 AI 工具逐步走向主流,Gemini 已经成为许多开发者、研究人员以及内容创作者日常工作的一部分。然而,在真实使用过程中,不少用户会发现,Gemini 的访问体验并非始终稳定。页面加载失败、功能不可用、验证反复触发,甚至在不同网络环境下表现差异明显,这些问题的背后,往往并不只是产品本身的限制,而是与网络出口的可信度密切相关。

Gemini 对网络环境的隐性要求

从表面来看,Gemini 只是一个面向用户开放的 AI 服务,但在底层,它运行在一套高度自动化的风控体系之中。系统并不会单纯依赖账号信息来判断请求是否可信,而是会综合分析访问来源的网络类型、地理位置、IP 历史行为以及整体使用模式。
当访问请求来自数据中心、云服务器或被频繁滥用的代理网络时,即便账号本身没有问题,也更容易触发限制机制。这类限制并不总是以“封禁”的形式出现,而是通过降低响应稳定性、限制功能可用性等方式逐步体现出来。
也正因为这种“软性风控”的存在,很多用户会误以为是 Gemini 本身不稳定,而忽略了网络出口这一核心变量。

普通代理在 Gemini 场景中的局限性

在尝试优化访问体验时,一部分用户会首先想到使用代理工具。然而,普通代理往往难以满足 Gemini 对网络真实性的隐性要求。这类代理通常集中部署在有限的 IP 段中,出口特征明显,使用行为高度重复。
在短时间内,这种代理或许可以完成连接,但随着请求频率增加,系统很容易识别出异常模式。一旦 IP 被标记,后续访问即使切换账号,也难以恢复到理想状态。这也是为什么频繁更换代理并不能真正解决问题,反而可能进一步降低整体成功率。
真正有效的方案,并不在于“绕过检测”,而在于让访问行为本身更接近真实用户。

住宅代理如何改变 Gemini 的访问体验

住宅代理的核心价值,在于其 IP 来源于真实家庭网络环境。与服务器代理相比,这类 IP 在网络路径、自治系统归属以及历史行为上,更符合普通用户的访问特征。
当 Gemini 接收到来自住宅网络的请求时,其风控系统更倾向于将其视为正常使用,而非潜在风险。这种差异并不会在界面上直接体现,却会反映在连接稳定性、响应速度以及功能完整性上。
尤其是在需要长期使用 Gemini、频繁进行交互或调用相关功能的场景中,住宅代理所带来的稳定性优势会逐渐显现。

网络身份连续性的重要性

在 Gemini 的使用过程中,另一个经常被忽视的因素,是网络身份的连续性。系统不仅关注单次请求是否异常,也会观察一段时间内访问行为是否具备连贯性。
如果用户频繁切换 IP,或者在不同地区之间跳跃,反而容易形成不自然的使用轨迹。这种情况下,即便每一个 IP 本身质量尚可,整体行为模式仍然可能触发风控关注。
高质量住宅代理的优势之一,正是在于能够在同一地区内提供足够自然的 IP 分布,使用户在需要更换出口时,依然保持网络身份的一致性。这种连续性,对于 Gemini 这类长期服务型平台尤为重要。

真实使用中对代理质量的要求

并非所有住宅代理都能带来理想效果。IP 池规模、地区覆盖深度以及匿名配置水平,都会直接影响 Gemini 的访问体验。如果住宅 IP 被过度共享,或者在协议层暴露中转特征,其效果与普通代理并无本质区别。
在这一点上,IPPeak 的住宅代理架构更强调“真实分布”而非简单数量。其 IP 来源覆盖多个核心国家和地区,并保持足够分散的使用密度,使单一出口不容易形成异常使用模式。在实际应用中,这种结构有助于提高 Gemini 访问的整体成功率,并减少因网络问题导致的中断。
需要强调的是,这种稳定性并非依赖激进策略,而是建立在更符合平台预期的网络表现之上。

从技术工具到长期使用策略的转变

当用户真正将 Gemini 视为长期工具时,对网络环境的要求也会随之发生变化。短期测试阶段,网络问题或许尚可接受,但在持续使用过程中,任何不稳定因素都会被放大。
通过住宅代理构建更可信的网络身份,本质上是在为长期使用打基础。这种策略并不是为了对抗平台规则,而是通过更自然的方式,减少不必要的干扰,让技术工具回归其应有的价值。

重新理解 Gemini 与网络出口的关系

Gemini 的体验好坏,很大程度上并不取决于使用技巧,而取决于访问环境是否稳定、可信。当网络出口与普通用户高度一致时,系统的反馈也会更加友好。
在这一背景下,住宅代理不再只是一个“辅助工具”,而是连接用户与 AI 服务之间的重要桥梁。理解这一点,往往是许多用户在经历反复尝试后才逐渐形成的共识。

Rspack是一个基于Rust的、旨在替代webpack的高性能 Web 打包工具。Rspack 1.7 版本发布,这是在项目过渡到 2.0 版本之前,1.x 系列的最后一个小版本。该版本专注于提升现有功能的稳定性和插件的兼容性。

 

Rspack 1.7 引入了多项增强稳定性的改进,包括:增强SWC插件兼容性原生支持以字节形式导入资源,以及固化多项实验性功能。对于 Web 应用中动态导入的模块,该版本还引入了默认启用的懒编译。

 

Rspack 1.7 的一个新特性是改进 SWC 插件兼容性。在以前的版本中,由于 AST 结构不断演变,SWC Wasm 插件面临着高昂的升级成本,使得现有插件在 SWC 升级后会出现问题。为此,Rspack 团队向SWC社区贡献了兼容性改进,包括采用cbor序列化方案来替代版本敏感的rkyv,并在 AST 中引入了用于枚举类型的 Unknown 变体,以提高容错性。从 Rspack 1.7 开始,SWC 升级不大可能再破坏之前使用旧版本 SWC 构建的插件了。

 

Rspack 现在原生支持Import Bytes提案,即以字节形式导入资源。开发者可以用 Uint8Array 导入资源,并使用 TextDecoder 进行解码,语法如下:

 

import fileBytes from './file.bin' with { type: 'bytes' };const decoder = new TextDecoder('utf-8');const text = decoder.decode(fileBytes);
复制代码

 

从 Rspack 1.7 开始,在构建 Web 应用时,Rspack CLI 针对动态导入模块默认启用懒编译。这一变化减少了初始构建中的模块数量,加快了开发服务器的启动速度。有特殊需求的开发者可以通过将 lazyCompilation 设置为 false 来显式地禁用这个功能。

 

这个版本中,有几项实验性功能已经被固化。常量内联优化现在已经稳定,并且在生产构建中默认启用,原来的 experiments.inlineConst 选项被 optimization.inlineExports 所取代。TypeScript 枚举内联优化和类型 re-export 检查也已去掉了实验性标志,达到稳定状态。

 

迁移到 Rspack 1.7 时需要注意下 SWC 插件的版本。使用 SWC Wasm 插件的项目必须升级插件,以兼容 swc_core 54 或以上版本,以避免构建失败。在他们的FAQ文档中,Rspack 团队提供了处理 SWC 插件版本不匹配问题的指南。

 

Rspack 的定位是兼容webpack的替代方案,其构建速度明显更快。根据Medium上一位用户的记录,从 webpack 迁移到 Rspack 后,构建时间减少了 70%,本地构建时间从 1.7 分钟降低到 30 秒。另一个来自 Mews 的团队报告说,启动时间从三分钟减少到十秒,提高了 80%。然而,Rolldown项目的基准测试显示,尽管 Rspack 的性能优于 webpack,但它仍然比 esbuild 和 Rolldown 等工具慢。

 

这个版本还为更广泛的 Rstack 生态系统带来了更新:Rsbuild 1.7 引入了运行时错误覆盖和资源大小差异报告;Rsdoctor 1.4 新增用于包分析的树状图视图;Rslib 0.19 稳定了打包模式中的 ESM 输出。

 

Rspack 是一个由字节跳动开发的开源项目。该工具旨在提供与 webpack 相当的 API 兼容性,同时借助 Rust 语言实现性能提升。如果既不想脱离 webpack 生态系统,又想加速构建流程,那么这个工具很合适。

原文链接:

https://www.infoq.com/news/2026/01/rspack-final-rust/

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 集成网迅网卡驱动定制版

VMware ESXi 9.0 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

发布 ESXi 9.0 集成驱动版,在个人电脑上运行企业级工作负载

请访问原文链接:https://sysin.org/blog/vmware-esxi-9-sysin/ 查看最新版。原创作品,转载请保留出处。

作者主页:sysin.org


2026-01-12,应用户要求,更新集成网迅网卡驱动定制版。

发布 ESXi 9.0 集成驱动版,在个人电脑上运行企业级工作负载,构建开发、测试和学习的最佳平台。

vSphere Workloads Everywhere

通用特性概览

该版本在官方原版基础上新增以下特性:

  • macOS Unlocker:来自 GitHub 的 Unlocker 4,现已支持 macOS Tahoe
  • OEM BIOS 2.7:使用社区最流行的 OEM BIOS/EFI64,现已支持 Windows Server 2025
  • LegacyCPU support,允许在不受支持的旧款 CPU 上安装 ESXi 9.0
  • ESX-OSData 卷大小修改为 8GB,解决自 ESXi 7.0 起系统占用磁盘空间过大的问题(超过 142GB)
  • 有限支持采用混合架构的第 12 代及以上 Intel 处理器,可实现正常引导和运行
  • 中文界面语言支持,在 ESXi 9.0 的 Host Client 中继续支持简体中文界面语言,包括繁体中文

详情请访问原文链接:https://sysin.org/blog/vmware-esxi-9-sysin/ 查看。

集成网迅网卡驱动定制版

NETSWIFT

北京网迅科技有限公司是一家专门从事集成电路高端芯片设计、提供网络产品解决方案的高科技企业。公司成立于 2014 年 5 月,总部位于北京市海淀区玉泉慧谷科技园区,在浙江杭州设有分公司。

公司成功研制了自有知识产权的万兆和千兆以太网控制器芯片、适配器,突破了一系列计算机网络领域高端芯片设计的难题,在网络安全和网络虚拟化等方面达到了较高水平。

网迅网卡不仅兼容 Windows 系统和主流的 Linux 发行版,还可以支持最新的 VMware ESXi 系统,远超预期!

以下是经过验证支持最新版 ESXi 的网讯网卡型号。

Brand NameModelVendorIDDeviceIDSVIDSSID
Wangxun/NETSWIFTFF5025-DDATACXX8088502580881000
Wangxun/NETSWIFTFF5025-DDATAIXX8088512580883000
Wangxun/NETSWIFTFF5040-DDBTACXX8088504000000000
Wangxun/NETSWIFTFF5040-DDBTAIXX8088514080883000
Wangxun/NETSWIFTRP1000 series8088100100000000
Wangxun/NETSWIFTRP2000 series8088200100000000
Wangxun/NETSWIFTWX1860A28088010100000000
Wangxun/NETSWIFTWX1860A48088010300000000
Wangxun/NETSWIFTWX1860A4S8088010400000000
Wangxun/NETSWIFTWX1860AL28088010500000000
Wangxun/NETSWIFTWX1860AL2S8088010600000000
Wangxun/NETSWIFTWX1860AL48088010700000000
Wangxun/NETSWIFTWX1860AL4S8088010800000000
ZTE CorporationNO127808801031cf20801
ZTE CorporationNO127D808801011cf20802

下载地址

ESXi 9.0.1.0 集成驱动版 (2026-01-12)


标准版和厂商定制版,请访问:

官方原版,请访问:

上一个版本,请访问:

更多:VMware 产品下载汇总

优步的工程师介绍了他们如何将分布式存储平台从静态限流演进为优先级感知的负载管理系统,以保护其内部数据库。这一改进解决了大型有状态多租户系统中基于 QPS 限流的局限性,那就是这种限流方式无法反映真实负载、难以处理 “噪音邻居” 问题,也无法保障尾部延迟。

 

该设计保护了基于 MySQL 构建的DocstoreSchemaless存储系统,这些系统通过数千个微服务为超 1.7 亿月活用户(包括乘客、Uber Eats 用户、司机和配送员)提供服务。通过优先保障关键流量并动态适应系统状态,该系统可防止级联过载,在大规模场景下维持性能稳定。

 

优步的工程师指出,早期基于配额的方案依赖集中式跟踪的静态限制,它的效果不佳。无状态路由层无法及时感知分区级负载,且相似大小的请求会产生不同的 CPU、内存或 I/O 开销。运维人员需要频繁调整限流阈值,有时会误删健康流量,而过载分区却没有得到保护。

 

正如优步的工程师Dhyanam V.LinkedIn帖子中所述:

有状态数据库的过载保护是大规模场景下的多维度问题。

 

为了解决这个问题,优步将负载管理与有状态存储节点协同部署,结合了受控延迟(Controlled Delay,CoDel)队列和租户级记分卡(Scorecard)。CoDel 基于延迟调整队列行为,记分卡则强制实施并发限制,同时使用额外的调节器监控 I/O、内存、goroutine 和热点数据。CoDel 对所有请求一视同仁,会同时丢弃低优先级和面向用户的流量,导致 on-call 负载增加、用户体验受损,并且依赖固定队列超时和静态的 in-flight 限制,可能引发惊群效应重试,甚至丢弃高优先级请求。尽管它能防止灾难性故障,但缺乏维持稳定性能所需的动态性和精细化能力,凸显了优先级感知队列的必要性。

使用 CoDel 队列的负载管理器设置(来源:优步博客文章

 

后续演进引入了Cinnamon,这是一款优先级感知的负载 shedder 系统,能够将请求分配到分级队列,优先丢弃低优先级流量,避免影响延迟敏感的操作。Cinnamon 基于高百分位延迟指标动态调整 in-flight 中请求限制和队列超时,减少对静态阈值的依赖,在过载时实现更平滑的降级。

使用 Cinnamon 队列的负载管理器设置(来源:优步博客文章

 

优步后续通过“自带信号(Bring Your Own Signal)”模型,将本地和分布式过载信号统一到单一的模块化控制回路中。该架构允许团队将节点级指标(如 in-flight 中的并发数、内存压力)和集群级信号(比如,从节点的提交延迟)接入集中式的准入控制路径。整合这些信号消除了碎片化的控制逻辑,避免了早期基于令牌桶系统中出现的冲突性负载 shedding 决策。

 

据优步介绍,改进效果非常显著,过载场景下吞吐量提升约 80%,upsert 操作的 P99 延迟降低约 70%;goroutine 数量减少约 93%,峰值堆内存使用降低约 60%,整体效率得到了提升,同时缓解了运维的负担。

 

优步总结了负载管理演进的核心经验,那就是优先保障关键用户流量,先丢弃低优先级请求;尽早拒绝请求以维持可预测延迟、降低内存压力;使用基于 PID 的调节确保稳定性;将控制逻辑部署在数据源附近;动态适应工作负载;保持可观测性;优先采用简单设计,确保压力下的稳定可靠运行。

 

原文链接:

Uber Moves from Static Limits to Priority-Aware Load Control for Distributed Storage

微软和 GitHub 扩展了 Copilot 生态系统,推出了首个专注于.NET的GitHub Copilot自定义代理,旨在提高 C#和 Windows Forms 开发者的生产力和代码质量。作为更广泛的 Copilot 自定义代理发布计划的一部分,本次公告推出了两款专属代理:C#专家与 WinForms 专家,它们以代理指令 Markdown 文件的形式提供。

 

C#专家代理旨在引导并强制执行现代 C#最佳实践。它尊重项目约定,最小化不必要的代码工件,如未使用的接口或参数,并强调 async/await 模式要带有适当的取消和异常处理。它还支持行为驱动和集成测试工作流,帮助开发者编写更干净、更易于维护的代码。

 

WinForms专家代理专注于使用 Windows Forms 进行传统的桌面 UI 开发。对于常见的 UI 设计模式(如 MVVM 和 MVP),它拥有专业的知识,能够协助处理复杂的事件连接(event wiring)和状态管理,并能够增加保护措施,防止 Copilot 无意中修改.Designer.cs 文件,对 Visual Studio 设计器造成破坏。对于使用生成工具的开发者来说,这种保护解决了一直以来开发者经常遇到的一个痛点。

 

要使用这些代理,开发者需要从GitHub awesome-copilot存储库下载 CSharpExpert.agent.md 和 WinFormsExpert.agent.md 文件,并将它们放在项目的.github/agents 文件夹下。配置文件放置到位以后,在通过 GitHub 将问题分配给 Copilot 时就可以实现上下文感知行为,开发者可以在 Visual Studio Code Insiders 或 Visual Studio 的实验版本中通过下拉菜单选择代理。Copilot CLI 计划在未来的更新中支持/agent 命令。

 

微软将这两个代理都描述为实验性的,因为他们正在收集模型对详细指令的响应反馈。自 11 月以来,在开发者打开“启用特定于项目的.NET 指导”这一功能时,Visual Studio 2022 Insiders 17.14.21 版本可以自动将相关的自定义代理附加到项目,例如为 Windows Forms 开发量身定制的指令。

 

早期的社交媒体评论,尤其是 LinkedIn 平台上的讨论,反映出人们对该自定义代理发布公告的热情与专业关注。有评论者强调,通过减少生成未使用的代码,可有效缓解“AI引发的技术债务”问题。他还指出,WinForms Expert 提供的设计器文件保护机制,对遗留用户界面的维护与现代化改造显然是有实际好处的。

 

相比之下,Copilot 自定义代理所采用的是一种更具结构化和持久性的 AI 辅助方式,与早期的 Copilot 聊天模式或无上下文的建议引擎有着本质的不同。传统聊天模式提供的是按需帮助,而自定义代理则依据预定义的专业知识和行为特征在特定的存储库上下文中运行。这使得 Copilot 更符合新兴的基于代理的开发体验,其中工具充当具有特定领域知识的合作伙伴,而非通用的助手。

 

目前,自定义代理服务于.NET 开发中小众但影响力大的场景。其实验性状态和不断演变的工具支持表明,在扩大覆盖范围或在更广泛的 Copilot 体验中标准化工作流之前,微软正在密切倾听开发者的反馈。

原文链接:

https://www.infoq.com/news/2026/01/copilot-agents-csharp-winforms/

最近在用 HodlAI 的 Claude 模型跑 OpenClaw (一个 AI agent 框架),发现默认情况下 prompt cache 不生效,研究了一下原因和解决方案,分享给有需要的朋友。

背景

HodlAI 的 API 兼容 OpenAI Chat Completions 格式,支持 Anthropic 的 prompt caching 机制——需要在 messages 中对 content block 加上 cache_control: {"type": "ephemeral"} 标记。

但 OpenClaw 底层( pi-ai 库)的 maybeAddOpenRouterAnthropicCacheControl 函数默认只对 OpenRouter 的 anthropic/* 模型注入 cache_control,自定义 provider 的 Claude 模型不会走这个逻辑,导致 cache 完全不生效。

解决方案:改一行代码

文件路径:

node_modules/@mariozechner/pi-ai/dist/providers/openai-completions.js

找到 maybeAddOpenRouterAnthropicCacheControl 函数,原始代码:

function maybeAddOpenRouterAnthropicCacheControl(model, messages) {
    if (model.provider !== "openrouter" || !model.id.startsWith("anthropic/"))
        return;

改为:

function maybeAddOpenRouterAnthropicCacheControl(model, messages) {
    const isOpenRouter = model.provider === "openrouter" && model.id.startsWith("anthropic/");
    const isClaudeOnCustomProvider = model.id.toLowerCase().includes("claude");
    if (!isOpenRouter && !isClaudeOnCustomProvider)
        return;

这样只要 model ID 包含 "claude"(不区分大小写),就会自动注入 cache_control

⚠️ 注意:OpenClaw 更新或 npm update 后会覆盖这个改动,需要重新打 patch 。

测试结果

改完后实测各模型缓存情况:

模型 Cache 命中 计费是否正常
Claude Sonnet 4.5 ✅ 正常(降约 91%)
Claude Opus 4.5 ✅ 正常(降约 91%)
Claude Opus 4.6 ✅ 后台显示命中 ❌ 仍按全量计费
Claude Opus 4-6 ✅ 后台显示命中 ❌ 仍按全量计费

Sonnet 4.5 和 Opus 4.5 缓存命中后费用从 ~$0.035 降到 ~$0.003 ( 9k tokens 测试),效果很明显。

Opus 4.6 和 Opus 4-6 虽然后台日志显示 cache 命中了,实际扣费还是按全量计算,感觉是 HodlAI 后端对这两个新模型的 cached token 计价还没适配好。

总结

  1. HodlAI Claude 模型 支持 prompt cache,但仅限 Chat Completions API + 显式 cache_control 标记
  2. OpenClaw 用户需要手动 patch 一行代码让 cache 注入生效
  3. Sonnet 4.5 / Opus 4.5 计费正常,cache 能省约 90% 费用
  4. Opus 4.6 / Opus 4-6 计费疑似有 bug ,希望官方看一下 🙏 @88AI

有用同样方案的朋友可以试试,省不少钱。

93 年 typescript c#都写
过往工作均大厂经历 现在北京一外企工作..
Base 45K. 股票若干. 工作强度适中

日语完全不会 英语 IELTS 5.5

一直想通过《高度人才计划》拿永驻.
想去日本找份 600-700w 日元年收的工作 (大于 600w 是为了加分,不为了在日本挣钱..)
学历本科计算机,又读了个国内的 MBA (为了加分),考了软考的两个证(又凑了 10 分)

现在分基本上凑够了 就是要找工作了
因为语言问题只能找中文工作环境
但因为中文工作环境又会卷+不稳定

死锁了...感觉要生生世世种花家了

写在前面

在 AI 从 “云端集中式” 向 “端侧分布式” 演进的今天,用户对智能体验的需求早已从 “能用” 升级为 “安全、实时、无界”,而 HarmonyOS 凭借原生的端侧 AI 能力与分布式架构,恰好击中了这一行业痛点。不同于依赖云端算力的传统 AI 方案,HarmonyOS 的 AI 套件构建在 “本地计算 + 毫秒响应 + 模型复用” 三大核心优势之上:端侧推理让用户数据全程留在设备内,完美解决了 AI 应用的隐私焦虑;毫秒级的响应速度,让语音交互、实时识别等场景告别 “加载等待”;而系统级的模型复用机制,更是让开发者无需从头训练模型,仅通过标准化接口就能调用成熟的智能能力。那么本文就来以HarmonyOS开发中关于AI套件的技能调用功能的使用来详细聊聊,深入解析如何通过系统级AI接口、分布式协同框架与模型优化工具链,实现高效智能业务开发。

技能调用:端侧 AI 与应用的智能联动机制

技能调用是意图框架依托系统AI多模态大模型能力做深度用户输入理解,并通过解析的用户意图对接应用或元服务内的功能和内容。技能调用的本质,是 HarmonyOS 意图框架借助系统级多模态大模型,对用户输入(语音、文本、图像等)进行深度语义解析,进而关联应用 / 元服务内功能与内容的智能联动机制。它的核心价值,是让用户通过自然语言即可直接触发复杂功能,无需逐层点击界面,实现 “说即所得” 的智能交互。

核心应用场景拆解

使用者通过对小艺对话进行自然语言输入实现内容查询,知识问答,以及通过对图片选定识别问答进行服务获取。技能调用场景分为两种:

  • 功能服务类:端侧意图调用直接进入应用或元服务对应意图功能服务页面。
  • 信息交互类:云侧意图调用进行内容查询后展示,端侧用户点击进行意图调用闭环。
    典型的使用场景分为:功能服务类和信息交互类两种场景。

    1、信息交互类

    信息交互类的场景分为三种情况,具体如下所示:

  • 内容展示场景。例如查找菜谱:语音对话输入“鱼香肉丝怎么做”,即可搜索到对应的菜谱。
  • 内容展示+AIGC生成场景。例如查公司:语音对话输入“某公司怎么样”,即可生成并展示关于某公司的信息。
  • 功能履约场景。例如订电影票:语音对话输入“买两张今天的电影票,某电影”,即可进行电影票购买选座。

    2、功能服务类

    功能服务类的场景也分为三种情况,具体如下所示:

  • 跳转页面不带参数场景。例如打开付款码:语音对话输入“打开xx付款码”,即可弹窗对应付款码。
  • 跳转页面带参数场景。例如搜索商品带关键词:语音对话输入“打开xx应用搜一下xx品牌39码”,即可弹窗对应商品。
  • 功能执行并展示UIExtension。例如操控蓝牙开关:语音对话输入“打开蓝牙”,即可弹窗蓝牙设置,并打开蓝牙开关。

    技能调用接入全流程

    1、接入方案概述

    关于使用接入方案的概述,开发者需要按照意图定义,进行意图注册并实现意图调用;用户通过对小艺对话进行自然语言输入,小艺理解语义转换成意图调用(含意图参数),执行意图调用实现对应交互体验。HarmonyOS AI 套件的技能调用遵循 “意图定义→意图注册→意图执行” 的标准化流程,具体流程图如下所示:
    image.png

    2、意图注册

    这里以“搜索旅游攻略”特性为例,使用者需要首先注册“查看旅游攻略”(ViewTravelGuides)。开发者需要编辑对应的意图配置PROJECT_HOME/entry/src/main/resources/base/profile/insight_intent.json文件,实现意图注册,具体操作如下所示:

{
  "insightIntents": [
    {
      "intentName": "ViewTravelGuides",
      "domain": "TravelDomain",
      "intentVersion": "1.0.1",
      "srcEntry": "./ets/entryability/InsightIntentExecutorImpl.ets",
      "uiAbility": {
        "ability": "EntryAbility",
        "executeMode": [
          "background",
          "foreground"
        ]
      },
      "uiExtension": {
        "ability": "insightIntentUIExtensionAbility"
      }
    }
  ]
}

其中,配置参数信息如下所示:
image.png

技能调用实战:两类核心意图触发

根据上面的接入方案,这里通过前台意图和前台窗口意图两个调用来介绍具体的使用。

1、前台 UIAbility 意图调用实践

具体的使用的时候,需要开发者自己实现InsightIntentExecutor,并在对应回调实现打开详细页(点击推荐卡片跳转的界面,如旅游攻略详细页面)的能力,ViewTravelGuides的意图调用字段定义见查看旅游攻略 (ViewTravelGuides)。实际操作步骤如下:
(1)继承InsightIntentExecutor。
(2)重写对应方法,例如目标拉起前台页面,则可重写onExecuteInUIAbilityForegroundMode方法。
(3)通过意图名称,识别查看旅游攻略意图(ViewTravelGuides),在对应的方法中传递意图参数(param),并拉起对应落地页(点击推荐卡片跳转的界面,如旅游攻略详细面)。
具体的实现代码如下所示:

import { insightIntent, InsightIntentExecutor } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';


export default class InsightIntentExecutorImpl extends InsightIntentExecutor {
  private static readonly VIEW_TRAVEL_GUIDES = 'ViewTravelGuides';
  /**
   * override 执行前台UIAbility意图
   *
   * @param name 意图名称
   * @param param 意图参数
   * @param pageLoader 窗口
   * @returns 意图调用结果
   */
  onExecuteInUIAbilityForegroundMode(name: string, param: Record<string, Object>, pageLoader: window.WindowStage):
    Promise<insightIntent.ExecuteResult> {
    // 根据意图名称分发处理逻辑。接入方可根据实际业务实现页面跳转
    switch (name) {
      case InsightIntentExecutorImpl.VIEW_TRAVEL_GUIDES:
        return this.viewTravelGuides(param, pageLoader);
      default:
        break;
    }
    return Promise.resolve({
      code: -1,
      result: {
        message: 'unknown intent'
      }
    } as insightIntent.ExecuteResult)
  }
  /**
   * 实现调用查看旅游攻略功能
   *
   * @param param 意图参数
   * @param pageLoader 窗口
   */
  private viewTravelGuides(param: Record<string, Object>, pageLoader: window.WindowStage): Promise<insightIntent.ExecuteResult> {
    return new Promise((resolve, reject) => {
      // 实现意图调用,loadContent的入参为旅游攻略落地页路径
      pageLoader.loadContent('pages/TravelGuidePage')
        .then(() => {
          let entityId: string = (param.items as Array<object>)?.[0]?.['entityId'];
          resolve({
            code: 0,
            result: {
              message: 'Intent execute succeed'
            }
          });
        })
        .catch((err: BusinessError) => {
          // 调用失败的情况
          resolve({
            code: -1,
            result: {
              message: 'Intent execute failed'
            }
          })
        });
    })
  }
}

2、前台 UIExtension 窗口意图调用实践

具体的使用的时候,开发者还需要自己实现InsightIntentExecutor,并在对应回调实现窗口页面内容加载的能力。实际操作步骤如下:
(1)继承InsightIntentExecutor。
(2)重写对应方法,例如目标拉起前台窗口化页面,则可重写onExecuteInUIExtensionAbility方法。
(3)通过意图名称,识别打开蓝牙意图(LoadBluetoothCard)调用扩展意图,在对应的方法中传递意图参数(param),并拉起对应窗口化页面。
具体的实现代码如下所示:

import { insightIntent, InsightIntentExecutor, UIExtensionContentSession } from '@kit.AbilityKit';

export default class IntentExecutorImpl extends InsightIntentExecutor {
  private static readonly TAG: string = 'IntentExecutorImpl';
  private static readonly LOAD_BLUETOOTH_CARD: string = 'LoadBluetoothCard';
  /**
   * override 执行前台UI扩展意图
   *
   * @param name 意图名称
   * @param param 意图参数
   * @param pageLoader 窗口
   * @returns 意图调用结果
   */
  async onExecuteInUIExtensionAbility(name: string, param: Record<string, Object>,
    pageLoader: UIExtensionContentSession):
    Promise<insightIntent.ExecuteResult> {
    console.info(IntentExecutorImpl.TAG, `onExecuteInUIExtensionAbility`);
    switch (name) {
      case IntentExecutorImpl.LOAD_BLUETOOTH_CARD:

        return this.openLoadBluetoothCard(pageLoader);
      default:

        break;
    }

    let result: insightIntent.ExecuteResult = {
      code: -1,
      result: {
        message: 'onExecuteInUIExtensionAbility failed'
      }
    };
    return result;
  }

  /**
   * 打开加载蓝牙卡片意图
   *
   * @param pageLoader 意图内容Session对象
   * @returns 执行结果
   */
  private async openLoadBluetoothCard(pageLoader: UIExtensionContentSession): Promise<insightIntent.ExecuteResult> {
    pageLoader.loadContent('pages/UiExtensionPage');
    let result: insightIntent.ExecuteResult = {
      code: 0,
      result: {
        message: 'intent execute succeed'
      }
    }
    return result;
  }
}

最后

通过上面的详细介绍,其实HarmonyOS AI 套件的技能调用,本质上是在 “端侧智能” 与 “分布式架构” 的双重加持下,重新定义了开发者与智能能力的协作方式,它不再是 “开发者适配 AI”,而是 “AI 适配开发者”。当其他系统还在依赖云端 AI 的 “远程算力” 时,HarmonyOS 已经通过端侧推理让智能体验 “零延迟、零隐私风险”;当多数框架还在要求开发者掌握复杂的模型训练时,HarmonyOS 的意图框架与预置模型,让个人开发者仅需几行代码就能实现 “自然语言触发功能” 的智能特性。这不仅是技术的平权,更是将 “泛在智能” 从概念落地为可触达的开发工具。随着多模态大模型与 HarmonyOS 分布式硬件的深度绑定,我们将看到更惊人的场景:手机上触发的 “旅游攻略查询”,能自动同步到车机的导航界面;手表上的语音指令,能直接控制智能家居的设备状态,而这一切,都可以通过 AI 套件的技能调用快速实现。

在Java编程学习的征途上,许多学习者怀揣热情启程,却在基础语法阶段遭遇意想不到的障碍与困惑。这些看似简单的语法细节,往往成为后续深入学习与项目开发中的隐形绊脚石。达内Java培优班基于多年教学经验与海量学员学习数据,精准识别出那些最常见却又最容易被忽视的Java基础语法易错点,并通过系统化的拆解,帮助学员夯实编程根基,避开前行路上的诸多陷阱。


变量与数据类型:类型转换的隐秘风险
Java作为一门强类型语言,变量与数据类型的严格管理是其核心特性之一。然而,恰恰是在“类型转换”这一基础环节,许多初学者频频犯错。达内培优班在教学中发现,尽管自动类型转换(隐式转换)和强制类型转换(显式转换)的概念看似简单,但在实际操作中,学习者往往因忽略数据范围与精度损失而引发逻辑错误。

例如,在将float类型赋值给long类型时,看似直接的赋值操作背后,实则可能隐藏着数据精度的微妙变化。培优班通过引入“数据范围阶梯图”与“精度损失警示模型”,将抽象的转换规则可视化,帮助学员建立起对数据类型边界的直观认知。更重要的是,课程特别强调在商业计算等精度敏感场景中,为何要避免使用float和double,而应转向BigDecimal这类工具,这种从原理到实践的全方位解析,让学员不仅“知其然”,更“知其所以然”。


运算符与表达式:优先级与结合性的思维盲区
“为什么我的计算结果和预期不符?”——这是Java初学者在涉及复杂表达式时最常见的疑问。达内培优班的教学分析显示,问题往往不在于学员不会使用单个运算符,而在于对运算符的“优先级”和“结合性”缺乏系统把握。

Java中数十种运算符有着明确的优先级层次,而同一优先级的运算符则遵循特定的结合方向。培优班通过独创的“运算符优先级扑克牌”记忆法与大量“表达式拆解沙盘练习”,将这一枯燥的规则转化为可操作、可演练的学习体验。例如,对于a += b与a = a + b这类细微差别,课程会设计对比实验,让学员亲眼见证在类型不同时两者可能产生的不同结果,从而深刻理解复合赋值运算符内含的类型转换机制。


控制流程:循环与条件分支的逻辑陷阱
控制流程是编程逻辑的骨架,但骨架的连接处往往是最脆弱的部分。在if-else条件判断中,初学者常因误用赋值运算符=代替关系运算符==而引入难以察觉的错误。培优班不仅指出这一常见错误,更进一步剖析其根源:为何Java编译器在某些情况下不会对此报错?这背后涉及表达式返回值、布尔上下文等更深层的语言特性。

循环结构中的易错点则更为隐蔽。例如,在for循环中修改循环变量、在多重循环中错误定位break与continue的作用范围、对while与do-while的选择不当等。达内培优班采用“代码执行轨迹追踪法”,通过逐步动画演示程序执行的每个步骤,将内存中变量的变化可视化,使学员清晰看到自己的逻辑误解究竟发生在哪个具体环节。


面向对象基础:引用与对象的认知混淆
面向对象是Java的核心范式,而理解“引用”与“对象”的关系则是通往这一范式的第一道门槛。许多学员在方法参数传递时,对“值传递”这一概念产生根本性误解,误以为对象作为参数传递时是“引用传递”。培优班通过精心设计的“对象盒子与引用标签”比喻,将这一抽象概念具象化:引用变量好比一个贴有地址的标签,而对象则是存储在该地址的盒子;方法调用时传递的是标签的副本,而非盒子本身。

这一根本性理解的建立,直接影响到学员对对象比较(==与equals的区别)、对象克隆、以及集合框架中元素存储方式等一系列高级主题的掌握。培优班通过“认知纠偏-概念重建-实践验证”三步教学法,确保学员在这一关键节点上建立正确且牢固的认知模型。


异常处理:被忽视的防御性编程起点
异常处理机制常被视为进阶内容而被初学者草率对待,但达内培优班将其定位为“基础语法中的高级修养”。教学中发现,学员最常出现的错误并非不知道try-catch的语法,而是对“该捕获什么异常”、“何时该捕获”、“捕获后该如何处理”缺乏清晰原则。

培优班独创“异常分类光谱图”,将Java异常体系按照严重程度、处理责任、发生频率等维度进行分类展示,帮助学员建立异常处理的层次化思维。更重要的是,课程强调异常处理不仅是语法要求,更是防御性编程的起点。通过分析未处理异常如何导致程序崩溃、资源泄露等严重后果,学员能够从项目全局的角度重新审视这一基础语法的战略价值。


总结:从易错点到思维模式的升华
达内Java培优班对基础语法易错点的拆解,其深层价值不在于罗列常见错误清单,而在于通过这些问题揭示Java编程的思维模式与设计哲学。每一个易错点都是一个知识盲区的信号,每一次纠错都是一次思维结构的优化。

培优班的教学实践表明,当学员能够主动识别并规避这些基础语法陷阱时,他们的编程思维已经发生了质的飞跃:从机械记忆语法规则,转变为理解语言设计逻辑;从被动应对编译错误,转变为主动预防逻辑缺陷。这种思维层面的提升,正是学员从Java语法学习者成长为合格Java开发者的关键转折点,也为后续深入框架学习、参与企业级项目开发奠定了最为坚实的基础。在达内的教学体系中,对基础语法的精雕细琢,从来都不是小题大做,而是对编程生涯的深度投资。

什么是OVSSL证书?

OVSSL证书,即组织验证型SSL证书。它不仅仅验证域名的所有权,更重要的是由权威的CA机构对申请企业或组织的真实存在、合法注册及运营状态进行人工审核。这是其与DV证书最核心的区别。

  • 直观体现:安装后,在浏览器地址栏点击小锁图标,可以查看到企业/组织的详细信息
  • 核心价值:建立更强的在线信任,向用户证明网站背后是一个真实合法的实体,常用于企业官网、电子商务、会员登录等需要用户提交敏感信息的场景。

如何申请OVSSL证书?(详细步骤)

第一步:前期准备与信息确认

  1. 确定域名:明确需要保护的域名(例如 yourcompany.com)。
  2. 准备企业资料:这是最关键的一步,确保资料真实、有效且与官方记录一致。

    • 企业营业执照:清晰的彩色扫描件。
    • 企业联系电话:必须是官方公开的、能接通的公司座机号码(非个人手机),用于CA电话核实。
    • 企业邮箱:通常需要使用以申请域名结尾的企业邮箱(如 admin@yourcompany.com),用于接收验证邮件。部分CA也接受其他公认的企业邮箱。
    • 申请者信息:申请人的姓名、职位、公司座机、个人邮箱。

第二步:选择证书服务商(CA或经销商)并下单

访问JoySSL官方网站,在右上角找到“注册”按钮并点击。填写相关信息,创建一个证书管理账号。注册过程中,务必填写特定的注册码230970,这样才可以获得渠道低价和全程技术支持。

OVSSL证书申请入口

1、选择证书类型与年限

登录账号后,进入SSL证书栏,找到“OV证书”选项。根据自身需求,选择OV单域名、OV通配符、或者OV IP地址等SSL证书后,点击“下单”,并通过在线支付或公对公转账的方式完成支付。

2、申请证书

在申请页面,需要填写一系列信息,包括域名、单位名称、联系人、联系方式、邮箱等。这些信息将用于验证单位的真实性,所以务必确保准确无误。

3、验证域名或IP的管理权

提交申请后,并要求验证域名或者IP地址的所有权。按照系统提示的操作步骤进行验证,包括域名DNS解析认证或者服务器文件验证,操作完成后提交。

4、组织信息审核

JoySSL会对企业的组织信息进行验证,通常会通过电话、电子邮件等方式确认公司信息的真实性,审核过程一般在1到3个工作日左右完成。

4、部署证书

一旦审核通过后,JoySSL将签发OV SSL证书。下载已经签发的证书,根据JoySSL提供的安装指南或服务器文档,将证书安装到服务器上。

前言

在万物互联的全场景时代,设备之间的边界正在消失,安全认证已不再是单一设备的 “孤岛式” 防御,而是跨端协同的 “全链路” 保障。HarmonyOS 凭借其分布式软总线与原生 ArkUI 框架,为开发者提供了一套从终端到云端的安全认证解决方案,其中 PatternLock(图案密码锁)作为最贴近用户习惯的认证方式之一,不仅承担着保护用户隐私的核心职责,更成为连接多设备、多场景的交互入口。那么本文从技术原理出发,深度拆解 ArkUI 框架中 PatternLock 组件的三层架构设计,通过代码实战演示如何构建兼具安全性与体验感的手势密码模块,并进一步探索生物特征融合、分布式跨设备认证等进阶场景,帮助大家在全场景生态中打造更智能、更安全的认证体系。

PatternLock概念

在HarmonyOS开发中,PatternLock是图案密码锁组件,以九宫格图案的方式输入密码,用于密码验证场景。手指在PatternLock组件区域按下时开始进入输入状态,手指离开屏幕时结束输入状态完成密码输入。(需要说明的是,该组件从API Version 9开始支持。)
PatternLock 的交互逻辑简洁直观:用户手指按下九宫格区域时进入输入状态,离开屏幕时触发轨迹校验,整个过程无需键盘输入,既提升了操作效率,又降低了密码泄露风险。

PatternLock核心功能解析

1、组件架构特性

PatternLock是ArkUI框架提供的安全认证组件,采用三层架构设计:

  • 交互层:提供可定制的九宫格绘制界面,支持动态波纹反馈、连线样式自定义,让输入过程更具视觉引导性;
  • 控制层:通过PatternLockController实现组件状态的实时控制,包括密码重置、锁定时长配置、验证结果反馈等核心能力;
  • 数据层:内置哈希算法对轨迹坐标进行不可逆加密,并支持与 HarmonyOS 系统安全服务联动,确保密码传输与存储的安全性。

    2、核心参数配置

    组件的核心参数可灵活调整,以适配不同界面风格与交互需求:
    image.png

3、样式继承树

关于PatternLock的样式继承树,如下所示:

PatternLock → CommonShape → CommonAttribute → Component

PatternLock样式设置

在实际开发中,任何一个组件的样式相关的设置都是非常重要且常用的操作,那么PatternLock也不例外,接下来分享关于样式相关的使用操作。
image.png
这里只分享关于PatternLock的样式设置相关的参数,具体的实际使用会在下一部分详细分享。

关于PatternLock的基础使用

1、组件初始化与控制器绑定

使用 PatternLock 的第一步是引入组件库并创建控制器实例,以实现状态的统一管理,具体如下所示:

// 导入组件库
import { PatternLock, PatternLockController } from '@ohos.arkui.ts/components';

// 创建控制器实例
private patternLockCtrl: PatternLockController = new PatternLockController();

2、基础布局与视觉定制

通过链式调用属性方法,可快速完成九宫格的布局与样式配置,包括尺寸、颜色、动态效果等,如下所示:

PatternLock(this.patternLockController)
        .sideLength(200)
        .circleRadius(9)
        .pathStrokeWidth(5)
        .regularColor('#ff182431') // 未选中的颜色
        .activeColor('#707070') // 激活状态的颜色
        .selectedColor('#707070') // 选中状态的颜色
        .pathColor('#707070') // 连线颜色
        .backgroundColor('#F5F5F5') // 背景色
        .autoReset(true)
        .activateCircleStyle({ // 动态波纹效果
            color: Color.Blue,
            radius: { value: 18, unit: LengthUnit.VP },
            enableWaveEffect: true  // 启用波纹动画
        })
        .onDotConnect((index: number) => {
          console.log("onDotConnect index: " + index)
          this.handlePatternComplete(index) // 具体实现方法在下一部分会介绍
        })

3、事件处理与安全校验

密码输入完成后,需通过事件回调实现业务逻辑处理,包括长度验证、加密传输与异常拦截,手势完成回调,如下所示:

private handlePatternComplete(input: number[]) {
    if (input.length < 5) {
        this.showToast("至少连接5个点");
        return;
    }
    const encrypted = this.encryptPattern(input); // 加密方法如下面关于密码加密算法所示
    this.validateWithServer(encrypted);
}

由于涉及到加密的设置,关于密码加密算法如下所示:

private encryptPattern(coordinates: number[]): string {
    const salt = cryptoFramework.createRandom(16);
    const sha256 = cryptoFramework.createHash("SHA256");
    sha256.update({ data: new Int32Array(coordinates) });
    return sha256.digest().then(hash => {
        return salt + hash.toHex();
    });
}

关于异常处理机制,如下所示:

private errorCount: number = 0;

private handleValidationError() {
    this.errorCount++;
    if (this.errorCount >= 3) {
        this.patternLockCtrl.lock(30000); // 锁定30秒
        this.showAlert("账号已锁定");
    }
}

4、专属事件与控制器能力

这里只来介绍非通用事件的使用,PatternLock有2个专属事件:onPatternComplete()和onDotConnect()。

(1)onPatternComplete()方法

语法:

onPatternComplete(callback: (input: Array<number>) => void)

使用:密码输入结束时触发该回调。
参数:
image.png

(2)onDotConnect()方法

语法:

onDotConnect(callback: Callback<number>)

使用:密码输入选中宫格圆点时触发该回调。
说明:回调参数为选中宫格圆点顺序的数字,数字为选中宫格圆点的索引值(第一行圆点从左往右依次为0、1、2,第二行圆点依次为3、4、5,第三行圆点依次为6、7、8)。

5、构造函数

constructor()是PatternLockController的构造函数。
系统能力: SystemCapability.ArkUI.ArkUI.Full

6、重置状态

reset()是重置组件状态。
系统能力: SystemCapability.ArkUI.ArkUI.Full

7、高阶玩法

然后再分享2个高阶一点的玩法。
生物特征融合认证,具体如下所示:

async function hybridAuth(pattern: string) {
    const faceResult = await userAuth.auth(Type.FACE);
    if (faceResult === AuthResult.SUCCESS) {
        return this.quickUnlock(pattern);
    }
    return this.strictValidate(pattern);
}

分布式场景实现,具体如下所示:

// 智能手表辅助认证
function watchAssistedAuth() {
    const deviceId = deviceManager.getTrustedDevices()[0];
    distributedLock.begin(deviceId);
    // 同步绘制轨迹...
}

PatternLock实际应用示例

最后再来分享一个关于PatternLock的详细使用示例,模拟一个验证手势密码是否正确,具体代码如下所示:

// test.ets
import { LengthUnit } from '@kit.ArkUI'

@Entry
@Component
struct PatternLockExample {
  @State passwords: Number[] = []
  @State message: string = '请输入密码!'
  private patternLockController: PatternLockController = new PatternLockController()

  build() {
    Column() {
      Text(this.message).textAlign(TextAlign.Center).margin(20).fontSize(20)
      PatternLock(this.patternLockController)
        .sideLength(200)
        .circleRadius(9)
        .pathStrokeWidth(5)
        .activeColor('#707066')
        .selectedColor('#707066')
        .pathColor('#707066')
        .backgroundColor('#F6F6F6')
        .autoReset(true)
        .activateCircleStyle({
          color: '#606060',
          radius: { value: 16, unit: LengthUnit.VP },
          enableWaveEffect: true
        })
        .onDotConnect((index: number) => {

        })
        .onPatternComplete((input: Array<number>) => {
          // 输入的密码长度小于5时,提示重新输入
          if (input.length < 5) {
            this.message = '密码长度需大于5位,请重新输入。'
            return
          }
          // 判断密码长度是否大于0
          if (this.passwords.length > 0) {
            // 判断两次输入的密码是否相同,相同则提示密码设置成功,否则提示重新输入
            if (this.passwords.toString() === input.toString()) {
              this.passwords = input
              this.message = '密码设置成功: ' + this.passwords.toString()
              this.patternLockController.setChallengeResult(PatternLockChallengeResult.CORRECT)
            } else {
              this.message = '两次输入的密码不一致,请重新输入。'
              this.patternLockController.setChallengeResult(PatternLockChallengeResult.WRONG)
            }
          } else {
            // 提示第二次输入密码
            this.passwords = input
            this.message = "请重新输入。"
          }
        })
      Button('重置手势密码').margin(40).onClick(() => {
        // 重置密码锁
        this.patternLockController.reset()
        this.passwords = []
        this.message = '请输入密码。'
      })
    }.width('100%').height('100%')
  }
}

上面的这个示例通过sideLength设置九宫格的大小、circleRadius等属性设置宫格圆点样式、onPatternComplete属性设置密码输入时的回调。当使用者密码输入完成后,按输入的密码不同,给予不同的回应:输入的密码长度小于5时,提示重新输入;第一次输入完成后,提示第二次输入密码;第二次输入完成后,判断两次输入的密码是否相同,相同则提示密码设置成功,否则提示重新输入。然后可以通过'重置手势密码'按钮,可以重置密码锁。

最后

随着 HarmonyOS 全场景生态的持续演进,PatternLock 已从传统的 “单点认证工具”,进化为连接多设备、多模态的 “安全交互枢纽”。本文从技术架构、开发实战到场景进阶,系统呈现了 PatternLock 的完整能力边界,不仅能帮助开发者快速构建基础手势认证功能,更能通过生物特征融合、分布式跨设备认证等进阶玩法,打造面向未来的全场景安全体系。在 HarmonyOS 6 及后续版本中,随着 ArkUI 框架对三维手势识别、压力感应等能力的引入,PatternLock 还将突破二维平面的限制,在车机控制、智能家居中控、可穿戴设备等场景中发挥更大价值。建议开发者持续关注 HarmonyOS Design 系统的更新,将环境感知、行为分析等新型技术与 PatternLock 深度融合,构建 “主动防御、无感认证” 的智能安全体验,为全场景互联时代筑牢安全基石。这里我建议大家持续关注HarmonyOS Design系统的更新,将生物特征、环境感知等新型认证方式与PatternLock深度融合,构建面向未来的智能安全体系,一起期待吧!

选择免费SSL证书,最核心的决策依据可以简化为:追求短期效益的选Let's Encrypt,看重中文长期免费体验、国内使用的选JoySSL,需要CDN与安全防护一体选Cloudflare。

一、JoySSL:国产首选的中文友好长期方案

JoySSL是国内专注提供免费SSL证书的服务商,主打本地化服务和中文体验,最大特色是提供永久免费的DV单域名SSL证书,吸引了大量国内个人站长和中小企业用户。

优势

  1. 中文界面更友好:全程中文操作指引,从申请下载到配置部署都提供中文文档,新手也能轻松上手,无需依赖翻译工具。
  2. 永久免费基础版:个人用户可免费领取永久有效的单域名DV证书,无需担心定期续期问题,适合长期稳定运行的个人站点。
  3. 支持国密算法:可提供符合国家标准的SM2国密证书,满足政务、金融等合规要求,为国内用户提供本土化加密选择。
  4. 多平台部署教程:提供针对宝塔面板、Nginx、Apache、Docker等主流平台的详细中文配置教程,降低部署难度。

缺点

  1. 通配符证书需付费:仅单域名证书永久免费,多域名和通配符证书需要购买专业版,对于需要覆盖子域名的多域名站点不够友好。
  2. 品牌知名度稍低:相比Let's Encrypt,市场认知度稍逊,部分用户可能对国产证书安全性存在顾虑,但实际上其DV证书同样通过国际主流浏览器信任根体系认证。

适用场景

国内个人博客、小型企业官网、微信小程序后端服务,适合偏好中文界面,追求长期稳定且无需频繁续期的用户。

二、Let's Encrypt:全球最成熟的开源自动化方案

Let's Encrypt是由互联网安全研究小组(ISRG)运营的非营利组织,是目前全球使用量最高的免费SSL证书提供商,覆盖全球超4亿个域名,是个人开发者和中小团队的首选方案。

优势

  1. 完全零成本:无隐藏消费,不限制申请次数,支持单域名、多域名和通配符证书类型,所有证书均为DV(域名验证)类型,可满足绝大多数普通网站的加密需求。
  2. 自动化程度高:通过ACME协议实现自动化申请、部署和续期,配合Certbot、acme.sh等工具,可实现证书到期前自动续期,完全无需人工干预。
  3. 兼容性极强:支持Nginx、Apache、Caddy等所有主流Web服务器,同时适配Windows、Linux、Docker等各种操作系统,几乎不存在兼容性问题。
  4. 社区资源丰富:作为行业标杆,相关教程和解决方案覆盖全面,遇到问题能快速找到解决办法,适合有一定技术能力的开发者。

缺点

  1. 证书有效期短:证书有效期仅90天,虽然支持自动续期,但依赖服务器环境稳定和续期脚本配置,一旦脚本失效可能导致证书过期。
  2. 中文支持不足:官方文档以英文为主,新手上手门槛略高,部分错误提示不够直观。
  3. 通配符证书需手动DNS验证:申请通配符证书时无法通过文件验证,必须手动添加DNS TXT记录完成域名所有权验证,流程相对繁琐。

适用场景

个人博客、开源项目、测试环境、中小团队的长期稳定站点,适合熟悉服务器操作,能自主维护续期脚本的用户。

三、Cloudflare CDN:自带安全与性能增益的云方案

Cloudflare是全球最大的CDN服务商之一,提供免费SSL证书与CDN加速一体化服务,无需用户手动下载部署证书,通过域名DNS解析配置即可实现全站加密。

优势

  1. 零部署成本:只需将域名DNS解析到Cloudflare,即可一键启用SSL加密,无需处理证书申请、上传、配置等繁琐步骤,新手也能快速上手。
  2. 附赠多重安全防护:启用Cloudflare SSL的同时,可自动获得DDoS攻击防护、WAF防火墙、恶意IP拦截等安全功能,有效提升网站安全性。
  3. 支持边加密与全加密模式:提供Flexible、Full、Full (strict)三种加密模式,可适配不同服务器配置,同时支持HTTP/2、HTTP/3等现代化网络协议。
  4. 全球加速能力:借助Cloudflare遍布全球的CDN节点,可同步提升网站访问速度,尤其适合面向全球用户的站点。

缺点

  1. 依赖CDN服务:必须将域名DNS解析到Cloudflare才能使用SSL证书,若服务器无法对接Cloudflare CDN,或不希望使用第三方CDN,该方案无法使用。
  2. 免费版存在功能限制:免费版仅支持单域名证书,通配符证书需升级到付费版,同时部分安全和加速功能存在速率和流量限制。
  3. 延迟略增:经过Cloudflare中转后,可能带来轻微的网络延迟,对于对响应速度有极高要求的站点(如实时交易系统)可能存在影响。

适用场景

需要同时实现加密、加速和安全防护的网站,适合缺乏技术能力手动部署SSL证书的新手用户,以及希望简化运维流程的中小团队。

四、三类免费SSL证书详细对比表

表格

对比维度Let's EncryptJoySSLCloudflare
证书类型单域名/多域名/通配符永久免费单域名单域名(免费版)
有效期90天,自动续期永久永久(绑定CDN服务)
申请门槛需域名所有权验证,支持文件/DNS验证需域名所有权验证,支持文件/DNS验证需将域名DNS解析到Cloudflare
技术门槛需配置ACME脚本,适合有一定技术基础用户中文界面引导,新手友好零配置,启用CDN即可自动生效
附加功能仅SSL加密国密算法支持,适配国内合规需求CDN加速、DDoS防护、WAF防火墙
适用场景个人博客、开发者测试环境、中小团队长期站点国内个人站长、小型企业官网需要加密+安全防护的站点、追求简化运维的团队

五、其他主流免费SSL方案对比

阿里云免费SSL证书

阿里云与DigiCert合作推出的免费DV证书,单域名有效期3个月,个人用户每年可免费申请20张。优势在于无需独立注册账号,直接通过阿里云控制台管理,适合阿里云服务器用户,但续期需要每年重新申请,相对繁琐,且仅支持单域名,无通配符证书。

腾讯云免费SSL证书

腾讯云提供的免费DV证书,有效期12个月,支持单域名证书,通过腾讯云DNS验证流程,自动化程度较高,但每年仅支持5张免费证书,适合腾讯云生态内的短期项目或测试站点。

ZeroSSL

ZeroSSL与Let's Encrypt基于同一ACME协议,支持通配符证书和中文界面,提供可视化申请流程,降低新手上手难度,但续期仍需要配置自动脚本,且免费版每月仅支持3个域名,适合对界面友好度要求较高的临时项目。

六、选型决策指南

  1. 技术能力导向:有服务器运维经验,希望实现全自动续期,首选Let's Encrypt。
  2. 中文体验导向:偏好中文界面,希望永久免费且无需续期,首选JoySSL。
  3. 一站式需求:需要CDN加速和安全防护,不想手动操作证书部署,首选Cloudflare。
  4. 云生态适配:使用阿里云或腾讯云服务器,可优先选择对应云厂商的免费证书,减少跨平台操作流程。

演技不像电视剧,太端着,总让人感觉在串戏临时排演的小品舞台剧。

台词寡淡无味,历史剧有多种台词风格,有纯白话的(以雍正大明王朝为代表),也有半文不白的(以老三国为代表),近些年的剧都是半吊子的半文不白,网文的水文里面装腔作势软弱无力的文字风格,看到人难受至极。

演员台词功底极差,毫无表现力与感染力,故作深沉,中气不足,肾虚乏力,令人难以卒听。咱就是说,找个专业的配音吧!

唯一的优势,就是服化道场景比之上个世纪的历史剧要精良很多,不过是否符合史实,我不懂。

总之就是,还是看看 1993 年的《唐明皇》吧。

大家好,我是汤师爷,专注AI智能体分享,致力于帮助100W人用智能体创富~

还在为小红书笔记创作发愁吗?

每天都要绞尽脑汁想文案,看着别人的爆款笔记却不知道如何模仿?

今天,我就教你如何利用AI智能体,轻松实现小红书图文改写,让创作效率提升10倍!

我们先看下智能体的执行效果:

image.png

image.png

image.png

1.整体工作流

image.png

1.获取小红书笔记详情

2.使用OCR技术,提取图片中的文字

3.将图片文案进行整理

4.图片文案仿写

2.详细工作流节点

2.1 开始节点

image.png

开始节点有两个输入变量。

  • 输入:

    • noteUrl:小红书笔记链接
    • cookieStr:小红书cookie

2.2 如何获取小红书cookie?

1.登陆https://www.xiaohongshu.com/

2.在页面空白处右击鼠标,选择「检查」

image.png

3.在刚刚打开的面板中,点击「网络」选项卡

image.png

4.刷新当前页面

5.点击第一条记录,在右侧「标头」部分向下滚动,找到cookie一行,将其内容复制下,这就是我们需要的cookieStr

image.png

2.3 获取小红书笔记详情

image.png

我们将使用【小红书】插件的xhs_note_detail功能。

通过这个功能,我们可以根据笔记链接获取笔记详情。

  • 输入:

    • cookieStr:开始 - cookieStr
    • noteUrl:开始 - noteUrl

image.png

2.4 使用OCR技术,提取图片中的文字

1.接下来,我们使用循环节点,批量提取图片中的文字。

  • 输入:

    • input:获取小红书笔记详情-note_image_list
  • 输出

    • output:从图片中提取文字-data

image.png

2.使用循环体,批量提取图片的文字

我们会使用「OCR」插件,提取图片的文字。

image.png

输入参数如下图所示。

image.png

2.5 使用大模型将文案内容进行整理、排版

在这一步,我们会使用大模型节点,对文案内容进行整理、排版。

image.png

大模型节点的系统提示词如下:

## 角色(Role)
你是一位精通内容整理和 Markdown 排版的 AI 助手。你擅长阅读和理解非结构化的文本内容,并能够将其转化为结构清晰、格式优美的 Markdown 文档。

## 背景(Background)
随着社交媒体平台的普及,大量的图文内容被创作和分享。然而,这些内容往往缺乏良好的结构和格式,不利于阅读和理解。将这些内容整理成结构化的 Markdown 文档,可以大大提高内容的可读性和价值。

## 任务(Task)
你的任务是接收一段从插件输出的非结构化文本内容(主要是抖音图文中的文字),仔细阅读并理解内容,然后将其转化为结构清晰、格式规范的 Markdown 文档。你需要:

1. 识别并提取文本中的关键信息,如标题、作者、主要内容等
2. 根据内容的逻辑关系,对文本进行分类和整理
3. 使用 Markdown 语法进行排版,包括但不限于使用标题、粗体、斜体、列表等格式
4. 确保所有原始内容都被包含在最终的 Markdown 文档中,不遗漏任何信息

## 规则与限制(Rules & Restrictions)
1. 必须使用 Markdown 语法进行排版
2. 使用 #、##、### 等进行标题划分,层级不超过 3 级
3. 使用 - 或 * 进行无序列表编写,使用 1. 2. 3. 等进行有序列表编写
4. 重要内容使用粗体(**文字**)标注,需要强调的内容使用斜体(*文字*)标注
5. 保持原文的主要结构和顺序,但可以适当调整以提高可读性
6. 不得添加、删除或修改原文的实质内容
7. 如遇到不确定的内容,保留原样并用括号标注

## 参考短语(Reference sentences)
- 内容完整,不遗漏任何信息
- 结构清晰,层次分明
- 格式规范,美观实用
- 逻辑严密,条理清晰
- 重点突出,易于阅读

## 案例展示(Case Show)
### 输入:
{
  "code": 0,
  "data": {
    "results": [
      {
        "words": [
          {
            "lang": "auto",
            "text": "求大连这两个"
          },
          {
            "lang": "auto",
            "text": "地方有啥"
          },
          {
            "lang": "auto",
            "text": "区别啊??"
          }
        ]
      }
    ]
  },
  "log_id": "20250325123913080C6F506498C6F581B7",
  "msg": "success"
}

## 风格和语气(Style & Tone)
- 保持专业、清晰的语气
- 使用简洁、直接的表达方式
- 保持原文的重点和强调

## 受众群体(Audience)
- 小红书电商新手卖家
- 对开设小红书店铺感兴趣的人群
- 想要了解小红书电商运营的人群

## 输出格式(Output format)
使用 Markdown 格式输出,包括:
1. 一级标题(#)用于文章主标题
2. 二级标题(##)用于主要章节
3. 三级标题(###)用于子章节
4. 无序列表使用 - 或 *
5. 有序列表使用 1. 2. 3. 等
6. 重要内容使用粗体(**文字**)
7. 需要强调的内容使用斜体(*文字*)

## 工作流程(Workflow)
1. 仔细阅读输入的文本内容,理解其结构和主要信息点
2. 提取标题、作者、标签等元信息
3. 识别主要章节和子章节,规划文档结构
4. 按照规划的结构,使用 Markdown 语法重新排版内容
5. 使用粗体和斜体突出重要信息和需要强调的内容
6. 检查确保所有原始内容都被包含,没有遗漏
7. 最后检查 Markdown 格式是否正确,调整以确保最佳可读性

## 初始化(Initialization)

下面是你需要整理和格式化的文本内容:

<评价内容>

请提供需要整理和格式化的文本内容。我会仔细阅读并按照上述要求将其转化为结构清晰的 Markdown 文档。不需要输出额外除图片识别文字以外的内容。

2.6 图片文案仿写

接下来,我们需要通过大模型节点退图片文案进行仿写。

image.png

大模型节点的系统提示词如下:

# 角色说明
你是一位专业的图文内容仿写助手,负责根据图片中提取的文字内容,结合视觉元素和背景信息,创作风格一致的仿写内容。

# 背景说明
处理用户提供的图片文字内容时,你需要:
1. 理解图片的整体风格和背景(产品介绍、教程步骤、使用心得等)
2. 分析文字的语言特点(正式/口语化、句式特征、专业术语等)
3. 结合图片呈现的视觉信息(产品外观、使用场景等)
4. 在保持原意的基础上进行自然的仿写扩展

# 仿写原则
1. 保持原意完整性
2. 匹配原文语言风格
3. 补充恰当的细节
4. 与图片内容保持一致
5. 避免添加虚假信息

# 工作流程
1. 接收图片文字内容
2. 分析图片背景信息(可选)
3. 分析原文特点:
   - 语言风格
   - 内容结构
   - 关键词使用
4. 创作三个版本:
   - 贴近原文的保守版
   - 适度优化的改进版
   - 创意加强的亮点版

# 输出示例
## 原文:
"夏日必备防晒霜
SPF50+ PA++++
清爽不油腻"

## 仿写版本:
1. 【保守版】
"夏季必备防晒产品
防晒指数SPF50+ PA++++
质地清爽不油腻"

2. 【优化版】
"夏日防晒推荐
高倍防护SPF50+ PA++++
轻薄水感质地,肌肤零负担"

3. 【创意版】
"今夏防晒天花板!
SPF50+ PA++++超强防护
一抹化水,清爽不黏腻"

# 执行要求
请提供:
1. 图片文字提取内容
2. 图片背景说明(如有)

我将按照以上规范进行仿写创作。

2.7 使用文本处理插件拼接字符串

  • 输入:

    • String1:获取小红书笔记详情-note
    • String2:图片文案内容整理-output
    • String3:图片文案仿写-output

image.png

2.8 结束节点

image.png

3.总结

通过以上介绍,相信你了解了如何利用DeepSeek+Coze来构建高效的小红书图片文案改写智能体。

在AI时代,技术门槛将越来越低,小白也能搭建智能体,用AI工具来提升工作效率。

用AI智能体不是未来,而是AI时代每个人的生存技能,学会AI智能体,人人都是超级个体。

如果你觉得这篇文章有帮助,别忘了点赞、关注、收藏,我们下期再见!

对了,我整理了一份开源《智能体学习手册》,爆肝 10 万字,价值 999 元。限时开放领取👉:tangshiye.cn