2026年1月

精简 Excel 工作簿、删除多余或不再使用的工作表,是一种非常有效的整理方式。通过移除无关内容,可以减少冗余信息,使文件结构更加清晰,只保留最有价值的数据。删除不必要的工作表不仅有助于释放存储空间,还能让工作簿的浏览与管理更加高效、直观。

在本文中,你将学习如何使用 Spire.XLS for .NET 库,通过 C# 从 Excel 工作簿中删除指定的工作表。

安装 Spire.XLS for .NET

首先,你需要将 Spire.XLS for .NET 包中包含的 DLL 文件添加为 .NET 项目的引用。你可以通过提供的下载链接手动下载 DLL 文件并引入项目,或者直接使用 NuGet 进行安装。

PM> Install-Package Spire.XLS

在 C# 中通过索引删除工作簿中的工作表

Spire.XLS for .NET 提供了 WorksheetsCollection.RemoveAt(int index) 方法,可根据工作表在工作簿中的索引位置删除指定的工作表。

具体示例代码如下:

using Spire.Xls;
using Spire.Xls.Collections;

namespace RemoveWorksheetByIndex
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Workbook 对象
            Workbook wb = new Workbook();

            // 加载 Excel 文件
            wb.LoadFromFile(@"C:\Users\Administrator\Desktop\Input.xlsx");

            // 从工作簿中获取工作表集合
            WorksheetsCollection worksheets = wb.Worksheets;

            // 根据索引删除指定的工作表
            worksheets.RemoveAt(0);

            // 将工作簿保存为新的 Excel 文件
            wb.SaveToFile("RemoveByIndex.xlsx", ExcelVersion.Version2016);

            // 释放资源
            wb.Dispose();
        }
    }
}

在 C# 中通过工作表名称删除工作簿中的工作表

如果你已经知道需要删除的工作表名称,可以使用 WorksheetsCollection.Remove(string sheetName) 方法,直接按名称从工作簿中移除对应的工作表。

具体示例代码如下:

using Spire.Xls;
using Spire.Xls.Collections;

namespace RemoveWorksheetByName
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Workbook 对象
            Workbook wb = new Workbook();

            // 加载 Excel 文件
            wb.LoadFromFile(@"C:\Users\Administrator\Desktop\Input.xlsx");

            // 从工作簿中获取工作表集合
            WorksheetsCollection worksheets = wb.Worksheets;

            // 根据工作表名称删除指定的工作表
            worksheets.Remove("sheet2");

            // 将工作簿保存为新的 Excel 文件
            wb.SaveToFile("RemoveByName.xlsx", ExcelVersion.Version2016);

            // 释放资源
            wb.Dispose();
        }
    }
}

在 C# 中一次性删除工作簿中的所有工作表

如果需要一次性移除工作簿中的所有工作表,可以使用 WorksheetsCollection.Clear() 方法快速清空工作表集合。

具体示例代码如下:

using Spire.Xls;
using Spire.Xls.Collections;

namespace RemoveAllWorksheets
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 Workbook 对象
            Workbook wb = new Workbook();

            // 加载 Excel 文件
            wb.LoadFromFile(@"C:\Users\Administrator\Desktop\Input.xlsx");

            // 从工作簿中获取工作表集合
            WorksheetsCollection worksheets = wb.Worksheets;

            // 删除所有工作表
            worksheets.Clear();

            // 将工作簿保存为新的 Excel 文件
            wb.SaveToFile("RemoveAllWorksheets.xlsx", ExcelVersion.Version2016);

            // 释放资源
            wb.Dispose();
        }
    }
}

申请临时许可证

如果你希望移除生成文档中的评估提示信息,或解除功能限制,请申请一个 为期 30 天的试用许可证。

最近项目组做了一次安全项目,在联动讨论中,我们团队提出攻克一个一直被“模糊处理”的问题:如何在不引入复杂流量解密、不严重影响性能的前提下,更可靠地识别潜在的 C2通信行为。

其实在我看来这个问题并不新,在往常的项目中异常端口、可疑域名、频繁外联、策略命中日志等检测点都是这个问题。而这些信号单独存在时,误报率高,且很难形成可执行的处置结论。而本次讨论的关键转折点,正是在“出站 IP 本身是否具备明确恶意属性”这一角度上。

一、从“流量行为”转向“通信对象本身”的判断

在复盘既往处置案例时,阿孙提到一个共性:多数被确认为C2 的样本不是因为流量形态极其复杂,而是其通信目标本身就具备明显的基础设施风险特征,比如位于高风险国家或地区、IP 段频繁出现在僵尸网络、钓鱼、木马回连情报中、长期驻留在 VPS/云主机/异常 ASN、多项目/多情报源重复命中等

但这些信息在现有体系中是割裂的,地理信息在 IP 归属系统中,恶意标签在威胁情报平台中,而F火墙/EDR却只能看到“一个外联IP”,由此,我门讨论是否可以多采用IP离线库植入威胁情报,手动拓宽我们的“威胁情报”,提出这正是我们提出使用IP离线库和威胁情报进行融合。

二、 为什么必须引入 IP 离线库,而不是完全依赖情报 API

最初也有人提出直接调用在线威胁情报 API 即可,但在技术评估阶段,很快暴露出几个不可回避的问题:

1. 出站连接频率高,实时 API 成本与延迟不可控
在核心业务网段,单节点每天的外联 IP 数量级在百万级,实时查询并不可行。

2. 部分安全系统处于内网或半隔离环境
核心日志分析、审计系统无法直接访问外部情报接口。

3. IP 基础属性缺失会削弱判断上下文
单一“是否恶意”的结论,无法解释风险来源,例如:

1. 这是一个海外 IDC 正常业务 IP?

2. 还是位于高风险区域的小型自治系统?

3. 是否属于动态拨号或代理出口?

因此,我们的思路是先通过本地 IP 离线库快速完成“背景定性”,再用威胁情报完成“恶意定量”  。

三、 IP离线库在 C2 识别中的实际定位

在方案中,IP 离线库并不直接承担“是否 C2”的判断,而是用于回答以下关键问题:

1. 该出站 IP 的国家/地区/城市是否与业务场景匹配

2. 是否命中云厂商、数据中心、匿名网络、异常 ASN

3. 是否存在明显的跨国、跨区域跳变特征

4. 是否属于历史上极少访问、但突然频繁出现的地理位置

在我们实际部署中,使用的是IP数据云离线库,它覆盖IPv4/IPv6的本地IP 离线库,字段不仅包括国家、省市,还包含 ASN、运营商类型、IDC/住宅网络标识,方便后续识别C2通信,评估出站IP是否为已知恶意地址。
【场景:识别C2通信】评估出站IP是否为已知恶意地址,方法:IP离线库+威胁情报融合2.png

四、 威胁情报融合的方式,而非简单“命中即拦截”

第二层才是威胁情报,但这里我们刻意避免了“黑名单式”的粗暴使用方式。

具体做法是:

第一步,多源情报聚合:商业情报 + 社区情报 + 历史处置数据

第二步,情报置信度分级:区分活跃 C2、历史恶意、关联基础设施

第三步,时间衰减机制:避免因陈旧情报导致长期误判

当某个出站 IP在 IP 离线库中表现为、海外小众地区、云主机 / VPS、非业务白名单 ASN,该IP同时在威胁情报中命中已知 C2 或僵尸网络关联,被多个情报源低频标注,我们才将其提升为  “高置信度可疑 C2 通信”  ,进入阻断或人工复核流程。

五、 实际落地的处理流程拆解

在最终方案中,整体流程被拆解为清晰的四个阶段:

1. 出站连接采集
从F火墙、NDR、EDR 中统一采集目的 IP、端口、协议、频率。

2.IP 离线库快速画像

1. 地理位置

2. ASN / 网络类型

3. 是否云主机 / IDC

4. 是否偏离正常业务访问分布

3.威胁情报关联评分

1. 是否命中恶意标签

2. 情报来源数量

3. 最近活跃时间

4. 策略与响应联动

1. 自动阻断(高置信度)

2. 降权监控(中置信度)

3. 留痕审计(低置信度)

这种方式的一个明显变化是我们不再“猜测流量是不是 C2”,而是在判断“这个通信对象是否值得被当作 C2 对待”  。

项目讨论中最被认可的是①不依赖深度包检测;②不影响现有网络性能;③可解释性强,适合审计与复盘;④能在离线、内网环境稳定运行。【场景:识别C2通信】评估出站IP是否为已知恶意地址,方法:IP离线库+威胁情报融合1.png

Python动态类型机制所带来的编码自由度,是吸引无数开发者深耕于此的核心魅力,却也如同一把双刃剑,在消解静态类型繁琐约束的同时,埋下了类型契约模糊、行为边界失范的隐性隐患,传统测试手段始终被困在“预设输入-验证输出”的点覆盖逻辑里,面对动态类型环境中对象属性动态绑定、参数类型多元兼容、逻辑分支随运行时状态灵活演化的复杂场景,往往显得捉襟见肘,而属性测试的横空出世,恰好为突破这一技术困局提供了全新的实践路径,它不再执着于单一用例的精准匹配,而是从被测试对象的核心行为特征出发,提炼出那些不因输入变化、环境调整、版本迭代而转移的普适性属性共识,通过海量衍生场景的自动化探索,验证对象在动态变化全过程中的行为稳定性与一致性,这种从“点验证”到“面验证”的思维跃迁,恰恰切中了动态类型环境下测试有效性的核心诉求。在个人长期的开发实践与技术复盘过程中,我逐渐意识到,动态类型的灵活绝非放任代码类型混乱的借口,而是需要更高级的测试方法论来守护代码的可靠性底线,属性测试正是这样一种方法论,它不依赖于代码层面的类型注解或静态检查工具的表层扫描,而是深入到代码运行时的行为本质,通过挖掘那些支撑业务逻辑的核心不变量,构建起动态类型环境下的信任基石,这种信任基石的搭建,远比零散的单元测试用例更具抗脆弱性,也更能适应Python动态特性带来的代码演化需求,更重要的是,它让开发者在享受动态类型便利的同时,不必承担隐性错误扩散的风险,真正实现了灵活与可靠的双向平衡。

动态类型环境中最常见且最易被忽视的痛点,莫过于函数或对象对参数的隐式约定,这种约定往往不会以显性的类型声明或文档注释的形式呈现,而是潜藏在代码逻辑的深处,成为只有开发者本人才能意会的“潜规则”,传统测试只能基于开发者的经验与认知预设有限的测试用例,却很难覆盖那些边缘的、非常规的输入组合,而这些组合恰恰是动态类型代码最容易出现问题的重灾区,很多时候,这些非预期输入并不会触发语法错误或程序崩溃,而是会产生不符合业务预期的隐性结果,这种结果在测试阶段难以被察觉,却会在生产环境中引发连锁反应,造成难以估量的损失。属性测试的核心优势就在于它能够基于预设的生成策略,自动生成海量多样化的输入数据,这些数据不仅涵盖常规的合法输入,更包括那些边界值、异常值和类型兼容但行为存疑的输入,在个人实践过程中,我曾针对一个处理复杂层级数据结构的工具类展开测试,最初采用传统单元测试的思路,设计了二十余组覆盖常规场景的用例,测试通过率达到100%,但当引入属性测试后,通过提炼“数据转换前后核心特征不变”“异常输入触发合规反馈而非隐性错误”等关键属性,测试工具在短时间内自动生成了数千组输入数据,成功暴露了多个隐藏在动态类型兼容场景下的行为漏洞,比如当输入数据中混合了字符串与数字类型的键名时,工具类会出现键值映射错位的问题,当输入嵌套层级超过预设阈值时,会出现数据结构扁平化不彻底的问题,这些漏洞在常规测试中完全无法被发现,因为它们既不触发报错信息,也不会导致程序终止,只是会在特定条件下产生偏离预期的输出,而这种隐性问题,在动态类型项目中往往会随着代码迭代不断放大,最终演变成难以排查的系统故障。

