2026年3月

"未来 APP 都会消失" — Elon Musk

大家好,我是 YAN ,一个独立开发者。

自从看到这个说法,一直在想 APP 有什么价值是不可替代的?如果消失了,谁来替代它的功能?替代品长什么样?

想了好几个月,我觉得 APP 会变成另一种东西。

你把任何一个 APP 拆开,其实就三样:一个执行环境,一组能力,一些数据。

美团 = 一个能跑程序的壳 + 点餐配送的功能 + 菜单地址这些数据

微信 = 一个壳 + 聊天支付朋友圈 + 你的社交关系数据

翻译成 AI 语言:

Agent + Skill + Data = APP

  • Agent 是执行者
  • Skill 是它封装好的能力
  • Data 是它的数据资料

这三样凑一起,就等于一个 APP 该有的全部。只是没有界面了。

那没有界面,谁来用?— bot 用。

以前浏览信息,就是刷 APP 和网站。现在有一批人在想方设法地用 OpenClaw 替自己 7x24 小时的刷新闻,做理财,甚至是工作。

这些 Agent 自己判断需要什么能力,自己找到谁能提供,自己调用拿结果。你不知道它中间做了什么。它可能是找到了 API ,也可能是通过 Agent browser 抓到了数据。当然也不在乎它用了什么,只要结果对就行。

我观察到一个有意思的现象。现在很多独立开发者在疯狂给 bot 做各种工具、Skill 、组装 Agent team 。把 bot 打造成一个创业团队,无止境地做事。


我的朋友在 Claude Skill 出现不久后就创建了一个 Skill 市场(skillsmp.com)。两个月后 Skill 火了。他告诉我这个消息后,我很兴奋,我当时在想 AI 时代的 App Store 要出现了吗?!

我们畅聊了很长一段时间,我也想围绕 skill 做些什么。

我注册了 skills.hot 域名,尝试做些东西。但我做着做着就觉得不对劲,总感觉不应该是这样的。

然后一个念头反复在我脑海中出现。

如果我直接打包整个 Agent 作为 APP 呢?如果我在自己最熟悉的环境里调试好后,直接发布呢?

Agent APP = Agent + Skill + Data + Server

然后我抱着这个想法,制作了平台:Agents.hot
并开源了核心 CLI:Agent Mesh

我的思路是,Claude Code + workspace。在这个 workspace 里,放置 CLAUDE.md 、skills 、data 。使用 CLI 指定 workspace 并注册成 Agent 就可以发布了。

底层跑的是 Anthropic 开源的 sandbox-runtime,把 Agent 隔离在 workspace 里。

Agent 发布后,其他人用 CLI 就能发现这个 Agent ,直接 A2A 对话。

我还做了 WebRTC P2P 传输,Agent 产物可以直接点对点传给对方,不经过服务器。


我的 bot 用的是 Minimax M2.5 包月套餐,成本很低。我自己另外用 Codex 和 Claude Code 官方套餐工作。而 bot 根本用不完套餐的 token 。

token 至少对我来说已经不是问题了。Agent APP 功能一旦成熟,就不需要太昂贵的模型。

我观察到越来越多新产品开始主动给 Agent 做入口。优先提供 Skill 、CLI 、API 、专门写给 Agent 阅读的接入文档。AI first 的产品时代特征越来越明显了。

尤其是一人公司和独立开发者。他们非常优秀,一个人可以顶一个创业团队的产出。这批人正在疯狂制造 Agent 生态里的一切。

而 OpenClaw 、Claude Code 就是我们的浏览器和手机。

我觉得 2026 年很快会出现更多面向服务 Agent 的新产品。而它们不一定有 UI ,也许只有一个 CLI 。

我一定不是唯一一个想到这件事的人。

大家有哪些想法?欢迎一起探讨。

项目链接:

情感生活中一定要保持自己的主体性,让心在自
己身上,不要把所有情感都压在对方身上,一旦
对方选择离开难受的一定是自己

一定要有一项爱好,这份爱好最好要爱到废寝忘食

帖子内容可能有些爹味,只是我起伏一个月来的
一些个人经验

1. 前言

在实际的企业信息化交付中,很多开发者依然会使用 Access 作为桌面级应用或者局域网管理系统的快速开发平台。利用 VBA 的强大生态,Access 能够以极低的成本解决中小型企业的核心痛点。

然而,在软件交付或试用阶段,我们经常面临一个棘手的问题:如何保护软件知识产权,防止用户随意拷贝和分发? 通常我们会将 .accdb 文件编译为 .accde.mde 以隐藏核心源码,但这无法阻止物理文件的直接复制。

本文将解析如何在 Access 项目中引入“一机一码”软授权机制。通过提取目标设备的固有硬件指纹,结合哈希密码学算法,实现业务终端与应用授权的强绑定。

2. 技术原理分析

“一机一码”认证模型的核心在于:硬件唯一性、防逆向伪造、轻量级部署。以下是该机制的技术原理:

阶段核心实现与原理
指纹采集使用 WMI(Windows Management Instrumentation)获取主板 CPU ID 及 C 盘卷序列号。增加“计算机名称”以降低同批次同型号硬件可能带来的碰撞率。
混淆加盐在原始特征码中加入动态“盐值(Salt)”,防止懂技术的用户直接推导原始字符串。这部分通过异或运算隐藏在 VBA 数组中。
哈希降维硬件信息组合后的字符串长且无规律,不适合作为机器码让用户手工复制或抄写。通过 DJB2 哈希算法变体,散列为 16 位紧凑格式(XXXX-XXXX-XXXX-XXXX)。
注册生成根据用户提交的 16 位机器码,加入管理员独占的“私有密钥(Secret Key)”,再次进行哈希运算生成配对的注册码。

3. 核心功能实现(附源码)

3.1 获取硬件指纹

在 VBA 中调用系统的 WMI 服务可以轻易获取硬件属性,这是该机制的基础。这里同时采集 CPU ID 与逻辑磁盘 C 盘序列号。

' 获取CPU标识符 (通过WMI)
Private Function GetCPUId() As String
    On Error GoTo ErrHandler
    Dim objWMI As Object, colItems As Object, objItem As Object

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMI.ExecQuery("Select ProcessorId From Win32_Processor")

    For Each objItem In colItems
        GetCPUId = Trim$(objItem.ProcessorId & "")
        If GetCPUId <> "" Then Exit For
    Next

    If GetCPUId = "" Then GetCPUId = "NOCPUID"
    Exit Function

ErrHandler:
    GetCPUId = "NOCPUID"
End Function

3.2 自定义哈希算法压缩长度

标准 MD5 会产出相对较长的文本,这里我们采用变种的轻量级 Hash 算法(类似 DJB2),利用位运算(AndXor),将其压制在 16 位十六进制的范围内。

' 核心哈希函数:将长字符串映射为 0~65535 之间的整型哈希值
Private Function Hash16(ByVal s As String, ByVal seed As Long) As Long
    Dim h As Long
    h = seed And &H7FFF&
    
    Dim i As Long
    For i = 1 To Len(s)
        ' 乘以 33 并加上 ASCII 值,使用 &H7FFFFFFF 防止 VBA 长整型溢出
        h = ((h And &HFFFF&) * 33 + Asc(Mid$(s, i, 1))) And &H7FFFFFFF
    Next i

    Hash16 = h And &HFFFF&
End Function

3.3 机器码与注册码的生成分离

“机器码”是给用户侧界面的,“注册码”是需要管理端工具单独生成的。二者在生成路径上的差异点在于核心加密密钥只存在于计算注册码的时候。

' 获取当前机器的机器码 (4组16进制)
Public Function GetMachineCode() As String
    ' 1. 采集硬件信息
    Dim rawInfo As String
    rawInfo = GetCPUId() & "|" & GetDiskSerial() & "|" & Environ("COMPUTERNAME")
    
    ' 2. 加入盐值防推断
    Dim combined As String
    combined = rawInfo & DecodeSalt()
    
    ' 3. 分段 Hash 映射
    Dim h1 As Long, h2 As Long, h3 As Long, h4 As Long
    h1 = Hash16(combined, &H1A3B)
    '...略

    GetMachineCode = Right$("0000" & Hex$(h1), 4) & "-" & Right$("0000" & Hex$(h2), 4) '...略
End Function

管理端由于持有私钥 DecodeKey(),当拿到机器码之后:

' 根据机器码生成对应防伪注册码
Private Function ComputeRegCode(ByVal mcClean As String) As String
    Dim combined As String
    ' 机器码加上私有密钥,进行不对称 Hash
    combined = mcClean & DecodeKey()

    Dim h1 As Long, h2 As Long, h3 As Long, h4 As Long
    h1 = Hash16(combined, &H5183)
    '...略
    
    ' 产出与该机器唯一匹配的授权识别码
    ComputeRegCode = Right$("0000" & Hex$(h1), 4) & "-" & Right$("0000" & Hex$(h2), 4) '...略
End Function

3.4 完整代码

新建一个通用模块,具体代码如下:

Option Compare Database
Option Explicit


' 获取当前机器的机器码
' 格式: XXXX-XXXX-XXXX-XXXX (十六进制)
Public Function GetMachineCode() As String
    Dim rawInfo As String
    rawInfo = GetCPUId() & "|" & GetDiskSerial() & "|" & Environ("COMPUTERNAME")

    Dim salt As String
    salt = DecodeSalt()

    Dim combined As String
    combined = rawInfo & salt

    Dim h1 As Long, h2 As Long, h3 As Long, h4 As Long
    h1 = Hash16(combined, &H1A3B)
    h2 = Hash16(combined, &H2C4D)
    h3 = Hash16(combined, &H3E5F)
    h4 = Hash16(combined, &H4A71)

    GetMachineCode = Right$("0000" & Hex$(h1), 4) & "-" & _
                     Right$("0000" & Hex$(h2), 4) & "-" & _
                     Right$("0000" & Hex$(h3), 4) & "-" & _
                     Right$("0000" & Hex$(h4), 4)
End Function

' 根据机器码生成注册码
Public Function GenerateRegCode(ByVal machineCode As String) As String
    Dim mcClean As String
    mcClean = Replace(UCase$(Trim$(machineCode)), "-", "")

    If Len(mcClean) <> 16 Then
        GenerateRegCode = "错误:机器码格式不正确,应为16位十六进制字符(XXXX-XXXX-XXXX-XXXX)"
        Exit Function
    End If

    GenerateRegCode = ComputeRegCode(mcClean)
End Function

' ==================== 内部实现 ====================

Private Function ComputeRegCode(ByVal mcClean As String) As String
    Dim combined As String
    combined = mcClean & DecodeKey()

    Dim h1 As Long, h2 As Long, h3 As Long, h4 As Long
    h1 = Hash16(combined, &H5183)
    h2 = Hash16(combined, &H6295)
    h3 = Hash16(combined, &H73A7)
    h4 = Hash16(combined, &H4B9)

    ComputeRegCode = Right$("0000" & Hex$(h1), 4) & "-" & _
                     Right$("0000" & Hex$(h2), 4) & "-" & _
                     Right$("0000" & Hex$(h3), 4) & "-" & _
                     Right$("0000" & Hex$(h4), 4)
End Function

Private Function Hash16(ByVal s As String, ByVal seed As Long) As Long
    Dim h As Long
    h = seed And &H7FFF&

    Dim i As Long
    For i = 1 To Len(s)
        h = ((h And &HFFFF&) * 33 + Asc(Mid$(s, i, 1))) And &H7FFFFFFF
    Next i

    Hash16 = h And &HFFFF&
End Function

Private Function DecodeKey() As String
    Dim b() As Variant
    b = Array(116, 12, 70, 120, 12, 81, 30, 108, 12, 92, 77, 12, 75, 127, 13, 15, 13, 10)
    Dim s As String, i As Long
    For i = 0 To UBound(b)
        s = s & Chr$(CLng(b(i)) Xor &H3F)
    Next i
    DecodeKey = s
End Function

' 解码盐值(运行时混淆)
Private Function DecodeSalt() As String
    Dim b() As Variant
    b = Array(23, 25, 27, 104, 106, 104, 99, 121, 8, 63, 61)
    Dim s As String, i As Long
    For i = 0 To UBound(b)
        s = s & Chr$(CLng(b(i)) Xor &H5A)
    Next i
    DecodeSalt = s
End Function

' 获取CPU标识符 (通过WMI)
Private Function GetCPUId() As String
    On Error GoTo ErrHandler
    Dim objWMI As Object
    Dim colItems As Object
    Dim objItem As Object

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMI.ExecQuery("Select ProcessorId From Win32_Processor")

    For Each objItem In colItems
        GetCPUId = Trim$(objItem.ProcessorId & "")
        If GetCPUId <> "" Then Exit For
    Next

    If GetCPUId = "" Then GetCPUId = "NOCPUID"
    Exit Function

ErrHandler:
    GetCPUId = "NOCPUID"
End Function

' 获取C盘卷序列号 (通过WMI)
Private Function GetDiskSerial() As String
    On Error GoTo ErrHandler
    Dim objWMI As Object
    Dim colItems As Object
    Dim objItem As Object

    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMI.ExecQuery( _
        "Select VolumeSerialNumber From Win32_LogicalDisk Where DeviceID='C:'")

    For Each objItem In colItems
        GetDiskSerial = Trim$(objItem.VolumeSerialNumber & "")
        If GetDiskSerial <> "" Then Exit For
    Next

    If GetDiskSerial = "" Then GetDiskSerial = "NODISK"
    Exit Function

ErrHandler:
    GetDiskSerial = "NODISK"
End Function

3.5 创建窗体

这里创建一个简单的窗体给大家演示一下,具体窗体如下:

窗体的具体代码,就是调用一下函数:

Private Sub btnGenerateRegCode_Click()
    Me.txtGenerateRegCode = GenerateRegCode(Me.txtMachineCode)
End Sub

