2026年3月

极客邦科技正式宣布启动 2026 「AI 青禾计划」,面向全国高校计算机、人工智能、软件工程等相关专业的优秀在校生,提供“学习 + 实践”一体化成长支持。

“青禾”二字,取意“青苗初长,禾下乘凉”,这既是对袁隆平院士躬耕不辍、泽被后人的精神致敬,也寄托着极客邦对技术薪火相传的深切期许。在 AI 与软件工程范式以前所未有的速度重塑产业格局的今天,一个现实困境日益凸显:高校课堂与工业前沿之间,正出现一道越来越宽的鸿沟。

「AI 青禾计划」正是极客邦回应这一命题的主动作为。它不止是一次公益福利,更是一份对未来的郑重承诺:我们相信,今天的青苗,就是明天的技术脊梁。而最好的支持,不是等待他们长大,而是提前为他们打开一扇窗。为此,本次计划将具体覆盖两大核心福利:

第一,免费领取“极客时间 · AI 青禾计划专属课程包”,包括了《MCP 实战课》、《从 0 到 1 入门 AI 大模型》、《大模型时代 Agent 开发方法论》、《150 分钟 Rust 生产实践案例》、《Java 面试冲刺之 JVM 难点攻克》、《软考公开课》等 50+ 前沿课程内容,涉及 AI 大模型、架构、前端、云原生等热门技术,以及软考必备技能学习。

第二,免费直通 2026 QCon 全球软件开发大会北京站和 AICon 全球人工智能开发与应用大会上海站,作为国内最老牌的技术大会品牌,这也是极客邦技术大会自举办以来,首次向高校学生群体大规模开放免费参与通道。

通过“课程学习 + 顶尖大会”,极客邦希望为真正热爱 AI、具备项目潜力的年轻开发者,提供一次站在巨人肩膀上眺望未来的机会,让大家能够亲眼看见技术如何真正驱动业务,亲耳聆听一线架构师如何破解复杂系统难题,亲身感受产业脉搏的跳动节奏。

与此同时,我们也诚挚邀请来自相关院系的教授、讲师及科研人员参与,通过亲临 QCon 与 AICon 现场,了解工业界最新技术趋势与工程实践,反哺教学与科研,并为学生提供更贴近产业的指导。

为什么你不应该错过?

入选者将获得:

  • 免费领取“极客时间 · AI 青禾计划专属课程”:含《MCP 实战课》《大模型时代 Agent 开发方法论》《Java 面试冲刺之 JVM 难点攻克》等精选课程,支持反复学习

  • 免费全程参与 2026 QCon 北京站(价值 6800/ 人)或 AICon 上海站(价值 5800 元 / 人)

  • 与腾讯、阿里、字节、华为等头部企业的 CTO、首席架构师面对面交流

  • 深度了解 AI Agent、RAG、多模态大模型、云原生、智能硬件等前沿技术的工业级落地实践

  • 提前锚定职业方向,拓展优质人脉,提升校招竞争力

极客邦希望让真正有热情、有潜力的学生,站在离产业最前沿最近的地方。通过 QCon 和 AICon 等技术大会品牌,我们致力于为下一代工程师构建一个更加开放、真实、有温度的成长生态。

严控规模,确保体验与价值

为兼顾体验与价值,「AI 青禾计划」将采取审核和限额机制。具体说明如下:

  • 所有福利申请均需提供有效身份证明(如如学生证、教师工作证、学信网截图等),及简要专业 / 项目 / 研究经历说明

  • 因场地容纳人数有限,大会报名信息需经审核,主办方将按报名顺序锁定名额,额满即止

  • 参会现场需携带本人学生证 / 教师证、身份证原件核验取票,缺一无法入场,敬请谅解

  • 席位真实有效,极客邦科技将依法保留活动相关规则的调整及事项说明权利

长效陪伴,共建技术人成长生态

「AI 青禾计划」不是一次性的入场券,而是一个长期陪伴的起点。活动结束后,所有参与者将加入专属「AI 青禾校友」社群,持续获得极客邦推送的最新课程、技术干货、实习内推机会及后续活动邀请。未来,「青禾计划」有望延伸至黑客松、校企联合培训等多元形式,打造从“认知—连接—成长—就业”的完整人才培育闭环。

即日起,「AI 青禾计划」报名通道正式开启,扫码入群即可获取福利领取入口👇

图片

与此同时,我们诚挚邀请更多关注青年技术人才成长的企业与高校,共同加入「AI 青禾计划」联合发起方行列,携手构建产学研融合的新生态。如有更多问题可扫码咨询或合作意向可扫码咨询👇

图片

关于极客邦技术大会

QCon 全球软件开发大会

QCon 是由极客邦科技旗下 InfoQ 中国主办的综合性技术盛会,每年在伦敦、北京、纽约、圣保罗、上海、旧金山召开。自 2007 年 3 月份开始举办以来,已经有超万名有多年从业经验的技术人员参加过 QCon 大会。QCon 内容源于实践并面向社区,演讲嘉宾依据热点话题,面向 5 年以上工作经验的技术团队负责人、架构师、工程总监、开发人员分享技术创新和实践。

AICon 全球人工智能开发与应用大会

AICon 全球人工智能开发与应用大会是由极客邦科技旗下 InfoQ 中国主办的技术会议,主要面向各行业对 AI 技术感兴趣的中高端技术人员。大会聚焦 AI 最前沿技术、产业化和商业化的动态,将重点关注人工智能的落地实践,关注人工智能技术领域的行业变革与技术创新,与企业一起探寻 AI 的边界。

关于极客邦科技

极客邦科技是一家面向全球的 IT 知识服务平台。创立于 2007 年,提供媒体、会议、电商、培训、咨询、图书、社交等服务,总部设于北京。致力于让创新技术推动社会进步。十多年来,极客邦科技为数百万技术人,上万家中国企业提供服务,业务遍布中国各城市,以及美国、法国、德国、荷兰、以色列、日本等国家。

会议推荐

2026,AI 正在以更工程化的方式深度融入软件生产,Agentic AI 的探索也将从局部试点迈向体系化工程建设!

QCon 北京 2026 已正式启动,本届大会以“Agentic AI 时代的软件工程重塑”为核心主线,推动技术探索从「AI For What」真正落地到可持续的「Value From AI」。从前沿技术雷达、架构设计与数据底座、效能与成本、产品与交互、可信落地、研发组织进化六大维度,系统性展开深度探索。开往 2026 的 Agentic AI 专列即将启程!汇聚顶尖专家实战分享,把 AI 能力一次夯到位!

图片

最近在业余时间折腾了一个 AI Agent 桌面项目,刚整理好代码开源,发出来和大家交流一下。

项目地址:
https://github.com/GCWing/BitFun


做这个项目的一个想法是:

现在很多 AI 工具其实还是 “更高级一点的 ChatBox”
但我一直很好奇,如果每个人有一个 长期陪伴、有记忆的 AI 助理,会不会是另一种体验。

所以就做了 BitFun 这个实验项目。

它的核心思路是:

每个用户有一个自己的 Agent 助理,它可以调用不同能力去完成任务。


目前主要做了两个方向的 Agent

Code Agent (开发者向)

  • 对话驱动写代码
  • 自动读 / 改 / 跑 / 验证代码
  • Debug 模式排查问题
  • Review 模式做代码审查

Cowork Agent (办公场景)

  • 处理 PDF / Word / Excel / PPT
  • 自动生成文档或报告
  • 浏览器自动化(抓数据、填表、网页测试等)

另外也支持 自定义 Agent,可以用 Markdown 定义一个领域助手。


技术栈

  • Rust + TypeScript
  • Tauri 桌面端
  • 目前支持 Windows / macOS

CLI / Server / Mobile / Telegram 接入这些还在慢慢做。


为什么做这个项目

这个项目基本是 业余时间的长期实验项目,也想探索一下:

Agent + 工具 + 记忆 = 下一代人机协作?

顺便说个真实情况:

项目 97%+ 是 Vibe Coding 写出来的 😂
代码里肯定还有不少可以优化的地方。


如果你感兴趣

  • 欢迎看看代码
  • 提 issue / PR
  • 或者一起聊聊 Agent 工具这种形态


想听听大家的想法

如果有一个长期记忆的 AI Agent ,你最希望它帮你做什么?

转眼间,做前端已经五年了。回想起这些年的点点滴滴,有为了一个像素对不齐而折腾到凌晨的执着,也有终于解决了一个性能问题后的欣喜若狂。

💻 那些让我抓狂的瞬间

一个padding搞了我一晚上

记得刚入行的时候,有个布局问题让我头疼了一整晚。就是两个div之间的间距,怎么调都不对。那时候我还不知道浏览器默认样式这回事,对着Chrome开发者工具一遍遍地试,各种margin、padding组合,结果第二天早上一问资深同事,人家轻描淡写地说:"reset.css加了么?"

那一刻我才明白,很多你以为的技术难题,其实只是知识盲区而已。

"这个需求很简单"背后的深坑

产品经理说:"这个需求很简单,就是加个拖拽排序功能。"

我:"好的,应该一天就够了。"

然后我才发现,拖拽排序要考虑:

移动端的手势识别
PC端的鼠标事件
不同浏览器的事件兼容性
拖拽过程中的视觉反馈
边界处理和碰撞检测
性能优化(防止频繁重绘)
可访问性支持

三天后,我终于交出了"看似简单"的功能。从那以后,我再也不轻易相信"这个需求很简单"这种话了。

🌱 那些让我成长的时刻

第一次重构老项目

接手一个三年前的老项目,代码里到处都是document.getElementById,jQuery和原生JS混用,全局变量满天飞。重构过程中,我发现了一些有意思的"黑历史":

// 当年的前辈们是怎么写代码的
function getData() {
  if (data1 == null) {
    data1 = [];
    for (var i = 0; i < 100; i++) {
      data1.push(i);
    }
  }
  return data1;
}

// 还有这种神奇的操作
$("#button").click(function() {
  setTimeout(function() {
    location.reload();
  }, 100);
});

重构那段时间,每天都在跟历史代码搏斗,但也正是这个过程,让我真正理解了什么叫"代码可维护性"。

学会了说"不"

以前刚入行时,产品提什么需求我都说"行"。直到有一次,为了赶一个不合理的deadline,我熬了好几个通宵,最后上线的版本还出了bug。

后来我学聪明了,开始跟产品和沟通:

这个需求的技术复杂度是多少
需要多少开发时间
如果一定要提前,哪些功能可以砍掉
当前技术方案的风险点在哪里

学会评估和沟通,比学会写代码更重要。

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

🤔 程序员的日常思考

中标题

关于加班的那些事

刚开始工作的时候,我觉得加班=努力。后来慢慢发现:

有效的时间管理比长时间工作更重要
会写代码不等于会解决问题
健康比KPI重要得多

我现在尽量不加班,不是因为懒,而是我学会了:

提前评估工作量
及时沟通风险
拒绝不合理的需求
保持专注,减少无效加班

关于技术焦虑

前端技术更新太快,Vue还没学完,React又出了新特性,CSS框架层出不穷。前两年我很焦虑,怕被淘汰。

现在我想通了:

基础永远是王道:HTML/CSS/JavaScript的核心不会变
学习要讲方法:不要追着新技术跑,要有选择地学
项目驱动学习:在实际项目中学习新技术效果最好
保持输出:写博客、做分享是最好的学习方式

💪 真正的成长是什么

从技术思维到产品思维

刚开始我只关心代码写得爽不爽,后来我开始思考:

用户真的需要这个功能吗?
这个交互体验够好吗?
性能优化能带来什么价值?
我的代码对团队协作友好吗?

技术是工具,不是目的。真正的前端开发,是用技术为用户创造价值。

找到了自己的节奏

现在的我:

不再盲目追新技术,而是选择适合自己的技术栈
重视代码质量,但不执着于完美
会主动沟通需求,而不是被动接受
保持学习的热情,但不焦虑
知道什么时候该努力,什么时候该休息

🎯 给自己的一些话

五年下来,我想对自己说:

保持好奇,但不要盲目跟风
写代码很重要,但解决问题更重要
技术要精进,但生活也要平衡
多分享,多交流,多思考
记住,你首先是一个人,其次才是程序员

✨ 下一个五年

技术这条路很长,但我不急了。慢慢地学习,稳稳地成长,踏实做好每一个项目。

毕竟,最好的代码不是最复杂的,而是最合适的。最好的程序员不是最聪明的,而是最懂得平衡的。

愿我们都能在这条路上,找到属于自己的节奏和答案。

你在前端路上有什么难忘的经历?欢迎在评论区分享你的故事。

——转载自:destinying

你有没有发现,这两年刷微博、看抖音,评论区里多了一行小字——“来自北京”或“IP属地:广东”?
这背后不是产品经理心血来潮,而是监管趋严下的硬性要求。从2022年开始,各大平台陆续上线IP属地功能,到现在已经成了标配。但真要做合规,里面门道不少:展示到什么粒度?用什么技术方案?怎么平衡体验和成本?

属地展示,合规边界在哪?

先说清楚一点:监管要的从来不是精确定位。
根据网信办相关要求,平台展示IP属地的目的是“提升信息透明度”,而不是监控用户位置。所以展示粒度控制在国家或省级就足够了,不需要也不应该展示到城市、区县甚至街道。
这意味着你在技术选型时,不需要追求“越准越好”,而是要追求“稳定、合规、可解释”。一个常见误区是,有些平台为了显得技术能力强,把IP定位搞得太细,结果反而踩了隐私保护的线。

