包含关键字 typecho 的文章

目前一键注册的用户头像存的是第三方 Google 或 Github 的头像 url,这会导致正常访问无法直接显示出 Google 的头像,所以做了一个迁移计划,在今天的合适实际会执行自动迁移,若迁移的头像出现问题可及时和我反馈,迁移前我会记录原头像 url 避免出现错误无法回退。

另外一些优化更新:

  1. oAuth 的授权现在会显示应用作者的一些信息以及应用的域名页面方便快速访问
  2. oAuth 应用申请和 secret 重置增加了推送提醒
  3. 修正了 oAuth 接口不安全的返回 secret 问题,已有应用的 secret 我已做了重置,上线疏忽抱歉sobbing
  4. 修正了一键排版未做金币的消耗判断
  5. 优化帖子评论分页记录,现在只要链接 p 参数变化就会记录上一次访问的分页值下次访问会直接到该分页,之前只在手动切换分页时记录
  6. 编辑金币优化,现在编辑的内容长度会与原内容长度做对比,使用差值做金币计算,新内容长度比旧内容短的话,不再消耗金币
  7. 图片的显示增加了宽度像素配置

各位更新有问题可及时反馈doge_flower

今天,我们正式开源了 LingBot-Depth 空间感知模型。

点击查看视频

不同于数字世界,具身智能的落地高度依赖物理空间信息,空间智能是其在现实场景落地应用的核心关键,而视觉维度下支撑空间智能的重要桥梁正是距离与尺度(Metric Depth)。基于这一核心需求,空间感知模型 LingBot-Depth 应运而生。

LingBot-Depth 是一种面向真实场景的深度补全模型,依托奥比中光 Gemini 330 系列双目 3D 相机进行 RGB-Depth 数据采集与效果验证,并基于深度引擎芯片直出的深度数据进行训练与优化,旨在将不完整且受噪声干扰的深度传感器数据转化为高质量、具备真实尺度的三维测量结果,提升环境深度感知与三维空间理解能力,为机器人、自动驾驶汽车等智能终端赋予更精准、更可靠的三维视觉。

实验结果表明,本模型在深度精度与像素覆盖率两项核心指标上均超越业界顶级工业级深度相机。在 NYUv2、ETH3D 等多个基准测试中,LingBot-Depth 在深度补全、单目深度估计及双目匹配任务上均达到当前最优水平,并在无需显式时序建模的情况下保持视频级时间一致性。LingBot-Depth 模型也已通过奥比中光深度视觉实验室的专业认证,在精度、稳定性及复杂场景适应性方面均达到行业领先水平。
640.webp
注解:在最具挑战的稀疏深度补全任务中,LingBot-Depth 性能整体优于现有多种主流模型。(图中数值越低代表性能越好。)

下游任务验证进一步表明,模型能够在 RGB 与深度两种模态之间学习到对齐的潜在空间表征,从而实现对透明及反光物体的稳定机器人抓取。

01技术架构:创新的掩码深度建模范式

640 (1).webp
在家庭和工业环境中,玻璃器皿、镜面、不锈钢设备等透明和反光物体物体十分常见,但却是机器空间感知的难点。传统深度相机受制于光学物理特性,在面对透明或高反光材质时,往往无法接收有效回波。针对这一行业共性难题,我们研发了“掩码深度建模”(Masked Depth Modeling,MDM)技术。训练过程中,我们使用海量 RGB–深度图像对,但刻意遮挡其中一部分深度区域,让模型仅根据 RGB 图像去预测缺失的深度值。随着训练进行,模型逐渐学会建立“外观—几何”之间的对应关系,也就是从“物体看起来像什么”推断“它大概有多远”。

在涵盖家庭、办公环境、健身房及户外场景的上千万张图像数据上完成训练后,当深度相机传回的数据出现缺失或异常时,LingBot-Depth 模型已能够融合彩色图像(RGB)中的纹理、轮廓及环境上下文信息,对缺失区域进行推断与补全,输出更完整、致密、边缘更清晰的三维深度图。

02 核心亮点

精准且稳定的相机深度感知

LingBot-Depth 在传统深度传感器易失效的复杂场景中,仍可输出具备真实尺度的高精度深度结果,包括透明物体、玻璃表面以及高反光材质等极具挑战性的环境。不同于依赖硬件改进的方案,本模型从视觉理解层面弥补传感器缺陷,实现对真实三维结构的可靠恢复。

除单帧精度优势外,LingBot-Depth 还表现出优异的时间一致性。在无需显式时序建模的情况下,模型即可为视频输入生成稳定、连贯的深度序列,有效避免闪烁与结构跳变问题,为机器人操作、AR/VR 以及动态场景感知等应用提供可靠的连续空间理解能力。
image.png

卓越的 3D 和 4D 环境感知能力
LingBot-Depth 为下游空间感知任务提供了坚实而通用的基础能力。通过将含噪且不完整的传感器深度优化为干净、稠密且具备真实尺度的三维测量结果,模型显著提升了多种高层视觉任务的稳定性与精度。具体而言,LingBot-Depth 支持:

更加准确的结构化室内场景建图,并有效提升相机位姿与运动轨迹估计的精度;

面向机器人学习的可靠 4D 点跟踪能力,在统一的真实尺度空间中同时刻画静态场景几何结构与动态物体运动。这使得系统能够在复杂真实环境中建立一致、连续且可用于决策与交互的空间理解表征。
11.jpg

灵巧抓取操作适用于透明与反光物体
通过在统一潜在空间中联合对齐 RGB 外观信息与深度几何结构,LingBot-Depth 使机器人在以往难以处理的复杂场景中实现稳定可靠的操作能力。基于模型优化后的高质量深度结果及跨模态对齐特征,我们进一步训练了一种基于扩散模型的抓取位姿生成策略,在透明杯、反光金属容器等具有挑战性的物体上取得了较高的抓取成功率。在真实机器人测试中,在透明储物盒等传统传感器难以处理的场景中,LingBot-Depth 通过生成合理的深度估计,成功实现了 50% 的抓握率,突破了技术瓶颈。
640 (2).webp
点击查看视频

03 从实验室到落地应用:显著提升消费级深度相机对高难物体的处理效果

LingBot-Depth 展现出与现有硬件设备的良好适配性。在不更换更高成本传感器的情况下,模型可提升可靠性并降低系统部署门槛。LingBot-Depth 模型依托奥比中光 Gemini330 系列双目 3D 相机进行效果测试,结果显示:面对透明玻璃、高反射镜面、强逆光以及复杂曲面等极具挑战性的光学场景,搭载 LingBot-Depth 后输出的深度图变得平滑、完整,且物体的轮廓边缘非常锐利,效果优于业内领先 3D 视觉公司 Stereolabs 推出的 ZED Stereo Depth 深度相机。
!上传中...640 (3).webp
注解:搭载 LingBot-Depth 后,奥比中光 Gemini 330 系列在透明及反光场景下深度图的完整性和边缘清晰度明显提升
640 (4).webp
注解:奥比中光 Gemini 330 系列相机搭载 LingBot-Depth 后输出的深度图效果优于业界领先的 ZED 深度相机

这意味着在不更换传感器硬件的前提下,LingBot-Depth 可显著提升消费级深度相机对高难物体的处理效果,降低机器人因深度缺失与噪声引发的抓取失败与碰撞风险。在具身智能、自动驾驶等领域都有一定应用价值,能够极大程度提升具身操作的精准度。

目前,我们已与奥比中光达成战略合作伙伴关系,将基于 LingBot-Depth 模型推出新一代深度相机,依托 Gemini 330 系列相机提供的芯片级 3D 数据,进一步通过技术协同、生态共建,为机器人处理各行各业极端场景、走向真正落地提供强大的技术支撑。

LingBot-Depth 已成功实现模型轻量化与端侧部署,具备在边缘计算设备上高效运行的能力。未来,我们期待通过开源开放与生态合作,和广大合作伙伴一起加速具身智能在家庭、工业、物流等复杂场景的大规模应用落地。

目前我们的模型、代码、技术报告已全部开源,欢迎大家访问我们的开源仓库。

Website:
https://technology.robbyant.com/lingbot-depth

Model:
https://huggingface.co/robbyant/lingbot-depth

Code:
https://github.com/Robbyant/lingbot-depth

Tech Report:
https://github.com/Robbyant/lingbot-depth/blob/main/tech-report.pdf

后续我们还将开源 300 万对精心标注的 RGB-深度数据,包括 200 万对实拍 RGB-D 样本,和 100 万对渲染样本,推动空间感知技术的开源生态建设和技术创新。

LingBot-Depth 的开源标志着我们在空间智能领域迈出的第一步。本周,我们还将陆续为大家带来我们在具身智能领域智能基座方向的更多成果,我们期待与全球开发者、研究者、产业伙伴一起,共同探索具身智能的上限。
image.png

生成式 AI 的投资回报远超预期?Snowflake 调研全球 1900 位企业与 IT 专业人士后发现平均 ROI 高达 41%!点击下载完整报告

AI Copilot 和自主智能体的崛起正在重新定义开发者的意义。在 BUILD 2025 的一场重磅主题分享中,Vercel CEO 和 Next.js 的创始人 Guillermo Rauch 深入探讨了 AI 如何改变开发者的体验。AI 将我们的角色从编写代码转变为有意图地引导智能系统。在这个未来中,AI 原生工具将大大提升开发者的生产力、创造力和规模。

Guillermo Rauch 从自身经历出发,系统性地拆解了 AI 浪潮下,开发范式正在发生的结构性变化。这并非一场关于工具或技巧的演示,而是一份面向当代开发者的生存指南:当技术能力不再稀缺,什么才是决定长期价值的核心能力?他的判断很明确,我们正经历一场从“页面”走向“Agent”的转型,其深度与影响,堪比第一代互联网的诞生。

从“页面的云”到“Agent 的云”

Rauch 回顾了 Vercel 的起点。2014 年,当开发者仍需在路由、编译器、集群和部署细节中反复挣扎时,真正能高效构建和交付产品的,只有少数拥有内部基础设施的大公司。

Vercel 以及 Next.js 的诞生,本质上是一次“能力下放”,让原本只属于头部公司的开发效率,成为更广泛开发者的默认能力。

而今天,类似的分化正在 AI 领域重演。

他指出,支撑第一代 Web 的云基础设施,本质上是“为页面而生”的:优化加载速度、依赖 CDN、围绕一次性请求与响应展开。但在 Agent 驱动的应用形态中,这套逻辑开始失效。新的应用形态不再以页面为中心,而是以持续运行、长时间“思考”、多步骤编排的智能体为核心。

因此,云的目标也随之发生变化:

  • 算力不再只追求“更快返回”,而是要支持更长时间、更复杂的推理;

  • 基础设施不再围绕页面分发,而是围绕“token 流动”和智能调用;

  • 搜索和触达不再依赖排名,而是通过 Agent 主动嵌入到用户的工作场景中。

在这一意义上,他将新的基础设施形态称为“面向 Agent 的云”。

界面没有消失,只是变成了生成式

与基础设施变化同步发生的,是用户界面的根本转型。

传统的软件界面是确定性的:开发者可以精确控制每一个像素,预期用户将看到什么、点击什么、进入哪条路径。但在 AI 时代,界面正在变成生成式和自适应的,按需生成、随上下文变化,并高度个性化。

Rauch 特别强调,这并不意味着前端或用户体验的重要性下降,恰恰相反,体验比以往任何时候都更重要。变化的只是如何构建体验:从事先设计好所有界面,转向在需要时即时生成最合适的呈现方式。

他以 Snowflake 与 Vercel 的生成式 UI Agent(V0)的集成为例:复杂的数据分析结果,可以在对话中即时生成可视化界面,让非技术用户也能理解。这背后的趋势,是行业从“代码优先”逐步迈向“代码后置”,代码不再是价值本身,而是服务于结果的一种中间形态。

当谁能写代码不再重要

如果说基础设施和界面的变化,重塑了怎么构建,那么更深层的变化在于——谁可以参与构建

Rauch 认为,软件开发正在从一项高度专业化的技能,转变为一种普遍能力。过去,门槛在于语法、工具链、基础设施;而现在,门槛正在转移到一个新的维度:意图是否清晰

在 AI 的帮助下,表达能力本身成为新的基础素养。会不会写代码,正在被能否准确表达你想要什么所取代。他将这种变化视为 JavaScript 普惠化的升级版:如果说框架和平台曾让大量前端开发者成为云工程师,那么 AI 则让更多非技术背景的人,第一次具备了构建软件的能力。

在这种背景下,个人技能的价值排序正在被重写。Rauch 提出了一个残酷但现实的判断:不要过度依附于某一项具体技能。正如心算曾经是优势,但最终被机器超越,编程技能也正在进入类似阶段。

真正重要的,是他所说的“元技能”。

交付,正在成为最核心的元能力

在 AI 可以生成无限方案的时代,开发者真正需要承担的角色,不是代码执行者,而是判断者与交付者

Rauch 将“交付(Shipping)”视为当代开发者最关键的元能力。它不等同于写代码,而是一种端到端的综合能力:从问题判断、产品设计、实现方式,到测试、迭代、讲清楚价值,并持续提高标准。

在他看来,AI 不只是提升效率的工具,更应该服务于质量。他反复强调一个立场:更快地生成代码,不应成为降低交付标准的借口。相反,真正的竞争力在于,同时提高生产力与质量

围绕这一判断,他给出了具体的实践方向:将 Agent 用于客服、风控、内容生成、数据分析等场景,让系统承担重复性工作,把人的时间留给真正影响产品和业务走向的决策。随着系统从“被接受、被修改、被拒绝”的反馈中不断学习,质量门槛本身也会随时间抬升。

最终,他将 Agent 的意义概括为一句话:消除创意与现实之间的壁垒

在这场分享的结尾,Rauch 并未给出下一步该学什么工具的清单,而是抛出了一个更本质的问题:当工具已经就位、模型已经成熟,你真正要思考的,是你准备交付什么样的产品、什么样的价值

AI 时代的开发者体验,不再只是写更少的代码,而是能否以更高的标准,把想法真正带到现实世界中。

前言

在鸿蒙应用的开发过程中,状态管理一直是我们绕不开的话题。如果你是从 API 9 或 API 10 一路走来的老兵,一定经历过被 @Observed@ObjectLink 支配的恐惧。那时候,我们想要监听一个嵌套在对象深处的属性变化,简直就是一场噩梦。

假设你有一个 User 对象,里面包含一个 Address 对象,当你试图修改 user.address.city 时,你会发现界面纹丝不动。为了解决这个问题,我们被迫把 Address 拆分成一个独立的子组件,或者暴力地重新赋值整个 Address 对象来触发更新。这种为了技术限制而通过增加组件层级来妥协的做法,不仅让代码变得臃肿,更带来了不必要的性能开销。

在 HarmonyOS 6 (API 20) 中,ArkUI 团队终于为我们带来了状态管理的 V2 版本,其中 @ObservedV2@Trace 的出现,彻底粉碎了嵌套对象监听的痛点,让我们终于可以像写原生 JS 一样自然地操作数据了。

一、 告别 V1 时代的“洋葱式”更新

在深入 V2 之前,我们有必要回顾一下 V1 版本状态管理的局限性,这样你才能深刻体会到新特性的甜头。在 V1 中,状态管理的粒度通常停留在 对象引用 级别。这意味着,框架只关心这个对象是不是原来那个对象,或者这个对象的一级属性有没有变。一旦数据结构变得立体,比如数组里套对象,对象里又套对象,框架的感知能力就会断崖式下跌。

为了让 UI 响应深层数据的变化,我们过去不得不构建一种 洋葱式 的组件结构。父组件持有 User,子组件持有 Address,孙子组件持有 Street。每一层都必须严格使用 @ObjectLink 进行传递。

这导致了一个后果:哪怕是一个简单的表单页,可能都需要拆分成七八个细碎的自定义组件。这不仅增加了代码的复杂度,还让组件之间的通信变得异常繁琐。而如果我们偷懒不拆组件,就只能通过 this.user.address = new Address(...) 这种“换血”的方式来强制刷新,这无疑是在用大炮打蚊子,性能损耗极大。

二、 @ObservedV2 与 @Trace 的精准打击

HarmonyOS 6 引入的 @ObservedV2@Trace,采用了全新的代理(Proxy)机制,将监听的粒度精确到了 属性 级别。这就像是给每一个需要关注的数据字段都安装了一个微型的传感器,无论它被嵌套得有多深,只要数值发生变化,传感器就会立即向 UI 发送更新信号。

