韓國出差見聞之二

前一天趕飛機是凌晨三點起床, 第二天因為要提早出發去另外一個地方, 所以也是相當早起. 太陽公公臉色還泛點黃. Road Show 跑完上午行程, 就去吃牛骨的這個火鍋和生牛肉拌飯 (飯要後來才加).

生牛肉應該有醃過, 吃起來甜甜的. 大部分的台灣同事都選擇用火鍋燙熟它!

吃完飯跑下一家, 然後再等下午第二家之前, 在咖啡廳被請喝了這個草莓牛奶.

這家客戶很熱情請我們參觀他們的機房和中控室. 他們看起來非常壯觀, 但這裡不適合洩漏客戶機密, 所以我叫 Dall E2 幫我畫. 雖然很不像, 但氣勢有畫出來. 右下圖是進入這類大公司必經的"浪漫速成班"補習大樓.

晚上又和客戶吃飯. 這餐吃到一些特別的東西. 像是蜂蛹、鳥蛤(cockle = 새조개 = saejogae). 前者我本來以為是蠶蛹, 仔細看圖片, 蠶蛹有點翅膀的痕跡, 但蜂蛹沒有[1]. 它吃起來一開始沒味道, 尾勁有點酒精味. 後者的鳥蛤火鍋每份 45,000 韓元, 相當貴.

下圖最後一張是海鞘 (Sea Pickle = 멍게 = meong-ge), 我在很多家餐廳的魚箱裡都有看到, 更在法環打死過很多隻,但是無緣吃到. 只能等下次有空旅行時, 再吃吃看這 “海鳳梨" 是什麼味道?

總之,這天陪客戶到很晚。接著進入第三天行程。早餐吃旅館的,沒有什麼稀奇的。不過發現有個煮麵的攤位. 韓國人自助選好配料後, 按個鈴就把碗放著. 等廚師自己過來. 我們傻傻地沒看到人就走開了. 所以在旅館住了四天也沒吃到這一味. 另外要說有甚麼特別的, 那就是韓國不缺蛋, 想吃多少有多少!

第三天再回去看 bug 解決的狀況. 看起來問題差不多都收斂了, 就去吃午餐. 這餐吃韓式牛肋骨湯 (갈비탕 = galbitang). 同事把它發音為該逼湯, 聽起來怪怪的很像 “該邊". 但真的是單純的好味道! 吃法是自己用剪刀把牛肋骨的肉剪下來配飯. 這家的店員也會說中文.

接著繼續拜訪客戶, demo 時發現代理商把我們的一台液晶電視撞壞了. 本來要 side by side 比較, 結果只好跟客戶借一台電視, 同時請代理商直接去賣場買一台送到下一站. 因為來不及把環境參數調成一樣, 過程有點小緊張.

晚餐終於沒有跟客戶一起吃了. 所以我們改吃烤牛肉. 吃完牛肉又去吃炸雞! 炸雞據說競爭激烈, 所以各有獨門秘方. 這家原味的口感酥脆不柴也不油. 甜味的好吃但吃多有點膩, 會想吃回原味的. 總之, 烤肉已經吃得相當飽. 炸雞點兩份太多了, 幸好韓國同事願意打包回家.

[REF]

  1. http://www.kumifeng.com/fengyong/2880.html

韓國出差見聞之一

2023/3/6 在疫情過後第一次出國, 搭紅眼班機從桃園機場到韓國仁川機場. 仁川機場有巴士 6017 號可以坐到旅館, 價錢是 17,000 韓元. 放下行李之後, 開始找午餐吃, 雖然出發前已經在家裡和機場貴賓室吃了點東西, 但落地之後加上一小時時差, 又到了午餐時間. 隨便吃一點也可以調整腸胃時差. 於是找了一家吃馬鈴薯排骨湯, 店員會說中文, 感覺跟小瀋陽一個口音.