在线API还是离线库?

目前主流有两种思路。
方案一:实时调用在线API
这是最“省事”的做法——每次请求走一遍第三方接口,实时返回归属地。
好处是接入快,几行代码搞定。但坏处也很明显:接口一旦挂了,前端展示直接“开天窗”;延迟不可控;数据版本混乱;而且用户IP传到第三方,涉及数据出境评估。

方案二:本地离线库解析
另一种思路是把IP库“搬”到自己服务器上,本地解析,不依赖外网。
服务启动时把离线库加载到内存,请求链路里直接查库输出结果。整个过程没有网络开销,解析逻辑、数据版本、展示口径都由平台自己控制,维护成本和合规风险都低得多。

// 示例:加载离线库(.dat格式文件,可从 ipdatacloud.com 获取)
public static void init() {
    ipDb = IpOfflineDb.load("/data/ip/ip_offline.dat");
}

// 请求链路中解析
public static String resolveIpLocation(String ip) {
    IpLocation loc = ipDb.lookup(ip);
    // 合规展示:只到国家/省级
    if ("CN".equals(loc.getCountryCode())) {
        return loc.getProvince();
    }
    return loc.getCountryName();
}

从行业实践看,离线库方案正在成为主流。尤其对中大型平台,稳定性和可控性是底线。

离线库怎么选?

如果决定走离线库路线,接下来要面对的问题就是:市面上那么多IP库,怎么选?
第一,覆盖率和精度够不够?
属地展示虽然只到省级,但前提是省级判断必须准。一个北京联通的IP如果被误判到河北,用户就会投诉。底座越精细,粗粒度判断才越稳。
第二,IPv6支持是否完整?
截至2025年6月,我国IPv6活跃用户数已达8.36亿(CNNIC数据)。IPv6分配逻辑和IPv4完全不同,如果IP库对IPv6只是“勉强能用”,未来两年准确率会直线下降。
第三,更新节奏是否稳定?
属地展示最怕什么?怕用户今天在北京,明天因为IP库更新“被搬家”到上海。更新周期可预期、可控制,平台自己能掌握升级节奏,这点很重要。
第四,能不能私有化部署?
离线库的意义就在于“数据不出门”。如果还要定期“回传数据”或“在线激活”,那合规风险依然存在。

市面上主流离线库

目前行业内用得比较多的IP库大概分三类:

  • 免费开源库:优点是免费、轻量,适合小团队。缺点是更新不稳定,IPv6覆盖弱。
  • 商业综合库:IP数据云、IPing等。覆盖全球全量IP,支持IPv4/IPv6,定位精度高,更新周期固定,适合中大型平台。
  • 运营商级定制库:与基础运营商合作自建,准确率最高,但门槛极高。

IP数据云来说,它的离线库覆盖全球43亿全量IP,IPv4/IPv6双栈支持,精度能到街道级——虽然属地展示用不到这么细,但底座精细,省级判断自然就稳。它支持纯离线部署,下载后完全自主可控,更新节奏稳定(每季度发布新版本),不少社交平台在生产环境中跑过,反馈属地跳动的情况很少。
具体选哪家,得结合平台规模、预算来定。小论坛免费库够用;日活千万的App,商业库的稳定性和服务支撑会更重要。

实战建议

一套完整的合规方案大概是这样的:
第一步:选型
放弃在线API,采用离线库+本地解析。按覆盖率、IPv6支持、更新节奏、私有化能力四个维度评估。
第二步:部署
服务启动时加载离线库到内存,日常请求直接查内存,毫秒级响应,无外部依赖。
第三步:展示规则

  • 国内IP:展示到省级(如“北京”)
  • 国外IP:展示到国家(如“美国”)
  • 无法识别:展示“未知”
    第四步:维护策略
  • 离线库每季度或半年更新一次
  • 更新前在测试环境验证,避免属地大面积跳动
  • 所有变更留存日志,方便追溯

最后说两句

IP属地展示看起来是个小功能,但背后涉及监管理解、技术选型、数据治理,算是一个典型的“小切口、大纵深”问题。
对社交平台而言,这件事的核心不是“技术多炫酷”,而是稳定、合规、可解释。在这个前提下,离线库方案比在线API更稳妥。选对数据底座,后面几年的运维会省心很多——不管用IP数据云还是其他商业库,关键是把评估逻辑理清楚,找到最适合自己的那一款。

年后也已经两周了,各位产品同学出来说说跳槽的情况吧,大家感觉如何?
本人产品,目前没任何进展,刷到的岗位基本没多少新的,投递了也大多无后文。

各位产品同学,出来说说!!金三银四到底还存不存在!!!

公共资源速递

3 个公共数据集:

  • Adverse Drug Reaction 模拟药物不良反应数据集
  • Pan-Cancer scRNA-Seq 癌症单细胞转录图谱数据集
  • Drone Sound Audio Detection 无人机音频检测数据集

12 个公共教程:

  • ACE-Step 1.5:音乐生成 Demo

* FoundationMotion 视频问答系统

  • MOSS-TTS:高保真多场景语音生成模型
  • Qwen3-ASR-1.7B:新一代语音识别系统
  • Z-lmage:阿里 60 亿参数开源文生图模型
  • GLM-OCR 轻量级多模态 OCR 识别系统
  • 使用 vLLM-Omni 部署 Qwen-Image-Edit
  • 使用 vLLM-Omni 部署 Qwen-Image-2512

* VibeVoice-ASR:多功能端到端语音识别 Demo

  • vLLM+Open WebUI 部署 Qwen3-Coder-Next

* Qwen3-TTS:高质量可控多语言语音合成 Demo

  • MiniCPM-o-4\_5:面壁智能开源的全双工全模态模型

访问官网立即使用: openbayes.com

公共数据集

1. Adverse Drug Reaction 模拟药物不良反应数据集

该数据集用于模仿药物不良反应的药物警戒报告,旨在支持药物安全监测方面的研究、机器学习实验和算法开发。其中个案安全报告是基于真实世界的药物警戒系统启发人工生成的。特别强调严重 ADR 的稀有性和不平衡性:大多数报告属于轻微反应,而严重和致命的结果则较为罕见,这反映了后市场监控中常见的报告不足和严重性分布偏差。

在线使用:

https://go.openbayes.com/h5W08***

2. Pan-Cancer scRNA-Seq 癌症单细胞转录图谱数据集

该数据集包含 7,930 个单细胞的转录组表达数据,涵盖三种不同生物学状态:健康免疫基线、液体肿瘤以及实体肿瘤微环境,旨在构建一个跨队列整合的单细胞分析基准,为算法性能评估与方法学对比、多队列批次效应校正、免疫耗竭状态分析、跨肿瘤类型生物标志物挖掘提供基准。

在线使用:

https://go.openbayes.com/LdZ2Z

3. Drone Sound Audio Detection 无人机音频检测数据集

该数据集包含了未知和无人机这两类音频录音,旨在用于二元音频分类任务,检测真实环境中的无人机声音。该数据集中的音频文件以标准格式提供,适合用于诸如 Mel 频谱图提取、MFCC 特征提取、短时傅里叶变换以及原始波形深度学习模型等预处理技术。

在线使用:

https://go.openbayes.com/1rXMR

公共教程

1. ACE-Step 1.5:音乐生成 Demo

ACE-Step 1.5 是由 ACE Studio 与 StepFun 联合推出的开源音乐生成基础模型,旨在突破开源音乐生成模型的能力边界。该模型采用了创新的双阶段生成架构,通过融合扩散变换器(Diffusion Transformer, DiT)与语言模型(Language Model, LM)的协同工作,实现了高质量、长时长的音乐内容生成。

在线运行:

https://go.openbayes.com/188jt

项目示例

2. FoundationMotion 视频问答系统

FoundationMotion 由英伟达和麻省理工学院联合推出,是一个基于 Qwen2.5-VL 微调的视频理解与问答系统,旨在实现对视频中空间运动的理解与推理。该模型通过融合视觉语言预训练技术,能够对上传的视频内容进行智能分析并回答相关问题。

在线运行:

https://go.openbayes.com/JjTiE


项目示例

3. MOSS-TTS:高保真多场景语音生成模型

MOSS-TTS 是由 MOSI.AI 与 OpenMOSS 团队联合发布的开源语音生成模型系列。该项目将语音生成工作流分解为五个可独立使用或组合的生产级模型,包括核心的 MOSS-TTS 基础模型、MOSS-TTSD 多语言对话模型、MOSS-VoiceGenerator 音色设计模型、MOSS-SoundEffect 音效生成模型以及 MOSS-TTS-Realtime 实时交互模型。

在线运行:

https://go.openbayes.com/SVLyP


项目示例

4. Qwen3-ASR-1.7B:新一代语音识别系统

Qwen3-ASR 是由阿里云通义千问团队推出的新一代开源端到端自动语音识别模型家族,基于 Qwen3-Omni 多模态基座与自研 AuT 语音编码器打造,专注于实现高精度、多语言、长音频与流式/非流式一体化的语音到文本转写能力。该模型以原始音频信号为输入,通过端到端架构直接映射为结构化文本输出,同时支持字/词级毫秒级时间戳对齐,适用于会议转写、智能字幕、客服语音归档、方言语音交互等众多场景。

在线运行:

https://go.openbayes.com/OywAb


项目示例

5. Z-lmage:阿里 60 亿参数开源文生图模型

Z-Image 是由阿里巴巴通义千问团队发布的新一代高效图像生成模型。继 Z-Image-Turbo 蒸馏版本发布并在 Artificial Analysis 文本生图排行榜上取得开源模型第一名的优异成绩后,Z-Image团队正式开源 Z-Image 标准版。作为 Z-Image 系列的主要社区基础模型,标准版是非蒸馏的完整模型,在生成质量、风格灵活性和二次开发支持上更具优势,旨在为社区开发者提供一个强大且灵活的图像生成底座,释放更多定制化开发和精细微调的可能性。

在线运行:

https://go.openbayes.com/5GiKo


项目示例

6. GLM-OCR:轻量级多模态 OCR 模型

GLM-OCR 是由智谱 AI 开源的 0.9B 轻量级多模态 OCR 模型,专注于复杂文档场景下的高精度文本识别与结构化解析。该模型以「小尺寸、高精度、易部署」为核心优势,基于 GLM-V 编码器 - 解码器多模态架构,融合自研 CogViT 视觉编码器与 RLHF 优化,在 OmniDocBench V1.5 评测榜单中以 94.62 分登顶 SOTA,性能接近 Gemini-3-Pro,适用于办公文档解析、教育科研公式识别、政务金融票据核验、代码片段提取等多类场景。

在线运行:

https://go.openbayes.com/FNIGB


项目示例

7. 使用 vLLM-Omni 部署 Qwen-Image-Edit

Qwen-Image-Edit 是由阿里巴巴通义千问团队发布的全能图像编辑模型。模型兼具语义与外观的双重编辑能力,能进行低层次的视觉外观编辑(如添加、删除、修改元素)和高层次的视觉语义编辑(如 IP 创作、物体旋转、风格迁移等)。模型支持中英文双语文字的精准编辑,支持在保留原有字体、字号和风格的前提下修改图片中的文字。

在线运行:

https://go.openbayes.com/phaVp


项目示例

8. 使用 vLLM-Omni 部署 Qwen-Image-2512

Qwen-Image-2512 是 Qwen-Image 系列中的一款 Text-to-Image(文本生成图像)基础模型,主要面向高质量图像生成与复杂多模态内容表达场景。其中,人像生成的自然程度显著增强,人物面部结构、皮肤质感与光影关系更加接近真实摄影效果;在自然场景中,模型能够生成更细腻的地貌纹理、植被细节以及动物毛发等高频信息;同时,模型在图像中文字的生成与排版能力上也有所改进,能够更稳定地呈现可读文本与较复杂的文字布局。

在线运行:

https://go.openbayes.com/aQnE6


项目示例

9. Qwen3-TTS:高质量可控多语言语音合成 Demo

Qwen3-TTS-12Hz-1.7B-CustomVoice 是阿里巴巴 Qwen 团队推出的新一代高质量文本到语音基础模型,专注于在单一统一框架下实现:高自然度、低延迟的语音生成 该模型基于 12 Hz 声学建模框架,参数规模为 1.7B,在语音清晰度、韵律一致性与跨语言稳定性方面表现优异。模型能够在无需额外训练的情况下,直接在推理阶段切换预定义说话人,并结合自然语言风格指令实现更加精细的表达控制。

在线运行:

https://go.openbayes.com/SZ71r


项目示例

10. vLLM+Open WebUI 部署 Qwen3-Coder-Next

Qwen3-Coder-Next 是由阿里云通义千问开源的轻量级代码生成大模型,专注于全场景编程辅助与代码生成任务。该模型以「高性能、低门槛、易部署」为核心优势,基于 Qwen3 大语言模型架构优化,融合代码领域专属的预训练数据与 RLHF 代码对齐优化,适用于算法编写、业务代码生成、代码注释补充、跨语言代码转换、Bug 修复等多类编程场景。

在线运行:

https://go.openbayes.com/VydTG


项目示例

11. VibeVoice-ASR:多功能端到端语音识别 Demo

VibeVoice-ASR 是一款由 Microsoft 团队开源的高性能、多功能端到端语音识别模型,旨在为长音频内容提供结构化、上下文感知的语音转文本服务。该模型采用先进的统一音频建模架构,能够一次性处理长达 60 分钟的长音频,支持生成包含说话人身份、时间戳、转录内容的结构化输出,并允许用户提供上下文信息以提升识别准确率。