使用这套新机制非常直观。首先,我们需要用 @ObservedV2 类装饰器来标记一个类,告诉框架:这个类产生的实例是需要被深度观察的。接着,对于类中那些会影响 UI 显示的核心属性,我们给它们加上 @Trace 装饰器。

注意,这里有一个巨大的思维转变。我们不再需要把所有属性都变成状态,只有那些真正和界面绑定、变化时需要触发重绘的属性,才需要加 @Trace。这种按需监听的设计,从根源上减少了不必要的渲染消耗。

我们可以看看下面这段定义代码,它展示了如何构建一个可深度监听的数据模型.

// 定义一个深层嵌套的设置类
@ObservedV2
class Settings {
  @Trace theme: string = 'Light';
  @Trace fontSize: number = 14;

  constructor(theme: string, fontSize: number) {
    this.theme = theme;
    this.fontSize = fontSize;
  }
}

// 定义用户类,嵌套了 Settings 类
@ObservedV2
class User {
  @Trace name: string;
  @Trace age: number;
  // 嵌套的复杂对象,只要 Settings 类被正确装饰,这里无需特殊处理
  @Trace settings: Settings; 

  constructor(name: string, age: number, settings: Settings) {
    this.name = name;
    this.age = age;
    this.settings = settings;
  }
}

在上面的代码中,不管是 User 还是嵌套在内部的 Settings,都被标记为了 V2 的观察对象。

当你在组件中直接执行 this.user.settings.theme = 'Dark' 时,ArkUI 能够精准地捕获到这个深层属性的变化,并只更新依赖了 theme 属性的那一部分 UI,而不会导致整个 User 卡片甚至整个页面的重绘。

三、 数组与集合的深度监听

除了对象嵌套,数组操作也是 V1 版本的一大痛点。以前我们必须使用 ArkUI 提供的特定数组方法,或者把数组项封装成 @ObjectLink 组件才能监听到增删改查。而在 V2 中,@Trace 同样适用于数组属性。

当你将一个数组标记为 @Trace 后,框架会自动代理这个数组的 push、pop、splice 等变更方法。更令人兴奋的是,如果数组中的元素本身也是 @ObservedV2 装饰过的对象实例,那么修改数组中某一个元素的属性(例如 this.users[0].name = 'New Name'),也能直接触发 UI 更新。

这种 数组结构变化元素内部变化 的双重监听能力,让列表类数据的处理变得异常丝滑。我们不再需要为了更新列表里的一行文字而被迫刷新整个列表数据。

四、 最佳实践与注意事项

虽然 V2 极其强大,但在使用时也有一些规则需要遵守。首先,@ObservedV2 只能装饰 class,不能用于接口或简单对象。其次,V2 的状态变量通常配合 @Local(组件内部状态)或 @Param(组件参数)在 UI 组件中使用,这替代了 V1 中的 @State@Prop

在使用中我们要养成 精细化控制 的习惯。不要习惯性地给类里的所有属性都加上 @Trace,只给那些 UI 真正用到的属性加。比如一个用于内部逻辑计算的临时 ID 或者缓存数据,就不应该加 @Trace,这样可以减轻框架的代理负担。此外,V2 的状态追踪是基于实例的,如果你直接替换了整个对象实例,那么新实例必须也是由 @ObservedV2 装饰的类创建的,否则监听链条就会断裂。

下面是一个完整的实战案例,模拟了一个“智能家居控制面板”的场景。在这个场景中,我们有一个家庭对象,里面包含多个房间,每个房间又有独立的设备。通过 V2 的深度监听,我们可以直接在父组件修改最深层的设备状态,观察 UI 是如何丝滑响应的。

import { promptAction } from '@kit.ArkUI';

// =========================================================
// 1. 数据模型定义
// =========================================================

@ObservedV2
class SmartDevice {
  @Trace name: string;
  @Trace isOn: boolean;
  @Trace powerConsumption: number;

  constructor(name: string, isOn: boolean, power: number) {
    this.name = name;
    this.isOn = isOn;
    this.powerConsumption = power;
  }
}

@ObservedV2
class Room {
  @Trace name: string;
  @Trace devices: SmartDevice[] = [];

  constructor(name: string, devices: SmartDevice[]) {
    this.name = name;
    this.devices = devices;
  }
}

@ObservedV2
class SmartHome {
  @Trace familyName: string;
  @Trace rooms: Room[] = [];

  constructor(familyName: string) {
    this.familyName = familyName;
  }
}

// =========================================================
// 2. 主界面组件
// =========================================================

@Entry
@ComponentV2 
struct DeepObservationPage {

  @Local myHome: SmartHome = new SmartHome('鸿蒙未来家');

  aboutToAppear(): void {
    const livingRoom = new Room('客厅', [
      new SmartDevice('主灯', true, 50),
      new SmartDevice('空调', false, 1200),
      new SmartDevice('电视', false, 200)
    ]);

    const bedroom = new Room('主卧', [
      new SmartDevice('床头灯', false, 10),
      new SmartDevice('空气净化器', true, 45)
    ]);

    this.myHome.rooms.push(livingRoom, bedroom);
  }

  build() {
    Column() {
      // 1. 顶部标题
      Text(`${this.myHome.familyName} 控制中心`)
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 40, bottom: 20 })

      // 2. 设备列表区域
      List({ space: 16 }) {
        ForEach(this.myHome.rooms, (room: Room) => {
          ListItem() {
            Column() {
              Text(room.name)
                .fontSize(18)
                .fontWeight(FontWeight.Bold)
                .width('100%')
                .padding({ left: 12, bottom: 12, top: 4 })
                .border({ width: { bottom: 1 }, color: '#F0F0F0' })

              ForEach(room.devices, (device: SmartDevice) => {
                Row() {
                  Column() {
                    Text(device.name)
                      .fontSize(16)
                      .fontWeight(FontWeight.Medium)
                      .fontColor('#333')

                    Text(`能耗: ${device.powerConsumption}W`)
                      .fontSize(12)
                      .fontColor('#999')
                      .margin({ top: 4 })
                  }
                  .alignItems(HorizontalAlign.Start)

                  // 开关控制
                  Toggle({ type: ToggleType.Switch, isOn: device.isOn })
                    .onChange((value: boolean) => {
                      // V2 深度监听核心:直接修改属性,UI 自动刷新
                      device.isOn = value;
                    })
                }
                .width('100%')
                .justifyContent(FlexAlign.SpaceBetween)
                .padding(12)
                .backgroundColor(device.isOn ? '#F0F9FF' : '#FFFFFF')
                .borderRadius(8)
                .animation({ duration: 300 })
              })
            }
            .padding(12)
            .backgroundColor(Color.White)
            .borderRadius(16)
            .shadow({ radius: 8, color: '#0D000000', offsetY: 2 })
          }
        })
      }
      .layoutWeight(1)
      .padding({ left: 16, right: 16 })
      .scrollBar(BarState.Off)

      // 3. 底部按钮
      Button('一键关闭所有设备')
        .width('90%')
        .height(48)
        .backgroundColor('#FF4040')
        .shadow({ radius: 10, color: '#4DFF4040', offsetY: 5 })
        .margin({ bottom: 20, top: 10 })
        .onClick(() => {
          let turnOffCount = 0;
          this.myHome.rooms.forEach(room => {
            room.devices.forEach(device => {
              if (device.isOn) {
                device.isOn = false;
                turnOffCount++;
              }
            });
          });
          promptAction.showToast({
            message: turnOffCount > 0 ? `已关闭 ${turnOffCount} 个设备` : '所有设备已关闭'
          });
        })
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
  }
}

五、 总结

从 V1 到 V2,鸿蒙的状态管理机制完成了一次从 粗放精准 的进化。@ObservedV2@Trace 的组合,让我们彻底摆脱了为了做数据监听而扭曲组件结构的尴尬境地。

现在,我们可以按照最符合业务逻辑的方式去设计数据模型,无论嵌套多少层,无论数据结构多么复杂,ArkUI 都能像手术刀一样精准地定位到变化点并更新视图。这对于构建大型、复杂交互的鸿蒙应用来说,是必须要掌握的核心能力。

在构建金融交易系统时,我们常说“天下武功,唯快不破”。但在外汇交易的实战开发中,很多开发者往往卡在了第一步:如何优雅且高效地获取实时数据?

前阵子我在优化一个即时汇率换算模块,目标是同时监听 USD/JPY 和 EUR/USD 的波动。需求很明确:低延迟、低资源占用、高稳定性。

传统的 requests.get() 轮询方案在这里是行不通的。每一次 HTTP 请求都要经历三次握手、传输、断开,这种开销对于高频变化的行情数据来说是巨大的浪费。而且,你很难控制轮询的频率——太快了服务器当你是 DDoS,太慢了又捕捉不到瞬间的插针行情。

解决这个问题的标准答案就是 WebSocket。它允许建立一次连接后保持双向通信,服务器有新价格直接推送到客户端。我在对比了几个 API 文档后,选择了 AllTick API 作为演示对象,主要是看重它在断线重连和数据包结构的简洁性上做得比较符合开发直觉。

首先,摒弃复杂的框架,回归最基础的 websocket-client。

pip install websocket-client requests

接下来的核心代码涉及三个回调函数:on_open(建立连接时订阅)、on_message(接收数据)、on_error(错误处理)。

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)
    print(f"{data['symbol']} | {data['price']} | {data['time']}")

def on_open(ws):
    subscribe_msg = {
        "action": "subscribe",
        "symbols": ["EURUSD", "USDJPY"]
    }
    ws.send(json.dumps(subscribe_msg))

ws = websocket.WebSocketApp(
    "wss://api.alltick.co/forex/realtime",
    on_open=on_open,
    on_message=on_message
)

ws.run_forever()

当你订阅了多个货币对时,数据流的压力会变大。

import csv
from datetime import datetime

def save_tick(data):
    with open("forex_tick.csv", "a", newline="") as f:
        writer = csv.writer(f)
        writer.writerow([
            datetime.now(),
            data["symbol"],
            data["price"]
        ])


在处理这些并发数据时,我的经验是:千万不要在 on_message 里做耗时的计算逻辑。先把数据塞进队列(Queue)或者存下来,计算逻辑另起线程处理,否则会阻塞心跳,导致连接断开。

subscribe_msg = {
    "action": "subscribe",
    "symbols": ["EURUSD", "USDJPY", "GBPUSD", "AUDUSD"]
}

从 HTTP 转向 WebSocket,本质上是思维方式从“主动查询”到“事件驱动”的转变。如果你手头也有类似的监控需求,不妨试试上面的代码。你会发现,当数据流实时涌入控制台的那一刻,整个系统的“手感”完全不同了。

本文介绍我对 Clawdbot / Moltbot AI 个人助手的尝鲜使用。有蹭热度嫌疑,喜干货者慎入 :)

最近大热的 Clawdbot(现改名为 Moltbot) 是一个人 AI 助手,主打个人 Self-Hosted 的 ai agent。可运行在您自己的设备上的 AI 助手。不管你在哪里,均可以通过国际上常用的 IM 聊天平台(WhatsApp/Telegram/Matrix 等等,但不包括 WeChat)通过聊天与 ai agent 进行互动。

Just another chatbot ?

如果你硬要我说点非市场炒作的人话,不要老打鸡血天天震撼和炸裂,回归朴素码农实用主义的话。那么问题的核心是:这所谓的 “新” 玩意,和之前的支持本地部署的,做点 hack 也可以互联网访问的 lobehub / librechat 甚至更久远的 open-webui 这类已经支持 MCP 工具 的 LLM chat UI 有什么区别?

说实话,在我短短数小时的安装和使用时间里,我只能告诉大家一些基本概念和功能上的不同,也因了解时间有限,说得不对请纠正:

  • 任务长期化、异步化。不再是一个聊天请求触发,然后在线等待响应的工作流程。
  • 多任务并行化
  • IM 聊天平台 作为主交换方式。 这大大简化了部署和远程使用,只需要一个 IM 聊天平台的接入即可。对大众用户比要 Port Mapping 或 Tailscale 才能使用的门槛要低很多。异步任务的通知推送问题,多模态图像声音的输入输出问题,接入的便利性问题,一个方案同时解决了。
  • 支持 Skills 等已经深入民心的 AI 定制设计模式。只要本地命令行能做的,Moltbot 也能做。

看完这些,你大概会联想起 ManusOpenManus

安装

网上已经非常多安装手把手教程了。所以我不打算写教程了,这里只说说我使用的一些配置:

综合考虑到网络环境的难和付款的便利,我选择了 openrouter 以及 anthropic/claude-sonnet-4.5 模型 。

配置文档:

https://docs.molt.bot/providers/openrouter

配置示例:

{
  env: { OPENROUTER_API_KEY: "sk-or-..." },
  agents: {
    defaults: {
      model: { primary: "openrouter/anthropic/claude-sonnet-4.5" }
    }
  }
}

注意,直接用 CN 的 source ip 是访问不了 openrouter 的 claude-sonnet-4.5 的,会 http status 403 : This model is not available in your region

是有点贵,不过先试试再找平替吧。

简单试用

image.png

这里只是简单试用一下 AI 助手对工具的智能调用能力。还不错。不过 UI 设计还是有待改进的。很工程师风的界面用户体验。不过这界面叫 Dashboard ,这个风格也说得过去吧。

计划

计划后面试试接入适合国情的 Matrix IM ,看看效果。例如,我收到 Prometheus 报警 Homelab 问题时,可以让 Moltbot 自动分析原因和自动修复。也可以接入语音 TTS/STT ,甚至图像识别等等。有进度也会分享分享。再见。

2026 年 1 月,在操作智能领域权威评测体系 OSWorld 发布的最新榜单中,九章云极 DataCanvas 凭借在 Alaya NeW Cloud 强化学习平台上训练的 DART-GUI-7B 模型,以卓越的智能操控表现,一举夺得 OSWorld 7B 赛道冠军!

九章云极:Alaya NeW Cloud 强化学习平台

Alaya NeW Cloud 是由九章云极打造的以强化学习( Reinforcement Learning, RL )为核心能力的智算云平台,该平台通过将强化学习能力深度融入底层基础设施,重构了智能计算的架构与逻辑,旨在为企业和开发者提供“可用、好用、经济”的算力资源。

Alaya NeW Cloud 打造前沿强化学习云平台,平台原生支持一键式 Agentic RL 开发环境启动 、分布式极核 Agentic RL 训练,性能上实现训推分离与全流程加速,生态上预置多种主流 Agent 仿真环境,高效支撑强化学习技术的快速落地与创新突破,精准解决 AI 技术应用中的效率和成本等核心问题。目前,九章云极已在全球布局多个聚焦于加速计算优化的 AIDC 智算中心,持续赋能 AI 技术的高效应用与行业规模化落地。

DataCanvas Alaya NeW Cloud

核心技术解读:轻量化模型的 GUI 智能体突破

什么是 OSWorld?

OSWorld 是目前 AI 领域衡量 “智能体( Agent )跨软件操作电脑” 能力最顶尖的基准测试,它模拟真实的操作系统环境,要求 AI 像人类一样通过视觉观察屏幕,并精准操控浏览器、Excel 、VS Code 等各类桌面应用来完成跨平台的复杂任务,被 OpenAI 、Anthropic 、字节跳动 Seed 、月之暗面、智谱等顶尖 AI 团队广泛采用,更是检验 AI 能否从“只会聊天”进化为“高效数字员工”的硬核试金石。

为什么 OSWorld 对 7B 模型几乎是“地狱难度”?

  • 真实生态:任务在 VS Code 、LibreOffice 等真实软件中运行,环境信息密度远超结构化数据

  • 闭环操控:需要连续理解截图、规划路径和进行键鼠操作,考验长程推理能力

  • 零容错率:限时 30 步,操作需步步为营,失败不可逆转

  • 数据稀疏:基础成功率不足 1/4,即使是大模型也面临严峻挑战

复杂的跨软件协作与精细的坐标控制,使得参数规模有限的 7B 模型在“理解”与“执行”之间难以调和,长期处于“不可用”状态。

核心技术路径:九章云极三大创新赋能轻量化突破

1. 核心方法:解耦式 GUI 智能体强化学习框架

九章云极并未通过简单扩大模型规模取胜,而是选择了系统级的算法创新。提出了 DART( Decoupled Agentic Reinforcement Training ),首次将 GUI 智能体的强化学习训练流程彻底解耦为四个异步模块:

三项关键突破

  • 推演级轨迹调度( Rollout-Level Scheduling ):

以“单条轨迹”作为调度最小单位;

每个 rollout 完成后立即释放环境并启动下一个任务;

环境利用率提升从 12.2% 达到 67.7%,提升幅度高达 5.5 倍。

  • 动态模型服务池( Dynamic Model Serving Pool ):