下午 review bug, 晚餐跟廠商吃烤豬肉. 第一次知道烤豬店只烤豬, 烤牛店只烤牛.

大塊的厚切豬肉, 烤得差不多了再用剪刀剪成小條.

看得出第二輪上的這個豬相當肥. 有點投機取巧. 是不是賭客人喝醉了?

吃法跟大家想得一樣.

想不到的是: 服務生用燒酒洗鐵板代替換烤盤, 據說它比可樂、啤酒都便宜. ChatGPT 說:

  • 燒酒 (Soju):1,500 ~ 3,000 韓圓,視品牌而定。
  • 啤酒 (Beer):2,000 ~ 4,000 韓圓,視品牌和種類而定。
  • 可樂 (Coca-Cola):1,000 ~ 2,000 韓圓,視店家而定。

吃完烤肉, 最後又送上一盤冷麵 (冷麵, 熱麵,飯三選一). 我一口都沒喝的水, 放在烤盤旁邊都浮上一層豬油, 白而混濁的狀態, 快要跟濁酒差不多顏色了.

回家途中, 看見發傳單的人把傳單撒在地上, 紅綠燈也顯示在人行道邊緣. 這一切都是為了低頭族. 前者好像是特別發夜生活的廣告, 人家不拿也是正常的. 所以發給土地公算是聰明? 至於斑馬線前的地面紅綠燈, 我覺得台灣應該學起來.

回到旅館房間, 盤點一下旅館的用品. 網站上說有個人盥洗用品, 原來不包括刮鬍刀. 雖然我也帶了一把拋棄式的備用, 但看起來撐不了五天. 還有早上才買的 T Money 卡竟然不見了, 只好再去買一張. 我 Google 網路上說 GS25 有賣. 下樓跑了最近的一家超商, 他找了一陣子跟我說沒有 T Money….!? 所以只好憑著記憶去找同事帶我買的那家店.

結果在 T Money 儲值時溝通不良, 我說 “top up", 他說 “충전" (chungjeon), 聽起來很像 “充值" 對吧! 我不會說"一", 只會比"一", 但說了兩次 “萬" (man), 他就幫我充了兩萬. 不過很巧地, 充了兩萬扣一扣剛好夠付回程機場巴士的錢!

睡前打開 Netflix, 看每週一更新的 “出球致勝" (A Clean Sweep) 有沒有上線, 赫然發現韓國比台灣多了很多集. 這表示我用 VPN 連到韓國也可以看到後面的集數, 只是字幕會變成韓文. 那…看球的樂趣也會少很多. 誰叫我們學校當年沒開韓文選修呢? 聽不懂就沒辦法.

AI 搶飯碗!

本來今天打算整理一篇以前的讀書心得, 不過 AI 搶軟體工程師飯碗這件事對我還滿有衝擊的, 所以特別紀錄一下.

今天是十天連假的收假日, 不小心打開很久沒玩的數獨 (Sudoku), 發現竟然有對戰模式, 可以跟外國真人對戰! 這個比寶可夢的對戰刺激多了, 所以我馬上跟配對的老印、老法、老德殺起來! 前幾戰的對手超弱, 但後面的對手滿強的, 幾乎是分秒必爭. 稍微分心一點點就輸了. 畢竟我好久沒玩了, 反應慢很多, 只得到 16 勝 8 敗就想趕快休息. 不然萬一心臟負荷不了猝死就划不來了. 這樣以後人家問起老爸的死因, 女兒只能說死於某一波寒流這樣塘塞過去.

(對了, 此遊戲選台灣會變成中國的一部分, 所以我推薦女兒玩, 結果她選冰島籍).

接著我發現電腦的 ChatGPT 窗口還沒關, 順便就問它, “can you resolve a sudoku?", 然後奇妙的事情發生了. 我知道 ChatGPT 會寫程式, 但我只是隨 “口" 問問, 它就把程式寫好了. 看來不只是可以幫我們交訓練課程的心得報告而已. 連我們以後上機考試要更嚴格防弊了….哈!