Private Sub btnMachineCode_Click()
   Me.txtMachineCode = GetMachineCode()
End Sub

3.6 运行测试

这里给大家看一下,运行效果:

4. 业务落地与使用方法

将上述底层方法封装完毕后,你只需要在 Access 中配置入口宏。

  1. 新建 AutoExec 宏,配置 RunCode 行为指向拦截函数 =CheckRegistration()
  2. 在该函数内,判断数据表中是否存在正确的授权记录。
  3. 若未授权,则中断主窗体加载,强行弹起注册窗体
  4. 用户复制屏幕上呈现的机器码发给开发者;开发者在脱机环境调用上述 ComputeRegCode() 函数算出激活码并交付。

5. 进阶内容(静态混淆与反逆向)

任何暴露在客户端的代码都有被逆向的可能,即使是 .accde,VBA P-Code 依然有可能被还原。所以私钥不写明文是基础中的基础。

我们可以运用异或运算(XOR)在内存中动态还原秘钥,提高破解门槛,具体的功能就不再说明了,如果可以,大家可以自行优化。

6. 总结

采用“硬件信息采集 + Hash运算压缩”组合成的这套方案,是给 Access 系统加上商业护城河的一条务实捷径。无需搭建云端激活服务,几段代码就能有效规避 90% 的随意白嫖行为。

如果你正苦于自己辛辛苦苦开发的局域网/单机桌面应用被客户随手 U 盘拷走,不妨把这套机制嵌进你的项目里,花 10 分钟的时间,将纯技术转化成可掌控的生产力。


Access 开发」 专注于 Microsoft Access 开发与企业级应用,提供以下服务:

📚 技术培训

Access VBA 从入门到精通(线上/线下)

Access + SQL Server 企业级开发实战

Access 系统性能优化与架构设计

💼 定制开发

企业 ERP/CRM/进销存等系统开发

旧系统升级与性能优化

🔧 技术支持

代码审查与重构建议

疑难问题远程诊断

一对一技术辅导

联系方式:

公众号后台留言

邮箱:will.miao@edonsoft.com

微信:edonsoft 公众号:access开发

技术改变业务,专注创造价值。


📰 内容说明:本文为 AI 资讯摘要与编辑评论,所有内容均已标注原文链接。如涉及版权问题请联系处理。


今日亮点

OpenAI 和 Anthropic 两大 AI 巨头今天都在加速“基建”和能力扩张:OpenAI 联合多家科技巨头,豪掷千金在德州建设超级数据中心;Anthropic 则通过收购提升 Claude 的计算机使用能力。同时,一个专门为大模型设计的编程语言 Vera 也浮出水面,机器人 AI 的安全性和多模态模型输出的一致性问题也成为学术界关注的焦点。

💡 产品动态

OpenAI 携手巨头加速 AI 基建

核心信息:OpenAI 宣布与 SoftBank、NVIDIA 和 Amazon 合作,共同投资并加速“星际之门”超级数据中心项目,以扩展 AI 基础设施,将 AI 普及给更多人。

💡 编辑观点: 这表明 GPU 和算力仍是当前 AI 发展最核心的瓶颈,头部玩家正不惜一切代价抢占资源。这场基建竞赛的胜负,将直接决定未来谁能提供更强大、更普惠的 AI 模型服务。

📎 查看完整报道 | 来源: OpenAI Twitter

Anthropic 收购 Vercept AI,增强 Claude 电脑使用能力

核心信息:Anthropic 收购了 Vercept AI,旨在提升其大模型 Claude 的计算机使用能力,使其能更好地与外部系统和工具交互。

💡 编辑观点: LLM 成为通用 Agent 的关键一步就是学会“使用电脑”,这笔收购无疑是 Anthropic 在 Agent 能力上的重要布局,有望让 Claude 在复杂任务处理上更进一步,尤其是在自动化和多步骤任务上。

📎 查看完整报道 | 来源: Anthropic Twitter

Anthropic 就与美国国防部的合作及评论发布声明

核心信息:Anthropic 发布声明,回应了与美国国防部的讨论,以及美国国防部长 Pete Hegseth 的相关评论。

💡 编辑观点: 头部 AI 公司与政府、尤其是军事部门的合作一直是敏感话题。Anthropic 此举意在表明其在 AI 伦理和安全方面的立场,试图在技术发展与社会责任之间取得平衡,这对于赢得公众信任至关重要。

📎 查看完整报道 | 来源: Anthropic Twitter

🔬 学术前沿

  • 机器人 VLA 模型面临“后门”攻击风险:研究发现,视觉-语言-动作(VLA)模型可能遭受动作层面的后门攻击,通过微量投毒就能诱导机器人执行未经授权的动作,且不影响正常任务性能,对机器人安全构成威胁。→ 📄 阅读论文

  • SafeGen-LLM:提升机器人任务规划安全性:清华大学提出 SafeGen-LLM,通过两阶段训练框架和形式化验证,显著增强了 LLM 在机器人任务规划中的安全泛化能力,尤其在应对未知安全属性时表现出色。→ 📄 阅读论文

  • 多模态模型文本-图像语义一致性挑战:一项研究揭示,统一多模态大语言模型(U-MLLMs)在文本理解上表现出色,但当需要将相同推理结果以图像形式呈现时,其语义一致性会大幅下降。→ 📄 阅读论文

  • “类人”查询数据集评估 LLM 工具使用:研究者构建了 HumanMCP 数据集,包含大量真实、多样化的用户查询,用于更准确地评估 LLM 在模型上下文协议(MCP)服务器中工具检索和使用的性能。→ 📄 阅读论文

🌍 行业观察

可验证机器学习:在移动设备上实现 ZK-ML 的挑战与机遇

行业对“隐私保护 AI”的需求日益增长,尤其是在移动设备上进行零知识机器学习(ZK-ML)推理,既要证明结果真实性又不能泄露用户数据。但如何在有限的移动硬件资源上高效运行复杂的 ZK 证明系统,是工程层面的一大难题,需要平衡证明时间与设备性能,是未来隐私 AI 普及的关键。

📎 深度报道

💻 开源项目

  • Vera:一个专为大语言模型(LLM)设计的编程语言,旨在帮助 LLM 编写更具一致性和可验证性的代码,通过强制契约和结构化引用,减少模型在生成代码时的错误。→ 🔗 GitHub | 介绍文章

  • Deploybase(⭐ 80+):提供 GPU 和 LLM 在主要云服务商和推理提供商之间的实时价格对比,方便用户查看性能统计、价格历史,并进行侧向比较。→ 🔗 网站

  • Makemyday(⭐ 50+):一个 Mac 上的习惯打卡应用,通过视觉化链条帮助用户坚持每日习惯。作者表示是利用 Claude Code 完成开发。→ 🔗 GitHub

💬 社区热议

  • AI“分身”情结:社区成员讨论为何很多人执着于让 AI 复刻一个自己的“分身”,这是否源于人类的“碳基生物自恋情结”。

  • AI 与电力的关系:有观点指出,只要 AI 最终依赖电力运行,且电网建设和维护需要人,那么 AI 就永远是人类的工具,而非主宰。

https://github.com/xuya227939/full-stack

开源了,我课程的全栈开发框架,一个基于 Next.js 16 + React 19 的全栈项目,包含:

  • Web 前端与 API 路由
  • 用户认证与 Supabase 数据访问
  • Stripe / 支付宝支付链路
  • 邮件发送( Resend )
  • 任务清理脚本
  • Supabase 、r2 存储、Redis 等支持
  • SEO 优化
  • 博客内容
  • 多语言处理
  • 多环境兼容(本地、测试、生产)

可以直接丢给 AI 食用,告诉 AI 。你需要实现的模块和内容,配置一下,即刻。感兴趣的点个 star ,多谢

从GPU争用到高效共享:HAMi如何重塑AI算力调度

当一家科技公司的 AI 训练任务因 GPU 资源不足而排队数日时,另一家采用 HAMi 技术并结合润云平台能力的团队正通过一张 A100 显卡同时运行三个模型实验 —— 这并非资源配置的差异,而是技术架构与算力管理模式的双重代差。

在 AI 模型参数量呈指数级增长、GPU 资源日益紧张的今天,国内众多技术团队正面临一个棘手问题:昂贵的算力资源被低效利用,一张价值数十万的专业显卡常常仅用于轻量推理任务,显存利用率不足 30%。

如何突破这一瓶颈?HAMi 虚拟化技术给出了引人注目的答案,而润云平台这类面向企业级算力管理的平台,也正通过与 HAMi 的协同,让异构算力的调度与共享更贴合企业实际应用场景。

一、行业痛点:当算力成本成为创新枷锁

企业部署 AI 应用的算力困境正变得日益尖锐。一张 NVIDIA A100 80GB 显卡在高峰时段可以跑满,但在大部分时间却处于闲置状态。更糟糕的是,小型 AI 任务占据整张显卡,导致其他任务排队等待,研发效率大幅降低。

传统解决方案如时间共享或容器化部署,要么无法保证隔离性,要么缺乏细粒度资源控制,往往导致 “一损俱损” 的尴尬局面。

硬件异构化趋势加剧了这一挑战。随着国产 AI 芯片的崛起,单一集群中可能同时存在 NVIDIA、华为昇腾、寒武纪等多种加速卡,统一管理与调度变得异常复杂,而这也是润云平台等算力管理工具在实践中需要解决的核心问题之一。

二、HAMi架构:云原生时代的异构算力抽象层

HAMi的设计哲学十分清晰——在不改变用户使用习惯的前提下,实现物理GPU的逻辑切分与硬隔离。这一目标通过精心设计的三层架构实现。

上层是统一的 API 接口和调度策略,中间是负责资源抽象与分配的调度器与设备插件,底层则是面向不同硬件的驱动适配器。这种分层设计使得 HAMi 能够以统一的接口管理各种异构 AI 芯片,也为润云平台这类上层算力管理平台提供了灵活的集成基础,让企业无需重构现有算力管理体系,即可快速接入精细化的 GPU 虚拟化能力。

核心突破在于同时实现显存与计算单元的隔离。早期虚拟化方案往往只能限制显存使用,而 HAMi 通过拦截底层计算 API,能够精确控制每个虚拟 GPU 可以使用的计算核心比例,防止 “吵闹的邻居” 效应。

三、关键特性:超越传统虚拟化的三大突破

与简单的时间切片或容器封装不同,HAMi 提供了企业级虚拟化所需的全套能力,这些能力也能与润云平台的算力调度、资源监控能力形成互补:

  • 显存与算力双重隔离:HAMi支持按绝对值或百分比分配显存,并通过计算单元划分实现算力硬隔离,确保任务间互不干扰
  • 智能策略调度:系统支持多种调度策略,从简单的装箱策略(Binpack)到复杂的拓扑感知调度,确保资源分配的最优化
  • 多硬件平台支持:目前HAMi已支持NVIDIA全系列GPU、华为昇腾910、寒武纪MLU370、沐曦MXN系列等国内外主流AI芯片

HAMi对业界现有方案的突破,集中体现在从“简单共享”到“精细管控”的转变:

特性维度传统Docker GPU方案Kubernetes Device PluginHAMi虚拟化方案
资源粒度整卡分配整卡或厂商自定义粒度可自定义的细粒度切分
隔离性无隔离或仅有显存隔离依赖硬件实现显存+算力双重硬隔离
调度策略简单的节点选择有限的扩展策略丰富的策略化调度
硬件兼容性通常仅支持单一厂商硬件依赖厂商实现统一接口支持多厂商硬件

四、实战场景:从概念验证到生产部署

HAMi 的价值在真实应用场景中得到充分验证,而润云平台也在类似的落地场景中,为企业提供了更贴合业务的算力运营支撑:
一家自动驾驶研发公司利用 HAMi 将 8 卡 GPU 服务器转换为可同时运行 16 个模型训练任务的算力池,结合润云平台的资源监控与弹性伸缩能力,资源利用率从平均 35% 提升至 78%,同时降低了算力运维的人工成本。

在高校 AI 实验室,教授通过 HAMi 将单张 RTX 4090 显卡分割为 4 个虚拟 GPU,供四名学生并行开展不同的研究项目,硬件采购成本降低 75%,而润云平台的轻量化部署能力,也让实验室无需搭建复杂的算力管理架构,即可快速落地这一模式。

云端 AI 服务商面临的挑战更为复杂:需要为不同客户提供不同规格的 GPU 实例。传统方式需要维护多种硬件配置,而基于 HAMi 的统一虚拟化平台,结合润云平台的客户资源隔离与计量能力,能够将同一批物理显卡动态划分为多种规格的虚拟 GPU,快速响应客户需求变化。

五、部署实践:渐进式应用与最佳策略

对于考虑采用 HAMi 的技术团队,建议采用渐进式部署策略。首先在开发测试环境中验证基本功能,然后选择非关键业务进行试点,最后逐步推广至生产环境。这一思路也与润云平台倡导的 “轻量化接入、渐进式落地” 的算力升级理念相契合。

安装部署过程相对直接。通过Helm Chart,管理员可以快速在现有Kubernetes集群中部署HAMi组件:

# 添加HAMi Helm仓库
helm repo add hami-charts https://project-hami.github.io/HAMi/
# 安装HAMi核心组件
helm install hami hami-charts/hami -n kube-system

资源请求方式保持与Kubernetes原生GPU请求一致,降低了使用门槛,也便于与润云平台等现有管理工具无缝衔接::

apiVersion: v1
kind: Pod
metadata:
  name: ai-training-pod
  annotations:
    # 可在此处指定细粒度的调度策略
    hami.io/device-memory: "4096" # 请求4GB显存
spec:
  containers:
  - name: training-container
    image: pytorch/pytorch:latest
    resources:
      limits:
        hami.ai/vgpu: 2 # 请求2个虚拟GPU

六、生态演进:开源社区驱动的技术未来

