最近openClaw很火,想学习一下基本的原理。简单总结一下个人的理解。
朴素的认知
- 能够对接一个对话工具。例如:飞书、钉钉等。虽然没有实际操作过但是基本原理可以想到。对接工具的api接口实现消息的发送与接收。例如飞书机器人功能。可以通过api接收和发送消息。如何对接飞书可以查看官方文档。
- 收到的消息发送给模型。模型根据消息判断执行哪些指令,然后将指令的结果返回。这个具体实现也很简单。之前文章写入sping ai或者直接查看spring boot的官方文档有详细的说明。
- 具体消息持久化、模型的prompt、执行流程的定义和编排在spring ai里面都有详细说明。
- 还有就是执行指令。这里的指令主要就是你自己电脑能提供的功能。例如查询电脑里面的文件。执行linux命令等。
- openClaw的基本功能就是大模型通过执行你自己的电脑的命令再结合大模型自身的能力得到你想要的反馈。 上面的说明也许太直白了。简单说下架构
简单的架构说明
- 指令接收层:通过对接各种对话工具api实现消息的接收与发送。由于可以接受很多的对话工具。而且消息还要发送给模型。所以需要一个路由知道使用那个对话工具。还要将对话工具的消息解析成模型的输入。同时还要模型返回的消息转成对话工具的消息结构返回
- 大模型管理:这里主要就是调用模型能力。调用模型能力还要让本地机器执行指令。
- 信息的持久化:对话信息的管理
以上三步通过sping ai架构都有成熟的接入方法。
当我看完基本的原理说明之后我突然想到如何让模型操作我的电脑,让个人电脑成为模型的助手一起为我服务呢? 一个很简单的想法就是模型如何执行电脑指令呢? 我突然想到了FunctionCall。以前叫functionCall。最近大家都叫Tools。还有一种技术是MCP。现在又出来一个skills。之前的文章说过FC、Tools和MCP的区别。这里简单说一下skills的理解。skills可以理解成给Tools或者MCP增加一个详细的文档说明。让模型知道如何调用Tools或者MCP方法。其实之前MCP的listtools请求就可以得到方法的详细说明了。只是skills更加明确的要求定义说明文件。例如Markdown文件。
下面再回到主题,如何让模型操作我的电脑?通过FC、Tools、MCP、skills都可以。这里使用Tools说明一下。 这里直接粘贴一些核心代码。大家复制到本地执行就可以了。其实原理很简单,就是封装SSH链接,然后执行linux命令。
public class ControlPCTool {
@Tool(name = "runSSHCommand", description = "执行linux命令的工具。入参是需要执行的命令。返回值是命令的返回。例如 入参: ls -l 返回值是:total 4\n" +
"drwxr-xr-x 2 root root 4096 Feb 13 20:13 abc\n" +
"exit-status: 0")
public static String runSSHCommand(String command) {
String result = "";
String host = ""; // SSH服务器地址
String user = ""; // SSH用户名
String password = ""; // SSH密码
int port = 22; // SSH端口,默认为22
JSch jsch = new JSch();
Session session = null;
try {
// 创建SSH会话
session = jsch.getSession(user, host, port);
session.setPassword(password);
// 设置一些会话配置
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 连接SSH服务器
session.connect();
// 打开执行远程命令的通道
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setCommand(command);// 执行的远程命令
channelExec.setInputStream(null);
channelExec.setErrStream(System.err);
java.io.InputStream in = channelExec.getInputStream();
channelExec.connect();
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) break;
String info = new String(tmp, 0, i);
System.out.print(info);
result += info;
}
if (channelExec.isClosed()) {
if (in.available() > 0) continue;
System.out.println("exit-status: " + channelExec.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
// 断开通道和会话
channelExec.disconnect();
session.disconnect();
} catch (JSchException | IOException e) {
e.printStackTrace();
}
return result;
}
}
上面就是通过Tools使用SSH登陆linux系统执行命令的例子。具体框架的代码大家可以去spring官网查看。
上面是通过封装Tools。如果我们写一个MCP方法是不是大模型一样调用。写一个skills方法是不是也一样
下面演示一下执行效果:
我问模型:现在几点了。
模型会直接调用Tools执行linux的date命令。得到当前的时间返回。
现在是 2026 年 2 月 13 日,星期五,20:53:04(CST,中国标准时间)。
我问模型我的电脑什么配置。
模型会通过调用Tools执行linux的uname -a、 lscpu等一堆命令然后整理之后返回。
这里仅仅是起一个抛砖引玉。大家可以发散思维。是不是电脑的所有能力都可以通过命令执行。或者我们自己写一个客户端在本地接受远程命令(增加权限管理)。启动电脑里面的各种工具。都让大模型可以使用。例如命令行浏览器。是不是大模型就可以通过命令上网了? 如果我们写一个常驻进程让模型24小时不间断的执行linux命令或者使用我们自己的电脑是不是就有一个24不吃不喝的人为我们工作了。 想想是不是很强大
由于本人仅仅尝试使用。所以没有深入的挖掘电脑潜力。而且仅仅适合自己尝试。不适合开放功能,因为安全方面很难保证。但是作为个人应用足够了。