Yes, a sudoku can be resolved using algorithms such as backtracking, constraint propagation, and search. Here’s an example of a simple backtracking solution in Python:

哇! 架構都出來了! 稍微把那多餘的 return 拿掉, 加個 class 的殼, 程式就能用了. 不求任何優化, 只要把題目的 array 輸進去, 答案立馬出來.

這有什麼啟示呢? 我想大理工時代將要隨著 AI 的興起而沒落了. 基本上, 現在電資的學生不分良窳, 幾乎都比文組有職場競爭力. 不過 AI 的程式都寫得比人類又好又快了, 那自然也就不需要這麼多就業人口了. 雖然文組可能會丟掉飯碗 – AI 當小編, AI 寫文案, AI 寫專欄, ….. 不過近年風光無限的理工同學, 真的要當心 AI 寫程式、畫 layout 這些變化. 基本上這都還算是初階. 等到它會分析 bug, 連資深同仁的工作可能都不保了. 至於 PM, …可能可以再撐一陣子, 但是前途也是堪慮. 所以…人脈很重要, 這個 AI 取代不了~~~哈!

神經病 vs 精神病

這個標題看起來像是在罵人, 不過它是 “記憶" 這本書第一章的亮點. 記憶為何會牽扯到精神病呢? 因為精神病患常常有幻視幻聽等症狀 (失智者也會), 而且他們對這些幻覺有長期的記憶 (嗑藥好像也會). 為何虛假的東西會被當成是真實的事情, 並且被大腦記錄下來? 本書的第一章就在討論這個.

作者薇洛妮卡‧歐金在"記憶:我們如何形成記憶,記憶又如何塑造我們?精神病學家探索解析大腦記憶之謎" 一書中, 就是以精神病學家的角度切入 “記憶" 這個主題. 作者認為瞭解異常, 有助於認識正常. 早期人們從宗教的觀點認為有些人得了精神上的怪病, 但科學家慢慢找出怪病的原因, 因此把這類疾病從精神病變成了神經病.

既然是西方老外寫的書, 精神異常一定要綁定文化背景. 例如在大中華文化圈, 如果曹孟德常常看見死者向他索命, 老一輩的人會說他害死太多人, 所以有冤鬼來報仇. 但近代科學家可能認為幻視幻聽是失智症的一種. 諸如此類. 同理, 當西方人發現所謂精神感受來自於大腦, 而不是靈魂, 靈魂的影響力就減弱了.

19 世紀的精神病院病人, 有 25% 的比例被認定為 “麻痺性癡呆" (General Paralysis of the Insane = GPI), 其病徵是道德錯亂. 但是到了 1880 年代, 人們發現這是梅毒末期所造成的腦病變. 1950 年代, 盤尼西林發明後, GPI 從精神科轉到內科治療. 再經過梅毒螺旋體的發現, 這個疾病發生的原因也由 “性濫交造成的精神錯亂" 轉為 “傳染病".

另一個例子是腦炎 (抗 NMDA 受體腦炎 = Anti N-methyl-D-Asparatate-encephalitis), 得到這個病之後同樣會發生精神錯亂, 包括幻聽、妄想、動作障礙. 所以原先由精神科處理, 但其實這是一種自體免疫疾病 (autoimmunity), 因為抗體攻擊人類自己的 NMDA 受體所引起.

總而言之, 得了神經病還是比精神病好一點. 因為我們知道原因. 在排除偽精神病之後, 作者順手批判笛卡兒的二元論是偽科學, 因為他主張的二元論把心智 (mind) 和大腦 (brain) 分別當作心和物兩種物件, 但作者認為心智都有物理依據. 就像是精神病都有神經學的基礎. 當然, 笛卡兒更有名的是 “我思故我在". 歷史地位沒有問題. 這裡就只鎖定的一個觀點: 笛卡兒認為上帝所創造的靈魂是完美的, 而生活的感官經驗沒那麼重要. 和他打對台的人, 則是感覺主義者 (sensationalist).

