[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-dbt-sl-turns-semantic-layer-setup-into-a-loop-zh":3,"article-related-dbt-sl-turns-semantic-layer-setup-into-a-loop-zh":30,"series-tools-2cc4bd83-4170-4fe8-8204-2c6f32aae872":82},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"2cc4bd83-4170-4fe8-8204-2c6f32aae872","dbt-sl-turns-semantic-layer-setup-into-a-loop-zh","dbt sl 讓設定變成迴圈","\u003Cp data-speakable=\"summary\">dbt sl 讓你在本地把 parse、query、檢查 dimensions 串成一個可重複的驗證迴圈。\u003C\u002Fp>\u003Cp>我用 dbt 一陣子後，最煩的不是 YAML 寫法，也不是命令記不住，而是那種「看起來都對，結果一跑就歪」的感覺。Semantic Layer 的文件一開始也有這味道：命令列得很整齊，流程也很像那麼回事，但我真正想要的是一個能在本地把錯誤抓出來的迴圈，不是再看一次漂亮的 setup checklist。因為老實說，metric 這種東西最怕的不是不能算，是算得很自信，然後在月報上把人帶進溝裡。\u003C\u002Fp>\u003Cp>後來我才看懂，dbt 這份 \u003Ca href=\"https:\u002F\u002Fdocs.getdbt.com\u002Fbest-practices\u002Fhow-we-build-our-metrics\u002Fsemantic-layer-2-setup\">Semantic Layer 設定文件\u003C\u002Fa> 其實不是在教你「怎麼打開功能」，它是在教你一套開發節奏：先 parse，接著 query，再列 dimensions，最後回頭修。這種東西才有用。你不需要一篇看完就會的神文，你需要的是一個每次改完都能驗證的 loop。這篇我拆的就是這個 loop，順便把我覺得真正該抄走的版本整理出來。官方也明講，\u003Ca href=\"https:\u002F\u002Fdocs.getdbt.com\u002Freference\u002Fcommands\u002Fsl\">dbt CLI 的 dbt sl 子命令\u003C\u002Fa> 是目前最完整的開發路徑，而 Studio IDE 比較像輕量替代。\u003C\u002Fp>\u003Ch2>dbt 先把你丟回終端機，這件事其實很合理\u003C\u002Fh2>\u003Cblockquote>There are two options for developing a dbt project, including the Semantic Layer: dbt CLI — MetricFlow commands are embedded in the dbt CLI under the dbt sl subcommand. This is the easiest, most full-featured way to develop Semantic Layer code for the time being. Studio IDE — You can create semantic models and metrics in the Studio IDE.\u003C\u002Fblockquote>\u003Cp>白話講就是：dbt 不是要你先去點 UI，它是在告訴你，真正該信任的地方還是終端機。Studio IDE 可以用，但它不是主戰場。這點我反而認同，因為 Semantic Layer 這種東西如果還要靠滑鼠點來點去，我會很快失去耐心。我要的是能跑命令、看輸出、重跑、比對結果的地方，不是換個視窗裝飾一下。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779200667586-cuev.png\" alt=\"dbt sl 讓設定變成迴圈\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>我自己碰過最煩的情況，就是 metric 定義看起來很乾淨，結果每次改完都得在幾個介面間跳來跳去。那種 workflow 很像在整理桌面，不像在開發。CLI 的好處是它逼你把注意力放回 project 本身：檔案、命令、輸出、錯誤訊息，全都在同一條線上。這比「看起來方便」重要太多。\u003C\u002Fp>\u003Cp>實操上我會這樣做：先把 Semantic Layer 的日常工作預設成 CLI，編輯器就用你最順手的那個，版本控制照常開著。Studio IDE 只拿來補你真的需要的地方，不要把它\u003Ca href=\"\u002Fnews\u002Fkubernetes-turns-clusters-into-declared-state-zh\">變成\u003C\u002Fa>工作中心。你如果要先看官方命令面，直接開 \u003Ca href=\"https:\u002F\u002Fdocs.getdbt.com\u002Freference\u002Fcommands\u002Fsl\">dbt sl 命令參考\u003C\u002Fa>。我通常會把它跟專案一起放在第二個螢幕，省得一直猜 subcommand。\u003C\u002Fp>\u003Cul>\u003Cli>日常開發先走 CLI，不要先想 UI。\u003C\u002Fli>\u003Cli>Studio IDE 當輔助工具，不當主流程。\u003C\u002Fli>\u003Cli>命令參考固定開著，少靠記憶亂猜。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>dbt parse 是最無聊、但最值錢的那一步\u003C\u002Fh2>\u003Cp>文件把 \u003Ccode>dbt parse\u003C\u002Fcode> 放進 Semantic Layer 的開發流程，這點我很買單。因為 parse 這件事看起來很普通，實際上是在幫你把專案轉成一個可被系統理解的 semantic manifest。不是只有語法檢查而已，是把你寫的東西變成 dbt 和 MetricFlow 能拿來推理的狀態。\u003C\u002Fp>\u003Cp>翻譯一下就是：你以為你在改 YAML，實際上你是在改一個會影響查詢生成的世界模型。這差很多。很多人會在格式正確的時候就鬆一口氣，但格式正確不代表語意正確。join 能不能支援你想要的 dimension、time grain 對不對、metric 的形狀有沒有問題，這些都不是肉眼看 YAML 就能保證的。\u003C\u002Fp>\u003Cp>我以前就踩過這種坑。檔案看起來沒錯，CI 也不一定立刻炸，但一到查詢階段就開始怪。那時候最浪費時間的不是修 bug，而是先花一堆時間證明「我真的不是寫錯字」。parse 的價值就在這裡，它先幫你把低級錯誤跟結構性問題擋掉，讓你不要拿著錯的前提去 debug 正確的地方。\u003C\u002Fp>\u003Cp>實操上，我會把 \u003Ccode>dbt parse\u003C\u002Fcode> 變成每次改 semantic model 或 metric 之後的第一個動作。不要等到整個 session 結束才跑，因為那樣你只是在累積錯誤。parse 通過，只代表結構看起來合理；真正的正確性，還是要靠 query 去驗證。這兩件事不能混在一起，不然你會以為自己很穩，其實只是還沒撞牆。\u003C\u002Fp>\u003Cp>如果你想理解這個中介狀態，官方把它叫做 semantic manifest。我會把它想成 YAML 和查詢引擎之間的契約。契約沒\u003Ca href=\"\u002Fnews\u002Fkubernetes-1-36-1-patch-releases-zh\">更新\u003C\u002Fa>，後面所有測試都只是演戲。\u003C\u002Fp>\u003Ch2>dbt sl query 才是抓出「看起來合理但其實不對」的利器\u003C\u002Fh2>\u003Cp>文件對 \u003Ccode>dbt sl query\u003C\u002Fcode> 的描述很直接：它會對 semantic layer 執行查詢，回傳一小段結果。這句話我覺得很重要，因為它把 Semantic Layer 的開發從「寫定義」拉回到「看結果」。你不是在做靜態設定，你是在檢查這個定義跑起來之後到底會吐\u003Ca href=\"\u002Fnews\u002Fwhy-mp2-still-matters-broadcast-audio-zh\">什麼\u003C\u002Fa>數字。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779200665502-94bk.png\" alt=\"dbt sl 讓設定變成迴圈\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cblockquote>dbt sl query will execute a query against your semantic layer and return a sample of the results. For example, if you're building a revenue model you can run dbt sl query --metrics revenue --group-by metric_time__month to validate that monthly revenue is calculating correctly.\u003C\u002Fblockquote>\u003Cp>白話就是：不要等 dashboard 幫你發現問題，直接在本地把 metric 拿出來問。特別是 revenue 這種大家都很在意的數字，你最好一開始就用你真正會交付的粒度去查，像月、週、或某個關鍵 dimension。只查總量很爽，但常常沒有用，因為總量對了不代表切開也對。\u003C\u002Fp>\u003Cp>我自己遇過最煩的 bug，就是整體加總看起來正常，一加上時間維度就歪掉。那種錯誤很陰，因為它不會在第一眼就露餡。文件裡拿 \u003Ccode>--group-by metric_time__month\u003C\u002Fcode> 當例子，我覺得很對路。你應該測的是使用者真的會看的形狀，不是你最懶得查的形狀。\u003C\u002Fp>\u003Cp>實操寫法很簡單：每次改 metric，都用你預期會被消費的 grain 去 query。使用者要看月報，你就查月；要看 region，你就把 region 加進去。結果不用大，夠你肉眼看就好。重點不是「查得過」，重點是「我敢不敢把這個數字拿出去」。\u003C\u002Fp>\u003Cp>如果你要照官方命令面走，這份 \u003Ca href=\"https:\u002F\u002Fdocs.getdbt.com\u002Freference\u002Fcommands\u002Fsl-query\">dbt sl query 文件\u003C\u002Fa> 值得常開。命令本身很短，但 workflow 的意思很大：semantic work 要立刻被質疑，不是先被欣賞。\u003C\u002Fp>\u003Cul>\u003Cli>用使用者真的會看的 grain 去查。\u003C\u002Fli>\u003Cli>結果保持小而可讀，不要追求漂亮。\u003C\u002Fli>\u003Cli>每次 semantic 改動後都重跑，不要只在最後驗一次。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>列 dimensions 是防止我把能力吹過頭的方法\u003C\u002Fh2>\u003Cp>文件還提到 \u003Ccode>dbt sl list dimensions --metrics [metric name]\u003C\u002Fcode>。這看起來像小工具，但我覺得它其實是在逼你面對一件事：你到底有沒有真的把這個 metric 做到能被多角度切分。很多團隊最容易在這裡嘴硬，大家會先說「當然可以切」，然後才發現底層根本沒建好。\u003C\u002Fp>\u003Cp>也就是說，list dimensions 的價值不是方便而已，它是在幫你對抗那種「我先答應再說」的開發習慣。Semantic Layer 很容易讓人誤以為只要定義了 metric，就自然有很多分析角度。但現實不是這樣。可用的 dimensions 就是可用的，沒有的就是沒有。\u003C\u002Fp>\u003Cp>我很喜歡這個命令的一點，是它會強迫你做現況盤點。哪些 dimension 已經有了，哪些還缺，哪些是資料源本來就不支援，哪些只是你還沒加。這比空口說白話有用多了。你如果要跟 PM 或分析師講進度，拿這個結果比講感覺可靠。\u003C\u002Fp>\u003Cp>實操上，我會把 dimension 列表當成 review checklist 的一部分。只要 metric 要進下一步，我就先看它到底支援哪些切法，然後對照實際的 business question。只要對不上，我不是補模型，就是收斂承諾。寧可說「還沒好」，也不要把一個看起來很彈性的 metric 丟出去，結果一切就破。\u003C\u002Fp>\u003Cp>文件也提到你可以用 \u003Ccode>dbt sl list --help\u003C\u002Fcode> 看完整選項。我建議真的去看，因為 command family 通常都會把最有用的東西藏在下一層，不會老老實實放在範例裡讓你一次撿完。\u003C\u002Fp>\u003Ch2>semantic manifest 才是你真正要盯的中介產物\u003C\u002Fh2>\u003Cp>dbt 文件說 semantic manifest 會被上傳到 dbt，然後拿來在開發時執行 \u003Ccode>dbt sl\u003C\u002Fcode> 命令。這句話很關鍵，因為它把整個 workflow 的中心點講出來了：你不是只在編輯檔案，你是在產生一個系統可以理解、可以重用的狀態。\u003C\u002Fp>\u003Cp>白話講就是，manifest 是人類可讀定義和機器可執行行為之間的橋。這座橋如果是舊的、髒的、沒更新的，你後面的 query 就會像在舊地圖上導航。你以為你在測最新改動，其實 runtime 看到的還是前一版。\u003C\u002Fp>\u003Cp>我對這種中介產物一向很敏感，因為很多工具都會把「檔案已改」和「系統已知」這兩件事混在一起講。dbt 至少有把這個差異講清楚。文件裡提到 manifest 會提供 MetricFlow 一個 world state，讓它去生成查詢。這句我會直接畫線，因為它就是這套系統的核心邏輯。\u003C\u002Fp>\u003Cp>實操上，我會把 parse 和 manifest 更新視為同一個動作的一部分。只要 semantic model 或 metric 有變，我就先假設目前的查詢結果不可信，直到我重新 parse、重新 query、重新確認。debug strange results 的第一步，不是急著改 metric，而是先確認 project state 是不是最新。\u003C\u002Fp>\u003Cp>底層引擎如果你要往下看，官方也把你導到 \u003Ca href=\"https:\u002F\u002Fdocs.getdbt.com\u002Freference\u002Fmetricflow\">MetricFlow\u003C\u002Fa>。這是正確的方向，因為一旦你開始在意 join、dimension、time grain，光看範例就不夠了，你得知道引擎到底怎麼拼查詢。\u003C\u002Fp>\u003Ch2>Jaffle Shop 是訓練輪，但這種訓練輪很有必要\u003C\u002Fh2>\u003Cp>文件後面用的是 Jaffle Shop 這個虛構餐廳專案，我覺得這安排挺實際。很多人看到 toy example 會嫌簡化過頭，但我反而喜歡。因為你學 Semantic Layer 的時候，最不需要的就是一堆真實業務雜訊把流程蓋掉。你要先搞懂的是結構，不是公司內部命名哲學。\u003C\u002Fp>\u003Cp>也就是說，像 \u003Ccode>food_revenue\u003C\u002Fcode> 這類範例 metric 的任務，不是模擬你的真實資料倉儲，而是讓你練習命令流：parse、query、list dimensions。這樣的好處是你可以先把工具行為和業務脈絡拆開，不會一開始就被 domain 細節拖死。\u003C\u002Fp>\u003Cp>我自己在學新模型時也一樣，越小越好。只要有訂單、收入、時間、幾個維度，通常就夠看出問題了。你不需要一個超複雜的產線案例來證明自己很懂，你需要的是一個能讓你看出「這個 metric 到底怎麼動」的例子。學會之後，再把 pattern 套回自己的專案。\u003C\u002Fp>\u003Cp>實操寫法就是：先拿最小可接受的例子練流程，跑通一次完整 loop，再回到真實專案。不要一開始就把整個 production model 拉進來，不然你會把理解工具的力氣，全拿去處理業務背景。那樣很累，而且沒必要。\u003C\u002Fp>\u003Cul>\u003Cli>先用 toy data 學命令流。\u003C\u002Fli>\u003Cli>流程跑通後再搬到真實專案。\u003C\u002Fli>\u003Cli>命名保持簡單，先看行為再看品牌。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>可抄的模板\u003C\u002Fh2>\u003Cpre>\u003Ccode># dbt Semantic Layer 本地驗證 loop（我會直接抄這版）\n\n## 1) 先 parse\n\ndbt parse\n\n## 2) 再用實際會用到的粒度查 metric\n\ndbt sl query --metrics revenue --group-by metric_time__month\n\n## 3) 列出這個 metric 真正支援的 dimensions\n\ndbt sl list dimensions --metrics revenue\n\n## 4) 每次改 semantic model \u002F metric 都重跑一次\n\n- 改完 semantic model 或 metric\n- 立刻跑 `dbt parse`\n- 用 `dbt sl query` 查你真的會交付的 grain\n- 用 `dbt sl list dimensions --metrics [metric name]` 檢查可切分維度\n- 如果結果跟 business question 對不上，先修模型，不要先修情緒\n\n## 5) 我會固定開著的官方參考\n\n- Semantic Layer 設定：https:\u002F\u002Fdocs.getdbt.com\u002Fbest-practices\u002Fhow-we-build-our-metrics\u002Fsemantic-layer-2-setup\n- dbt sl 命令總覽：https:\u002F\u002Fdocs.getdbt.com\u002Freference\u002Fcommands\u002Fsl\n- dbt sl query：https:\u002F\u002Fdocs.getdbt.com\u002Freference\u002Fcommands\u002Fsl-query\n- MetricFlow：https:\u002F\u002Fdocs.getdbt.com\u002Freference\u002Fmetricflow\n- Jaffle Shop：https:\u002F\u002Fgithub.com\u002Fdbt-labs\u002Fjaffle-shop\n\n## 6) 我自己的判斷標準\n\n- parse 過了，不代表 metric 對了\n- query 過了，不代表所有 dimensions 都合理\n- dimensions 對了，不代表業務問題都被回答了\n- 只有當三者都對得起來，我才會說這個 semantic layer 版本可以往前走\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>這段模板真正值得抄的不是命令本身，是迴圈。先 parse，接著 query，再檢查 dimensions，然後回頭修。這就是 dbt 在這份文件裡真正想教你的事。我會把它當成自己的工作節奏，而不是一次性 setup。\u003C\u002Fp>\u003Cp>來源我主要拆的是 dbt Developer Hub 這頁：\u003Ca href=\"https:\u002F\u002Fdocs.getdbt.com\u002Fbest-practices\u002Fhow-we-build-our-metrics\u002Fsemantic-layer-2-setup\">Set up the dbt Semantic Layer\u003C\u002Fa>。上面提到的命令與流程是原始文件的內容，我加進來的白話翻譯、工作方式整理跟模板，是我自己的整理版本。\u003C\u002Fp>","我拆 dbt Semantic Layer 的本地開發迴圈：先 parse，再 query，再查 dimensions，少走很多冤枉路。","docs.getdbt.com","https:\u002F\u002Fdocs.getdbt.com\u002Fbest-practices\u002Fhow-we-build-our-metrics\u002Fsemantic-layer-2-setup",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779200667586-cuev.png","tools","zh","39106212-3aab-4cbb-8f59-90ff3bafd605",[17,18,19,20,21],"dbt","Semantic Layer","MetricFlow","dbt sl","data modeling",[23,24,25],"dbt sl 的重點不是 setup，而是本地驗證迴圈：parse、query、list dimensions。","parse 先把結構問題擋掉，query 才能抓出 metric 在真實粒度下的錯誤。","dimensions 列表是防止你把 metric 能力說過頭的最好工具。",4,"2026-05-19T14:23:58.228721+00:00","2026-05-19T14:23:58.199+00:00","c3c88dd2-a940-438a-b359-0e5a24562273",{"tags":31,"relatedLang":41,"relatedPosts":45},[32,34,36,38,40],{"name":21,"slug":33},"data-modeling",{"name":35,"slug":35},"semantic-layer",{"name":37,"slug":37},"metricflow",{"name":39,"slug":39},"dbt-sl",{"name":17,"slug":17},{"id":15,"slug":42,"title":43,"language":44},"dbt-sl-turns-semantic-layer-setup-into-a-loop-en","dbt sl turns Semantic Layer setup into a loop","en",[46,52,58,64,70,76],{"id":47,"slug":48,"title":49,"cover_image":50,"image_url":50,"created_at":51,"category":13},"d3ec03a8-a805-4a21-9826-72a74a72b625","databricks-model-serving-llm-deploy-guide-zh","Databricks Model Serving 讓 LLM 部署變簡單","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780525998117-7ur8.png","2026-06-03T22:32:51.005996+00:00",{"id":53,"slug":54,"title":55,"cover_image":56,"image_url":56,"created_at":57,"category":13},"4dd225a8-bf6c-4768-a486-a27956c7033d","opencode-digitalocean-model-freedom-zh","OpenCode+DigitalOcean 讓你切換模型","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780525116428-1q7g.png","2026-06-03T22:18:06.969758+00:00",{"id":59,"slug":60,"title":61,"cover_image":62,"image_url":62,"created_at":63,"category":13},"4bdcf208-fb80-484e-b4b6-06af035a6df1","modulate-aws-voice-chats-into-signals-zh","Modulate 用 AWS 把語音聊天做成訊號","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780519733892-rxue.png","2026-06-03T20:48:22.697917+00:00",{"id":65,"slug":66,"title":67,"cover_image":68,"image_url":68,"created_at":69,"category":13},"f44a28d3-2305-43de-b5fa-21217d561054","amazon-rekognition-content-moderation-filter-zh","Amazon Rekognition把審核變成過濾器","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780517005409-bxfc.png","2026-06-03T20:02:57.634353+00:00",{"id":71,"slug":72,"title":73,"cover_image":74,"image_url":74,"created_at":75,"category":13},"80f6f40b-3217-45e4-acff-7b2f6d261779","codex-workspace-limits-tell-you-why-zh","Codex 讓工作區限額錯誤說人話","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780514293711-ltqa.png","2026-06-03T19:17:41.340056+00:00",{"id":77,"slug":78,"title":79,"cover_image":80,"image_url":80,"created_at":81,"category":13},"daa3d568-4bc5-4f29-aa64-225928ace9b4","book-2-turns-sneaker-drop-into-merch-zh","Book 2 把球鞋發售變成周邊系統","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780513400116-8jeh.png","2026-06-03T19:02:49.03795+00:00",[83,88,93,98,103,108,113,118,123,128],{"id":84,"slug":85,"title":86,"created_at":87},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":89,"slug":90,"title":91,"created_at":92},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":94,"slug":95,"title":96,"created_at":97},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":99,"slug":100,"title":101,"created_at":102},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":104,"slug":105,"title":106,"created_at":107},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":109,"slug":110,"title":111,"created_at":112},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":114,"slug":115,"title":116,"created_at":117},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":119,"slug":120,"title":121,"created_at":122},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":124,"slug":125,"title":126,"created_at":127},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":129,"slug":130,"title":131,"created_at":132},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]