作为 CNCF 沙箱项目,HAMi 背靠着活跃的开源社区。目前已有超过 360 位贡献者参与项目开发,其中包括来自多家知名科技公司的核心技术团队。

社区路线图显示,HAMi 正在向两个关键方向演进:一是深度集成 Kubernetes 动态资源分配,提供更原生的资源管理体验;二是拓展对更多新型 AI 加速器的支持。而这一演进方向,也与润云平台等算力管理平台追求的 “统一、高效、兼容” 的目标高度契合。

硬件厂商的积极参与是 HAMi 生态的一大亮点。多家国产 AI 芯片厂商已将 HAMi 集成作为标准支持方案,这进一步巩固了 HAMi 作为异构 AI 算力统一接口的地位,也让润云平台等上层工具能够更便捷地对接多元硬件资源,为企业提供更全面的算力解决方案。

做企业金融数据分析这么多年,我们敢说,不少同行在跟踪JMG复牌时,都陷入过“手动盯盘”的内耗——明明想精准捕捉复牌节点、拿到第一手行情数据,却被繁琐的操作拖慢节奏,甚至错过关键信息?
最近我们集中跟进JMG复牌的相关动态,才真正摸清一个核心:复牌对市场节奏的影响,远比我们表面认知的更深刻。停牌可能只持续几天,也可能拉长到数周,但复牌的那一刻,股价的波动几乎瞬间定调,后续的走势很多时候都围绕这个初始反应展开。

但实际工作中,传统跟踪方式的痛点实在太突出:反复刷新财经网页、全程盯守公告推送,不仅浪费大量时间和精力,还经常错过复牌初期的黄金观察窗口;更麻烦的是,手动记录的数据零散杂乱,后续整理、清洗还要额外投入成本,完全不符合我们分析师“高效、精准”的工作逻辑,也和开发者的高效工作习惯相悖。

于是我们开始琢磨:既然接口能实现数据的自动化抓取,能不能用它来同步获取JMG复牌状态和当日行情?既能省去手动记录的冗余步骤,又能形成规范的观察素材,让我们把更多精力放在核心的数据分析上,而不是基础的操作内耗。

一、复牌数据的价值,不止是“恢复交易”那么简单

对我们企业金融数据分析师来说,JMG复牌从来不是单纯的交易状态切换,而是市场对停牌期间所有信息的集中反馈出口。

停牌阶段,股票暂停交易,我们能做的只有被动跟踪消息面,却无法捕捉市场的真实情绪和资金流向;一旦复牌,多空博弈的结果、资金的取舍倾向,都会瞬间体现在股价、成交量这些核心数据上,而这些数据,正是我们开展后续分析、判断市场走向的核心依据。

我们一直和同行交流时说:对分析师而言,及时掌握复牌状态,比单纯盯着实时股价更关键。因为复牌本身就是一个清晰的事件节点,它直接决定了我们下一步的数据分析方向——该重点关注哪些指标、该从哪个角度切入解读市场情绪,都和复牌状态紧密相关。

换个角度看,复牌是极具参考价值的市场样本。通过接口抓取复牌相关数据,不仅能保证信息获取的及时性和稳定性,还能将复牌当天的核心数据系统沉淀下来,形成可长期回溯、可反复复用的观察档案,为后续的策略复盘、标的深度研究提供可靠支撑。

二、接口抓取JMG复牌数据:核心字段+实操示例

跟踪JMG复牌,我们不需要冗余的无效数据,只需锁定三个核心字段,就能满足大部分分析需求:复牌状态、最新成交价、涨跌幅。

对我们这类既要做分析、又要懂基础开发的分析师来说,接口抓取的最大优势的就是“结构化输出”——无需从网页中复制粘贴、手动清洗数据,可直接对接后续的代码处理流程,大幅降低基础操作的时间成本,让我们能将更多精力投入到核心的数据分析工作中。

下面是我们日常实操中用到的Python示例,代码未做任何修改,各位同行可直接参考复用:

import json
import requests

base_url = "https://quote.alltick.co/quote-stock-b-api/trade-tick"
token = "你的_API_Token"

query = {
    "trace": "csdn_jmg_resume",
    "data": {"symbol_list": [{"code": "JMG"}]}
}

query_str = json.dumps(query).replace(' ', '').replace('"', '\\"')
full_url = f"{base_url}?token={token}&query={query_str}"

response = requests.get(full_url)
if response.status_code != 200:
    print("网络请求失败:", response.status_code)
else:
    result = response.json()
    statuses = result.get("data", [])
    if statuses:
        status_info = statuses[0]
        if status_info.get("status") == "resumed":
            print("jmg 已复牌,当前价格:", status_info.get("price"))
        else:
            print("jmg 尚未复牌")

三、复牌当日数据观察:关键窗口+容错技巧
结合多年实操经验,我们总结出一个规律:复牌后的首个交易小时,是市场情绪最集中的释放窗口。这段时间的股价波动、成交量变化,能最直观地反映市场对JMG复牌的态度,也是我们开展实时分析的核心关键。

借助接口抓取到的结构化数据,我们可以快速开展各类统计分析:对比开盘价与前收盘价的偏离幅度,判断市场的初始反应;分析涨跌幅的分布区间,解读多空力量的强弱;观察成交量的异动情况,捕捉资金流向;甚至可以通过绘制折线图,直观呈现股价波动趋势,让分析更具针对性和说服力。

不过在实操过程中,我们也踩过不少坑——接口偶尔会出现核心字段缺失的情况,若没有提前做好应对,很容易导致分析脚本中断,错过关键的数据分析时间。为此,我们在实践中总结出了一套容错逻辑,能有效规避此类问题,保证脚本长期稳定运行:

price = status_info.get("price")
change = status_info.get("change_percent")

if price is None or change is None:
    print("部分数据缺失,需要关注接口返回")
else:
    print(f"复牌首价: {price}, 涨跌幅: {change}")

这套简单的容错逻辑,能有效提升脚本的鲁棒性,即便接口偶尔出现小异常,也不会导致整个分析流程中断,非常适合长期自动化跟踪JMG复牌数据,尤其适合我们这类兼顾分析与基础开发的从业者。

四、复牌数据沉淀:从“零散记录”到“体系化笔记”

跟踪JMG复牌的这段经历,让我们对复牌的认知有了很大提升:它不仅是交易的重启,更是一个极具价值的市场信号,而接口抓取,正是将这个信号转化为有效分析素材的关键手段。

通过接口抓取数据,我们不仅能精准捕捉JMG的复牌时点,还能同步获取股价、成交量等核心指标,将复牌当天的所有关键数据,整理成结构化的市场观察笔记。长期积累下来,我们能清晰总结出复牌前后的市场情绪规律、资金流动特点,这些沉淀下来的素材,不管是用于标的研究、策略优化,还是风险预判,都能发挥重要作用。

相较于传统的手动刷新网页、零散记录数据的方式,将复牌状态与行情数据整合在同一个数据流中观察,不仅更高效、更规范,也更符合我们企业金融分析师+开发者的工作习惯——摆脱繁琐的基础操作,把更多精力放在核心的数据分析上,才能做出更精准的判断。

五、跟踪复牌数据的3个实用小习惯,高效不踩坑

结合长期的实操经验,我们总结了3个简单易执行的小习惯,分享给各位同行,帮助大家更高效地跟踪JMG复牌数据,少走弯路、避免内耗:

  1. 每日复盘前,优先检查JMG的停牌/复牌状态,提前锁定关键分析节点,避免错过核心数据;
  2. 复牌当天,第一时间抓取开盘价、涨跌幅等核心指标,做好数据快照,为当日的分析工作打好基础;
  3. 遇到数据缺失或接口异常时,及时打印日志、留存数据现场,方便后续定位问题、补充数据,保障分析工作的连续性。

这些操作看似简单,但能让我们对JMG复牌信息始终保持掌控感,让市场观察从“凭经验”转变为“靠数据”,也让我们的分析工作更有章法、更高效,尤其适合长期跟踪核心标的。

最后总结

对企业金融数据分析师而言,及时、稳定、结构化的数据,是做好分析工作的基础。跟踪JMG复牌这类核心标的,手动盯盘不仅效率低下、易出错,还会消耗大量的时间和精力,而通过接口实现数据抓取的自动化,能有效解决这些痛点,让我们聚焦核心分析工作,想要实现这一目标,不妨试试Alltick API。

对于刚接触代理技术的用户来说,“Socks5”这个词几乎一定会遇到。无论是跨境电商、数据采集、账号管理,还是普通网络加速场景,Socks5 代理都被频繁提及。但很多人只是听说过,却并不真正理解它的原理、优势以及适用场景。这篇文章,会从基础概念讲起,带你系统了解 Socks5 代理到底是什么,以及它适合哪些场景使用。

什么是 Socks5 代理?

Socks5 是一种网络代理协议,全称是 “Socket Secure version 5”。它工作在传输层,可以在客户端与目标服务器之间建立一个中转通道。简单来说,当你通过 Socks5 代理访问网站时,请求不会直接从你的本地网络发送出去,而是先发送到代理服务器,再由代理服务器转发到目标网站。网站看到的访问来源,是代理服务器的 IP,而不是你的真实 IP。
与常见的 HTTP 代理不同,Socks5 不解析数据内容,它只是负责转发数据包。因此,它的兼容性更强,可以支持多种协议,包括 HTTP、HTTPS、FTP,甚至部分游戏或点对点应用。

Socks5 与 HTTP 代理的核心区别

很多新手容易把 Socks5 和 HTTP 代理混为一谈。HTTP 代理主要针对网页访问场景,会对数据进行解析和处理。而 Socks5 更偏底层转发,不参与内容解析,只负责建立稳定的通道。
正因为它不干预数据内容,Socks5 的速度通常更稳定,延迟更低,也更适合需要高并发或复杂协议支持的应用场景。
如果你的业务不仅仅是浏览网页,而是涉及软件运行、自动化工具或跨境电商后台操作,Socks5 往往更灵活。

Socks5 的主要优势

首先是兼容性强。由于工作在更底层的网络协议层,Socks5 可以支持更多类型的流量,而不仅限于浏览器请求。其次是匿名性较好。Socks5 不会在请求头中附带额外信息,因此在某些场景下比普通 HTTP 代理更隐蔽。再次是稳定性高。因为它不做复杂数据解析,代理服务器负载相对更可控,在高频请求环境下表现更稳定。当然,前提是你使用的是高质量代理资源。如果底层 IP 本身质量不高,再好的协议也无法保证效果。

Socks5 可以搭配哪些 IP 类型?

需要特别说明的是,Socks5 是一种协议,而不是 IP 类型。
很多人误以为“Socks5 就等于某种特殊代理”,实际上你可以用不同类型的 IP 资源来搭配 Socks5 协议。
例如:
当 Socks5 搭配数据中心 IP 时,成本低、速度快,但更容易被识别。
当 Socks5 搭配住宅 IP 时,匿名性与可信度更高,更适合电商账号运营或数据抓取。
像 IPPeak 提供的住宅代理网络,就支持 Socks5 协议接入。在需要高匿名与高稳定性的场景中,住宅 IP 与 Socks5 协议结合,可以兼顾兼容性与环境真实性。
理解这一点很重要:协议决定连接方式,IP 类型决定可信度。

Socks5 常见应用场景

在跨境电商领域,Socks5 常被用于后台登录环境隔离。通过独立 IP 与代理通道,可以避免多个账号共用同一网络出口带来的风险。
在数据采集领域,由于 Socks5 支持多种协议,适合自动化工具接入。
在广告验证、SEO 监测或社媒运营场景中,Socks5 也常被作为技术实现方式。
但需要强调的是,协议本身不等于安全。真正影响账号稳定性的,是 IP 质量与环境一致性。

新手使用 Socks5 时要注意什么?

首先要确认代理类型是否符合你的业务需求。仅仅选择“Socks5”并不意味着更安全,关键在于 IP 来源。
其次要注意 IP 是否稳定。如果频繁更换 IP,或者 IP 历史信誉较差,反而可能提高风控风险。
最后要结合实际场景测试。不同平台的风控机制不同,稳定性需要通过实际运行验证。

结语:理解协议本质,才能选对方案

Socks5 不是“更高级的代理”,而是一种更通用的代理协议。
它的优势在于兼容性与稳定性,但真正决定效果的,是底层 IP 资源。
如果你只是临时使用,普通代理可能已经足够。但如果涉及长期账号运营或数据系统搭建,建议结合高质量住宅 IP 使用。

核心需求

向量检索

  1. 原生支持向量检索
  2. 向量检索可能会跨索引,如分别在不同的索引(表)中检索,是否有一次调用执行全部检索的
  3. 多向量检索,如输入向量有多个,一次调用分别根据每个向量进行检索然后返回聚合后的检索结果

文档检索

  1. Lucene
  2. 支持分词
  3. 原生或插件支持关联检索,类似于 mysql 的 join 。如 es 可通过 Siren Federate 插件实现

编程语言

python

问题

  1. 目前是否有数据库能够同时支持上述需求?
  2. 不能同时满足需求的情况下如何选择?

在企业数字化的今天,Excel 依然是不可撼动的数据处理核心。然而,在传统的业务场景中,我们经常见到这样的画面:一份财务报表在群聊里反复传输,文件名从“结算单.xlsx”演变成“结算单_最终版_张三改_真的最后版.xlsx”;多人共同汇总数据时,必须排队等待,因为“文件正被他人占用”。

这种“文件传阅”式的协作模式,本质上是单机时代的产物。它带来的不仅是效率的低下,更是数据更新延迟、权限冲突以及变更无法追踪等一系列可能引发致命错误的安全隐患。

随着 SpreadJS V19 版本的发布,其协同插件(Collaboration Add-on)通过一套成熟的、专为企业级应用设计的协同框架,彻底打破了这一僵局。本文将作为系列文章的第一篇,带你深度走进 SpreadJS 协同功能的核心,探讨它如何助力企业实现真正的多人实时在线协同。

