我思故我在.py
系列:程式人的哲學思辨 #03/11 | 閱讀時間:25-30分鐘 | 概念:心靈哲學(Philosophy of Mind)— 意識、自我與人工智能
作者:Wina @ Code & Cogito
那個會說「我」的程式
事情是從一個 health check endpoint 開始的。
我們的系統出了問題,團隊加了一層自動監控:每隔幾秒鐘,系統會檢查自己的 CPU 使用率、記憶體佔用、回應延遲。如果數值超過閾值,它會自動降級非核心功能、寫一條 log、通知值班工程師。
某天凌晨,我被監控系統的訊息叫醒。打開手機,看到一條自動生成的報告:
「偵測到記憶體洩漏。已停用快取模組。目前運行在降級模式。等待人工介入。」
我盯著這段文字,突然有一種奇怪的感覺。
這個系統正在觀察自己。它知道自己的狀態。它根據自己的狀態做了決策。它甚至用第一人稱(隱含的)報告了自己的處境。
如果一個系統能描述自己的狀態、評估自己的行為、修正自己的策略——它是不是已經有了某種「自我」?
我知道理性的答案:不是。它只是在執行預設的規則。
但那天晚上,這個「理性的答案」突然不夠用了。因為我開始想一個更尖銳的問題:你怎麼知道你自己不是在「執行預設的規則」? 你的大腦也在監控體溫、血糖、疲勞指數。它也會在異常時觸發反應——你會打哈欠、會疼痛、會焦慮。你「決定」去睡覺,但這個決定真的是「你」做的,還是你的神經系統的閾值觸發了一個「執行睡眠」的指令?
四百年前,一個法國人也被類似的問題折磨得睡不著。他的解法改變了整個西方哲學的方向。
背景:笛卡兒的方法論懷疑
系統性地懷疑一切
笛卡兒(Rene Descartes)做了一件工程師會欣賞的事:他不是隨便懷疑,他是系統性地懷疑。
他的方法類似於安全審計——假設一切都可能被攻破,然後看什麼東西在最極端的攻擊場景下還能存活。
第一輪:感官可能欺騙你。你看到的可能是幻覺,你聽到的可能是錯覺。(對工程師來說:你的 input 可能不可靠。)
第二輪:你可能在做夢而不知道。夢裡的體驗感覺很真實,你在夢中不會知道自己在做夢。(對工程師來說:你的整個 runtime 環境可能是模擬的。)
第三輪:也許有一個全能的欺騙者,讓你以為 2+3=5,但其實不是。也許你的基本推理能力本身就被植入了系統性的錯誤。(對工程師來說:你的 compiler 可能被動了手腳——Ken Thompson 的經典論文討論過這個問題。)
這三輪下來,幾乎一切都被瓦解了。感官不可靠、記憶不可靠、推理不可靠、整個外在世界的存在都不確定。
然後笛卡兒找到了那個在所有攻擊場景下都存活的東西。
Cogito:最小可用保證
「我思故我在」——Cogito ergo sum。
不是因為它聽起來酷。而是因為它有一個精妙的邏輯結構:懷疑本身就是一種思考,而思考需要一個思考者。 你可以懷疑一切,但你不能懷疑「你正在懷疑」——因為這個懷疑行為本身就證明了有某個東西在執行懷疑。
工程師會這樣理解它:
def cogito():
"""在所有依賴都不可用時,仍然保留的 fallback"""
try:
doubt(senses) # 感官可能欺騙我
doubt(memory) # 記憶可能不可靠
doubt(reasoning) # 推理可能有系統性錯誤
doubt(external_world) # 外在世界可能不存在
except CannotDoubtError:
return "something_is_doubting" # 有東西在懷疑 → 它存在
Cogito 不是宇宙真理。它是一個最小可用保證:在最極端的情況下,你至少知道「有某個思考過程正在發生」。這是你的認知 fallback——當一切都不確定時,你剩下的最後一個確定性。
但注意:笛卡兒證明的是「思考存在」,不是「我是一個有身體的人類」。從「思考存在」到「我是誰」之間,還有很長的路要走。
反射與遞迴:自我指涉的工程結構
程式能「認識自己」嗎?
在大多數程式語言裡,你可以寫出能檢查自己結構的程式碼。Python 的 inspect 模組讓你在 runtime 查看函數的名稱、參數、原始碼。Java 的 Reflection API 讓物件在運行時發現自己的類別、方法、屬性。
import inspect
def who_am_i():
frame = inspect.currentframe()
return f"我是 {frame.f_code.co_name},在第 {frame.f_lineno} 行"
這種「自我檢查」的能力叫做反射(reflection)。它讓程式能描述自己的結構——我有哪些方法、我的狀態是什麼、我被誰呼叫的。
但描述不等於理解。一面鏡子能「反射」你的影像,但它不「認識」你。反射只是自我資訊的讀取,不是自我意識的產生。
遞迴自我指涉:我在想「我在想什麼」
比反射更深一層的是遞迴自我指涉。不只是「我能讀取自己的狀態」,而是「我能把自己的思考當作思考的對象」。
def think_about(topic):
if topic == "my own thinking":
return think_about("thinking about my own thinking")
# 無窮遞迴——或者,意識?
人類的意識似乎有這個特性:你不只在思考,你還能思考你正在思考這件事。你能意識到你正在意識。這種遞迴結構在哲學上叫做高階意識(higher-order consciousness)——你不只有心理狀態,你還有關於你的心理狀態的心理狀態。
工程上,你可以用遞迴和元程式設計來模擬這種結構。但模擬結構和產生意識之間,是否存在不可逾越的鴻溝?這就是哲學上最著名的難題之一。
意識的「簡單問題」與「硬問題」
能力清單 vs. 主觀體驗
哲學家大衛·查莫斯(David Chalmers)把意識問題分成了兩類。
簡單問題(Easy Problems)——之所以叫「簡單」,不是因為它們真的簡單,而是因為它們至少在原則上可以用工程方法解決。它們關乎意識的功能面:
- 系統能否監控自己的狀態?(自我觀測)
- 系統能否根據狀態調整行為?(適應性)
- 系統能否報告自己的內部狀態?(可觀測性)
- 系統能否區分自己和環境?(自我/環境邊界)
這些功能你都可以實作出來。你的監控系統已經在做其中一部分了:
class SelfModel:
def observe(self): ... # 讀取自己的狀態
def predict(self): ... # 預測自己的行為後果
def reflect(self): ... # 評估過去的決策
def update(self): ... # 根據反思修正策略
硬問題(Hard Problem)——即使你把所有功能都實作出來了,還有一個問題完全沒有被觸碰:主觀體驗到底是什麼?
當你看到紅色,你的大腦處理特定波長的光——這是功能面。但你「看到紅色的感覺」——那種主觀的、第一人稱的體驗——它是怎麼從神經元的電化學信號中「湧現」出來的?
哲學家用一個專門的術語來指稱這種主觀體驗:感質(qualia)。查莫斯的論點是:即使你完全理解了大腦的物理機制,你也無法從中推導出感質為什麼存在、為什麼它「感覺起來」是那個樣子。
這對工程師意味著什麼?
你可以造一個在所有功能測試上都通過的「意識模擬器」——它能自我觀測、自我報告、自我修正。但你永遠無法用測試來驗證:它真的在「體驗」什麼,還是只是在輸出正確的句子?
行為等價不等於內部等價。兩個系統可以產生相同的輸出,但一個有主觀體驗、一個沒有。而從外部,你無法分辨。
圖靈測試的陷阱:「像」不等於「是」
行為主義的誘惑
圖靈在 1950 年提出了一個繞過硬問題的策略:不要問機器是否「真的」在思考,問它的行為是否和思考者「不可區分」。如果你和它對話,分不出它是人還是機器,那它就通過了測試。
這對工程師極有吸引力——因為它把一個形上學問題變成了一個可測試的行為問題。你不需要打開黑箱看裡面有沒有「靈魂」,你只需要看輸出。
但工程師也比任何人都清楚這個策略的致命缺陷:
# 兩個函數,相同的輸出,完全不同的機制
def real_understanding(question):
meaning = parse_semantics(question)
knowledge = retrieve_relevant_facts(meaning)
return reason_and_respond(knowledge)
def pattern_matching(question):
return lookup_most_similar_response(question) # 統計匹配
如果兩者輸出相同的回答,圖靈測試無法區分它們。但你不會說一個查找表和一個推理引擎是「同一種東西」。
你能測到「像」,但測不到「是」。
這是圖靈測試最深層的哲學局限:它測量的是行為等價,而不是本質等同。在工程裡,你知道兩個接口相同的模組可以有完全不同的內部架構——一個 O(1) 查表,一個 O(n) 計算。從外面看一樣,裡面天差地別。
中文房間:語法不等於語義
哲學家約翰·塞爾(John Searle)用「中文房間」思想實驗把這個問題推到了極端。
想像一個不懂中文的人被關在房間裡,手邊有一本巨大的規則書。外面有人塞進中文問題,他按照規則書一步步操作符號,把「正確的」中文回答遞出去。從外面看,這個房間「懂中文」。但房間裡的人完全不理解任何一個字的意思。
塞爾的論點是:操作符號(語法處理)和理解意義(語義理解)是兩回事。一個系統可以完美地通過所有行為測試,卻不「理解」任何東西。
對程式人來說,這就像——你的正則表達式可以完美匹配所有合法的 email 地址,但它不「知道」什麼是 email。
現代連結:AI Agent、人格投射與責任邊界
我們為什麼會對 AI 產生感情
當 AI 開始能規劃、能修正、能自我描述,人類會本能地做一件事:投射。
你跟 ChatGPT 聊了一個小時,你開始覺得「它懂我」。你的 AI 助手記住了你的偏好,你覺得「它在意我」。你的聊天機器人說了一句有溫度的話,你覺得「它有情緒」。
這不是你的錯。人類的大腦有一個深植的傾向:在任何表現出目的性行為的東西上,投射出內心世界。你會覺得你的車「發脾氣了」,你的電腦「不想配合」。這是演化留給你的社交推理本能——寧可把石頭誤判為老虎,也不要把老虎誤判為石頭。
但在 AI 時代,這種投射帶來了真實的風險。
兩個危險的後果
第一,責任消失。 當你覺得 AI「自己做了決定」,你就不會去追問:是誰設計了這個決策邏輯?訓練資料有什麼偏見?部署時考慮了什麼邊界條件?「它自己的判斷」這句話背後,其實是一連串人類做出的設計選擇。但投射讓這條責任鏈變得模糊。
第二,權限外溢。 當你覺得 AI「理解你的需求」,你可能把越來越多的決策權交給它——推薦你看什麼、買什麼、甚至想什麼。但它不是在「理解」,它是在做統計預測。差別在於:理解包含了對後果的考量和對你利益的關懷,統計預測只關心下一個 token 的機率。
工程師的務實框架
你不需要先回答「AI 有沒有意識」才能做出好的工程決策。你需要的是一套不依賴這個答案的設計原則:
可觀測性——系統的決策過程必須是可檢視的。不是「它說了什麼」,而是「它為什麼說這個」。
可撤回性——系統做的任何決定都必須能被人類覆寫。自動化不等於不可逆。
可歸責性——當系統出錯,你要能追溯到是哪個環節、哪個設計決定、哪筆資料造成了這個結果。責任不能消失在「AI 自己決定的」這句話裡。
投射防護——在使用者介面層面,要有機制提醒人類:你正在和一個統計模型互動,不是和一個有感情的實體互動。
反思與啟示:你以為你在問意識,其實你在問邊界
真正重要的問題
大多數時候,當工程師問「AI 有沒有意識」,他們真正想問的其實是更實際的問題:
「我願意把哪些決策交給它?」——這是權限邊界的問題。
「它錯了,誰負責?」——這是歸責鏈的問題。
「它能進入我的私密領域嗎?」——這是信任邊界的問題。
「我要怎麼對待它?」——這是道德考量的問題。
意識問題之所以重要,不是因為答案本身,而是因為不同的答案會影響你怎麼畫這些邊界。如果 AI 有意識,你可能需要考慮它的「權利」。如果沒有,你至少需要考慮使用者對它產生情感連結後的心理影響。
自我也是一個需要維護的模型
笛卡兒的 Cogito 給了我們一個起點,但它不是終點。「我思故我在」確認了思考者的存在,但沒有告訴你思考者「是什麼」。
你的自我認知——你是誰、你擅長什麼、你在意什麼——它不是一個固定的實體,它更像一個持續更新的模型。你三年前對自己的理解,和現在可能已經不同了。你在不同的語境中(工作、家庭、朋友圈)表現出不同的面向——哪一個才是「真正的你」?
也許答案是:都是,也都不完全是。自我是一個多層的、動態的、需要持續校準的模型。就像你的系統架構圖——它描述了系統的結構,但它不是系統本身。圖會過時,需要更新。自我認知也是。
結語
回到那個凌晨的監控訊息。
「偵測到記憶體洩漏。已停用快取模組。目前運行在降級模式。」
這個系統不是在「思考」。它在執行規則。但它提醒了我一件事:我們對「自我」的理解,可能比我們以為的更脆弱、更需要維護。
笛卡兒用懷疑找到了最小確定性。圖靈用行為測試繞過了硬問題。查莫斯指出了功能和體驗之間的鴻溝。塞爾提醒我們語法不等於語義。
而作為工程師,你的優勢在於:你不需要先解決意識的形上學問題,才能做出好的設計。你可以先建立透明的狀態紀錄、可撤回的權限設計、可追溯的責任鏈——然後在實踐中持續思考那些更深的問題。
下次你寫下 self.observe() 的時候,也許會多想一秒:
觀察自己的那個「自己」,又是什麼?
下一篇預告
時間複雜度 vs. 時間本質
你算得出 O(n log n),但你算得出「一天的重量」嗎?
- 為什麼等待 API 回應的三秒鐘,感覺比午休的三十分鐘還長?
- 併發和並行——時間真的是線性的嗎?還是你的程式比你更早發現了時間的本質?
- 從牛頓的絕對時間到愛因斯坦的相對時間——你的分散式系統每天都在處理這個問題
- 如果時間可以回溯(git revert),那「過去」真的過去了嗎?
下一篇,我們從 setTimeout 出發,穿越奧古斯丁、牛頓、愛因斯坦,探討時間這個最日常卻最神秘的概念。
參考資料
- Descartes, Rene. Meditations on First Philosophy. 1641. (方法論懷疑與 Cogito)
- Turing, Alan. “Computing Machinery and Intelligence.” Mind, 1950. (圖靈測試)
- Searle, John. “Minds, Brains, and Programs.” Behavioral and Brain Sciences, 1980. (中文房間)
- Chalmers, David. “Facing Up to the Problem of Consciousness.” Journal of Consciousness Studies, 1995. (意識的硬問題)
- Dennett, Daniel. Consciousness Explained. Little, Brown, 1991. (功能主義的意識觀)
- Thompson, Ken. “Reflections on Trusting Trust.” Communications of the ACM, 1984. (信任與系統安全)