在线运行:

https://go.openbayes.com/5khYD


项目示例

12. MiniCPM-o-4\_5:面壁智能开源的全双工全模态模型

MiniCPM-o-4\_5 是由面壁智能和清华大学自然语言处理实验室开源的 9B 参数全模态旗舰模型,采用端到端架构融合 SigLip2、Whisper、CosyVoice2 与 Qwen3-8B。作为行业首个支持「即时自由对话」的模型,模型实现了全双工交互——能边看、边听、边说,告别传统回合制「对讲机」模式。

在线运行:

https://go.openbayes.com/RZPpo


项目示例

对于 iOS 开发者来说,基于苹果提供的简单的单页示例应用创建一个可扩展的架构往往很难。当然,如果是要创建一个简单的应用,那些例子就够了,但当你想要构建一个可扩展的东西时,难免会陷入挣扎。

几经寻找后,我发现了 Android 世界。与苹果相比,谷歌为开发者提供的东西让我感到惊讶。Android 开发者有清晰的指南和模式,最重要的是,有真实世界的例子展示如何构建生产级应用的结构,而不仅仅是玩具项目。

Android 社区受益于:

有清晰文档的官方架构组件 Now in Android 这样的示例应用展示了大规模应用的最佳实践跨生态系统模式一致(Repository、ViewModel)

相比之下,iOS 开发者则经常需要根据博文和苹果的示例应用来拼凑解决方案。单独来看,这些解决方案有用,但却很少能代表真实世界应用架构的演变,让我们只能祈祷我们的架构不会随着应用的增长而崩溃。

但令人鼓舞的是,好的架构是平台无关的,使 Android 应用具有可维护性的原则同样适用于 iOS。

本文探讨了如何参考现代 Kotlin 和 Android 开发的架构模式来构建 iOS 应用,并展示了如何将这些模式运用到 Swift 和 SwiftUI 开发中。

我们将从一个基本问题开始:视图中的状态管理。这个问题包括确保所有状态变更只有一个入口点,并实现诸如日志记录和调试等横切关注点。

接下来,我们将上移一层,将视图与视图模型分离,从而提高可重用性、可测试性和可预览性。

最后,我们将引入一个 Active Repository,将“单一数据源”的理念付诸实践,并展示数据如何在应用程序中自动传播。

传统 iOS ViewModel 存在的问题

如果你使用 SwiftUI 构建过 iOS 应用,那么你可能写过类似这样的东西:

class DashboardViewModel: ObservableObject {@Published var workouts: [Workout] = []@Published var isLoading = false@Published var error: Error?func loadWorkouts() {isLoading = trueerror = nilTask {do {workouts = try await api.fetchWorkouts()isLoading = false} catch {self.error = errorisLoading = false}}}}

这段代码适用于简单的界面,但请思考一下当视图模型变得复杂时会发生什么。

状态问题

多个属性相互矛盾,没有什么能防止这种情况:

viewModel.isLoading = trueviewModel.workouts = cachedWorkouts // 现在我们有数据但还在“加载”viewModel.error = NetworkError.timeout // 并且还出错了?

UI 应该显示哪种状态?在这里,编译器无法提供什么帮助。开发者做出了不同的选择,Bug 便随之产生了。

变更问题

你将添加更多方法,如 loadMore(),然后 refresh(),然后 deleteWorkout()、filterWorkout()和 selectWorkout()。现在,你有多个方法可以改变状态,而且各有各的方式。想要记录每个状态变化,就要在多个地方添加日志。想要通过调试来确定为什么 isLoading 卡在 true 上,可能得在十个地方设置断点。想要编写测试,弄清楚哪种方法调用组合可以重现用户流程,却没有哪一个地方可以集中处理。ViewModel 有一堆方法,你需要记住它们之间是如何相互作用的。

假如你正在处理一个功能,涉及到一个你六个月来没有看过的 ViewModel,或者一个你从未见过的新的 ViewModel。你打开文件,有六百行代码和二十个方法。这个东西是做什么的?哪些方法是从视图调用的,哪些是内部的辅助方法?你必须读完整个类才能理解它。没有概要介绍,没有契约,没有“这个 ViewModel 能做什么”的清单。而这样的 ViewModel 另外还有 100 多个。

解决状态问题:显式状态

在 Kotlin 中,状态问题在类型层面就得到了解决:

sealed interface UiState {data object Loading : UiState()data class Success(val data: T) : UiState()data class Error(val message: String) : UiState()}val workouts: StateFlow>> = ...

状态由单一数据源定义。其类型使得可能的状态相互排斥,编译器强制执行这一特性。同时处于 Loading 和 Success 状态是不可能的。

用 Swift 实现等价的代码简单且直观:

enum Loadable {case loadingcase finished(T)case error(U)}class DashboardViewModel: ObservableObject {@Published var workouts: Loadable<[Workout]> = .loading}

解决变更问题:单一入口点

显式状态可以防止出现相互矛盾的状态,但多个变更方法的问题怎么办?Kotlin 的解决方案是将所有操作都通过单一入口点进行处理:

fun onAction(action: DashboardAction) {when (action) {is DashboardAction.Refresh -> loadWorkouts()is DashboardAction.SelectWorkout -> selectWorkout(action.id)is DashboardAction.Delete -> deleteWorkout(action.id)}}

每一次变更都会经过 onAction(),不是部分变更,而是全部。

让我们单独看一下 DashboardAction 类:

sealed class DashboardAction {object Refresh : DashboardAction()data class SelectWorkout(val id: String) : DashboardAction()data class Delete(val id: String) : DashboardAction()data class FilterBy(val type: WorkoutType) : DashboardAction()}

这是 ViewModel 中所有动作的完整列表。一个新来的工程师打开这个文件,阅读这个类,就可以立即理解这个 ViewModel 所具备的能力。他不需要滚动阅读六百行代码,不需要猜测哪些方法是公开的,也不需要猜测一个方法是从视图调用的,还是仅在内部使用。

密封类是契约。如果一个动作没有在那里声明,ViewModel 就不能执行。这个策略也迫使你思考 ViewModel 的责任。当添加一个新的动作时,你首先将它添加到密封类中。这是一个有意识的决定,而不是一个在文件中某个地方悄悄出现的的方法。

但是,DashboardAction 中到底应该放入什么?如果视图可以触发一个动作,那么它就应该被声明为一个动作。用户是否通过点击删除一个项?用户是否选择一个项?哪些项会被保留?内部辅助函数,比如 loadWorkouts(),只从 perform()内部调用。它是一个私有方法,不是一个 Action。Action 是.refresh。内部发生什么属于实现细节。

enum Action {case refreshcase selectWorkout(String)case delete(String)}// 不是动作 —— 内部实现 private func loadWorkouts() async {...}private func updateCache(_ workouts: [Workout]) {...}

如果你已经编写 iOS 应用程序多年,会感觉这种模式没有必要。明明可以直接调用那个方法,为什么还要将所有操作都通过一个方法来进行。当团队很小,只有三五个 Screen 时,这并不重要。但随着团队和代码库的增长,这会变得很重要。传统的 iOS 模式优化了简单的情况,比如使用 @StateObject、@Published,以及直接调用方法。这样既便于理解,又能加快编码速度。苹果的示例代码就是这样的,因为代码示例很小。

但是,当你想进行扩展时,那些直接调用的方法就有问题了。每个方法都是一个潜在的入口点。每个入口点都是可以改变状态的地方。入口点越多,你的 ViewModel 就越难理解。

随着代码库规模的增长,将动作集中处理会便于实现一些难以管理的任务,包括日志记录、调试、测试和分析。

日志记录

只需在基类中添加一行代码,你就可以监控所有 ViewModel 的动作,而无需在多个方法中添加打印语句。