采用 GPU 推演的集中化管理,支持多模型版本的热加载;

避免了传统“一卡一环境”的资源浪费;

GPU 推演利用率提升 1.6 倍

GPU 资源的并发弹性扩展能力。

  • 训练与推理异步执行( Asynchronous Execution of Training and Inference ):

训练与推演实现异步解耦;

避免模型更新导致服务阻塞。

2. 数据策略:四层自适应筛选,放大稀疏成功信号

针对 GUI 强化学习中的“成功少、噪声多”核心难题,DART 设计了覆盖任务、轨迹、步骤和 Token 的四层筛选机制:

这一机制使得 7B 模型,在最大 30 步内,即可稳定的实现 OSWorld 中的任务要求。

3. 多维优化:以轻量化参数对冲复杂场景,重塑性能边界

九章云极经过强化学习训练的 7B 模型之所以能实现突破,关键在于采用了“场景适配、精度优化、算力协同”的三维技术方案,在控制参数量的同时,最大化提升操作智能性能:

  • 场景化指令对齐技术:基于百万级真实操作场景数据训练,构建细分领域的指令库,优化模型对办公自动化、数据处理等高频场景的语义理解能力,精准捕捉模糊指令背后的核心需求,使指令理解准确率较通用模型提升 23 %,并减少无效操作;

  • 混合精度推理优化:借鉴智算硬件优化经验,对模型不同模块进行精度分层处理。核心推理模块保留 FP16 精度以确保准确性,非核心模块量化至 INT8 精度。这一调度方式实现推理效率提升 1.8 倍,资源占用率降低 40 %

  • 软硬件协同调度机制:依托自研的智算技术栈优势,深度协同模型推理与算力资源,动态调整算力分配策略以应对负载波动,避免资源闲置。同时使用专用推理加速引擎优化 GUI 元素识别与动作规划的计算链路,进一步降低轻量化模型的推理延迟。

实验结果:全类型任务下性能优势显著

在最大步长仅有 30 步的情况下,DART-GUI-7B 在多种任务类型上表现出显著优势,包括:

  • 浏览器类( Chrome );

  • 图像/设计类( GIMP );

  • 邮件客户端类( Thunderbird );

  • 代码/ IDE 类( VS Code );

  • 操作系统交互类( OS )。

亮点:GIMP 类任务的正确率高达 80.77 %,且在办公套件( Impress、Writer、Calc )、媒体播放类( VLC )以及多应用协同等任务中,其能力也有显著提升。

九章云极还进行了真实场景的验证。在 DataCanvas Alaya NeW 平台上,DART-GUI-7B 成功地通过键鼠操作完成文档查找、导航到指定页面及查找官网联系方式等场景任务,其成功率超过 90 %

产业价值与未来展望

目前,AI 大模型正加速从“技术验证”向“产业落地”转变。通用人工智能作为连接数字世界与物理操作的重要工具,在办公自动化、智能运维和工业控制等领域展现出广阔的应用前景。然而,模型部署成本高、轻量化模型性能不足及数据出域安全等问题,仍然是产业规模化的关键瓶颈。

九章云极的 7B GUI 模型突破为行业提供了“低成本、高性能”的通用人工智能解决方案,有望推动通用人工智能在中小企业及长尾场景的普及。

Vibe Coding 的进化速度,可能还是超乎了我们的想象。

今天,我们在测试 Kimi K2.5 的网页生成功能时,旁边的前端开发同事还以为是真实的网页场景,低声问我:“你这是在写代码吗,还是在摸鱼打游戏?”

直到我说出这是 AI 生成的,而且是只用了几句话就做出来的效果,这让她大为惊讶。

该网页长这样,现在如果不明说的话,确实已经难辨“真假”。

Kimi K2.5 在今天刚刚上新,它没有把重点放在“单项能力突破”上,而是试图把视觉理解、代码生成、交互设计,以及多 Agent 协作,都压进了同一个模型里,一口气提供了四种使用模式。

在笔者看来,其中最有意思的,当属 Agent 集群模式——这也是在国内 AI 上第一次出现的功能,它可以让原本耗时数天的工作,现在仅需十几分钟就能做完,简直是指数级的提效。

比如,要做 100 家公司的市场调研,它能指挥一群不同行业背景的“分析师”分头行动,十几分钟出结果,而不是几个星期;面对 300 页的复杂翻译项目,它能动员一个“语言学专家”团队,快速、准确地完成交付。

四种模式具体如下。不同需求的用户,从随手一问,到需要并行推进的复杂任务,都能找到明确的入口:

  • 快速模式,提供最快的响应体验。

  • 思考模式,可以用来解答复杂问题。

  • Agent 模式,擅长深度研究、PPT、Excel、Word、PDF 和网页生成等任务——目前 K2.5 已经开始掌握 Office 套件的核心技能,其协助办公的能力不容小觑。

  • 重磅全新模式:Agent 集群模式,适合需要并行处理的复杂任务

另外,新编程产品 Kimi Code不仅能直接在终端里运行,还能无缝集成到 VSCode、Cursor、Zed 这些 IDE 里,支持直接输入图片和视频。

月之暗面 CEO 杨植麟,这次亲自为新模型发布录制了视频。

Kimi K2.5 实测

看起来很强是一回事,那用起来是不是另一回事?以下是各种实操案例,InfoQ 也上手测了几组。

几分钟搓出前端网页,能修改细节、还能有声音

为了测试 Kimi K2.5 的视觉理解能力和 Vibe Coding 水平,我们首先直接甩出一张产品页面截图,再配上几句文字描述,看看它能不能自己看懂、自己理解,顺手还能复刻出一个像模像样的产品页面。

比如让 K2.5 做个一个最近很火的心灵疗愈类项目,给的 Prompt 如下:

模仿情绪疗愈类产品,生成一个情绪记录类 APP,适合年轻人释放情绪,让人一眼觉这里允许脆弱的地方。

可以说,这个 Prompt 提示不多,要求不少,对模型视觉理解能力、逻辑思维、产品思维以及设计审美能力都是考验。

从结果看,K2.5 对“情绪”这个概念本身是有一定理解和思考的。它生成的是一个以沉浸体验为核心的情绪页面,而不是常规的情绪记录工具。

视觉上,明显没走浅色卡片流那条老路,而是用了低对比背景、连续画面和节奏型动效(类似呼吸或旋涡),交互重点放在“停留”和“进入状态”上。

在功能组织上,输入、反馈和过渡是连在一起的:用户不是“点一个按钮开始记录”,而是被自然引导进入输入状态——这种设计说明它在生成时已经考虑了状态流转,而不是只输出一个静态页面。

接下来,我们不再给任何视觉参考,只输入文字提示,让 K2.5 独立完成整个网页设计

我们给的 Prompt 很简单:

做一个类似 4399 的小游戏平台,要有完整的游戏分类频道; 但视觉审美要大厂级、高端网游风,整体要酷炫、有冲击力,并且可交互。

结果 Kimi K2.5 没让人失望。

它给出的页面并不是“看起来像网页”的静态效果,而是已经具备明确产品结构的原型。相比以往很多生成结果只停留在大色块 + 随机模块的拼接,它能正确理解“小游戏平台”这一产品类型,在首页层面同时给出清晰的分类入口、内容推荐区和主视觉焦点。

视觉风格上,它没有沿用早期生成工具常见的“低饱和扁平模板”,而是接近成熟网游官网或内容平台的布局逻辑,这一点与一些真实产品如大型游戏平台的信息层级更为接近。

更关键的是,这种效果并非通过多轮细化 Prompt 得到,而是在一次相对抽象的指令下完成,说明模型已经开始具备从“需求描述”直接映射到“产品级页面结构”的能力,而不只是做样式渲染。

类似的例子还有不少。下面这些网页,都是 K2.5 在图像生成工具的辅助下,仅凭一条 Prompt直接生成的完整原型。

除了做整个页面,我们还单独测评了一下 K2.5 对动效的理解能力。

左侧是我们输入的一段小视频,右侧是它生成的效果。结果 K2.5 几乎是完整复刻,拖动鼠标,图片会随之产生位移变化,逻辑和节奏都对得上,动效也足够丝滑。

飞书文档 - 图片

也就是说,K2.5 并不是在“画动效”,而是真的理解了交互在时间维度上的设计意图。

对开发和设计而言,这意味着动效不再从一堆参数和曲线开始,而是可以先把想法直接跑成一个可交互的原型,用几分钟看清值不值得投入工程成本。

以前要干好几天的活,十几分钟就能搞定

至于 K2.5 的 Agent 集群模式,最直观的能力就是:把时间尺度直接拉短了。过去需要“按天算”的复杂任务,现在往往 十几分钟就能跑完一整轮。

来看一个实测例子。

一次性向 Kimi 的 Agent 集群投喂了 40 篇论文,主题横跨心理学与 AI。任务是,在此基础上产出一份系统性的研究综述。

Kimi 的处理流程大致分成了三步:第一步,完整通读。主 agent 多次调用工具,按顺序把 40 篇论文逐篇过了一遍,确保所有关键信息都被纳入同一上下文,而不是零散记忆。

第二步,并行写作。在理解整体结构后,Kimi 自动派生出多个子 agent——可以理解为它的“分身”,分别负责不同章节的撰写,各自并行推进。

第三步,统一收敛。主 agent 最后回到台前,负责校对、取舍和整合,把各个子 agent 的成果汇总成一份长达几十页的专业 PDF 级综述。

整个过程里中,几乎看不到人工干预。

##当 Transformer 开始吃力,K3 可能用上原创架构 KDA

我们先后测评了一整天,总体感受很明确:

Kimi K2.5 在自己擅长的多个方向上,已经跑得相当顺了。比如网页设计生成、动效理解、多 Agent 协作等场景,完成度和稳定性都比较成熟;不过也有短板,比如在 3D 建模这类强几何约束的任务上,表现还欠佳。

当这些能力被一项项跑出来之后,更现实的问题也浮现出来:如果这些复杂推理真的要被当成日常能力反复调用,底层的计算方式还能不能长期扛得住?

月之暗面给出的一个解法,是 Kimi Linear,而 Kimi Linear 中的一个核心创新点,是一个新的实验性架构:KDA(Kimi Delta Attention),一种线性注意力模块的相关思路。

杨植麟此前在 Reddit 上的 AMA(Ask Me Anything)等公开交流中已经透露,下一代 K3 模型,可能会使用月之暗面的这个新架构 KDA。

要讲清楚 KDA 的优势,我们还得先从 Transformer 架构说起。

本质上,Transformer 的注意力机制是全连接的:每个 token 都要和上下文里的其他 token 打一次交道。结果,输入一长,计算量就按平方增长(O(N²));生成新 token 时,还要不断回查之前的 KV Cache。

当上下文一拉长,显存压力迅速飙升,尤其是在 128K 以上的场景里,几乎是“显卡先崩,钱包随后”。

——而且模型越强,这个问题就越明显。

也正因为如此,过去几年里,线性注意力一直是业内反复被拿出来讨论的一条路:把注意力计算从 O(N²) 压到 O(N),让模型跑得更快、也更省。

但现实是,早期不少线性注意力方案确实快了,却很难兼顾记忆能力:信息留不住,推理质量也跟着打折。

而 KDA 核心思想可以概括为一句话:不再每次都“全量算一遍注意力”,而是每次只计算“状态 + 增量(Delta)更新”。

这里的 Delta(增量) 是关键。它在数学上保证了稳定性,即使是在百万级 token 序列中,梯度也不会爆炸或消失。这也让 Kimi Linear 能在超长上下文中跑得稳。

在保持模型能力的同时,还可以显著降低长上下文和连续推理的计算成本——思路有点像 MoE 架构。

##One more thing

在测试 Kimi K2.5 的视觉理解能力时,我们索性出了一道“狠题”。

——甩过去一段动画,让它先吃透画风和叙事方式,再换个主题,重写一支动画脚本。说实话,这活儿对专业动画师都不轻松,我们还特意把 “Agent 集群”模式打开了。

结果最有意思的不是生成内容本身,而是页面最底下那行小字:

“这个任务 Kimi 自己就能完成,不需要 Agent 集群。部分额度已退回。”

体验传送门:https://www.kimi.com/

AI 手纹看相,之前奇伴识图里面一个模块,没想到玩的人这么多,之前有段时间模型不支持下线,最近重构重新上线了,大家可以尝尝鲜

只要拍一张手掌照,AI 就能“读懂”你的一生?

我用奇伴识图,体验了一次 AI 手纹看相

你有没有发现,
很多人都会在不经意间看看自己的手。

  • 生命线长不长
  • 感情线乱不乱
  • 事业线到底有没有

过去想看手相,
要么找师傅,要么翻书,对着示意图研究半天,
最后往往还是一头雾水。

直到最近,我尝试了一种新的方式:
用 AI ,看手纹。


拍一张手掌照,AI 开始分析

整个过程,其实非常简单:

  1. 打开 奇伴识图
  2. 对着手掌拍一张清晰的照片
  3. 上传图片
  4. 等待几秒

系统就会自动识别手掌轮廓、纹路走向、深浅与分布情况。

不需要你懂手相,
也不需要手动标注任何线条。

AI 自己能看懂。

喜欢尝鲜的可以玩玩

序言

入侵排查:简单理解是针对权限维持技术的排查。
权限维持技术:攻击者入侵系统(Getshell)后,为了防止失去权限而通过持久化配置项保持权限的手段,包括注册表、计划任务、后面恶意账户等等。

基本的信息收集

1、收集系统主机的版本,右键此电脑->属性或者win+R->输入winver


会看到操作系统的版本,为什么要收集系统版本呢?因为根据版本就可以找到这个版本下的漏洞,如权限提升漏洞,可以根据提权漏洞的特点进行排查,如特点的日志等。
2、收集操作系统的其他信息,win+R->输入msinfo32

其中重点关注环境变量,另一种查看环境变量的方法是打开命令行输入set


3、关注环境变量的原因:环境变量劫持:我们都知道,命令行执行一条命令其实是执行一个.exe文件,而如果执行的.exe文件对应的命令不在当前目录,就会出现一种优先级,就是操作系统会找环境变量中指定的.exe文件,然后执行,而如果既不在目录,又不在环境变量中,就会提示不是内部命令。这样一来,想象一个场景,如果内部人员告诉你,自己执行ipconfig命令时,没有正常输出内容或者有安全设备提示有恶意外连等等时,你想拿正常的ipconfig.exe程序进行恶意文件分析,但是没有任何问题,就该注意是否有环境变量劫持了。这里简单做个实验,在环境变量中配置木马文件,

执行文件,并未出现正常内容,

并且C2中成功上线,

这里仅仅是简单的举例,这个例子很容易被发现异常,更隐蔽的做法是,也可以通过将正常的文件路径和木马路径绑在一起,效果就是正常程序和木马都运行了,那我们就可能在这一块儿很难发现恶意程序了。
4、网络连接信息收集,主要的命令netstat -ano、ipconfig /all、netstat -rn等等

这里重点关注分析状态为ESTABLISHED的IP地址,也可以借助威胁分析平台。netstat -rn是网络的路由信息

5、进程排查,主要方法是命令tasklist /v,可以看到进程的列表,

也可以在任务管理器->详细信息查看正在运行的进程

还有命令wmic process get * /value,格式化输出

这里比较重要的是CommandLine,它显示的是执行这个程序时所输入的完整命令,比如这个

为什么需要关注这个呢?我们知道,在C2工具生成有效载荷时,会有PowerShell Command,



执行成功后上线,

在通过wmic process get * /value查看,就能发现恶意进程。

这里也可以用条件表达式,直接过滤获取想看的可疑进程。

恶意用户排查

1、恶意用户:使用命令net user可以进行查看用户等等操作,这是添加了一个用户

我们也可以将用户进行隐藏,就是在用户后面加一个$符号,我们发现使用net user查询后并没有发现这个用户的信息,就是被隐藏了

但是这种方法对应其它命令和图形化注销时都能看到,因此这种隐藏用户还是比较鸡肋的。所以一些攻击者就会创建一些特定情况下存在的克隆账户,比如在域环境中存在hrbtgt用户,可能反而不会引起运维人员的关注。
2、排查:命令wmic useraccount get * /value,这个会显示所有用户的详细信息,包括刚刚创建的隐藏用户

另外通过注册表也可以看到用户,包括前面 提到的克隆账户其实就是把注册表中的信息进行调换,但是其实上面这条命令已经可以解决很多问题了。

持久化排查

1、注册表下的RUN子键和RUNONCE(只运行一次)子键开机启动项:

这里的启动项是通过管理员账户进行修改,但是在任意用户用户登录时运行,换句话说就是任意用户触发登录时都会运行,举个例子,重启电脑,进行登录,看会不会有cmd.exe运行

cmd.exe自启动

上面是其中一个目录,在注册表中还有一个其他目录也存在这个子键

那么区别显而易见了,就是前者是所以用户登录时触发,后者是只有当前用户登录时触发。另外,需要说明的是前者在前面说到了,只有管理员权限才能修改写入,普通用户只能修改后面的目录的内容。
2、services.msc服务文件:服务文件比较特殊的一点是它不需要用户登录,那么也就意味着它的可利用性更强,但是,创建服务文件的启动项必须是管理员权限才能创建的,同时当攻击者获取到权限时也会获取到system的权限。

这里配合C2做个示范,在C2工具中,有专门针对服务的程序,正常运行时运行不了,只能配合服务运行

这个命令就是进行服务启动项的命令(sc create 服务名称 binpath= "自启动的程序" start="auto" obj="服务运行时的权限")


就出现这个服务了,可以看到这个服务是没有描述的,除此之外,为了更加隐蔽,攻击者可能会添加其他字段来让这个服务更加隐蔽,这里讲排查,就不深入了

接下来进行服务启动

C2上线,并且权限很高,是system权限

另外重启一下看效果,这里重启就不需要登录,重启后上线

而且未登录

3、gpedit.msc本地组策略启动项:


点开启动->添加->添加恶意程序

这个依旧不需要登录,就可以上线C2
4、计划任务:命令schtasks

创建计划任务可以用命令schtasks /create /tn "计划任务名称" /tr "计划任务的所在位置" /sc minute /mo 1,表示一分钟执行一次

另外,计划任务图形化界面也可以操作

应急响应和基线加固的工具

1、这个有很多,比如说火绒、D盾、windows安全基线核查加固助手

入侵排查

1、如果知道恶意程序的名称,可以直接去注册表搜索,持久化的东西大多数都可以用注册表搜出来,比如前面的服务文件、本地组策略文件和计划任务等等


2、那么如何找到恶意程序的名称呢?比较重要的一点就是确定时间线,我们可以在文件资源管理器中,指定日期或日期范围进行搜索

另外也可以用everything工具进行搜索,这个工具也有特定的语法可以筛选和过滤

总结

对应入侵排查而言,这些仅仅可以解决一下基础的持久化的问题,而还有很多高端的不常见的甚至从未出现过的持久化手段需要更多的深入了解和学习的。

项目介绍

JeecgBoot是一款集成AI应用的,基于BPM流程的低代码平台,旨在帮助开发者快速实现低代码开发和构建、部署个性化的 AI 应用。 前后端分离架构Ant Design&Vue3,SpringBoot,SpringCloud,Mybatis,Shiro,强大的代码生成器让前后端代码一键生成,无需写任何代码! 成套AI大模型功能: AI模型、AI应用、知识库、AI流程编排、AI对话等; 引领AI低代码开发模式, 帮助Java项目解决80%的重复工作,让开发更多关注业务,提高效率,同时又不失灵活性!

发版时间:v3.9.1 | 2026-01-28

源码下载

升级日志

本次升级对 AI 平台进行了全面增强,升级 LangChain4j 至 1.9.1,引入推理模型、多会话与流式调用能力;千问模型支持参数调整与联网搜索,新增 AI 绘画、文生图、图生图和海报生成等多模态能力;AI 应用升级为智能体,支持记忆、变量、插件、流程与 MCP;流程能力新增变量、循环、SQL、定时、知识库写入等节点;AI 聊天支持文件上传、Chat2BI 生成图表。并推出 AI 工具箱,覆盖 AI 海报、AI 简历、AI 写作、AI 生图等场景;
AI 平台升级日志
核心升级
  • LangChain4j 升级至 1.9.1
  • MCP支持http和STDIO命令类型
  • 支持推理模型,深度思考不默认开启
  • 支持流式调用接口
  • 支持多会话模式
  • 支持文件解析
大模型与多模态
  • 千问模型支持参数调整和联网搜索
  • 支持 AI 图片模型(千问 / OpenAPI)
  • 支持文生图、图生图
  • 新增claude、vl模型、千帆大模型及通义千问的支持
AI 应用
  • 新增 AI 应用门户
  • 新增提示词管理
  • AI 应用升级为智能体
  • AI 应用支持记忆、变量、插件、流程、MCP、绘画
  • AI 应用支持卡片内容
AI 流程
  • 新增节点:变量提取节点、变量聚合节点、n8n循环节点、定时触发器、SQL节点、知识库写入节点
  • 支持流程复制
  • 流程可被应用直接调用
AI 聊天与 BI
  • AI 聊天支持上传文件并解析内容
  • Chat2BI 支持 AI 聊天生成图表
  • 支持 MCP 工具调用结果展示
  • 支持卡片式内容回复
Chat2BI(AI生成图表
  • 支持多种图表类型,包括柱状图、折线图、饼图、多列柱状图、多行折线图、折柱图、面积图、雷达图、仪表盘。
  • 支持多数据源查询,在系统里配置的数据源都可以进行图表查询,若不指定数据源,则默认使用系统数据库。
  • 支持自然语言查询,用户可以通过自然语言输入查询需求,智能体会自动解析并生成相应的图表。
  • 支持已知数据生成图表,用户可以直接输入数据,智能体会根据数据生成相应的图表。
AI工具箱
  • AI 简历生成(线 Word)
  • AI 商品搜索助手
  • 新增 AI 绘画和 AI 海报生成
  • AI写作
  • OCR识别
新增应用场景案例
  • 看图说话应用
  • 商品搜索回复应用
  • 帮我写作
  • 图片识别
平台功能升级
  • 新增接口签名校验注解 @SignatureCheck
  • 下拉多选支持字典颜色显示
  • 支持部门简称功能
  • 优化桌面应用中的文件预览功能
  • 推送接口默认集成 Uniapp 手机端消息推送机制
  • 升级积木报表至 v2.3.0
  • 升级积木 BI 大屏至 v2.3.0
Online功能升级
  • 在线表单列表列宽度不能设置么?也不能在表头那里拉宽么? · Issue #9123
  • Online报表查询异常 · Issue #9213
  • Online报表左联SQL运行错误 · Issue #9220
  • 修复Online编辑时long类型字段未赋值导致的报错问题。
  • 解决SQL Server环境下,online报表包含LEFT JOIN查询时异常的兼容性问题。
  • 优化AI账号配置校验,未配置或配置错误时,点击online生成测试数据提示信息更友好。
  • 修正online自定义按钮排序功能,支持清空排序设置。
  • Online表单和列表支持字典颜色显示
  • Online表单支持列表列宽拖动调整,新增默认列宽设置
  • Online表单修复 loaded 方法隐藏字段导致只读字段变可写的问题(issues/9223)
  • Online表单修复一对一子表编辑后详情页不更新的问题
  • SysDataSourceController的queryOptions接口添加权限检查 #9288
Issues修复
  • 租户几个无法加权限的接口,默认加上“加签注解”
  • 【AI】文档库本地上传,如果上传路径写的是相对路径解析会报错
  • 【AI】当前子流程不存在时,打开页面报错,死循环了
  • AI 流程中的http请求节点,超时时间如何设置 · Issue #9118
  • V3.9.0 Oracle11g 数据库 登录提示 无效的列类型: 1111 · Issue #9145
  • 后端代码没提交,租户用户模块保存时报错,检查后发现前端调用的/sys/user/addTenantUser,但是后端没有上传这个函数,麻烦上传下后端代码 · Issue #9158
  • v3.8.3版本存在命令执行漏洞 · Issue #9144
  • 报表编辑界面新增列及查看问题 · Issue #4296
  • AiragLocalCache超时时间如何设置 · Issue #9138
  • JVxeTable中的分页,切换pageSize时,pageChange事件加载了两次 · Issue #9169
  • 地图上只能显示一个数据,能不能做成支持多个数据显示 · Issue #4298
  • 关于聊天页面内容检索后的来源问题 · Issue #8404
  • 单据添加了按钮,用代码生成工具生成的vue文件里面就报这个错,不加就没事。 · Issue #9190
  • 导出异常 · Issue #9173
  • "用于后端字典翻译",同一枚举dictCode,keys传多个也只add第1个DictModel · Issue #9124
  • 【严重安全漏洞】未授权访问+权限绕过导致任意用户可加入任意租户组织;只要是登录用户都可以实现攻击 · Issue #9196
  • ai流程设计流程变量无法取到多个值的问题 · Issue #9159
  • AI MCP 插件没法使用有header 授权的 · Issue #9175
  • ai流程编排流式输出报错 · Issue #9168
  • Ai工作流报错 · Issue #9206
  • 使用useListPage的导出异常 · Issue #9209
  • AI模块知识库存在XXE漏洞 · Issue #9204
  • BasicDrawer结合useDescription,在生产环境中Description未正确渲染 · Issue #9126
  • AI应用接收LLM返回会话已关闭 · Issue #9200
  • jvxetable的数字输入框JVxeTypes.inputNumber没法直接限制最小值、最大值、精度 · Issue #9218
  • mcp服务连接未进行关闭 · Issue #9234
  • 导出格式错误 · Issue #9237
  • 正式环境的redis不支持订阅(SUBSCRIBE)命令 · Issue #9225
  • xxl-job bug · Issue #9189
  • 当配置了pagination: true时,BasicTable组件自适应高度异常 · Issue #9217
  • GitHub · Where software is built](https://github.com/jeecgboot/JeecgBoot/issues/9223)
  • 同步钉钉部门报错 · Issue #9228
  • 在同一个行条件中,同list_multi类型的字段切换,下拉框都是第一个字典的值 · Issue #9263
  • GitHub · Where software is built https://github.com/jeecgboot/JeecgBoot/issues/9186)
  • 流程设计时,工具调用节点的参数配置无法保存参数 · Issue #3 · jeecgboot/jeecg-ai · GitHub
  • 【issues/9282】下拉搜索框设置为自定义数据字典时,生成代码后台报错 #9282
  • 前端问题-用户选择组件 选中回显问题 #9275
  • SysAnnouncementController.downLoadFiles存在潜在的路径遍历漏洞 #9303
  • AIChatHandler.buildImageContents中潜在的路径遍历漏洞 #9302

技术交流

快速启动项目

AI应用平台介绍

JeecgBoot 平台提供了一套完善的AI应用管理系统模块,是一套类似DifyAIGC应用开发平台+知识库问答,是一款基于LLM大语言模型AI应用平台和 RAG 的知识库问答系统。 其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可观察等,让您可以快速从原型到生产,拥有AI服务能力。 详细专题介绍,请点击查看

适用项目

JeecgBoot低代码平台,可以应用在任何J2EE项目的开发中,支持信创国产化。尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)、AI知识库等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。 又是一个全栈式 AI 开发平台,快速帮助企业构建和部署个性化的 AI 应用。

信创兼容说明

  • 操作系统:国产麒麟、银河麒麟等国产系统几乎都是基于 Linux 内核,因此它们具有良好的兼容性。
  • 数据库:达梦、人大金仓、TiDB
  • 中间件:东方通 TongWeb、TongRDS,宝兰德 AppServer、CacheDB, 信创配置文档

为什么选择 JeecgBoot?

开源界"小普元"超越传统商业平台。引领低代码开发模式(OnlineCoding-> 代码生成器 -> 手工MERGE),低代码开发同时又支持灵活编码, 可以帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高开发效率,节省成本,同时又不失灵活性。
  • 1.采用最新主流前后分离框架(Spring Boot + MyBatis + Ant Design4 + Vue3),容易上手;代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发。
  • 2.前端大版本换代,最新版采用 Vue3.0 + TypeScript + Vite6 + Ant Design Vue4 等新技术方案。
  • 3.支持微服务Spring Cloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供简易机制,支持单体和微服务自由切换(这样可以满足各类项目需求)。
  • 4.开发效率高,支持在线建表和AI建表,提供强大代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用。
  • 5.代码生成器提供强大模板机制,支持自定义模板,目前提供四套风格模板(单表两套、树模型一套、一对多三套)。
  • 6.提供强大的报表和大屏可视化工具,支持丰富的数据源连接,能够通过拖拉拽方式快速制作报表、大屏和门户设计;支持多种图表类型:柱形图、折线图、散点图、饼图、环形图、面积图、漏斗图、进度图、仪表盘、雷达图、地图等。
  • 7.低代码能力:在线表单(无需编码,通过在线配置表单,实现表单的增删改查,支持单表、树、一对多、一对一等模型,实现人人皆可编码),在线配置零代码开发、所见即所得支持23种类控件。
  • 8.低代码能力:在线报表、在线图表(无需编码,通过在线配置方式,实现数据报表和图形报表,可以快速抽取数据,减轻开发压力,实现人人皆可编码)。
  • 9.Online支持在线增强开发,提供在线代码编辑器,支持代码高亮、代码提示等功能,支持多种语言(Java、SQL、JavaScript等)。
  • 10.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能,支持访问授权、按钮权限、数据权限等功能。
  • 11.前端UI提供丰富的组件库,支持各种常用组件,如表格、树形控件、下拉框、日期选择器等,满足各种复杂的业务需求 UI组件库文档
  • 12.提供APP配套框架,一份多代码多终端适配,一份代码多终端适配,小程序、H5、安卓、iOS、鸿蒙Next。
  • 13.新版APP框架采用Uniapp、Vue3.0、Vite、Wot-design-uni、TypeScript等最新技术栈,包括二次封装组件、路由拦截、请求拦截等功能。实现了与JeecgBoot完美对接:目前已经实现登录、用户信息、通讯录、公告、移动首页、九宫格、聊天、Online表单、仪表盘等功能,提供了丰富的组件。
  • 14.提供了一套成熟的AI应用平台功能,从AI模型、知识库到AI应用搭建,助力企业快速落地AI服务,加速智能化升级。
  • 15.AI能力:目前JeecgBoot支持AI大模型chatgpt和deepseek,现在最新版默认使用deepseek,速度更快质量更高。目前提供了AI对话助手、AI知识库、AI应用、AI建表、AI报表等功能。
  • 16.提供新行编辑表格JVXETable,轻松满足各种复杂ERP布局,拥有更高的性能、更灵活的扩展、更强大的功能。
  • 17.平台首页风格,提供多种组合模式,支持自定义风格;支持门户设计,支持自定义首页。
  • 18.常用共通封装,各种工具类(定时任务、短信接口、邮件发送、Excel导入导出等),基本满足80%项目需求。
  • 19.简易Excel导入导出,支持单表导出和一对多表模式导出,生成的代码自带导入导出功能。
  • 20.集成智能报表工具,报表打印、图像报表和数据导出非常方便,可极其方便地生成PDF、Excel、Word等报表。
  • 21.采用前后分离技术,页面UI风格精美,针对常用组件做了封装:时间、行表格控件、截取显示控件、报表组件、编辑器等。
  • 22.查询过滤器:查询功能自动生成,后台动态拼SQL追加查询条件;支持多种匹配方式(全匹配/模糊查询/包含查询/不匹配查询)。
  • 23.数据权限(精细化数据权限控制,控制到行级、列表级、表单字段级,实现不同人看不同数据,不同人对同一个页面操作不同字段)。
  • 24.接口安全机制,可细化控制接口授权,非常简便实现不同客户端只看自己数据等控制;也提供了基于AK和SK认证鉴权的OpenAPI功能。
  • 25.活跃的社区支持;近年来,随着网络威胁的日益增加,团队在安全和漏洞管理方面积累了丰富的经验,能够为企业提供全面的安全解决方案。
  • 26.权限控制采用RBAC(Role-Based Access Control,基于角色的访问控制)。
  • 27.页面校验自动生成(必须输入、数字校验、金额校验、时间空间等)。
  • 28.支持SaaS服务模式,提供SaaS多租户架构方案。
  • 29.分布式文件服务,集成MinIO、阿里OSS等优秀的第三方,提供便捷的文件上传与管理,同时也支持本地存储。
  • 30.主流数据库兼容,一套代码完全兼容MySQL、PostgreSQL、Oracle、SQL Server、MariaDB、达梦、人大金仓等主流数据库。
  • 31.集成工作流Flowable,并实现了只需在页面配置流程转向,可极大简化BPM工作流的开发;用BPM的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的Java代码。
  • 32.低代码能力:在线流程设计,采用开源Flowable流程引擎,实现在线画流程、自定义表单、表单挂靠、业务流转。
  • 33.多数据源:极其简易的使用方式,在线配置数据源配置,便捷地从其他数据抓取数据。
  • 34.提供单点登录CAS集成方案,项目中已经提供完善的对接代码。
  • 35.低代码能力:表单设计器,支持用户自定义表单布局,支持单表、一对多表单,支持select、radio、checkbox、textarea、date、popup、列表、宏等控件。
  • 36.专业接口对接机制,统一采用RESTful接口方式,集成Swagger-UI在线接口文档,JWT token安全验证,方便客户端对接。
  • 37.高级组合查询功能,在线配置支持主子表关联查询,可保存查询历史。
  • 38.提供各种系统监控,实时跟踪系统运行情况(监控Redis、Tomcat、JVM、服务器信息、请求追踪、SQL监控)。
  • 39.消息中心(支持短信、邮件、微信推送等);集成WebSocket消息通知机制。
  • 40.支持多语言,提供国际化方案。
  • 41.数据变更记录日志,可记录数据每次变更内容,通过版本对比功能查看历史变化。
  • 42.提供简单易用的打印插件,支持谷歌、火狐、IE11+等各种浏览器。
  • 43.后端采用Maven分模块开发方式;前端支持菜单动态路由。
  • 44.提供丰富的示例代码,涵盖了常用的业务场景,便于学习和参考。

