所有入門單元免費開放 · 課程內容持續更新中

LLM 是怎麼「寫」程式的

理解大型語言模型產生程式碼的基本原理,你就知道它為什麼寫得又快又流暢,卻又可能一本正經地出錯。

第 4.1 堂約 12 分鐘

當你在 Claude(或 ChatGPT、Gemini)裡輸入「幫我寫一個把台幣換成日圓的 Python 程式」,幾秒鐘後就出現一段排版整齊、還附註解的程式碼。看起來像有個資深工程師坐在對面。但它到底是怎麼「想」出來的?

搞懂這件事不是為了當研究員,而是為了知道:什麼時候可以放心交給它,什麼時候要特別小心。

一次猜一小段:下一個 token 預測

大型語言模型(LLM)做的事情,說穿了很單純:根據前面所有的文字,預測下一小段最可能出現的文字,然後把它接上去,再預測下一段,一直重複。

這「一小段」叫做 token,可能是一個英文單字、一個符號,或是半個中文詞。對模型來說,程式碼和中文作文沒有本質差別,都是一串 token。

舉例來說,當前面已經出現:

import requests

def get_rate(currency):
    url = "https://api.example.com/rates"
    response = requests.

模型會判斷,接在 requests. 後面最可能的是 get,接著是 (url……它不是真的「呼叫」了那個網站,也沒有在腦中執行程式,它只是寫出在這個情境下「最像正確答案」的下一段文字。

流程圖:模型看著已寫出的程式碼,替下一個 token 的候選(get、post、fetch)打分數,挑出最可能的 get 接上,然後重複

最常見的選項通常是對的,但「常見」和「正確」不是同一件事。

它從哪裡學會寫程式?

模型在訓練階段讀過非常大量的文字,其中包含公開的程式碼、技術文件、教學文章、問答討論。它從中學到的是模式:

  • 讀 CSV 檔通常會用哪些函式
  • 寫一個 Flask 路由大概長什麼樣子
  • 某個錯誤訊息常見的解法是什麼

這帶來兩個直接的結果:

情況 表現 原因
常見任務,例如排序、讀檔、簡單網頁 通常很好 訓練資料裡看過非常多類似範例
熱門套件的常用功能 通常不錯 文件和教學很多
冷門套件、公司內部系統 容易亂猜 幾乎沒看過,只能拼湊
最近才改版的工具 可能用舊寫法 訓練資料有截止時間

上下文視窗:它這一次看得到什麼

每次對話時,模型能參考的內容有上限,這叫做上下文視窗(context window)。你貼上的程式碼、之前的對話、你上傳的檔案,都會放進這個視窗裡。

你可以把它想成一張工作桌:桌上放了什麼,它就能參考什麼;沒放上去的,它就看不到。

概念圖:上下文視窗像工作桌,桌上有你的提問、貼上的程式碼、之前的對話、上傳的檔案;桌外是沒貼的檔案、電腦環境、你心裡的期待、套件最新版本

之後會學到的 Claude Code 這類 Agent,厲害的地方之一就是能自己去專案裡「把需要的檔案拿上桌」,不必你一份一份貼。

這解釋了很多常見狀況:

  • 你只貼了一個函式,問「為什麼整個程式跑不動」,它只能根據那個函式猜。
  • 對話拉得很長之後,它好像「忘了」一開始說好的規則。
  • 你沒說用 Python 3 還是哪個框架,它就挑最常見的那種。

所以在後面的課程裡,你會一直聽到同一句話:把必要的資訊放上桌。

為什麼它很流暢,卻可能是錯的

因為模型的目標是產生「看起來合理」的文字,所以它寫出的程式碼幾乎總是語氣肯定、格式漂亮。問題是,看起來合理和實際正確是兩回事。

常見的錯誤類型:

  1. 編造不存在的函式或參數:名字取得很像真的,例如某個套件根本沒有的 convert_currency()。
  2. 用了過時的寫法:套件改版後舊語法失效,它還在用。
  3. 邏輯有小洞:大部分情況對,但遇到空清單、負數、跨年日期就出錯。
  4. 自信地解釋錯的原因:除錯時給一個聽起來很專業、其實不相關的解釋。

那我們該怎麼看待它?

比較好的心態是:AI 是一個讀過大量程式碼、手速極快,但沒辦法替你負責的助手。

  • 它很擅長:寫出初稿、提供常見做法、解釋程式、列出可能的錯誤原因。
  • 你負責:說清楚需求、提供正確的上下文、執行並驗證結果、做最後判斷。

AI 會放大你的能力。你越清楚自己要什麼、越會檢查,它就越有用。

可以這樣問 AI,測試它的極限

請用 Python 寫一個函式,把台幣金額換算成日圓。寫完之後,請告訴我:

  1. 這段程式用到哪些外部套件或 API?
  2. 哪些部分是你「推測」的,需要我自己去確認?
  3. 有哪些輸入可能讓這個函式出錯?
行動練習
  1. 打開任何一個 AI 聊天工具,請它寫一個「匯率換算」的 Python 小程式。
  2. 再開一個新對話,用完全一樣的問題問一次,比較兩次的答案有什麼不同。
  3. 在第三次提問時,額外說明「使用 Python 3、不要用任何外部套件、匯率寫死為 1 台幣兌換 4.7 日圓」,觀察答案變得多一致。
  4. 寫下一句心得:資訊給得越完整,答案有什麼變化?

讀完了嗎?

標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。

卡住了?讓 AI 當你的家教複製這段提問範本,貼到 Claude 或其他 AI 工具,再補上你卡住的地方。

留言與討論

卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。

留言區即將開放。現在可以先到 GitHub 討論區 發問,或看看 交流頁 的其他管道。