func perform(_ action: Action) {print("[(Self.self)] Action: (action)")// 处理动作……}

调试

如果状态错误,那么你只需要在 perform()中设置一个断点,就可以看到产生当前状态的确切动作序列。将这种方法与在十个不同的方法中设置断点做下比较,孰优孰劣就一目了然了。

测试

测试变得可读。因为每个动作都通过相同的执行路径,你正在测试的就是真实应用程序使用的代码路径。

viewModel.perform(.refresh)viewModel.perform(.selectWorkout("123"))viewModel.perform(.delete("123"))XCTAssertEqual(viewModel.state.workouts, .finished([]))

分析

每个用户交互都会被自动捕获。

func perform(_ action: Action) {analytics.track(action)// 处理动作...}

这个函数本身并不是什么新鲜东西。这是 Android 开发中的标准实践,也是谷歌官方架构指南中推荐的写法。Android 开发人员称之为单向数据流事件下行(View → ViewModel → Repository)和状态上行(Repository → ViewModel → View)。onAction()方法是向下流动的入口点。

谷歌提供的“Now in Android”示例应用就使用了这种模式。大多数 Kotlin 社区也是如此。当 Android 开发人员加入一个新项目时,他们就会想到要找一个 Action 枚举和一个 onAction()方法。

Swift 实现

以下是将这种模式带到 iOS 的方法:

class ViewModel: ObservableObject {@Published private(set) var state: Stateinit(state: State) {self.state = state}func perform(_ action: Action) {// 在子类中覆盖}func updateState(changing keyPath: WritableKeyPath, to value: some Any) {state[keyPath: keyPath] = value}}

状态可以从任何地方读取,但只能从 ViewModel 内部写入。这种方法强制执行单向数据流,View 可以读取状态,但不能直接修改它。所有状态变更都通过 perform()进行。

你可以将这种方法定义为一个扩展,但基类为你提供了一个放置共享逻辑的地方,比如日志记录、分析和常见的状态更新模式。每个 ViewModel 都会继承那个行为。

以下是使用了该模式的一个完整的 ViewModel:

class DashboardViewModel: ViewModel {struct State {var workouts: Loadable<[Workout]> = .loadingvar selectedTab: Tab = .dashboard}

enum Action{    case refresh    case selectTab(Tab)    case deleteWorkout(String)}override func perform(_ action: Action) {    switch action {    case .refresh:        Task {            await loadWorkouts()        }    case .selectTab(let tab):        updateState(\.selectedTab, to: tab)    case .deleteWorkout(let id):        Task {            await deleteWorkout(id)        }    }}private func loadWorkouts() async {    updateState(\.workouts, to: .loading)    do {        let workouts = try await repository.fetchWorkouts()        updateState(\.workouts, to: .finished(workouts))    } catch {        updateState(\.workouts, to: .error(error))    }}private func deleteWorkout(_ id: String) async {    // 实现}
复制代码

}

注意代码结构:

State 是一个包含所有 ViewModel 数据的结构体 Action 是一个包含用户所有可能意图的枚举 perform()是可以路由到不同私有方法的单一入口点私有方法执行实际的工作

Action 枚举是公共契约。私有方法是实现细节。看到这个文件时,你立即就知道它的作用。

Screen vs. View:缺失的层

我们已经解决了状态管理和动作路由,但还有另外一个问题:紧耦合。视图拥有 ViewModel,这破坏了预览并限制了可重用性。

请看下面这个标准的视图:

struct DashboardView: View {@StateObject private var viewModel = DashboardViewModel()var body: some View {ScrollView {switch viewModel.workouts {case .loading:ProgressView()case .finished(let data):WorkoutList(data)case .error(let error):ErrorView(error)}}}}

这个视图做了两项工作:拥有一个 ViewModel(创建它,持有引用,并观察变化)和渲染 UI(布局视图和处理 switch 语句)。

预览问题

尝试在 Xcode 中预览这个视图:

#Preview {DashboardView()}

视图创建了一个真实的 ViewModel。ViewModel 可能会访问网络。它可能需要预览上下文中不存在的依赖项。因此,它可能会崩溃。

所以你开始分析导致问题的原因:

#Preview {DashboardView(viewModel: MockDashboardViewModel())}

但是,现在你需要一个模拟的 ViewModel,但因为你已经修改了初始化器,所以模拟的 ViewModel 维护起来很繁琐,或者你完全放弃预览。许多 iOS 开发者确实放弃了预览。

预览变成了一个你尝试过一次,发现不可靠,然后就放弃的功能。

可重用性问题

假设你希望在两个位置(仪表板和搜索结果界面)显示相同的训练列表。在当前架构下,你无法复用 DashboardView,因为它会创建专属的 DashboardViewModel。

你可以只提取列表:

struct WorkoutList: View {let workouts: [Workout]var body: some View {...}}

但现在你失去了正在加载和错误状态,所以你得多提取一些内容:

struct WorkoutListContainer: View {let state: Loadable<[Workout]>var body: some View {switch state {case .loading:ProgressView()case .finished(let data):WorkoutList(data)case .error(let error):ErrorView(error)}}}

现在,你有了 DashboardView、WorkoutList 和 WorkoutListContainer。提取什么并没有明确的原则。当另一名开发者查看这个试图时,不知道应该遵循哪种模式。

Kotlin 是如何解决这个问题的

在应用示例 Now in Android 中,有一个标准模式:将 Screen 与 Content 分开。Screen 是一个封装器,拥有 ViewModel,而 Content 是一个只渲染 UI 的可组合组件。

@Composable fun DashboardScreen(viewModel: DashboardViewModel = hiltViewModel()) {val state by viewModel.state.collectAsState()DashboardContent(state = state, onAction = viewModel::onAction)}

@Composable fun DashboardContent(state: DashboardState, onAction: (DashboardAction) -> Unit) {// 纯 UI 渲染 Column {when (state.workouts) {is Loading -> CircularProgressIndicator()is Success -> WorkoutList(state.workouts.data)is Error -> ErrorMessage(state.workouts.message)}}}

在 Kotlin 中,可组合组件 Contenth 很容易预览:

@Preview @Composable fun DashboardContentPreview() {DashboardContent(state = DashboardState(workouts = Success(sampleWorkouts)), onAction = {})}

谷歌在 Android 应用示例 Now in Android 中始终使用了该模式。

将这个模式带到 iOS

我们可以在 SwiftUI 中做相同的分离。首先是 Content,一个接受状态和动作处理器的视图:

struct DashboardContent: View {let state: DashboardViewModel.Statelet onAction: (DashboardViewModel.Action) -> Voidvar body: some View {ScrollView {switch state.workouts {case .loading:ProgressView()case .finished(let workouts):WorkoutList(workouts, onAction: onAction)case .error(let error):ErrorView(error, onRetry: { onAction(.refresh) })}}}}

请注意,这里没有 @ObservedObject,没有 @StateObject,也没有 ViewModel 引用,只是输入数据,输出 UI。

现在是 Screen,一个拥有 ViewModel 的封装器:struct DashboardScreen: View {@StateObject private var viewModel: DashboardViewModelinit(viewModel: DashboardViewModel) {_viewModel = StateObject(wrappedValue: viewModel)}var body: some View {DashboardContent(state: viewModel.state,onAction: viewModel.perform).onAppear {viewModel.perform(.refresh)}}}

Screen 监视 ViewModel 并传递状态,而 Content 并不知道其存在。

一个通用的 Screen 封装器

Screen 可以是一个可重用的通用组件:

protocol ViewModeling: ObservableObject {associatedtype Statevar state: State { get }}struct Screen: View {@ObservedObject var viewModel: VMlet content: (VM.State) -> Contentvar body: some View {content(viewModel.state)}}

现在,任何 Screen 都变成了这样:

struct DashboardScreen: View {@ObservedObject var viewModel: DashboardViewModelvar body: some View {Screen(viewModel: viewModel) { state, onAction inWorkoutList(state.workouts) { viewModel.perform(.action) }}}}

数据流链

我们已经介绍了单个的模式。现在,让我们看看如何把它们组合成一个包含不同层次的完整系统。图片: https://uploader.shimo.im/f/h3rogRowE3edWA1j.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE3NzI2NzM4NzUsImZpbGVHVUlEIjoielc0N1B2WElKV2lWbVZIRyIsImlhdCI6MTc3MjY3MzU3NSwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwicGFhIjoiYWxsOmFsbDoiLCJ1c2VySWQiOjk5Mjg1NjY5fQ.IGTJOsC9pm9pSdRX5qFhibMlFxdeMaH7-89CUpcEGFs 图 1:从视图到 API 的关系。

图 1 显示了从视图到 API 的下行关系:

View → ViewModel → Repository → RemoteSource → API

反过来则是状态回流:

API → RemoteSource → Repository → ViewModel → View

每一层都只知道它下面的一层。视图不知道 Repository 的存在。Repository 也不知道视图的存在。依赖仅指向一个方向。

为什么要分这么多层?因为每一层都可以独立测试、模拟和替换。将 RemoteSource 替换为假的源,Repository 就可以离线工作。将 Repository 替换为模拟库,ViewModel 测试就不会触及网络。

// ViewButton(onClick = { viewModel.onAction(Action.Refresh) })

// ViewModelfun onAction(action: Action) {when (action) {is Action.Refresh -> viewModelScope.launch {_state.value = State(workouts = Resource.Loading)_state.value = State(workouts = repository.getWorkouts())}}}

// Repositorysuspend fun getWorkouts() = remoteSource.fetchWorkouts()

// RemoteSourcesuspend fun fetchWorkouts() = api.getWorkouts().map { it.toDomain() }

iOS 等效实现// ViewButton("Refresh") { onAction(.refresh) }

// ViewModelclass DashboardViewModel: ViewModel {private let meRepo: MeRepository

init(dependencies: Resolver) {    self.meRepo = dependencies.resolve(MeRepository.self)!    super.init(dependencies: dependencies, state: State())}override func perform(_ action: Action) {    switch action {    case .refresh:        updateState(changing: \.workouts, to: .loading)        Task {            let data = try await meRepo.fetchTrainingLoad()            updateState(changing: \.workouts, to: .finished(data))        }    }}
复制代码

}

// Repository Layerprotocol MeRepository {func fetchTrainingLoad() async throws -> [TrainingLoad]}

class MeRepositoryImpl: MeRepository {private let remoteSource: MeRemoteSource

init(dependencies: Resolver) {    self.remoteSource = dependencies.resolve(MeRemoteSource.self)!}func fetchTrainingLoad() async throws -> [TrainingLoad] {    try await remoteSource.fetchTrainingLoad()}
复制代码

}

// Remote Source Layerprotocol MeRemoteSource {func fetchTrainingLoad() async throws -> [TrainingLoad]}

class MeRemoteSourceImpl: MeRemoteSource {private let api: API

init(api: API) {    self.api = api}func fetchTrainingLoad() async throws -> [TrainingLoad] {    let response = try await api.query(TrainingLoadQuery())    return response.me?.trainingLoad.map { TrainingLoad(from: $0) } ?? []}
复制代码

}

反应式 Repository 模式

这里才是前面介绍的架构真正亮眼的地方。

想象这样一个场景。你的应用有两个 Screen:一个是锻炼列表和一个是锻炼详情。用户打开一个锻炼项目,编辑名称,然后返回列表,而列表上显示的仍然是旧名称。为什么?因为每个 Screen 都有自己的数据副本。详情 Screen 修改了它的副本,但列表 Screen 不知道那里发生的任何变化。SwiftUI 的 @Binding 解决了简单的父子关系。你也可以传递一个回调,发布一个通知,或者在 onAppear 中刷新。但是,一旦你有三个 Screen,或者相互独立的特性需要相同的数据,这些就都不适用了。你需要一个唯一的数据源。

Repository 拥有数据

如果有且仅有一个数据副本呢?每个 Screen 都观察那一个副本。更新一次,每个 Screen 都能看到变化。

这就是反应式 Repository 模式的作用。以下是它在 Swift 中的实现:

class WorkoutRepository {protocol WorkoutRepository {var workoutsPublisher: AnyPublisher<[Workout], Never> { get }func updateWorkoutName(id: String, newName: String) async throws}final class WorkoutRepositoryImpl: WorkoutRepository {private let remoteSource: WorkoutRemoteSource@Published private var workouts: [Workout] = []var workoutsPublisher: AnyPublisher<[Workout], Never> {$workouts.eraseToAnyPublisher()}init(remoteSource: WorkoutRemoteSource) {self.remoteSource = remoteSource}func updateWorkoutName(id: String, newName: String) async throws {// 1. 更新后台try await remoteSource.updateWorkout(id: id, name: newName)// 2. 更新本地状态if let index = workouts.firstIndex(where: { $0.id == id }) {workouts[index].name = newName}// 所有观察者将通过 @Published 自动收到通知}}

Repository 保存数据,ViewModel 订阅它:

class WorkoutListViewModel: ViewModel {private let repository: WorkoutRepositoryprivate var cancellables = Set()init(repository: WorkoutRepository) {self.repository = repositorysuper.init(state: State())repository.workoutsPublisher.sink { [weak self] workouts inself?.updateState(.workouts, to: .finished(workouts))}.store(in: &cancellables)}}

两个 ViewModel 观察相同的数据源。当 Repository 更新时,两者都会接收到新数据,无需回调、通知或手动刷新。测试时只需注入模拟数据。

单一数据源原则

谷歌的架构指南将此称为“单一数据源”原则。对于任何数据片段,都有一个唯一的所有者,其他人都观察它的变化。

锻炼数据?由WorkoutRepository拥有用户资料?由UserRepository拥有设置?由SettingsRepository拥有

ViewModel 不拥有数据。它们观察数据并将其暴露给 View。当它们需要更改某些内容时,它们会向 Repository 发起请求。Repository 更新其状态,而更改会传播给所有观察者。

完整流程

用户编辑锻炼项目名称:

DetailViewModel.perform(.updateName("New Name"))DetailViewModel 调用 repository.updateWorkoutName(...)Repository 连接远程源并更新后台 Repository 更新其 @Published 锻炼项目数据 ListViewModel 通过订阅接收新的锻炼项目数据 DetailViewModel 通过订阅接收新的锻炼项目数据两个视图都使用新名称重新渲染

一次更新即可实现自动传播。如果需第三个显示锻炼数据的 Screen,只需订阅该 Repository 即可,而无需修改其他任何地方的代码。

正是这种模式让大型应用变得可控。如果没有它,你就要在数十个界面间与过时数据玩打地鼠游戏。

结论

好的架构可以超越平台。通过采用已经在 Android 生态系统中得到验证的模式,包括显式状态管理、基于动作的更新、Screen 模式、分层数据流和反应式 Repository,我们构建出的 iOS 应用将具备如下特性:

可维护性,具有清晰的关注点分离可测试性,每一层都可以模拟可扩展性,无论有五个 Screen 还是五十个 Screen,该模式都适用可预测性,单向数据流使调试变得简单

我们不需要重新发明轮子。我们可以学习其他地方的有效做法,并将其适配到我们的平台上,获得更清晰的代码,使应用程序不会因自身的规模增长而崩溃。

声明:本文为 InfoQ 翻译,未经许可禁止转载。

原文链接:https://www.infoq.com/articles/kotlin-scalable-swiftui-patterns/

在数字化转型浪潮中,企业级 Web Excel 的多人实时协同能力已成为提升团队协作效率的关键。传统 Excel 的“文件传阅”模式易导致版本混乱、数据冲突,而企业级解决方案需攻克数据一致性、实时性能与协作感知三大技术难题。本文将从技术架构、核心算法与工程实践三个维度,解析如何实现真正的企业级实时协同。

一、技术架构:分层解耦的协同框架
企业级 Web Excel 的协同能力需构建于分层解耦的技术框架之上,以 SpreadJS 为例,其协同架构包含以下核心模块:
通信层(js-collaboration)
基于 WebSocket 协议实现双向数据同步,支持“房间(Room)”机制隔离不同部门或项目的协作环境。通过心跳检测与自动重连机制,确保企业网络环境下的稳定性。例如,财务部与销售部的协同数据完全隔离,避免跨部门操作干扰。
同步逻辑层(js-collaboration-ot)
引入操作转换(OT, Operational Transformation)算法,将用户操作转化为原子化的“操作意图(Op)”,而非直接同步结果。例如,当用户 A 修改单元格 A1 的公式时,系统同步的是“修改公式”这一操作,而非最终计算值,从而避免因网络延迟导致的数据不一致。
状态共享层(js-collaboration-presence)
通过光标定位与文本高亮技术,实时显示其他用户的编辑位置与操作区域。例如,当用户 B 正在编辑某区域时,该区域会以特定颜色高亮显示,并附带用户名标识,避免多人同时修改同一单元格。

二、核心算法:从操作到变更集的精妙设计
原子化操作(Op)
每次用户操作(如设置值、添加行、调整缩放)均被记录为不可分割的原子操作。例如,批量插入 100 行数据会被拆解为 100 个独立的“添加行”操作,确保每个操作的独立性。
变更集(ChangeSet)封装
单步模式:简单操作(如单个单元格修改)直接生成变更集并推送,适用于即时性要求高的场景。
批处理模式:复杂操作(如初始化报表时的批量配置)通过 startBatchOp() 和 endBatchOp() 封装为单个变更集,减少 WebSocket 通信次数,提升性能。例如,初始化一个包含 10 万行数据的报表时,批处理模式可将通信次数从 10 万次降至 1 次。
冲突解决机制
OT 算法通过“转换函数”协调不同客户端的操作顺序。例如,当用户 A 与用户 B 同时修改同一单元格时,系统会根据操作时间戳与用户权限,决定最终保留的操作,并通过变更集同步至所有客户端,确保全局数据一致性。

三、工程实践:企业级场景的深度优化
性能优化:应对万行级表格挑战
增量同步:仅同步发生变化的单元格或区域,而非整个表格。例如,当用户仅修改第 100 行的数据时,系统仅推送该行变更,而非全部 10 万行。
虚拟滚动:对于超大型表格,仅渲染可视区域内的单元格,减少 DOM 操作与内存占用。例如,10 万行表格中,仅渲染当前屏幕可见的 50 行,其余行按需加载。
权限管控:细粒度访问控制
编辑模式:允许用户无限制编辑,操作实时同步。
查看模式:仅允许查看,但可配置本地操作(如筛选、排序),且这些操作不会同步至其他用户。例如,销售团队可查看财务报表,但无法修改数据,仅能通过本地筛选分析个人业绩。
区域授权:针对特定单元格或区域设置权限。例如,允许实习生编辑“数据录入”区域,但禁止修改“公式计算”区域。
版本追溯:类似 Git 的历史管理
通过 getOps 接口记录所有操作历史,支持按时间点回溯版本。例如,当发现数据错误时,可快速定位至特定操作并恢复至之前版本,避免手动修正的繁琐与风险。
可扩展性:开放 API 与业务逻辑集成
提供丰富的 API(如 on('connect')、on('message')),允许开发者插入自定义业务逻辑。例如,在用户提交敏感数据前,通过服务器中间件进行拦截审计,确保数据合规性。

四、案例分析:SpreadJS 在某制造企业的实践
某大型制造企业通过 SpreadJS 协同插件构建了“高性能协作中台”,实现以下突破:
跨部门协同:研发、生产、销售部门实时共享 BOM(物料清单)数据,版本冲突率降低 90%。
远程协作:全球团队通过 Web 端实时编辑报表,决策效率提升 60%。
安全合规:通过细粒度权限管控与审计日志,满足 ISO 27001 数据安全标准。

五、未来展望:AI 与协同的深度融合
随着 AI 技术的发展,企业级 Web Excel 的协同能力将进一步升级:
智能冲突预测:通过机器学习分析用户操作习惯,提前预警潜在冲突。
自动化协作流程:AI 根据业务规则自动分配权限、触发审批流程,减少人工干预。
自然语言交互:用户可通过语音或文本指令完成协作操作,降低使用门槛。

结语
企业级 Web Excel 的多人实时协同已不再是大型云厂商的专利。通过分层解耦的技术架构、OT 算法的精妙实现与工程实践的深度优化,企业可构建出高性能、高安全、高灵活的协同中台。告别“文件传阅”的混乱,拥抱“所见即所得”的团队协作新时代。

导语:

当大多数开发者和安全团队仍把注意力集中在NPM、PyPI等传统组件仓库时,攻击者已经悄然开辟了新的“蓝海”。

2月28日,墨菲安全研究院发布了《2025年度软件供应链投毒风险研究报告》。

报告中明确指出,攻击边界正从传统仓库向更广泛的开发者生态“外延”。其中,IDE插件与AI工具链已成为值得警惕的新兴攻击面

一、IDE与浏览器插件:开发者最信任的“桌面后门”

开发者日常使用的VSCode、Chrome等工具中的插件和扩展,因其权限高、更新频繁且易于被信任,正成为投毒攻击的完美载体。

报告揭示,这类攻击往往直接面向海量普通用户,危害范围更广。

典型案例:浏览器插件中的“隐形收费站”

报告记录了发生在2025年11月的两起针对浏览器插件的典型投毒事件:

  • Safery: Ethereum Wallet 插件:攻击者在插件代码中,直接嵌入了自己控制的硬编码助记词。当用户使用该插件进行Sui交易签名时,会隐蔽地泄露用户的种子短语,从而导致钱包完全控制权的丧失。
  • Crypto Copilot Chrome扩展:该插件则更为直接。它会在用户进行Solana交易时,偷偷窃取交易金额的一部分(报告披露为最小0.0013 SOL或0.05%),并将其转移到攻击者控制的钱包地址。这无异于在用户的交易链路中设置了一个“隐形收费站”。

报告分析认为,插件市场相对宽松的审核机制、研发人员对插件的高度信任,以及企业传统EDR、杀毒软件对此类“桌面资产”的覆盖盲区,共同构成了这一攻击面的结构性脆弱性。

二、AI开发生态:“人工智能”正在制造“人工风险”

随着大模型应用的爆发,AI开发生态迅速成为新的高风险攻击面。攻击者正利用AI开发过程中的新特性,创造全新的投毒向量。

典型案例:“AI幻觉投毒 (Slopsquatting)”

报告首次详细阐述了“AI幻觉投毒”这一新型攻击模式。其原理是:

    • AI代码助手(如OpenCode, Claude Code等)在为开发者生成代码或推荐依赖时,有时会“幻觉”出一些听起来合理但实际上并不存在的包名;
  1. 攻击者则利用这一点,通过大规模分析和预测,提前抢注这些AI可能“幻觉”出的包名,并将其发布为恶意包;
  2. 当开发者信任AI的推荐,直接复制并执行安装命令时,便会精准地踩入攻击者预设的陷阱;

报告中以graphalgo为例,当AI误推荐这个包作为图算法库时,提前布局的攻击者便能成功投毒。这标志着攻击者已开始利用AI本身的“不确定性”来制造安全风险。

此外,针对AI开发生态的攻击还包括大量仿冒知名AI平台SDK的行为,例如报告中提到的deepseeek (仿冒DeepSeek)、@majiajun7/claude-code (仿冒Claude) 等,它们的目的都是在开发者调试阶段窃取API密钥和源代码。

三、总结:边界正在消失

从NPM到VSCode,从PyPI到Chrome,再到新兴的AI工具链,软件供应链的攻击边界正在以前所未有的速度向外延伸。

报告的核心结论之一就是“边界外延”,这也警示我们,软件供应链的每一个可信任环节,都已成为潜在的攻击入口。

企业和开发者必须重新审视自己的安全防御体系,它是否还仅仅停留在保护服务器和网络?是否覆盖到了每一位研发人员的桌面环境?是否对AI带来的新型风险有所准备?

这份《2025年软件供应链投毒风险研究报告》对新兴攻击面的风险、典型案例和演变趋势进行了深入分析,并为企业提供了包括“强化研发人员终端安全管控”、“建立开源资产管理台账”在内的系统性治理建议。

扫描下方二维码,可获取完整版PDF报告。

想使用 Google AI Studio 的 Gemini API, 现在一直是 Free Tire, 网上说国内申请的双币信用卡也不行,发卡地是国内所以不能用。虚拟信用卡页不行。有没有大佬指路一下如何解决。

PS: 已经搞到了 Gemini AI Pro 订阅,网页可以使用 Gemini 3.1 Pro 模型了,但是 API 还不行。

自从用上 Cursor 的 debug 模式,真的感觉变成一个可用的下属了。

能帮你把加调试日志、跑调试流程、分析日志并修改代码这个闭环近乎全自动的跑起来。

用了一年 Cursor 只会问问题然后粘贴代码的人表示这波提升是质的飞跃。

感觉这个 debug 的服务,每个月就算续 20$也挺值得的了。

在数字化转型与信息安全并重的今天,企业对IM工具的需求已经从单纯的聊天转向了深度协同与自主可控。

根据国家数据局及相关研究机构的最新数据显示,截至 2024 年底,我国手机网民规模已达 11.05 亿人,网民使用手机上网的比例高达 99.7%。与此同时,2024 年中国协同办公市场规模已跨越 370 亿元大关,而整个信创产业市场规模也已突破 1.78 万亿元,呈现出爆发式增长态势。

然而,随着生成式人工智能用户规模在 2024 年突破 2.49 亿,协作工具正面临前所未有的安全挑战。公有云 IM工具虽然方便,但在面对数据主权、内网办公以及国产化环境适配时,往往存在局限。对于“2+8”等关键行业的政企单位而言,私有化部署正从一种技术偏好转变为保障核心数字资产安全的战略底座

这里撰写本文的初衷,是基于当前政企信创转型的迫切需求,但市场上却没有比较好的文章做深度、专业的介绍。所以我想通过对国内市场4款国产私有化即时通讯 IM 工具的多维剖析,为决策者提供一份清晰的选型参考框架。本文不仅聚焦功能层面的比拼,更深入探讨在信创加速期,企业如何构建一个可随业务“生长”且高度自主可控的协同门户。

一、四家支持私有部署的 IM 工具产品对比

为了更直观地展示差异,以下是各产品在几个关键维度的简要对比:

二、如何根据场景选择?

在对比了以上产品后,可以发现没有“唯一最佳”的选择,关键在于匹配自身需求。

喧喧:在平衡轻量化、开放性、信创深度适配及综合成本方面表现较为突出。其微内核架构确保了基础运行的效率,而插件化与开源策略为企业的长期数字化演进提供了灵活空间。对于正处于信创转型期,且希望拥有一个可随业务“生长”的协同底座的中大型政企或技术驱动型公司,喧喧是一款值得重点评估的产品。

信呼:是预算有限、具备较强技术能力并希望完全掌控源代码团队的务实选择。

蓝信:则适用于对安全合规有极端要求、组织规模庞大且需要成熟“交钥匙”解决方案的大型政企机构。

环信:分别满足了追求纯粹高效沟通和需要在自有应用中嵌入成熟IM能力的特定场景。

三、四家支持国产私有化部署的 IM 工具详细介绍

1、喧喧:轻量、开放、全平台适配的信创方案

喧喧是一款值得重点考虑的产品,尤其适合注重轻量化、高扩展性以及对信创环境有深度适配需求的企业。它不仅是一个聊天工具,更是一个可灵活定制的协同平台。

核心架构:微内核与插件化设计

喧喧采用微内核与插件化设计。微内核意味着核心服务彼此隔离,单个插件故障不易导致整个系统崩溃,从而确保了基础的稳定性。其核心代码较为精简,并通过插件系统实现功能扩展。企业可以根据业务需求,像搭积木一样增加功能模块,如审批、任务管理等,避免了传统 IM 工具常见的功能臃肿问题。

部署方式与安全特性

喧喧支持多种私有化部署方式,包括 Docker 容器化部署、物理服务器部署等。企业可以将其部署在自己的服务器或内网环境中,确保数据自主掌控。据了解,在测试部署时,基于其提供的 Docker 镜像,在一台配置为 4核8G 内存的国产化服务器上,大约在 30 分钟内即可完成基础环境的搭建。在安全方面,喧喧提供了传输加密与存储加密机制,以满足企业内部的安全管理要求。

信创适配与多端体验

在信创适配方面,喧喧对国产操作系统(如统信 UOS、麒麟 OS)和国产 CPU 架构(如 ARM、龙芯)提供了较为全面的支持,并进行了针对性优化。其客户端覆盖 Windows、macOS、Linux 及移动平台,并保持了较高的操作一致性。

扩展性与开放性

喧喧秉持开放原则,提供了丰富的 API 接口和开发文档。对于有研发能力的企业,可以利用其 API 实现与现有 OA、ERP 等业务系统的深度集成,将其打造为统一的工作入口。其开源代码也提供了更高的定制透明度。

2、信呼:开源协同办公系统

信呼是一款在开源社区知名度较高的协同办公 IM 系统。其最大的特点是完全开源,给予了企业极大的自主权。

信呼采用开源协议,赋予了企业查看和修改源代码的自主权。它不仅提供即时通讯功能,还内置了考勤、任务、公告等常见的 OA 模块。对于预算有限但拥有技术团队的机构,信呼是一个可以深度定制的起点。

信呼的界面设计风格较为传统。在处理大规模组织架构同步或高并发消息时,可能需要进行额外的数据库和服务器性能调优。其在国产化操作系统上的原生体验优化,相较于专门针对信创优化的产品,可能略显不足。

3、蓝信:专注于大型组织的安全协同平台

蓝信在政务和大型国企市场拥有广泛的应用。国内很多协同办公研究报告,在政企私有化协同办公领域,蓝信市场份额位居前列。

蓝信的安全等级高,通过了多项国家级的安全认证,支持三员管理机制,能够满足极其严苛的安全审计要求。其私有化部署方案成熟,能够支持数万甚至数十万规模的用户同时在线。蓝信还提供了丰富的业务中台能力,方便大型企业进行数字化转型。

由于定位于大型组织,蓝信的部署成本和授权费用相对昂贵,对于中小型企业来说门槛较高。

4、环信即时通讯追求极致沟通体验的实力派

环信即时通讯在行业内以其媲美主流公有云 IM 的用户体验而受到好评。它的交互设计非常成熟,几乎不需要任何培训即可上手。

环信即时通讯支持多端同时在线且消息实时同步,其私有化版本在处理图片、语音和视频通话时表现稳健。环信即时通讯还提供了较为完善的 SDK,方便企业在自有的 APP 中嵌入 IM 功能。其组织架构的展示方式非常直观,适合层级复杂的企业。

环信即时通讯的主要局限性在于它是API,企业如果作为内部协同办公柜,它需要大量的开发工作,并且其对第三方应用的生态支持还不够丰富。虽然基础沟通功能强大,但在作为企业统一门户的功能深度上,与飞书或喧喧相比还有差距。

结语

选择一款合适的私有化部署 IM 工具,不仅是选择一个沟通软件,更是规划企业数字协作基础设施的重要决策。在强调数据安全与自主可控的当下,需要企业结合自身的组织规模、技术能力、信创要求、预算成本以及未来扩展性进行综合权衡。建议在决策前,通过官方渠道(如产品官网、GitHub仓库或官方文档)获取最新信息,并尽可能申请试用或概念验证(PoC),以获得更直接的使用体验。希望本文的分析能为您提供一个清晰的选型参考框架。

看到 openclaw 和 seedance 还有各种 ai ,我在想有没有可能用 ai 生成元素素材,然后用千问豆包生成剧本,然后再移植一些经典游戏的元素关卡,好像也不是很难?尤其是养成类的,也不用啥太复杂的关卡

btw 最近迷上了潜水员 dave ,像素风格,每天都想下水潜水 5 小时叉鱼哈哈哈。有类似的能不能也推荐给我

如果可行,我想顺便去参加这个软件合成比赛,还能那个几千鼓励金
https://www.moonbitlang.cn/2026-scc

有没有好心人告诉我可行性,或者让我趁早放弃了这个念头

有感于今天的热帖 QQ 音乐吃相太难看了。
微信读书和 QQ 音乐腾讯视频像是两个维度的产品,很难想象是一家公司旗下的,平时骂张小龙,微信读书这里他确实比较克制了,当然,目前也比早些年塞进了很多东西,但是比市面上其他的读书 app 还是好很多了。
QQ 音乐,那简直是无力吐槽。

第一个月 10mg ,第二个月换成 20mg

体重减少 10kg ,体脂率减少 3%,肌肉率增加 2.9%,换算下来脂肪减少了 5-6kg

这些数据来源于小米体脂秤 s400 ,1 月的初次检测结果和医院的人体分析仪数据接近,因此我认为数据可靠。

Matrix 首页推荐 

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。 

文章代表作者个人观点,少数派仅对标题和排版略作修改。

关联阅读


F1,入坑时机很重要

如果一场赛车比赛一开始就知道谁会赢,两小时的比赛所有人都按照发车名次一圈一圈跑完,你肯定会觉得无聊。在过去的十几年 F1 赛事里,大多数年份都或多或少存在这种现象,要解释这个问题也不难。

F1 比赛的胜利,综合了赛车性能、车手、车队策略等很多复杂的因素,由于车队策略和车手都是「相对」稳定且水平接近的,于是真正的差距就体现在了赛车上,一旦某支车队的赛车找到了关键的性能突破口,就可以每圈比其他竞争对手快上零点几秒,在比赛中,竞争对手只能徒劳地看着他一骑绝尘地拉开差距。

由于 F1(Formula 1)的底层要求是,所有车队基于同一套技术规则要求设计赛车,相当于所有人同时解一道方程(Formula),比的就是谁能找到最优解,答案越接近最优解,赛车就越快,但是题目出久了,先摸索到方向的车队就会越来越快,逐渐拉大和其他人的差距(因为其他人可能还需要不断试错),导致比赛完全失去悬念。例如 2023 年红牛车队在全年的比赛中,仅仅输了一场,在其他比赛中均以断崖式的领先获得冠军。

如果你是一名新入坑的车迷,肯定是不想在一整年里都看到这样没有悬念的无聊比赛的。

Cadillac
红牛车队的维斯塔潘在 2023 年以压倒性优势赢下了当年的绝大多数比赛

为什么 2026 年的比赛一定好看?

因为上面描述的「无聊的比赛」真的会导致大家不愿意看比赛、不愿意买票,这些都会导致 F1 整个赛事的收入下跌,于是 FIA 每隔几年就会改变一次规则,相当于重新出题(Formula),强迫所有车队回到同一起跑线。

而 2026 年就是这样,FIA 重新制定了空气动力学规则、改变了动力单元的配置要求,并且有奥迪和凯迪拉克加入,可以说集齐了所有变量,足够让新赛季拥有一个混乱又有趣的开局,2026 年的揭幕战胜利,可能属于任何人!

上次 F1 进行类似的规则变更,是在 2022 年,大半个赛季里比赛都充满了戏剧性,揭幕战就有赛车因为调教问题爆缸退赛,全年有来自 3 支车队的 5 位车手拿到过分站冠军。

新车迷该怎么入坑?

比赛安排

F1 是为数不多的全球赛事,每一场比赛都会在一个不同国家的不同赛道举办,因此每场比赛的时间都会根据当地时间有所调整。

一场比赛通常会包含三个比赛日1,从当地时间的周五到周日,周五会举办两场练习赛,周六会举办一场练习赛和一场排位赛,周日是正式计分的正赛2

IMG_2358 2

练习赛是供车队和车手不断调整、测试赛车的时间,确保赛车和车手能够适应赛道条件、达到最佳水平。

排位赛决定了正赛的发车顺序,共分为三节淘汰赛,每名车手取本节淘汰赛中最快的一圈作为成绩。第一节淘汰赛淘汰 5 人(26 年改为淘汰 6 人)、决定 16~20 名的发车位置,第二节淘汰赛淘汰 5 人(26 年改为淘汰 6 人)、决定 11~15 名的发车位置,第三节参赛的 10 人按本轮最快圈时长决定前 10 个发车顺序。

正赛是周末唯一计分的比赛,车手们按照排位赛的次序一起发车,完成数十圈、全程长达约 300 公里的比赛后,按照正赛的名次获得积分,最后通过累加全年所有的积分,来决定车手冠军和制造商冠军(车队冠军)的归属。

车队介绍

F1 在 2026 年将拥有 11 支车队,每支车队拥有 2 名车手,如果你是一名新车迷,想先找个车队看着,我会推荐法拉利、红牛、梅奔,这三支车队拥有规模更大的车迷群体,你很容易找到可以交流的同好和组织,这些能帮助你快速渡过学习 F1 知识的阶段。

接下来简单介绍一下各支车队的历史和 2026 年的阵容,便于你能快速弄懂这些开车飞快的家伙们到底是谁。

迈凯伦

image-20251114195459734

车队介绍

迈凯伦在最近两年里,是 F1 里无可争议最快的车队,如果他们愿意,他们本可以轻松同时拿下去年和今年的制造商冠军和车手冠军,但他们有自己的原则——木瓜规则。

这里稍微展开一下,一般来说如果一支车队有希望赢得车手冠军,都会尽量让队内的其中一位车手获得尽可能多的积分,把靠前的排名都通过比赛中的策略或者换位挪给这位车手,以确保在和其他车队的竞争中能够获得优势,但迈凯伦的木瓜规则反其道而行之,绝不使用类似的指令去干预车手比赛,允许两位车手完全自由的队内竞争,而他们的两位车手实力又很接近,就导致 2024 赛季的车手冠军被红牛车队的维斯塔潘夺走,只拿到了制造商冠军,而现在尚未结束的 2025 赛季,也大有复刻 2024 赛季悲剧的迹象……

正是他们的独特风格,让本来可能枯燥无味的 2025 赛季充满了看点,不管其他人怎么说,我都是非常非常喜欢迈凯伦的木瓜规则的。

车手介绍

兰多·诺里斯(Lando Norris)

Norris

迈凯伦青训太子,生涯初期在迈凯伦熬了 4 年都没拿过冠军,到 2024 年才获得自己的第一个分站冠军,目前正在和队友以及红牛车队的维斯塔潘争夺 2025 年的车手总冠军。目前兰多的驾驶技巧是公认的 T1 级别,是绝对拥有冠军水准的,但相比维斯塔潘(公认唯一 T0)在比赛中犯错偏多,拿分还不够稳定,在 2025 年下半年有觉醒的趋势。

奥斯卡·皮亚斯特里(Oscar Piastri)

Piastri

这个名字里有奥斯卡的男人,在 F1 的出场就带有一丝传奇色彩。

2022 年他还在 Alpine 车队当替补车手,在赛季末动荡的人员变动中,Alpine 开除了原车手,想着皮亚斯特里的队内晋升没什么问题,于是就先官宣了,但前脚发布公告,后脚皮亚斯特里就出来辟谣说自己已经跳槽去了迈凯伦……弄出了超级大乌龙。

短短 3 年过去,皮亚斯特里已经从新秀成长为年度冠军的热门人选,今年上半年他的表现力压队友诺里斯,但下半年开局不利,逐渐丢失了领先优势,上个周末甚至被队友反超积分。从他的竞技状态来看,似乎遇到了一些心理上的问题,让他无法在赛道上发挥出全力,但本赛季仍然有争冠希望。

红牛

image-20251114195641248

车队介绍

红牛在过去的 5 年里,获得了 2 个制造商冠军和 4 个车手冠军,从两种冠军的数量差异你应该可以猜到,这支车队似乎有一位车手存在感比较弱,没拿到太多积分。

没错!红牛是一支围绕「极汽车人」维斯塔潘打造的车队!从赛车的特性、队友的选择、车队的策略、预算的分配,全部都得看维斯塔潘需要什么,这并不是贬义,而是因为维斯塔潘是公认能驾驶一台二流赛车争夺冠军的车手,无论是队友还是对手,对这一点都心服口服,红牛也清楚,一旦把维斯塔潘惹得不高兴了跑去其他车队,他是一定会在接下来几年把老东家按在地上摩擦的,绝对不能放人!

由于 2025 年上半年车队管理层内斗,影响到了赛车开发,维斯塔潘的竞技状态也受到了不小的影响,下半年车队奋起直追,挪用了原本用于 2026 年的预算放在今年继续改进赛车,赛车的性能获得了巨大的提升,在 9 月到现在的比赛中接连拿下数个分站冠军,重新燃起了争夺车手冠军的希望。

车手介绍

马克思·维斯塔潘(Max Verstappen)

Verstappen

他是有史以来最年轻的 F1 车手,也是现役综合实力最强的 F1 车手,从小就被父亲进行极其严格甚至有些虐待倾向的赛车训练,留下了不少心里阴影,但这些都没有改变他对赛车的热爱,赛车除了是他的工作以外,也是他最大的兴趣爱好。在 F1 强度这么大的赛事进行过程中,他甚至会通宵开模拟器,还抽空参加了纽北的耐力赛顺便拿了个冠军……因此,他也被广大车迷戏称为「汽车人」。

今年上半年,由于赛车的劣势,在 PolyMarket 上关于维斯塔潘夺冠的赔率一度掉至 0.5%,到了 10 月底,因为维斯塔潘一路夺冠,赔率升至了 30% 左右,可见车迷对他巨大的信心。

伊萨克·哈贾尔(Isack Hadjar)

今年刚刚进入 F1 的新秀之一,是前一年的 F2 亚军,是刚从红牛二队提升上来。今年首秀在澳大利亚失误退赛之后在赛道边哭了半天,老汉的爸爸还跑去安慰来着,后来发挥逐渐稳定,目前在本赛季的新秀车手中排第二,仅次于梅奔的 Kimi。

法拉利

image-20251114195724575

车队介绍

作为 F1 的传统豪门,法拉利拥有 16 个制造商冠军和 15 个车手冠军,但自从 2007 年以来,由于老意大利国企的传统文化,已经有 18 年没有赢过任何年度车手冠军了。

法拉利从来不缺厉害的车手,由于法拉利名声在外,总是有不少实力强劲的车手慕名而来,希望能在这支红色车队赢得一次世界冠军头衔,圆了童年的梦想(儿法梦),但往往不能如愿,由此法拉利也被车迷戏称为「世界冠军的坟墓」,已经让阿隆索和维特尔两位功成名就的世界冠军折戟在此。

但好的车手、快的赛车、不出意外的策略,似乎是不可能三角,这个奇异的百慕大三角总是萦绕在法拉利车队的上空,一次又一次捉弄着深爱着法拉利的工作人员和车迷,不知道他们能不能在 2026 年摆脱诅咒,带来一个完美的赛季?

车手介绍

刘易斯·汉密尔顿(Lewis Hamilton)

Hamilton

被称为 Goat 的传奇车手,曾经获得过 7 个世界冠军,如今来到法拉利,继续尝试挑战 8 冠的纪录。他在来到法拉利的第一个赛季遇到了不少挫折,包括和工程师语言不通的问题、驾驶风格与赛车不匹配等等,这些问题都在逐渐被解决,他也正在找回驾驶自信。

夏尔·勒克莱尔(Charles Leclerc)

Leclerc

摩纳哥的法拉利纯血王子,F1 围场中最帅的男人,从小就看着楼下的法拉利 F1 赛车长大,从童年到青年的赛车生涯都和法拉利息息相关,最后也是在法拉利青训的培养下,进入了法拉利 F1 车队,如今是他为法拉利效力的第 7 年,法拉利的起起伏伏也将他……不说了!希望勒克莱尔能够在法拉利获得属于他的世界冠军!

梅赛德斯奔驰

image-20251114195555932

车队介绍

2009 年底,梅赛德斯买下了 F1 历史上绝无仅有的、传奇的、F1 赛季胜率 100%(仅仅参加了一个赛季,拿下了这个赛季的车队冠军和车手冠军)的 Brawn GP 车队股权,正式回归 F1,之后,他们在迈克尔·舒马赫和尼基·劳达两位传奇车手的帮助下,开发出了垄断了围场几乎整个 10 年代的战车,拿下 8 个车队冠军和 8 个车手冠军,给其他车队和 F1 的收视率留下了梦魇般的 10 年。

地效时代来临后,他们曾在一段时间迷失过方向(零侧箱概念耽误了两年时间),但冠军之师的底蕴赋予了他们无与伦比的勇气和信念,如今,2026 近在眼前,梅奔一定可以重回前排!

车手介绍

乔治·拉塞尔(George Russell)

Russell

赛车皇帝,梅奔青训车手,PPT 大师,短短 4 年就成为了梅奔这支车队的一号车手,这四年时间里他驾驶着从来都没占过优势的梅奔赛车,拿下了多个分站冠军,并且赛季积分从未输给过队友(汉密尔顿/安东内利),他已经证明了自己世界冠军级别的驾驶能力,只待一台冠军级别的赛车,赋予他真正的皇冠。

安德里亚·基米·安东内利(Andrea Kimi Antonelli)

Antonelli

被梅奔领队马桶狼(Toto Walff)认为是「下一个维斯塔潘」的天才车手,梅奔给予了他极大的信任,先是在低级别方程式中跳过了 F3,又在仅参加了一年 F2 的情况下直接进入 F1 中的梅奔主队(一般会先放在客户车队历练几年再进主队,比如拉塞尔先在威廉姆斯待了 3 年,才进的梅奔),25 赛季的安东内利在上半赛季接连失利,好在车队及时进行心理疏导,他才逐渐找回驾驶手感。

顺便提一下,大家喜欢叫他 Kimi,因为这个有另一位广受喜爱的芬兰车手也叫这个——基米·莱科宁(Kimi Räikkönen)。

威廉姆斯

image-20251114195808482

车队介绍

由弗兰克·威廉姆斯爵士创建的 F1 车队,曾获得过 7 个车手冠军和 9 个车队冠军,和法拉利、迈凯伦一起被称为 F1「三大传统豪门」,目前家道中落被卖给美国财团多尔顿资本,典型的祖上阔过。

威廉姆斯实力较弱的原因是前些年没钱(所以被卖了),好不容易有钱之后 F1 又有了预算帽,于是很尴尬地钱花不出去。据说他们还在用 Excel 进行项目管理、用冷战前的车床造零件,手搓 F1 赛车,真是不容易。

好在梅奔前首席策略师 詹姆斯·沃尔斯(James Vowles)加入了这支车队,从团队管理到基础设施逐渐进行整改和重建,目前他们已经走在了稳健上升的路上。

车手介绍

亚历山大·阿尔本(Alexander Albon)

Albon

红牛青训出身的车手,由于和维斯塔潘搭档时未能很好地适应赛车,被迫加入威廉姆斯,但在威廉姆斯他无数次证明了自己的能力,并且在艰难岁月里一直帮助车队提升成绩。

他和女友何沐妮(Lily He)的关系非常好,要磕 CP 的话推荐这个。

卡洛斯·赛恩斯(Carlos Sainz Jr.)

Sainz

另一位红牛青训车手,在红牛、雷诺、迈凯伦、法拉利几个豪门都打过工,兜兜转转来到了威廉姆斯。

最出名的战绩是 2023 年在新加坡独自做策略,和迈凯伦的诺里斯配合,共同挡下身后气势汹汹的拉塞尔,成为全年唯一一场非红牛胜利的冠军,把自己的策略师都看呆了。(说实话我觉得赛恩斯从法拉利离开挺可惜的,很厉害的车手)

他的到来给了阿尔本不小的压力,在他之前阿尔本几乎没有合作过任何实力车手(都是付费车手),如果威廉姆斯的赛车性能回到第一梯队,内斗将在所难免。

小红牛/红牛二队

image-20251114195842274

车队介绍

这支车队的英文名换来换去,一会儿叫 Alpha Tauri,一会儿叫 Toro Rosso,现在叫 Racing Bulls,但不管怎么变,中文名称都叫小红牛,是红牛集团拥有的另一支车队,作为主队的试炼场,培养新进入 F1 但还没有证明自己能力的车手,几乎所有进入红牛车队的车手都要在这过一遍,就像阳澄湖大闸蟹一样。

但由于红牛这两年赛车性能不佳,车手升上去之后往往会出现成绩下滑的现象,因此晋升也变成了「下放」,导致小红牛的车手不敢表现不好,又不敢表现太好。

车手介绍

利亚姆·劳森(Liam Lawson)

Lawson

由于 24 赛季表现出色,25 赛季初曾晋升至红牛车队,并且在加入前大放厥词,说原来的红牛车手佩雷兹能力不行,好的车手就应该能够适应赛车云云,然后被自己打脸,没几场比赛就又回到了小红牛车队,现在老实多了。哈哈。

阿斯顿马丁

image-20251114195924336

车队介绍

阿斯顿马丁,又被称为「爸爸力量」车队,是劳伦斯·斯特罗尔(Lawrence Stroll)为儿子兰斯·斯特罗尔(Lance Stroll)买下的车队,曾经我们以为他只是来玩玩……没想到他请来了阿德里安·纽维(Adrian Newey)这位顶级赛车设计师,纽维设计的赛车共赢得过 12 个制造商冠军和和 14 个车手冠军,如今,他把希望带到了阿斯顿马丁。

车手介绍

费尔南多·阿隆索(Fernando Alonso)

Alonso

被称为「小将阿隆索」的传奇四冠王,以 44 岁的年龄成为现代 F1 中最年长的车手,年轻、年中、年长时因为不擅长选择车队,多次进入了无法争冠、队内关系不和谐的车队,赛车生涯中还短暂离开过 F1,参加过不同的赛事,目前在阿斯顿马丁略有继续征战 F1 的欲望,但还得看纽维能否给一台有战斗力的赛车。

兰斯·斯特罗尔(Lance Stroll)

Stroll

看上去似乎不太想继续开 F1,但他爸爸车队都给买了,又不能不开,于是就开着赛车常年在队尾徘徊。

阿尔聘

image-20251114200158787

车队介绍

成功把法式幽默带入了严肃的围场,车手场上内斗、机械师车库整活,现在又来了弗拉维奥·布里亚托利(Flavio Briatore)成为实质上的车队领队,要知道布里亚托利可是 08 年撞车门的幕后主使,向来以不守规矩闻名,谁知道他这场重回围场会把这潭水搅成什么样。

车手介绍

皮埃尔·加斯利(Pierre Gasly)

Gasly

出身自红牛青训的优秀车手,曾经因为表现优秀,成功晋升至大红牛,又在大红牛因为压力太大频频失误,被退回小红牛,后来他在小红牛成功拿下生涯第一个分冠证明了自己的实力。如今他转会至 Alpine,希望在这里获得进一步提升(认真的吗?)。

弗兰科·科拉平托(Franco Colapinto)

Colapinto

他的阿根廷粉丝战斗力强过他的车手实力,2025 赛季中 Alpine 用他换掉了表现不佳的杰克·杜汉(Jack Doohan),现在,他们俩仍然是本赛季仅有的颗粒无收的车手,孤独的挂在车手积分榜底部。

哈斯

image-20251114195956330

车队介绍

这支车队最出名的是它的前领队冈瑟·斯泰纳(Guenther Steiner),因为在《一级方程式:极速争胜》(Formula 1: Drive to Survive )中一段愤怒辱骂自家车手的片段走红,短短一分钟的视频里,把 fuck 融入了每句话,总共说了十几个 fuck,因此被网友们戏称为「英语老师」。在去年斯泰纳因为车队排名成绩持续不佳,被老板吉因·哈斯(Gene Haas)开除,目前的车队领队是原先车队的技术总监小松礼雄(Komatsu Ayao)。

车手介绍

埃斯特班·奥康(Esteban Ocon)

Ocon

围场里有这样一句话,「你首先要击败的人是你的队友。」通常是用来描述队内竞争的紧张关系的,但绝对没有人像奥康这样把这句话刻在心里,他面对每一任队友,都展示出了无比强硬的进攻和防守,为 F1 的收视率做出了不可磨灭的贡献。

奥利弗·比尔曼(Oliver Bearman)

Bearman

法拉利青训新星,和梅奔的 Kimi 一同晋升至 F1 的新秀车手,由于 24 年在赛恩斯阑尾炎期间代替出场,并在个人生涯的 F1 首秀就获得第七,这次优秀的记录帮助他获得了 25 年的 F1 正式车手席位。在 25 年全年的比赛中,他作为新秀已经获得了 40 分(截至巴西站),超过队友奥康的 30 分,未来可期。且有消息称法拉利内部有意让他接替汉密尔顿离去后的席位。

索博(奥迪)

image-20251114200117377

车队介绍

奥迪从多年前开始战略布局,到 22 年公布消息,然后逐步收购索博车队的股份,如今终于要迎来在 F1 的正式亮相,奥迪曾经在 24 小时耐力赛、拉力赛等不同的领域都有过令人瞩目的战绩,如今他们孤注一掷来到 F1(是的,奥迪把除了 F1 以外的赛车项目都停掉了),相信他们能在 F1 取得优异的成绩,跻身前排。

车手介绍

尼科·霍肯博格(Nico Hülkenberg)

Hulkenberg

霍肯博格在新秀时期,天赋足以和如今已经手握数个世界冠军的车手媲美,但命运常常不公,他在随后的 239 次 F1 生涯中都没有获得过任何领奖台,但他 15 年的坚持在 2025 年的夏天得到了回报,他在英国站通过策略成功上升到第三,最终获得了季军奖杯,成为了这个夏天令所有车迷最难忘的瞬间。

加布里埃尔·博托莱托(Gabriel Bortoleto)

Bortoleto

博托莱托在低级别方程式的表现十分耀眼,他连续在 F3、F2 中夺得冠军,是有史以来获此殊荣的第 4 位车手(前 3 位分别是勒克莱尔、拉塞尔、皮亚斯特里),在他前面的三位都已经在 F1 中兑现了自己的天赋,成为各自车队的主力车手,而博托莱托的实力,还需要交给时间来验证。

凯迪拉克

Cadillac F1 – How the FIA paved the way for an 11th team in Formula 1 :  r/formula1

车队介绍

和奥迪类似,凯迪拉克在多年的筹划之后,决定在 2026 年新规执行之际正式进入 F1,但他们并非以收购车队的方式加入,而是从头开始组建了一支纯正美国血统的新车队,他们预计会使用法拉利提供的动力单元,直到 2028 年,然后 2029 年开始使用自研的动力单元参赛,因此 2026 赛季对于他们仍然是一个帮助车队进行磨合的赛季。

车手介绍

瓦尔特里·博塔斯(Valtteri Bottas)

曾经帮助汉密尔顿获得 4 座世界冠军奖杯的车手,梅奔老将,如今来到凯迪拉克成为这支新车队的建队功勋,博塔斯除了稳定可靠的驾驶性能,还以「屁股」闻名围场,2022 年从梅奔车队离开后,他彻底放飞自我,拍摄了一系列艺术照,其中有一张全裸趴在溪流中的照片,雪白的屁股让人挪不开眼睛……他还拿着照片到处送人,嗯,挺好的。

塞尔吉奥·佩雷兹(Sergio Pérez)

Sergio Pérez's journey turbulent through Formula 1

和博塔斯的命运类似,佩雷兹是红牛车队维斯塔潘的僚机,他令人印象深刻的比赛有两场,一场是当劳伦斯斯·特罗尔买下赛点车队准备改为阿斯顿马丁车队时,佩雷兹已经失去了第二年的席位,但他抓住机会,在萨基尔大奖赛上演了令人目眩神迷的超车秀,这场胜利最终帮助他获得了第二年红牛的席位。另一场是在 2021 年全球瞩目的决定冠军归属的阿布扎比大奖赛,他成功拖住了汉密尔顿,帮助维斯塔潘获得当年的世界冠军。在 2024 赛季结束后,他因为那一年无法适应赛车,未能与红牛续约,但他一直没有放弃重回 F1 的机会,直到获得了凯迪拉克递来的门票。

比赛直播观看渠道

国内有以下几个观赛渠道:

  • 流媒体:腾讯视频/央视频
  • 传统电视台:五星体育/广东体育

海外的选择相对较多:

  • Sky Sports
  • F1 TV(部分地区可看)
  • Apple TV(美国可看)

F1 历史回顾/知识讲解

这里推荐几个我常看的 up,做的视频都能学到很多东西:

除了这些 UP 主,也顺便推荐下我自己做的账号,因为我自己在入坑 F1 时花了很久慢慢学习,由此想要做一个新人向的 F1 知识解释账号,感兴趣的可以关注一下。

辅助工具/软件

比赛日历

Picsew_20251114210653

可以直接使用「Formula 1」app 提供的功能,前往对应页面点击「添加至日历」,即可将赛程添加至手机日历,之后就可以在手机的系统日历中看到比赛信息了。

车手/比赛信息

image-20251114211106941

这类软件相对来说比较多,就推荐一个我常用的,叫「Boxbox」,可以添加关注的车手/车队,然后把小组件添加到锁屏页面,就可以随时关注车手/车队本赛季的得分情况了。

此外,Apple Sports 也会显示 F1 每场比赛的实时排名、车手与车队的赛季积分排名。也支持在比赛中用「实时活动」跟进比赛。

> 关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀

    放大招了!实现了个一个 bilibili-cli !
    使用他可以轻易的和 Skill / OpenClaw 搭配。
    利用 CLI 组合出各种各样的技能,总结视频,分析人物,等等。
    这一点上,我真的很喜欢 CLI ,就像积木一样可以拼搭出很多功能。

    给 AI 提供 更多的工具!后面还会提供更多 CLI !

    项目地址: https://github.com/jackwener/bilibili-cli

    它能做什么:

    视频信息、评论、字幕、AI 总结、相关推荐
    用户信息、用户投稿、搜索
    热门、排行榜、动态、收藏夹、稍后再看、观看历史
    点赞 / 投币 / 一键三连
    音频提取(可选依赖)

    原文: https://agentsmesh.ai/blog/building-agentsmesh-with-agentsmesh
    Github: https://github.com/AgentsMesh/AgentsMesh

    OpenAI 最近发表了一篇文章,描述他们如何用 AI Agent 在 5 个月内产出超过百万行代码。他们把这套工程实践叫做 Harness Engineering 。

    我在 50 多天前开始建造 AgentsMesh 。52 天,600 次提交,965,687 行代码吞吐,现存 356,220 行代码。一个人。

    但更值得说的不是数字,而是这件事本身的结构:我用 Harness Engineering 的方式,建造了一个 Harness Engineering 的工具。

    仓库完全开源,git history 公开。所有数字可以用 git log 验证。

    工程环境决定 Agent 的输出上限
    52 天的实际工作让我确信,Agent 的产出质量不只取决于 Agent 本身,更取决于它工作的工程土壤。这些是代码库里真实沉淀的选择。

    分层架构,让 Agent 知道在哪里改
    代码库是严格的 DDD 分层:domain 层只有数据结构,service 层只有业务逻辑,handler 层只有 HTTP 格式转换。22 个域模块,边界清晰,每个模块的 interface.go 明确定义了对外契约。

    当 Agent 需要添加新功能,它知道:数据结构放 domain ,业务规则放 service ,路由放 handler 。边界模糊的代码库,Agent 把东西放在错误的地方;边界清晰的代码库,Agent 的代码天然融合。这不是理论上的架构整洁,是 Agent 生成代码时的导航地图。

    目录结构即文档
    跨端命名完全对齐。拿 Loop 举例:backend/internal/domain/loop/ 是数据结构,backend/internal/service/loop/ 是业务逻辑,web/src/components/loops/ 是前端组件。产品概念到代码路径是直接映射,不需要搜索,目录名就是地图。

    backend 的 16 个 domain 模块( agentpod 、channel 、ticket 、loop 、runner…)和 service 层 1:1 镜像; web 的 components 按产品功能分区( pod 、tickets 、loops 、mesh 、workspace ),和 backend domain 命名对齐。一个 Agent 拿到 Ticket 相关的任务,不需要探索整个代码库,看目录就知道该动哪里。

    这个约定不是文档写出来的,是整个代码库在每次 Agent 提交时持续强化的。

    技术债务会被 Agent 指数级放大
    这是 52 天里最反直觉的发现之一。

    当你在某个模块做了一个临时性的妥协——绕过了正常的 service 层直接查数据库,或者用了一个 hardcode 的魔数——Agent 会把这个模式学走。下一次它生成类似功能的代码,它会复用这个'先例'。不是偶发的,是系统性的复制。技术债务不再是孤立的,它开始扩散。

    人工工程师遇到糟糕的代码,通常知道'这是个坑,绕开它'。Agent 不会做这个判断——它看到的是:这个代码库里有这样的模式,所以这是合法的做法。

    这意味着仓库里代码质量的信号比人写代码时重要得多。好的工程实践是主体,Agent 就放大好的工程实践;临时性的妥协是主体,Agent 就放大技术债务。

    实际的工程应对:中间多次停下来专门清理技术债务,不发新功能,只做重构。不是为了让代码'好看',是为了维护仓库里工程信号的纯度。这是 Agent 协作开发特有的维护成本,也是和传统开发节奏最大的不同之一。

    强类型作为编译期质量闸
    Go + TypeScript + Proto 。强类型把大量错误从运行时前移到编译时。

    Agent 生成了签名不匹配的函数?编译失败。Agent 修改了 API 格式忘了更新类型定义? TypeScript 直接报错。Agent 改了 Runner 的消息格式但没同步更新 Backend ? Proto 生成的代码不能编译。

    这些错误在弱类型语言里会悄悄进入运行时。强类型把它们挡在提交之前。反馈环路越短,Agent 的迭代效率越高。

    四层反馈闭环
    Agent 需要快速知道自己做错了什么。一层不够,四层刚好。而且反馈环路越短越精准,Agent 的交付结果越好。

    第一层:编译。Air 热重载,Go 代码修改 1 秒内重启; TypeScript 类型错误实时标注。语法和类型级别的错误在这层清除。

    第二层:单测。700+ 个测试覆盖 domain 和 service 层。Agent 修改后 5 分钟内知道有没有引入回归,尤其是多租户隔离这类容易被 Agent 遗漏的边界条件。

    第三层:e2e 。端到端验证真实的功能路径。覆盖 Agent 在单测里验证不到的集成边界——多个模块的真实联动。

    第四层:CI pipeline 。每个 PR 自动跑全量测试、lint 、type-check 、多平台构建验证。合并前的最后一道安全网,由机器执行,不依赖 review 者的细心程度。

    四层延迟依次增加,覆盖的错误类型依次扩大。Agent 改一行代码,第一层确认; Agent 做跨模块重构,第四层才能完整验证。

    工作树原生支持并行
    dev.sh 根据 Git worktree 名自动计算端口偏移,每个工作树分配独立的端口区间。多个 Agent 在不同工作树上同时工作,环境完全隔离,不需要手工管理端口冲突。

    这是 Pod 隔离原语在开发环境层面的延伸——同样的逻辑,从 Agent 执行环境贯穿到 Agent 开发环境。

    代码库就是 Agent 的上下文,不只是 prompt
    把上面这些放在一起,会发现它们指向同一个结论:代码库本身就是 Agent 工作时最重要的上下文。分层架构告诉 Agent 该在哪里改;目录结构告诉 Agent 该找哪个文件;技术债务的清洁程度决定 Agent 学到的是好模式还是坏模式;测试密度决定 Agent 有多大胆量重构;强类型决定 Agent 的错误能在多早被发现。

    这意味着你不需要在代码库之外额外构建上下文系统——不需要刻意去做 Context Engineering ,不需要单独搭 RAG ,不需要维护额外的 memory 文件。你需要做的,是让代码库本身成为一个高质量的上下文。仓库即 context 。

    这也是为什么 Harness Engineering 的投入方向,和传统软件工程是同一件事:写清晰的代码、保持好的架构、及时清理技术债务。区别只是目的不同——以前是为了让人类工程师更容易维护,现在同时也是为了让 AI Agent 能够可信地工作。

    认知带宽是真实的工程约束
    第 5 天左右,我撞上了一堵真实的墙,5 万行的日均代码吞吐。

    三个 worktree 同时开着,三个 Agent 在跑,我在它们之间切换做决策。加第四个,决策质量明显下降。不是感觉,是后来发现那段时间留下了几个糟糕的架构决定。

    日均 5 万行的吞吐量不是工具限制,是人类认知带宽的自然上限。你能为大约三条并行工作流做出真正的架构决策,超过这个数量,质量就开始下滑。

    突破它的方式只有一个:用委托换规模。不是给 Agent 更多任务,而是委托决策本身。让 Agent 协调 Agent ,自己上移一个层级——从监督单个 Agent ,变成监督那个监督 Agent 的系统。所以我们有了 Autopilot 模式。

    这是 AgentsMesh 的核心设计意图。也是我用它建造它自己的过程中,才真正理解的东西。

    试错成本坍缩,工程方法论需要更新
    AgentsMesh 的 Relay 架构不是设计出来的。是被生产环境打出来的。

    三个 Pod 同时运行把 Backend 打挂。我看着它崩,理解了崩溃的原因,重新建。加了 Relay 隔离终端流量。新问题出现,加了智能聚合,加了按需连接管理。最终的架构来自一次次真实故障,不是白板讨论。

    旧的工程直觉是先设计再建造——充分推演边界情况,因为出错代价高。

    当试错成本接近零,这个直觉变成了负担。

    那次 Relay 故障从发现到修复不到两天。在传统团队,这是两周的架构讨论——而且讨论一定会遗漏什么。

    AI 改变的不是写代码的速度,是整个工程过程的成本结构。当迭代足够便宜,实验驱动比设计驱动产出更好的架构,更快。架构正确的标准不是通过评审,而是扛过生产环境。

    自举验证
    AgentsMesh 的核心主张:AI Agent 可以在有结构的 Harness 下,协作完成复杂的工程任务。

    我用 AgentsMesh 建造了 AgentsMesh 。

    这是对主张最直接的检验。如果 Harness Engineering 真的有效,这个工具应该能够胜任建造自身。

    52 天,965,687 行代码吞吐,现存 356,220 行生产代码,600 次提交,一个作者。

    OpenAI 是一支团队,用了 5 个月。这不是比较——场景不同,规模不同。但有一件事是一样的:Harness 让原本不可能的产出变得可能。

    Commit history 是证据。任何工程师都可以 clone 仓库,git log --numstat ,数字不会因为谁来看而改变。

    三个工程原语
    52 天的实践和自举验证,最终收敛出三个工程原语。这不是预先设计的产品框架,是被真实的工程问题逼出来的。

    隔离( Isolation ) 每个 Agent 需要自己独立的工作空间。不是最佳实践,是硬性前提。没有隔离,并行工作在结构上就是不可能的。AgentsMesh 用 Pod 实现这一点:每个 Agent 运行在独立的 Git worktree 和沙箱里。冲突从'可能发生'变成'结构上不能发生'。而隔离同时也意味着内聚,在独立的 Pod 环境中,把 Agent 运行需要的全部上下文准备好:Repo 、Skills 、MCP and more 。实际上构建 Pod 的过程就是为 Agent 执行准备环境的过程。

    分解( Decomposition ) Agent 不擅长处理'帮我搞这个代码库'。擅长的是:你拥有这个范围,这是验收标准,这是完成定义。所有权不只是任务分配,它改变了 Agent 推理的方式。分解是任何 Agent 运行之前必须完成的工程工作。

    AgentsMesh 对分解提供了两种抽象:Ticket 对应一次性的工作项——功能开发、Bug 修复、重构,有完整的看板状态流转和 MR 关联; Loop 对应周期性的自动化任务——每日测试、定时构建、代码质量扫描,用 Cron 表达式调度,每次运行留下独立的 LoopRun 记录。两种任务形式边界清晰:做一件事,用 Ticket ;反复做同一件事,用 Loop 。

    协调( Coordination ) 我们没有使用岗位抽象来组织 Agent 的协同。传统团队需要岗位角色,是因为每个人只精通几个专业方向——前端工程师不写后端,产品经理不写代码。但 Agent 不受这个约束:同一个 Agent 可以写代码、生成文档、做竞品分析、执行测试、审查 PR ,甚至编排其他 Agent 的工作流。它的能力边界不是固定的,是通过上下文和工具配置出来的。所以 Agent 之间的协同不需要模拟人类的分工方式,它需要的是通信和权限。

    Channel 解决的是集体层次:多个 Pod 在同一个协作空间里共享消息、决策和文档。这是 Supervisor Agent 和 Worker Agent 能够形成协作结构的基础——不是群聊,是带上下文历史的结构化通信层。

    Binding 解决的是能力层次:两个 Pod 之间点对点的权限授权。terminal:read 让一个 Agent 可以观察另一个 Agent 的终端输出; terminal:write 让一个 Agent 可以直接控制另一个 Agent 的执行。Binding 是 Agent 协调 Agent 的机制——Supervisor 不是靠发消息来感知 Worker 的状态,而是靠直接看到它的终端。

    OpenAI 把相应的东西叫做 Context Engineering 、架构约束和熵管理。名字不同,解决的是同一个问题。

    开源
    Harness Engineering 是一门工程学科,而非某个产品功能。与其敝帚自珍,不如抛砖引玉。

    我们选择开源 AgentsMesh 。当我们构建的可能是一种有效的工程工具时,目标从来不是'拥有代码',而是让更多人能够在此基础上,构建出更好的工程工具。与其把可能正确的工程实践锁在产品里,不如开源它,让社区验证、演化、超越它。

    代码在 https://github.com/AgentsMesh/AgentsMesh

    当生成式 AI 不再局限于「生成文字」,而是开始真正「发出声音」,语音就从信息通道升级为可编程、可塑造的表达媒介。从跨语种内容创作到实时语音助手,从虚拟主播到沉浸式交互系统,文本转语音(TTS)正在成为多模态模型体系中的核心一环。但要让机器说得自然、稳定、可控,并在流式场景下保持毫秒级响应,背后考验的不只是声学建模能力,更是架构设计与系统优化的综合实力。

    在这一技术演进路径上,新一代模型开始尝试突破传统 TTS 的边界——不仅追求更高保真度,还强调多语言泛化能力与精细化控制能力。由 Qwen 团队日前开源的 Qwen3-TTS 便是基于双轨语言模型(LM)架构,在实时语音合成的同时,也可对输出语音进行细粒度调控。

    具体而言,Qwen3-TTS 支持 3 秒语音克隆与基于描述的语音控制,其在覆盖 10 种语言、总计超过 500 万小时的语音数据上进行训练,同时还配备两种语音分词器(speech tokenizer):

    *** Qwen-TTS-Tokenizer-25Hz:** 采用单码本(single-codebook)编解码器,侧重语义内容表达,可与 Qwen-Audio 无缝集成,并通过基于分块(block-wise)的 DiT 实现流式波形重建。

    *** Qwen-TTS-Tokenizer-12Hz:** 实现极致码率压缩与超低延迟流式输出,基于 12.5Hz、16 层多码本设计以及轻量级因果卷积网络(causal ConvNet),可实现 97 毫秒的首包即时输出。

    大量实验结果表明,该系列模型在 TTS 多语言测试集、InstructTTSEval 等多项客观与主观基准测试中,均达到 SOTA 水平。

    目前,「Qwen3-TTS:高质量可控多语言语音合成 Demo」已上线 OpenBayes 官网的教程版块,点击下方链接即可体验一键部署教程 ⬇️

    教程链接:

    https://go.openbayes.com/O0oKE

    Demo 运行

    01

    Demo 运行阶段

    1.登录 OpenBayes.com,在「公共教程」页面,选择「Qwen3-TTS:高质量可控多语言语音合成 Demo」教程。


    2.页面跳转后,点击右上角「克隆」,将该教程克隆至自己的容器中。


    3.选择「NVIDIA GeForce RTX 5090」以及「PyTorch」镜像,按照需求选择「按量付费」或「包日/周/月」,点击「继续执行」。新用户使用下方邀请链接注册,即可获得满 ¥10 赠 ¥10 优惠券,更有机会获得 ¥15 赠金!

    小贝总专属邀请链接(直接复制到浏览器打开):

    https://go.openbayes.com/9S6D******r

    4.等待分配资源,当状态变为「运行中」后,点击「打开工作空间」进入 Jupyter Workspace。


    02

    效果演示

    页面跳转后,点击左侧 README 页面,进入后点击上方「运行」。

    待运行完成,即可点击右侧 API 地址跳转至 demo 页面。

    教程链接:

    https://go.openbayes.com/O0oKE