属性测试的有效性,本质上取决于开发者对被测试对象核心属性的提炼能力,这也是属性测试区别于传统测试的关键所在,更是考验开发者对业务逻辑理解深度的试金石,在动态类型环境中,对象的属性并非一成不变,部分属性是与代码实现细节强耦合的边缘属性,会随着版本迭代或逻辑调整发生变化,而另一些属性则是支撑对象存在的核心骨架,是与业务目标直接相关的稳定属性,属性测试的第一步,就是要精准区分这两类属性,剥离那些易变的、非核心的边缘属性,聚焦于那些稳定的、决定对象价值的核心属性,这些核心属性往往表现为行为层面的不变量,比如对象经过特定操作后状态的一致性、不同输入序列下输出结果的可复现性、参数类型兼容转换后的行为等价性等。在实践中,我曾针对一个动态生成业务配置对象的模块设计属性测试,最初因为对核心属性的认知模糊,过度关注配置项的具体数值与默认参数,导致测试用例频繁失效,每当配置项的默认值调整或新增配置字段时,测试就需要大面积修改,不仅增加了维护成本,也失去了测试的意义,后来我调整思路,重新梳理模块的业务目标,提炼出“配置对象的键值映射关系与输入源完全一致”“配置项的优先级规则在动态添加与删除过程中始终生效”“配置对象序列化与反序列化后核心业务属性保持无损”这三个核心属性,这一调整让测试用例的稳定性提升了80%以上,也让测试从对实现细节的过度依赖中解脱出来,真正成为守护业务逻辑的屏障,更重要的是,这种属性提炼的过程,本身就是对代码逻辑的深度复盘,能够倒逼开发者更清晰地梳理动态类型对象的行为边界,让原本模糊的隐式约定变得显性化、结构化,从而降低团队协作中的沟通成本,避免因认知偏差引发的开发失误。

验证属性测试在动态类型环境中的有效性,需要建立多维度的评估体系,而不是简单以测试通过率作为唯一标准,单一的通过率指标往往具有极强的迷惑性,无法反映测试的真实价值,只有从多个维度进行综合评估,才能全面衡量属性测试的有效性与实用性。第一个维度是覆盖深度,这不仅包括代码行的覆盖,更重要的是行为路径的覆盖,通过分析属性测试生成的输入数据所触发的代码执行路径,可以清晰看到哪些路径是传统测试从未触及的,这些路径往往对应着动态类型代码中最复杂的逻辑分支,比如参数类型的强制转换逻辑、异常情况的兜底处理逻辑等,在实践中,我曾对比过同一模块的传统单元测试与属性测试的路径覆盖情况,结果显示传统测试仅覆盖了65%的行为路径,而属性测试的路径覆盖率达到了92%,那些未被覆盖的路径,恰恰是最容易滋生隐性错误的区域。第二个维度是行为一致性,即在不同版本迭代中,核心属性的验证结果是否保持稳定,在个人实践中,我发现当对一个动态类型工具库进行重构时,传统单元测试需要修改超过60%的用例才能适配新的实现逻辑,而属性测试仅需调整少量输入生成策略,核心属性的验证逻辑完全无需改动,这充分体现了属性测试在应对代码演化时的超强适应性,因为它关注的是业务行为而非实现细节,只要核心业务逻辑不变,测试就无需大动干戈。第三个维度是问题发现效率,属性测试能够在代码提交后的自动化测试阶段,快速定位那些因动态类型特性引发的隐性问题,相比传统测试依赖人工复现的低效模式,属性测试可以直接输出触发问题的输入特征,极大缩短了问题排查的周期,比如一次重构后,工具库出现了罕见的配置项丢失问题,传统测试花费了两天时间仍未定位到根源,而属性测试在运行后立即输出了触发问题的输入组合,开发者仅用一小时就找到了问题所在,这种效率上的提升,对于追求快速迭代的动态类型项目而言,具有不可替代的价值。

在动态类型环境中践行属性测试,需要警惕一些容易陷入的实践误区,这些误区往往源于开发者对动态类型特性与属性测试本质的理解偏差,一旦踩入,不仅无法发挥属性测试的价值,反而会增加不必要的开发负担,甚至误导测试方向。第一个常见误区是过度抽象属性,将一些非核心的、与业务无关的特征纳入属性范畴,导致测试用例与代码实现过度耦合,一旦代码细节调整,测试就会失效,这种脱离业务本质的属性设计,完全违背了属性测试的初衷,比如在测试一个动态序列化工具时,我曾错误地将序列化后的字符串长度纳入核心属性,结果当工具引入压缩算法后,字符串长度大幅变化,导致测试全面失效,后来我将属性调整为“序列化与反序列化后内容完全一致”,才解决了这个问题。第二个误区是忽视动态类型的灵活性,用静态类型的思维设计属性测试,比如强行限制输入数据的类型范围,这不仅浪费了属性测试的场景探索能力,也与Python动态类型的设计哲学相悖,比如测试一个支持多类型输入的字符串处理函数时,若强行将输入限制为字符串类型,就会错过数字、布尔值等类型隐式转换为字符串后的行为测试,从而遗漏潜在问题。第三个误区是低估输入生成策略的重要性,简单采用默认的随机生成规则,导致生成的输入数据要么过于单一,无法覆盖复杂场景,要么过于杂乱,难以触发有价值的代码路径,在个人实践中,我曾因依赖默认生成策略而导致属性测试长期无法发现潜在问题,后来通过结合业务场景定制输入生成规则,比如针对动态数据结构设置嵌套深度阈值、针对参数类型设置兼容转换规则、针对业务逻辑设置输入数据的分布权重,才让属性测试的效能得到充分释放,这些实践误区的踩坑与复盘,让我深刻认识到,属性测试不是一个可以无脑套用的工具,而是需要结合动态类型特性与业务场景灵活调整的方法论,只有避开这些误区,才能真正发挥它的价值。

属性测试在Python动态类型环境中的应用,绝不仅限于测试层面,更能反向推动代码设计的优化与升级,实现测试与开发的双向赋能,在动态类型环境中,代码的可读性与可维护性很大程度上取决于行为契约的清晰度,而属性测试提炼核心属性的过程,正是对行为契约的显性化定义,这种显性化定义能够让团队成员更准确地理解代码的设计意图,减少因类型模糊引发的沟通成本,提升协作效率。在长期实践中,我发现引入属性测试的动态类型项目,代码的内聚性会显著提升,开发者会不自觉地规避那些行为模糊、属性混乱的设计,转而追求核心属性清晰、行为边界明确的代码结构,比如在设计一个动态数据验证工具时,因为属性测试要求核心验证规则稳定不变,开发者会主动将验证规则与输入数据的类型处理逻辑解耦,从而提升代码的可复用性与可维护性,这种由测试驱动的设计优化,远比单纯的代码评审更具约束力,也更能从根源上提升代码质量。

Python生态的生命力源于其极致的灵活性与丰富的库资源,这种特性让开发者能快速搭建各类应用、适配多元场景,却也为模糊测试的普及埋下了深层矛盾。模糊测试的核心价值在于通过非预设输入的探索性验证,捕捉常规测试难以触及的隐性风险,但其在Python生态中始终未能像单元测试工具那样融入主流开发流程,并非工具本身不够成熟,而是生态的碎片化特性、开发者的认知偏差、工具与开发节奏的适配失衡等多重因素交织,形成了一道难以逾越的普及壁垒。这种壁垒并非显性的技术难题,而是隐藏在工具选型、学习路径、流程整合等日常开发场景中的隐性阻碍,需要从生态特性与测试需求的本质矛盾出发,才能看清其核心症结——模糊测试的设计逻辑与Python开发者的使用习惯、项目的迭代节奏、生态的兼容模式之间存在着未被弥合的缝隙,这些缝隙共同构成了普及路上的隐形鸿沟。Python生态的独特性在于第三方库的爆发式增长,不同领域的库在设计理念、数据结构、执行逻辑上差异巨大,而模糊测试工具往往基于通用逻辑开发,难以兼顾各类库的特性,比如面向结构化数据处理的库与面向异步网络请求的库,对输入数据的格式、类型、边界条件的要求截然不同,模糊测试工具若缺乏针对性的适配策略,生成的输入数据要么无法触发核心逻辑,要么因格式不兼容被直接过滤,无法发挥探索性测试的真正价值,这种适配的复杂性让很多开发者在初期尝试后便选择放弃。

工具生态的碎片化适配困境,是模糊测试在Python生态中普及的首要障碍。Python生态中存在大量功能各异的框架、库与开发范式,从Web开发、数据处理到自动化脚本,不同场景下的项目架构、接口设计、数据流转逻辑差异极大,而现有模糊测试工具大多缺乏普适性的适配能力,往往针对特定场景设计,难以兼容多元开发模式。例如面向Web框架的模糊测试工具,在应对数据科学领域的矩阵运算库时,会因输入生成逻辑与数据结构不匹配而失效;针对同步代码设计的工具,在处理异步协程项目时,又会出现执行流程错乱的问题。更关键的是,Python库的版本迭代频繁,部分库的接口在迭代中缺乏向后兼容,导致模糊测试工具需要持续跟进适配,而多数工具维护团队规模有限,难以覆盖全生态的版本更新,这就使得开发者在使用时往往需要投入大量精力进行定制化改造,从输入生成规则的调整到执行逻辑的适配,一系列繁琐的适配工作让很多开发者望而却步,最终放弃引入模糊测试。以某主流模糊测试工具为例,其最初针对传统同步Web框架开发,当异步框架逐渐成为主流后,工具未能及时更新协程兼容逻辑,开发者若要在异步项目中使用该工具,需要手动修改工具的执行引擎,添加协程调度的适配代码,这不仅要求开发者熟悉工具的内部实现,还需要掌握异步编程的核心原理,对于专注于业务开发的团队而言,这种额外的技术投入远超预期收益,自然会将模糊测试排除在核心测试流程之外。

开发者的认知阈值与使用惯性,构成了模糊测试普及的深层阻碍。在Python开发群体中,多数开发者更倾向于轻量化、即时反馈的测试方式,单元测试的“编写用例-执行验证-快速迭代”模式已深入人心,形成了稳定的使用惯性。而模糊测试的核心逻辑与这种惯性存在天然差异,它需要开发者跳出“预设场景”的思维定式,转向“探索性验证”的逻辑,这种思维转换本身就存在一定的认知门槛。更重要的是,模糊测试的价值呈现方式较为间接,它无法像单元测试那样即时反馈用例通过率,而是需要通过长期运行、海量输入探索才能发现潜在风险,这种“慢反馈”特性与Python项目快速迭代的开发节奏形成了鲜明冲突。很多开发者在初期尝试时,因短期内看不到明显效果,便认为模糊测试“性价比低”,忽视了其在捕捉隐性风险、提升代码鲁棒性上的长期价值。此外,行业内对模糊测试的宣传多聚焦于复杂场景的深度验证,导致很多开发者形成“模糊测试只适用于大型项目”的认知偏差,而Python生态中大量的中小型项目、工具类库开发者,往往因这种认知而不愿尝试引入。比如一个开发轻量级数据解析库的团队,开发者习惯用单元测试覆盖常见的解析场景,当尝试引入模糊测试时,连续运行数小时未发现明显问题,便觉得模糊测试对小型项目没有价值,却忽略了那些极端数据格式可能引发的解析逻辑漏洞,这些漏洞在日常使用中出现概率低,但一旦出现就会导致整个解析流程瘫痪,而这种隐性风险的预防价值,恰恰是模糊测试的核心优势所在。

