2026年1月

不知道点了哪里,就开始花屏,导致只能重新启动浏览器。

浏览器:Chrome

操作系统:MacOS 15.2

1331791769740620_.pic

1331801769740647_.pic

这里记录每周值得分享的科技内容,周五发布。

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系[email protected])。

封面图

刚刚建成四川宜宾高铁枢纽门户区,以高铁站为核心,包括8座塔楼、中央公园、数字艺术中心和商业文化街区。(via

你是第几级 AI 编程

史蒂夫·耶格(Steve Yegge)是一个著名的美国程序员。

他在亚马逊和谷歌都干过,但是他出名的不是写软件,而是写博客。

他喜欢在个人网站发布长篇大论,滔滔不绝地议论,直抒胸臆,毫不避讳。他的好多文章都在业内被广泛阅读,引起很大反响。

这些文章后来结集出版,甚至引进了国内,书名就叫《程序员的呐喊》(人民邮电出版社,2014)。

它的书名里面的"呐喊",英文单词是 ranting,直译就是"咆哮",确实就是他的文章风格。

这个月,他又发表了一篇最新文章,谈他对 AI 编程的看法。

他说 AI 编程有8级,他已经到了第8级,也就是最高级。

第1级,还没有接触到 AI 编程,你的 IDE 还是正常的样子(下图)。

第2级,你在 IDE 装了 AI 插件,开启了侧边栏,AI 时不时提出代码建议,问你是否接受(Yes or No)。

第3级,你开始信任 AI 编程,进入了 YOLO 模式("你只活一次"模式, You Only Live Once)。为了节省时间精力,你不再逐条确认 AI 的建议,只要是 AI 生成出来的东西,你就一路按 Yes,统统接受。

第4级,AI 占据的屏幕宽度越来越大,手工编辑的代码区仅用于比对代码差异。

第5级,你索性不要代码区了,改用命令行(比如 Claude Code),所有的屏幕宽度都留给了 AI。你现在不看 AI 的生成结果了,只看它的完成进度。

第6级,你觉得只用一个 AI 太慢,于是打开3到5个窗口,同时进行 AI 编程,加快速度。

第7级,同时打开的 AI 编程窗口到了10个以上,已经是你手工管理的极限了。

第8级,你开始使用 AI 任务编排器,让计算机管理并行的多个 AI 编程。

以上就是 AI 编程的8个级别,你是第几级?

到这里还没完,前面说了,史蒂夫·耶格本人已经到了第8级。他需要工具来管理并行的 AI 编程,但是找不到满意的工具。

于是,他就指挥 AI 写,并将这个工具起名为"煤气镇"(Gas Town)。这个名字来自电影《疯狂麦克斯》(Mad Max)第四部,是里面大反派老乔的老巢。那里到处都是二手零件组成的燃气机,能正常工作,但是看上去摇摇欲坠。

他说,"煤气镇"的开发就是东拼西凑,不考虑合理性,能用就加上去,没抛错就接受。"它有22.5万行 Go 语言代码,我从来没看过它的代码,也从来没想过要看。"

他建议用户不要使用这个工具,因为使用它需要全心全意信任 AI。并且,就算相信它,它也可能把事情搞得一团糟。另外,多个 AI 一起跑,很费钱。

但是,他还是把这个工具放到网上,因为它非常好玩。截至到上周,已经得到了6000颗星。

科技动态

1、牛的智力

一个奥地利农民惊奇地发现,自家的牛会从地上,叼起一根棍子来挠痒。

这个发现令人震惊,因为这表明牛会使用工具,以前从未有人提过。

目前,除了人类之外,只有黑猩猩被发现会使用工具。科学家表示,需要重新认识牛的智力。

2、轨道储能系统

一家美国公司设计出"轨道储能系统",利用山地轨道储藏能量。

电力充足时,索道通过电动机,把重物从山脚运到山顶。

电力不足时,就利用重力势能,让重物顺着轨道从山顶滑到山脚,通过索链带动发电机。

这个系统的优点是简单可靠,成本低,连续使用多年,也不会出现性能衰减。

3、喉部发声贴片

上一期周刊介绍了会说话的围脖,本期还有一个类似的发明。加州大学洛杉矶分校的研究团队发明的喉部贴片,可以让不能说话的病人重新发声。

某些病人由于喉部疾病,无法再发声了,成了哑巴,但是他们的喉部肌肉还能动。

这种贴片贴在病人的喉部,能够感知病人的喉部肌肉运动,并将这种运动转为电信号,发送出去。

计算机收到电信号以后,再转成对应的语音,从而实现发声。

为了将喉部肌肉运动与各种语音对应起来,研究团队使用了机器学习,通过算法将电信号与单词之间实现了关联。

文章

1、2026年的 Linux 音乐播放器(英文)

本文介绍 Linux 系统现在主要的几种音乐播放器。

2、选择性禁用 HTTP/1.0 和 HTTP/1.1(英文)

本文介绍如何设置 nginx,禁止 HTTP/1.0 和 HTTP/1.1 协议,只有白名单里面的客户端可以通过,这杜绝了绝大部分的攻击和爬虫。

3、我扫描了所有的 GitHub "孤儿提交"(英文)

如果你不小心把密码提交到 GitHub,怎么办?你可能会立刻修改代码,强制覆盖上次的提交。

本文告诉你,这样不行。因为 GitHub 不删除任何提交,你上次提交实际上还在。作者扫描了所有 GitHub 的强制提交事件,真发现了许多泄漏的密码,

4、CSS 动画计数器(英文)

本文介绍纯 CSS 动画计数器的各种写法。

5、我的 n8n 用例(英文)

n8n 是一个工作流编排器,可视化生成自动操作脚本。作者介绍了自己的用例:通过聊天软件,将每一笔费用发给 n8n 本地服务器,它会用 AI 进行分类,再将结果存入谷歌表格。

6、2025应该知道的 HTML 新知识(英文)

本文介绍 HTML 的一些新属性和新功能。

7、新的自托管应用推荐(英文)

作者推荐一些他个人喜欢的自托管应用,都相当不错。

工具

1、teemux

一个基于 JS 语言的命令行工具,将多个进程输出的日志放在一处查看,可以命令行查看,也可以浏览器查看。

2、daedalOS

浏览器里面的虚拟桌面环境,代码开源。

3、Dendron

VS Code 的笔记插件,将笔记的层级结构当作目录,并支持图表和内部链接,参见介绍文章

4、CWD(Cloudflare Workers Discuss)

基于 Cloudflare Workers 的网站评论系统。(@anghunk 投稿)

5、Mouse Gestures

开源的 Chrome 浏览器插件,使用鼠标滑动轨迹,完成各种浏览器操作。(@Chance-fyi 投稿)

6、relationship-ts

一个 JS/TS 库,用来计算中国亲戚关系(称谓),Demo 试用。(@ExploringTheCodeWorld 投稿)

7、Deck

macOS 剪贴板管理的开源桌面应用,特点是有 Touch ID 保护和端到端加密。(@yuzeguitarist 投稿)

8、EdgeTunnel (Refactored)

一个部署在 Cloudflare Workers 的隧道方案,代码进行了重构。(@tianrking 投稿)

9、Mail Studio

开源的可视化邮件编辑器,通过拖拽组件,生成响应式邮件模板,试用 Demo。(@wzc520pyfm 投稿)

10、TermClean

macOS 开源应用,在终端界面显示各种软件包占用的磁盘空间,并提供清除软件包功能。(@daijinhai 投稿)

AI 相关

1、ebook2audiobook

电子书转成有声书的工具。

2、WorkAny

开源的 AI Agent 桌面客户端,能够执行任务、操作文件,类似于 Claude Cowork。(@idoubi 投稿)

3、Voice Key

开源的桌面端 AI 语音转文字的工具。(@yexia553 投稿)

4、分镜大师(Storyboard Studio)

开源的 Windows 应用,使用 AI 对视频进行分镜。(@BroderQi 投稿)

资源

1、Claude Code 实战(Claude Code in Action)

Anthropic 官方的 Claude Code 免费入门教程,一共15节视频课,总长约1小时。

2、GitHub 证书

这个网站可以将某个用户2025年的 GitHub 活动,变成一张证书样式的图片。

3、Fontsniff

上传文本图片,自动识别使用了什么字体。(@cosmicqbit 投稿)

4、Future Style Periodic Table

开源的可视化元素周期表,会展示核外电子排布。(@SeanWong17 投稿)

5、nihongo

免费的日语学习平台,有词汇、听力、文章等。(@FrankZhai367 投稿)

图片

1、我不再写代码,而是雕刻代码

我的编码方式发生了变化,现在很少自己写了,都交给 Claude Code 自动完成。

我要做的,就是将 AI 的输出结果打磨成更持久耐用的东西。

AI 几乎从不删除无用代码。如果没有雕塑家,最终只会得到一座臃肿不堪、毫无特色、重得无法站立、也无法讲述故事的雕像。

2、蝴蝶壁画

一位法国艺术家,在世界各地的大楼外立面,绘制栩栩如生的蝴蝶标本壁画,唤起人们对生物多样性的关注。

以下都是真实照片,不是 AI 生成的。

迈阿密

休斯顿

西班牙

纽约

法国

文摘

1、为什么有些公司愿意"黑箱编程"

有些公司已经把编程完全交给了 AI,根本不看代码了,AI 写什么就运行什么。

我把这叫做"黑箱编程",开发过程变成了一个黑箱,根本不需要人类介入,也不欢迎人类介入。它所做的就是把规格参数转换成软件。

我知道,有些小公司就这么干,公司的人数一般不到五个人。虽然这种事情简直难以置信,但很可能就是我们的未来。

我问过一个这样的公司,他们为什么要这么做?

他解释说,作为小公司,他们团队的目标是证明产品的有效性。

人类的作用是设计出一个系统:找到新的模式,帮助 AI 有效工作,证明正在构建的软件产品是稳健有效的。剩下的事情就都交给 AI,这样效率最高。

我认为,这个解释令人信服。

这个公司很小,但在短短几个月内就开发出了可以运行的产品。团队当中有些人拥有超过20年的软件开发经验,曾参与过开发可靠性要求极高的系统,所以他们并非抱着天真无知的心态选择了"黑箱编程"。

我期待着,看到他们拿出最终产品,投入市场的那一刻。

言论

1、

大多数组织习惯于收到系统警报后,直接质问:"是谁刚刚发布了代码变更?" 人们认定合并代码的人肯定了解它的工作原理,并且能够迅速修复问题。

如果你部署的代码既不是某个人写的,也没有人真正理解它,会发生什么?

-- 《二十年的 DevOps 实践》

2、

JavaDoc 之类的工具,可以从代码直接生成文档。我觉得,这种自动生成的文档,价值并不大,未必比直接阅读源代码容易。

没有什么可以替代手写的、有组织的和人工编辑的文档。

-- 《什么是好的文档,以及如何编写》

3、

你学过的、使用过的每种语言和技术,即使会过时,也是有价值的,它们都会让下一种语言或技术更容易学习。

-- 《他们骗了你,开发软件真的很难》

4、

习惯了 AI 编程之后,有一天,我震惊地发现,自己竟然如此轻易地掉进了陷阱。

我已经变得对自己的代码库一无所知,也懒得自己去修复。只要用上了 AI,我就心情愉快,AI 让我感觉自己更聪明、更高效、掌控一切。一旦离开了 AI,我才发现这一切都只是幻觉。

-- 《有了 AI,我变得懒惰和愚蠢》

往年回顾

面对 AI,互联网正在衰落(#336)

蓝色指示灯的解决方案(#286)

中国的阳光地带(#236)

低纬度,高海拔,气候优势(#186)

(完)

konga 连不上 kong-ce,但是直接连 kong-ce 都是通的,kong-ce 也正常,telnet http://kong-ce:8001 也能通,有啥排查方向么?我们都是部署在 docker-swarm 网络中的

RT ,被楼上噪音困扰了五六年(感觉有点神经衰弱了,听到噪音就心慌),每天折腾到三四点,因为这个问题最后闹了一场,报警了,貌似民警也招儿,说是让自行调解,最后在公安局被晾着待了一宿,算是彻底跟楼上闹掰了,前段时间好不容易楼上搬家了;又搬来一家冤家,小孩儿三四岁,天天在屋里跑,十一点以后还是,大人就一直在卧室搬椅子,咣咣声不断,想着他们家里有小孩忍忍就算了,后来感觉神经衰弱都加重了,实在忍不了了遂又上门沟通,然而并没有效果,仍然是老样子,折腾到 12 点多。导致睡眠质量严重下降。想问下各位 V 友,遇到这种情况,你们都是怎么解决的。

前言

这周想着上架下主流的一些 linux 管理面板(宝塔、1panel 、GMSSH ),花了点时间按照要求给 1panel 的仓库提交了 PR,迟迟没人回复,就找到他们社区的联系方式,发现需要付费才能联系到他们。
07fcbd4d347a93a02af46386275c519b

那就充值 10 元,进群看看。

f377b282e3107f003ec6f88a75c217a7

进群后,我说明来意后才知道需要 10kstar 才能上架🥹

image-20260130093549173

image-20260130093611819

这个 star 要求在他们对外发布的文档里没找到有说

226099b1216852dca5c4d080cebb5291

这里也算是给大家踩坑了,需要上架商店的好兄弟需要注意下这一点了😂。

上架宝塔

宝塔这边的社区氛围就比较好了,官网有说明直接加他们的官方群(提供了 QQ 群号)即可,进群后,他们还挺热情的。
image-20260130095048787

image-20260130095121390

上架 GMSSH

这个平台的体验就很好了,官方很热情的帮我解答,很快就完成了上架。
image-20260130095329500

image-20260130095347067

image-20260130095406074

image-20260130095417409

image-20260130095440405

image-20260130095459769

效率非常高。

image-20260130095543778

项目地址

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

如果你对我感兴趣,请移步我的个人网站,进一步了解。

我接触动漫比较早,记得是 05 年左右,那时家里电视能收到星空卫视,天天看《火影》、《全职猎人》、《犬夜叉》、《柯南》等等,后面互联网发展起来了,也追了巨量的番。
目前心里有不少佳作:比如《全职猎人》、《 JOJO 全系列》、《夏目友人帐》、《 Re:0 》、《瑞克和莫蒂》等等。三大特摄里我比较喜欢《假面骑士》,虽然也是老 IP ,但每年都有新花样,现在也是每周都追。
像《火影》、《海贼》、《鬼灭》等这种大热的漫画我也都看完了,但看完后的感觉是:这些可能更适合年轻一点的朋友看吧。 对于像我这种上了年纪的来说,反而觉得差点意思。
反观国内,动漫产业也发展相当多年了。但近几年在我心中比较优秀的很少,也就《灵笼》、《中国奇谈》、《一人之下》等这几部。其他的绝大多数要么是修仙,要么是网文改漫画,还有就是现有的部分相对来说有点名气的作品,都能看到其他作品的影子。
所以我有个疑问: 咱们文化历史这么悠久,按理说素材库是无限的,为什么在漫画创作上反而很难看到“新东西”?

编者按: 为什么在强化学习(RL)中,模型往往需要消耗比有监督学习多出数个数量级的计算资源,却只能换来看似微薄的性能提升,且常常陷入训练不稳定的泥潭?

本文从信息论角度出发,对比了有监督学习与强化学习在单位样本中可获取信息量的根本差异:前者通过明确的正确标签直接提供高信息密度的学习信号,而后者仅依赖二元的成功/失败反馈,其信息熵在通过率极低或极高时趋近于零。作者进一步指出,只有当模型的“通过率”处于约 50% 的“金发姑娘区”时,RL 才能高效学习,而这通常只出现在训练末期。此外,文章还剖析了 RL 中梯度估计方差巨大、容易被简单启发式策略主导、难以培养通用推理能力等深层问题,并反思了人类学习机制与当前 model-free RL 的本质差距。

这篇文章提醒我们:若想让强化学习真正释放其潜力,不能仅靠堆算力,而必须重新思考如何设计更密集、更结构化的反馈机制 —— 否则,我们可能只是在用极其昂贵的方式,重复确认一个早已写在预训练权重里的答案。

作者 | Dwarkesh Patel

编译 | 岳扬

最近,人们[1]一直在讨论[2]:在强化学习(RL)中生成单个样本所需的计算量(FLOPs)远高于有监督学习(supervised learning)。在预训练阶段,模型对每一个用于训练的 token 都能立即获得一个学习信号;而在 RL 中,必须展开一整条长达数万 tokens 的推理思维链,才能在最后得到一个奖励信号(例如,我写的代码单元测试是否通过?这道数学题的答案是否正确?等等)。

但这只是问题的一半。这里有一种简单的方法可以比较强化学习与有监督学习的学习效率:

Bits/FLOP = Samples/Flop × Bits/Sample

我还没听到有人讨论我们公式中的这一项:Bits/Sample(每个样本包含多少有用信息)。而且在训练的大部分阶段,强化学习的每一个样本所包含的“有效学习信息量”比有监督学习要低得多。

01 用大白话来说

在有监督学习(也就是预训练)中,模型只是在疯狂吸收信息(bits)。每一个 token 都像是一条线索,它不仅能帮你理解语言本身的构造,还能让你窥见创造这段语言的思维过程,以及那个思维所感知的现实世界。在训练初期,当你用一个完全随机初始化的模型时,你对这些内容都处于最大程度的不确定状态。因此,每个 token 都会让你“恍然大悟”。而且你会立刻得到一个精确的信号,知道自己对正确答案的预测错得多离谱,以及需要调整哪些参数来减少错误。

假设你从一个随机初始化的模型开始,并启动训练。如果你使用有监督学习对 “The sky is” 这个短语做 next-token-prediction,那么训练循环会这样工作:“正确答案其实是 ‘blue’。你预测 ‘blue’ 的概率只有 0.001%。现在,请大幅加强那些本该指向 ‘blue’ 的连接权重。好了,下一个 token。”

而在使用策略梯度(policy gradient)的强化学习中,你会增加所有回答正确的轨迹的权重,并降低所有回答错误的轨迹的权重。但问题是,一个还没怎么学会东西的模型,几乎不可能凭运气就答对。

如果你用 RL 来做“The sky is”的 next-token-prediction,训练循环大概会是这样:“好吧,‘halcyon’ 是错的,别再做导致输出‘halcyon’的操作了…… 好吧,‘serendipity’ 也是错的……” 然后就这样反复试错,猜错的次数差不多得有词汇表总量那么多(约 10 万次)。

02 详细分析

让我们思考一下:随着通过率(p)的变化,每个样本所能获得的最大信息量(bits/sample)会如何变化。这里的“通过率”指的是你给出正确答案的概率。 为简化起见,我们假设答案长度只有一个词元。那么,对于一个完全未经训练的模型,其通过率仅仅是 1/(词汇表大小)。

在有监督学习中,每个样本都会明确告诉你正确标签是什么。你学到的新信息量,取决于你看到正确答案时有多“惊讶” —— 你的通过率越低(即正确答案的先验概率越小),你从这个标签中学到的东西就越多。信息熵的基本公式告诉我们:在有监督学习中,你从每个样本中最多可以学到 -log(p) bits 的信息。

而在强化学习中,你只会被告知答案是否正确。你能从中提取的信息量,受限于你对这个二元结果(对/错)的不确定性。如果你几乎总是通过(p ≈ 1)或几乎总是失败(p ≈ 0),那么每次试验都很难让你感到意外。当通过的概率像抛硬币一样时(p ≈ 0.5),你学到的东西最多。 对于一个二元随机变量,其信息量的上限由熵公式给出:在 RL 中,你从每个样本中最多能学到 Entropy(p) = -p log(p) - (1-p) log(1-p)1 bits 的信息。

好,我们来画图。

看起来还不算太糟。是的,在通过率前 50% 的范围内,预训练明显更好,但在后 50% 的范围内,强化学习表现更佳。然而,这张图极具误导性。根据缩放定律(scaling laws)中的幂律关系,每当你想把“通过率”(pass rate)提升一个数量级,你都需要投入大致相同量级的计算资源。 如果你花了 X FLOPs 将通过率从 1/100,000 提升到 1/10,000,那么你也需要 X FLOPs 才能将通过率从 1/10,000 提升到 1/1,000。因此,我们应该使用对数刻度来表示通过率 —— 以便使 X 轴的每一单位增量对应于相同数量的计算开销(FLOPs)。

这张图看起来真令人沮丧。强化学习在样本信息密度上与预训练相当的区域,仅仅是训练末期的一小段,而且此时模型本身已经相当不错了。

再次强调,这一问题完全独立于另一个观点:即从强化学习中获取单个样本(也就是在得到任何信号前必须完整展开一整条推理轨迹)可能需要耗费高出数百万倍的计算量。

03 方差(variance)让实际情况甚至比这更糟

训练初期的强化学习,实际情况其实比上面描述的更为严峻。当通过率很低时,对梯度的估计会变得极其混乱且难以预测。 要么在当前 batch 生成的样本中,根本就没有采样到正确答案,在这种情况下,几乎得不到任何有用的学习信号。要么碰巧采样到了一次,然后就会得到一个巨大的梯度峰值。模型的训练过程会被剧烈地、不规则地“拉扯”(梯度忽大忽小、方向混乱),如果要追求高效、稳定的训练,这样是非常糟糕的。2

有趣的是,预训练的问题恰好相反,方差(variance)在训练末期会变得非常高。随着预训练的推进,你会逐渐耗尽那些可约损失(reducible loss,即模型实际能从数据中学到的东西)。剩下的主要都是不可约损失(irreducible loss),不可约损失指的是网络文本数据固有的不可预测性。

提示词 “Bob’s favorite color is” 应该怎么结尾?这完全取决于 Bob 是谁。对于这种问题,并不存在什么标准正确答案能让你的超级智能模型通过训练达到很高的预测准确率。但是,模型仍然会根据某人在网上留下的随机答案,获得梯度更新(gradient update)。而这种噪音,会淹没当前 batch 中少数几个真正可学习的词元为我们提供的真实信号。我不知道这是否准确,但预训练阶段末期出现的这种方差激增,似乎与为什么在预训练过程中需要增大 batch sizes 有关。

04 进入 RL 的“金发姑娘区”(Goldilocks zone)

如果 RL 在通过率远高于 1% 时效果最佳,那么这就引出了一个问题:我们该如何设计 RL 训练过程,才能让模型进入并维持在这个高效学习的状态中?

例如,在进行强化学习(RL)时,我们可以通过“预训练更多的数据”和“增加推理时的计算量(比如让模型想得更久)”这两种方式,来让模型变得更聪明、回答得更准确,提高模型的“通过率”,从而让每个样本带来更多的有效信息(bits)。

有观点指出,课程学习(curriculum learning)在预训练中作用不大[3],但在 RL 中却常常不可或缺[4]。这完全说得通 —— 因为 RL 只有在通过率处于这个“金发姑娘区”时,每个样本才能带来有意义的信息量。因此,为了训练效果好,你必须精心安排学习内容的顺序,要保证问题的难度是随着模型能力的提升而同步加难的,不要一下子给太难的题,也不要一直做太简单的题。

作者提出的“通过率”理论可以很好地解释为什么“自我对弈”(像 AlphaGo 那样自己跟自己下棋)在强化学习历史上特别管用。因为当你跟一个水平旗鼓相当的对手比赛时,你赢的概率大约就是 50%。在这个理论中,50%是一个最佳状态,意味着每次比赛结果(输或赢)带给你的信息量是最大的,能让你学得最快。

但自我对弈并不是唯一能让训练过程中保持高通过率的方法。我们还可以设计出一种“proxy evaluation”机制,这种机制能提供更密集的反馈信息。这里的“密集”具体指以下两种情况之一:

1)Samples/FLOP 密度:通过“proxy evaluation”方法,我们可以在一个强化学习回合刚开始不久时就估算出最终的奖励,而不必真的把整个过程跑完,从而省去了后续的大量计算消耗。这种机制其实就是所谓的“价值函数”。

2)Bits/Sample 密度:我们可以设计一个比最终目标更易达成的 proxy objectives 来指导模型。我能想到的最简单例子是过程奖励模型(process-reward model),它会这样说:“嘿,这次生成的答案虽然错了,但我看得出来,它一开始的推理方向是对的。那我们就给这些早期的 token 增加一点权重。”

Deepseek R1[5] 论文的 4.2 节讨论并解释了,为什么直到现在,要为大语言模型开发出像这样好用的 proxy objectives 依然是一件很难的事情。

05 信息量虽少,但价值高

虽然在强化学习中,每单位计算量(FLOP)学到的 bits 确实少得多,但这些 bits 却非常重要,它们与预训练中获得的 bits 信息不能简单地相提并论。 这其中主要有两个关键原因:

  • 预训练就像是让模型把互联网上现有的数据全记下来,但这种知识与“如何完成具有经济价值的任务”只有部分且间接的关联;而强化学习则是直接教模型怎么去解决那些真正有用、能产生价值的实际问题。
  • 即使预训练语料中包含了完成某项任务的“操作说明”(比如教程、具体步骤或答案),它也缺少一种关键的东西 —— “思维轨迹”(thinking trace)。也就是说,数据里没有展示模型犯错时是怎么自我纠正的,也没有展示如何利用模型独特的、非人类的方式去组合技能来解决问题。而这些深层的思考痕迹,正是强化学习能提供的东西。

反驳的观点认为,虽然这些信息很有价值,但它们只在一个非常窄的通过率范围内(比如模型已经挺聪明了,但还没完全学会的时候)才能被获取。之所以要强调这一点,是因为在训练的大部分时间里,模型的通过率都极低(接近0),在对数尺度上看,这些低通过率的阶段占据了很大的比重,这意味着真正能高效学习的窗口期其实很短。

现在我们就能理解那些关于 RLHF/RL 仅能激发预训练模型中已有的潜在能力的说法了[6]。事实当然如此。如果预训练模型初始的通过率不够高,那么强化学习的 bits/sample 就会低得可怜,从而根本无法进行有效学习。 围棋对战中的“第 37 手”是一个非常著名的案例,它证明了强化学习确实能教给模型一种全新的、前所未有的策略。值得注意的是,AlphaGo 是通过自我对弈训练出来的(见上文关于自我对弈如何提高通过率的论述),而且以当时的标准来看[7],其计算消耗之巨令人吃惊。

06 强化学习的不均衡

人们指出,从经验上看,RLVR(强化学习 + 可验证奖励)实际上只是让模型将某种思维模式与特定问题类型关联起来,而并未真正培养出一种更通用的策略 —— 比如先退一步,再仔细思考最佳解法。

仔细想想。怎么会有模型在国际编程竞赛中达到世界顶尖水平,却同时在代码库中留下了大量本可预见的 Bug 和技术债务?

这种奇怪的不均衡该如何解释?也许 RLVR 无法区分一条成功的推理轨迹到底是模型通过某种通用的推理能力(举一反三)做出来的,还是仅仅靠死记硬背某种特定的解题模板(“看到这个形状就用这个套路”)做出来的。因为它没法区分这两种过程,所以模型可能学会了后者(简单的套路),而不是前者(通用的能力)。

当你使用策略梯度(policy gradient)进行 rollout(即让模型生成完整的行为序列)时,那种更复杂、更具泛化能力的策略几乎不可能被采样到;而简单的启发式策略却很容易被采样到,并随着训练不断被强化,出现频率越来越高,最终完全主导模型的行为(即达到“固定”状态)。与此同时,真正的通用策略则越来越难以被观察到,逐渐从训练过程中消失。

那么问题来了,我们该如何搭建一座“短桥”,把简单的启发式解法,和那种更复杂、更具泛化能力的通用策略连接起来?而且,这座桥会不会随着任务时间跨度(time horizons)自然拉长而自动出现 —— 从而迫使模型发展出真正的泛化能力?

我担心的是,那种“先退一步、基于对世界的理解做出明智判断”的通用策略,即使在更长周期的任务中,也依然很难通过“可验证的奖励”(verifiable rewards)被有效识别和强化。因此,要解决这种不均衡问题,不能只靠扩大 RLVR 的规模,而必须设计更鲁棒的训练方法。

07 人类的学习方式

本节我们讨论的只是 model-free RL —— 也就是仅从一个强化学习周期结束时的二元结果(成功/失败)中获得的信息量(bits/sample)。但显然,人类的学习效率远高于此。想想假如有一位连续创业者,我们会说她拥有大量来之不易的智慧和经验。而这些学习成果中,极少部分真正来自上一次创业的“one bit”结果(即创业成功与否)。

目前还不清楚,在机器学习中,人类这种从经验中学习的方式对应的是什么机制。 显然,我们的观察与反思会不断更新我们的世界模型(world model) —— 而且这种更新并不依赖于最终结果是成功还是失败。这在人类学习过程中起着非常重要的作用。

也许我们不该只是想着“如何把 model-free RL 的通过率调到 50% 左右,因为这样做仅仅是试图从一个单一的“成功/失败”结果中,挤出那么一点点微薄的信息。也许我们应该转换思路,去研究人类是如何从环境中获取海量信息的。人类并不像现在的机器那样,只盯着最终的结果(成功或失败),而是能从过程、观察和反思中吸收大量的经验和教训。

1 这个公式的意思是:从一个二元结果中学到的信息量 =p(样本正确) × (样本正确时获得的信息量) +p(样本错误) × (样本错误时获得的信息量)。

2 感谢 Lukas Berglund 指出我此前在这一点上的阐述有误。

END

本期互动内容 🍻

❓人类从失败中能学到远不止“0/1”的反馈——你觉得 AI 系统要如何模拟这种过程性反思能力?

文中链接

[1]https://www.tobyord.com/writing/inefficiency-of-reinforcement...

[2]https://thinkingmachines.ai/blog/lora/#how-much-capacity-is-n...

[3]https://arxiv.org/pdf/2012.03107

[4]https://arxiv.org/pdf/1707.05300

[5]https://arxiv.org/abs/2501.12948

[6]https://arxiv.org/abs/2510.07364v3

[7]https://epoch.ai/data/ai-models

原文链接:

https://www.dwarkesh.com/p/bits-per-sample

原文链接:https://www.nocobase.com/cn/blog/6-best-open-source-ai-ticket...

之前的文章中,我们梳理了一些可以替代 Zendesk 的开源与自托管 AI 工单系统方案。在文章撰写和资料调研的过程中,我们也持续关注了社区里对相关话题的讨论。 从实际使用体验来看,传统工单系统本质上只是一个记录与流转工具,记录问题、改变状态、最后关闭。至于问题是否被快速理解、是否被正确分派、是否能少走弯路,几乎完全依赖人工经验。 在 Reddit 的技术社区中,有两条讨论引起了我们的注意。

TicketingSystems1.png!

TicketingSystems2.png

越来越多的团队开始尝试引入所谓的 “AI Helpdesk”,希望借助 AI 来缓解支持压力。但在 Reddit 的讨论中,我们看到的反馈却相当一致,也非常直接:

  • AI 往往只是生成一段看起来很聪明的回复
  • 对实际处理效率的提升非常有限
  • 整体流程并没有发生变化,只是在原有系统上多了一个 AI 按钮

如果 AI 只是停留在回复层,而没有真正进入工单流程本身,那它对团队的帮助是非常有限的。


💬 嗨!你正在阅读 NocoBase 博客。NocoBase 是一个极易扩展的 AI 无代码/低代码开发平台,用于构建企业应用、内部工具和各类系统。它完全支持自托管,基于插件架构设计,开发者友好。→ 欢迎在 GitHub 上了解我们


也正是在这样的需求和反馈之下,我们认为,“AI 工单系统”已经不再只是一个简单的产品分类,而更像是一个需要被重新定义的解决方案层级。它不应只是一个会生成回复的系统,而应当是一个能够真正介入流程、自动理解与分派工单、基于知识库给出可用建议,并且能够与企业内部业务系统深度结合的 AI 工单系统。

本文将从 AI 工单系统在 2026 年应具备的核心能力出发,系统性梳理这些能力可以如何在不同系统中实现,帮助你和团队在选型时跳出“是否带 AI”的表层判断,回到效率和结构本身。

2026 AI 工单系统的必备能力

1. 自动理解与摘要 AI 工单系统需要准确理解工单内容,从自然语言描述中提取关键信息,减少人工反复阅读和上下文确认的成本。

2. 智能分类与路由 真正有效的 AI 应当能够自动完成初步分类与优先级判断,并将工单分派给合适的团队或角色,而不是把这些决策继续留给人工处理。

3. 基于知识库的回复建议 AI 的价值在于复用已有知识,通过历史工单和文档给出可编辑的处理建议,而不是直接“自动结案”或输出脱离上下文的通用回答。

4. 流程中的 AI 介入点 AI 应当贯穿工单的完整生命周期,在建单前、处理过程中以及关闭与总结阶段持续发挥作用。

5. 可控、可扩展、可自托管 在企业场景下, AI 工单系统必须支持数据主权和模型可替换,避免被单一 SaaS 锁定,才能在长期发展中保持可控性和扩展空间。

开源 AI 工单系统选型清单

1.NocoBase

官网链接:https://www.nocobase.com/

GitHub 链接:https://github.com/nocobase/nocobase

GitHub Star 数:21.4k

核心定位 NocoBase 是一套以数据模型为核心的开源业务系统平台,通过插件化架构扩展业务能力,并将 AI 能力深度融入系统的核心模块之中。工单、知识库、流程、内部服务台都是其可以构建的业务模块。

🎉基于 NocoBase 2.0 构建的智能工单系统

适合场景

  • 希望高度自定义工单流程的 IT / 内部支持团队
  • 不满足于标准流程,需要结合内部业务系统的组织
  • 对数据主权、自托管、AI 模型可控性有明确要求的企业
  • 希望将工单系统逐步升级为内部智能服务平台的团队

AI 扩展方式

NocoBase 的 AI 能力不是附加功能,而是通过 AI 员工深度融入业务系统。

  1. 自动理解与摘要
  • AI 员工可以理解工单的自然语言描述
  • 结合数据模型与字段结构,自动提取关键信息
  • 支持生成摘要并写回工单字段,减少人工阅读和上下文确认成本

NocoBase1.png

  1. 智能分类与路由
  • AI 可作为工作流中的决策节点
  • 根据工单内容、字段信息和历史数据进行自动分类
  • 计算优先级并分派给对应团队、角色或 SLA 流程

NocoBase2.png

  1. 基于知识库的回复建议(RAG)
  • 工单解决过程可以自动转为知识条目
  • 新工单创建时可基于已有知识推荐相似解决方案
  • AI 员工可以辅助查找已有知识,并生成建议回复

NocoBase3.gif

  1. 流程中的 AI 介入点
  • AI 可介入建单前(表单填写辅助)
  • 处理过程中(分析、建议、补充信息)
  • 关闭阶段(总结工单、沉淀知识)

NocoBase4.gif

  1. 可控、可扩展、可自托管
  • 100% 开源、完全自托管
  • 支持多种 AI 模型(OpenAI、Claude、本地模型)
  • 插件化架构,可基于企业业务灵活调整系统

NocoBase5.png

2. Frappe Helpdesk

官网链接:https://frappe.io/helpdesk

GitHub 链接:https://github.com/frappe/helpdesk

GitHub Star 数:2.9k

核心定位 Frappe Helpdesk 并不是一个孤立的工单系统,而是 Frappe 业务平台中的一部分,天然与 ERP、CRM、项目管理等模块共享数据模型,更偏向业务系统一体化的服务支持方案。

适合场景

  • 已经在使用 ERPNext / Frappe 平台的组织
  • 希望将工单与业务数据、客户、订单、资产等信息打通的团队
  • 对“系统一致性”和内部数据联动要求高,而非只关注客服功能的企业
  • 内部 IT 支持、业务支持型 Helpdesk 场景

AI 扩展方式

Frappe Helpdesk 的可以作为业务平台的一部分,能够让工单自然融入企业已有的数据与流程体系。对于已经使用 ERPNext 的团队来说,它更像是一个业务支持入口,而不是独立的 AI 工单系统产品。

  1. 自动理解与基础分类(可扩展)
  • 可结合 Frappe 平台已有的数据结构
  • 通过外部 LLM 或自建 AI 服务,对工单描述进行基础理解

Frappe Helpdesk1.png

  1. 基于业务数据的辅助建议
  • 工单可直接关联 ERP / CRM 数据
  • AI 可基于已有业务记录,给出处理参考或背景说明
  • 更适合“业务支持型”场景,而非高并发客服场景

Frappe Helpdesk2.png

3. Chatwoot

官网链接:https://www.chatwoot.com/

GitHub 链接:https://github.com/chatwoot/chatwoot

GitHub Star 数: 27.1k

核心定位 Chatwoot 可以统一承载来自不同渠道的对话,并将这些对话转化为可处理的支持请求或工单。

适合场景

  • 需要统一管理 Web Chat、Email、社交媒体、IM 等多渠道支持入口的团队
  • 将“对话”作为服务起点,而不是先生成工单的组织
  • 希望在支持流程前端引入 AI,减轻人工接待和初步沟通压力的团队

AI 扩展方式

Chatwoot 并不以复杂的工单生命周期管理见长,其 AI 能力更多集中在沟通与入口层。

  1. 自动理解与摘要
  • Chatwoot 天然以“对话”为核心对象
  • 通过接入外部 LLM,可实现:

    • 对话摘要
    • 回复草稿生成
    • 常见问题自动应答

Chatwoot1.png

  1. 工单触发与前置分流
  • 对话可根据规则或 AI 判断转化为工单
  • 在建单前完成初步筛选和分流
  • 减少无效或重复工单进入后端系统

Chatwoot2.png

4. Zammad

官网链接:https://zammad.com/

GitHub 链接:https://github.com/zammad/zammad

GitHub Star 数: 5.4k

核心定位 Zammad 以完整的工单生命周期管理为核心,强调多渠道接入、状态流转、权限与 SLA 管理,是一款流程导向非常明确的 Helpdesk 工具。

适合场景

  • 需要一套成熟、结构清晰的 Helpdesk 系统的 IT 支持团队
  • 对工单生命周期、权限和 SLA 管理有明确要求的组织
  • 希望在稳定工单流程之上,引入 AI 做辅助判断与建议的团队
  • 以 Helpdesk 为核心,而非平台化重构的场景

AI 扩展方式

Zammad 本身并不内置 AI 功能,但其规则引擎与 API 设计,使其非常适合在既有流程上叠加 AI 能力。

  1. 自动理解与摘要(可扩展)
  • 可通过 API / Webhook 接入外部 LLM
  • 帮助支持人员快速把握问题核心,减少人工阅读成本

Zammad1.png

  1. 规则驱动的分类与分派
  • Zammad 拥有成熟的规则系统
  • AI 可辅助完成主题识别、优先级判断
  • 结合现有规则,实现更智能的分派与升级逻辑

Zammad2.png

  1. 基于知识库的回复建议
  • Zammad 支持知识库模块
  • 可通过外部 AI 服务,基于已有知识内容生成回复建议

Zammad3.png

5. FreeScout

官网链接:https://freescout.net/

GitHub 链接:https://github.com/freescout-help-desk/freescout

GitHub Star 数:4k

核心定位 FreeScout 可以提供一个简单、可控的共享收件箱与工单管理工具,功能聚焦、学习成本低,更接近“开源版 Help Scout”。

适合场景

  • 中小团队或初期阶段的支持团队
  • 以邮件工单为主要支持渠道的组织
  • 预算敏感、希望避免复杂系统引入成本的团队
  • 对流程复杂度要求不高,但希望逐步引入 AI 辅助的场景

AI 扩展方式

FreeScout 本身并不内置 AI 能力,但其插件机制和简单的数据结构,使其可以在有限范围内叠加 AI 辅助功能。

  1. 基于知识库的回复建议(可扩展)
  • 结合已配置的知识库内容、历史工单或预设回复模板
  • 利用 LLM 生成可编辑的回复草稿,供支持人员参考和调整
  • 更适合处理常见问题或重复性场景,而非复杂、多轮上下文的推理

FreeScout1.png

  1. 基于规则的初步分类
  • 可结合规则与 AI 辅助判断结果
  • 对邮件工单进行初步分类或标签标记

FreeScout2.png

6. Faveo Helpdesk

官网链接:https://www.faveohelpdesk.com/

GitHub 链接:https://github.com/faveosuite/faveo-helpdesk

GitHub Star 数:1.2k

核心定位

Faveo Helpdesk 是基于 Laravel 生态的开源 Helpdesk 系统。内置工单、知识库与基础流程管理能力,强调可读性与可扩展性,适合进行二次开发和功能增强。

适合场景

  • 使用 Laravel / PHP 技术栈的团队
  • 希望在 Helpdesk 基础之上,逐步引入定制功能或 AI 能力的组织
  • 对知识库建设与内容复用有明确需求的支持团队
  • 不追求平台级重构,但需要一定扩展空间的场景

AI 扩展方式

Faveo Helpdesk 的 AI 扩展主要依托其知识库结构清晰、代码可扩展的特点,更适合从“内容与建议层”引入 AI。

  1. 基于知识库的回复建议
  • 内置知识库模块,结构清晰
  • 可结合外部 LLM,对知识库内容进行检索与生成
  • 为支持人员提供可编辑的回复建议

Faveo Helpdesk1.png

  1. 自动理解与摘要(可扩展)
  • 可通过 Laravel 生态中的 AI 服务
  • 对工单描述进行基础语义理解与摘要
  • 帮助支持人员更快把握问题背景。

Faveo Helpdesk2.png

结语

在选型过程中,比起功能数量,更应该关注 AI 能够在多深的程度上参与到你的工单流程中,系统是否具备持续扩展这些能力的空间。

随着使用场景的变化,工单系统的边界也在不断延展,从最初的问题记录工具,到内部服务台,再到如今的 AI 驱动的业务支持平台,新一代的工单系统正在逐步成为企业内部协作与服务交付的重要基础设施。

💕如果你在工单系统选型或 AI 工单系统实践中有类似困惑,希望这篇文章能带来一些参考,欢迎分享给更多感兴趣的朋友。

相关阅读:

视频会议技术如何重塑智能硬件生态?深度解析适配难点与落地实践
在智能硬件生态中,视频会议技术已不再是边缘附加功能,而是打通人机交互、设备互联与远程协作的核心纽带。从家用智能摄像头到工业巡检机器人,从车载系统到AR眼镜,视频会议依赖的低延时、高稳定音视频传输能力,正推动各类硬件突破物理限制,为用户带来更具沉浸感的远程交互体验。
智能硬件适配视频会议的核心技术挑战
与手机、电脑等通用设备不同,智能硬件因自身特性,在集成视频会议功能时面临三大关键挑战:
算力资源受限:多数智能硬件采用轻量化芯片(如ARM Cortex-M系列),难以支撑视频会议所需的复杂编码和解码运算。因此需定制低复杂度算法,如裁剪非必要画质增强模块,采用H.264 Baseline Profile等轻量级编码标准,在保证视频会议基础画质的同时降低CPU占用。
网络环境不稳定:智能硬件常处于弱网或特殊频段环境(如家用设备依赖易干扰的Wi-Fi 2.4G频段、工业设备位于偏远无公网区域),视频会议需集成抗丢包技术(如FEC前向纠错、ARQ自动重传),即使在30%-50%丢包率下,也能通过冗余数据补全视频帧,避免画面卡顿或声音断续。
功耗控制严苛:智能硬件多依赖电池供电,视频会议的持续音视频传输易快速消耗电量。需通过动态码率调节技术,在网络良好时提升码率保证视频质量,电量不足时切换低码率模式,延长设备续航时间。
视频会议技术在智能硬件场景的落地实践

  1. 家用智能硬件:家庭视频会议的便捷入口
    家用智能摄像头已成为家庭视频会议的重要载体,核心需求包括低延时视频通话、双向语音交互等。实时视频预览方面,摄像头采用“极速首帧”技术,优先传输关键帧(I帧)并简化编码复杂度,让用户打开App即可快速接入视频会议,端到端延时控制在500ms以内。双向语音对讲功能则集成AI降噪算法,精准区分人声与环境噪音(如风声、家电声),同时通过回声消除技术避免啸叫,确保家庭视频会议清晰流畅。
  2. 智能车载系统:移动场景下的视频会议解决方案
    智能车载系统中的视频会议应用聚焦于移动办公、远程监控等场景,对稳定性和抗干扰性要求极高。车载视频会议优化方面,系统采用自适应抖动缓冲技术,根据车速和网络波动动态调整缓冲时长,将通话延时控制在300ms以内;同时针对车载环境优化语音增强算法,抑制发动机噪音、胎噪等低频干扰,提升视频会议清晰度。远程控车场景中,车主可通过视频会议功能实时查看车辆周边画面,异常移动时快速推送告警视频,响应时间不超过1秒。
  3. 工业级智能硬件:远程协作的视频会议支撑
    工业领域中,视频会议技术赋能巡检机器人、AR智能眼镜等硬件,实现高效远程协作与故障诊断。工业巡检机器人通过视频会议技术将现场画面实时回传至中控室,采用边缘节点部署搭建本地化网络,避免公网延迟;同时利用硬件编码加速降低算力消耗,确保视频流稳定不中断。AR智能眼镜则支持工程师与远端专家进行视频会议,专家通过AR标注功能在画面上标记故障点,标注内容与视频流同步叠加,实现“远程手把手指导”,端到端延时低于200ms以保证同步性。
    智能硬件领域视频会议技术的未来趋势
    随着技术发展,视频会议在智能硬件领域的应用将呈现三大趋势:
    多模态交互融合:视频会议将与语音识别、手势控制等技术结合,如智能音箱通过视频会议捕捉用户表情与语音,实现更精准的意图判断。
    端云协同优化:云端分担智能硬件的编码压力,硬件负责采集预处理,云端完成高清编码与AI增强,平衡视频质量与设备功耗。
    标准化协议普及:统一的视频会议协议将打破品牌壁垒,实现不同智能硬件间的无缝互联,如智能手表可直接调取家中摄像头进行视频会议。
    视频会议技术正深度融入智能硬件生态,通过解决适配难点与场景化落地,不断拓展远程交互的边界。未来,随着技术的持续优化,智能硬件与视频会议的结合将为用户带来更高效、更沉浸的使用体验。

大家好,我是良许。

在嵌入式开发中,IIC(I2C)总线可以说是最常用的通信协议之一了。

无论是读取传感器数据、控制EEPROM存储器,还是与各种外设进行通信,IIC总线都扮演着重要角色。

但很多初学者在使用IIC时,往往只关注软件层面的时序和协议,却忽略了硬件层面的关键设计。

今天我就来聊聊IIC总线硬件部分的两个核心要点:开漏输出和上拉电阻。

理解了这两点,你才能真正掌握IIC总线的精髓。

1. IIC总线的基本结构

在深入讲解之前,我们先简单回顾一下IIC总线的基本构成。

IIC总线只需要两根信号线就能实现多主机、多从机之间的通信,这两根线分别是:

  • SCL(Serial Clock):时钟线,由主机产生时钟信号
  • SDA(Serial Data):数据线,用于主从设备之间的数据传输

一条IIC总线上可以挂载多个设备,每个设备都有唯一的地址。

这种简洁的设计让IIC总线在嵌入式系统中广受欢迎,特别是在PCB布线空间有限的场景下。

但问题来了:多个设备共用同一根数据线和时钟线,它们是如何避免冲突的呢?这就要说到IIC总线硬件设计的核心机制了。

2. 开漏输出:IIC总线的灵魂

2.1 什么是开漏输出

开漏输出(Open-Drain)是IIC总线最核心的硬件特性。

要理解开漏输出,我们先来看看常见的GPIO输出模式。

在普通的推挽输出(Push-Pull)模式下,GPIO引脚可以主动输出高电平(通过上管导通)或低电平(通过下管导通)。

这种模式下,引脚能够提供较强的驱动能力,但有个致命问题:如果两个推挽输出的引脚连接在一起,一个输出高电平,另一个输出低电平,就会造成短路,可能烧毁芯片。

而开漏输出则不同,它的内部结构只有一个下拉的NMOS管,没有上拉的PMOS管。这意味着:

  • 当GPIO输出低电平时,NMOS管导通,引脚被拉到地(GND),呈现低电平
  • 当GPIO输出高电平时,NMOS管截止,引脚呈现高阻态(既不输出高也不输出低)

这种"只能拉低,不能拉高"的特性,正是开漏输出的精髓所在。

2.2 开漏输出的优势

你可能会问:只能拉低不能拉高,这不是很鸡肋吗?恰恰相反,这正是IIC总线能够实现多设备共享总线的关键。

第一个优势:线与逻辑

多个开漏输出连接在同一根线上时,会形成"线与"(Wired-AND)逻辑。

只要有任何一个设备输出低电平,整条总线就是低电平;只有当所有设备都输出高阻态时,总线才能被上拉电阻拉到高电平。

这种特性在IIC总线中至关重要。

比如在多主机系统中,如果两个主机同时发送数据产生冲突,通过检测总线电平,主机可以发现冲突并进行仲裁。

发送"1"的主机如果检测到总线为"0",就知道有其他主机在发送数据,会主动放弃总线控制权。

第二个优势:电平转换

开漏输出配合上拉电阻,可以轻松实现不同电压域之间的电平转换。

比如一个3.3V的MCU和一个5V的传感器通信,只需要将上拉电阻接到5V电源,就能实现电平匹配。

3.3V的MCU输出低电平时可以将总线拉低,输出高阻态时总线被上拉到5V,这个5V电平不会损坏MCU(因为MCU引脚是高阻态,没有电流流入)。

第三个优势:避免总线冲突

在推挽输出模式下,如果两个设备同时驱动总线,一个输出高一个输出低,就会造成短路。

而开漏输出永远不会主动输出高电平,最多只是高阻态,因此不会产生短路风险。

2.3 STM32中的开漏配置

在STM32中配置IIC引脚为开漏输出非常简单。

使用HAL库的话,代码如下:

void MX_I2C1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* 使能GPIOB时钟 */
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    /* 配置IIC引脚:PB6(SCL), PB7(SDA) */
    GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;  // 复用开漏输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;      // 不使用内部上下拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    /* 配置IIC外设 */
    hi2c1.Instance = I2C1;
    hi2c1.Init.ClockSpeed = 100000;  // 100kHz标准速率
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    HAL_I2C_Init(&hi2c1);
}

注意代码中的 GPIO_MODE_AF_OD,这就是配置为复用功能的开漏输出模式。

同时 GPIO_NOPULL 表示不使用芯片内部的上下拉电阻,因为我们需要外部上拉电阻。

3. 上拉电阻:开漏输出的最佳拍档

3.1 为什么需要上拉电阻

前面提到,开漏输出只能拉低电平,不能主动输出高电平。

那么高电平从哪里来呢?答案就是上拉电阻。

上拉电阻一端连接到电源(通常是VCC),另一端连接到IIC总线。

当所有设备的开漏输出都处于高阻态时,上拉电阻会将总线"拉"到高电平。

当任何一个设备输出低电平时,由于低电平的驱动能力远强于上拉电阻,总线会被拉到低电平。

可以把上拉电阻想象成一根弹簧,总是试图把总线拉到高电平。

而开漏输出就像一只手,需要的时候可以把总线按下去(拉低),松开手(高阻态)时弹簧就会把总线弹回高电平。

3.2 上拉电阻的阻值选择

上拉电阻的阻值选择是个技术活,选大了选小了都不行。

阻值太小的问题:

如果上拉电阻太小(比如1kΩ),虽然可以提供很强的上拉能力,但会带来两个问题:

  1. 功耗增加。当总线被拉低时,会有较大的电流从VCC经过上拉电阻流向GND,计算公式为I=VCC/Rpullup。以3.3V系统为例,1kΩ电阻会产生3.3mA的电流,在低功耗应用中这是不可接受的。
  2. 增加驱动负担。开漏输出需要吸收更大的电流才能将总线拉低,可能超出芯片的驱动能力。

阻值太大的问题:

如果上拉电阻太大(比如100kΩ),上拉能力会变弱,带来的问题是:

  1. 上升沿变慢。总线电容(包括走线电容、引脚电容等)需要通过上拉电阻充电才能从低电平变为高电平。阻值越大,充电时间越长,上升沿越慢。时间常数可以用 τ=R×C 计算。
  2. 抗干扰能力下降。较弱的上拉能力使得总线更容易受到外部干扰的影响。

合适的阻值范围:

一般来说,IIC总线的上拉电阻推荐范围是:

  • 标准速率(100kHz):4.7kΩ ~ 10kΩ
  • 快速模式(400kHz):2.2kΩ ~ 4.7kΩ
  • 高速模式(3.4MHz):需要更精确的计算,通常在1kΩ左右

最常用的值是4.7kΩ,这是一个经过实践检验的经验值,在大多数应用场景下都能良好工作。

3.3 上拉电阻的计算方法

如果你想精确计算上拉电阻的阻值,可以使用以下公式。首先需要确定总线电容 Cbus,它包括:

  • 走线电容(约10pF/cm)
  • 每个设备的引脚电容(数据手册会标明,通常5~10pF)
  • 其他寄生电容

假设IIC总线时钟频率为 fSCL,上升时间要求为tr

(标准模式下最大1000ns,快速模式下最大300ns),则上拉电阻的最大值为:

同时,为了保证足够的驱动能力,上拉电阻的最小值需要满足:

其中 VOL(max) 是输出低电平的最大值(通常0.4V),IOL是开漏输出的最大吸收电流(查阅芯片手册)。

举个实际例子,假设:

  • 总线电容 Cbus=100pF
  • 上升时间要求 tr=1000ns(标准模式)
  • 电源电压 VCC=3.3V
  • 最大吸收电流 IOL=3mA

则:

因此上拉电阻应该选择在1kΩ到11.8kΩ之间,选择4.7kΩ是非常合适的。

3.4 多个上拉电阻并联的情况

在实际应用中,有时候会遇到多个模块都带有上拉电阻的情况。

比如你的主板上有上拉电阻,外接的传感器模块上也有上拉电阻。

这时候多个电阻会并联,等效电阻会变小。

两个电阻并联的等效电阻计算公式为:

比如两个4.7kΩ的电阻并联,等效电阻为:

这个值仍然在合理范围内,但如果并联的电阻太多,等效电阻可能会过小,导致功耗增加。

因此在设计时,建议只在主板上放置上拉电阻,外接模块上不要再加上拉电阻。

如果模块已经有上拉电阻,可以考虑用0欧电阻或跳线帽来选择性地启用。

4. 实际应用中的注意事项

4.1 上拉电阻的位置

上拉电阻应该尽量靠近主控芯片放置,而不是分散在各个从设备附近。

这样可以减少总线的寄生电容,提高信号质量。

在多层PCB中,建议将IIC走线放在内层,并在下方铺设完整的地平面,以减少干扰。

4.2 长距离传输的考虑

IIC总线本来是为板级通信设计的,传输距离通常在几厘米到几十厘米之间。

如果需要长距离传输(超过1米),需要特别注意:

  1. 降低通信速率,比如从400kHz降到100kHz甚至更低
  2. 使用更小的上拉电阻(但不要小于最小值)
  3. 考虑使用IIC总线扩展芯片或差分信号方案
  4. 增加滤波电容,提高抗干扰能力

4.3 调试技巧

在调试IIC通信问题时,可以用示波器观察SCL和SDA信号。正常情况下应该看到:

  1. 高电平接近VCC,低电平接近0V
  2. 上升沿呈指数曲线(RC充电曲线),下降沿陡峭
  3. 没有明显的振铃或过冲

如果上升沿太慢,说明上拉电阻太大或总线电容太大;如果有振铃,可能需要增加串联电阻或并联电容进行阻尼。

4.4 软件模拟IIC的配置

有时候我们需要用GPIO模拟IIC(比如硬件IIC引脚被占用了),这时候也要配置为开漏输出。

示例代码如下:

/* 初始化模拟IIC的GPIO */
void Soft_I2C_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    /* 配置SCL和SDA为开漏输出 */
    GPIO_InitStruct.Pin = I2C_SCL_PIN | I2C_SDA_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;  // 开漏输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStruct);
    
    /* 初始状态设为高电平(实际是高阻态) */
    HAL_GPIO_WritePin(I2C_GPIO_PORT, I2C_SCL_PIN, GPIO_PIN_SET);
    HAL_GPIO_WritePin(I2C_GPIO_PORT, I2C_SDA_PIN, GPIO_PIN_SET);
}

/* 读取SDA电平 */
uint8_t I2C_SDA_Read(void)
{
    return HAL_GPIO_ReadPin(I2C_GPIO_PORT, I2C_SDA_PIN);
}

/* 设置SDA为低电平 */
void I2C_SDA_Low(void)
{
    HAL_GPIO_WritePin(I2C_GPIO_PORT, I2C_SDA_PIN, GPIO_PIN_RESET);
}

/* 设置SDA为高电平(高阻态) */
void I2C_SDA_High(void)
{
    HAL_GPIO_WritePin(I2C_GPIO_PORT, I2C_SDA_PIN, GPIO_PIN_SET);
}

注意在读取SDA电平时,要先将SDA设为高阻态(输出高电平),然后再读取引脚状态。

这样才能正确读取从设备发送的应答信号。

5. 总结

IIC总线的硬件设计看似简单,实则蕴含着精妙的设计思想。

开漏输出和上拉电阻这两个关键点,共同构成了IIC总线多设备共享、双向通信的基础。

开漏输出提供了"线与"逻辑,使得多个设备可以安全地共享同一根总线,避免了总线冲突的风险。

而上拉电阻则为开漏输出提供了高电平,同时还能实现电平转换、限制电流等功能。

两者配合,才能让IIC总线稳定可靠地工作。

在实际应用中,正确选择上拉电阻的阻值、合理布局PCB、注意信号完整性,都是保证IIC通信质量的关键。

希望通过今天的讲解,能让大家对IIC总线有更深入的理解,在以后的项目中少走弯路。

如果你在使用IIC总线时遇到通信不稳定、速率上不去等问题,不妨从硬件层面入手,检查一下是不是开漏输出配置不对,或者上拉电阻选择不合适。

很多时候,硬件问题比软件问题更隐蔽,但一旦找到根源,解决起来反而更简单。

更多编程学习资源

用 vibe coding 写了几个工具,改了几个开源软件.
玩到现在玩单机游戏,想调个金钱啥的减少刷的时间,结果还加密了,生气单机游戏数值还加密,反编译游戏成源代码,vibe coding 后游戏索然无味,金钱默认最大,所有人数状态技能啥的数值最大..一下子就进入贤者时间了.
还是回归原始,摸鱼看小说,vibe coding 有点玩腻了,也玩得差不多了..

背景:

  • 工龄:4 年( N=4 )
  • 诉求:2N 赔偿( 8 个月工资)
  • 公司单方面发解除劳动关系邮件,赔偿未谈拢

经过:

因为是第一次打仲裁,担心出差错,花钱请了律师。仲裁前强制调解没成,进入正式仲裁流程。

昨天开庭时的神操作:

万万没想到,开庭前又要走一轮调解。我本人没去现场,律师在法庭直接微信语音打过来,背景还有法官在问话,给我的压力非常大。

律师问:"多少能调解?"

当时脑子没转过来,随口说了"N+2 能调"。对方不答应,我说那就开庭。

不到 2 分钟,律师又打来电话,开始各种劝:

  • "调解可以直接拿到钱"
  • "开庭有风险"
  • "就算赢了还可能一审二审,可能会拖一二年"
  • "即使胜了公司钱到不到位还另说"

我经历这种事少,加上现场那种紧迫感,一下就被带进去了。

最终结果:N+1.5 调解结案


现在回想起来:

  1. 律师前后态度 180 度转变:没收钱时说"这个可以",收集材料时"信心满满",到了现场一个劲催调解

  2. 准备严重不足:对仲裁流程、谈判策略了解太少,以为只有最好的结果,现实和理想差太远

  3. 现场决策太仓促:在法庭那种高压环境下,通过语音电话做重大决定,根本没时间冷静思考

如果时光能倒流,我只接受两个结果:N 或 2N


给大家的教训:

  • 仲裁前一定要充分了解流程和自己的底线
  • 重大决策不要在高压环境下仓促做出
  • 律师也有自己的立场(快速结案),不一定完全站在你这边
  • 调解≠认怂,但也要提前想好能接受的最低线

唉,只能说花钱买了个教训...

V2EX 发帖内容

标题

做了个英语语法练习网站给孩子用,求轻砍

正文

起因

最近在家教儿子和女儿英语,发现一个问题:

儿子以前靠背课文,语法自然就会了。但女儿不一样——课文背得滚瓜烂熟,语法题照样错一片。

这让我意识到:背诵对某些孩子管用,但不是万能的。语法还是得专项练、有反馈。

找了一圈现成的资源,不太满意,干脆自己做一个。

网站

🔗 https://english-grammar.app

⚠️ 还在开发中,目前只完成了一个语法点:

内容 说明
语法点 Present Simple (一般现在时)
题目数 180 道
练习集 9 套,从 verb "be" 到日常场景应用
难度 A1 入门
模式 选择题 / 填空题
练习方式 在线练习 + PDF 下载打印

👉 直接体验:Present Simple 练习

给自己孩子试了一下,反馈 8 分(满分 10 )。

为什么用全英文?

两个原因:

  1. 用英语学英语更自然 —— 减少中英切换的认知负担

  2. 中文语法术语对孩子是额外障碍 —— 「主语」「宾语」「谓语」这些词本身就是生词。但英语里 subject / object / verb 在学习中反复出现,理解成本更低

后续计划

  • 更多时态(过去时、将来时、进行时...)
  • 其他语法专题
  • 练习进度追踪


备注:

  • 网站目前完全免费,以后基础功能也会保持免费
  • 另外因为孩子要考公共英语三级( PETS-3 ),还顺手 vibe coding 了一个听力练习软件,如果有兴趣下次可以介绍


项目刚起步,发出来求大家试用反馈。

哪里不好用、哪里设计得蠢,欢迎轻砍 🙏

VoidZero 近日宣布推出 Oxfmt 的 Alpha 版本。这是一款基于 Rust 实现的代码格式化工具,面向 JavaScript 与 TypeScript 项目,目标是在大幅提升性能的同时,保持与 Prettier 输出结果的高度一致。作为 VoidZero 更大规模 Oxc 工具链计划的一部分,Oxfmt 在官方测试中展现出比 Prettier 快 30 倍以上的格式化速度,同时与 Prettier 的兼容度超过 95%。

Oxfmt 试图解决 JavaScript 生态中一个长期存在的矛盾:性能与习惯之间的冲突。一方面,Rust 工具链在性能上优势明显;另一方面,Prettier 已成为事实上的格式化标准。Oxfmt 将两者结合,既利用 Rust 带来的性能提升,又严格对齐 Prettier 的格式化风格,使其可以作为 Prettier 的“即插即用”替代方案,开发者迁移时几乎不需要承受格式差异带来的成本。

Oxfmt 的开发动机,部分来自 VoidZero 在 2025 年初发布 Oxlint 之后收到的大量用户反馈。根据官方公告,用户反复提出对“样式类能力”的需求,例如 import 排序。VoidZero 团队对此采取了明确的工具边界划分:Lint 工具负责逻辑问题,Formatter 只关注代码风格。通过同时提供 Oxlint 与 Oxfmt,团队希望减少配置复杂度,并避免在多个工具之间反复关闭重叠规则。

在性能方面,官方基准测试显示:在无缓存的首次运行中,Oxfmt 的速度约为 Biome 的 3 倍、Prettier 的 30 倍。Oxfmt 构建在 Oxc 编译器栈之上,刻意规避了现有格式化工具中常见的架构瓶颈,因此在大型代码库和 CI 场景下表现尤为突出。

从 Prettier 迁移到 Oxfmt 对多数项目来说相当简单。开发者只需将现有的 .prettierrc 配置文件重命名,即可直接使用 Oxfmt。当前版本已支持包括 singleQuote、printWidth 在内的多项主流 Prettier 配置,完整列表可在官方文档中查阅。虽然 Oxfmt 目前通过了约 95% 的 Prettier JavaScript 和 TypeScript 测试用例,但 VoidZero 也在持续向 Prettier 提交 Bug 报告和 Pull Request,以进一步缩小两者之间的差异。

开发者 Ryan Leichty 在 X(原 Twitter)上回应作者相关帖子时表示:

我们已经切到 oxlint 了,oxfmt 真的等不及了。

参数状态管理工具 nuqs 的官方账号,则在评论 Oxfmt 新增 Tailwind CSS 支持时写道:

对 Biome 来说,直接被秒。很期待用 oxfmt 替换 Prettier(顺便也可能把 oxlint 一起试了)。

在 Reddit 上,也有用户围绕 Oxfmt 与 Biome 的性能差异提出疑问

不错啊,但有点好奇,他们是怎么做到比同样是 Rust 的 Biome 快这么多的?

对此,有人回应称,关键区别在于两者的架构设计:

架构完全不一样,而且对性能这件事是真的“较真到偏执”。

从更广泛的工具生态来看,Oxfmt 与 Biome、Prettier 一同构成了 JavaScript 和 TypeScript 领域的主要格式化工具选择。Prettier 仍然是采用最广泛的事实标准;Biome 则通过将 lint 与 format 合并到单一工具中逐渐获得关注。Oxfmt 的差异化路径在于:在保持 Prettier 兼容性的前提下,提供超越两者的性能表现。与 Biome 类似,Oxfmt 也构建在 biome_formatter 的一个分支之上,VoidZero 在公告中特别致谢了 Biome 与 Rome 团队的基础性贡献。

展望即将到来的 Beta 版本,VoidZero 正在推进多项实验性能力的稳定化工作,包括内置 import 排序、CSS-in-JS 的嵌入式语言格式化等功能。同时,团队也在研究为 Vue、Svelte、Astro 等主流框架提供插件支持。开发者可以通过项目的 GitHub Discussions 提交问题和反馈,或加入官方 Discord 社区参与讨论。

原文链接:

https://www.infoq.com/news/2026/01/oxfmt-rust-prettier/

Clawdbot 对接飞书详细教程 手把手搭建你的专属 AI 助手

注意本教程在 Linux 系统下进行

Clawdbot 由于 Claude 的版权问题,已更名为 Moltbot,因此本教程基于最新版本编写。下面进入安装流程

首先准备一台闲置的云服务器或 VPS(推荐使用香港或海外节点)。由于 Clawdbot 运行时权限较大,出于安全考虑,不建议在本地或工作机上安装,推荐在一台独立的空服务器上部署。准备完成后,登录到服务器。

安装

如果你不想安装,可以直接使用阿里云的Clawdbot 一键部署,部署之后可以直接跳到对接飞书

第一步安装 Git

# 安装 Git
sudo apt update
sudo apt install git -y

第二步安装 Node.js

# 安装 NVM
# 国内使用 gitee 的镜像源
curl -o- https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh | bash

# 国外使用
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

# 重新加载环境变量
source ~/.bashrc

# 安装 Node.js 22
nvm install 22

# 查看 nodejs 版本
node -v # 输出 v22 即可,版本只要 22 就行

安装 Moltbot (原 Clawdbot)

# 使用官方脚本安装
curl -fsSL https://molt.bot/install.sh | bash
服务器在国内,如果安装失败的话,可能需要解决网络问题

其他平台安装方式请参考Moltbot (原Clawdbot) 安装文档

你会看到如下图输出
Clawdbot 安装过程 - AI 助手部署初始化
如果首次安装,时间会很长,需要耐心等待。
如果最后输出如下内容:

→ npm install failed; cleaning up and retrying...

新的脚本服务器内存要求变高了,据我使用下来 2G 内存,肯定会 OOM,如果出错的话,建议使用 swap 把硬盘空间当作交互内存使用。

成功之后会输出如下图片
Clawdbot 安装成功 - AI 机器人配置向导
第一个选项选择 yes, 就是询问你是否知道风险的。
第二步选择 QuickStart
Clawdbot QuickStart 快速开始选项
第三步选择模型服务商,这里选择 Qwen,免费额度充足,适合入门使用
Clawdbot 选择 AI 模型服务商 Qwen 千问
选择千问模型后,会提供一个链接,复制并在浏览器中打开,如下图
Clawdbot 千问模型授权链接
打开浏览器后,会看到如下界面。由于我已登录过,所以显示账户信息;如果尚未登录,按照提示完成登录即可。
Clawdbot 千问 AI 账户登录页面
登录完成后,会出现以下选项,提示选择对应的千问模型,如下图
Clawdbot 选择千问 AI 模型版本
选择默认模型即可。接下来会提示选择 channel,这里先跳过,后续再添加
Clawdbot channel 渠道配置选项
继续下面选择 skills,也是选择 No,如下图
Clawdbot skills 技能配置选项
继续下面选择 hooks,也是使用空格选择 No,如下图
Clawdbot hooks 配置选项
然后等待安装完成,最后会出现以下选项,这里选择 TUI
Clawdbot 选择 TUI 终端界面
如果看到 TUI 聊天界面,说明安装成功,可以尝试输入 Hello 进行测试。
Clawdbot TUI 聊天界面 - AI 助手对话测试
然后直接使用 ctrl+c 先关闭,后面我们再来设置

查看服务

可以使用下面的命令来查看

clawdbot status

会看到如下图的结果就说明服务启动了
Clawdbot 服务状态检查 - AI 助手运行中

访问 Web UI 面板

如何访问面板?服务监听在 http://127.0.0.1:18789/ 端口上,我们现在通过 ssh 隧道来访问,输入下面的命令

ssh -N -L 18789:127.0.0.1:18789 用户名@服务器IP
# 回车之后
用户名@服务器IP's password: # 输入密码

然后在浏览器打开 http://127.0.0.1:18789/, 你会看到 Dashboard 了,如下图
Clawdbot Web UI Dashboard 未授权页面
图中显示的是未授权状态,回到服务器,输入以下命令

clawdbot dashboard

会看到下面的面板数据
Clawdbot Dashboard URL 获取命令
复制对应的 Dashboard URL 到浏览器打开,即可正常查看聊天记录。
Clawdbot Web UI 管理面板 - AI 助手聊天记录

至此 Clawdbot 已安装完成,可以正常访问了。然后聊天框里面首次输入 Hello, Clawdbot 会询问你他应该叫什么,应该叫你什么。就是你需要给它设置个名字,还有 bot 改叫你什么。你可以在聊天框这么输入

Name: Clawdbot

My Name: Boss

对接飞书

首先安装飞书插件,输入以下命令

clawdbot plugins install @m1heng-clawd/feishu

登录飞书开放平台 https://open.feishu.cn,点击「开发者后台 -> 创建企业自建应用」,如下图
飞书开放平台创建企业自建应用 - Clawdbot 对接
然后点击创建应用,如下
飞书创建应用 - Clawdbot AI 机器人
创建完成后,首先到凭据管理中获取 App ID 和 App Secret,注意保存,后续配置需要使用。
飞书 App ID 和 App Secret 凭据管理
然后添加机器人,如下操作
飞书添加机器人能力 - Clawdbot AI 助手
首先配置个名字
飞书机器人名称配置 - Clawedbot

飞书的其他配置先暂停,回到服务器配置 Clawdbot 的飞书参数

添加飞书配置

clawdbot config set channels.feishu.appId "飞书 app id"

clawdbot config set channels.feishu.appSecret "飞书 app secret"

clawdbot config set channels.feishu.enabled true

# 推荐使用 websocket
clawdbot config set channels.feishu.connectionMode websocket

clawdbot config set channels.feishu.dmPolicy pairing

clawdbot config set channels.feishu.groupPolicy allowlist

clawdbot config set channels.feishu.requireMention true

配置完成之后,重启

clawdbot gateway restart

重启完成后回到飞书,找到「事件和回调」,选择长连接模式,如下图
飞书事件和回调配置 - Clawdbot 长连接模式
如果配置成功,说明连接已建立。继续下面的配置,添加事件,选择「接收消息」事件
飞书添加接收消息事件 - Clawdbot AI 助手
事件添加完成之后,还需要开通权限,有以下权限全部勾选

权限Scope(范围)Description(说明)
contact:user.base:readonly用户信息获取基础用户信息
im:message消息 全部勾选发送和接收消息

如下图
飞书权限配置 - Clawdbot 用户信息权限

飞书消息权限配置 - Clawdbot AI 机器人

以上步骤全部完成后,即可与机器人对话。但在此之前需要先创建一个版本
飞书应用版本发布 - Clawdbot AI 助手上线

注意:每次修改配置后都需要重新发布版本,建议全部配置完成后再统一发布。

发布完成后,回到飞书客户端,可以看到应用已上线,点击打开应用
飞书应用发布成功 - Clawdbot AI 机器人
向机器人发送 Hello,即可收到 Moltbot 的回复
飞书 Clawdbot AI 助手回复测试成功

如有勘误 还请指正

Clawdbot (moltbot) 对接飞书详细教程 手把手搭建你的专属 AI 助手