技术架构:

前端
  • 前端环境要求:Node.js要求Node 20+ 版本以上、pnpm 要求9+ 版本以上
  • 依赖管理:node、npm、pnpm
  • 前端IDE建议:IDEA、WebStorm、Vscode
  • 采用 Vue3.0+TypeScript+Vite6+Ant-Design-Vue4等新技术方案,包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能
  • 最新技术栈:Vue3.0 + TypeScript + Vite6 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6
后端
  • IDE建议: IDEA (必须安装lombok插件 )
  • 语言:Java 默认jdk17(支持jdk8、jdk21)
  • 依赖管理:Maven
  • 基础框架:Spring Boot 2.7.18
  • 微服务框架: Spring Cloud Alibaba 2021.0.6.2
  • 持久层框架:MybatisPlus 3.5.3.2
  • 报表工具: JimuReport 1.9.5
  • 安全框架:Apache Shiro 1.13.0,Jwt 4.5.0
  • 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
  • 数据库连接池:阿里巴巴Druid 1.1.24
  • AI大模型:支持 ChatGPT DeepSeek切换
  • 日志打印:logback
  • 缓存:Redis
  • 其他:autopoi, fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。
  • 默认提供MySQL5.7+数据库脚本

微服务架构图

微服务解决方案

微服务方式快速启动

  • 1、服务注册和发现 Nacos
  • 2、统一配置中心 Nacos
  • 3、路由网关 gateway(三种加载方式)
  • 4、分布式 http feign
  • 5、熔断降级限流 Sentinel
  • 6、分布式文件 Minio、阿里OSS
  • 7、统一权限控制 JWT + Shiro
  • 8、服务监控 SpringBootAdmin
  • 9、链路跟踪 Skywalking 参考文档
  • 10、消息中间件 RabbitMQ
  • 11、分布式任务 xxl-job
  • 12、分布式事务 Seata
  • 13、轻量分布式日志 Loki+grafana套件
  • 14、支持 docker-compose、k8s、jenkins
  • 15、CAS 单点登录
  • 16、路由限流

Jeecg Boot 产品功能蓝图

系统功能架构图

开源版功能清单

├─AI应用平台
│  ├─AI模型管理
│  ├─AI应用管理
│  ├─AI知识库
│  ├─AI流程编排
│  ├─AI聊天助手(支持图片、文件)
│  ├─AI聊天助手支持嵌入第三方、支持移动端
│  ├─MCP插件管理
│  ├─提示词管理
│  ├─AI应用门户(汇总各种AI应用场景)
│  ├─支持各种常见模型ChatGPT和DeepSeek、ollama等
├─工具箱
│  ├─OCR识别
│  ├─AI 海报
│  ├─AI 写作
│  ├─AI 简历
├─AI辅助功能
│  ├─AI建表(Online表单)
│  ├─AI生成报表(Online报表)
│  ├─AI生成大屏
├─系统管理
│  ├─用户管理
│  ├─角色管理
│  ├─菜单管理
│  ├─权限设置(支持按钮权限、数据权限)
│  ├─表单权限(控制字段禁用、隐藏)
│  ├─部门管理
│  ├─我的部门(二级管理员)
│  └─字典管理
│  └─分类字典
│  └─系统公告
│  └─职务管理
│  └─通讯录
│  ├─多数据源管理
│  └─多租户管理(租户管理、租户角色、我的租户)
├─Online在线开发(低代码)
│  ├─Online在线表单
│  ├─Online代码生成器
│  ├─Online在线报表
│  ├─仪表盘设计器
│  ├─系统编码规则
│  ├─系统校验规则
├─积木报表设计器
│  ├─打印设计器
│  ├─数据报表设计
│  ├─图形报表设计(支持echart)
├─消息中心
│  ├─消息管理
│  ├─模板管理
├─代码生成器(低代码)
│  ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音)
│  ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择)
│  ├─代码生成器模板(生成代码,自带excel导入导出)
│  ├─查询过滤器(查询逻辑无需编码,系统根据页面配置自动生成)
│  ├─高级查询器(弹窗自动组合查询条件)
│  ├─Excel导入导出工具集成(支持单表,一对多 导入导出)
│  ├─平台移动自适应支持
│  ├─提供新版uniapp3的代码生成器模板
├─系统监控
│  ├─基于AK和SK认证鉴权OpenAPI功能
│  ├─Gateway路由网关
│  ├─性能扫描监控
│  │  ├─监控 Redis
│  │  ├─Tomcat
│  │  ├─jvm
│  │  ├─服务器信息
│  │  ├─请求追踪
│  │  ├─磁盘监控
│  ├─定时任务
│  ├─系统日志
│  ├─消息中心(支持短信、邮件、微信推送等等)
│  ├─数据日志(记录数据快照,可对比快照,查看数据变更情况)
│  ├─系统通知
│  ├─SQL监控
│  ├─swagger-ui(在线接口文档)
│─报表示例
│  ├─曲线图
│  └─饼状图
│  └─柱状图
│  └─折线图
│  └─面积图
│  └─雷达图
│  └─仪表图
│  └─进度条
│  └─排名列表
│  └─等等
│─大屏模板
│  ├─作战指挥中心大屏
│  └─物流服务中心大屏
│─常用示例
│  ├─自定义组件
│  ├─对象存储(对接阿里云)
│  ├─JVXETable示例(各种复杂ERP布局示例)
│  ├─单表模型例子
│  └─一对多模型例子
│  └─打印例子
│  └─一对多TAB例子
│  └─内嵌table例子
│  └─常用选择组件
│  └─异步树table
│  └─接口模拟测试
│  └─表格合计示例
│  └─异步树列表示例
│  └─一对多JEditable
│  └─JEditable组件示例
│  └─图片拖拽排序
│  └─图片翻页
│  └─图片预览
│  └─PDF预览
│  └─分屏功能
│─封装通用组件    
│  ├─行编辑表格JEditableTable
│  └─省略显示组件
│  └─时间控件
│  └─高级查询
│  └─用户选择组件
│  └─报表组件封装
│  └─字典组件
│  └─下拉多选组件
│  └─选人组件
│  └─选部门组件
│  └─通过部门选人组件
│  └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单)
│  └─在线code编辑器
│  └─上传文件组件
│  └─验证码组件
│  └─树列表组件
│  └─表单禁用组件
│  └─等等
│─更多页面模板
│  ├─各种高级表单
│  ├─各种列表效果
│  └─结果页面
│  └─异常页面
│  └─个人页面
├─高级功能
│  ├─提供单点登录CAS集成方案
│  ├─提供APP发布方案
│  ├─集成Websocket消息通知机制
│  ├─支持electron桌面应用打包(支持windows、linux、macOS三大平台)
│  ├─docker容器支持
│  ├─提供移动APP框架及源码(Uniapp3版本)支持H5、小程序、APP、鸿蒙Next
│  ├─提供移动APP低代码设计(Online表单、仪表盘)

系统效果预览

AI模型与应用管理

AI流程编排

MCP和工具管理

AI知识库(支持各种文档格式,尤其markdown适配很好)

AI工具箱

AI聊天助手

AI写文章

PC端

在线聊天&通知

Online开发(在线配置表单和报表)

Online AI建表

图表示例

积木BI大屏

APP效果

PAD端

在线接口文档

积木报表

欢迎吐槽,欢迎star~

近期,我们围绕离线开发产品进行了一系列功能新增与优化,旨在为用户提供更智能、更高效的开发体验 。本次更新重点引入了离线AI“代码续写”功能,显著提升辅助编程效率;同时支持中英文自由切换,满足国际化业务需求 。在架构层面,新增了Doris SQL多计算引擎切换及业务流程跨工作流编排能力 。此外,我们还优化了Restful源端配置、实现了Python日志实时打印并强化了权限管控,全面赋能企业构建稳健的数据基座 。

一、功能新增

1.重点新增内容

1.1.离线AI功能新增「代码续写」功能

在数据开发场景中引入AI辅助编程能力,可根据用户已输入的代码片段,智能预测并生成后续代码内容,提升开发效率。
图片

1.2.离线开发平台支持中英文切换

为满足客户海外业务统一管理需求,产品界面新增中文/英文版本切换功能,完成国际化适配。
图片

1.3.Doris SQL任务支持多计算引擎切换

为提升业务数据管理效能,部分用户选择构建双集群环境,分别用于数据仓库建设与应用数据存储。在实际开发过程中,任务需根据具体的业务场景分发至相应集群执行。为此,离线数据开发相关功能已全面适配多集群架构,其支持范围涵盖以下内容:

  • 离线项目内支持对接控制台内多个 Doris 集群
  • 在 Doris SQL 任务中可以切换集群提交运行
  • 表查询支持查看对接了不同 Doris 集群中表的数据
  • 项目层面支持对不同集群分别绑定数据库账号密码
  • 测试项目任务发布到生产项目,支持配置 Doris 引擎两个项目间的映射关系

图片

图片

1.4.新增业务流程类型,支持跨工作流任务编排

针对跨工作流的任务依赖与全链路管理需求,系统引入“业务流程”单元。它打破了传统单一链路的局限,从业务维度整合多工作流任务,实现跨流编排、依赖管理与统一调度。

核心功能包括:

①任务整合与业务视图将分散在多个工作流中的相关任务统一纳入同一业务流程管理。自动形成可视化的业务链路视图,清晰展示任务间的业务逻辑关系。

②跨流程依赖配置支持任务之间、任务与业务流程之间的灵活依赖配置。可实现跨工作流、跨流程的依赖管理,满足复杂业务链路调度需求。

③调度与运行能力流程下的任务可独立配置调度策略,无需配置根节点即可直接提交。最终以“流程下的单个任务”为调度运行维度,实现灵活高效的执行控制。

④补数据能力支持流程内任务的统一或独立补数操作,确保业务链路数据一致性。
图片

图片

1.5.计算引擎与数据同步支持GaussDB 9.1

新增对GaussDB 9.1计算引擎的支持,涵盖周期任务、语法提示、数据同步等功能;数据同步任务在源端和目标端均可选择GaussDB 9.1作为读写数据源。
图片

1.6.inceptor数据同步支持一键生成目标表

当数据同步任务的目标端为inceptor时,支持一键自动创建目标表结构。
图片

1.7.数据同步向导模式支持Kafka 2.x

数据同步任务的源端与目标端均支持选择Kafka 2.x作为数据源,便于从Kafka进行周期性数据抽取。
图片

图片

1.8.数据地图DQL权限校验强化

优化表数据预览的权限逻辑,用户必须同时具备“表管理-查看”权限以及在数据地图中已申请获得的DQL权限,方可查看数据,确保权限边界清晰。
图片

图片

1.9.Hive表权限管控功能

新增「数据地图外表权限管控」配置功能。该功能在兼容历史客户使用习惯的基础上,提供更严格的数据安全防护。用户可根据实际场景选择是否限制对未纳入数据地图表的操作权限,从而有效防止越权访问和潜在数据风险。
图片

图片

1.10.SparkSQL 3.2支持读写Hudi 0.15.0

在控制台Spark集群内新增DataLake的hudi配置项后,SparkSQL任务支持对 Hudi 表执行完整的 DDL、DML、DQL 操作,用户可像操作 Hive 表一样直接进行 查询、创建、修改与写入,实现统一的 SQL 使用体验
图片

2.其他新增内容

  • 支持DMDB for Oracle计算引擎

新增对DMDB for Oracle计算引擎的支持,涵盖周期任务、整库同步、数据同步、手动任务、临时查询、语法提示、表查询、函数管理、存储过程、依赖推荐、任务上下游参数、代码模板、按项目或个人粒度绑定数据库账号、执行计划、数据导入等功能模块。

  • 支持读写AWS S3数据

离线数据同步任务、Spark任务、PySpark任务、Spark SQL任务及Hive SQL任务全面适配AWS S3存储底座。

  • SparkSQL 3.5计算引擎适配

Spark3.5支持更多特性包括自适应执行、向量化优化,对Paimon湖仓有更好支持。为提升平台性能与兼容性,满足客户在离线计算场景中对SparkSQL的最新特性需求,平台计算引擎SparkSQL3.5进行适配

功能如下:

计算引擎支持对接SparkSQL3.5版本,支持创建任务、周期运行、补数据等操作;SparkSQL3.5支持对Paimon 1.2进行操作,包括DDL、DML、DQL语法

  • Doris 3.x版本适配
    全面支持Doris 3.x作为计算引擎,覆盖周期任务、整库同步、数据同步、手动任务、临时查询、语法提示、表查询、函数管理、依赖推荐、任务上下游参数、代码模板、账号绑定、执行计划等功能。
  • HiveSQL 2.3.8支持读写Paimon 1.2

在构建相应连接jar包后,HiveSQL任务支持对Paimon表执行完整的DDL、DML、DQL操作。

二、功能优化

1.重点功能优化说明

1.1.任务依赖配错提示功能

系统可根据资产平台表血缘关系自动解析生成任务依赖。当用户手动配置的依赖存在多配或少配时,在提交任务时会进行弹窗提示,降低因依赖配置错误导致的运行时故障风险。

图片

1.2.同小时任务依赖逻辑优化

为满足交易类业务对小时级调度链路时效性的高要求,优化依赖匹配规则:支持“优先寻找同小时的上游实例”;若无同小时实例,则自动回退至最近时间的实例。新增“基于默认依赖周期的偏移”和“优先寻找同小时的上游实例”两种依赖方式选项。

适用于 3 类时间间隔场景(参考下方实例依赖图):

任务A与任务B间隔一致:

同小时匹配:B 11:30 → A 11:50;回退匹配:B 10:30 → A 前一天 14:50

任务A间隔小于任务B:

同小时匹配:B 15:30 → A 14:50;回退匹配:B 20:30 → A 16:50

任务A间隔大于任务B:

同小时匹配:B 10:50 → A 10:30;回退匹配:B 12:50 → A 10:30

图片

图片

图片

1.3.同步任务Restful源端配置优化

在数据同步任务配置Restful数据源时,增加Path路径填写项,用户可直接在任务内填写完整URL,简化多接口配置流程。

图片

1.4.脚本日志展示SQL影响行数

任务脚本执行完成后,在日志中明确展示SQL运行的影响行数:对DML语句(如INSERT、UPDATE、DELETE),日志中返回实际影响的行数;对DDL语句(如 TRUNCATE、DROP、ALTER、CREATE),日志中统一返回 -1

图片

1.5.Python on Agent日志实时打印

优化Python任务执行机制,支持在任务运行过程中于页面实时打印输出日志和错误信息,改变此前需等待任务结束后才查看日志的状况。

图片

1.6.告警规则新增“未按计划时间运行”触发条件

在告警规则中新增该触发方式,当任务超过计划时间一定阈值仍未开始运行时,系统自动触发告警,便于及时发现调度阻塞。

图片

1.7.支持配置任务实例默认并发数

新增为补数据任务和手动任务配置“最大并行实例数”默认值的能力,防止因误操作触发大量实例导致集群资源耗尽。

图片

1.8.操作设置页面布局调整

将操作设置中的众多配置项按“数据同步”、“SQL任务”、“调度”、“通用”四大模块进行重新分类展示,提升查找和配置效率。

图片

2.其他功能优化

  • 本地数据导入优化,支持大文件分片上传

针对本地上传大文件时页面卡顿、崩溃的问题,重构代码逻辑,采用分片上传技术,并将单个文件大小上限设置为500MB,提升上传稳定性和用户体验。

  • Sql Parser RPC改造

