每个Agent框架都要重写技能?SkVM:让技能skills「一次编写,到处运行」

工具推荐 1777345569更新

0

前阵子,我在研究各种Agent框架的时候,发现一个问题。

就是每个框架都有自己的技能(Skill)体系,OpenClaw有OpenClaw的技能,Hermes有Hermes的技能,pi Agent有pi Agent的技能。你在这个框架下写的技能,换到另一个框架,用不了。

这就很难受。

就像你写了一套微信小程序,想扔到支付宝小程序里跑,发现要重写一遍。费时费力,没有意义。

然后我就开始想,有没有一种东西,能够让技能一次编写,到处运行?

你还别说,真让我找到了。

SkVM,就是这个问题的答案。

SkVM是上海交大IPADS实验室做的一个项目,全称没有官方说法,应该叫Skill Virtual Machine(我猜的)。我第一次看到这个名字的时候,脑子里蹦出来的第一个词是Java虚拟机。JVM当年做的事,就是让Java代码"一次编写,到处运行"。SkVM想做的事,本质上是一样的,只不过对象从程序变成了Agent的技能。

听起来很美好对吧。

但我得跟你说句实话,这东西门槛不低。你要是想完整地用起来,需要对你的目标模型做一次"能力体检",需要用AOT编译器把技能编译一次,需要跑JIT优化。这个流程下来,你可能需要几十分钟到几个小时。

取决于你的模型有多少能力需要测。

不过有一说一,这个流程跑通之后,确实很爽。

SkVM有四个核心能力,我一个个跟你说。

第一个是Profiling,翻译过来叫"能力画像"。

就是你扔一个模型给它,它会测这个模型到底有哪些能力。比如它会不会用工具,会不会做代码生成,会不会做逻辑推理,这些东西都会被测出来。

测完之后会生成一个profile文件,这个文件就像是这个模型的"体检报告"。你拿着这份报告,再扔给编译器,编译器就知道这个模型有几斤几两,该怎么优化技能来适配它。

这里有个很有意思的点。不同模型的能力差异是巨大的。比如某些模型擅长逻辑推理但工具调用很烂,某些模型反过来。你要是用同一套技能去套所有模型,效果肯定参差不齐。但有了这份profile,你就能针对每个模型的实际情况,做定向优化。

这个思路,我觉得是对的。

第二个是AOT-Compilation,AOT就是Ahead-of-Time,翻译过来叫"提前编译"。

这个过程你可以理解为"翻译"。你有一个技能,比如一个"帮我写代码"的技能,这个技能最初可能是用某种格式写的,但不同模型、不同框架对技能的格式要求不一样。AOT编译器的任务,就是把这个技能"翻译"成目标模型能理解的形式。

而且这个翻译不是一次性的。它有好几轮编译,每一轮都在做不同的事。比如第一轮可能是在提取这个技能里有哪些步骤,第二轮可能在分析这些步骤之间的依赖关系,第三轮可能在做一些安全检查。

这个设计挺精妙的。模块化了之后,你后面想加新的编译环节,直接往里面插就行,不用动底层的代码。

第三个是JIT-Optimization,JIT就是Just-in-Time,跟AOT相对。

但这里的JIT不是传统意义上的运行时编译。它的意思是,在你实际运行这个技能之后,根据运行的结果,再来优化技能本身。

更具体一点说,就是你跑完一个任务,SkVM会拿到这次运行的对话日志,然后分析哪里可以改进。比如某个地方AI的反应太慢了,或者某个步骤其实可以合并。它会把这些分析结果拿去喂给一个Optimizer模型,让这个模型提出改进建议,然后再跑一遍,再分析,再优化。

循环往复,直到效果达到一个让人满意的程度。

这本质上是一种"自动化调参"。以前你调技能,全靠人工经验,现在把一部分工作交给AI自己来做,效率会高很多。

第四个是Benchmark,这个你应该能猜到,就是基准测试。

你优化完一个技能之后,总得知道它到底有没有变得更好吧。Benchmark就是干这个的。它会让你设定一些测试任务,然后在不同的模型、不同的条件下跑这些任务,最后生成一份对比报告,告诉你优化前后的效果差异。

说实话,光看文档总觉得有点虚。我还是决定自己动手跑一遍。

我的测试环境是这样的,本地有一台Mac,Node.js 18以上就行。安装过程倒是挺简单的,按照官方文档来就行。

npm i -g @ipads-skvm/skvm

装完之后,配一下API key。SkVM支持多种模型提供商,OpenRouter、Anthropic、OpenAI兼容的都有。我选的是OpenRouter,顺手配了一个Qwen。

然后就开始跑第一个命令,profile。

这个过程比我想象中慢。我一开始以为可能就是几分钟的事,结果跑完一看,用了大概20分钟。当然这跟我选的模型和并发数有关系,我用的是默认并发1,如果你提高并发,时间会短一些。

跑完之后生成了一个profile文件在~/.skvm/profiles/下面。我看了一眼,里面的内容比我想象中详细很多。

然后我就跑了aot-compile,编译了一个我自己写的简单技能。

这里有个有意思的细节。编译的时候,SkVM会先读取profile文件,然后似乎可以根据目标模型的能力情况,决定要启用哪些编译通道。这个过程是自动的,你不用手动干预。

整个流程跑下来,我的感受是,这个工具确实在做一件有意义的事。它试图解决的是一个真实存在的问题,就是Agent框架之间的技能无法互通。

其实SkVM最打动我的,不是它的某个具体功能,而是它背后那套思路。

Agent时代,大家都在说碎片化。模型越来越多,框架越来越多,技能越来越多。每个玩家都在建自己的生态,都在圈自己的用户。但问题是,这些技能和数据,某种程度上是互相隔离的。

这像极了互联网早期的情况。每个网站有自己的账号体系,你不得不注册无数个用户名密码。后来有了OpenID,有了OAuth,有了单点登录,用户体验才真正变好。

SkVM做的事,有点像给Agent时代建一个"技能通行证"。

它不是要取代任何一个框架,而是让不同的框架能够互相理解彼此的技能。这是一种"连接"的工作,而不是"替代"的工作。

当然,这个愿景能不能实现,还需要看社区愿不愿意跟进。毕竟光有工具不行,还得有人愿意把自己的技能贡献出来,让大家都能用。

用SkVM的过程中,我一直在想一个问题。

AI时代,什么才是真正的"技能"?

以前的技能,可能是指某种手艺,比如写代码、做饭、开飞机。这些技能有个特点,就是它们是凝固的。你学会了一样东西,只要世界不变化,这个技能就一直能用。

但AI时代的技能,可能完全是另一回事。一个Prompt算不算技能?一个工作流算不算技能?一个经过优化的Agent配置算不算技能?

这些"技能"有一个共同特点,就是它们是动态的。它们跟具体的模型、具体的环境绑定的很深。模型升级了,技能可能就失效了。环境变化了,技能可能就需要调整。

SkVM某种程度上是在回应这个问题。它试图建立一种标准,让技能的"编译"和"优化"变成一种可复用的流程,而不是每次都要从头开始。

这个方向,我觉得是值得探索的。

总的来说,SkVM是一个有意思的尝试。它试图解决的是一个真实存在的问题,而且给出了一个结构化的解决方案。虽然现在还处于早期阶段,但我觉得它的方向是对的。

如果你是一个AI开发者,或者你对Agent框架之间的互通性有兴趣,我建议你关注一下这个项目。不一定现在就用,但可以先了解一下它在做一件什么样的事。

这个方向,我觉得是有未来的。

项目地址:https://github.com/SJTU-IPADS/SkVM/tree/main