一、 企业级协作的“三大深坑”

在构建 Web 版 Excel 协作系统时,开发者往往会面临三个核心技术挑战:

  1. 数据一致性(Consistency): 当 A 用户在修改单元格 A1 的公式,B 用户同时删除了包含 A1 的行时,系统如何确保两边看到的数据最终是一致的?
  2. 实时性与性能(Real-time & Performance): 在处理万行以上的巨型表格时,频繁的 WebSocket 通信是否会卡顿?如何平衡“改哪同步哪”与“全量刷新”?
  3. 协作感(User Presence): 协同不是简单的后台数据同步,用户需要知道“谁正在跟我一起改”、“他在改哪里”,否则极易发生业务逻辑上的碰撞。

SpreadJS 协同插件正是为了填平这些“坑”而诞生的。

二、 SpreadJS 协同框架:支撑实时协作的技术基石

SpreadJS 的协同功能并非一个简单的接口,而是一个分层明确、高度解耦的技术框架。它由三个核心模块组成,共同构建了从底层通信到上层 UI 呈现的完整链路。

image.png

1.js-collaboration:核心通信枢纽

这是整个协作系统的“交通指挥官”。它基于 WebSocket 协议,负责客户端与服务器之间的双向数据同步和消息广播。

  • 房间管理: 它支持将用户隔离在不同的“房间(Room)”中。例如,财务部的协同环境与销售部互不干扰,每个房间代表一个独立的同步上下文。
  • 自动重连与心跳: 针对企业网络环境可能存在的不稳定性,它内置了心跳检测和断开后的自动重连功能,确保协作不因瞬时掉线而中断。

2.js-collaboration-ot:文档同步逻辑与冲突处理

如果说 js-collaboration 负责传消息,那么 js-collaboration-ot 则负责消息的“含义”。它引入了操作转换(OT, Operational Transformation)技术。

  • 意图同步: 它不只是同步结果,而是同步用户的操作意图(Op)。
  • 数据库适配: 该模块包含了标准化数据库适配器(支持 PostgreSQL, SQLite3 等),允许开发者轻松实现协作数据的持久化存储,解决“协同结束后数据去哪了”的问题。

3.js-collaboration-presence:实时用户状态共享

协同的精髓在于“人在现场”。此模块负责处理协作中的非业务数据:

  • 光标定位: 实时显示其他用户当前选中的单元格。
  • 文本高亮: 当其他用户正在编辑某个区域时,该区域会以特定颜色高亮显示,并附带用户名标识。

三、 核心工作机制:从 Op 到 ChangeSet 的艺术

在 SpreadJS 协同中,数据的同步并非粗暴地传输整个 JSON 结构,而是基于“操作(Op)”和“变更集(ChangeSet)”的精妙设计。

1.操作(Op)的原子化

每当用户在 SpreadJS 中进行一次修改(如设置值 setValue、添加行 addRows、调整缩放 updateZoom),系统都会将其记录为一个原子化的 Op。

2.变更集(ChangeSet)的封装

SpreadJS 提供了两种同步模式:

  • 单步模式(Single Mode): 每一个命令直接生成一个 ChangeSet 发送,适用于即时性要求极高的简单操作。
  • 批处理模式(Batch Mode): 这是企业开发中最推荐的模式。通过 startBatchOp()endBatchOp(),开发者可以将一系列同步操作(如初始化报表时的批量配置、迭代式数据插入)封装进一个原子性的 ChangeSet 中。

价值体现:

  • 性能优化: 减少了 WebSocket 的往返次数和服务器负载。
  • 事务性: 确保一组操作要么全部应用成功,要么全部不应用,避免出现文档状态“半生不熟”的尴尬。

四、 架构设计:客户端与服务器的完美配合

SpreadJS 的协同架构遵循标准的“客户端-服务器”模式。

image.png

  • 客户端(Client): SpreadJS 宿主工作簿通过 spread-sheets-collaboration-addon 插件监听底层数据模型的变化。当变更发生时,它生成 Op 并组装成 ChangeSet,通过协同客户端接口推送到服务器。同时,它也负责接收来自服务器的远程操作,并将其平滑地应用到本地视图中。
  • 服务器(Server):js-collaboration 构建的协同服务器不包含具体业务逻辑,它充当事件调度器的角色。它通过中间件(Middleware)校验用户权限,通过钩子(Hooks)拦截关键事件,并最终利用 OT 算法协调不同客户端提交的变更,确保全局唯一真值的产生。

五、 为何 SpreadJS 协同是企业级的首选?

市面上有很多协作工具,但 SpreadJS 协同插件在企业级应用中具备独特的优势:

1.深度集成 SpreadJS 专业能力

不同于普通的协作文档,SpreadJS 协同完整支持 Excel 的高级特性。无论是复杂的跨表引用公式、切片器(Slicer)、透视表(PivotTable),还是自定义单元格类型,都在协同的覆盖范围内。

2.细粒度的权限管控(BrowsingMode)

企业场景下,“全员可改”是灾难。SpreadJS 允许为不同用户分配:

  • 编辑模式: 拥有无限制的编辑权限,操作实时同步。
  • 查看模式: 仅能查看,但可以配置特定的本地操作(如允许本地筛选、排序、隐藏行),这些 UI 变动不会同步给他人,确保了个人分析与团队协作的平衡。

3.完善的版本追溯与回滚

基于 js-collaboration-ot 的历史记录管理功能,开发者可以轻松实现类似 Git 的版本回溯。利用 getOps 接口,可以查看任何时间点的操作历史;利用 fetchHistorySnapshot 接口,可以随时预览甚至恢复到之前的特定版本。

4.可定制化的协同逻辑

SpreadJS 提供了极其丰富的 API(如 on('connect'), on('message')),开发者可以在协同过程中插入自己的业务逻辑。比如:在用户提交特定敏感数据前,通过服务器中间件进行拦截审计。

六、 结语:协作效率的新起点

多人实时在线协同不再是大型云厂商的专利。通过 SpreadJS 协同插件,每一家企业都可以将专业的 Excel 处理能力与高效的实时协作完美融合,构建出属于自己的“高性能协作中台”。

告别“文件传阅”带来的版本混乱,拥抱“所见即所得”的团队效率。

在下一篇文章中,我们将进一步深入技术底层,为你解析 OT(操作转换)算法 的奥秘:SpreadJS 究竟是如何在毫秒级处理成百上千人的编辑冲突,并保证数据绝对一致的?敬请期待。

扩展链接

可嵌入您系统的在线Excel

满屏推广 AI 的,我来发一下我的应用软件吧。。

不知道各位老哥平时排查线上问题或者分析日志的时候,有没有遇到过这个痛点:拿到一个几十上百 MB 甚至上 GB 的巨型 JSON 文件,顺手用 VS Code 或其他主流的 Electron 工具一开——好家伙,转半天圈圈然后直接卡死,或者内存瞬间吃干抹净,风扇狂转起飞 ✈️。

实在受不了这种“慢出屎”的体验,于是Mars JSON就诞生了:纯 C++ 搭配 Qt 6 打造。没有任何套壳浏览器的臃肿,主打的就是一个离谱的速度和绝对的安全。

🌟 随便扯几点核心特性:

  1. 快得离谱,告别内存焦虑
    没有 Web 历史包袱。冷启动毫秒级,日常常驻内存也就占个 30MB 左右(是时候跟动辄 500MB 起步的 Electron 应用说拜拜了)。
  2. 拿捏 GB 级超大文件
    底层手搓了个虚拟渲染引擎( Virtual Rendering ),别说几十 MB 了,哪怕是 2GB 、5GB 的怪物级 JSON 拖进去,照样丝滑展开、滚动,零卡顿。
  3. 完全离线,隐私至上
    现在什么工具都想千方百计上云,我们反其道而行之。100% 纯本地处理,哪怕是处理最敏感的生产线上数据,也绝不上传任何信息。在内网或保密环境用起来极其安心。
  4. 懂后端和爬虫老哥的小细节
    • cURL 一键导入:直接把带 Headers 的 cURL 命令扔进去,自动帮你解析,调试接口简直神器。
    • 智能节点识别:在树状视图里,自动把 Unix 时间戳、Hex 颜色值、Base64 给你转换展示出来,省得你再开个网页去慢慢解码。
    • 正则 & 高级搜索:支持正则表达式和深度路径过滤,复杂的结构里找东西一步到位。

稍微提一嘴,本软件不采用订阅制,专业版是一次性买断
支持 Windows 10/11 和 macOS (不管是 Intel 还是 Apple Silicon 都能跑满性能)。

具体介绍和下载试用版可以去官网:https://www.marsjson.com


🎁 福利时间(送 10 个专业版 Pro 授权)

用得到的老哥可以下载软件后,在回复中贴出你的机器码,我会在楼中楼回复你授权码。(当然也欢迎付费支持😂)

欢迎大家体验吐槽,有任何 Bug 或者好建议随时提!

一、 代码签名证书的主要类型

目前主流的代码签名证书主要分为标准代码签名证书(OV证书)  和扩展验证代码签名证书(EV证书)  两类。

1. 标准代码签名证书(OV代码签名证书)

这是最基础的商业级证书,主要面向发布常规软件的企业或独立开发者。

  • 验证级别:证书颁发机构(CA)会验证企业的工商信息(如营业执照)和域名所有权。
  • 适用场景:适用于常见的 .exe.dll.cab.msi 以及Java等应用程序的签名。
  • 特点:能够通过数字签名让用户确认软件来源,防止代码被篡改,价格相对EV证书更亲民。
2. 增强型代码签名证书(EV代码签名证书)

EV证书是当前行业内最高级别的代码签名证书,也是微软硬件认证(WHQL)的强制性要求。

  • 验证级别:采用最严格的身份审核标准,不仅验证企业法律地位,还需通过电话回访等流程确认。私钥强制存储在硬件令牌(USB Key)中,杜绝网络窃取风险 。
  • 适用场景:特别适用于内核驱动程序(.sys)金融软件以及需要在微软SmartScreen过滤器中立即建立信誉的应用程序。
  • 核心优势:使用EV证书签名的软件,能够绕过Windows Defender SmartScreen的初始拦截,极大提升软件的下载转化率和用户信任度 。

二、 如何选择适合你的证书?

在选择时,开发者应从“用户群体+软件类型”两个维度出发:

  • 如果你发布的是个人小工具、普通商业软件,且主要在正规下载站分发,选择OV代码签名证书即可满足基本的安全需求,性价比最高 。
  • 如果你开发的是硬件驱动、系统内核模块,或者希望软件在Windows 10/11系统中免受SmartScreen拦截,那么EV代码签名证书是唯一的选择 。
  • 特别注意:务必确保证书附带时间戳服务。这能保证即使你的证书过期了,之前签名的软件依然可以被系统信任 。

三、 为什么推荐JoySSL?

代码签名申请入口

直接访问JoySSL注册一个账号记得填写注册码230970获取免费安装服务。

在明确了OV和EV的选择逻辑后,选择哪家CA(证书颁发机构)同样关键。除了GlobalSign、DigiCert等国际大厂,近年来国产CA机构异军突起,其中JoySSL凭借其安全合规与高性价比,成为国内开发者的优质选择 。

1. 合规性与数据安全
JoySSL作为中国自主品牌,严格遵守《密码法》等国家法规。其所有证书验证流程及服务器均部署在国内,实现了数据不出境,这对于有等保合规需求的企业、政府及金融项目尤为重要 。

2. 产品线齐全,性价比高
JoySSL不仅提供SSL证书,在代码签名领域同样提供OV代码签名证书和EV代码签名证书。相比于部分国际品牌动辄数千元的价格,JoySSL在保障全球兼容性的同时,价格更具竞争力,并且提供更快捷的本地化技术支持。

3. 全面的兼容性与服务
JoySSL携手全球可信根证书,签名的软件能完美兼容Windows、Mac、Java等主流操作系统与平台 。此外,JoySSL针对首次尝试签名的开发者提供详细的图文教程及一对一技术支持,解决了新手操作上的痛点。

这两天经历了一次招聘诈骗,幸亏没中招,这里把经历讲出来,大家要 千万 小心,尤其是当前就业市场不景气的情况下,大家更加要仔细辨别

事情经过

  1. 上周五 gmail 突然收到邮件,问 solidity 开发合作事宜
  2. 加 TG ,对方说了下项目,发简历给对方,约周一( 3.2 ) 18:30 zoom 面试
  3. zoom 面试,对方假装是个老外,操着一口蹩脚的中文(复盘一下,这应该是国人假装的,因为英文不行,所以假装中文很菜,当然也可能是 AI 自动生成的)
  4. 重点来了,半小时后,对方说通过面试了,开会议讨论,发了一个会议链接,我打开加入,对方说听不到声音,要我安装客户端
  5. 本来就很可疑,一听说客户端,立刻确认是诈骗

复盘总结

  1. 这种诈骗手段应该是特别针对 crypto 从业人员的,下载客户端后,估计就被电脑上的助记词私钥弄走了
  2. 任何情况下,都不要安装客户端
  3. 任何情况下,都不要安装客户端
  4. 任何情况下,都不要安装客户端

曝光诈骗者

会议链接: https://meetix.app/meeting/room?code=xxxxx

对方邮件: 吴明 [email protected]

处理名单、日志、关键词时,很多人都会遇到同一个问题:只想保留有用的行,或者快速删掉无关内容。为了让普通用户不写代码也能完成这件事,我用 Vue 3(Nuxt 3) 开发了一个「文本行过滤/筛选」在线工具,打开网页粘贴文本就能直接用。

在线工具网址:https://see-tool.com/text-line-filter
工具截图:

这个工具常见的使用场景有:

  • 从长日志中只保留包含某个词的行
  • 批量删除空行、重复行、注释行
  • 按前缀或后缀筛选账号、订单号、URL
  • 导出前先清洗文本,让内容更整齐