对Sql Parser进行RPC改造,显著提高解析服务的稳定性,减少因解析导致的IO飙高、进程异常及服务不可用情况。

  • Redis数据写入性能大幅提升

优化数据同步任务中Redis的写入逻辑,在单并发场景下,写入3000万条数据的耗时从超过15分钟缩短至2分钟以内,极大提升了同步效率。

  • 表生命周期统一管理入口

为解决多子产品中生命周期配置不一致可能导致数据误清理的问题,统一通过业务中心SDK维护表生命周期。系统自动判断表是否存在并执行插入或更新操作,确保配置一致性。

  • 函数列表请求方式优化

合并进入“数据开发”页面时对函数目录的重复接口调用,整合为一次性请求,解决因函数过多导致的页面加载缓慢问题。

  • 调用接口redux优化

减少页面打开时的不必要接口请求,优化请求数量,提升页面响应速度。

  • 对接资产数据脱敏规则

实现资产中心配置的Hive、Doris数据源脱敏规则在离线开发平台内同步生效,用户无需在两个产品内重复配置。

  • 知识库同步流程支持并发

优化AI知识库的数据同步流程,支持配置多线程并行同步,显著缩短同步耗时,改善生产环境同步体验。

本次版本 新增函数对象转换能力,扩展了达梦等多数据库迁移适配范围,并提升了批量转换的处理效率,进一步降低企业级数据库迁移的复杂度与成本。

一、核心特性

支持函数对象迁移

函数对象可随存储过程的迁移任务一键同步转换​。该能力的加入,让 SQLShift[1] 从一款“​存储过程迁移工具​”升级为“​核心业务逻辑对象全量迁移工具​”。随之也带来三重提升:

  1. 降低迁移风险与人工成本

    避免 函数对象 需人工逐个改写与反复校验,大幅减少因语法差异、返回值不一致引发的运行期错误。

  2. 提升非表对象整体迁移效率

    函数对象与存储过程 可在同一时间中完成迁移与校验,缩短整体迁移周期。

  3. 保障业务逻辑完整性与可用性

避免 函数对象 缺失导致上层存储过程等对象无法编译或运行的问题,有效降低迁移后集中调试与返工压力,提升割接与上线的稳定性。

函数对象迁移任务

<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=115970207123078&bvid=BV1Gg6LBAEf3&cid=35655845383&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

新增数据库迁移组合

本次升级,SQLShift 扩展了多项数据库迁移组合。

SQLShift 支持迁移链路

  • 新增 Oracle / OceanBase → 达梦

    降低了迁移至达梦数据库的复杂度和人工成本,帮助企业快速完成数据库替换或国产化改造。

  • 新增 PostgreSQL → OceanBase(Oracle 模式)

    减少了跨数据库迁移中的人工调整工作量,加快了从 PostgreSQL 向 OceanBase 的迁移进程。

二、其他更新

批量处理能力提升

支持同时上传多个 SQL 文件进行转换,提升大规模迁移场景下的处理效率。

免费试用限时开放!

👉 点击领取 你的转换额度,立即体验 SQLShift 智能化迁移带来的飞跃效率!

🧩 SQL 方言再多,转换也能一步到位,SQLShift 为你搞定!

SQLShift介绍

已经在虚拟机部署好Apache DolphinScheduler了,想尝试下在Flink新建一个Flink节点,然后用Flink消费Kafka数据。