学习路径的陡峭与优质资源的匮乏,进一步加剧了模糊测试的普及难度。模糊测试本身涉及输入生成策略、覆盖准则设计、结果分析等多个专业维度,而Python生态中针对这些维度的系统化、入门级学习资源严重不足。现有资源大多偏向工具的基础使用说明,缺乏对核心逻辑、场景化适配思路的深度拆解,导致开发者在使用时往往只知其然,不知其所以然。例如很多教程仅介绍如何调用工具生成随机输入,却未讲解如何结合项目业务逻辑设计高效的输入生成规则,如何根据不同数据类型调整探索策略,这就使得开发者在面对复杂项目时,即便掌握了基础操作,也难以发挥模糊测试的真正效能。同时,Python生态中缺乏统一的实践标准与最佳案例库,不同项目的模糊测试实施路径差异较大,开发者难以借鉴成熟经验,只能在试错中摸索,这不仅增加了学习成本,还容易因初期的错误实践导致对模糊测试的误解,进一步阻碍了其普及。比如针对机器学习模型的输入验证场景,模糊测试需要生成符合特征维度、数值范围的输入数据,才能有效测试模型的鲁棒性,但现有教程几乎没有涉及这类场景的适配方法,开发者只能盲目使用默认的随机输入生成规则,导致生成的大量数据因不符合特征要求被模型直接拒绝,测试效率极低,这种低效的实践体验会让开发者对模糊测试的价值产生怀疑,最终放弃深入探索。

资源消耗与执行效能的错配,是模糊测试在Python生态中落地的现实障碍。Python作为解释型语言,运行速度本身就低于编译型语言,而模糊测试需要生成海量输入数据并反复执行被测试代码,这会带来显著的资源消耗——大量的CPU占用、内存开销以及漫长的执行时间,这种消耗在中小型项目、资源有限的开发环境中尤为突出。例如在处理复杂数据结构或逻辑密集型代码时,模糊测试的执行速度可能是单元测试的数十倍,一次完整的测试往往需要数小时甚至数天,这与Python项目快速迭代、频繁测试的开发模式严重不符。更关键的是,模糊测试的执行效能与输入生成策略的精准度密切相关,若输入生成缺乏针对性,大量无效输入会进一步拉长测试周期、浪费资源,而精准输入策略的设计又需要开发者投入额外精力,这种“高投入-低效能”的错配让很多团队在权衡成本后,选择放弃引入模糊测试,即便认可其价值,也只能将其作为边缘测试手段,难以融入核心开发流程。以一个处理复杂数学运算的工具库为例,其核心函数包含多层嵌套的逻辑判断,模糊测试需要生成大量不同数值范围、精度的输入数据,在普通的开发电脑上,一次完整的测试需要占用80%以上的CPU资源,持续运行超过12小时,期间开发者无法进行其他开发工作,这种资源占用与时间成本,对于追求快速迭代的小型团队而言,显然是难以承受的,最终只能将模糊测试从日常测试流程中剔除。

生态级集成支持的缺失,让模糊测试难以形成顺畅的使用闭环。在Python生态中,单元测试工具已与主流IDE、CI/CD平台、代码管理工具形成深度集成,开发者可以在编码过程中即时编写用例、提交代码后自动触发测试、通过平台直观查看结果,这种无缝集成的体验极大降低了使用门槛。而模糊测试工具在这方面的集成支持严重不足,多数工具仍以独立运行的命令行形式存在,缺乏与主流开发工具链的适配,导致开发者需要在不同工具之间手动切换、传递数据,打破了原有的开发流程闭环。例如在CI/CD流程中,模糊测试的配置复杂且缺乏标准化,不同平台的适配方式各异,需要开发者编写大量定制化脚本才能实现自动触发;在结果分析环节,多数工具输出的日志格式杂乱,缺乏与代码调试工具的联动,开发者需要手动定位问题关联的代码片段,排查效率极低。这种集成层面的断层,让模糊测试无法像单元测试那样融入日常开发的每一个环节,只能作为额外的“附加操作”,自然难以得到广泛普及。比如在GitHub Actions中配置模糊测试,开发者需要手动编写yaml配置文件,指定工具的安装路径、执行命令、输出目录,还需要处理不同操作系统的兼容性问题,而单元测试只需调用内置的测试命令即可自动运行;在结果分析时,模糊测试工具输出的日志仅包含输入数据与执行结果,开发者需要手动将输入数据代入代码调试,才能定位问题根源,这种繁琐的操作流程,让模糊测试的使用体验远不如单元测试流畅,难以被开发者广泛接受。

价值转化的模糊性与评估体系的缺失,是模糊测试普及的终极桎梏。模糊测试的核心价值在于预防潜在风险、提升代码鲁棒性,但这种价值难以量化评估,不像功能测试那样可以通过用例通过率、缺陷修复率等明确指标衡量。在Python生态中,多数项目缺乏对模糊测试价值的评估标准,开发者无法直观判断引入模糊测试后代码质量的提升幅度,也难以向团队或管理层证明其投入的合理性。例如模糊测试发现的隐性风险,若未发生实际影响,往往被认为是“无关紧要的问题”,其预防价值被严重低估;而即便发现了关键风险,也因缺乏前后对比数据,难以量化其避免的损失。这种价值转化的模糊性,导致很多团队在资源分配时优先选择价值明确的测试手段,而将模糊测试排在次要位置。此外,行业内尚未形成统一的模糊测试效果评估框架,不同项目对“有效测试”的定义各异,进一步加剧了价值认知的混乱,让开发者在引入时缺乏明确的目标导向,最终难以坚持长期使用,也阻碍了模糊测试在Python生态中的广泛普及。

想让 swapfile 变大一些?环境很复杂?不会太难的,我们一步步来。

搜索

根据我的环境,在搜索引擎搜索 swapfile 分配或扩展相关内容,可得:

分析

稍微分析一下:

  • 因为配置了 timeshift,swapfile 不应该放在根目录子卷(/@/swap/swapfile),而是应该创建一个 swap 子卷来存放 swapfile(/@swap/swapfile)以防止 timeshift 在备份根目录子卷时把 swapfile 也备份进去了。
  • Linux 发行版在开机时根据 /etc/fstab 配置的内容挂载分区,我最好在取消挂载 swapfile 或本操作系统未运行时对文件系统修改以避免对正在运行的操作系统产生未知的影响。

执行

  1. 重启到 live 系统:
    我使用 Ventoy 启动了硬盘中的 Manjaro Linux 安装镜像;

  2. 初始化挂载环境:

    • 确保 /mnt 为空且未挂载任何分区:
      执行:sudo findmnt -R /mnt,如果不为空,逐个手动取消挂载;
    • 创建临时文件夹:
      执行:sudo mkdir /mnt/volume && sudo mkdir /mnt/subvolume
  3. 获取对应根目录的分区设备文件名:
    执行:sudo fdisk -l,得到如 /dev/sda2/dev/nvme0n1p2,这里以 /dev/nvme0n1p3 为例;

  4. 挂载分区:
    执行:sudo mount /dev/nvme0n1p3 /mnt/volume

  5. 获取子卷 ID:
    执行:sudo btrfs subvolume list /mnt/volume

    ID 256 gen 272550 top level 5 path @
    ID 257 gen 272550 top level 5 path @home
    ID 258 gen 272528 top level 5 path @cache
    ID 259 gen 272550 top level 5 path @log
    ID 260 gen 260974 top level 5 path @swap
    ……
    

    可见子卷 @swap ID 为 260,可跳至第 7 步。

    若无 @swap 子卷,跳至第 6 步;

  6. 创建子卷:
    执行:sudo btrfs subvolume create /mnt/volume/@swap
    创建完成后跳至第 5 步;

  7. 挂载子卷:
    执行:sudo mount -o subvolid=260 /dev/nvme0n1p3 /mnt/subvolume

  8. 删除原有 swapfile:
    执行:sudo rm /mnt/subvolume/swapfile

  9. 创建新的 swapfile,替换 48g 为其他您想要的容量:
    执行:sudo btrfs filesystem mkswapfile --size 48g --uuid clear /mnt/subvolume/swapfile

  10. 配置 swapfile 自动挂载:
    编辑 /etc/fstabsudo nano /mnt/volume/@/etc/fstab
    加上以下这两行保存退出(如果已有,就不用加):

     UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /swap          btrfs   subvol=/@swap,defaults,noatime 0 0
    /swap/swapfile                             swap           swap    defaults 0 0
    

    xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 需替换为根目录 / 前的 UUID 值;

  11. 清理并重启:
    执行:sudo umount /mnt/subvolume && sudo umount /mnt/volume && sudo shutdown -r now

检查

swapon
NAME           TYPE SIZE USED PRIO
/swap/swapfile file  48G   0B   -2

📌 转载信息
转载时间:
2026/1/19 18:19:29

引言:一个“非随机”的选择困境

当你向ChatGPT、DeepSeek或文心一言提问:“2026年最适合程序员的轻薄本是哪款?”时,AI生成的答案中,为何总是那几款品牌被反复推荐,而其他性能相近甚至更具性价比的产品却踪迹全无?

这个看似“智能”的推荐,背后绝非随机选择。它是一场发生在高维向量空间、由复杂概率计算主导的精密博弈。你的品牌未被提及,不是因为产品不好,而是因为在大模型的“世界模型”里,你的信息未被有效地编码、关联,或在最终生成阶段被其他更高权重的信息“挤掉”。

本文将以技术侦探的视角,试图拆解大模型生成答案的“黑盒”流程,并逆向推演一套名为 GEO(生成式引擎优化) 的技术体系,如何通过系统工程方法,科学、可度量地提升品牌信息在这一链条中的 引用概率。

第一章:逆向工程——大模型生成答案的“三层漏斗”

尽管各大模型的内部权重与训练数据是核心机密,但根据公开论文(如Transformer架构、RAG系统原理)及可观测现象,我们可以将其生成包含外部信息的答案过程,简化为一个 “召回-排序-生成” 的三层漏斗模型。

1. 召回(Recall):从“信息宇宙”中捕捞候选集

发生了什么? 当模型解析你的问题(Query)后,它并非从完整训练数据中逐字扫描,而是将问题转化为一个高维向量(Embedding),并在其内部的索引或关联的外部知识库中,进行近似最近邻搜索(ANN),快速召回一批语义相关的信息片段(Chunks)。这些片段可能来自训练数据中的网页、文档、问答对,或实时检索的结果。

技术挑战: 如果你的品牌内容(官网、评测、技术文档)在语义上与用户的高频提问方式向量距离过远,或在数据索引中权重过低、特征不明显,就会在召回层被直接过滤掉。这是“零推荐”的根本原因之一。

2. 排序(Ranking):对候选信息进行“价值评估”

发生了什么? 召回的上百条候选信息,将进入一个复杂的排序环节。模型会综合评估每条信息的:

相关性(Relevance): 与问题的语义匹配度。

权威性(Authority):信源本身的权重(如知名媒体、官方机构、高权威域名)。

新鲜度(Freshness): 信息的时效性。

流行度(Popularity): 在训练数据中被引用的广泛程度。

技术挑战:即使被召回,如果你的内容在权威性(未被高质量信源引用)、新鲜度(信息陈旧)、流行度(网络声量小)等维度上得分不足,其综合排序也会靠后,难以进入最终生成的候选名单。

3. 生成(Generation):基于概率采样构造最终答案

