晚上十一點,林越把一道“滑動窗口最大值”的解法提交到LeetCode,第13個用例又紅了。他把手從鍵盤上挪開,盯著屏幕上一行行紅字,腦子里反復回放剛才的推導——明明在草稿紙上跑通了,為什么一上機就卡在超時和邊界?他點開討論區的高贊解答,讀完三行就關掉了。那種用標準答案“喂”出來的理解,第二天遇到變種題照樣抓瞎。他真正缺的,是一個能在卡殼時追問“你為什么選雙端隊列”而不是直接扔代碼的陪練。
一個月后,林越的桌面上多了一個叫Structure的桌面應用。它由開發者intelliot提交到Gemma 4挑戰賽,設計目標非常直白:AI不該替你拿答案,而該幫你長出解題能力。和那些聯網調用大模型、隨手吐完整解法的練習工具不同,Structure把一切鎖在本機:題目、代碼、運行環境、陪伴你的Gemma 4模型,全都跑在你的Mac上,連一行代碼都不會被發到遠端接口。你練習面試的過程,就只屬于你和這臺電腦。
![]()
打開Structure,屏幕被分成四塊,組成一個閉環的練習工作臺。左上角是問題陳述,不光有題目描述和輸入輸出示例,還會列出約束條件、算法標簽以及目標時空復雜度——這些是面試官在閱卷時真正會追問的維度。右上角是C++或Python編輯器,沒有代碼補全,沒有魔法快捷鍵,只給你一塊干凈的文本區。左下角是本地測試控制臺,你能跑題干的可見樣例,也能用一組隱藏測試來自己驗邊界。右下角就不一樣了:它是一個由本地Gemma 4模型驅動的“輔導員/面試官”面板,會根據你當前選定的模式給出截然不同的交互。
Structure內置了五種模式:學習、面試、調試、速通和回顧。模式一切換,背后Gemma 4的提示詞和反饋邏輯就跟著變。在學習模式下,它像個有耐心的導師,用蘇格拉底式追問逼你一步步想,而不是一上來就講思路。你卡在“合并K個升序鏈表”時,它不會先提最小堆,而是問你:“如果用分治法,每次合并兩個鏈表,你重復計算了什么?” 漸進式提示被拆成三層:第一層只給方向詞,第二層提示數據結構,第三層才暴露關鍵操作。練習的主動權始終在你手上。
切成面試模式,整個氛圍就收緊了。Gemma 4回答簡短、不閑聊,拋給你的問題往往是你剛才隨口帶過的復雜度分析。它會直接說:“你用了哈希表,但你沒說明空間復雜度是O(n)。你能在O(1)空間重做嗎?” 如果你報的時空復雜度與它根據題面推算的不符,它會標紅,并要求你重新分析。這時候沒有提示,沒有追問,只有沉默和計時器——和一個真實的技術面試模擬環境完全對等。
調試模式則把精力聚焦在第一個具體失敗用例上。Gemma 4會提取可見測試的輸出差異,不是幫你改代碼,而是描述:“當輸入為[1,3,-2,5],窗口大小k=3時,你的滑動窗口返回[3,5,5],預期是[3,5,5]?不對,預期是[3,5,5]?等等,實際預期是[3,3,5]嗎?”——它把期望輸出、你的實際輸出、差異位置攤在你面前,然后問:“你的維護邏輯在k=3時,隊首元素的過期判斷有沒有提前觸發?” 這個模式的底線是只幫你定位問題,不替你做修復決策。
速通模式是為比賽準備的,它把反饋節奏加快,按倒計時壓力逐步收緊提示頻率;回顧模式則完全不同,它會在你提交完所有嘗試后,把你每一次失敗的記錄拉出來,按知識點聚類,生成復習卡片,幫你把短期嘗試轉成長期記憶。這些卡片連同你的所有代碼、運行結果,都被存進本地的SQLite數據庫里,和你的練習歷史、編輯器偏好一起靜靜躺在你的磁盤上。
之所以能做到這一切,全因為Structure的設計刻意走了一條本地優先的路。你的代碼通過本機的clang++或python3直接編譯運行,無需遠端的判題沙箱。Gemma 4通過Ollama在本地啟動,所有推理都在你機器上完成,練習過程中發送給模型的上下文——包括完整的題面、你寫的代碼、運行摘要、預期輸出與實際輸出的對比——都不會離開這臺設備。那些靠采集用戶代碼來優化評估模型的在線平臺上能產生的“數據泄漏”風險,在這里被根本性地切斷了。
為了把本地模型變成可用的陪練,Structure在工程上做了幾件很實在的事。src/ai/LocalLLMClient.cpp是本地模型客戶端,它首先兼容OpenAI風格的對話接口,但一旦檢測到本機11434端口有Ollama在運行,就會自動切換成Ollama原生的/api/chat接口。這么一切換,Structure就能用上流式響應、把think參數強制設為false以壓縮推理輸出、通過keep_alive保活模型避免重復加載,還能為每次請求設定回復預算,精確控制模型輸出的長度,不會讓陪練在面試模式下突然給你講出一篇小作文。
src/ai/PromptBuilder.cpp負責構建模式專屬的輔導上下文。這道工序非常精密:它把題目的完整描述、本地標準輸入輸出的例子、約束條件、目標復雜度、可見測試用例、用戶提交的原始代碼、編譯運行結果,以及一份“回復契約”封裝成一個結構化的提示。這份契約嚴格規定了模型在不同模式下能說什么、不能說什么——比如面試模式里禁止給出解法,調試模式里禁止輸出完整代碼,回顧模式里必須引用用戶的歷史錯誤記錄。正是這個“契約”讓同一個Gemma 4能在不同模式間像換了個人一樣。
src/ai/TutorEngine.cpp則把整個學習流程串了起來。它負責將Gemma 4的流式響應實時推送到聊天面板,處理用戶提交代碼后的反饋請求,同時做了一件重要的事:安全剪裁長代碼上下文。當你的解法文件超過模型窗口限制時,引擎會智能去掉注釋、縮減空行、壓縮變量名,卻保留邏輯結構,確保模型拿到的永遠是能讀懂的片段。如果本地推理失敗或者響應超時,它還會回退到一套確定性的本地反饋——根據編譯錯誤、運行超時、內存溢出等元數據直接給出診斷,保證練習不會因為模型掉線而中斷。
Structure把技術面試的練習流程重新拉回到“人”這一端。你不必再把思考過程暴露給一個云端模型,不必在“查看答案”的內疚和“死磕不出”的挫敗之間搖擺,而是擁有一個真懂沉默價值的本地陪練。當Gemma 4在你寫完每一行代碼后只是追問一句“你剛剛為什么選這個數據結構”,那段卡住的夜晚,才真正開始長出能力,而不只是刷過一道題的編號。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.