Why Does AI Sound So Confident When It's Wrong?
TL;DR: A language model generates text by predicting the next most-plausible word, over and over. It’s optimizing for sounds right, not is right — so a true answer and a made-up one are produced the exact same way, in the exact same confident tone. There’s no separate step where it checks whether what it’s saying is true, and (by default) no “I don’t know” setting. So the confidence you hear tells you nothing about whether it’s correct. This is a simplified picture and the models are improving, but for now: fluent does not mean true. ...
How I Use ChatGPT, Claude, and Gemini Day to Day
TL;DR: I keep ChatGPT, Claude, and Gemini all open, and the habits that actually help are pretty boring: send quick lookups to ChatGPT or Gemini and longer/careful work (writing, code, anything that needs nuance) to Claude; spend ten seconds giving context before you ask; treat it as a back-and-forth instead of expecting one perfect answer; double-check anything load-bearing, because a confident tone isn’t proof; and don’t cram five requests into one prompt. None of this is deep; it’s just what stuck after using them a while, and it’ll probably shift as the models change. ...
為什麼 AI 唬爛的時候,口氣跟講真話一模一樣?
TL;DR:我自己的理解大概是這樣:AI 在做的事,從頭到尾就是「看著前面的字,猜下一個最順的字」。它優化的是「順不順、像不像話」,不是「對不對」。所以講對跟講錯用的是同一套力氣、同一種口氣,因為對它來說那根本是同一件事。它沒有內建一顆「我其實不知道」的按鈕,預設就是把話接得漂漂亮亮。篤定,跟它到底知不知道,是兩回事。(這是簡化過的講法,而且模型一直在進步,看看就好。) 你大概也被唬過吧。問 AI 一個東西,它回得有條有理、語氣篤定,你看了覺得很合理,結果拿去一查,整段是它編的。氣的不是它錯,是它錯得那麼自然,完全沒有一點心虛。 我一直覺得這件事滿有意思的。它到底為什麼可以這樣?後來大概想通一點,分享一下我自己的理解,不一定對。 它根本沒在分「對」跟「錯」 先講最核心的一件事:它其實沒有在判斷真假。 你可以把它想成一個超級加強版的手機輸入法。你打「我今天很」,輸入法會跳「開心」「累」「忙」給你選,對吧。它怎麼知道要跳這幾個?因為在它看過的一大堆句子裡,「我今天很」後面接這些字最順。它不是懂你今天過得好不好,它只是知道哪個字接上去最像人話。 AI 講白了就是這個東西放到很大很大。它從頭到尾在做的,就是看著前面那串字,猜「下一個最順的字是什麼」,吐出來,再看著變長的這串繼續猜下一個,一個字一個字接成一整段。(如果你好奇它眼裡的「字」其實長什麼樣,那是一種叫 token 的東西,我在 Token 是什麼?LLM 為何只讀 Token? 裡有聊,這段不看也完全不影響理解。) 重點是:它整個過程在追求的,是「順」,是「像不像話」。不是「對不對」。這兩個常常剛好一致——順的話通常也是對的——但它們不是同一件事。一旦分岔,它會毫不猶豫地選「順」,把一句很順但是錯的話講給你聽。它不是故意騙你,它就是少了一個「先查證、再決定要不要這樣講」的步驟,講之前沒人幫它把關。 那「很有自信」的口氣是哪來的 這就是它唬人的關鍵了。 它學講話的材料,是人類寫的一大堆文字。而人類寫東西的時候,口氣通常是滿肯定的——文章、教學、百科、回答,大家都把話講得斬釘截鐵。它把這些讀進去,順便也就學會了那種「篤定的腔」。所以它預設講出來的東西,聽起來就是一副很有把握的樣子,因為它模仿的就是這種樣子。(而且後面那層用人類評分做的微調也往同個方向推:直接、肯定、感覺有用的回答,通常分數比較高。) 問題是,它沒有另外長一顆「欸我這題其實不太確定」的按鈕。一個真人不知道的時候,會吞吐、會說「我猜啦」、會皺眉。它不會。它不知道的時候,還是用一模一樣的順、一模一樣的篤定,把一段話接給你。對它來說「我知道」跟「我不知道」這兩種狀態,輸出起來長得幾乎一樣。 同樣的篤定口氣,一個是真的、一個是它編的——光看語氣你分不出來。 所以「它講得很有信心」這件事,真的不能拿來當「它是對的」的證據。一點都不能。這大概是我覺得最該記住的一句。 它什麼時候最會一本正經地胡說 照這個邏輯推一下就猜得到:它最會掰的,是那種它其實沒什麼料的題目。 很冷門的、很新的、很細節的東西——某個沒什麼人寫過的小工具的參數、上禮拜才發生的事、某本書第幾頁講了什麼——它手上的料很薄。可是它又不能不接話,「猜下一個字」這個機制一啟動,它還是會生出一段讀起來很完整的東西給你。料越薄,它越是用想像力把空格填滿,而且填得一樣順。 所以有個滿好用的直覺:當你問的東西越冷門、越具體、越要求「精確」,你心裡的警報就該開得越大。它在這種地方翻車的姿勢,往往最優雅。 我自己是怎麼跟它相處的 知道這件事之後,其實也不用怕它,調整一下心態就好。 我的做法很簡單,就是把「順」跟「對」這兩件事在腦子裡分開。它講得順、講得好聽,我照收,當草稿、當靈感很好用。但只要是有名有姓、有數字、有日期、我打算拿去用的東西,我就不會它說了我就信,會自己再查一下。這條習慣我在前一篇 我每天開著三個 AI 的幾個小習慣 裡也有提到,這篇算是把背後的原因補上,講為什麼那條習慣值得養,大概就是因為這篇講的這件事。 說穿了就是:把它當一個口才很好、見多識廣、但偶爾會一本正經唬你的朋友。你會聽他講,但重要的事你會自己再確認一下,對吧。差不多就是這種距離。 最後,這只是我現在的理解 要老實說一下,上面整套講法是簡化過的,真要摳細節,裡面還有一堆東西我也沒講(也不一定全懂)。而且這東西一直在變。已經有人在想辦法讓模型學會講「我不太確定」、會附上它有多少把握、會去查證再回答。搞不好過個一兩年,「AI 很愛自信地唬爛」這個說法本身就過時了,那這篇也就可以收起來了。 不過至少以現在來說,下次它又用那種無比篤定的口氣回你一段話的時候,你心裡可以默默補一句:講得順,不代表它知道喔。
我每天開著三個 AI 聊天視窗,這陣子摸出來的幾個小習慣
TL;DR:我同時開著 ChatGPT、Gemini、Claude,大概摸出幾個習慣:快查的丟 ChatGPT 或 Gemini、要認真寫的丟 Claude;問之前先把脈絡跟「我想要什麼」講清楚;別期待一次到位,通常要追問幾輪;它語氣再篤定,重要的我還是會自己再查一下;一個問題別塞太多事進去。沒什麼高深的,就是用久了的手感而已,而且模型一直在變,搞不好過幾個月又不一樣了。 前陣子有朋友看我桌面,問說你怎麼同時開三個 AI 在那邊切來切去,不會亂嗎。我想了一下,其實也沒什麼大道理,就是用久了慢慢養出一些順手的習慣。不是什麼技巧,比較像是踩過幾次雷之後,自然就變成這樣用了。 這篇就隨便聊聊這幾個習慣好了。先講在前面:這些都是以現在的模型來說的手感,我也不確定對不對,你看看就好。 不同的事,丟不同家 最常被問的就是這個:為什麼要開三個。 老實說一開始也不是刻意的,就是用著用著,發現它們各自有比較順手的場合。我自己現在大概是這樣分:想快速查個東西、或是隨手問一下,我會丟 ChatGPT 或 Gemini,反正快,答案普通堪用就好。但如果是要認真寫一篇長的、或是要它幫我看一段程式碼、需要它想得細一點的,我就會搬去 Claude。 這個分法很主觀,也沒什麼根據,純粹是我自己的習慣。可能你用起來感覺完全相反,那也很正常。重點大概不是「哪一家最強」這種問題——我覺得這題其實沒什麼意義——而是你手邊有幾個工具,然後大概知道哪件事丟哪個比較不會卡。卡住了就換一家再問一次,有時候換個模型講法就通了,也滿常見的。 (如果你是會想追根究柢的那種人:它們之間真正的差異,其實藏在更底層——怎麼切 token、context window 多大那些地方,我之前在 Token 是什麼?LLM 為何只讀 Token? 有稍微聊到。不過先說,日常隨手用根本不太需要想到這層,覺得太細直接跳過這段完全沒差。) 問之前,先把話講清楚 這個大概是差最多的一個習慣。 剛開始用的時候,我跟很多人一樣,把它當 Google 在用,打三個關鍵字就按 enter,然後嫌它回得很空。後來才慢慢發現,不是它笨,是我給的東西太少了。它又看不到我腦袋裡在想什麼,我只丟「幫我寫個介紹」,它當然只能回一坨四平八穩的廢話。 現在我會多花個十幾秒,先把脈絡交代一下:這東西是要給誰看的、我想要什麼語氣、大概多長、有沒有什麼一定要避開的。講清楚之後出來的東西,差距真的滿明顯的。這不是什麼花招,就是……你總得讓對方知道你要幹嘛,它才接得住。 同一個要求,看你給的脈絡多寡,出來的東西差很多。 別期待一次到位 我以前會有一種期待,覺得好的 prompt(就是我打給它的那串指令、那段問題)就應該一發入魂,一次就給我完美答案。後來大概放棄這個念頭了。 現在我比較把它當成一個會來回聊的對象,而不是一台投幣就吐成品的機器。第一次它給的通常是個七十分的草稿,然後我再追問,這段太長了砍一半、這裡舉個例子、語氣再白一點。通常聊個兩三輪才會到我要的樣子。 這樣講好像有點麻煩,但其實還好,反而比一開始就硬要把一個超完整的 prompt 寫好寫滿來得輕鬆。想到什麼補什麼就好。 它很有自信,不代表它是對的 這點我踩過虧,所以印象比較深。 它最會唬人的地方,是它講錯的時候那個口氣,跟它講對的時候一模一樣,完全看不出來。所以只要是有點重要的東西——數字、人名、某個說法到底是不是真的——我現在大概都會自己再查一下,不會它說了我就照單全收。 至於它為什麼可以那麼有自信地講錯,其實背後是有原因的,我後來把它單獨寫成了一篇:為什麼 AI 唬爛的時候,口氣跟講真話一模一樣?。先說結論的話:它語氣的篤定,跟它知不知道答案,根本是兩回事。 一個問題,別塞太多事進去 這個是比較後來才注意到的。 如果我一次丟給它一大包,又要它分析、又要它列表格、又要它順便寫個結論、最好再附幾個延伸閱讀,它常常會顧此失彼,某幾項做得很隨便,或乾脆漏掉。拆開來一件一件問,每件反而都做得比較好。 有時候我懶得拆,會反過來叫它先問我。就跟它說「你開始之前,先問我幾個你需要知道的問題」,讓它把缺的資訊反問回來,再一起補。 這招我自己其實最常用,因為它常常會問到一些我根本沒想到要講的東西。比如我叫它幫我寫個東西,它可能反問「這是要給誰看的?要多正式?有字數限制嗎?」——欸對,這些我本來就該交代,可是當下真的不會全部想到。等於它幫我把「該講清楚的清單」列出來,我照著補就好,比我自己憑空想得周全省力很多。比起一開始硬寫一個面面俱到的 prompt,我覺得這招輕鬆又划算。 那些花俏的「咒語」,我大多沒在用 講了這麼多習慣,反過來講一個我「沒在做」的事好了。 網路上很多那種「最強 prompt 模板」、「複製貼上就變神」的東西,我大部分都沒在用。不是說它們沒用,是我覺得對日常隨手問問來說,有點殺雞用牛刀。與其去背一串咒語,我寧可把那個力氣花在「把話講清楚」上面,感覺實在多了。這個觀察我之前在 只會 Prompt 已經不夠了 那篇也提過,一直在糾結微調咒語的那幾個形容詞,其實有點抓錯重點。 當然,如果是會重複用、要穩定產出的場景,把指令固定下來是有意義的。但那已經比較像在做工具,不太算是這篇講的「日常隨便聊」了。 大概就這樣 回頭看,這些其實都沒什麼了不起,就是用久了長出來的手感,講穿了也很樸素:知道哪件事丟哪個、把話講清楚、別急著要完美、重要的自己查、別一次塞太多。 而且我得老實說,這些隨時都可能過期。模型改個版,今天成立的習慣搞不好下個月就不需要了。說不定哪天它聰明到我隨便丟三個字它也接得住,那這篇大概就可以作廢了。在那之前,這就是我現在的用法,給你參考一下。你要是有什麼自己的小習慣,也歡迎跟我說。
Benchmark 飽和的真正問題:不在測量,在驗證
TL;DR:GSM1k 研究指出 benchmark 飽和有一大塊是污染,不是真實能力提升。但比污染更值得想的是:我們從來沒有方法驗證模型「學會了一件事」,只有方法量它「在這個分布上會不會答」。每出一份更難的 benchmark,治理面其實沒前進。 每次新模型發表的 blog 我都會點開看一下,幾乎都長同一張表。GSM8k 99%、MMLU 92%、HumanEval 衝到接近 100。看久了會覺得這是某種 ritual,每代都會再比上一代好看一點。 可是把同一個模型放回真實工作裡,丟一份沒進 GitHub 的內部 codebase、丟一份它沒看過格式的會議筆記,它還是會犯那種會讓你嘆氣的錯。這件落差其實已經不是新聞了,奇怪的是每一輪 release blog 還是把分數寫成 state of the art,我每次看到都會有點 ???。我自己在這幾輪 release 之間,慢慢把這個怪怪的感覺磨成一個比較確定的想法:飽和大概不是測量問題,是我們一直沒解過的驗證問題。下面就是這個想法是怎麼長出來的,講起來有點繞,請容忍我一邊想一邊寫。 飽和到底是什麼意思 「分數沒地方爬了」就叫飽和。MMLU 在前沿模型上落在 88% 到 94% 這個窄帶,這個區間裡誰高誰低很大機率只是 noise。GSM8k 上前沿模型已經拿到 99% 上下,再進 0.5 個百分點也沒什麼故事可講。能力提升是真的,問題只是 benchmark 已經不在追蹤它本來要追蹤的那把尺了。 一把尺到頂的時候,你不會看到尺壞掉,你只會看到分數還在漲。刻度跟它後面那個能力之間在這個高度悄悄脫了鉤。直覺上下一步當然會想到「再做一把更長的尺」,這個直覺沒問題,只是這條路後面會撞到結構問題,我們等一下會繞回來。 用得上的證據:GSM1k Scale AI 在 2024 年做了一份 GSM1k 研究,重出 1,250 題、難度跟 GSM8k 對齊的小學數學題,然後重跑一輪。abstract 的數字很乾淨:表現最差的家族在 GSM1k 上掉了 13 個百分點。這個是會出現在所有摘要裡的那個 13。 我自己比較喜歡的是後面那個比較少人引用的數字,老實說第一次讀我也跳過了,第二次回去翻才看到:模型「生成 GSM8k 樣本的機率」跟「GSM1k 與 GSM8k 之間的分數落差」有 Spearman 相關,r² = 0.32。 ...
LLM Benchmark Saturation Isn't a Measurement Problem
TL;DR: Benchmark contamination is real and measurable. Scale AI’s GSM1k study showed the worst-performing models dropping 13 percentage points on a rebuilt set. But the deeper failure is that capability evaluation has only ever measured correlation with a test distribution. Harder benchmarks reset the clock. They don’t introduce verification, and verification is what’s actually missing. If you’ve been reading model-release blog posts for a while, the table on page one starts looking familiar. Classic benchmarks near the top, newer harder ones below, every number a hair better than the last generation’s. The explanation everyone reaches for is the saturation story: older benchmarks got too easy, build harder ones, repeat. HLE, LiveCodeBench, FrontierMath, MMLU-Pro all live inside that story. ...
Python List Comprehensions: Read Them as For-Loops
TL;DR: A list comprehension like [n*n for n in range(5)] does the same thing as a small for-loop. It just writes the result first and the source second, which is the opposite of the order you’d write the loop in. If something trips you up, it’s probably that reversal, not the concept. Translate it back into a for-loop and most of the mystery tends to go away. Seeing [x for x in data if x > 0] for the first time and pausing for a second seems like a pretty normal reaction. It doesn’t look like the statements you’ve been writing. No colon, no indentation, and the for has wandered into the middle. Plenty of tutorials just say “this is a list comprehension, it’s very Pythonic” and move on, but I’m not sure that line actually helps anyone read the thing. ...
Python 列表推導式:一行取代 for 迴圈
TL;DR:列表推導式 [n*n for n in range(5)] 其實就跟一個 for 迴圈做一樣的事,只是把「結果」寫在最前面、「來源」丟到後面,順序剛好跟念中文相反。會看不懂多半不是因為它難,比較像是這個順序要花點時間習慣。能把它翻回 for 迴圈來看的話,大概就沒那麼可怕了。 第一次看到 [x for x in data if x > 0] 這種東西會愣一下,我覺得滿正常的。它長得不太像一般的句子,沒冒號、沒縮排,for 還跑到中間去。很多地方會直接說「這叫列表推導式(list comprehension),很 Pythonic」就帶過,可是那句話其實對看懂它沒什麼幫助,看完還是一樣霧。 所以這篇就不背語法了,從大家應該都會的 for 迴圈開始慢慢聊好了,不趕時間。 同一件事,兩種寫法 假設要做一個 0 到 4 的平方數清單。用 for 迴圈大概像這樣寫: squares = [] for n in range(5): squares.append(n * n) ## [0, 1, 4, 9, 16] 三行,開個空 list、跑迴圈、一個一個 append 進去。很普通,沒什麼問題,能跑就好。 換成列表推導式的話,就變這樣: squares = [n * n for n in range(5)] ## [0, 1, 4, 9, 16] 一行,結果一樣。這倒不是我隨口說的,文末附的測試檔就是把這兩種寫法的結果丟去 assertEqual 對,跑出來是相等的。所以大概可以放心把它當成上面那段 for 迴圈的縮寫,因為它字面上差不多就是那個意思,只是擠成一行而已。 怎麼讀它:翻回 for 迴圈來看 我覺得重點在閱讀順序。推導式長這樣: [ 運算式 for 變數 in 來源 ] n * n for n in range(5) 拆成三塊來看的話: ...
The Skill Your Annoyed Prompt Becomes
TL;DR: Your first Claude Code skill won’t look like the polished examples you’ve read about. It’ll look like a prompt you’ve typed three times in a row, saved into a .md file. This post walks through that minimum-viable shape with a hypothetical four-line /structure-findings skill, shows the three things that break when you save it and type the slash command, then compares it to a real seventeen-line production-grade skill from the framework I use day to day. The longer one has more lines because it has older scars. That’s the whole arc. ...
怎麼寫你的第一個 skill — 從一個煩躁的 prompt 開始
TL;DR: 你的第一個 skill 不會長得像書裡那些 production-grade 的成熟形態, 它會長得像「你重複打三次的同一個 prompt」。本篇示範一個假設的 4 行入門版怎麼寫、存到哪裡、為什麼會沒跑、撞坑後怎麼修, 然後對照我自己框架裡真的在用的 17 行版本 — 看那些多出來的東西其實都是「撞坑後加上的補丁」, 不是設計階段一次想出來的。 你有沒有打過同一個 prompt 三次?同一段話、同一個格式、同一個角度, 三次。第三次你會開始煩, 第四次你會想:這個我能不能存起來? 那一刻其實就是你的第一個 skill。 不是說那個 prompt 寫得有多好, 是「想存起來」這個衝動就是 skill 出現的位置 — 你已經辨識出一個重複會發生的模式。剩下的事沒什麼神秘的, 把它丟進一個 .md 檔, 用 slash 叫出來而已。 前三篇我談過 skill 是什麼 ——跟 prompt 的差別在哪一層、邊界怎麼劃、拆一個 13 行的 dispatcher 給你看。但這篇有個之前都沒講的事:你的第一個 skill 不會長得像那些。你看過的成熟 skill, 不管是我框架裡的還是別人的, 都是寫了很多次、撞了幾次坑之後才變成那樣的。直接從那邊倒著學, 容易卡在「為什麼要有這條」這種對學習沒幫助的地方。比較好的起點, 就是你那個煩躁的 prompt。 假設你常做研究 舉個例子。你最近常請 AI 幫你看一些雜七雜八的研究筆記 — 三段你 google 來的東西、半段別人 Slack 給你的、一張 issue 截圖貼的內文。你想把它分類:哪些是已經查證的事實、哪些是還沒驗證但你假設成立的、哪些是現在還不知道的問題。 每次貼進去你都打差不多的字:「幫我把下面這團分成 Facts / Assumptions / Unknowns, 三個列點。」打過三次, 想存。 ...