发生了什么? 模型根据排序靠前的信息片段作为核心上下文,结合其预训练的世界知识,通过自回归的方式逐词生成答案。在此过程中,它会对提及的具体实体(如品牌名、产品型号)进行概率采样。排序更高、在上下文中出现更连贯、更符合模型“认知”的实体,被采样的概率自然更大。

技术挑战:生成环节的随机性背后是概率的博弈。如果你的品牌信息未能与“理想答案”的上下文强绑定,或者表述方式(如昵称、别称)未被模型良好对齐,也可能在最后一刻“落选”。

第二章:GEO的理想框架——在“三层漏斗”中施加技术干预

要系统性地提升引用概率,就必须针对上述三层漏斗,设计一套可工程化的技术干预框架。一个理想化的GEO系统应包含以下核心模块:

垂直诊断模型(用于理解与预测):

目标: 逆向诊断目标大模型(如DeepSeek、GPT-4)在特定领域的偏好与逻辑。它需要理解:对于某类问题,模型倾向于召回什么类型的内容?排序时更看重什么信号?

技术实现猜想: 可能需要通过海量的问答对进行对比学习,或对开源模型进行针对性微调,构建一个能够模拟目标模型部分决策行为的“镜像模型”。

向量化运营数据库(用于优化召回与排序):

目标: 不再将内容视为孤立的文本,而是将其结构化、向量化存储。运营重点是将品牌内容的关键信息,以更易被模型“召回”和“理解”的方式重新组织。

技术实现猜想: 建立行业知识图谱,将产品特性、使用场景、用户痛点映射为标准化的向量表示。同时,需要追踪哪些外部高权威信源引用了品牌,并优化这些“引用锚点”的内容。

实时反馈控制系统(用于验证与迭代):

目标: 构建一个分钟级监测系统,能够量化每一次优化动作(如发布一篇技术白皮书、获得一个权威媒体引用)对最终AI引用概率的影响。

技术实现猜想: 需要自动化地模拟海量用户提问,抓取AI答案,并通过NLP技术解析其中品牌露出的位置、情感和上下文,形成归因分析报告,驱动策略迭代。

第三章:从理论到实践——万数科技的“工程应答”

当我们把视线投向业界,会发现 万数科技 提出的技术栈,几乎是对上述理想GEO框架的一次精准工程实现。他们的方案不是功能罗列,而是针对每个工程挑战的深度解决方案。

1. 对“垂直诊断模型”的应答:DeepReach大模型

设计原理揭秘: DeepReach并非一个通用的聊天模型,而是一个专门针对 “预测并提升被主流模型引用概率” 这一任务进行优化的垂直模型。其技术栈深入Transformer堆栈的中间层表示、高维向量空间的几何关系以及温度参数对生成随机性的影响。简单说,它通过技术手段(可能包括对抗性训练、梯度信号分析等)尝试“学习”目标模型的内部打分机制,从而能更准确地诊断:优化哪些内容、以何种形式呈现,最能撬动目标模型的排序权重。

2. 对“向量化运营数据库”的应答:量子数据库 + 翰林台平台

设计原理揭秘:

量子数据库 解决了“如何高效组织与检索海量优化语料”的问题。它通过系统化多级行业数据向量化编码和分布存储,不仅存储内容,更存储内容之间的语义关联和优化归因。它支持大模型数据混合学习,意味着优化行动产生的新数据(如一次成功的AI推荐案例)能被拆解、归因,并反哺给DeepReach模型,形成一个自我强化的学习闭环。

翰林台AI定制内容平台 则是将诊断结果和数据库知识,转化为标准化作战动作的“兵工厂”。它基于DeepReach的理解,自动生成在特定模型看来权威性更高、相关性更强、更易被集成的跨模态内容(技术文档、Q&A对、场景化评测),并确保内容格式符合不同AI平台的偏好(多模态适配化)。

3. 对“实时反馈控制系统”的应答:天机图数据分析系统

设计原理揭秘: 这是将GEO从“艺术”变为“科学”的关键。天机图系统实现了对优化效果的定量数据化监测。它能:

洞察意图演化: 分析用户提问模式的变迁,提前布局内容。

分钟级追踪效果: 当一个新的优化内容被部署后,系统能快速监测到它在目标AI答案中排名或提及率的变化。

归因分析: 将“效果波动”与“运营动作”在时间线上关联,明确是哪些具体操作(如更新了某核心页面的Schema标记、在某高权重论坛发布了深度帖)驱动了引用概率的提升。

方法论闭环:GRPO法则
其独创的 GRPO法则 正是将上述三项技术组件串联起来的“操作系统级”工作流。它规定了从 表达结构化(G)、多模态适配化(R)、定量数据化(P) 到 整体优化(O) 的标准作业程序,确保整个干预过程是严谨、可重复、可度量的工程实践,而非依赖灵感的随机尝试。

结论:从“黑盒猜测”到“白盒干预”

GEO的终极目标,是将在海量参数中运行的、非确定性的AI生成过程,通过一套外部的、系统性的工程技术框架,变得更具可预见性和可影响力。

它不再是对“黑盒”的盲目猜测,而是通过 垂直模型(DeepReach)进行深度诊断、利用 向量数据库(量子数据库)重构信息资产、并通过 实时反馈系统(天机图)构建控制闭环 的“白盒化”干预尝试。万数科技 的技术栈展示了一条清晰的路径:将影响大模型引用概率这一宏大课题,分解为一个个可被测量、可被优化的工程子任务。

对于技术团队而言,理解这套框架的价值在于:当你们在选择GEO服务商或考虑自研时,可以不再被模糊的承诺所迷惑,而是能够尖锐地提问:你们的技术,究竟是在召回、排序还是生成层发挥作用?你们的模型,是简单调用API,还是真正具备逆向诊断能力?你们的数据,是散乱的文档,还是结构化的、可归因的向量网络?

答案,将决定你的品牌是永远在AI的“黑盒”外徘徊,还是能够深入其内部逻辑,赢得这场关于未来注意力的关键战争。

MES制造执行系统是精益生产的重要支撑工具,它能够帮助企业实现生产过程的数字化、智能化和精细化管理,提高生产效率和质量,降低生产成本,为企业创造更大的价值。

MES制造执行系统是一种集生产计划、物料管理、工艺执行、设备控制、质量管理等功能于一体的软件系统。它通过实时监控生产过程、收集并分析生产数据,为管理层提供决策支持,同时为操作层提供指导和帮助。

image.png

制造行业在生产过程中所面临的挑战

1、无法预测生产线需求使用

随着工厂订单量的增多,在生产前,人工往往不知道或无法快速预知在一条产线中应该做哪个订单的那些工序,所需量是多少,要提前准备何种物料。

2、不能及时掌握生产情况

每天的生产数据需要人工事后填写和统计,管理层不能及时掌握订单在车间的最新生产情况。无法及时得知当前每个生产订单、每个工序的生产进度如何、哪些未按计划开始、哪些未按计划完工、特急件是哪些、良品数、不良品数分别多少等等问题。

3、没有对比,无竞争感

因为没有即时的目视指令和电子看板,现场人员没有绩效对比和竞争,没有紧迫感。不知道当前谁的效率高?谁的效率低?

4、无法及时得知当前机台产线情况

当前哪些机台产线是在工作或是停机?机台、产线有多少时间在生产,多少时间在停转和空转?利用率是多少?这些都是无法及时得知,只能通过记录得知。

5、无法及时得知致错原因

无法及时得知过去几小时之内,车间出现最多的不良品是什么原因造成的?不良率有多高等问题。

6、无法追溯源头

用户投诉产品不良时,如何立即追溯该产品的历史生产过程信息?如:是谁、在什么时间、在哪台机器上、用什么材料做的?该产品加工过程经过了哪些工序?当时的工艺参数是怎样的等问题。

MES系统对企业生产管理有哪些改进?

在精益生产的背景下,MES制造执行系统发挥着至关重要的作用,具体来说,MES制造执行系统在精益生产中的改善企业生产的五大方法:

image.png

1、全面的生产能力平衡分析

在企业生产过程中,不同的人员和设备都有着不同的生产能力,不同的产品有着不同的生产能力需求,若采用同一种生产任务分配模式,容易造成车间生产能力与完成计划所需能力之间的不协调,直接导致车间生产现场混乱,且难以合理调整各工作中心的生产分配量。

MES系统拥有最直观的图形和文字,可以为企业提供最精准的设备任务负荷分析、部门/班组任务负荷分析等数据。通过详细的数据逐级查询和分析,还能够帮助企业计划和调度人员进行生产任务的外协和均衡,并实现最优的生产计划排程。

2、高效的生产计划管理

在没有使用MES系统之前,企业生产信息的获取,只能通过人员填写的报表反馈或者电话汇报。这样,信息获取不够及时,影响企业管理层及时有效地下达管理指令,制约了管理措施的有效实施。

MES系统能够全面管理企业订单的整个生产流程,通过生产信息的采集和多维度的看板展现,让每个订单、每个零件、每道工序等实时信息,及时展现给车间管理人员,使企业各级领导更加便捷地掌握生产任务执行状况,并迅速做出生产决策,确保实现生产任务按时、按节点完成。

3、便捷的任务派工管理

生产订单的执行往往需要通过多道不同的工序来完成。未使用MES系统时,开始阶段可能对生产任务执行的进度比较了解,但一旦工序并行作业,就无法完成工单的追踪和管理了。MES系统拥有强大的任务动态调度能力,能够及时响应生产现场各种状态的变化。

在生产计划完成后,系统还能够自动生成任务派工单,并通过条码扫描向生产现场自动输送加工程序、零件图纸、工艺指导文档等,大大节约工作人员在生产现场来回奔波的时间。

4、完善的产品质量管理

制造企业把产品质量视为企业的生命,全面的质量管理保障高品质的产品。MES系统通过对原材料、生产过程以及在用户使用中的产品的整个生命周期进行数字化、网络化和动态化的管理,实现对产品质量的管控和追溯。

这样,MES系统就可以通过持续不断的改进,帮助企业完善全面的质量管理体系,进而有效控制生产成本。

5、最优的车间库存管理

库存管理是每个企业在生产过程中都不可或缺的环节。合理的库存控制,可以有效避免生产停滞,为企业建立良好的生产环境。MES系统支持原材料、成品、半成品、工具等的库存管理,所有流程通过条码扫描操作,既准确又便捷。

MES系统彻底改善了企业车间生产管理流程,实现车间管理无盲点,生产管控一体化的新模式。其最前沿的信息技术在各大制造企业间得到强烈反响,并成为支撑制造企业高速发展的内在动力。

成功实施MES系统需先完善管理基础

将MES系统导入到企业的运作体系之中,企业需要先完善管理基础,根据自身情况选择好“合身”的MES软件系统,而后采用科学的实施方法充分准备,才能促使MES正式运行、发挥效用。

要想成功实施MES,企业必须先在管理上下功夫——与MES密切相关的工作,包括车间环境、职责分工以及人员保障等方面。

1、定置,改善车间环境

定置,是指通过对生产和工作环境的分析,把生产和工作需要的物品按照工艺的需要科学地确定位置。定置管理,则是指对现场物品定置的设计、组织、实施、控制,使现场管理达到科学化、规范化、经常化的全过程。定置管理为生产者在较短的时间内用较低的成本制造出高质量产品提供良好的客观条件。通过定置管理,理顺物流,可以为MES的实施提供良好的车间环境。

2、合理分工,明确职责

“计算机能够解决一切管理问题。”——这是相当一部分企业领导在实施MES时的一个误区。事实上,许多企业面临的管理问题是不可能靠计算机来解决的,必须靠企业自身通过科学的组织、严格的规章及有效的控制来解决。计算机只能通过信息的获取与加工、一定的流程控制来支持企业管理思想的贯彻。有些企业的组织结构不合理、职能相互重叠,其结果是责任不清、相互扯皮。

