面試官問 Agent 為什麼變慢了,而你家爐子早被問過同一題
字節跳動一場 Agent 開發面試的考題,被我們翻譯成廚房裡的動線、爐火延遲與一鍋湯越煮越滿的滋味故事。
9 月 3 日,一位求職者在牛客網上貼出了字節跳動 Agent 開發一面的面經。題目不難找,難的是答:Agent 的 Harness 是什麼?一個平常五分鐘跑完的任務,這次跑了二十分鐘,你怎麼查?工具呼叫的入參怎麼保證可靠?輪次越來越多,上下文越塞越滿怎麼辦?壓縮會丟資訊,怎麼丟得最少?
讀到這些題目的時候,我正顧著爐子上那鍋蘿蔔排骨湯。忽然覺得,這場面試像極了一個廚房裡的傍晚。
動線,就是廚房裡的 Harness
面試第一題問的是 Harness,那個把模型、工具、記憶串起來的骨架。這個詞聽起來技術,其實你家廚房早就有了。
打開你家廚房的門,先看一眼:水槽在窗邊,砧板緊挨著爐臺,調味罐在右手一伸就到的地方,盤子放在起鍋的前方。這套安排沒人寫在紙上,但它決定了你炒一盤菜是行雲流水,還是手忙腳亂地橫穿廚房三次。
好的 Harness 就是一條被想清楚的動線。菜洗好、切好、裝碗,按下鍋順序排在檯面上,法國人叫 mise en place。我們先前寫過一篇上下文工程其實就是備料,講的正是這件事:模型再聰明,也得先看過你的冰箱。骨架不好,再厲害的廚師也會在翻找抽屜的時候,讓鍋裡的蒜焦掉。
平常五分鐘的菜,今天為什麼二十分鐘才上桌
第二題最有生活感。一個任務平常五分鐘結束,這次跑了十五到二十分鐘,延遲從哪來?
換成廚房的語言就是:你煎一塊五花,平常五分鐘起鍋,今天翻來覆去快二十分鐘,肉還在鍋裡。你會怎麼查?
先看火。爐火是不是被誰轉小了,瓦斯是不是快用完。那是環境變了。再看鍋,是不是換了一口厚底的鑄鐵鍋,升溫本來就慢。然後看料,這塊肉是不是比平常厚,是不是剛從冷凍庫拿出來、中心還帶著冰。最後看人,是不是你中途跑去看了一眼手機。
診斷延遲,從頭到尾就是這個順序:先量每一段各花了多久,再找出突然變長的那一段。麵煮久了不等於火壞了,可能是等水滾的時間變了。一個會做菜的人拆解問題的方式,跟一個會答這題的工程師,走的是同一條路。
入參固定的工具,就像配方不肯通融的電鍋
工具呼叫的可靠性,這題我第一個想到的是電鍋煮飯。
電鍸不管你今天心情、不管你冰箱裡剩下什麼,它只認米和水的比例。米杯就是它的入參規格,兩杯米配到內鍋第二條線,多一點少一點,它不替你修正。想讓它可靠,靠的是你先把米量對、水加對,外鍋的水也別憑感覺。
模型呼叫工具也一樣。參數的格式是死的,模型得從上下文裡把對的值撈出來填進去。填錯了,工具不會替你圓場,就像電鍋不會因為你今天想喝粥,就自動替你多倒一杯水。可靠性的祕訣往往在呼叫之前:規格寫清楚,量米的時候就別含糊。
上下文越煮越滿,湯要怎麼撈而不失味
第四題是整場面試裡最像廚房的一道題。對話輪次越來越多,上下文窗口越來越大,怎麼辦?標準答案是壓縮、做摘要。但下一問立刻跟上:壓縮一定丟資訊,怎麼丟得最少?
煮過高湯的人都懂。一鍋湯滾了兩個小時,料越加越多,鍋就那麼大,你總得撈掉一些東西。撈什麼?
蔥段、薑片、最早下去的洋蔥,味道早就煮進湯裡了,本體撈掉不心疼。這是已經被吸收的資訊,可以摘要,可以收納。但那塊還在出味的火腿千萬別撈,那是風味的來源,是後續每一口湯的底。鮮事、當下正在進行的事、關鍵的數字與決定,就是那塊火腿。壓縮的功夫,在於分得出哪些料的味道已經進了湯,哪些料還得留在鍋裡。
老廚師撈料的時候幾乎不猶豫,因為他嚐過太多鍋湯。丟失最少的摘要,靠的也是這種嚐出來的判斷。
一道數學題,其實是菜市場的算術
最後手撕的那道演算法題,給一個數 23121,給一組數字 2、4、9,求用這些數字組成、小於 23121 的最大數,答案是 22999。
這題我讀了兩遍才笑出來。這不就是菜市場找錢的邏輯嗎?你手上只有三種面額,要湊出一個不超過對方口袋的最大的數。從最高位開始,能貼就貼上最大的那張,貼不上就退一位,從此以後每一格都塞最大值。23121 拗不齊,那就 2 開頭,後面全填 9。
做生意的攤販心算這個比誰都快。演算法題看起來住在紙上,其實根扎在每天買菜找零的手勢裡。
面試結束之後,回家喫飯
那位發面經的求職者,文末寫了四個字:攢人品。看起來是玩笑,其實是誠實。面試跟做菜一樣,把能控制的都控制了,剩下的交給運氣和火候。
我不知道他二面過了沒有。但我想,那天晚上他走出面試間,總得喫頓飯。如果那頓飯是一碗五分鐘就好的蔥油拌麵,燙麵的時候順手燙一把青江菜,起鍋淋一勺熱油嗆香的蔥蒜,那麼這一天所有的難題,至少在餐桌上被好好收尾了。
技術的題目每季都在換,廚房的題目幾百年沒變:動線要順,火候要查,配方要準,鍋滿了要撈。你今晚走進廚房的時候,不妨也用面試官的眼睛看一眼自己家的爐臺。說不定你會發現,你早就是一個很會答題的人。