Apache DolphinScheduler用的是单机部署,具体操作可以参考官方文档:DolphinScheduler | 文档中心(https://dolphinscheduler.apache.org/zh-cn/docs/3.3.2/guide/in...).

  • 前置条件:已经安装Java 11、DolphinScheduler 3.3.2、Flink 1.18.1、Kafka 3.6.0,Zookeeper用Kafka内置的。建议这些安装都下载二进制的安装包到虚拟机安装,用命令安装的不可控,我下载的二进制包如下:

配置好Flink的环境变量

1、编辑环境变量:

sudo vim ~/.bashrc

增加Flink的路径

2、使环境变量生效:

#使环境变量生效
source ~/.bashrc
#查看环境变量
echo $Flink_HOME

修改Kafka、Flink以及DolphinScheduler的配置文件

因为用的是虚拟机,为了让外面的主机能够访问到虚拟机的网络,需要修改下配置文件

  1. 修改Kafka配置:找到Kafka安装包下的config文件夹,修改config下的server.properties文件,修改listeners是为了外面的主机能够访问到虚拟机的Kafka,还有把advertised.listeners改成虚拟机地址,写样例的时候能连上虚拟机的Kafka地址,不然默认连localhost
broker.id=0
listeners=PLAINTEXT://0.0.0.0:9092
#192.168.146.132修改成虚拟机ip
advertised.listeners=PLAINTEXT://192.168.146.132:9092

  1. 修改Flink配置:找到Flink安装包下的conf文件夹,修改conf下的Flink-conf.yaml文件,把里面所有的localhost地址全部改成0.0.0.0,以便主机能访问到虚拟机的Flink。还有增加jobmanager和taskmanager的内存
jobmanager.rpc.address: 0.0.0.0
jobmanager.bind-host: 0.0.0.0
jobmanager.cpu.cores: 1
jobmanager.memory.process.size: 1600m
taskmanager.bind-host: 0.0.0.0
taskmanager.host: 0.0.0.0
taskmanager.memory.process.size: 2048m
taskmanager.cpu.cores: 1

  1. 修改Apache DolphinScheduler的配置文件,从Apache DolphinScheduler的启动脚本文件dolphinscheduler-daemon.sh可以看出,配置环境变量用的是bin/env文件夹下的dolphinscheduler_env.sh

查看dolphinscheduler-daemon.sh文件:

修改dolphinscheduler_env.sh文件,新增JAVA、Flink路径:

#修改成自己的JAVA、Flink路径
export JAVA_HOME=/data/jdk-11.0.29
export Flink_HOME=/data/Flink-1.18.1

关闭防火墙,启动应用

启动应用,包括Zookeeper、Kafka、Flink以及Apache DolphinScheduler。

#关闭防火墙
sudo systemctl stop firewalld
 
# 在 Flink 根目录下,执行以下命令启动 Flink 集群
bin/start-cluster.sh
 
# 启动 ZooKeeper
bin/zookeeper-server-start.sh config/zookeeper.properties &
 
# 启动 Kafka 服务器
bin/Kafka-server-start.sh config/server.properties &
 
#创建 Kafka 主题
bin/Kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
 
#使用命令行生产者发送消息
bin/Kafka-console-producer.sh --topic test --bootstrap-server localhost:9092
 
#消费
bin/Kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092

# 启动 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh start standalone-server

测试

测试Flink、Apache DolphinScheduler是否能访问成功。

  1. Flink访问地址:http://localhost:8081/,localhost改成自己虚拟机地址

  1. Apache DolphinScheduler访问地址:http://localhost:12345/dolphinscheduler/ui ,localhost改成自己虚拟机地址即可登录系统 UI。默认的用户名和密码是 admin/dolphinscheduler123

编写样例

用Flink消费Kafka数据,然后打包上传到Apache DolphinScheduler,启动Flink任务:

  1. 编写样例:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.example</groupId>
    <artifactId>Flink-Kafka-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <Flink.version>1.18.1</Flink.version>
        <scala.binary.version>2.12</scala.binary.version>
        <Kafka.version>3.6.0</Kafka.version>
    </properties>
 
    <dependencies>
        <!-- Flink核心依赖 -->
        <dependency>
            <groupId>org.apache.Flink</groupId>
            <artifactId>Flink-java</artifactId>
            <version>${Flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.Flink</groupId>
            <artifactId>Flink-streaming-java</artifactId>
            <version>${Flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.Flink</groupId>
            <artifactId>Flink-clients</artifactId>
            <version>${Flink.version}</version>
        </dependency>
 
        <!-- 连接器基础依赖 -->
        <dependency>
            <groupId>org.apache.Flink</groupId>
            <artifactId>Flink-connector-base</artifactId>
            <version>${Flink.version}</version>
        </dependency>
 
        <!-- Kafka连接器(关键修改点) -->
        <dependency>
            <groupId>org.apache.Flink</groupId>
            <artifactId>Flink-connector-Kafka</artifactId>
            <version>3.1.0-1.18</version>
        </dependency>
        <dependency>
            <groupId>org.apache.Kafka</groupId>
            <artifactId>Kafka-clients</artifactId>
            <version>${Kafka.version}</version>
        </dependency>
 
        <!-- 日志依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.36</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
 
    <repositories>
        <repository>
            <id>aliyun</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>apache-releases</id>
            <url>https://repository.apache.org/content/repositories/releases/</url>
        </repository>
    </repositories>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>org.apache.Flink:force-shading</exclude>
                                    <exclude>com.google.code.findbugs:jsr305</exclude>
                                    <exclude>org.slf4j:*</exclude>
                                </excludes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

FlinkKafkaConsumerExample.java

import org.apache.Flink.api.common.functions.FlatMapFunction;
import org.apache.Flink.api.java.tuple.Tuple2;
import org.apache.Flink.api.java.utils.ParameterTool;
import org.apache.Flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.Flink.streaming.api.datastream.DataStream;
import org.apache.Flink.streaming.api.functions.ProcessFunction;
import org.apache.Flink.streaming.api.functions.sink.RichSinkFunction;
import org.apache.Flink.util.Collector;
import org.apache.Flink.streaming.connectors.Kafka.FlinkKafkaConsumer;
import org.apache.Flink.api.common.serialization.SimpleStringSchema;
import org.apache.Kafka.clients.consumer.ConsumerConfig;
import org.apache.Kafka.common.serialization.StringDeserializer;
 
import java.util.Properties;
import java.util.concurrent.CompletableFuture;
 
 
public class FlinkKafkaConsumerExample {
    private static volatile int messageCount = 0;
    private static volatile boolean shouldStop = false;
    public static void main(String[] args) throws Exception {
        // 设置执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
 
        // Kafka 配置
        Properties properties = new Properties();
        properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.146.132:9092"); // Kafka broker 地址
        properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); // 消费者组
        properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
 
        // 创建 Kafka 消费者
        FlinkKafkaConsumer<String> KafkaConsumer = new FlinkKafkaConsumer<>("test", new SimpleStringSchema(), properties);
        KafkaConsumer.setStartFromEarliest(); // 从最早的消息开始消费
        DataStream<String> stream = env.addSource(KafkaConsumer);
 
        // 处理数据:分词和计数
        DataStream<Tuple2<String, Integer>> counts = stream
                .flatMap(new Tokenizer())
                .keyBy(value -> value.f0)
                .sum(1);
 
 
        counts.addSink(new RichSinkFunction<Tuple2<String, Integer>>() {
            @Override
            public void invoke(Tuple2<String, Integer> value, Context context) {
                System.out.println(value);
                messageCount++;
 
                // 检查是否达到停止条件
                if (messageCount >= 2 && !shouldStop) {
                    System.out.println("Processed 2 messages, stopping job.");
                    shouldStop = true; // 设置标志位,表示应该停止
                }
            }
        });
 
        // 执行作业并获取 JobClient
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            try {
                // 启动作业并获取 JobClient
                org.apache.Flink.core.execution.JobClient jobClient = env.executeAsync("Flink Kafka WordCount");
                System.out.println("Job ID: " + jobClient.getJobID());
 
                // 监测条件并取消作业
                while (!shouldStop) {
                    Thread.sleep(100); // 每100毫秒检查一次
                }
 
                // 达到停止条件时取消作业
                if (shouldStop) {
                    System.out.println("Cancelling the job...");
                    jobClient.cancel().get(); // 取消作业
                }
 
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
 
        // 在主线程中等待作业结束
        future.join(); // 等待作业完成
    }
 
    // Tokenizer 类用于将输入字符串转化为单词
    public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
            String[] tokens = value.toLowerCase().split("\\W+");
            for (String token : tokens) {
                if (token.length() > 0) {
                    out.collect(new Tuple2<>(token, 1));
                }
            }
        }
    }
 
}
  1. 打包上传到Apache DolphinScheduler

  1. 新建Flink节点,并启动

在Apache DolphinScheduler的任务实例看启动日志:

在虚拟机启动生产者,输出字符串,然后可以在Flink查看输出Kafka生产的消息:

原文链接:https://blog.csdn.net/Analyze_ing/article/details/156940553

前言

作为一名长期深耕于外包公司的前端工程师,我大部分的项目都是使用 Vue2;此前学习的 Vue3React,却始终没有机会在实际项目中落地实践。为了避免陷入颓废、被行业淘汰的困境,我计划着手搭建个人后台管理项目,全程记录使用 Next.js 的搭建流程,同时结合官方文档与 AI 工具,一步步完成项目落地,既巩固技术,也给自己的成长留下印记。

0 开发环境及依赖版本

开发环境

我这边开发环境选的是Node.js + pnpm组合。版本管理工具用的是 Volta,它最方便的地方就是能给不同项目配置不同的Node版本,不用来回切换麻烦。
具体用法很简单,常用命令贴在这:

# 将 Node.js 安装为默认版本,安装最新的 LTS(长期支持)版本的 Node.js。
volta install node

# 安装特定版本
volta install node@16
volta install node@16.14.2

# 特定的 Node.js 版本固定到您的项目
volta pin node@16.14.2

pnpm 的话,直接用 npm install -g pnpm 命令安装就行。

我现在用的 Node.jspnpm都是最新版本,做技术嘛,就得追着最新的来,后续用到的其他技术栈也会保持最新,同时兼顾好兼容性,避免出现版本不匹配的问题。

可以使用 node -vpnpm -v 查看版本号。

因为项目是使用 Next 官方脚手架创建项目,默认给你配置好了最新的、可兼容的版本,其他的依赖直接上新版!咱使用的版本号如下:

依赖版本描述
next16.1.5Next.js 框架
react19.2.3React 核心
react-dom19.2.3React DOM 渲染
typescript^5静态类型检查
eslint^9代码检查
eslint-config-next16.1.5Next.js ESLint 规则
tailwindcss^4原子化 CSS 框架
@tailwindcss/postcss^4Tailwind CSS 编译

1. 初始化项目

1.1 创建项目

这边我使用的 Next.js 官方推荐的 create-next-app

npx create-next-app@latest

安装时,你将看到以下提示

? What is your project named? » my-app # 项目名称
? Would you like to use the recommended Next.js defaults? » - Use arrow-keys. Return to submit. # 推荐的Next.js默认值吗,
>   Yes, use recommended defaults - TypeScript, ESLint, Tailwind CSS, App Router # 是的,使用推荐的默认值-TypeScript、ESLint、Tailwind CSS、App Router
    No, reuse previous settings # 否,重复使用以前的设置
    No, customize settings # 否,自定义设置,我选这个
? Would you like to use TypeScript? » No / Yes # 你想使用TypeScript吗? Yes
? Which linter would you like to use? » - Use arrow-keys. Return to submit.# 你想选择哪种代码检查工具
>   ESLint # 选择主流
    Biome 
    None
? Would you like to use React Compiler?  # 您想使用React编译器吗?
  » No / Yes # Yes
? Would you like to use Tailwind CSS? # 您想使用Tailwind CSS 吗
  » No / Yes # Yes
? Would you like your code inside a `src/` directory? # 你想把代码放在`src/`目录中吗
  » No / Yes # Yes
? Would you like to use App Router? (recommended) 您想使用App Router吗?
  » No / Yes # Yes
? Would you like to customize the import alias (`@/*` by default)? # 是否要自定义导入别名(默认为“@/*”)
  » No / Yes # No

1.2 安装依赖

使用 VScode 打开前面创建的项目 my-app,打开终端,输入 pnpm install 安装项目所需依赖。

1.3 启动项目

查看 package.json 配置文件

{
  ...
  "scripts": {
    "dev": "next dev", // 启动开发环境服务器
    "build": "next build", // 为生产环境构建 / 打包项目
    "start": "next start", // 启动生产环境服务器
    "lint": "eslint" // 运行代码检查工具
  },
  ...
}

启动项目,测试是否运行成功:

  pnpm dev

项目正常启动后,在浏览器中访问http://localhost:3000/

若页面能正常显示,且控制台不报任何异常,则项目创建启动成功。

2. 调整项目结构

2.1 项目文件 / 文件夹作用全解析

my-app/
├─ .next/ # Next.js 开发 / 打包时自动生成的临时缓存目录
├─ node_modules # 项目所有第三方依赖包的存放目录
├─ public/ # 静态资源(图片、favicon)
├─ src/
│  ├─ app/ # App Router 的核心路由目录
│  │  ├─ layout.tsx
│  │  ├─ page.tsx
│  ├─ components/ # 可复用组件(尽量小、可组合)
│  ├─ hooks/ # 自定义 hooks(useAuth, useToast)
│  ├─ lib/ # 数据客户端、工具函数(prisma client, supabase client)
│  ├─ styles/ # globals, tailwind css entry
│  ├─ types/ # 全局类型声明
│  └─ utils/ # 小工具
├─ .env.local # 本地环境变量(不要提交)
├─ next.config.js # Next.js 项目的全局配置文件
├─ postcss.config.js # PostCSS 工具的配置文件
├─ eslint.config.mjs # ESLint 代码检查工具的配置文件
├─ tsconfig.json # TypeScript 配置文件
├─ package.json # 项目核心配置文件
└─ README.md # 项目核心配置文件

2.2 创建测试页面

App Router 是文件系统路由,即「文件 / 文件夹的路径 = 页面的 URL 路径」。我们来创建一个 /test 测试页面:

  1. src/app 目录下,新建一个名为 test 的文件夹。
  2. test 文件夹里,新建一个名为 page.tsx 的文件(这是 App Router 中 “页面文件” 的固定命名)。
  3. page.tsx 中写入测试代码:
// src/app/test/page.tsx
export default function TestPage() {
  return (
    <div style={{ padding: '2rem' }}>
      <h1>这是一个测试页面</h1>
      <p>访问路径:/test</p>
    </div>
  );
}

2.3 配置更多路由

如果你想快速体验多路由,还可以创建:

  • 首页src/app/page.tsx 就是默认的首页(访问路径 /),可以修改这个文件来定制首页内容。
  • 嵌套路由:比如创建 src/app/blog/[id]/page.tsx,就能实现动态路由 /blog/123([id] 是动态参数)。
  • 全局布局src/app/layout.tsx 是全局布局文件,所有页面都会继承这个布局(比如导航栏、页脚可以写在这里,不用每个页面重复写)。

至此,我们完成了项目的初始化和代码重构工作,包括:

  • 用 create-next-app 搭好了基础框架,整理了项目结构
  • 给项目整了个清晰的 src/ 目录结构,把业务代码和配置文件彻底分开
  • 搞定了 Tailwind CSS 和 TypeScript 的基础配置
  • 用 App Router 写了几个测试页面,验证了静态路由和动态路由的基本玩法,确保路由系统没问题
  • 把 package.json 里的脚本命令和依赖都梳理了一遍,确保启动、打包这些核心流程都跑通

END

下一篇文章里,我们来重点对 ESLint + TypeScript 进行配置 —— 主要是 .eslint.config.mjstsconfig.json 这两个核心文件,了解每个配置项的含义和作用。

做好这些配置,能帮项目规避语法错误、提前揪出类型问题,避免后续写业务时踩坑;还能提升代码可读性和可维护性,贴合 Next.js 16 + TS 5.x 的适配需求。

我也是个跟着文档和AI交流一步步摸索的菜鸟,如果你对本文讲的项目初始化、路由这些内容有疑问,或者实操时踩了坑,欢迎在评论区留言。咱们一起交流避坑.

本文由mdnice多平台发布

编者按: 如果你正在为边缘计算、本地部署或资源受限场景寻找高效的语言模型解决方案,你是否曾困惑:在众多小型语言模型(SLM)中,哪一个才是微调的最佳起点?是否真的存在“小而强”的模型,能在微调后媲美甚至超越规模大数十倍的教师模型?

近期,distil labs 团队进行了一项严谨的基准研究,或许能为你提供数据驱动的答案。他们在 8 类任务(涵盖分类、信息抽取、开卷与闭卷问答)上,对 12 个主流小型模型(包括 Qwen3、Llama、Gemma、Granite、SmolLM 等系列)进行了统一微调与评估,并对比了其与 120B 参数教师模型(GPT-OSS-120B)的性能差异。

作者 | Distil Labs

编译 | 岳扬

01 TL;DR

经过微调的小型语言模型(SLM)可以胜过规模大得多的模型:微调后的 Qwen3-4B 在 8 项基准测试中的 7 项上表现能够超越或战平 GPT-OSS-120B(一个比它模型规模大 30 倍的教师模型),剩下的一项差距也不到 3 个百分点。在 SQuAD 2.0 数据集上,微调后的学生模型甚至比教师模型高出 19 分。这意味着你只需极低的成本,就能在自己的硬件上实现前沿模型级别的准确率。

微调后性能最佳的模型:Qwen3 系列模型在微调后始终表现最强,其中 4B 版本整体表现最优。如果你的目标是在特定任务上获得最高准确率,Qwen3-4B 就是你的首选。

最具可微调性(🐟-ble)(微调收益最大):小型模型从微调中获得的提升远超大型模型。 如果你受限于使用非常小的模型(1B–3B),也不必担心 —— 它们能从微调中获益最多,能够大幅缩小与更大模型之间的性能差距。

02 引言

如果你正在构建需要在设备端、本地或边缘侧运行的 AI 应用,你很可能问过自己:我该微调哪个小型语言模型(SLM)?目前 SLM 领域选择众多(Qwen、Llama、Gemma、Granite、SmolLM),每个系列都提供多种模型规模的版本。选错基础模型可能意味着有数周时间在浪费计算资源,或者得到的模型始终无法达到生产质量要求。

我们进行了一项系统的基准测试,用数据来回答这个问题。借助 distil labs 平台,我们在 8 个不同的任务上(分类、信息抽取、开卷问答、闭卷问答)微调了 12 个模型,然后将它们的性能相互比较,并与用于生成合成训练数据的教师大模型进行对比。

本文回答了四个实际问题:

  • 哪个模型在微调后效果最好?
  • 哪个模型最具可微调性?(即微调后提升最大)
  • 哪个模型的基础性能最强?(即未经微调前)
  • 我们表现最好的学生模型,真的能媲美教师模型吗?

03 实验方法

我们评估了以下模型:

  • Qwen3 系列:Qwen3-8B、Qwen3-4B-Instruct-2507、Qwen3-1.7B、Qwen3-0.6B。注意,我们关闭了该系列的“thinking”功能,以保证实验的公平。  
  • Llama 系列:Llama-3.1-8B-Instruct、Llama-3.2-3B-Instruct、Llama-3.2-1B-Instruct  
  • SmolLM2 系列:SmolLM2-1.7B-Instruct、SmolLM2-135M-Instruct  
  • Gemma 系列:gemma-3-1b-it、gemma-3-270m-it  
  • Granite:granite-3.3-8b-instruct  

针对每个模型,我们测量了:

  • Base score:仅使用提示词(prompting)的小样本(few-shot)场景下的性能  
  • Finetuned score:在由我们的教师模型(GPT-OSS 120B)生成的合成数据上微调后的性能  

我们的 8 项基准测试涵盖分类(TREC、Banking77、Ecommerce、Mental Health)、文档理解(docs)以及问答任务(HotpotQA、Roman Empire QA、SQuAD 2.0)。

为了实现公平测量,我们分别计算了每个模型在各个基准测试上的排名,然后计算所有任务上的平均排名,并以 95% 置信区间作为误差棒(error bars)绘制在图中。平均排名越低,表示整体性能越好。

04 问题一:哪个模型在微调后效果最好?

冠军:Qwen3-4B-Instruct-2507(平均排名:2.25)

Qwen3 系列占据了排行榜前列,其中 Qwen3-4B-Instruct-2507 摘得桂冠。值得注意的是,这款 4B 模型的表现甚至超过了更大的 Qwen3-8B,这表明在蒸馏任务中,Qwen3 的较新版本(2025 年 7 月 25 日更新的版本)比之前的 8B SLM 效果更好。

核心结论:如果你希望获得效果最好的微调模型,并且拥有支持约 4B 参数规模模型微调的 GPU 显存,那么 Qwen3-4B-Instruct-2507 是你的首选。

05 问题二:哪个模型最具可微调性?(即微调后提升最大)

冠军: Llama-3.2-1B-Instruct(平均排名:3.44)

这里我们测量的是可微调性(tunability) —— 即从基础性能到微调后性能的提升幅度(finetuned_score - base_score)。一个高度可微调的模型初始表现可能较弱,但经过微调后提升显著。

有趣的是,可微调性排名与模型大小的排序正好相反。像 Llama-3.2-1B 和 Qwen3-0.6B 这样的小型模型,从微调中获得的提升最大。而规模最大的模型(如 Qwen3-8B、granite-3.3-8b)在可微调性排名中接近垫底 —— 这并非因为它们表现差,而是因为它们起点相对较高,进步空间相对有限。

核心结论:如果你受限于使用极小的模型(<2B 参数),不必灰心。这些模型从微调中获益最大,并且能够显著缩小与更大模型之间的性能差距。

06 问题三:哪个模型的基础性能最强?(即未经微调前)

冠军: Qwen3-8B (平均排名: 1.75)

在未经任何微调的情况下,哪个模型开箱即用的表现最好?

正如预期,基础性能与模型大小呈正相关。8B 模型占据了榜首位置,其中 Qwen3-8B 在所有基准测试中都展现出非常稳定的性能(标准差最低)。

核心结论:如果你需要在不进行微调的情况下在零样本/小样本场景下也获得较优的性能,大模型仍是你的最佳选择。但请记住 —— 经过微调后,这种优势会减弱。

07 问题四:我们表现最好的学生模型,真的能媲美教师模型吗?

是的。Qwen3-4B-Instruct-2507 在 8 项基准测试中的 7 项上达到或超越了教师模型。

经过微调的 4B 学生模型在 6 项基准测试上超越了 120B+ 参数的教师模型,在 1 项(HotpotQA)上持平,仅在 1 项(Banking77)上略微落后(差距在误差范围内)。提升最显著的是 SQuAD 2.0 闭卷问答任务,学生模型比教师模型高出 19 个百分点 —— 这充分证明,微调比单纯依赖提示词(prompting)能更有效地将领域知识注入模型。

核心结论:一个经过适当微调的 4B 参数模型,可以媲美甚至超越规模达其 30 倍的模型。这意味着推理成本可降低约 30 倍,并且能够完全在本地部署运行。

08 实用建议

基于我们的基准测试结果,以下是选择基础模型的建议:

09 后续我们将进行的工作

本次基准测试只是一个起点,我们正在积极努力让这些结果更加可靠:

  • 评估更多模型:SLM 领域发展迅速。我们计划在 Qwen3.5、Phi-4 和 Mistral 系列等新模型版本发布后及时纳入评测。
  • 增加运行轮次:目前我们的结果基于有限次数的运行取平均。我们将为每项基准测试增加更多运行轮次,以缩小置信区间,确保排名具有统计可靠性。
  • 扩展基准测试覆盖范围:我们希望纳入更多任务类型,如文本摘要、代码生成和多轮对话,从而更全面地反映模型能力。

10 训练细节

每个模型都在使用我们蒸馏流程生成的合成数据进行微调(有关数据合成过程的详细信息,请参见《Small Expert Agents from 10 Examples》[1])。针对每个基准测试,我们使用教师模型(GPTOss-120B)生成了 10,000 条训练样本。

微调采用 distil labs 的默认配置[2]:训练 4 个 epoch,学习率 5e-5,使用线性学习率调度器,以及 rank 为 64 的 LoRA。

所有模型均使用完全相同的超参数进行训练。评估在训练和合成数据生成过程中均未接触过的预留测试集上进行。

11 结论

并非所有小型模型的性能都差不多,但经过微调后,它们之间的差距会大幅缩小。我们的基准测试表明,Qwen3-4B-Instruct-2507 在整体微调性能上表现最佳,不仅能媲美 120B+ 参数的教师模型,还能在单块消费级 GPU 上部署运行。在资源极度受限的环境中,像 Llama-3.2-1B 这样的小模型展现出卓越的可微调性,能够大幅缩小与大模型的性能差距。

核心结论:微调比基础模型的选择更重要。一个经过良好微调的 1B 模型,可以胜过仅靠提示词(prompting)驱动的 8B 模型。

END

本期互动内容 🍻

❓你在微调小型语言模型时,最看重的是“开箱即用的强基础能力”,还是“微调后巨大的提升空间”?为什么?

文中链接

[1]https://www.distillabs.ai/blog/small-expert-agents-from-10-ex...

[2]https://docs.distillabs.ai/how-to/input-preparation/config

原文链接:

https://www.distillabs.ai/blog/we-benchmarked-12-small-langua...



前几天家附近开了个彩票站 , 在业主群里加了这个彩票站老板的微信 , 心血来潮买了几注双色球 , 结果差两个号就是两千万 , 可惜现在只有 200 , 我现在是该高兴还是悲伤😭

企业环境中广泛用于日志采集与分发的监控解决方案Apache Karaf Decanter被发现存在严重安全漏洞。该漏洞编号为CVE-2026-24656,会使日志套接字收集器遭受 **“不可信数据反序列化”** 攻击,未授权攻击者或可借此导致受影响系统崩溃。
Apache Karaf Decanter 的设计初衷是从日志、Java 管理扩展组件、操作系统指标等多类数据源采集数据,并向管理员告警系统异常。但其中某一特定收集器的入站数据处理机制存在疏漏,为系统受干扰埋下了重大安全隐患。
该漏洞的核心问题出在 Decanter 日志套接字收集器上,该组件会在4560 端口监听日志事件,且该端口默认无身份验证对外开放,即任何能够访问该服务器的主体,均可向该端口发送数据。
漏洞的触发条件为收集器被配置为接收 **“允许的类”**。根据安全公告内容,若该配置属性对外暴露,攻击者可绕过此配置限制
这一绕限操作会直接导致收集器对攻击者发送的不可信数据执行反序列化操作。在 Java 技术体系中,反序列化漏洞向来具有极高的危险性;本漏洞的具体危害为引发拒绝服务(DoS),造成服务崩溃,同时使管理员无法监控到系统的正常事件。
利好的是,该组件并非默认启用。安全报告明确说明:“Decanter 日志套接字收集器并非默认安装组件,未安装该组件的用户不会受到此漏洞影响”
但对于实际使用该功能进行日志集中管理的企业而言,此漏洞的风险真实存在。所有 2.12.0 版本之前的 Apache Karaf Decanter 均受该漏洞影响
Apache 官方已发布漏洞修复补丁,Apache Karaf Decanter 2.12.0 版本已彻底解决该问题,官方强烈建议用户立即升级版本,封堵该攻击途径。
在完成版本升级前,管理员应将 4560 端口的网络访问权限仅开放给可信来源,以此最大限度缩小攻击面。

Descope 对旗下智能体身份中枢(Agentic Identity Hub) 完成功能升级,为 MCP 协议开发者与 AI 智能体开发人员,打造了适配其 AI 系统的标准化身份基础设施。企业如今可通过 Descope,将 AI 智能体与人类用户同等视为一级身份主体进行管理,为内部及外部 MCP 服务器配置 OAuth 2.1 协议与工具级权限范围,同时依托企业级策略管控能力,对智能体访问 MCP 服务器的行为进行合规治理。
2025 年是 AI 智能体迈入主流应用的元年,但身份管理始终是困扰开发团队与安全团队的核心瓶颈。MCP 协议开发者与 AI 智能体开发人员难以满足企业安全团队对产品落地的合规要求 ——Descope 近期针对 400 余名身份领域决策者的调研显示,88% 的企业已在使用或计划使用 AI 智能体,仅有 37% 的企业将其从试点阶段推进至实际落地
与此同时,安全团队也陷入两难:既要为智能体化 AI 应用筑牢安全防线,又不能阻碍技术创新。OWASP 智能体应用十大安全风险中,所有风险的整改方案均涉及身份相关措施,可见为 AI 智能体打造专属的身份认证服务体系,已是行业的迫切需求。
此外,MCP 这类协议的快速普及,也带来了诸多安全漏洞与开发负担 —— 目前已有 2000 台 MCP 服务器处于无安全防护状态;而 MCP 协议规范中要求开发者实现 OAuth 2.1、PKCE、动态客户端注册(DCR)、上下文身份元数据协议(CIMD)等多项功能,也让开发团队的工作压力大幅增加。
Descope 的无代码身份平台,支持企业通过可视化工作流,为客户、合作伙伴、AI 智能体及 MCP 服务器快速创建并调整身份验证流程。目前已有 GoFundMe、Databricks、GoodRx、Navan、You.com等超 1000 家企业选择 Descope,借助其能力优化客户体验、防范账户劫持风险,并实现对客户身份与机器身份的 360 度全维度管理。
本次升级后的 Descope 智能体身份中枢,兼顾开发团队与安全团队的双重需求 —— 为开发人员提供安全易用的身份基础设施,同时帮助安全团队通过策略化治理,实现对 AI 智能体的全生命周期管理。
Descope 智能体身份中枢的核心能力包括:
  1. 智能体身份管理:可集中展示所有接入企业应用、API 及 MCP 服务器的智能体身份(无论动态创建或手动注册)。每个智能体均拥有专属身份标识及配套属性,涵盖关联用户、所属租户、已授权的工具级权限范围、OAuth 客户端 ID 等关键信息。
  2. 全维度 MCP 认证授权:助力 MCP 服务器开发者,为内部及对外提供服务的 MCP 服务器,配置符合协议规范的认证与访问控制能力。企业可实现用户授权流程支持、高安全性动态客户端注册、CIMD 协议适配、智能体级与工具级的精细化授权范围管控,同时为 B2B 场景下的 MCP 应用实现租户级权限隔离。
  3. 凭证保管库:统一管理、存储并自动刷新 AI 智能体访问第三方系统所需的各类凭证(含 OAuth 令牌、API 密钥)。AI 智能体开发人员可从 50 余种预制连接模板中选择使用,并借助动态客户端注册预设配置,让智能体动态对接第三方 MCP 服务器,代表用户安全调用外部 API 接口。
  4. 企业级策略管控:企业可自定义精细化的授权控制策略,明确哪些 AI 智能体可访问 MCP 服务器、可调用哪些工具级权限,并支持基于用户角色、JWT 声明、租户属性、智能体类型等多维度配置策略。
  5. AI 智能体日志审计:为企业提供所有 AI 智能体操作行为的全维度可视能力,可监控智能体的访问对象与访问时间、识别访问控制配置错误、撤销可疑恶意智能体的访问权限,同时将审计事件同步至第三方安全信息与事件管理(SIEM)平台。
Descope 首席执行官斯拉维克・马尔科维奇表示:“AI 智能体正在打破传统的身份管理体系。这类智能体具备自主性、可扩展性,且行为存在非确定性,无法沿用人类用户或服务账户的管理方式。Descope 智能体身份中枢是专为 AI 智能体打造的专属身份认证服务平台,为开发人员提供了所需的抽象层能力,助力其安全地将 AI 系统推向市场,同时确保权限最小化原则的落地与协议合规性的持续满足。感谢首批已采用该中枢的客户,我们也很荣幸能成为企业安全落地 AI 应用所需的核心基础设施之一。”
Descope 客户、WisdomAI 首席执行官索汉・马宗达称:“Descope 智能体身份中枢将我们的开发人员从工具开发与系统集成的工作中解放出来,让他们能将更多精力投入到核心功能的研发与落地中。我们面向客户的 MCP 服务器,正是以 Descope 作为认证层,这一服务器已服务于多家财富 500 强企业。依托 Descope 的能力,我们既能向客户展现 AI 分析平台的价值,也能对内置的身份管控能力充满信心。”
Descope 客户、Cequence Security 首席技术官施雷扬斯・梅塔表示:“Descope 是 Cequence AI 网关的核心底层组件。其对 MCP 认证的灵活支持与开发友好性,为 Cequence AI 网关的客户提供了重要助力,让他们能将自身应用、API 与数据安全地对接至 AI 智能体。”

一款名为Stanley、标价 6000 美元的恶意软件工具包现身俄罗斯网络犯罪论坛,该工具包搭载一款恶意 Chrome 扩展程序,可仿冒整个网站页面,且能让浏览器地址栏保持显示真实域名,开发者还承诺该扩展可通过 Chrome 应用商店的审核。

2026 年 1 月中旬,瓦罗尼斯实验室的研究人员发现了这款工具包,Stanley 的出现,也印证了浏览器恶意软件商业化的趋势正不断加剧。1 月 12 日,一名化名为Стэнли的卖家首次发布该工具包的广告,还附带演示视频,展示其针对币安、美国加密货币交易所等加密货币平台的攻击效果。1 月 21 日,瓦罗尼斯已将该恶意攻击活动上报谷歌及该扩展的托管服务商;次日,相关命令与控制(C2)基础设施被下线,但这款恶意扩展程序仍在 Chrome 应用商店中正常可用。

据瓦罗尼斯实验室披露,2026 年 1 月 12 日 Stanley 在地下网络论坛首次出现,由化名为Стэнли的卖家发布广告。该工具包并非定制开发版本,而是以标准化打包服务的形式售卖,卖家还附带演示视频,展示其对币安、美国加密货币交易所等知名加密货币平台发起的实时攻击过程。该工具包的高级版本支持定制开发,可访问基于网页端的命令与控制(C2)面板,且卖家承诺能将配套的恶意扩展成功上架谷歌应用商店。
这款工具包的核心设计,是将恶意程序伪装成正规的 Chrome 扩展程序。瓦罗尼斯实验室对一款名为Notely的样本扩展进行了分析,该扩展对外宣称是轻量级的笔记记录与书签管理工具。尽管它确实能实现宣传中的基础功能,但这些正常功能仅为伪装,目的是获取浏览器的多项高权限,包括访问所有网址、执行脚本、获取网页导航数据、读取存储文件、发送通知等。其恶意代码会在document_start阶段执行,能在网页的合法内容加载前就获得页面的控制权。

该扩展程序一旦安装,会每 10 秒向其命令与控制基础设施发送一次心跳请求,且并非通过随机生成的标识,而是将受害者的 IP 地址作为唯一识别符。这一设计让攻击者能跨会话追踪用户、开展地域定向攻击,还可选择性触发攻击行为。卖家演示视频中的管理面板显示,攻击者可针对单个受害者配置URL 劫持规则,指定需要拦截的正规网站,以及替换展示的钓鱼页面。

该工具包的核心攻击手段,是在正规网站页面上叠加一个由攻击者控制的全屏 iframe 框架,加载钓鱼内容。关键在于,受害者浏览器的地址栏会始终显示正确的域名(如币安官网binance.com),但用户的所有操作实际都在钓鱼页面上完成。Stanley 还支持调用Chrome 原生推送通知功能,攻击者可通过该渠道发送诱导信息,相比普通网页弹窗,这类通知更具迷惑性。同时,该工具包还配备备用域名轮换机制,即便主命令与控制服务器被下线,恶意程序仍能正常运行。

2026 年 1 月 21 日,瓦罗尼斯实验室已将该恶意基础设施情况上报 Chrome 应用商店及相关托管服务商。尽管主命令与控制服务器在次日被下线,但截至本文撰写时,这款恶意扩展程序仍未被下架,可正常获取。
安全机构建议,用户应定期检查已安装的浏览器扩展程序,卸载闲置的扩展,同时提高警惕,切勿授权请求 “访问所有网站” 等大范围权限的扩展程序


微软已发布紧急安全更新,修复旗下 Office 办公套件中一个已被在野攻击利用的零日漏洞,该漏洞可让攻击者绕过核心安全防护机制。此漏洞编号为CVE-2026-21509,CVSS 评分为 7.8 分,其攻击靶点直指 Office 处理对象链接与嵌入(OLE)控件的核心逻辑。
该漏洞被归类为 **“安全功能绕过” 漏洞 **,这意味着它并非简单导致系统崩溃,而是会悄无声息地打开本应牢牢锁死的安全屏障,具体来说,它能突破 Office 为 **“保护用户免受存在漏洞的 COM/OLE 控件威胁”** 所设置的 OLE 防护措施。
这一漏洞的根源是一个经典的安全缺陷:“在安全决策环节依赖不可信输入”。攻击者向系统注入精心构造的恶意数据,就能诱骗 Microsoft Office 放松安全警戒,使其在本地执行未授权操作。
不过该漏洞的利用存在一个前提条件:它并非那种只需访问恶意网站就会中招的 “路过式攻击”,其用户交互评级为 **“需要用户操作(UI:R)”。要触发漏洞利用,“攻击者必须向用户发送恶意 Office 文件,并诱骗用户打开该文件”**。
这种对社会工程学手段的依赖 —— 钓鱼邮件、虚假下载链接、标注为 “紧急发票” 的附件等,让人为防范成为最后一道安全防线。值得注意的是,通过预览窗格查看文件是安全的,该操作不会触发漏洞攻击。
微软已于2026 年 1 月 26 日发布修复补丁,针对 Microsoft Office 2016 和 Microsoft Office 2019 版本的漏洞问题完成修复。
微软强烈建议用户检查自身 Office 的版本构建号,16.0.10417.20095 及更高版本为安全版本。用户可在任意 Office 应用中,通过点击文件 > 账户 > 关于的路径验证自身版本是否安全。
对于无法立即安装补丁的企业组织,微软提供了一个手动应急禁用方案,管理员可通过修改 Windows 注册表、阻止特定 COM 组件运行的方式,禁用存在漏洞的相关功能。
该临时缓解方案需在 COM 兼容性节点中添加相应注册表项,具体步骤如下:
  1. 定位至注册表路径:*HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Common\COM Compatibility*
  2. 新建一个子项,命名为:{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}
  3. 在该子项中,新建一个 REG_DWORD 类型的键值,命名为Compatibility Flags,并将其十六进制值设为400
尽管该临时方案有效,但手动编辑注册表本身存在一定风险,修复漏洞的最优方式仍是安装官方补丁。微软明确表示:“使用 Microsoft Office 2016 和 2019 版本的用户,应尽快安装该更新,以防范此漏洞带来的安全威胁。”

欧盟已对埃隆・马斯克旗下的 xAI 公司启动正式调查,指控其聊天机器人 Grok 为有害深度伪造内容的制作提供了便利。此次调查考验着欧盟《数字服务法》的监管边界,也标志着生成式人工智能开发者迎来监管严格审查的新时代。
布鲁塞尔消息 —— 欧盟监管机构在整治大型科技企业的行动中开辟了新战线,针对埃隆・马斯克旗下人工智能公司 xAI 启动正式调查,指控其聊天机器人 Grok 被用于生成和传播具有危害性的露骨色情深度伪造内容。这一举措意味着马斯克旗下企业面临的监管审查大幅升级,同时也是欧盟标志性的人工智能法规首次针对美国知名企业展开重大检验。
欧盟委员会于周二宣布启动此次调查,称 xAI 或涉嫌违反《数字服务法》—— 这部综合性法律对网络内容管理作出了全面规定。欧盟官员正调查 xAI 及其与社交平台 X(原推特)的深度全域整合行为,是否未落实充足的防护措施,以防范生成式人工智能带来的系统性风险。本次调查将重点核查,该公司在大范围部署 Grok 前是否开展了恰当的风险评估,其内容审核机制与设计架构是否能有效防范可预见的滥用行为,尤其是非合意合成媒体内容的制作

新数字法规下的常态化审查态势

此次针对 xAI 的调查并非孤立事件,而是布鲁塞尔方面依据《数字服务法》强势执法的一贯举措。该法案将月活跃用户超 4500 万的平台划定为 **“超大型在线平台(VLOPs)”,这类平台需履行最严苛的监管义务。据路透社报道,欧盟委员会早已对 X 平台本身启动正式调查,该调查于 2023 年底宣布,起因是监管机构担忧平台上非法内容与虚假信息的传播。这一持续进行的调查,让马斯克与欧盟官员的关系陷入紧张,后者多次警告,马斯克奉行的“绝对言论自由” 理念 ** 与欧盟的法律框架存在冲突。
对 xAI 的调查,借助了《数字服务法》中对与超大型在线平台深度绑定的服务展开审查的权力。由于 Grok 是 X 平台的付费增值功能,且依托该平台的实时数据运行,监管机构认为,其潜在危害与 X 平台维护安全网络环境的法定义务密不可分。欧盟委员会一名高级官员表示:“生成式人工智能并非法外之地。”“当一款功能强大的模型整合到具有全球影响力的平台时,其提供者必须为该模型引发的系统性风险负责,无论是干预选举,还是滥用合成媒体的恶劣行为,皆需承担相应责任。”

《人工智能法》的阴影持续笼罩

尽管此次调查依据《数字服务法》正式启动,但其开展始终处于欧盟《人工智能法》的阴影之下。尽管该法案的条款仍在分阶段落地,但它是全球首部针对人工智能的综合性法律,将为监管机构赋予更强大的监管工具。据政治新闻网报道,《人工智能法》旨在根据风险等级对人工智能系统进行分类,而 Grok 这类功能强大的通用人工智能模型,需遵守严苛的透明度要求与风险缓解义务。布鲁塞尔方面的许多人士认为,此次调查是未来依据条款更具体、技术要求更严苛的《人工智能法》开展执法行动的前奏。
法律专家表示,欧盟委员会正借助《数字服务法》树立先例,向人工智能开发者释放明确信号:在《人工智能法》全面生效前,他们就必须主动防范相关风险。该法案将强制要求生成式人工智能开发者落实多项举措,包括制定遵守版权法的相关政策、提供模型训练所用数据的详细说明。尤为关键的是,法案还包含人工智能生成内容的标注条款,这一举措直指此次 xAI 调查核心 —— 打击具有欺骗性的深度伪造内容。如今,xAI 对这些即将生效条款的合规情况,将受到细致入微的审查。

Grok 的 “叛逆特质” 沦为致命短板

从诞生之初,Grok 就被定位为一款与众不同的人工智能产品。马斯克曾大肆宣扬其 **“叛逆特质”**,以及它能够解答其他模型避而不答的敏感问题的能力。据美国科技媒体 The Verge 报道,Grok 的设计融入了诙谐的风格与叛逆的精神,其设计灵感源自《银河系漫游指南》。这一设计理念依托于对 X 平台海量且往往未经筛选的信息流的实时访问,而如今,这一点或许成了它最大的短板。监管机构担忧,这种 “特立独行” 的产品定位,加之相对薄弱的内容防护机制,让 Grok 成为极易被恶意利用的工具。
欧盟已正式要求 xAI 提供相关信息,大概率会要求该公司提交与 Grok 的研发、安全测试相关的内部文件,以及能让模型生成高度逼真的有害图像的具体提示词和方法。此次调查的启动,源于网络上的投诉与监督机构的报告激增 —— 这些机构证实,只需简单设计提示词,就能诱导 Grok绕过自身的安全过滤机制。这一现象与行业内的一桩典型事件相呼应:据彭博社报道,美国歌手泰勒・斯威夫特的非合意露骨人工智能生成图像曾在网络上大肆传播,这一事件迫使 X 平台暂时屏蔽了相关关键词的搜索功能。

全行业进入高度警戒状态

此次调查向整个生成式人工智能行业释放了强烈的警示信号,波及范围从谷歌、OpenAI 等行业巨头,到蓬勃发展的开源社区。布鲁塞尔方面明确表示,以 “工具被用户滥用” 为由进行辩护,无法成为免责的理由。相反,欧盟将监管责任归于开发者,要求其设计出默认安全的系统。这种聚焦于架构层面系统性风险的监管思路,与过去被动式的内容审核策略截然不同,也让人工智能开发者彻底成为监管的重点对象。
在人工智能安全问题上持更为谨慎公开立场的 xAI 竞争对手,正密切关注此次调查的进展。调查结果或将为人工智能领域的责任界定树立全球标准,也可能迫使行业企业付出高昂成本,重新评估模型的研发与部署策略。布鲁塞尔的一名科技政策分析师表示:“政策文件中探讨的理论风险,如今已成为企业必须遵守的合规要求,违规则可能面临数亿欧元的罚款,这一刻终于到来了。硅谷的每一家人工智能实验室,此刻都在重新审查自身的风险评估流程。”

后果或不堪设想

依据《数字服务法》,违规企业将面临最高 ** 全球年营业额 6%** 的罚款。对于马斯克旗下相互关联的商业帝国而言,确定此次罚款对应的具体主体与营收基数,可能会引发复杂的法律纠纷。除了经济处罚,欧盟委员会还拥有要求企业采取具约束力整改措施的权力,包括强制 xAI 从根本上重新设计 Grok 的安全功能、限制其对 X 平台实时数据的访问权限,甚至在最坏的情况下,下令在欧盟 27 个成员国暂时暂停该服务
就在 xAI 准备针对欧盟委员会的信息要求作出正式回应之际,布鲁塞尔的监管雄心与硅谷的创新颠覆理念之间的对抗,正走向新的高峰。对 Grok 的此次调查,远不止一次单一的执法行动;它更是一份宣告:在人工智能时代,硅谷长期奉行的 **“快速行动,打破常规”** 的科技信条,最终遇上了强硬的欧洲数字法规这一对手。此次调查的结果,不仅将塑造马斯克最珍视的新晋创业项目 xAI 的未来,更将影响全球人工智能的发展与治理轨迹。