这一方面妨碍了MES的顺利实施,另一方面也难以保证MES正常高效地运行。因此,在实施MES时,必须对企业的业务流程进行合理重组,去除重叠的部门职能,减少无效劳动,合理分工、明确责职。这样既可以简化MES软件的权限设置和流程控制,又能够保证信息处理的及时性,为MES的实施提供组织保证。

3、提供人员保证

MES系统实施,通常涉及到计算机人员、企业管理人员、车间现场操作人员和具体业务人员等方面。不仅涉及面广,而且各类人员的文化水平、业务能力、计算机应用水平也参差不齐。因此,为了保证MES的顺利实施,必须对相关人员进行足够的培训。对不同类型、不同层次人员的培训方式应有所不同。

实际上,在整个MES实施过程中,培训工作是贯彻始终的。不仅要在实施准备阶段进行原理培训,而且在实施准备、模拟运行与试运行、切换运行、新系统运行过程中也要进行有关培训,如软硬件产品培训、系统管理员培训和持续扩大培训等。只有通过培训让企业员工对MES软硬件产品有了一定的了解,才能够保证系统最终的顺利实施和应用。

【声明】:以上所发文章仅供大家学习参考,请不要作商业用途;MES系统的专业性很强,文中难免有错误,一旦发现,请联系我们及时更正;文中部分图片源于网络,侵删。

最后感谢图片内容的提供方:织信MES,该厂商专注企业信息化系统管理10年余,坚持传播生产管理知识,自研低代码开发底座,基于B/S架构,可帮助企业快速构建生产管理所需的各项功能,可根据客户实际作业流程和管理要求实现定制化开发,系统内置自定义开放接口OpenAPI,能够对接所有的管理信息系统,广泛应用于国内外各行各业。

概要

云服务器市场的供应商激增,如今许多厂商经常将自己的服务器宣传得像天花乱坠,夸大其性能优势。这让许多新手用户在选择时感到困惑,往往难以判断选择合适的服务器,或者说如何科学地面对服务器的实际性能。这种情况,我们需要借助命然而,对于大多数新手来说,高效命令行的使用可能不太熟悉,这也使得他们在判断服务器性能时面临技术领先。为了帮助大家发现这些陷阱,博主特地整理了一些命令,帮助你快速检测服务器的真实性能,确保不再“踩坑”!

脚本1

wget -qO- bench.sh | bash

脚本2

  wget -qO- https://raw.githubusercontent.com/oooldking/script/master/superbench.sh | bash

看上下行

脚本3

(wget -qO- wget.racing/nench.sh | bash; wget -qO- wget.racing/nench.sh | bash) 2>&1 | tee nench.log

脚本4

curl -s bench.wget.racing | bash

脚本5

curl -s https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/yabs.sh | bash

可比较真实的测试服务器带宽

脚本6

curl -fsL https://ilemonra.in/LemonBenchIntl | bash -s fast

可测试是否支持Netflxi等(不一定准确)

脚本7

wget -N --no-check-certificate https://raw.githubusercontent.com/veip007/hj/master/hj.sh && chmod +x hj.sh && bash hj.sh

全能,测速、加速 DD系统等

脚本8

(curl -s wget.racing/nench.sh | bash) 2>&1 | tee nench.log

脚本9

screen -S uping
wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/uPing/master/uping.py
python uping.py

服务器延迟监测
脚本10

wget -qO- --no-check-certificate https://raw.githubusercontent.com/qd201211/Linux-SpeedTest/master/superbench.sh | bash

系统配置、国内速度等

脚本11

wget --no-check-certificate https://zhujiwiki.com/wp-content/uploads/2018/07/unixbench.sh

chmod +x unixbench.sh

./unixbench.sh

UnixBench跑分,测试主机性能

运行10-30分钟后(根据CPU内核数量,运算时间不等)得出分数,越高越好

脚本12
访问:https://netflix.com/title/80018499
测试是否可以观看Netflix(奈飞)

脚本13