書上說: 上帝給的叫做 Knowledge (天命?), 自己學到的知識叫 knowledge (學問?), 分別是大 K 和小 k. 這兩種知識的爭論跨越 16,17 世紀. 雖然我 Google 不到相關資料, 但這個題目很有趣. 本書第一章的後半也在講這個. 後來有個實驗證明, 55 歲才恢復視力的一位維吉爾先生, 當他重獲視力, 短期間還是不能把以前熟知的圓形、方形, 和眼睛看到的球與方塊做連結. 故作者認為心智的初始值就是一片空白, 所有的感覺 (或者應該理解為知覺?) 都是記憶所餵養的.

我們從訓練 AI 模型的經驗可以知道, 每個人都有數量相當的腦細胞, 不過有人初始值設得比較好, 有效的參數比較多, 甚至預設好幾組 trained 好的 model (音樂, 數學, 體育…etc.), 所以日後即使受同樣的教育 (re-train / fine-tune), 也會有不同的表現. 基本上這和作者的觀點差不多, 但只要了解過 AI 怎麼學習, 我就會假設人類也是這樣學習. 這個觀點暫時已經回不去了. 但是書就繼續讀下去~~~

自製 mini ChatGPT

根據 [1], 決定自製一個 mini ChatGPT. Afiz 的流程如下:

首先在 Anaconda 中 pip install openai 就失敗, 原來要用 conda install -c conda-forge openai [2].

pip install gradio 沒問題

from config open_api_key 一看就不合用! 看 [2] 裡面的說明, 要先參加 OpenAI會員. 這個我已經註冊過了. 登入後, 可以在 https://beta.openai.com/account/api-keys 產生 key. 然後把 key 設為環境變數 %OPENAI_API_KEY%.

後面照抄 [4], 可是出現 check internet connection. 暫時卡住.

這要怎麼 debug 呢? 因為是抄的, 所以有點不明就裡. 乾脆來問 ChatGPT 本人要怎麼呼叫它? 然後它就大方地給我一個 sample code. 這感覺就是 “玄 “!

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.Completion.create(
    model="text-davinci-003",
    prompt="The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\nHuman: Hello, who are you?\nAI: I am an AI created by OpenAI. How can I help you today?\nHuman: I'd like to cancel my subscription.\nAI:",

    temperature=0.9,
    max_tokens=150,
    top_p=1,
    frequency_penalty=0.0,
    presence_penalty=0.6,
    stop=[" Human:", " AI:"]
)

不過, 這段程式還是有個相容性問題. 它說 Anacoda 裡面有段 source code 開檔預設是 latin-1, 不是 UTF-8. 這…這我 debug 不了啊? 查一下午資料, 都說要改 mysql database 那邊的設定.

UnicodeEncodeError: 'latin-1' codec can't encode character '\u201c' in position 7: ordinal not in range(256)

好在我到處 Google 找到了另外一篇中文教學 [5], 它的範例不會打到上面那個 bug. 所以狗哥不用怕, 裁員一次就好, ChatGPT 暫時還不能把你幹掉. 仔細比較兩個程式, 目前認為還是 export private key 沒有成功, 所以暫時用明碼才能夠連線的關係. 這樣總算在過年假期當中, 把 OpenAI 的探索前進了一小步! 現在它可以講笑話了, 雖然要等 2~3 秒.

[REF]

  1. https://twitter.com/itsafiz/status/1610245691812741120
  2. https://anaconda.org/conda-forge/openai
  3. https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety
  4. https://github.com/afizs/chatgpt-clone/blob/main/mini_ChatGPT.ipynb
  5. https://steam.oxxostudio.tw/category/python/example/openai.html