這一年我每天都在用 AI 代理(AI Agent):會自己讀檔案、自己查資料、自己決定下一步要做什麼的那種工具。從以前卡住就翻 Stack Overflow,到現在直接把需求丟給一個會自己動手的東西,中間這幾年,抽象層一層一層往上疊,LangChain、各種代理框架、各種工具,好像每個月都有更高的一層冒出來。
用是用得很順,但身為一個軟體工程師,我想把它拆開來看。
先講結論:代理不是某一天突然發表的一種新模型。
它是在一個什麼都不記得的大型語言模型(LLM)外面,一層一層疊上去的工程。中間那幾層:怎麼跟它講話、怎麼把你的資料塞給它、怎麼讓它記得上次聊過什麼、怎麼讓它真的動手做事、怎麼讓它自己決定下一步,每一層都在補上一層補不了的洞。
這個系列就照這個順序走七層:原始提示 → 結構與範例 → 外部知識 → 記憶 → 工具與技能 → 自主代理 → 多代理協作。
現在講 AI,大家的體感好像是 2022 年底才開始的,但這條線拉得比想像中長很多:
換句話說:如果你今年還不到 68 歲,感知器比你老。 這條路走了六十幾年,只是最後這三年才走到我們手機上。
這裡有個我覺得最有意思的巧合。
1966 年,MIT 的 Joseph Weizenbaum 發表了 ELIZA。做法非常陽春:把你的句子做模式比對,再套回一個反問句。你說「我最近很累」,它回「你為什麼覺得自己很累?」就這樣,裡面完全沒有任何理解。
結果連 Weizenbaum 自己都感到不安:人們開始對它掏心掏肺,甚至要求跟它單獨相處。這個現象後來被叫做「ELIZA 效應」,一個對話介面,光靠「可以對話」這件事本身,就足以讓人覺得對面有個懂你的東西。
六十年後,我們還在同一個框框裡。你今天打開任何一個 AI 工具,看到的還是一個輸入框、一則一則往下排的訊息。
補一個 2025 年的後續:大家一直以為 ELIZA 的原始碼早就失傳了,結果有人在 Weizenbaum 留在 MIT 的檔案裡,把 1965 年的 MAD-SLIP 原始碼翻了出來,還讓它在模擬的 IBM 7094 上重新跑起來(論文、程式碼)。想知道六十年前的「聊天機器人」長什麼樣子,你現在可以自己跑一次。
這個介面之所以關鍵,是因為它決定了我們要把需求翻譯成什麼形式送進去,一段文字。
那段文字,就是提示詞(prompt)。整個系列的第一層,就從這裡開始。
這是我覺得最該先講清楚的一組詞,因為後面七層全部建立在這個分別上。
| 面向 | 大型語言模型(LLM) | 我們口中的「AI 工具」 |
|---|---|---|
| 是什麼 | 一組訓練好的權重,本質上是一個函式 | 一整套產品:模型 + 外面那幾層工程 |
| 輸入與輸出 | 文字進去,文字出來 | 對話、檔案、搜尋、操作,輸出也不只是文字 |
| 記憶 | 沒有,每次呼叫都是獨立的 | 有,但那是外面的程式幫它存的 |
| 你的資料 | 不知道 | 知道,因為有人把資料查出來塞進去了 |
| 動手做事 | 不能,它只會產生文字 | 可以,因為外面接了工具 |
| 變動速度 | 慢,以模型版本計 | 快,每隔幾週就多一個功能 |
順帶一提,把左邊那一欄做出來的人裡,最有名的一位是 Geoffrey Hinton,英裔加拿大籍、多倫多大學,上面 1986 年的反向傳播和 2012 年的 AlexNet 都有他。他在 2018 年與 Yoshua Bengio、Yann LeCun 共同獲得圖靈獎,2024 年又與 John Hopfield 共同獲得諾貝爾物理獎(是物理獎,這點不少報導寫錯)。大家叫他「AI 教父」。
但請注意:他們做的是左邊那一欄。右邊那一欄(我們每天在用的東西)是這幾年才疊上去的,而且疊的人不只是研究員,更多是寫應用的工程師。
不用寫程式,打開 Claude 就可以做。
第一步:開一個新對話,跟它說「我叫 Jim,請記住這件事」。它會很客氣地答應。
第二步:再開一個全新的對話,只問一句:「我叫什麼名字?」
它不知道。
這不是模型不夠聰明,而是它從一開始就沒有記憶。每一次請求都是獨立的:你送什麼進去,它就只看得到什麼。我們在同一個對話框裡體驗到的「它記得我剛剛說的話」,是程式每一輪都把整段對話重新送了一次,那個「記憶」是工程做出來的,不是模型本身有的。
同樣的道理再往下推兩層:它不知道你的事(沒有人把你的文件放進去,它就是不知道),而且它不能做任何事(它只會輸出文字,不會真的去改檔案、寄信、查你的行事曆)。
沒有記憶、不知道你的事、不能動手。
你今天用的每一個代理功能,本質上都是在補這三個洞。
第一層|原始提示
什麼都還沒補,就是一個乾淨的新對話。
把剛剛那個實驗講得再白一點:當你在一個全新的對話裡打下一句話,實際被送出去的,就只有那句話。
當然,中間還有大量工程在跑:切詞、編碼、矩陣運算、各種最佳化,但從「你到底餵了什麼給它」這個角度看,送出去的東西結構上就是這麼簡單:
{
"model": "claude-opus-5",
"max_tokens": 1024,
"messages": [
{ "role": "user", "content": "我叫 Jim,請記住這件事。" }
]
}
一個模型名稱、一個長度上限、一個訊息陣列。你在介面上做的所有事:換模型、上傳檔案、開新對話,最後都會被壓成這個形狀送出去。這個結構會跟著我們走完七層,後面每加一層,都是在這個 messages 陣列裡多塞一點東西,或是在外面多包一層流程。
還有一件事:那句中文也不是以「字」的形式進去的。它會先被切成詞元(token),一串整數。要知道一段文字到底佔多少,最可靠的方式是直接問 API:
POST /v1/messages/count_tokens
回來的 input_tokens 就是它真正的長度。這個數字同時決定三件事:你多快撞到用量上限、一次塞得進多少東西、以及它回得多快。後面會有一篇專門拆這件事。
模型拿到之後做的事,說穿了是一路猜下一個字,根據訓練時看過的海量文字,算出「接在這串字後面最可能出現什麼」,吐出來,再把吐出來的接回去繼續猜。如此重複,直到它判斷該停了。
而這裡就是大型語言模型跟 AI 工具分岔的地方:
所以「模型變聰明了」跟「工具把更對的東西塞進去了」,是兩種完全不同的進步。
好用在哪:門檻是零。不用設定、不用上傳、不用接任何東西,打開就能用。而且對於「不依賴你私有資料」的任務:翻譯、改寫、解釋一個通用概念、把一段結構鬆散的文字整理順,這一層其實就夠了,再往上疊都是多的。
卡在哪:也正是那三個洞。
這三件事,沒有一件能靠「把提示詞寫得更用力」解決。它們需要的是外面再加一層。
而下一層(結構與範例)要加的,是最便宜、也最有感的一層:把話講清楚的方法。
下面是這一篇用到、以及我自己覺得值得往下鑽的材料。
想搞懂詞元
想看懂 Transformer
原始論文(想直接讀一手的)
同一件事,換個問法,差在哪裡。
我會拿同一個需求,用兩種寫法各問一次,把兩邊的結果並排放上來,然後回答一個更重要的問題:為什麼「把話講清楚」這件事,對一個什麼都不記得的模型來說,會差這麼多。