10分钟教你手撸一个小龙虾(OpenClaw)

0 阅读7分钟

前言

OpenClaw,江湖人称“小龙虾”,想必你早有耳闻。有人把它捧上天,说它无所不能;有人把它踩到底,说它一无是处。有人花 499 请人上门安装,有人又掏 299 请人卸载。你说它是智商税?它又像是未来的敲门砖。

但我想告诉你,这些评价都不算数。想知道它到底能干啥,得先搞明白它怎么干。今天,咱们不吹不黑,亲手撸一只小龙虾(OpenClaw),一步步揭开它的神秘面纱。

从最简单的对话开始

让我们回到那个最初的起点,大语言模型。没错,就是这个只会一问一答的“小玩具”。相信你一定用过网页版的AI聊天工具,但如果你想在程序里调用它,就得用另一种方式:API接口。

别怕代码,大部分时候你只需要把官方给的示例贴进去,就能跑起来。


import os

  


from openai import OpenAI

  


client = OpenAI(

api_key=os.getenv("BAILIAN_API_KEY"),

base_url="https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",

)

  


response = client.responses.create(model="qwen3.5-plus", input="你是谁?")

  


print(response.output_text)

# 你好!我是通义千问(Qwen),是阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我可以协助你回答问题、创作内容、编写代码、分析文档等。有什么我可以帮你的吗?

恭喜你,你已经成功通过代码来和大模型对话了。

但是这里是写死的 你是谁? ,能不能改成由用户手动输入呢?

10分钟教你手撸一个小龙虾(OpenClaw)-1.png

很简单,增加一行代码就行。


import os

  


from openai import OpenAI

  


client = OpenAI(

api_key=os.getenv("BAILIAN_API_KEY"),

base_url="https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",

)

  


# 从用户输入获取问题

user_input = input("请输入你的问题:")

  


response = client.responses.create(model="qwen3.5-plus", input=user_input)

  


print(response.output_text)

10分钟教你手撸一个小龙虾(OpenClaw)-2.png

从终端获取用户输入,存到变量 user_input 中,再传给大模型。这样就实现了自定义输入问题,大模型回答。

10分钟教你手撸一个小龙虾(OpenClaw)-3.png

当然了,这样还不够。相信你也看到了,一次对话,程序就终止了。我们需要给程序加一个循环,回答完成后,继续等待我们的提问。


import os

  


from openai import OpenAI

  


client = OpenAI(

api_key=os.getenv("BAILIAN_API_KEY"),

base_url="https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",

)

  


while True:

# 从用户输入获取问题

user_input = input("请输入你的问题:")

  


response = client.responses.create(model="qwen3.5-plus", input=user_input)

  


print(response.output_text)

10分钟教你手撸一个小龙虾(OpenClaw)-4.png

这样我们就能与大模型进行持续的对话了。

10分钟教你手撸一个小龙虾(OpenClaw)-5.png

那假如此时我们再来一个追问:再加1等于几呢?

10分钟教你手撸一个小龙虾(OpenClaw)-6.png

照理来说,大模型应该回答:3。但是呢,它好像并不记得我刚刚问了什么。

那为什么会这样呢?很简单,因为大模型是一个无状态的模型。每次对话,它都是独立运行的,不会记住之前的任何信息。

要解决这个问题也很简单,在每次跟大模型对话的时候把之前的内容加上去就好了。


import os

  


from openai import OpenAI

  


client = OpenAI(

api_key=os.getenv("BAILIAN_API_KEY"),

base_url="https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",

)

  


messages = []

  


# 持续对话

while True:

user_input = input("请输入你的问题:")

  


# 添加用户消息到对话历史

messages.append({"role": "user", "content": user_input})

  


# 调用API,传入对话历史

response = client.responses.create(

model="qwen3.5-plus",

input=messages,

)

  


# 提取助手回复

assistant_response = response.output_text

  


# 添加助手回复到对话历史

messages.append({"role": "assistant", "content": assistant_response})

  


print(assistant_response)

10分钟教你手撸一个小龙虾(OpenClaw)-7.png

那运行一下试试看。

10分钟教你手撸一个小龙虾(OpenClaw)-8.png

没问题,大模型现在会记住之前的对话了。现在我们写的AI程序已经跟刚发布的ChatGPT没啥区别了。

从对话到行动:让AI帮你干活

接下来,我们更进一步,实现一个能操作本地文件的Agent。

哎呀呀,一提到Agent,是不是觉得难度一下就上去了。别担心,我会用最基本的代码实现一个Agent,教你看透本质。

Agent的本质就是大模型+工具。所谓工具就是能帮我们干事。