使用步骤也很简单:

  1. 将原始文本粘贴到输入框(支持多行)。
  2. 选择筛选方式,如“包含关键词”“排除关键词”“正则匹配”“去重”“去空行”。
  3. 按需要开启大小写敏感、整词匹配等条件。
  4. 点击开始处理,结果会立即生成。
  5. 一键复制或下载处理后的文本。

为了让新手更容易上手,我把交互做得尽量直观:你可以看到命中行数和总行数,方便判断筛选是否准确;切换条件后结果会即时更新,减少来回试错。

这个工具不需要安装软件,电脑和手机浏览器都可以使用。文本处理在本地浏览器完成,不必上传原文,日常使用更省心。如果你经常整理文本、日志或名单,这类行级筛选工具会比手动逐行编辑快很多。

这个工具的核心目标很直接:给定一段多行文本和多条条件,快速得到“保留匹配行”或“删除匹配行”的结果。实现上我把逻辑拆成两层:过滤引擎负责纯文本计算,页面逻辑负责参数整理、错误提示、复制与下载。

在线工具网址:https://see-tool.com/text-line-filter
工具截图:

过滤引擎的输入约定

过滤函数接收三部分数据:原始文本、条件数组、选项对象。选项统一收口后,后续分支会非常清晰。

function filterLines(inputText, filterConditions, options) {
  const {
    filterMode = 'contains', // contains | exact
    useRegex = false,        // 是否启用正则
    ignoreCase = true,       // 是否忽略大小写
    matchAll = false,        // false=任一命中,true=全部命中
    action = 'keep'          // keep | remove
  } = options

  if (!inputText || !filterConditions || filterConditions.length === 0) {
    return []
  }

  const lines = inputText.split('\n')
  const matchedLines = []
  // 后续按行处理
}

这里有两个关键点:

  • 条件以数组传入,避免在核心函数里再做字符串切分。
  • 空输入直接返回空数组,调用方只需要处理“有结果/无结果”两种状态。

单行匹配:普通文本与正则双通道

每一行都会遍历全部条件,得到一个布尔数组 matchResults。这个数组是后面 AND/OR 逻辑的基础。

for (const line of lines) {
  const matchResults = []

  for (const condition of filterConditions) {
    let isMatch = false

    if (useRegex) {
      const flags = ignoreCase ? 'i' : ''
      const regex = new RegExp(condition, flags)
      isMatch = regex.test(line)
    } else {
      const searchText = ignoreCase ? condition.toLowerCase() : condition
      const lineText = ignoreCase ? line.toLowerCase() : line

      if (filterMode === 'contains') {
        isMatch = lineText.includes(searchText)
      } else {
        isMatch = lineText === searchText
      }
    }

    matchResults.push(isMatch)
  }
}

这段实现解决了三个常见需求:

  • 模糊匹配includes 处理“行内包含关键词”。
  • 整行匹配=== 处理“整行完全一致”。
  • 正则匹配:由用户条件直接构造 RegExp,支持复杂表达式。

多条件组合:OR 与 AND

工具支持两种条件关系:

  • matchAll = false:任意一个条件命中即视为命中(OR)
  • matchAll = true:所有条件都命中才算命中(AND)

实现非常直接:

const finalMatch = matchAll
  ? matchResults.every(result => result)
  : matchResults.some(result => result)

有了 finalMatch 后,再叠加动作类型:

if ((action === 'keep' && finalMatch) || (action === 'remove' && !finalMatch)) {
  matchedLines.push(line)
}

这一步把“保留匹配”和“删除匹配”统一到了同一套流程里,避免写两份几乎重复的过滤逻辑。

正则错误处理

正则场景最容易出现语法错误(比如括号未闭合)。引擎层统一用 try/catch 包裹,在异常时抛出可读错误:

try {
  // 过滤主流程
} catch (error) {
  throw new Error('正则表达式语法错误:' + error.message)
}

这样页面层只需要捕获一次并提示用户,不需要关心底层失败细节。

页面逻辑:参数整理与结果回填

页面层主要做四件事:

  1. 校验输入文本和条件是否为空。
  2. 把条件文本按换行拆成数组并过滤空行。
  3. 调用过滤引擎并拿到结果数组。
  4. join('\n') 回填到输出框。

核心调用方式:

const conditions = filterConditionsText
  .split('\n')
  .filter(condition => condition.trim())

const result = TextLineFilter.filterLines(inputText, conditions, {
  filterMode,
  useRegex,
  ignoreCase,
  matchAll,
  action
})

outputText = result.length > 0 ? result.join('\n') : ''

这里刻意让页面层只承担“数据进出”,把匹配规则全部留在引擎层,后续扩展新选项时改动面会更小。

复制与下载的JS闭环

过滤完成后,工具支持直接复制和导出文本。复制优先使用现代剪贴板 API,失败时降级到 textarea + execCommand('copy'),保证更多浏览器可用。

下载则通过 Blob 生成文本文件,并使用临时 <a> 标签触发保存:

const blob = new Blob([outputText], { type: 'text/plain;charset=utf-8' })
const url = URL.createObjectURL(blob)

const a = document.createElement('a')
a.href = url
a.download = `过滤结果-${dateStr}.txt`
a.click()

URL.revokeObjectURL(url)

到这里,文本输入、条件匹配、结果输出、复制下载就形成了完整的功能链路。


一、问题

很多开源框架默认只提供英文 API 文档。对于中文用户而言,阅读这些文档通常需要借助机器翻译或查阅社区文章,这带来了两大痛点:

  • 翻译失真:专有名词翻译不准确,导致语义偏差,增加了理解成本。
  • 文档滞后:一旦代码接口更新,非官方的中文说明往往来不及跟进,导致文档与代码脱节。

LazyLLM 认为:多语言支持不是锦上添花,而是基础能力。

我们既要提供原生的中文使用体验,又要保证文档与代码的严格同步。


二、难点

在工程实现上,维护一套高质量的双语文档系统并不像看起来那么简单,主要面临以下陷阱:

1️⃣源码臃肿与污染

如果将中英文 Docstring 同时写在源码中(例如一段英文后紧跟一段中文),会导致源码文件被大量说明文字淹没,严重影响代码的可读性与维护效率。

2️⃣ 多语言同步维护困难

如果不同语言的文档分散在不同位置(如 Wiki、外部站点),或者由不同的人群(官方 vs 社区)维护,很容易出现结构不一致或版本不同步的问题。

3️⃣ IDE 与包分发的可见性难题

即使在 docs/ 目录下把文档写得再好,如果发布的 Python 包中没有包含原生的 Docstring,开发者在 IDE(如 VS Code, PyCharm)中进行悬浮提示(Hover)或代码补全时,依然只能看到空白或英文,无法享受“原生”的中文开发体验。

综上,“在不污染源码的前提下,实现工程化的原生双语 API 文档”是一个极具挑战的目标。


三、LazyLLM 的解决方案

