前情提要 AI 時代下,連我自己都會將大部分得程式碼優化或是寫作的部分都會麻煩 AI 代勞。但是因為模型訓練的資料因素,有太多的寫作方式都太老舊了。這樣造成寫出來的程式無法應用到最新版本 Go 的一些功能,這樣相當的可惜。 還好, JetBrains 出了 go-modern-guidelines 這個很好用的 plugin 。可以讓你的 AI Agent 變得更加的聰明,並且知道該如何使用最新的程式語法來優化你的 Golang 程式碼。 什麼是 go-modern-guidelines? 它想解決的問題:模型的知識有截止日,Go 沒有 這個專案的定位寫得很直白:為 AI agent 提供當代的 Go 撰寫規範,讓它們不會因為知識截止日而寫出過時的 Go。 問題有兩層。第一層很好理解:模型訓練資料有截止時間,截止之後才進標準庫的東西,它沒看過就不會用。專案自己舉的例子是 errors.AsType[T](Go 1.26),模型沒見過,自然不會寫。 第二層比較微妙,專案稱之為 frequency bias:就算模型「知道」新寫法,訓練資料裡舊寫法出現的次數還是壓倒性地多。網路上十年份的 Go 程式碼裡,interface{} 的出現次數遠遠多於 any,sort.Slice 遠多於 slices.SortFunc。模型是在做機率預測,多數決贏的往往是舊的那個。 這第二點我在這次重構裡真的看到了。原本專案裡有這麼一段: // The oauth2 library can return an error containing "invalid_grant" // when the refresh token is expired, revoked, or otherwise invalid. if err != nil { errorStr := err.Error() // Basic substring check to avoid importing "strings" for i := 0; i <= len(errorStr)-13; i++ { if errorStr[i:i+13] == "invalid_grant" { return true } } } 一段手刻的字串搜尋,註解還特地解釋「為了避免 import strings」。strings 是標準庫,import 它的成本是零。這段程式碼要的其實就是一行 strings.Contains(err.Error(), "invalid_grant")。 它怎麼運作:兩個指令,一份隨 Go 版本增長的清單 工具本體是一支 CLI,只有兩個子指令: list [--go-version <version> | --file-path <path>] 回傳這個 Go 版本支援的規範清單,由新到舊排序。 explain <id>... 回傳特定規範的詳細說明與 before/after 範例。 list 的設計重點在於它會依 Go 版本回答不同的答案。你可以直接丟一個檔案路徑給它,它會自己往上找 go.mod、go.work,或退而求其次看本機的 Go toolchain: $ go-modern-guidelines list --file-path ~/Documents/linebot-file/main.go 我這個專案的 go.mod 寫 go 1.24.0,所以它回了 45 條。換個版本號,數字就跟著變: Go 版本 規範數 1.21 32 1.22...
前言: 起點是一個誤會。 我看到 Gemini API 文件多了一頁 Omni,介紹一個叫 Gemini Omni Flash 的模型,寫著「原生多模態,同時處理文字、圖片、聲音與影片」。我的第一個念頭很直接:那我把手機裡一整個資料夾的影片跟照片丟進去,讓它先看懂每個素材在拍什麼,再用一句話叫它剪成一支短影片,不就是一個剪片 App 了? 翻完文件發現我理解錯了,而且錯的剛好是最關鍵的那一點。但繞過那個限制之後,剩下的部分是真的做得出來的,成品是 ReelCraft:一支 Python CLI,把一包影片照片丟進去,Gemini 3.7 Flash 逐個看懂素材、提出剪輯建議,我確認過剪輯清單之後,ffmpeg 剪成 9:16 直式短影片,配樂用 Lyria 3 生成,字幕自動燒上去。 中間有三個問題是 ffmpeg 跟 Gemini 都回報成功、輸出卻是錯的,那種只有真的把影片播出來看才會發現的類型。 TL;DR 本篇文章會依序介紹: Omni Flash 不是我以為的那個東西 繞過限制:逐檔理解,再用文字彙整 把 edl.yaml 當成人工確認點 換上 Gemini 3.7 Flash 之後差多少 配樂:Lyria 3 走的是另一套 API ffmpeg 會安靜地剪錯給你看 字幕:兩個只有真的燒出來才看得到的問題 其他幾個坑 結論 參考連結 Omni Flash 不是我以為的那個東西 Gemini Omni Flash(gemini-omni-flash-preview)是影片生成與編輯模型,走的是 Interactions API,可以用自然語言對一支影片做效果編輯,例如「當人碰到鏡子時,讓鏡子像液體一樣漂亮地波動」。它不是拿來「看懂一堆影片」的工具。 限制那一段寫得很明白: Referencing or reasoning across multiple videos is not supported. Attempting multi-video prompting may result in degraded model performance or unexpected outputs. 另外還有一條: Video references up to 3 seconds in duration are accepted by the API schema but are not correctly processed by the model at this time. 所以「丟一堆影片進去讓它自己看懂再剪」這條路,在 Omni Flash 上直接被堵死。真正能做多影片理解的是一般的 Gemini 模型:2.5 之後單次請求最多可以帶 10 支影片,1M context 在預設解析度下大約吃得下一小時的長度,而且可以逐秒 tokenize,輸出帶時間戳的場景描述。 這個誤會花掉的時間不算浪費。查證的過程剛好把「哪件事該由哪個模型做」分清楚了,架構也就跟著定了。 繞過限制:逐檔理解,再用文字彙整 整條 pipeline 拆成五個階段,狀態全部落在檔案上: [素材資料夾] │ poc ingest 掃描影片/照片 → catalog.json ▼ │ poc analyze 每個檔案各自呼叫 Gemini → analysis/*.json ▼ │ poc plan 彙整所有分析結果,一次呼叫產生剪輯建議 ▼ →...