那好,我现在就有一个需求,让Agent帮我在本地电脑创建一个hello.txt的文件,内容是:潘高陪你学编程。

10分钟教你手撸一个小龙虾(OpenClaw)-9.png

我们能看到大模型回复的是教我们创建文件的命令 echo "潘高陪你学编程" > hello.txt 。虽然照大模型说的执行这个命令就可以完成任务,但是还需要我们粘贴复制,没有办法自动化实现。那这该怎么办呢?

很简单,我们只需要提前告诉大模型,如果需要用到命令,就回复 命令:... 。然后再用程序执行命令,最后把执行命令的返回信息给大模型,让大模型判断是否结束任务。


import os

import subprocess

  


from openai import OpenAI

  


SYSTEM_PROMPT = """你是一个可以驱动本机命令行的助手。

  


规则:

1) 当你需要程序执行命令时,你必须且只能回复一行:命令:<要执行的命令>

- “命令:”后面的内容就是命令本体,不要输出任何额外解释、前后缀、Markdown、代码块或多行文本。

2) 当你不需要再执行命令时,请用自然语言给出最终结论/答复(这时不要以“命令:”开头)。

3) 程序会把命令的执行结果(stdout/stderr/退出码/当前目录)回传给你;你据此决定继续发命令还是结束。

"""

  
  


def _extract_command(text):

if not text:

return None

for line in text.splitlines():

s = line.strip()

if s.startswith("命令:"):

cmd = s[len("命令:") :].strip()

return cmd or None

return None

  
  


client = OpenAI(api_key=os.getenv("BAILIAN_API_KEY"), base_url="https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1")

  


messages = [{"role": "system", "content": SYSTEM_PROMPT}]

  


# 持续对话

while True:

user_input = input("请输入你的问题:")

  


# 添加用户消息到对话历史

messages.append({"role": "user", "content": user_input})

  


while True:

response = client.responses.create(

model="qwen3.5-plus",

input=messages,

)

assistant_response = response.output_text or ""

messages.append({"role": "assistant", "content": assistant_response})

  


cmd = _extract_command(assistant_response)

if not cmd:

print(assistant_response)

break

  


p = subprocess.run(

cmd,

shell=True,

text=True,

capture_output=True,

)

out = ((p.stdout or "") + (p.stderr or "")).strip() or "(无输出)"

result = f"exit_code={p.returncode}\n{out}"

messages.append(

{

"role": "user",

"content": f"命令执行结果:\n命令:{cmd}\n{result}",

}

)

10分钟教你手撸一个小龙虾(OpenClaw)-10.png

运行程序,输入需求。可以看到本地就创建了一个文件hello.txt,内容是:潘高陪你学编程。

10分钟教你手撸一个小龙虾(OpenClaw)-11.png

恭喜你,才加了这么几行代码就进化成了一个Agent。

不要小看咱们这个例子中只是一个简单的创建文件的规则,后续你可以写任意复杂的规则,包括:调用API,读写文件,发送邮件,访问网页等等。

当然了,我们可以把这些复杂的规则单独在写一个文件里面,然后在程序中读取这个文件告诉大模型,这个文件就是SKILL.md。比如是以下这个天气SKILL.md:


如果需要获取天气,就用如下命令,XXX为地区

curl http://shanhe.kim/api/za/tianqi.php\?city\=XXX

同样的提问,有了这个天气SKILL.md,大模型的回复就会精准得多。这下你知道为啥有的人的龙虾什么都不会,而有的人给龙虾装了一堆SKILL之后,就变得厉害了。就和我们上面说的一样,你只是提前把操作说明告诉它而已。不是它厉害,而是你厉害。哈哈哈~

这时候,咱们按这个逻辑写的程序,已经是现今最智能的Agent了。

从本地到远程,手机也能控制电脑

那聪明的朋友要说了,人家龙虾可是能通过手机远程控制电脑的,比你这黑框要高级多了。好吧,这的确是龙虾成功的地方。之前智能体基本上只有专业的人才会用。龙虾是第一次通过手机聊天的形式,让普通的人也能用上智能体。

手机对话,这同样很简单。我让AI帮我补充一下代码。在本地启用一个HTTP服务器,然后在手机上访问这个服务器,就可以和AI进行对话了。

(代码我就不贴出来了,让AI写的。给大家看看效果)

10分钟教你手撸一个小龙虾(OpenClaw)-12.png

10分钟教你手撸一个小龙虾(OpenClaw)-13.png

见证奇迹的时刻,我们成功地用手机远程控制了电脑。咋样,10分钟手撸一个小龙虾(OpenClaw),你也尝试一下呗。


更多编程教学请关注公众号:潘高陪你学编程

image