LazyLLM 的核心思想是“文档独立于实现维护,但在构建与运行时按需注入”。关键策略如下:

  • 源码整洁:源码中不保留任何冗长的 API 文档,保持代码逻辑的纯净。
  • 集中维护:中英文 API 文档以人工校对的形式,统一维护在 lazyllm/docs/*.py 映射文件中。
  • 构建时注入(For IDE/Release):提供工具链,在打包发布或本地开发时,将指定语言的文档自动“回写”入 Python 源码的 \_\_doc\_\_ 中,确保 IDE 的静态分析能正确抓取文档。
  • 运行时注入(For REPL/Runtime):支持运行时挂载,利用环境变量驱动文档的动态加载,使得在线文档站点构建和交互式环境(REPL)体验互为补充。
  • 强制检查(CI Guardrails):集成严格的自动化文档检查机制,确保每一个新增或修改的接口都必须同步更新文档,否则无法通过 CI 验证。

简而言之:API 文档由人工编写在外部(lazyllm/docs/*.py),工程工具负责将其“注入”回代码对象。既保证了源码的轻量化,又提供了原生的用户体验。


四、使用示例与预期产出

4.1 运行时动态插入文档

LazyLLM 利用 Python 的动态特性,允许在导入包时通过环境变量自动加载文档。这不会修改磁盘上的文件,仅影响内存中的对象。

export LAZYLLM_INIT_DOC=True            # 启用文档初始化
export LAZYLLM_LANGUAGE=CHINESE         # 设置语言为中文 (或 ENGLISH)

python                                  # 进入 Python 交互环境
>>> from lazyllm import pipeline        # 导入 pipeline
>>> help(pipeline)                      # 查看帮助文档

可得到如下输出:

Help on class Pipeline in module lazyllm.flow.flow:

class Pipeline(LazyLLMFlowsBase)
 |  Pipeline(*args, post_action=None, auto_capture=False, save_result=None, **kw)
 |  
 |  一个形成处理阶段管道的顺序执行模型。
 |  
 |   ``Pipeline`` 类是一个处理阶段的线性序列,其中一个阶段的输出成为下一个阶段的输入...
 ...

4.2 文档开发与站点构建

开发者或文档贡献者可以通过以下流程参与文档维护和站点生成。

第一步:环境准备

首先安装LazyLLM及其依赖:

git clone https://github.com/LazyAGI/LazyLLM.git
cd LazyLLM
pip install -r requirements.txt
pip install -r docs/requirements.txt    # 安装文档生成工具链依赖

第二步:文档维护

文档主要分为两部分:

  • 教程与指南:Markdown 文件,分别位于 docs/zh 和 docs/en (这部分非本文重点)。
  • API 文档:Python 脚本,维护在 lazyllm/docs/*.py 中(本文的重点)。

我们使用特定的注册函数来关联代码与文档,主要涉及三类内容:

  • 中文文档;
  • 英文文档;
  • 代码示例。
# 示例:为 `Pipeline` 类添加中文文档
add_chinese_doc('Pipeline', """\
一个形成处理阶段管道的顺序执行模型。
...""")

# 示例:为 `Pipeline` 类添加英文文档
add_english_doc('Pipeline', """\
A sequential execution model that forms a pipeline of processing stages.
...""")

# 示例:为 `Pipeline` 添加示例代码
add_example('Pipeline', """\
>>> import lazyllm
>>> ppl = lazyllm.pipeline(
...     stage1=lambda x: x+1,
...     stage2=lambda x: f'get {x}'
... )
>>> ppl(1)
'get 2'
""")

第三步:源码静态注入

为了让 IDE(VS Code, PyCharm)能够显示中文提示,我们需要将文档物理写入到源码文件中。这是一个可逆的操作。

export LAZYLLM_INIT_DOC=True       # 启用文档初始化
export LAZYLLM_LANGUAGE=CHINESE    # 设置语言为中文 (或 ENGLISH)
# 运行注入脚本,这会修改本地的 Python 源码文件
python docs/add_docstrings.py      # 向代码对象**写入**文档

注:此步骤修改了磁盘文件。在提交代码前,通常建议清理或恢复源码,除非是发布流程的一部分。

下图当鼠标悬停在 TrainableModule 上就可以显示出对应的文档:

类似的,当设置语言为英文后完成上述流程,可获得:

第四步:生成文档站点

站点构建脚本会结合静态 Markdown 和动态注入的 API 文档生成完整的 HTML 网站。

# 准备静态资源
cp -r docs/assets docs/zh               # 复制静态资源到中文目录
cp -r docs/assets docs/en               # 复制静态资源到英文目录
python docs/gen_mkdocs_yaml.py          # 根据语言变量生成 mkdocs.yml
mkdocs serve -a localhost:1314          # 启动本地预览

启动后,打开浏览器填入地址就可访问本地部署的文档了:

类似的,当设置语言为英文后完成上述流程,可获得:

第五步:在线双语文档

LazyLLM 利用 [Read the Docs](https://readthedocs.org/) 托管在线文档,为用户提供能够无缝切换的中英双语阅读体验。其双语构建与部署流程如下:

1️⃣项目结构配置

在 Read the Docs 上创建两个独立的项目:主项目(英文版)和子项目(中文版)。

将中文项目配置为英文项目的“Translation”子项目。这样,URL 会根据语言自动路由,例如 /en/latest/和 /zh/latest/。

2️⃣构建环境区分

这是实现双语的关键。我们在 Read the Docs 的后台管理界面中,分别为两个项目配置不同的环境变量:

  • 英文项目:默认配置(或显式设置 LAZYLLM_LANGUAGE=ENGLISH)。
  • 中文项目:显式设置环境变量 LAZYLLM_LANGUAGE=CHINESE。

3️⃣动态构建流程

当 Read the Docs 触发构建时,构建脚本会读取上述环境变量,执行以下差异化操作:

  • 配置文件生成:docs/gen\_mkdocs\_yaml.py 脚本根据语言变量,动态生成对应的 mkdocs.yml(加载中文导航 nav\_zh.yml 或英文导航 nav\_en.yml)。
  • API 文档注入:构建过程中导入 lazyllm 包时,初始化逻辑会根据语言变量,将 lazyllm/docs/*.py 中对应的中文或英文文档注入到内存对象中。
  • 页面渲染:最终,MkDocs 生成器从内存对象中提取出已经是目标语言的 Docstring,渲染成 HTML 页面。

通过这种“同一份代码,不同环境配置”的策略,我们无需维护两份割裂的代码库,即可自动生成完全同步的双语 API 文档站点。

预期效果小结:

  • IDE/REPL:悬浮查看源码时,看到的是当下环境语言对应的原生中文 Docstring。
  • Web 站点:API 文档页面准确显示中文描述(因为构建时注入了中文 Docstring)。
  • 流程一致性:无论 Web 端还是 IDE 端,数据源均来自同一份 lazyllm/docs/*.py,杜绝版本分裂。

五、我们是如何做到的

5.1 主要仓库脚本体系

LazyLLM 的文档工程化主要由以下几个核心脚本支撑:

1. 运行时动态注入 (Runtime Injection)

这是文档与代码解耦的基石。

  • 机制

    Python 允许在运行时修改对象的 \_\_doc\_\_ 属性。在 lazyllm/docs/init.py 中,我们检查 LAZYLLM\_INIT\_DOC 环境变量。如果启用,则调用 utils.py 中的逻辑,利用反射机制(getattr, \_\_dict\_\_)定位到内存中的类或函数,将预加载的文本挂载上去。

  • 优势

    实现“零侵入”。源码在磁盘上保持纯净,适应生产环境对加载速度的极致要求(直接关闭文档加载),同时满足开发环境的文档查阅需求

2. Docstring 注入工具 (Static Injection)

  • 入口

    docs/add_docstrings.py。

  • 核心逻辑

    该工具使用 lazynote.manager.SimpleManager 遍历 lazyllm 包。它支持两种模式:

    Fill(注入):将内存中的文档写入磁盘源码文件。

    Clear(清理):清除源码中的 Docstring,恢复代码的“裸”状态。

  • 作用

    解决了静态分析工具(如 IDE)无法识别运行时修改的问题。它是连接“动态文档”与“静态源码”的桥梁。

3. 自动化配置 (Configuration as Code)

  • mkdocs.yml 不是静态文件,而是由 docs/gen\_mkdocs\_yaml.py 根据 LAZYLLM_LANGUAGE 动态生成。
  • 允许中英文文档拥有完全独立的目录结构(docs/zh vs docs/en)和导航菜单(docs/nav_zh.yml),实现了不同语言版本文档的独立演进能力。

4. 文档一致性校验 (Integrity Check)

为了从机制上杜绝“代码更新但文档滞后”的问题,我们引入了强制性的检查脚本 tests/doc\_check/test\_doc\_api\_check.py。

  • 基于 Inspect 的全量扫描

    脚本利用 Python 标准库 inspect 递归遍历 lazyllm 包下的所有类与公开方法(Public Methods)。它会模拟文档注入过程,然后断言内存中的每一个 API 对象是否存在非空的 \_\_doc\_\_ 属性。

  • 智能继承识别

    检查机制具备语义理解能力。如果子类覆盖了父类方法但未重写文档,或者直接继承了父类行为,检查逻辑会自动回溯父类(Ancestors)的文档状态,确保继承链上的文档完整性,避免误报。

  • CI 流水线集成

    我们将此检查作为不可绕过的关卡集成到了 .github/workflows/main.yml 中。在 doc_check 任务里,任何 Pull Request 如果引入了未编写文档的新接口,CI 将直接失败。这确保了主干分支上的每一行代码,都时刻处于“文档齐备”的状态。

5.2 关键技术点剖析:SimpleManager 的工作原理

SimpleManager 是 LazyLLM 文档注入工具的核心执行器,其主要任务是将内存中动态加载的文档(Runtime Docstring)准确地回写到静态源代码(Static Source Code)中。这一过程并非简单的文本替换,而是涉及AST(抽象语法树)操作与运行时对象映射的复杂协同。

实现代码主要位于 docs/scripts/lazynote/manager/simple.py 及其依赖的 BaseManager 和 BaseEditor 中。我们将从三个维度剖析其关键逻辑:

1. 静态与动态的“双重映射” (The Runtime-Static Bridge)

这是该模块最核心的技术难点:如何知道源码文件中的某一个 def foo(): 对应内存中的哪个对象,从而获取其 docstring?

即使我们在源码中没有写文档,LazyLLM 的启动机制(lazyllm/docs/\_\_init\_\_.py)已经将文档挂载到了内存对象(如 Pipeline 类)的 \_\_doc\_\_ 属性上。SimpleManager 利用 BaseEditor (基于 LibCST) 实现了这种连接:

  • AST 遍历:不仅解析文件结构,还维护上下文(如当前类名)。
  • 运行时反射:在遍历 AST 节点(FunctionDef, ClassDef)时,实时去内存模块中查找对应的 Python 对象。

我们可以从 editor/base.py 中看到这一关键逻辑:

# 伪代码逻辑展示 (提取自 BaseEditor)
def leave_FunctionDef(self, original_node, updated_node):
    # 1. 构建当前函数的全名 (e.g., "Pipeline.flow")
    full_name = f"{self.current_class}.{original_node.name.value}"
    
    # 2. 从加载的 module 中获取真实的运行时对象
    obj = self._get_obj_by_name(full_name) 
    
    # 3. 获取运行时对象上的 docstring (这里包含了注入的中文/英文文档)
    docstring = obj.__doc__ if obj else None
    
    # 4. 更新 AST 节点
    return self._update_node_with_new_docstring(original_node, updated_node, docstring)

通过这种方式,SimpleManager 充当了“搬运工”,把内存里“注入好的文档”搬回了“源代码文件”里。

2. 修改策略模式 (Strategy Pattern)

SimpleManager 本身逻辑非常轻薄,它将具体的修改行为委托给 DocstringHandler。这不仅仅是为了代码整洁,更是为了支持“注入(fill)”、“清除(clear)”等多种操作模式。

在 manager/simple.py 中:

class DocstringHandler:
    @staticmethod
    def handle_fill(old_docstring, node_code):
        # 填充模式:主要用于将内存 docstring 写入文件
        # 如果文件中已有(old_docstring),通常 logic 会保留它;
        # 但结合 BaseEditor 逻辑,如果 Runtime 有值且文件无值,这里即实现了注入。
        if old_docstring:
            return f"{old_docstring}"
        return None

    @staticmethod
    def handle_clear(old_docstring, node_code):
        # 清理模式:返回 None,指示 AST 转换器删除文档节点
        return None

当我们运行 python docs/add_docstrings.py --replace 时,实际上是先执行了一次 clear 策略(清洗源码),再执行一次 fill 策略(从内存回填),从而实现了文档的彻底更新或语言切换。

3. 基于 LibCST 的无损修改

为什么不使用 Python 内置的 ast 模块或正则表达式?

  • 正则表达式:无法处理复杂的嵌套结构和多行字符串。
  • Python \`ast\` 模块:在解析和回写时会丢弃源码中的注释和格式信息(Parsing is destructive)。

SimpleManager 继承自依赖 LibCST (Concrete Syntax Tree) 的架构。LibCST 的最大优势是 保留代码风格(Preserve Formatting)

当插入或修改 Docstring 时,它能智能处理缩进和换行,确保注入文档后的代码依然符合 PEP 8 规范,且不会破坏代码的其他部分(如注释、空行)。

# editor/base.py 中的 update 逻辑
def _update_node_with_new_docstring(self, ..., docstring):
    # 构建新的三引号字符串节点
    new_docstring_node = cst.SimpleStatementLine(...)
    
    # 智能插入到函数体/类定义的开头,处理缩进
    # ...
    return updated_node.with_changes(body=new_body)

SimpleManager 的精妙之处在于它打通了 Source Code (文件) -> AST (结构) -> Runtime Object (内存) -> Source Code 的闭环。

它使得 LazyLLM 能够拥有“一份干净的代码”和“多份丰富的文档”,并在需要时随时将二者融合。

4. 架构与流程可视化 (Architecture & Flow)

为了更直观地理解上述机制,类关系图展示了 SimpleManager 如何继承基础能力,并未借助 LibCST 的 Transformer 机制修改代码;而序列图则揭示了从脚本启动遍历,到 AST 解析,再到从运行时获取文档并回写的完整闭环。

类关系图 (Class Structure)

上图展示了模块间的静态依赖关系:

  • BaseManager 提供了通用的遍历(file traverse)和文件读写能力。
  • SimpleManager 关注于具体的文档生成逻辑(即 gen_docstring),通过委托给 DocstringHandler 实现了注入、清理等不同策略的解耦。
  • BaseEditor 则是 AST 操作的实施者,它继承自 LibCST 的 Transformer,负责深入到代码的类和函数定义中进行精细化修改。

核心执行流程 (Execution Sequence)

上图还原了 add_docstrings.py 运行时的动态过程:

1️⃣启动与遍历

脚本初始化 SimpleManager,开始扫描 lazyllm 包下的所有模块。

2️⃣AST 变换

对每个模块,先解析成 AST 树,然后启动 BaseEditor 访问器遍历树中的每个节点(类或函数)。

3️⃣运行时桥接

这是最关键的一步。BaseEditor 在访问 AST 节点时,使用全限定名(Qualified Name)在内存中查找对应的 Python 对象,并提取其 \_\_doc\_\_ 属性——这个属性里正包含了我们预先注入好的中文或英文文档。

4️⃣回写源码

修改后的 AST 树被转换回代码字符串,并覆盖写入原文件,从而完成了“从内存到文件”的文档固化。


六、总结

LazyLLM 的文档方案通过“运行时动态挂载”和“基于 LibCST 的静态注入”,成功解决了开源界长期存在的双语文档维护难题。

  • 对开发者:源码清爽,无维护负担。
  • 对用户:所有接触点(Web、IDE、REPL)均能获得原生的母语支持。

这不仅仅是翻译工作,更是一次关于“开发者体验(DX)”的工程化实践。


欢迎升级体验 LazyLLM最新版本,请大家去github上点一个免费的star,支持一下~

LazyLLM项目仓库链接🔗:


更多技术内容,欢迎移步 gzh "LazyLLM" 讨论!

技术白皮书
版本 1.0 | 2026年3月

摘要

随着企业数字化转型进入深水区,软件开发效率与质量的双重压力推动着开发工具的持续演进。VTJ.PRO 作为一款 AI 驱动的 Vue3 低代码开发平台,在 2026 年初发布的 2.0 版本中实现了从“低代码工具”到“AI 原生应用开发平台”的质变跃迁。本白皮书将深入解析 VTJ.PRO 2.0 的核心架构、技术创新及其实践价值,揭示其如何通过“AI 智能体+前后端一体+企业级工程化”的三位一体架构,重新定义现代应用开发范式。

第一章:背景与愿景

1.1 低代码开发的演进困局

传统低代码平台在过去十年中虽然显著提升了开发效率,但也面临三大核心挑战:

平台锁定风险:多数平台生成代码依赖私有运行时,一旦采用便难以脱离,形成“供应商绑架”。

复杂业务适应性不足:可视化配置难以应对复杂业务逻辑,开发者不得不频繁“跳出”平台进行手工编码。

团队协作与工程化缺失:个人效率工具属性过重,缺乏版本管理、环境隔离等企业级工程能力。

1.2 VTJ.PRO 的设计哲学

VTJ.PRO 自诞生之初便确立了三大核心原则:

  • 代码可编辑:所有生成代码均为标准 Vue 3 + TypeScript,无运行时私有依赖
  • 逻辑可洞察:AI 生成过程透明可追溯,支持推理过程展示
  • 平台可脱离:项目可随时导出源码独立维护,杜绝平台锁定

2.0 版本的发布,标志着这一设计哲学的全面实现,并将 AI 从“辅助工具”升级为“开发智能体”。

第二章:2.0 核心架构升级

2.1 前后端一体化架构

VTJ.PRO 2.0 最大的架构变革在于打破传统低代码平台前后端割裂的局限,采用全新的前后端一体架构

架构创新点

维度传统低代码VTJ.PRO 2.0
数据模型仅前端模拟可视化定义+后端同步生成
API 集成手动配置自动生成接口定义与 Mock 数据
联调流程导出后独立进行平台内一体化联调
部署单元前端代码全栈应用包

该架构允许开发者在统一平台内完成从数据建模、API 定义到前端页面设计的全链路开发,实现真正意义上的全功能在线集成开发环境(Online IDE)

2.2 企业级工程化能力

2.0 版本引入的多项工程化特性,使其从“个人效率工具”升级为“团队协作平台”:

应用版本管理:支持应用版本发布与回滚,每一次重要修改均可创建独立版本,历史版本可回溯、可对比、可恢复。这一机制让迭代过程清晰可控,彻底告别“无法回溯”的开发焦虑。

环境隔离:严格区分开发环境生产环境,确保开发阶段的任何实验和调试都不会影响线上服务的稳定运行,为敏捷迭代和持续交付提供了坚实基础。

多人协作开发:支持项目成员在同一应用空间内并行开发,结合版本管理与环境隔离,团队可以更安全、高效地协同推进复杂项目。

私有化部署支持:2.0 版本正式推出「私有化部署版」,提供完整源码交付,企业可部署在自有服务器或内部网络中,保障数据安全与自主可控。

第三章:AI 智能体架构深度解析

3.1 Agent + Skills 智能体架构

VTJ.PRO 的 AI 能力在 2.0 版本中实现了从“被动响应”到“主动智能”的进化,核心引擎升级为 Agent + Skills 智能体架构

架构层次

接口层 → 逻辑控制层 → AI 处理层 → 引擎集成层
  ↓           ↓            ↓            ↓
文本/图像   状态管理     模型调用     代码转换
  JSON      错误处理     上下文管理   增量更新

这一分层架构确保了系统的可扩展性、可维护性和高性能。

智能体的核心能力

  • 任务拆解:能够将复杂需求(如“创建库存管理系统”)自动拆解为可执行的开发步骤
  • 工具调用:内置 40+ 专业开发工具,AI 可直接调用设计器功能操作页面元素
  • 多步执行:支持自动继续逻辑,在工具调用返回结果后自动触发后续操作

3.2 自然语言到组件生成

AI 助手的核心能力是将自然语言描述转换为生产就绪的 Vue 组件,支持两种输出模式:

完整生成模式:AI 生成完整的 Vue 单文件组件(SFC),系统验证输出为有效格式后转换为 DSL 表示。

增量更新模式:这是 VTJ.PRO 的重大技术创新。AI 生成统一差异格式(unified diff format)的变更,系统通过增量更新引擎将这些补丁精准应用于现有源代码,实现“外科手术式”的局部修改。

增量更新的价值

  • 生成效率提升 200%
  • Token 消耗锐减 70%
  • 避免 AI 重写整个文件的低效做法

3.3 多模态输入处理

VTJ.PRO 的 AI 智能体支持三种输入模式,覆盖不同开发场景:

输入类型前端组件典型应用场景处理延迟
自然语言文本ChatInput功能需求描述、代码优化低 (1-3 秒)
设计图像ImageInput界面原型、设计稿转代码中 (3-10 秒)
结构化元数据JsonInputFigma/MasterGo 设计文件导出低 (1-5 秒)

图像处理管线通过计算机视觉模型识别 UI 元素和布局结构,将视觉设计转换为语义化的 Vue 组件,布局还原精度达 99.1%。

结构化数据导入特别适用于 API 响应模式集成、数据库表结构导入和组件属性类型定义等场景。

3.4 对话管理与状态

AI 智能体实现了分层对话模型,将交互组织为主题和聊天消息的双层结构:

interface AITopic {
  id: string;
  model: string;
  prompt: string;
  type?: 'text' | 'image' | 'json';
  createdAt: string;
}

interface AIChat {
  id: string;
  topicId: string;
  content: string;
  reasoning: string;
  status: 'Pending' | 'Success' | 'Failed' | 'Canceled';
  vue?: string;
  dsl?: any;
  tokens?: number;
}

系统在整个生成过程中维护流式状态,允许用户实时查看 AI 的推理过程,实现生成过程的完全透明化。

3.5 多模型协同架构

VTJ.PRO 支持开发者自主配置 AI 大模型,实现“多模型协同+个性化决策”:

多模型自由切换

  • UI 生成场景:可调用 Gemini 解析设计稿生成组件
  • 复杂逻辑生成:可启用 Claude 生成业务规则代码
  • 私有模型接入:企业可嵌入内部训练的领域大模型

智能仲裁 2.0(AI-CodeFix):当多模型输出冲突时,仲裁引擎动态对比代码质量,自动采纳最优方案,业务逻辑准确率提升至 98.7%。

第四章:核心引擎技术解密

4.1 双向代码转换管道

VTJ.PRO 的技术核心是 Vue SFC 与 DSL 之间的双向转换能力,这一机制确保了可视化设计与源代码编辑的实时同步。

转换流程

可视化编辑 → DSL 表示 → Vue SFC 生成
    ↑                       ↓
     ←───── 逆向工程 ──────

当开发者在可视化画布中拖放组件时,系统生成 DSL 描述;代码生成器将 DSL 转换为标准的 Vue 3 代码。反之,当开发者直接修改源代码时,逆向工程引擎将变更同步回设计时模型,保持画布与代码一致。

4.2 渲染引擎架构

@vtj/renderer 渲染系统采用三模智能上下文设计:

  • 设计模式:为组件注入检测能力,支持设计时动态调试
  • 运行模式:纯生产环境优化,移除插桩代码提升 300% 渲染性能
  • VNode 模式:无 ref 虚拟节点渲染,满足高并发场景需求

实时仿真沙盒基于 iframe 的共享模拟环境,实现设计变更毫秒级同步预览,确保“所见即所得”。

4.3 脚手架与项目集成

VTJ.PRO 提供标准化的项目脚手架系统 create-vtj,支持多种项目类型:

# Web 应用程序 - 使用 @vtj/web 平台
npm create vtj@latest -- -t app

# 移动 H5 应用程序 - 使用 @vtj/h5 平台
npm create vtj@latest -- -t h5

# 跨平台应用 - 使用 @vtj/uni-app 平台
npm create vtj@latest -- -t uniapp

# 组件开发 - 使用 @vtj/materials 平台
npm create vtj@latest -- -t material

对于现有项目集成,VTJ 通过平台适配器包实现无缝接入,支持逐步迁移组件到可视化设计环境。

4.4 Monorepo 包管理

VTJ.PRO 采用 monorepo 架构管理多个相互依赖的独立包,确保版本同步和高效协作:

平台目标环境核心依赖
Web@vtj/web桌面 Web 应用element-plus
设计器@vtj/pro可视化设计平台@vtj/renderer
移动 H5@vtj/h5移动端 Web 应用vant
UniApp@vtj/uni-app跨平台应用@dcloudio/uni-app

第五章:企业级应用实践

5.1 典型应用场景

场景一:企业级中后台系统

某金融机构使用 VTJ.PRO 2.0 重构信贷审批系统,实现了:

  • 开发周期从 6 周压缩至 9 天
  • 版本迭代人力投入减少 75%
  • 响应式界面适配效率提升 90%

场景二:电商促销系统

通过自定义模型生成秒杀规则逻辑,结合多模型协同架构:

  • 错误率降低 90%
  • 迭代效率提升 300%

场景三:跨平台应用开发

使用 @vtj/uni-app 平台一次设计同步输出 Web、H5、小程序三端代码,实现设计资产的最大化复用。

5.2 开发者体验与工作流

VTJ.PRO 2.0 重新定义了 AI 原生开发工作流:

  1. 需求输入:自然语言描述或设计稿上传
  2. AI 拆解:智能体自动分解任务并规划执行步骤
  3. 增量生成:分模块生成代码,实时预览反馈
  4. 人工优化:直接修改生成代码,AI 同步更新设计视图
  5. 版本发布:创建应用版本,隔离部署环境
  6. 持续迭代:基于版本管理进行敏捷开发

第六章:未来展望

6.1 AI 智能体的演进方向

VTJ.PRO 将持续深化 AI 能力,未来演进方向包括:

  • 全栈架构师智能体:不仅生成代码,还能进行技术选型、架构设计建议
  • 跨项目知识迁移:在不同项目间学习开发模式,形成领域最佳实践沉淀
  • 主动式开发伙伴:预判开发风险,主动提出优化建议

6.2 开放生态建设

VTJ.PRO 将进一步完善开发者生态:

  • 模板市场:社区共享可复用的业务模块和页面模板
  • 插件机制:支持第三方扩展设计器功能
  • AI 模型市场:开发者可发布和共享领域微调模型

结语

从低代码工具到 AI 智能体开发平台,VTJ.PRO 2.0 的进化不仅是技术架构的升级,更是开发范式的革新。它证明了“代码可控”与“AI 增强”可以完美共存,“个人效率”与“团队协作”能够有机统一,“快速原型”与“生产级质量”并非二选一。

对于追求开发效率与代码质量平衡的团队而言,VTJ.PRO 2.0 提供了一个值得关注的技术方案——一个真正将 AI 从“辅助工具”升级为“开发伙伴”的下一代应用开发平台。

附录

资源链接

参考文献

  1. VTJ.PRO 官方博客. VTJ.PRO 应用开发平台 v2.0 发布公告. 2026-01-07
  2. OSC 开源中国. VTJ.PRO 正式上线全新架构的「AI + 低代码」应用平台 2.0. 2026-01-06
  3. OSC 开源中国. VTJ.PRO v0.12.65 发布:用户自主配置大模型时代正式开启. 2025
  4. OSC 开源中国. VTJ.PRO 应用开发平台 v2.0 发布,支持私有化部署. 2026
  5. 掘金技术社区. Agent + Skills 架构的 Vue 应用开发智能体深度解析. 2026-02-24
  6. VTJ.PRO 官方 Wiki. VTJ.PRO 概述. 2026
  7. VTJ.PRO 官方博客. VTJ.PRO 正式接入 GPT‑5 —— AI 低代码迈入「思考时代」. 2025-08-11
  8. 阿里云开发者社区. AI + 低代码技术揭秘(一):概述. 2025-06-15
  9. VTJ.PRO 官方博客. 突破效率边界:VTJ.PRO 以 AI+低代码重塑企业数字化生产力. 2025-06-29
  10. 掘金技术社区. 开源一个架构,为什么能让 VTJ.PRO 在低代码赛道“炸裂”?. 2025-12-08

本白皮书内容基于 VTJ.PRO 2.0 正式版本撰写,技术细节可能随版本更新而调整,最新信息请访问官方网站。

“在软件定义一切的时代,项目管理的核心已从单纯的流程管控,转向对智能协作与研发效能的深度赋能。”——改编自《2025全球研发效能白皮书》

随着人工智能技术的爆发式增长,2026年的研发环境发生了翻天覆地的变化。传统的瀑布式或敏捷管理工具已难以满足AI模型训练、大数据处理及复杂算法迭代的需求。新一代项目管理工具必须具备智能化调度、代码级关联、自动化洞察以及跨团队协作的核心能力。本文将中立、客观地盘点九款在2026年表现卓越的项目管理工具,涵盖从老牌劲旅到新兴势力,重点分析其在AI与研发场景下的独特价值,助力团队在智能化浪潮中精准选型。

一、国产深耕与全生命周期管理类

1. 禅道(ZenTao):经典架构的智能化新生

作为国产项目管理软件的常青树,禅道在2026年完成了重要的架构升级。它依然坚持“产品-项目-测试”三位一体的核心理念,完美契合Scrum与DevOps流程,为国内研发团队提供了最熟悉的操作范式。

  • 核心优势:禅道最新的企业版深度集成了AI辅助需求分析功能,能够自动识别需求文档中的逻辑漏洞并生成测试用例建议。其内置的代码仓库关联功能,支持从Git提交记录直接追溯至具体任务,实现了从需求到代码再到测试的研发链路闭环。此外,其私有化部署方案在数据安全性上达到了金融级标准,深受大型国企及科研机构青睐。
  • 适用场景:特别适合中大型软件企业,尤其是那些需要严格遵循研发规范、注重数据隐私与安全、希望引入AI提效但不愿迁移云端的团队。

2. Jira:全球生态的AI增强版

Jira依然是全球研发团队的事实标准。在2026年,Atlassian推出了基于大模型的“Jira Intelligence”引擎,使其在复杂工程管理上更具前瞻性。

  • 核心优势:其强大的插件生态系统允许团队无缝集成各类AI编码助手(如GitHub Copilot等)。Jira的新特性在于预测性交付分析,它能根据历史速率、当前代码复杂度及团队成员负荷,精准预测项目延期风险并提供优化建议。其看板自定义程度极高,支持复杂的泳道规则和自动化工作流,能够适应从微服务架构到单体应用的各种开发模式。
  • 适用场景:适用于跨国团队、开源社区以及已经深度绑定Atlassian生态的企业。对于需要高度定制化流程、全球化协作以及复杂依赖管理的AI研发项目,Jira仍是首选。

3. Azure DevOps:微软生态的一站式解决方案

Azure DevOps在2026年进一步强化了其与Azure云服务的深度整合,成为云原生AI项目的强力助推器。

  • 核心优势:提供了从需求规划、代码托管、CI/CD流水线到测试管理的完整闭环。其AI驱动的代码审查功能能够自动检测潜在的安全漏洞和性能瓶颈。结合Azure ML,项目经理可以直接在看板中监控模型训练任务的状态和资源消耗,实现了算法工程与传统软件工程的统一管理。
  • 适用场景:适合深度使用微软技术栈、依托Azure云平台进行AI模型开发与部署的企业级团队,特别是在云原生和DevSecOps领域有强烈需求的组织。

二、敏捷协作与可视化创新类

4. Trello:轻量级看板的智能进化

Trello以其直观的卡片式看板闻名,2026年的版本引入了“智能卡片”概念,让轻量级管理也能拥有大智慧。

  • 核心优势:通过自然语言处理,用户可以语音指令创建任务,系统自动分配标签、优先级和截止日期。其Butler自动化机器人现在具备学习能力,能根据团队习惯自动归档已完成任务、触发依赖项提醒或在卡片停滞时发送预警。界面简洁,上手零成本。
  • 适用场景:适合初创AI团队、小型算法小组、非技术背景的产品经理进行快速原型管理,或作为大型团队中特定敏捷小队的协作工具。

5. Teambition:阿里生态的高效协同

Teambition依托于阿里云生态,在2026年实现了与通义千问等大模型的深度打通,成为国内混合办公场景下的佼佼者。

  • 核心优势:其最大的亮点是多端实时协同与文档一体化。在研发会议中,Teambition能实时转录语音并自动生成任务待办,直接关联到项目看板。其甘特图功能针对资源负载进行了优化,能直观展示AI算力资源的分配情况,并与钉钉消息无缝联动,确保信息即时触达。
  • 适用场景:广泛适用于使用钉钉办公的企业,特别是需要频繁进行跨部门沟通、文档协作紧密的混合型研发团队,以及追求国产化信创适配的组织。

6. Asana:智能工作流与目标对齐

Asana在2026年强化了其“智能工作流”引擎,专注于将战略目标拆解为可执行的任务。

  • 核心优势:Asana AI能够自动识别任务之间的依赖关系,并在风险出现时重新规划路径。其Goals(目标)可以实时追踪OKR完成情况,将底层代码提交、测试通过率等指标自动汇聚至高层目标视图,确保研发动作与公司战略高度对齐。界面设计极具美感,用户体验流畅。
  • 适用场景:适合注重目标管理、需要清晰可视化项目全景的中大型团队,特别是那些强调跨职能协作(如产品、设计、研发混合编组)的创新型组织。

三、综合平台与新兴智能类

7. Microsoft Project (with Copilot):企业级的严谨规划

Microsoft Project在融入Microsoft 365 Copilot后焕发了第二春,继续统领超大型复杂项目的管理。

  • 核心优势:它保留了最强大的关键路径法(CPM)和资源平衡算法,是处理百万级任务量项目的唯一选择。Copilot的加入使得项目经理可以通过对话生成复杂的排程计划,并自动模拟不同资源投入下的项目结果(What-if分析),为高层决策提供数据支撑。
  • 适用场景:适合超大型AI基础设施建设项目,如数据中心建设、城市大脑开发或长达数年的基础模型研发,这类项目对时间、成本和资源的精确控制要求极高。

8. ClickUp:All-in-One的超级聚合

ClickUp在2026年进一步巩固了其“一个App替代所有”的定位,成为全能型选手的代表。

  • 核心优势:ClickUp AI不仅能写文档,还能自动生成代码片段审查报告和测试脚本。它将文档、目标、聊天、白板和任务整合在一个视图中,极大减少了上下文切换的成本。其仪表盘支持实时连接GitHub/GitLab数据,动态展示研发效能指标(如DORA指标),让管理更加数据化。
  • 适用场景:适合追求极致效率、希望在一个平台上解决所有协作问题的全栈研发团队,尤其是远程办公分布广泛、成员角色多样的初创及成长型企业。

9. Monday.com:可视化工作流的自动化大师

Monday.com以其色彩丰富、高度可视化的界面著称,是数据驱动型管理的典范。

  • 核心优势:2026版的Monday.com增强了数据驱动决策能力。它能将研发过程中的埋点数据、服务器监控指标直接映射到项目面板上,一旦系统报错率超过阈值,自动触发应急任务流程。其公式列和自动化逻辑让非技术人员也能构建复杂的研发管理流,无需编写代码即可实现高度定制。
  • 适用场景:适合重视视觉化管理、需要快速响应市场变化的AI应用层开发团队,以及需要将研发进度以直观图表向高层汇报的场景。

结语

2026年的项目管理工具市场呈现出智能化、垂直化、生态化的三大趋势。无论是坚守经典流程且安全可靠的禅道,还是拥抱全球生态的Jira,亦或是主打轻量智能的Trello与全能聚合的ClickUp,每款工具都在特定的维度上为AI与研发团队提供了强有力的支撑。

选择工具的本质,是选择一种协作文化工作流范式。没有绝对完美的工具,只有最适合团队当前发展阶段、技术栈及安全合规要求的解决方案。建议企业在选型时,充分考量自身的规模、对AI功能的依赖程度以及现有生态兼容性,从而在激烈的技术竞争中构建起高效的研发护城河,推动创新落地。

作者:周卫林,Aloudata 创始人 & CEO

上一篇文章里,我从一个 OpenClaw Skill 聊起,讲了一个判断:个人认知正在被 .md 编译,企业认知需要语义层来编译,而 OSI 标准的发布意味着这件事正在从愿景变成现实。
不少朋友读完后问我:OSI 到底是什么?跟 SQL 是什么关系?全球那些数据巨头为什么突然要联手搞一个标准?这对中国企业意味着什么?
这篇文章就来展开聊聊这些问题。

先讲一段老故事:SQL 是怎么统一世界的

1970 年代,IBM 的研究员基于关系代数提出了 SEQUEL(后来改名 SQL)。那个年代,每家数据库厂商——DB2、Informix、Sybase——都有自己的私有查询语言。你在 A 系统上写的查询逻辑,换到 B 系统上就得重写一遍。开发者被锁死在特定厂商的生态里,迁移成本极高。
1986 年,SQL 成为 ANSI 标准,次年被 ISO 采纳。标准化之后发生了什么?应用可以跨数据库迁移了,整个 BI、ERP、数据工具的生态在接下来三十年里蓬勃生长——这个生态的底座,就是 SQL 这一层“大家都认”的查询协议。

回头看,SQL 标准化给我们三个启示:
第一,标准解决的是协作成本问题,不是纯技术问题。SQL 不是当时技术上最优的查询语言,但它足够好,且大家愿意一起用。
第二,标准必须由行业共同推动,不能是一家厂商的私有方案。如果 SQL 只属于 IBM,它不可能成为标准。
第三,标准成功依赖实用性,不依赖理论完美性。SQL 到今天还有一堆被人吐槽的设计缺陷,但这不妨碍它统治了四十年。
这段历史之所以重要,是因为我们正在看到一个高度相似的剧本重演。

OSI:让“数据是什么意思”标准化

SQL 解决了“怎么取数”的标准化问题。但四十年后,一个 SQL 没有回答的问题变得越来越紧迫:同一个指标名称,在不同系统里到底是什么意思?
“月度收入”在财务系统里要剔除退款和异常订单,在市场系统里包含所有支付成功的订单,在供应链系统里只算已发货部分。同一个词,三套计算逻辑。
人类员工处理这种差异靠三种方式:开会对齐、当面确认、老带新口口相传。原始但管用。
但 Agent 不会开会。Agent 不会打电话问“你说的 GMV 包含退款吗”。Agent 拿到一个指标名称,就会按自己理解的逻辑去算——如果三个 Agent 各算各的,协同就失效了。
AI Agent 的规模化落地,把“语义一致性”从一个“有了更好”的优化项,变成了“没有不行”的前提条件。
这就是 OSI 要解决的问题。

2026 年 1 月 27 日,Open Semantic Interchange(OSI)v1.0 规范在 GitHub 正式发布(仓库地址:github.com/open-semantic-interchange/OSI,采用 Apache 2.0 开源许可)。这不是一个概念或倡议——是一份可落地的技术标准,用声明式 YAML 格式定义指标、维度、关系和上下文(context)的统一描述规范,让不同系统可以互相理解对方的语义。简单说,它给“数据是什么意思”提供了一种跨平台、跨工具的通用语言。
更具体地讲:过去你在 dbt 里定义了“净收入”的计算逻辑,想在 Tableau 或 Power BI 里用,得重新定义一遍。OSI 要解决的就是这个问题——定义一次,导出成 OSI 格式,所有兼容的工具都能直接理解和执行。
参与方的阵容本身就是最好的背书:Snowflake、Databricks、Salesforce、dbt Labs、AtScale、Qlik、JetBrains、Collibra、DataHub、Lightdash、Coalesce、Sigma……几十家全球数据技术公司,覆盖了云平台、BI 工具、数据工程、数据治理的完整生态(完整名单见 OSI 官网 open-semantic-interchange.org)。
其中 Snowflake 和 Databricks 两家最引人注目。当两个打得不可开交的对手愿意坐下来联合定标准的时候,说明市场需求已经大到不能再各自为政了。 Salesforce 也在官方博客中明确表态:“The agentic future demands an open semantic layer”——Agentic AI 的未来要求一个开放的语义层。

全球数据厂商:殊途同归的语义层布局

OSI 的发布不是凭空出现的。过去两年,整个数据技术栈都在向语义层聚拢,只是路径不同。
BI 平台在重构语义内核。 Salesforce 旗下的 Tableau 推出 Tableau Next,内置 Tableau Semantics 模块——官方定义为“AI-infused semantic layer”,明确为 AI Agent 提供统一的业务术语,并推出了 Data Pro、Concierge、Inspector 三个内置 AI Agent(见 tableau.com/products/tableau-next)。Google 旗下的 Looker 长期以语义模型 LookML 为核心能力,2025 年进一步推出 Looker MCP Server,让 Gemini CLI、Claude 等外部 AI 平台可以直接查询 Looker 的语义层(见 Google Cloud Blog Opening up the Looker semantic layer)。Microsoft 则在 Power BI 中将“数据集(Dataset)”正式更名为“语义模型(Semantic Model)”,强调它是业务知识的载体而非单纯的数据容器(见 Power BI Blog Datasets renamed to semantic models)。

云平台在向上延伸语义能力。 Snowflake 2025 年 4 月推出 Native Semantic Views(语义视图),把语义定义变成数据平台的原生功能,2026 年 2 月进一步发布 Semantic View Autopilot,用 AI 自动从查询历史和 BI 资产中生成语义视图(见 Snowflake Engineering Blog Native Semantic Views: AI-Powered BI)。Databricks 在 Unity Catalog 中推出 Metric Views,用 YAML 格式定义指标并注册到统一目录中,实现“一次定义,处处可信”——在 Dashboard、Genie、Notebook、SQL 中均可直接调用(见 Databricks Blog What's new with Unity Catalog)。

现代数据栈在推动语义中立。 dbt Labs 2025 年 10 月宣布将 MetricFlow 完全开源(Apache 2.0),作为对 OSI 标准的直接承诺,推动指标定义的标准化和可移植——MetricFlow 的 YAML 格式也是 OSI 规范的底层标准之一(见 dbt Labs Blog dbt Labs Affirms Commitment to OSI by Open Sourcing MetricFlow)。Cube.dev 被 GigaOm 2025 年语义层雷达报告评为“Leader and Outperformer”,定位“Agentic Analytics Platform”,提供 REST、GraphQL、SQL、MDX、DAX 等多种 API 供各类系统调用(见 Cube Blog Named Leader in 2025 GigaOm Radar)。
这些动作方向一致:语义层正在从应用层的附属功能,下沉为基础设施层的核心能力。
而 OSI 做的事,是在这些厂商各自的语义层之间建立一种“互译协议”——你在 Snowflake 上定义的“净收入”,导出成 OSI 格式后,dbt、Tableau、Power BI 都能直接理解和使用,不需要重新定义一遍。根据 OSI 路线图,Phase 2 的原生平台支持计划在 2026 年 Q2-Q4 推进,目标覆盖 50+ 平台。

对中国企业意味着什么

看到这里,可能有人会问:这是硅谷的事,跟中国企业有什么关系?
关系很大。
第一,Agent 的落地速度在中国可能更快。 中国企业对新技术的采纳速度一直领先全球——从移动支付到短视频到直播电商,莫不如此。AI Agent 也一样。当 Agent 在企业内部大规模部署的时候,语义一致性的问题会比硅谷更早、更猛烈地爆发出来。
第二,中国企业的数据治理现状更需要语义层。 很多大型企业经历了十年的信息化和数据中台建设,积累了大量数据资产,但指标定义散落在众多系统里,口径差异是常态。这些“技术债”在传统 BI 时代还能靠人力弥补,到了 Agent 时代就成了硬伤。
第三,OSI 作为开放标准,为中国厂商提供了参与全球生态的机会。 它不是某一家公司的私有格式,而是一个开放协议(Apache 2.0 许可)。中国的数据语义层产品完全可以兼容 OSI 标准,进入全球技术生态的互操作网络。

OSI 之后,真正的挑战才开始

最后我想说一个 OSI 没有解决的问题——这也是我认为下一阶段最关键的问题。
OSI v1.0 解决的是“定义”层面的标准化:用什么格式描述一个指标、一个维度、一个关系。这很重要,是基础。
但企业真正要用起来,光有定义不够。你还需要:
动态组装能力。 业务需求千变万化,Agent 可能需要实时组合“过去 24 小时一线城市 35 岁以上女性用户对促销活动的响应率”——这种指标不可能预先定义好,需要从原子指标和维度动态组装。
执行可验证。 从自然语言到语义查询到 SQL 到结果,每一步都应该可追溯、可审计。业务负责人不需要懂 SQL,但他需要能点开看到“这个数是怎么算出来的”。
性能与精度的平衡。 百亿级数据下的亚秒级响应,同时计算逻辑 100% 准确——这两个要求经常矛盾,需要智能的物化加速和查询路由来协调。
这些,正是“定义”之上的“执行”层需要解决的问题。上一篇文章里我把它概括为一句话:定义是协议的前半段,执行是协议的后半段。OSI 做了前半段,Aloudata 的 Semantic Fabric(语义编织)则把前后两段都做了。
传统的“数仓 + BI”两层架构,正在被“数据湖 + 语义层 + 消费层”三层架构替代。语义层成为连接原始数据与业务价值的核心枢纽——它对下屏蔽数据源的复杂性,对上为 Agent、BI、应用提供统一的语义接口。

站在标准化的起点上
标准协议的价值,往往在普及之后才被充分认知。
回想 1986 年 SQL 成为标准的时候,大多数人没有意识到这会催生接下来三十年的整个数据库和 BI 生态。今天 OSI v1.0 刚刚发布一个月,它能走多远、多快,还有很多不确定性。
但有几件事是确定的:
AI Agent 对语义一致性的依赖,远远高于传统应用对查询语言的依赖——这意味着标准化的驱动力比 SQL 时代更强。
现代数据生态的开放程度,远高于四十年前的封闭竞争时代——这意味着标准推进的阻力更小。
Git、API、Schema Registry 等工程基础设施已经成熟——这意味着标准落地的工具链已经就绪。
当企业开始将“指标定义”视为与“财务制度”同等重要的治理资产,当语义描述变成一种可交换、可审计、可版本管理的协议——我们就真正站在了智能决策的新起点上。
从 SQL 到 OSI,间隔了四十年。SQL 让机器听懂了人类的查询指令,OSI 要让机器理解人类的业务语言。
这一步,比上一步更难,也更值得。

延伸阅读:了解 OSI

如果你想深入了解 OSI 标准,以下是一些关键资源:
OSI 官方资源

  • OSI 规范仓库(GitHub):github.com/open-semantic-interchange/OSI
  • OSI 官网:open-semantic-interchange.org
    厂商视角的解读
  • Snowflake:“Open Semantic Interchange's Specs Finalized”(snowflake.com/blog)
  • Salesforce / Tableau:“The Agentic Future Demands an Open Semantic Layer”(salesforce.com/blog)
  • dbt Labs:“What the OSI Spec Means for Metrics, Semantics, and AI”(getdbt.com/blog)
  • dbt Labs:“dbt Labs Affirms Commitment to OSI by Open Sourcing MetricFlow”(getdbt.com/blog)
    各平台语义层产品
  • Snowflake Native Semantic Views:docs.snowflake.com/en/user-guide/views-semantic/overview
  • Databricks Unity Catalog Metrics:docs.databricks.com/en/metric-views
  • Tableau Semantics & Tableau Next:tableau.com/products/tableau-next
  • Looker LookML 语义层:cloud.google.com/looker-modeling
  • Power BI Semantic Model:learn.microsoft.com/en-us/power-bi/connect-data/service-datasets-rename
  • Cube.dev 语义层平台:cube.dev/use-cases/semantic-layer
  • dbt MetricFlow(开源):github.com/dbt-labs/metricflow