前言
OpenClaw,江湖人稱“小龍蝦”,想必你早有耳聞。有人把它捧上天,說它無所不能;有人把它踩到底,說它一無是處。有人花 499 請人上門安裝,有人又掏 299 請人卸載。你說它是智商稅?它又像是未來的敲門磚。
但我想告訴你,這些評價都不算數(shù)。想知道它到底能干啥,得先搞明白它怎么干。今天,咱們不吹不黑,親手?jǐn)]一只小龍蝦(OpenClaw),一步步揭開它的神秘面紗。
從最簡單的對話開始
讓我們回到那個最初的起點,大語言模型。沒錯,就是這個只會一問一答的“小玩具”。相信你一定用過網(wǎng)頁版的AI聊天工具,但如果你想在程序里調(diào)用它,就得用另一種方式: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),是阿里巴巴集團旗下的通義實驗室自主研發(fā)的超大規(guī)模語言模型。我可以協(xié)助你回答問題、創(chuàng)作內(nèi)容、編寫代碼、分析文檔等。有什么我可以幫你的嗎?
恭喜你,你已經(jīng)成功通過代碼來和大模型對話了。
但是這里是寫死的 你是誰? ,能不能改成由用戶手動輸入呢?

很簡單,增加一行代碼就行。
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)

從終端獲取用戶輸入,存到變量 user_input 中,再傳給大模型。這樣就實現(xiàn)了自定義輸入問題,大模型回答。

當(dāng)然了,這樣還不夠。相信你也看到了,一次對話,程序就終止了。我們需要給程序加一個循環(huán),回答完成后,繼續(xù)等待我們的提問。
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)

這樣我們就能與大模型進行持續(xù)的對話了。

那假如此時我們再來一個追問:再加1等于幾呢?

照理來說,大模型應(yīng)該回答:3。但是呢,它好像并不記得我剛剛問了什么。
那為什么會這樣呢?很簡單,因為大模型是一個無狀態(tài)的模型。每次對話,它都是獨立運行的,不會記住之前的任何信息。
要解決這個問題也很簡單,在每次跟大模型對話的時候把之前的內(nèi)容加上去就好了。
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 = []
# 持續(xù)對話
while True:
user_input = input("請輸入你的問題:")
# 添加用戶消息到對話歷史
messages.append({"role": "user", "content": user_input})
# 調(diào)用API,傳入對話歷史
response = client.responses.create(
model="qwen3.5-plus",
input=messages,
)
# 提取助手回復(fù)
assistant_response = response.output_text
# 添加助手回復(fù)到對話歷史
messages.append({"role": "assistant", "content": assistant_response})
print(assistant_response)

那運行一下試試看。

沒問題,大模型現(xiàn)在會記住之前的對話了。現(xiàn)在我們寫的AI程序已經(jīng)跟剛發(fā)布的ChatGPT沒啥區(qū)別了。
從對話到行動:讓AI幫你干活
接下來,我們更進一步,實現(xiàn)一個能操作本地文件的Agent。
哎呀呀,一提到Agent,是不是覺得難度一下就上去了。別擔(dān)心,我會用最基本的代碼實現(xiàn)一個Agent,教你看透本質(zhì)。
Agent的本質(zhì)就是大模型+工具。所謂工具就是能幫我們干事。
那好,我現(xiàn)在就有一個需求,讓Agent幫我在本地電腦創(chuàng)建一個hello.txt的文件,內(nèi)容是:潘高陪你學(xué)編程。

我們能看到大模型回復(fù)的是教我們創(chuàng)建文件的命令 echo "潘高陪你學(xué)編程" > hello.txt 。雖然照大模型說的執(zhí)行這個命令就可以完成任務(wù),但是還需要我們粘貼復(fù)制,沒有辦法自動化實現(xiàn)。那這該怎么辦呢?
很簡單,我們只需要提前告訴大模型,如果需要用到命令,就回復(fù) 命令:... 。然后再用程序執(zhí)行命令,最后把執(zhí)行命令的返回信息給大模型,讓大模型判斷是否結(jié)束任務(wù)。
import os
import subprocess
from openai import OpenAI
SYSTEM_PROMPT = """你是一個可以驅(qū)動本機命令行的助手。
規(guī)則:
1) 當(dāng)你需要程序執(zhí)行命令時,你必須且只能回復(fù)一行:命令:<要執(zhí)行的命令>
- “命令:”后面的內(nèi)容就是命令本體,不要輸出任何額外解釋、前后綴、Markdown、代碼塊或多行文本。
2) 當(dāng)你不需要再執(zhí)行命令時,請用自然語言給出最終結(jié)論/答復(fù)(這時不要以“命令:”開頭)。
3) 程序會把命令的執(zhí)行結(jié)果(stdout/stderr/退出碼/當(dāng)前目錄)回傳給你;你據(jù)此決定繼續(xù)發(fā)命令還是結(jié)束。
"""
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}]
# 持續(xù)對話
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"命令執(zhí)行結(jié)果:\n命令:{cmd}\n{result}",
}
)

運行程序,輸入需求??梢钥吹奖镜鼐蛣?chuàng)建了一個文件hello.txt,內(nèi)容是:潘高陪你學(xué)編程。

恭喜你,才加了這么幾行代碼就進化成了一個Agent。
不要小看咱們這個例子中只是一個簡單的創(chuàng)建文件的規(guī)則,后續(xù)你可以寫任意復(fù)雜的規(guī)則,包括:調(diào)用API,讀寫文件,發(fā)送郵件,訪問網(wǎng)頁等等。
當(dāng)然了,我們可以把這些復(fù)雜的規(guī)則單獨在寫一個文件里面,然后在程序中讀取這個文件告訴大模型,這個文件就是SKILL.md。比如是以下這個天氣SKILL.md:
如果需要獲取天氣,就用如下命令,XXX為地區(qū)
curl http://shanhe.kim/api/za/tianqi.php\?city\=XXX
同樣的提問,有了這個天氣SKILL.md,大模型的回復(fù)就會精準(zhǔn)得多。這下你知道為啥有的人的龍蝦什么都不會,而有的人給龍蝦裝了一堆SKILL之后,就變得厲害了。就和我們上面說的一樣,你只是提前把操作說明告訴它而已。不是它厲害,而是你厲害。哈哈哈~
這時候,咱們按這個邏輯寫的程序,已經(jīng)是現(xiàn)今最智能的Agent了。
從本地到遠(yuǎn)程,手機也能控制電腦
那聰明的朋友要說了,人家龍蝦可是能通過手機遠(yuǎn)程控制電腦的,比你這黑框要高級多了。好吧,這的確是龍蝦成功的地方。之前智能體基本上只有專業(yè)的人才會用。龍蝦是第一次通過手機聊天的形式,讓普通的人也能用上智能體。
手機對話,這同樣很簡單。我讓AI幫我補充一下代碼。在本地啟用一個HTTP服務(wù)器,然后在手機上訪問這個服務(wù)器,就可以和AI進行對話了。
(代碼我就不貼出來了,讓AI寫的。給大家看看效果)


見證奇跡的時刻,我們成功地用手機遠(yuǎn)程控制了電腦。咋樣,10分鐘手?jǐn)]一個小龍蝦(OpenClaw),你也嘗試一下唄。