嗯...今天要來聊一個,一個我們公司產品最近遇到的...該怎麼說,一個蠻詭異的 bug。這件事讓我對 AI 有了蠻不一樣的...嗯,新的看法。
你知道,有時候你身邊會有一種人,很想幫忙,但結果常常是越幫越忙。現在你把這個人,想像成是 AI。
這就是我們最近發生的事。
事情是這樣開始的:一個奇怪的 bug 回報
我們先講一下背景。我公司的產品,是一個給醫生用的 EMR,就是電子病歷系統啦,然後它有 AI 輔助。我最近經手的一個功能,是讓醫生可以直接錄下跟病人的對話,然後 AI 會自動把這些錄音,轉成一份結構化的...嗯...就是那種標準格式的病歷。
聽起來很單純吧?醫生錄音,然後產出筆記。本來也確實是這樣,直到我們收到一個醫生的客訴。
他說,他試著用錄音檔生成一份病歷,但跑出來的內容,跟他錄的完全是兩回事。病歷上寫的是一個「氣喘 (Asthma)」的病人,但醫生很確定,他整個錄音過程,一個字都沒提到「氣喘」。而且病人的年紀啊、性別什麼的,也全都是錯的。
這就怪了。我們同事去查了 log,就是系統紀錄,也確認了,從錄音轉出來的文字稿裡,真的...真的沒有「氣喘」這個詞。
所以,那個「氣喘病歷」到底是哪來的?
後來我親自下去查...嗯...我打開那個醫生當天的操作紀錄,然後就發現一個很微妙的地方。系統裡有兩筆他的錄音,時間點是連在一起的。一筆很長,就是一段完整的對話;但另一筆,就...就只有一行字。
所以我猜,那個醫生實際上的操作是這樣:
- 他先錄了一段完整的對話,第一次生成病歷,這時候一切正常。
- 過了一下,他可能突然想到有東西要補充,所以他就...很快地又錄了一句話。
- 他可能以為,這句新的話會「附加」到剛剛那份病歷後面。
這個想法很合理,真的。但我們當初設計功能的時候,不是這樣想的。我們的設計是,每一次你錄音、生成,它都會覆蓋掉舊的那一份。這是個設計選擇,有我們的考量。
好,這解釋了為什麼系統會跑一次「新的」病歷生成。但...問題還是沒解決啊。
那份寫著「氣喘」的鬼打牆病歷,到底是怎麼生出來的?
我們來看看 AI 腦子裡發生了什麼事
要解釋這個,我得先...嗯...稍微講一下這個功能背後的運作方式。它大概有四個步驟:
你看,醫生錄音之後,系統會先轉成文字。然後,重點來了,我們會先把這段文字稿,丟給一個「預訓練的大型語言模型 (Pre-trained LLM)」。它的任務,是先把醫生那種...嗯...口語化的、沒什麼結構的文字,整理成一份有邏輯、有結構的資料。最後,再把這份結構化的資料,交給另一個專門訓練過的模型,去生成最終的病歷。
而這次的兇手,就是第三步的那個...那個預訓練模型。
所謂的「AI 幻覺」,就是它開始寫小說了
還記得嗎?我說醫生錄了第二段,那是一段非常短的錄音。那句話的文字稿,我去看了一下,是:"Add on and off by the way"。
中文大概就是「喔對了順便一提」之類的,你知道的,一句很口語、沒什麼資訊的話。
然後,我們就把這句「喔對了順便一提」,丟給了那個預訓練 LLM,給它的指令大概是「請幫我把這段對話,整理成有意義的醫療段落」。
當那個 AI 看到這句話,它可能...嗯...腦袋當機了一下。它發現這句話裡面根本沒有任何醫療資訊。但它又被設定成一個「很想幫忙」的角色。所以它的反應,不是說「抱歉,資訊不足,我看不懂」,而是...
而是:「喔!好的!這段話裡沒東西是吧?沒關係,我來幫你發明一個完整的病人背景、診斷紀錄、還有治療計畫給你!」
是的,AI 就這樣,從空氣中,掰出了一整個醫療情境。這個現象,在 AI 領域有個專有名詞,叫做「幻覺 (Hallucination)」。
為什麼會發生這種事?AI 不是應該很聰明嗎?
這就要講到...嗯...像 ChatGPT 這種大型語言模型 (LLM),它們運作的基本原理。說穿了,它們其實就是一個非常、非常有自信的「接話高手」或「故事接龍大王」。
它們的核心技術叫做「下一個詞的預測 (Next Word Prediction)」。你給它幾個字,它不是去資料庫裡「查找」答案,而是去「預測」下一個最有可能出現的詞是什麼。然後它接上那個詞之後,再用現有的整句話,去預測再下一個詞。就這樣一個詞、一個詞地接下去,組成一段看起來很通順的回應。
它不是像人一樣在「思考」或「推理」,它只是在做一個...嗯...一個很複雜、很厲害的機率猜詞遊戲。
所以,當它拿到 "Add on and off by the way" 這句沒頭沒尾的話,它沒有「我不知道」這個選項。它的程式告訴它要接話。所以它就從...不知道哪個訓練資料的角落,抓到了一個看似合理的開頭,比如說「病人主訴...」,然後就一路編下去了。從一個輕微的頭痛,掰到噁心、視力模糊,最後順便送你一個暈眩症,都很有可能。
這種「幻覺」問題,到底有多嚴重?
老實說,蠻嚴重的。尤其是在醫療這種領域。
- 資料錯誤: 醫生如果沒仔細檢查,就可能存下一份完全錯誤的病歷。這太可怕了。
- 病患安全: 錯誤的紀錄,可能會一路錯下去,影響後續的診斷或治療,這是人命關天的事。
- 法規風險: 說到這個,在美國,這種事絕對是個嚴重的 HIPAA (健康保險流通與責任法案) 違規。那在台灣,雖然法規細節不太一樣,但光是牽扯到《個人資料保護法》,就夠頭痛了。病人的病歷是超級敏感的個資,你系統亂寫一通,這...這不只是信任問題,更是法律問題。
- 信任崩潰: 最後,也是最根本的,沒有人希望自己花錢買的 AI 服務,會自己在那邊寫小說吧?這會讓使用者對整個產品的信任感,完全崩盤。
所以說,這絕對不是什麼「AI 有點笨、真可愛」的小事。
那最後怎麼解決的?
嗯...其實,修復的方法意外地簡單。有點...有點反高潮。
我回去翻了大量的正常使用紀錄,發現一份有效的錄音文字稿,長度幾乎都在三百個字以上。所以,我就在程式裡加了一個很簡單的...嗯...防呆機制:
字數長度檢查。
就是說,在把文字稿丟給 AI 之前,先檢查一下它的長度。如果長度少於三百個字,系統就直接擋掉,然後回傳一個錯誤訊息給醫生,告訴他「錄音內容太短,請提供更詳細的資訊」。
就這樣。一個很...很傳統的工程師解法,而不是什麼高深的 AI 煉丹術。
隔天我再去看 log,就再也沒出現過這種亂掰的病歷了。問題解決。
不過,為了寫這篇文章,我想拿到證據。所以我在我自己的開發環境,把那個長度檢查先拿掉,然後...嗯...又試了一次。用同樣那句 "Add on and off by the way" 去跑。結果,我們可愛的 LLM 這次不寫氣喘了,它給我掰出一個全新的、有「胸痛 (Chest pain)」症狀的病人。😂
給 AI 的指令,有時候跟帶新人一樣
這件事給我最大的啟發是,跟 AI 協作,有時候你不能把它當成一個全知的神。你要把它當成一個...一個很熱心、但有點菜、又很怕被罵的實習生。
你給他的指令如果太模糊、太短,或者根本沒給夠資訊,他就可能為了「交差」,而自己去腦補一堆東西。他不是故意的,他只是...他的運作模式就是這樣。
下面這個表,算是我自己整理的一個...嗯...心得。就是你給 LLM 不同種類的「爛指令」,可能會發生什麼事。
| 有問題的輸入類型 | 我的口語化解釋 | 為什麼這很雷 |
|---|---|---|
| 資訊量太少 (這次的狀況) | 就給它一句無關緊要的話,像「喔對了順便一提」。 | 它會覺得你在玩填空遊戲,為了把格子填滿,就開始亂寫小說,完全失控。 |
| 指令含糊不清 | 問它一些很模稜兩可的問題,比如「那件事怎麼樣了?」 | AI 不知道「那件事」是哪件,只能從對話紀錄裡瞎猜,結果可能完全搞錯重點。 |
| 基於錯誤前提的提問 | 你一開始就給它錯的資訊,比如「跟我聊聊為什麼貓喜歡吃巧克力」。 | 它很可能會順著你的錯,繼續往下掰,而不是先糾正你說「貓不能吃巧克力」。 |
| 帶有強烈偏見的引導 | 你問它:「為什麼那個專案註定會失敗?」 | 它不會客觀分析,而是會努力找出各種「會失敗」的理由來迎合你,忽略了成功的可能性。 |
重點一句話
所以...嗯...結論就是,別給你的 AI 太少的資訊讓它自己瞎忙。不然,它很可能就會從一個助理,變成一個小說家。
跟 AI 一起工作,我們好像...好像也得學會怎麼當一個好主管,把任務交派清楚。這件事,我自己是覺得,未來會變得很重要啊。
那你呢?你有沒有遇過 AI 做出什麼讓你傻眼或覺得很好笑的事?在下面留言分享一下你的故事吧。