bash <(curl -Lsk https://raw.githubusercontent.com/BigMangos/speedtest-go-script/master/install.sh)

测试本地速度speedtest go版本的一键安装脚本

脚本14

bash <(curl -Lso- http://yun.789888.xyz/speedtest.sh)
        或者
 bash <(curl -Lso- https://zhujiwiki.com/wp-content/uploads/2021/12/speedtest.sh)

一键测试三网速度

脚本15

curl https://raw.githubusercontent.com/zhucaidan/mtr_trace/main/mtr_trace.sh|bash

一键测试TCP三网回程线路

脚本16

curl https://raw.githubusercontent.com/zhanghanyun/backtrace/main/install.sh -sSf | sh

一键测试TCP三网回程线路

脚本17

bash <(curl -Lso- https://bench.im/hyperspeed)
 bash <(curl -Lso- https://2life.top/speedtest.sh)

国内三网速度

脚本18

`curl -sL yabs.sh | bash
`
yabs,系统性能测试

脚本19

wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh

综合工具箱

脚本20

 wget -q https://github.com/Aniverse/A/raw/i/a && bash a

独服测试

脚本21

wget -qO- benchy.pw | sh

curl -Ls benchy.pw | sh

已开源:https://github.com/L1so/benchy

22、系统信息和测速

含国内、亚洲、国际等节点,可选节点

1、面向全球

wget -qO- network-speed.xyz | bash

2、限定区域,包括国内

curl -sL network-speed.xyz | bash -s -- -r region_name

中国

curl -sL network-speed.xyz | bash -s -- -r china

亚洲

curl -sL network-speed.xyz | bash -s -- -r asia

region_name = na, sa, eu, asia, middle-east, india, china, iran

23、TCP三网回程

bash <(curl -Ls https://raw.githubusercontent.com/sjlleo/nexttrace/main/nt_install.sh) && nexttrace -F -T

24、VPS一键脚本工具

curl -fsSL https://raw.githubusercontent.com/eooce/ssh_tool/main/ssh_tool.sh -o ssh_tool.sh && chmod +x ssh_tool.sh && ./ssh_tool.sh

wget -qO ssh_tool.sh https://raw.githubusercontent.com/eooce/ssh_tool/main/ssh_tool.sh && chmod +x ssh_tool.sh && ./ssh_tool.sh

总结

在使用性能测试脚本时,绝对不能随便运行从网上找到一个就直接在自己的服务器上。很多正常的脚本,背后可能被某些不法分子侵入了后门或病毒,这些恶意代码可能会窃取你的资源和数据,甚至利用你的服务器进行恶意攻击,导致你所在的服务区域瘫痪,影响其他用户的正常使用。因此,安全性作为首要,必须确保所用的测试脚本来源可靠、无害。博主在这里为大家收集的脚本,都是经过检验的。欢迎大家使用,之后博主还会不断的更新!

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。

更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/

*在线运行 vLLM 入门教程:零基础分步指南

源码 examples/offline_inference/rlhf_utils.py

import torch


def stateless_init_process_group(master_address, master_port, rank, world_size,
                                 device):

    """
    vLLM 提供 `StatelessProcessGroup` 来创建进程组,
    无需考虑 torch.distributed 中的全局进程组。
    建议先创建 `StatelessProcessGroup`,然后初始化
    外部(训练进程)与 vLLM 工作进程之间的数据平面通信(NCCL)。
    """
    from vllm.distributed.device_communicators.pynccl import PyNcclCommunicator
    from vllm.distributed.utils import StatelessProcessGroup
    pg = StatelessProcessGroup.create(host=master_address,
                                      port=master_port,
                                      rank=rank,
                                      world_size=world_size)
    pynccl = PyNcclCommunicator(pg, device=device)
    return pynccl


class WorkerExtension:

    """
    vLLM 工作进程的基类。
    通过定义扩展类,无论底层工作进程类是什么,代码都能正常工作。
    这种方式使代码能同时兼容 vLLM V0 和 V1。
    注意:我们在单独模块中定义此类,主模块应将完整限定名
    作为 `worker_extension_cls` 参数传递。
    """

    def init_weight_update_group(self, master_address, master_port,
                                 rank_offset, world_size):
        from vllm.distributed.parallel_state import get_world_group
        rank = get_world_group().rank + rank_offset
        self.model_update_group = stateless_init_process_group(
            master_address,
            master_port,
            rank,
            world_size,
            self.device,
        )

    def update_weight(self, name, dtype, shape):
        weight = torch.empty(shape, dtype=dtype, device="cuda")
        self.model_update_group.broadcast(weight,
                                          src=0,
                                          stream=torch.cuda.current_stream())

        self.model_runner.model.load_weights(weights=[(name, weight)])

        del weight

    def check_weights_changed(self):
        """
        Check if the weights are updated to 0.
        """
        """
        检查权重是否已更新为 0。
        """
        weights_updated = True
        for name, p in self.model_runner.model.named_parameters():
            weights_updated = weights_updated and torch.allclose(
                p, torch.zeros_like(p))
        return weights_updated


class ColocateWorkerExtension:

    """
    vLLM 工作进程在协同部署场景下的基类。
    通过定义扩展类,无论底层工作进程类是什么,代码都能正常工作。
    这种方式使代码能同时兼容 vLLM V0 和 V1。
    注意:我们在单独模块中定义此类,主模块应将完整限定名
    作为 `worker_extension_cls` 参数传递。
    """

    def report_device_id(self) -> str:
        from vllm.platforms import current_platform
        self.device_uuid = current_platform.get_device_uuid(self.device.index)
        return self.device_uuid

    def update_weights_from_ipc_handles(self, ipc_handles):
        handles = ipc_handles[self.device_uuid]
        device_id = self.device.index
        weights = []
        for name, handle in handles.items():
            func, args = handle
            list_args = list(args)
            # the key is to change device id to the current device id
            # in case two processes have different CUDA_VISIBLE_DEVICES
            # 关键是将设备 ID 改为当前设备 ID,
            # 以防两个进程有不同的 CUDA_VISIBLE_DEVICES
            list_args[6] = device_id
            tensor = func(*list_args)
            weights.append((name, tensor))
        self.model_runner.model.load_weights(weights=weights)
        torch.cuda.synchronize()

    def check_weights_changed(self):

        """
        检查权重是否已更新为0。
        """
        weights_updated = True
        for name, p in self.model_runner.model.named_parameters():
            weights_updated = weights_updated and torch.allclose(
                p, torch.zeros_like(p))
        return weights_updated

Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境,以高效编写自定义 DNN 计算内核,并能够在现代 GPU 硬件上以最大吞吐量运行。

更多 Triton 中文文档可访问 →triton.hyper.ai/

triton.language.where(condition, x, y)

根据 condition 返回来自 x 或 y 元素的张量。
注意:无论 condition 的值是什么,x 和 y 总是会被求值。
如果希望避免意外的内存操作,请使用 triton.load 和 triton.store 中的 mask 参数。
x 和 y 的形状都会被广播到 condition 的形状。x 和 y 必须具有相同的数据类型。
参数

  • conditiontriton.bool 的块)- 当为 True(非零)时,产生 x,否则产生 y。
  • x - 在条件为 True 的索引处选择的值。
  • y - 在条件为 False 的索引处选择的值。

作为一名求职中的中年软件工程师,由于地域和年龄限制,我的选择空间其实就那么几家。我经常需要反复查看自己感兴趣公司的招聘页面。这一过程既耗时又枯燥,尤其是在需要同时跟踪多家公司职位的情况下。虽然许多招聘网站都提供基于邮件的职位提醒,但这些提醒通常要么依赖于对已提交简历进行不透明的 AI 匹配,要么只是简单的关键词匹配。在这两种情况下,我对实际的匹配条件几乎没有控制权。

为了解决这个问题,我决定利用一个 AI Agent 来自动 Watching 招聘页面,并在发布符合我自己定义条件的新职位时通知我。在本文中,我将介绍一个用于验证这一想法的概念验证(PoC)。

在这个 PoC 中,我展示了如何使用 AI Agent 来 Watching 一家公司招聘页面上的软件开发岗位。该 Agent 能够自动浏览招聘网站、搜索相关职位、提取结构化信息,并将结果存储到 SQLite 数据库中,以便后续查询和跟踪。

PoC

职位数据来源

在本次实验中,我选择了一家其招聘页面基于 Eightfold AI 平台构建的公司。如果你的目标公司同样使用 Eightfold AI,那么只需做很少的修改即可复用该 PoC。

Eightfold AI 是一个人才智能平台,利用人工智能支持招聘、员工留任以及劳动力发展。它基于技能和经验将候选人与开放职位进行匹配,目前已被包括 Vodafone、Morgan Stanley 和 Chevron 在内的 100 多家公司使用。该平台覆盖 155 多个国家。

尽管 Eightfold AI 平台本身已经提供了基于 AI 的职位提醒订阅功能,但我仍希望对匹配逻辑和采集到的数据拥有更细粒度的控制,因此才希望有一套自定义解决方案。

Agent 设计

我在 VS Code Copilot Chat 环境中实现了该 PoC,并使用了以下工具和提示词。

MCP 工具

  • 浏览器工具browsermcp:用于导航和操作招聘网站页面。
  • SQLite 数据库工具genai-toolbox:用于持久化存储提取到的职位数据。

./vscode/mcp.json

{
  "servers": {
    "browsermcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "@browsermcp/mcp@latest"
      ]
    },
    "sqlite": {
      "command": "~/genai-toolbox/toolbox",
      "args": [
        "--prebuilt",
        "sqlite",
        "--stdio"
      ],
      "env": {
        "SQLITE_DATABASE": "~/jobs/jobs.db"
      }
    }
  }
}

数据库 Schema

CREATE TABLE IF NOT EXISTS xyz_company_jobs (
    job_id TEXT PRIMARY KEY, -- 职位的唯一标识
    req_id TEXT,             -- 招聘需求 ID
    job_title TEXT,          -- 职位名称
    location TEXT,
    date_posted TEXT,        -- 格式:'YYYY-MM-DD'
    business_department TEXT,
    job_description_url TEXT,
    job_description TEXT     -- 职位描述的主要内容
);

Agent 提示词

你是一个可以访问浏览器工具和 SQLite 数据库工具的 AI Agent。你的任务是从 XYZ_Company 的招聘网站中收集与软件开发相关的职位信息,并将提取到的数据存储到 SQLite 数据库中。当前浏览器中打开的页面是 XYZ_Company 的职位搜索门户。

数据库:
```sql
CREATE TABLE IF NOT EXISTS xyz_company_jobs (
    job_id TEXT PRIMARY KEY, -- 职位的唯一标识
    req_id TEXT,             -- 招聘需求 ID
    job_title TEXT,          -- 职位名称
    location TEXT,
    date_posted TEXT,        -- 格式:'YYYY-MM-DD'
    business_department TEXT,
    job_description_url TEXT,
    job_description TEXT     -- 职位描述的主要内容
)
```

规则:
- 在调用一次 `click()` 操作后,必须等待 10 秒,确保页面完全加载,然后再调用 `snapshot` 捕获当前页面状态。
- 在向 `xyz_company_jobs` 表插入新记录之前,需要检查 `job_id` 是否已经存在,以避免重复数据。
- 在生成 INSERT SQL 语句时,确保对值中的单引号进行正确转义。
- 不要收集或点击位于 `document > main > group Similar Position` 区域下的职位。

用户已经准备的环境:
- 浏览器中打开的页面是 XYZ_Company 的职位搜索门户。

你的安装过程:
1. 如果 `xyz_company_jobs` 表不存在,则创建该表。在执行 SQL 时,需保留 SQL 代码块中的注释行。

执行过程:
1. 每一个文本匹配 "$Job_Title$ 于 $time_since_publication$ 前发布" 模式的按钮都代表一个职位。通过 `今天 - time_since_publication` 计算 `Date Posted`。
2. 点击职位按钮以打开职位详情页面,该页面的 URL 即为 `Job Description URL`。
3. 从职位详情页面中提取:职位名称、工作地点、Job ID、业务部门(可选)、Req ID 以及职位描述的主要内容。
4. 仅收集与软件开发相关的职位。
5. 将每个收集到的职位插入 `xyz_company_jobs` 表,并基于 `job_id` 确保不产生重复记录。
6. 如有需要,点击 `更多职位` 按钮以加载更多职位。
7. 至少收集并存储 10 个职位。

运行

  1. 打开一个 Chrome 浏览器标签页,访问 XYZ 公司的招聘门户网站。在该标签页上激活 Browser MCP Chrome 扩展程序。
  2. 在 VS Code 中启动一个新的 Copilot Chat 会话,并使用上述 MCP 配置和提示。

总结

通过上述配置,我成功实现了一个 AI Agent,它能够自动 Watching 目标公司的招聘页面,发现新的软件开发职位。该 Agent 可以自动浏览招聘网站、识别相关职位、提取结构化数据,并将其存储到 SQLite 数据库中,从而方便后续访问和长期跟踪。

后续工作

该 PoC 还可以在多个方面进行扩展:

  • 引入更复杂的匹配逻辑,例如简历解析和基于语义的技能匹配。
  • 将收集到的职位信息导出为 RSS 或邮件摘要,从而构建一个完全自托管的职位提醒系统。
  • 添加通知机制,在发现新的匹配职位时立即提醒我。

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/

在部署 TVM 运行时模块时,无论目标是 CPU 还是 GPU,TVM 最终只需要一个动态共享库(dynamic shared library) 。实现这一点的关键就在于 统一的模块序列化机制。本文将介绍 TVM 模块序列化的格式标准与实现细节。

序列化(Serialization)

入口 API 为 tvm.module.Module 的 export_library。在此函数内部,我们会执行以下步骤:

  1. 收集所有 DSO 模块(例如 LLVM 模块和 C 模块)。
  2. 在获得 DSO 模块后,调用 save 函数将它们保存到文件。
  3. 随后检查是否存在已导入的模块(imported modules),例如 CUDA、OpenCL 等。这里对模块类型不做限制。
    如果存在导入模块,我们将创建一个名为 devc.o / dev.cc 的文件(用于将这些导入模块的二进制数据打包进最终的动态库中),然后调用 _PackImportsToLLVM 或 _PackImportsToC 来执行模块序列化。
  4. 最后,调用 fcompile,其内部会调用_cc.create_shared,生成动态共享库。

备注

  1. 对于 C 源码模块(CSourceModule),我们会将它们编译并与 DSO 模块一同进行链接。
  2. 是否使用 _PackImportsToLLVM 或 _PackImportsToC取决于 TVM 是否启用了 LLVM。它们本质上实现的是相同的目标。

序列化底层机制与格式标准

序列化主要发生在 _PackImportsToLLVM 或_PackImportsToC 中。它们都会调用 SerializeModule 来序列化 runtime module。在 SerializeModule 函数中,我们首先会构造一个辅助类 ModuleSerializer。它会以 module 为输入进行初始化,例如分配模块索引。随后可以调用其 SerializeModule 方法执行序列化。

为了更好地理解,让我们更深入地挖掘这个类的实现。

下面的代码用于构造 ModuleSerializer

explicit ModuleSerializer(runtime::Module mod) : mod_(mod) {
  Init();
}
private:
void Init() {
  CreateModuleIndex();
  CreateImportTree();
}

在 CreateModuleIndex() 中,我们使用 DFS 遍历模块的导入关系并为每个模块分配索引。根模块固定为索引 0

例如:

llvm_mod:imported_modules
  - cuda_mod

因此,LLVM 模块的索引将是 0,CUDA 模块的索引将是 1。

在构建完模块索引之后,我们将尝试构建导入树(CreateImportTree()),该导入树会在我们重新加载导出的库时用于恢复模块之间的导入关系。在我们的设计中,我们使用 CSR 格式来存储导入树,每一行对应父节点索引,而子数组中的索引对应其子模块索引。在代码中,我们使用 import_tree_row_ptr_ 和import_tree_child_indices_ 来表示它们。

在完成初始化之后,我们就可以使用 SerializeModule 函数来序列化模块。

在该函数的逻辑中,我们假设序列化格式如下所示:

binary_blob_size
binary_blob_type_key
binary_blob_logic
binary_blob_type_key
binary_blob_logic
...
_import_tree
_import_tree_logic

binary_blob_size 是我们在本次序列化步骤中将会包含的 blob 数量。在我们的示例中会有三个 blob,分别对应 LLVM 模块、CUDA 模块以及 _import_tree

binary_blob_type_key 是模块的 blob 类型键。 对于 LLVM / C 模块,其 blob 类型键为 _lib。对于 CUDA 模块,其类型键为 cuda,可以通过 module->type_key() 获取。

binary_blob_logic 是处理该 blob 的逻辑。 对于大多数 blob(例如 CUDA、OpenCL),我们会调用 SaveToBinary 函数将 blob 序列化为二进制。然而,对于 LLVM / C 模块,我们只会写入 _lib,用于表示这是一个 DSO 模块。

备注
是否需要实现 SaveToBinary 虚函数取决于模块的使用方式。例如,如果模块中包含我们在重新加载动态共享库时需要的信息,那么我们就应该实现该函数。像 CUDA 模块,在重新加载动态共享库时我们需要将其二进制数据传递给 GPU 驱动,因此我们需要实现 SaveToBinary 来序列化其二进制数据。但对于主机侧模块(如 DSO 模块),在加载动态共享库时我们并不需要额外信息,因此不需要实现 SaveToBinary。不过,如果未来我们希望记录一些关于 DSO 模块的元信息,我们也可以为 DSO 模块实现 SaveToBinary

最后,除非我们的模块中仅有一个 DSO 模块并且它位于根位置,否则我们会写入一个键 _import_tree。该键用于在重新加载导出的库时恢复模块导入关系,如前文所述。import_tree_logic 的内容则是将 import_tree_row_ptr_ 和 import_tree_child_indices_ 写入到流中。

在上述步骤完成后,我们会将最终结果打包进一个符号 runtime::symbol::tvm_ffi_library_bin,该符号可在动态库中恢复。

现在,我们已经完成序列化部分。正如你所看到的,我们理论上可以支持导入任意模块。

反序列化

入口 API 是 tvm.runtime.load。实际上,该函数会调用 _LoadFromFile。 如果进一步展开,可以看到其对应的是 Module::LoadFromFile

在我们的示例中,文件是 deploy.so。根据其函数逻辑,我们会在 dso_library.cc 中调用 module.loadfile_so,关键代码如下:

// Load the imported modules
const char* library_bin = reinterpret_cast<const char*>(
   lib->GetSymbol(runtime::symbol::tvm_ffi_library_bin));
Module root_mod;
if (library_bin != nullptr) {
   root_mod = ProcessLibraryBin(library_bin, lib);
} else {
   // Only have one single DSO Module
   root_mod = Module(n);
}```

如前所述,我们会将 blob 打包进符号 `runtime::symbol::tvm_ffi_library_bin`· 中。
在反序列化阶段,我们会检查它。如果存在 `runtime::symbol::tvm_ffi_library_bin`,我们将调用 `ProcessLibraryBin`,其逻辑如下:

```c++
READ(blob_size)
READ(blob_type_key)
for (size_t i = 0; i < blob_size; i++) {
    if (blob_type_key == "_lib") {
      // construct dso module using lib
    } else if (blob_type_key == "_import_tree") {
      // READ(_import_tree_row_ptr)
      // READ(_import_tree_child_indices)
    } else {
      // call module.loadbinary_blob_type_key, such as module.loadbinary_cuda
      // to restore.
    }
}
// Using _import_tree_row_ptr and _import_tree_child_indices to
// restore module import relationship. The first module is the
// root module according to our invariance as said before.
return root_module;

完成上述步骤后,我们会将 ctx_address 设置为 root_module, 以便能够从根模块查找符号(使所有符号可见)。

最终,我们就完成了反序列化部分。

多级工时审批如何提升项目管理效率
在现代项目管理中,准确跟踪时间和工时对于确保生产力、责任落实和成本控制至关重要。实现这一目标最有效的机制之一是项目管理工具中的多级工时审批功能。该功能引入了一种结构化的工作流程,记录的工时在最终验收前需要经过多层审核。随着组织规模和复杂性的增长,这样的系统对于维护透明度、效率和治理至关重要。

提高准确性和责任落实
多级审批确保工时表条目由多个负责人审核,例如团队负责人、项目经理和财务经理。每个层级都会验证记录的工时是否与任务和里程碑相符。这显著减少了错误、虚报工时或意外的时间错配。员工会更加负责,因为他们知道自己的工时记录会经过系统性的验证,从而鼓励他们如实准确地报告。

增强资源管理

多级审批机制能够提供关于资源利用情况的宝贵信息。高级管理人员可以发现工作量不平衡、员工利用率不足或团队负担过重等问题。这有助于在各个项目中更智能地分配资源,确保在避免员工过度劳累的情况下实现最佳生产力。随着时间的推移,历史审批数据有助于预测未来的项目时间表和人员需求。

提升沟通与透明度

当多方利益相关者审核工时表时,员工、经理和财务团队之间的沟通将得到改善。有关任务范围、工时或优先级变更的疑问可以及早得到解答。这种透明度有助于建立团队内部的信任,并确保每个人都对项目进展有共同的理解。

Zoho Projects 多级工时表审批巧能帮助您制定规则,使用特定标准来定义工时表的审批方式和审批人。这适用于跨项目和特定项目内的工时表,允许多个利益相关者进行审核和批准。在Zoho Projects门户里面,用户可以为工时表审批创建工作流规则。按照工作流规则中添加的条件,可以进行任何操作。比如说,如果项目名称是X,工时表必须由一级汇报经理中的任何一位批准。添加这样的条件以后,用户还可以为审批者设置审批提醒。只需要输入提醒时间,然后点击提交。工时表模块中的工作流规则就被创建。

在 Zoho Projects 中,时间日志是用户在门户中输入的工时记录,记录内容是他们在特定工作项上花费的时间。工时表则是一组时间日志的集合,方便审核和审批。在Zoho Projects门户里面用户可以设置有关工时和工时表的各种个样的审批规划。
Zoho Projects项目管理软件非常灵活帮助各个业务很容易地管理项目。

JDK 26

连续第二周,JDK 26 的早期访问版本仍为Build 29。更多详情请参阅其发布说明

JDK 27

同样,JDK 27 的早期访问版本当前仍为Build 3。详细信息可查阅其发布说明

 

对于JDK 26JDK 27,鼓励开发者通过Java Bug数据库报告缺陷。

Spring Framework

Spring Shell 4.0.0 正式发布GA版本,包含缺陷修复、文档改进、依赖项升级以及多项新特性,包括,命令编程模型重构,在使用 Spring Boot 时,不再需要@EnableCommand@CommandScan注解,并修复了@Command注解的意外行为;全新升级的 DSL,解决了CommandRegistration.Builder实例与 Spring Security 的SecurityFilterChain接口在新构建器格式下的匹配问题;与 Spring Framework 7.0 和 Spring Boot 4.0 对齐;新增对JSpecify的空安全(null safety)支持。更多细节请参见发布说明

JReleaser

JReleaser 1.22.0发布,这是一个用于简化 Java 项目发布流程的工具,本次更新包括缺陷修复、文档改进、依赖项升级以及新功能,包括,Signing模块全面重构,支持同时使用多种方法对构件(artifacts)进行签名;新增对Minisign(一个用于文件签名和验证的工具)的支持;支持在部署构件到 Maven Central 时跳过等待期。更多详细信息请见发布说明

TornadoVM

TornadoVM团队宣布,其开源 IntelliJ 插件TornadoInsight(旨在提升 TornadoVM 的开发体验)现已兼容最新发布的TornadoVM 2.0。相关配置指南也已同步更新。关于 TornadoInsight 的更多信息,可参考 InfoQ 的新闻报道

Apache Camel

Apache Camel 4.14.3发布,包含缺陷修复、依赖项升级及功能改进,包括,在使用Camel JBang时,可通过--repos命令为Camel Kamelet相关操作指定 Maven 仓库;Camel Neo4j组件改进了消息体的检测逻辑,避免内部错误;修复了Camel Netty中 SSL 客户端证书主题名称(subject name)从可读字符串表述被错误转换为晦涩的LDAP格式的问题。更多详情请查阅发布说明

 

原文链接:

Java News Roundup: Spring Shell, JReleaser, TornadoInsight, Apache Camel

事件背景

2026 年 1 月 16 日,OpenAI 通过官方 X(原 Twitter)账号正式宣布,将在未来数周内开始在 ChatGPT 的免费版和新推出的 ChatGPT Go($8/月)中测试广告投放。与此同时,Plus($20/月)、Pro($200/月)及企业版将继续保持无广告体验。这一决策迅速引发了科技圈的广泛关注和激烈讨论。

OpenAI官方公告推文

OpenAI 官方推文宣布广告计划,并发布广告原则说明 | 来源:X @OpenAI

值得注意的是,OpenAI 同时发布了一份详尽的"广告原则"(Our Ad Principles),试图向用户保证广告不会影响 ChatGPT 的回答质量和隐私保护。然而,这份承诺并未能平息用户的担忧——社交媒体上的反应呈现出高度两极分化的态势。

OpenAI 的广告原则解读

OpenAI广告原则详图

OpenAI 发布的广告原则框架:强调使命对齐、答案独立、对话隐私、用户控制与长期价值

📋 OpenAI 官方承诺清单

答案独立性:ChatGPT 的回答始终基于客观有用性,广告不会影响答案内容

对话隐私:不向广告商出售用户数据,对话内容保持私密

用户控制:用户可随时关闭个性化广告,清除广告相关数据

付费保护:Plus、Pro、Business、Enterprise 等高价层级永不显示广告

未成年保护:18 岁以下用户不会看到广告

敏感话题禁区:政治、健康、心理健康等敏感话题禁止广告投放

商业化背后的财务压力

从华尔街日报、彭博社等主流财经媒体的报道来看,OpenAI 此举并非心血来潮,而是面对真实财务压力的"不得已之举"。据公开数据显示:

在如此悬殊的付费转化率面前,广告变现被多家媒体评价为"不可避免"的选择。富国银行预测,ChatGPT 在搜索市场的占比将从 2025 年底的 17%增长到 2030 年的三分之一,这为广告业务提供了巨大的潜在市场空间。

社交媒体的激烈反应

公告发布后,X 平台上的评论区迅速沦陷。从截图可见,用户反应从嘲讽、愤怒到直接引用 Sam Altman 此前的反广告言论,形成了鲜明的对比和讽刺效果。

用户评论截图

X 平台用户对 OpenAI 广告公告的部分反应 | Grok 引用了 Altman 2024 年称广告是"反乌托邦"的言论

Sam Altman 在 2024 年曾称将广告嵌入 ChatGPT 回复是一种"反乌托邦"的想法:"很容易想象那种未来的反乌托邦场景——你问 ChatGPT 一个问题,它回答说'你应该考虑买这个产品'或者'你应该去这里度假'之类的。"

—— 来源:Grok @grok 引用 Altman 2024 年采访

这种前后矛盾的表态成为用户攻击的焦点。有用户直言:"直接说你们需要更多钱不就得了"(Just say you guys need more money),简洁而犀利地戳破了官方话术的包装。

四大核心担忧

1. 答案中立性与商业影响的矛盾

用户普遍担忧:一旦 AI 提供的建议与商业利益相关联,就很难保证答案仍然是纯粹基于"客观有用性"的判断。有用户形象地比喻:"感觉就像在心理咨询师办公室里竖起了广告牌。"

2. 数据隐私与"监听"恐惧

尽管 OpenAI 承诺"不会出售用户数据给广告商",但用户对此类承诺持谨慎态度。有 Reddit 用户反映,在 ChatGPT 中讨论特定话题后,很快在其他平台看到相关广告,这加深了数据被滥用的担忧。

3. 前科问题:App Recommendations 事件

2025 年 12 月,ChatGPT Plus 付费用户在对话中看到来自 Target、Peloton 等品牌的"推荐"。OpenAI 最初辩称这不是广告,只是应用发现功能,但最终在用户强烈反对下关闭了该功能。首席研究官 Mark Chen 道歉承认公司"做得不够好"。这一事件严重损害了用户对 OpenAI 承诺的信任。

4. Instagram 模式类比的逻辑悖论

CEO Sam Altman 提到欣赏 Instagram 的广告模式,但用户尖锐地指出:Instagram 之所以成功,正是因为 Meta 大规模收集和出售了用户的个人数据——这与 OpenAI 声称的"隐私优先"立场本质矛盾,形成了无法调和的逻辑悖论。

广告形态预览

根据 OpenAI 展示的概念图,广告将以"Sponsored"标签的形式出现在 ChatGPT 回复的底部,与回答内容明确分离。在下图的示例中,当用户询问墨西哥晚宴菜谱时,系统在给出食谱建议后,底部会显示相关食材的赞助商购买链接。

ChatGPT广告界面示例

ChatGPT 广告投放概念设计:广告以"Sponsored"标签形式出现在回复底部,与答案内容分离

这种设计理论上可以降低用户对答案被"污染"的担忧,但批评者指出,长期来看广告逻辑一旦被引入系统,算法污染可能是微妙且难以察觉的——即使不是故意为之。

前科回顾:信任的裂痕

  • 2024 年 Altman 公开反对广告

Sam Altman 在采访中称将广告嵌入 ChatGPT 回复是"反乌托邦"的想法,表示更倾向于订阅模式以避免用户成为产品。

  • 2025 年 12 月 App Recommendations 争议

ChatGPT Plus 付费用户发现对话中出现 Target、Peloton 等品牌推荐。OpenAI 先是否认为广告,后在舆论压力下关闭该功能并道歉。

  • 2026 年 1 月 16 日正式宣布广告测试

OpenAI 官宣在免费版和 Go 版本中测试广告,同时发布"广告原则"框架,承诺付费用户永远不会看到广告。

这一系列事件的累积效应是:用户现在不再轻易相信 OpenAI 关于"高价订阅永远不会有广告"的承诺。Reddit 社区中大量评论指出,这正是流媒体巨头采用过的老套路——"先在免费端试水,再慢慢侵入付费端"。

有条件的宽容声音

💡部分理性用户的接受条件

并非所有反应都是负面的。部分用户认为,如果 OpenAI 能够做到以下几点,免费用户看广告是一种合理的交换:

1. 透明性:广告必须明确标注为"Sponsored",不能伪装成自然回答

2. 相关性:广告应与当前对话相关,而非完全无关的干扰

3. 可控性:用户可以关闭个性化广告设置,或清除用于投放广告的对话记录

4. 底线:高价订阅(Plus/Pro)必须永远保持无广告体验

这类"有条件宽容"的声音提醒我们,用户并非完全不能接受商业化,关键在于执行的边界和信任的维护。

行业视角:竞争压力与战略转向

从更宏观的行业视角来看,OpenAI 的这一决策也反映了 AI 领域日益激烈的商业化竞争。谷歌的 Gemini 和 Meta 的 AI 产品已经内置广告机制,OpenAI 不想在市场份额争夺中落于下风。

Marketing AI Institute 的分析尤其指出,OpenAI 内部正面临巨大的商业化压力。公司聘请前 Facebook 和 Instacart 高管 Fidji Simo 担任应用业务 CEO,这一人事任命本身就暗示了公司的战略方向——从技术研究机构向消费级商业平台的全面转型。

OpenAI 的创新尝试在于"对话语境驱动的广告"(contextual ads triggered by current conversation),理论上这种做法可以降低隐私风险。但实践中,用户很难确信系统不会进行隐蔽的数据关联。

结论:信任与商业化的钢丝行走

社交媒体反应以担忧和怀疑为主,核心议题围绕信任、隐私和"前科"问题。用户普遍采取了"show me"的态度——可以测试,但任何迹象表明承诺被破坏就会转向竞品。

主流媒体的评价则务实与批判并存:认可这一决策的商业必然性,但广泛质疑其能否在不伤害信任的前提下成功。最尖锐的评论来自社区用户的讽刺——AGI 实际上是"Ads Generating Income"(广告创造收入)。这反映了一个更深层的焦虑:开放人工智能的使命(AGI 造福全人类)与商业化压力之间可能存在根本性冲突。

OpenAI 正在走钢丝——既要维持无广告体验的付费用户的付费意愿,又要通过免费/低价层的广告收入覆盖高昂的运营成本。这个平衡能维持多久,将决定 ChatGPT 是否会重蹈社交媒体平台从纯净到被商业完全入侵的老路。

解决像 GoogleAIStudio 不能上传文件夹的痛点。

该工具可以将文件夹里面所有文件内容保持目录结构进行合并,一键复制给 AI。

项目地址:GitHub - AkenClub/Folder2Prompt: Prepare codebase context for AI. (为 AI 准备代码库上下文)

里面也有 Github Page 的地址可以直接用


📌 转载信息
转载时间:
2026/1/19 18:17:38

谷歌近期发布了一份指南,详细介绍了多智能体系统(Multi-Agent Systems, MAS)的八种核心设计模式,涵盖从顺序流水线到人工介入(human-in-the-loop)架构等多种范式。该指南不仅对每种模式都提供了清晰的解释,还附带了使用谷歌 Agent Development Kit(ADK)实现的示例代码。

 

谷歌指出,构建复杂且可扩展的智能体应用需要采用与其他软件系统相同的工程化方法,因为依赖单一实体会形成性能瓶颈,并使调试变得非常困难。

可靠性来源于去中心化与专业化。多智能体系统(Multi-Agent Systems,MAS)相当于 AI 领域的微服务架构。通过为各个智能体分配特定角色(比如,解析器、评判器、调度器),开发者可以构建出天然更具模块化、可测试性和可靠性的系统。

 

基于 ADK 提供的三种基础执行模式,即顺序(sequential)、循环(loop)和并行(parallel),谷歌归纳出八种基本架构(或称为“模式”),帮助开发者以结构化方式设计多智能体系统。

 

顺序流水线(Sequential Pipeline)是最简单的模式,智能体像装配线一样依次处理任务,每个智能体将其输出传递给下一个智能体。谷歌表示,这种模式“线性、确定性强,并且调试起来非常直观,因为你能够始终清楚数据来自何处”。

 

协调器/分发器(Coordinator/Dispatcher)模式是顺序流水线的一种变体,其中一个智能体作为决策者,接收请求并将其分派给下游的专用智能体。

 

并行扇出/聚合(Parallel Fan-out/Gather)模式在多个智能体同时执行各自职责时非常有用。例如,在审查 PR 代码的场景中,主智能体可并行启动多个子智能体分别处理代码风格检查、安全审计和性能分析。随后,一个合成器(synthesizer)智能体汇总所有输出,决定批准或拒绝该 PR。

 

层次分解(Hierarchical Decomposition)模式适用于更复杂的场景,高层智能体将复杂的目标拆解为子任务,并委派给其他智能体执行。

 

生成器与评判器(Generator and Critic)模式在输出可靠性至关重要的情况下使用,其中一个智能体负责生成内容,另一个智能体负责验证,并且可选择性地提供反馈,促使生成器迭代优化其输出。

 

迭代精进(Iterative Refinement)模式是“生成器与评判器”模式的泛化形式,生成器的输出被送入评判器(critique)精进器(refiner)智能体,二者协同工作,多次迭代以持续改进原始输出。

 

人工介入(Human-in-the-Loop)适用于具有不可逆后果或高风险的决策场景(比如,金融交易、生产环境部署、敏感数据操作)。此时,一个审批工具(approval tool)智能体会在必要时暂停执行,等待人工审核者批准或否决建议的操作。

 

复合模式(Composite Pattern)允许组合上述任意多种模式。例如,使用协调器路由请求、并行智能体加速处理,再结合生成器/评判器循环确保输出的质量。

 

正如指南所述,谷歌为每种模式都提供了详细的架构图和ADK代码片段,请参阅该文档以获取更多细节。

 

此外,如果想要了解其他使用 ADK 构建多智能体系统的思路,请参考Hangsik Shin撰写的指南

 

原文链接:

Google’s Eight Essential Multi-Agent Design Patterns

微软近日分享了TypeScript 7(代号为 Corsa 项目)的最新进展,披露了对 TypeScript 编译器的一次根本性重构。该更新发布于2025年12月,详细介绍了团队将 TypeScript 编译器用 Go 语言重写的宏伟计划,他们承诺构建速度最高可提升 10 倍,并显著降低内存的占用。

 

这款名为tsgo的全新原生编译器充分利用了 Go 语言的性能优势,带来了大幅度的速度提升。据 TypeScript 团队表示,与旧版本相比,完整构建速度最高可提升 10 倍,并具备高效的多项目并行处理能力。为编辑器功能(如代码补全、跳转定义、重构等)提供支持的原生语言服务目前已基本稳定,可供日常使用。

 

用户现在就可以试用这一预览版:

npm install -g @typescript/native-preview
复制代码

 

TypeScript 7 最重要的变化之一是默认启用严格模式(strict mode),这是一项与以往版本不兼容的破坏性变更。这一转变体现了团队对类型安全的坚定承诺,也符合行业最佳实践,但可能要求从旧版本升级的项目进行相应调整。

 

选择 Go 作为实现语言在开发者社区引发了广泛讨论。团队在一份详尽的FAQ中解释说,Go 提供了自动垃圾回收机制,同时又是目前最贴近“原生优先”理念的语言。此外,现有 TypeScript 代码库采用高度函数式的编程风格,几乎不使用类,因此 Go 的函数与数据结构范式比面向对象语言更为契合。

 

Hacker News上,开发者们对性能提升表现出了极大的热情。一位用户评论说:

哇,这太震撼了!10 倍的速度提升对我们这类大型 TypeScript 项目将是颠覆性的。我一直在等待这样的改进,我们团队的项目在 CI 上的类型检查耗时极长,并严重拖慢了 IDE 的响应速度。

 

不过,也有开发者对依赖 TypeScript 编译器 API 的工具迁移路径表示担忧:

……对于我们这些工具作者来说,这个原生编译器将如何分发?我猜会通过 WebAssembly(WASM)?编译器 API 是否兼容?比如转换器(transforms)、抽象语法树(AST)、LanguageService、Program、SourceFile、Checker 等等?

 

我非常担心工具生态的迁移可能会异常困难。

 

一些开发者已经上手尝试。Reddit 上有用户称其类型检查时间减少了 75%。还有人对默认开启严格模式表示欢迎:

默认启用严格模式真是太棒了。我们以前经常在项目中工作到一半才发现严格模式没启用,结果要修复一大堆问题,非常令人头疼。

 

对于重度依赖编译器的开发工具而言,TypeScript 7 的原生实现使其与其它以原生语言编写的高性能 JavaScript 工具站在了同一赛道。例如,用 Go 编写的esbuild,以及用 Rust 编写的 SWC 和 oxc,均已证明原生实现能带来显著的性能优势。TypeScript 团队此次转型不仅验证了这一架构方向的正确性,同时也确保了与 TypeScript 语言规范的完全兼容。

 

TypeScript 是由微软开发和维护的一种强类型编程语言,它在 JavaScript 基础上增加了静态类型定义。自 2012 年发布以来,TypeScript 可编译为纯 JavaScript,运行于任何支持 JavaScript 的环境,包括浏览器、Node.js 及其他 JavaScript 运行时。通过其类型系统,开发者能在编译阶段而非运行时捕获错误;借助智能代码补全、重构等特性,IDE 支持也得到了显著增强,同时,显式的类型契约使大型代码库更易于维护。

 

原文链接:

Microsoft Share Update on TypeScript 7


版权声明:这个主意来自 x, 如果涉及到侵犯权利,请和我联系,秒删.
项目:老照片修复
策略:去当地农贸市场 / 赶集 摆点收单
定价:10 块钱一张,包打印

流程:

收照片,直接扫描,用 AI 修复
可以买一个打印机,改好连供,1-2 小时交付,别现场交付,容易被质疑钱容易

每 2 天换一个地方,连续跑 8 天,
这肯定不是 “暴利项目”,只是一个低成本验证需求的实验

如果有效:

说明线下需求依然存在,信息差仍然巨大
可以复制玩矩阵,可以直接找人来帮我站岗摆摊
我负责修复作图,给摆摊的人照片,让他交付

一个县城就有大概十个左右的农贸市场
再大一些就直接雇人做照片和交付,只负责对接


📌 转载信息
转载时间:
2026/1/19 18:17:14

据麦肯锡发布的《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、灵骏、存储、网络服务,都是我们依赖的企业应用的有力支撑武器。而且,这些能力的成本在不断下降,功能也在持续拓展。

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

本人目前在 Windows 上使用 Codex 辅助开发,但体验不太好,希望能有一个更好的方式调用 codex。目前尝试过的调用方式有:VScode 插件、Codex Cli、WSL 中的 Codex Cli,对比下来,目前主要选择 Codex Cli 的方式进行调用。

codex 三种调用方式各自存在的问题:

  • VScode 插件: UI 美观,与 VScode 兼容性好,但最大的问题是无法回退对话重新发问,只能继续现有对话,本人很介意这一点,故放弃使用 Codex VScode 插件
  • Codex Cli: 可以回退,全键盘操作方便,其问题在于存在大量 Bug:
    1. 默认的沙盒模式不完善,会出现意料之外的问题;而第三档全同意的代理可能不安全。
    2. 粘贴换行文本时会出现将换行符理解为发送的情况,很不人性化,在更新后此情况似乎得到缓解。
    3. 输入中文时会出现实际显示的中文与输入的中文不一样的情况,可能与输入法有关系,在最近更新后此情况变得格外严重
  • WSL 中的 Codex Cli:体验过一段时间,问题在于打开麻烦,且路径与 windows 路径不一致,可能会出现问题,但 bug 比较少

综合考量,我的方案是直接使用 Codex Cli,启动操作简单,也可以正常使用,但上述相关 bug 仍然困扰着我,希望能找到一种全新的使用 Codex 的方案以解决这些问题

解决思路

目前似乎没有发现能够解决这些问题的项目,但我注意到 codex 官方已经发布了 Codex SDK ,期待有大佬能够基于 SDK 开发全新的好用的软件


📌 转载信息
转载时间:
2026/1/19 18:17:03