[{"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":35,"series-tools-2cc4bd83-4170-4fe8-8204-2c6f32aae872":87},{"id":4,"title":5,"content":6,"summary":7,"source":8,"source_url":9,"author":10,"image_url":11,"keywords":12,"language":18,"translated_content":10,"views":19,"is_premium":20,"created_at":21,"updated_at":21,"cover_image":11,"published_at":22,"rewrite_status":23,"rewrite_error":10,"rewritten_from_id":24,"slug":25,"category":26,"related_article_id":27,"status":28,"google_indexed_at":10,"x_posted_at":10,"tweet_text":10,"title_rewritten_at":10,"title_original":10,"key_takeaways":29,"topic_cluster_id":33,"embedding":34,"is_canonical_seed":20},"2cc4bd83-4170-4fe8-8204-2c6f32aae872","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",[13,14,15,16,17],"dbt","Semantic Layer","MetricFlow","dbt sl","data modeling","zh",0,false,"2026-05-19T14:23:58.228721+00:00","2026-05-19T14:23:58.199+00:00","done","6426a5af-c34f-45ad-9946-7e894d35a66a","dbt-sl-turns-semantic-layer-setup-into-a-loop-zh","tools","39106212-3aab-4cbb-8f59-90ff3bafd605","published",[30,31,32],"dbt sl 的重點不是 setup，而是本地驗證迴圈：parse、query、list dimensions。","parse 先把結構問題擋掉，query 才能抓出 metric 在真實粒度下的錯誤。","dimensions 列表是防止你把 metric 能力說過頭的最好工具。","c3c88dd2-a940-438a-b359-0e5a24562273","[-0.007818265,0.008166736,0.022021588,-0.09889561,-0.0072943904,-0.015890745,-0.019711932,-0.0040100925,0.023799306,-0.0040987777,-0.016841367,-0.014724141,0.0065572397,0.0054505537,0.109424554,0.0012930451,0.009669918,0.022464579,-0.005350893,0.0040643555,0.0068013556,0.015826765,0.01704433,-0.015796956,0.022215007,-0.0021673157,0.008657657,-0.018091425,0.048086323,-0.01427425,0.008653616,0.037020277,0.014952373,0.018323326,0.0058097066,0.022065071,0.027214423,-0.0005119785,0.0017647432,0.0051642493,-0.003800636,0.025997462,0.028545178,0.0012988102,0.0012909368,0.0068193283,-0.006887835,-0.033630803,0.003769618,0.024646843,0.007010636,-0.00033756788,0.001386834,-0.15473077,-0.0073581324,-0.002013174,-0.039681,0.012310066,0.018712753,0.004265334,-0.04651536,-0.0021886686,-0.030893242,-0.006423277,-0.0055939956,-0.021486374,0.039131954,-0.032227527,-0.016068747,0.010980844,-0.022029646,-0.0018339152,0.000469379,-0.006329937,-0.0095964195,-0.018344767,0.01243844,0.003202027,0.017238565,0.022100598,0.014545228,-0.030551901,-0.0066902363,0.010364327,-0.00012280713,0.02001177,0.00088887714,0.008566212,0.011179913,0.0036355,-0.00087156903,0.009129336,-0.00065448886,-0.026817098,0.0075965356,0.00093380694,-0.013976415,-0.009661421,0.005735964,-0.020623112,-0.021563925,-0.018501993,0.032248683,0.019012256,0.015673522,0.027813941,-0.012012626,-0.0127794705,0.008809684,-0.0104172705,0.01115424,-0.003178963,-0.0036163111,0.012558173,0.017144358,-0.11073599,0.0052106613,0.0019053268,0.016087437,0.0020201423,-0.016131677,0.010818061,0.007612107,0.016382677,-0.016304474,0.00068512774,-0.0070564803,-0.008730844,-0.013742093,-0.00954522,0.012277413,0.008917507,-0.015296621,0.008770312,-0.019479116,0.005479957,-0.0025353448,-0.0075831763,-0.01201887,-0.014418829,0.0077578374,0.004729693,-0.00559022,0.0022331455,-0.039617114,-0.0155263785,-0.030906368,0.011725146,-0.00031946626,-0.01470816,0.027299812,-0.0044217356,-0.0019098864,-0.009494989,0.022152456,-0.027120354,-0.012824949,0.010025622,0.01268404,0.028953832,-0.014751462,0.008922817,-0.0016415754,0.0073960563,0.012269262,0.045991547,-0.025122054,-0.013214708,0.03122184,0.011402157,-0.01367488,-0.0051545324,0.0049865344,0.0034783476,-0.016616223,0.019043874,-0.013951241,-0.017642105,0.015212005,-0.02315689,0.044922747,-0.023614582,0.007448794,0.020616492,0.0044725207,-0.007962474,-0.0085006105,-0.003828036,0.026319588,-0.005034113,0.001840655,0.005488238,0.03901095,-0.018628025,0.011199448,-0.01594048,-0.0021816588,-0.015664456,0.010818889,0.037754685,0.007590146,0.0022753195,0.01477965,-0.023282561,0.0059789307,-0.021682248,-0.010515373,-0.0070324005,0.008191058,0.02954157,-0.035390407,-0.006524993,0.009339022,-0.0014852192,-0.008988762,-0.013989267,-0.013097666,0.025012089,-0.010514609,-0.006120336,-0.0022299832,-0.00336783,0.013035597,0.0387157,-0.015831534,-0.015938507,-0.006644157,-0.023267996,-0.031613152,-0.008707628,0.013172367,0.018937651,0.0015792223,-0.022815403,0.006293167,-0.012791802,-0.0003925183,0.014226619,-0.008248527,0.026256753,-0.0044666813,0.006277883,-0.009709643,-0.002334245,0.017783714,0.0012491547,0.017526614,-0.013428295,-0.021425776,0.016220935,-0.004067163,0.00619042,0.01288144,-0.01965413,0.00011655042,-0.0146766165,-0.020202264,0.013683915,0.012628871,0.011690807,-0.00930488,-0.0120492475,-0.021994129,-0.014687088,0.009614934,0.009507448,0.015642198,0.019119663,-0.024889207,-0.019789789,-0.00639827,0.022596441,0.016048497,-0.0048171286,0.009945878,0.030522365,-0.067792125,0.042049553,0.011098536,-0.014321753,-0.008664727,-0.00070287,0.032190833,0.0094175795,0.0039449725,0.012853431,0.0008357669,-0.0037488136,-0.019700086,-0.024213187,0.021704694,0.015620341,0.029497303,-0.01833931,0.015100821,-0.025886988,-0.024733515,0.004197492,0.030959696,0.015137889,0.031255353,-0.0011509265,-0.006700325,0.044239312,-0.0056374227,0.013003663,0.009803166,0.018569352,0.0020497555,-0.008692653,-0.009381046,-0.0014659883,0.001433025,-0.021236734,0.00014508766,0.012083642,0.016510464,0.0027503157,-0.02849138,0.014744728,-0.015068894,-0.0109602185,0.006067128,0.006627708,-0.029551908,-0.0025833237,-0.018292837,-0.011892032,-0.01240216,-0.009010637,0.016936304,0.012178861,0.026668802,-0.0021639806,-0.0014145395,-0.0013148313,-0.0009079239,0.006706004,0.013776074,-0.02807404,-0.0027234973,-0.009747172,0.0069066696,-0.0014669303,-0.0122548975,-0.00042983287,0.006113729,0.020295598,0.0011421388,-0.02830233,0.025893986,-0.0034001947,-0.002238032,0.0010516259,-0.037495613,-0.007119182,0.011939633,-0.027592385,0.015917238,-0.035255,0.027769048,-0.01663751,-0.026342966,0.021172473,0.029830534,-0.032532148,0.028091284,0.022935566,-0.023613421,0.01617928,-0.012952703,-0.0065517877,0.013399583,-0.011510672,-0.0084746955,0.0038698835,-0.011573071,-0.0020709161,-0.0047034346,-0.036776353,0.005306534,0.0003994539,-0.024281768,0.009651128,-0.034145586,0.017271403,0.015736949,0.008729522,-0.0010065025,-0.013997739,0.0066590374,-0.01649679,-0.0013775557,0.02349738,0.038279496,-0.00058641116,-0.0029427614,-0.0043127285,-0.03371912,-0.008141898,0.007140536,0.015894782,-0.033443905,0.017246043,0.0065049333,-0.0247076,-0.020426333,-0.0048419796,-0.012006471,0.0009425245,0.022463392,-0.009262264,-0.025393026,0.01066048,0.025723565,0.010803319,-0.015905589,0.00080945774,0.028942255,0.0036877915,-0.008327023,0.01797649,0.011133252,-0.038637906,0.008591815,-0.016329026,-0.007378594,-0.02065955,0.010119934,-0.03492285,0.017242465,-0.0064872648,-0.030657519,-0.036364824,-0.018301763,-0.007559958,-0.019512016,0.0075754714,-0.001389147,-0.009149285,0.017502867,-0.007181347,0.011573436,-0.01219454,-0.014735266,0.0005077037,-0.014338219,-0.006032228,-0.036857903,-0.014902371,0.025630226,0.015242535,0.014579473,0.008387132,0.019337188,-0.03181509,-0.012745777,-0.0072024674,-0.019685525,0.007665452,-0.0035764137,-0.011875184,-0.002059252,-0.002735303,0.010878957,0.007054088,0.007972832,-0.009130767,0.006667408,-0.007943386,-0.012243196,0.03567299,0.01428601,0.0044634864,0.011703916,0.0072200503,-0.03326788,-0.00041123375,0.035086054,-0.018336333,0.011426232,-0.0048440117,-0.0038398376,0.017712053,0.010909869,-0.0011899767,0.0022241022,-0.0048347116,-0.020798303,0.020307329,0.0065211277,0.03222987,-0.01055084,-0.00046182348,-0.048508506,0.013040577,-0.010062609,-0.012716523,0.011215466,-0.016368503,-0.039614804,0.017660609,1.7925788e-05,-0.038901772,0.0113019375,-0.015897715,0.0013213492,-0.007076933,0.012571809,0.009135093,0.006007115,0.004378809,0.004828324,-0.0032598544,0.009615001,0.0056684893,-0.00935898,0.012453987,-0.027359733,-0.006433296,-0.0077116974,-0.009072318,-0.02809691,0.03459262,0.011741089,0.009919158,0.005050708,0.00526556,0.017402869,0.012265046,0.0074699633,0.043510165,-0.01970367,0.015133237,0.007748365,0.0034796922,0.0152603,0.03071379,-0.001626247,-0.009607718,-0.0049235164,-0.029644072,0.013255845,0.0058613094,0.02784564,-0.122249655,0.007879202,-0.01928453,-0.013837591,0.01787707,-0.0008146036,-0.014869954,0.004549937,0.008108229,0.013025695,-0.009162303,-0.024247222,0.03084456,-0.0054526413,-0.0058029755,-0.0013819397,-0.014966403,-0.028023597,0.002460899,-0.007033413,0.012984578,0.01782321,0.034718655,0.0030367144,0.014300373,0.024483783,-0.020950388,0.015548885,0.006764534,-0.0012586756,-0.04246801,-0.012787083,0.011444821,0.011190912,0.012852307,-0.013732423,0.009665858,-0.013086043,0.012361685,0.015128286,-0.031920213,-0.00802618,-0.017353734,-0.0020902941,-0.010216086,0.035818044,0.00017150823,-0.0054924083,-0.0045767217,-0.00449645,-0.035457004,-0.011285879,0.0124618765,-0.031047218,-0.007817838,0.024136778,0.0016888155,-0.0015982903,-0.011314617,0.027498445,-0.014253302,0.0044958545,-0.006179734,-0.012916223,-0.008485038,-0.017317543,0.007861492,0.014073225,-0.011049057,0.0038663058,-0.010384419,-0.0037988499,0.0005949429,0.008868257,0.0071352804,0.010119466,0.0006996442,0.02502553,-0.028144978,0.014650826,-0.0097218705,-0.0058653746,-0.07635988,-0.01298747,-0.0024108784,-0.004879614,0.022027418,-0.0010624485,0.0063568396,-0.011148641,-0.005991076,-0.0071467664,0.00945603,0.005457015,-0.0010826886,-0.016691871,0.003979647,0.021844544,-0.006268324,-0.0068445727,-0.008343856,-0.002415014,-0.012678848,0.013982407,0.022734147,-0.02457714,-0.0039778766,-0.010812383,-0.02008921,-0.015257014,0.015474445,-0.0020826175,0.009803511,-0.13827735,-0.0003354039,-0.0046644686,-0.044605177,0.011180778,0.006565267,0.0139348535,-0.009044749,-0.034989744,-0.011168838,0.010102271,-0.029891761,-0.020966198,-0.024334075,-0.0027138893,0.11865029,3.291893e-05,-0.018233921,-0.024789348,-0.01833543,-0.015553634,-0.030881625,-0.024790874,0.016113704,-0.0020764617,-0.01756439,0.017693339,-0.016672347,-0.0077325357,0.017003182,-0.017425632,-0.002884691,0.003262073,-0.00719574,0.0009933509,-0.021062331,0.009755863,-0.007965551,0.037125062,0.003363114,0.0018558884,0.02676353,-0.010398296,-0.00057425274,0.011872043,0.031376608,-0.030512547,-0.030304661,0.0071176575,-0.036358185,0.014650626,-0.08180233,-0.008783587,-0.0011445704,0.0035385757,0.015442819,-0.02760978,0.00012862614,0.022682987,0.009657849,-0.017948095,0.0063103107,-0.012851192,0.03602797,-0.0060544596,-0.016555468,0.04209926,0.05907733,0.014861799,0.011918261,-0.0122427875,0.023773205,-0.011703639,0.0033965658,-0.00093616167,-0.014942528,-0.020021297,0.021787452,0.03447639,0.00020597699,-0.016797991,-0.013672283,-0.0033832702,0.0047896435,-0.0059893057,-0.029582947,0.04043711,0.029852603,-0.004324188,-0.03006223,0.024397839,0.024848944,0.0036301692,-0.020775363,-0.010409751,0.016524885,-0.03717586,0.0024867197,0.018539576,0.007634796,-0.019247295,-0.031153904,-0.0017523046,-0.03086609,0.020490289,-0.00018422495,0.005882227,0.004929581,0.030769894,0.016632121]",{"tags":36,"relatedLang":46,"relatedPosts":50},[37,39,41,43,45],{"name":17,"slug":38},"data-modeling",{"name":40,"slug":40},"semantic-layer",{"name":42,"slug":42},"metricflow",{"name":44,"slug":44},"dbt-sl",{"name":13,"slug":13},{"id":27,"slug":47,"title":48,"language":49},"dbt-sl-turns-semantic-layer-setup-into-a-loop-en","dbt sl turns Semantic Layer setup into a loop","en",[51,57,63,69,75,81],{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":26},"aa78f0bb-2826-4d1e-a7ab-a6f5bb15a873","sim-visual-agent-workflow-canvas-zh","Sim 把 agent 流程變成畫布","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779201890676-1xsq.png","2026-05-19T14:44:16.281068+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":26},"9ae0773b-5a25-4d26-a750-c26b7f031f0f","low-latency-layer-reflex-anti-lag-linux-gpus-zh","low_latency_layer 讓 Linux GPU 也有低延遲","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779201242989-tzoj.png","2026-05-19T14:33:31.138213+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":26},"5951c90e-9b00-43b0-9135-88e1e6ea4376","kubernetes-v136-release-notes-playbook-zh","Kubernetes v1.36 把發布說明變作戰手冊","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779197685570-cy9v.png","2026-05-19T13:34:13.951402+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":26},"749d323d-fc9b-4492-946d-48f95ee0037d","kubernetes-turns-clusters-into-declared-state-zh","Kubernetes 把叢集變成宣告狀態","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779197095928-obv6.png","2026-05-19T13:24:24.468851+00:00",{"id":76,"slug":77,"title":78,"cover_image":79,"image_url":79,"created_at":80,"category":26},"a1bd40fe-2b96-430c-bce3-17f4b3284333","ibm-vibe-coding-guide-turns-prompts-into-code-zh","IBM Vibe Coding 把提示詞變程式碼","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779183875735-m3wz.png","2026-05-19T09:44:02.030134+00:00",{"id":82,"slug":83,"title":84,"cover_image":85,"image_url":85,"created_at":86,"category":26},"55c43732-c8a9-4ee1-a373-383fa27a41b4","anthropic-buys-stainless-sdk-tool-rivals-zh","Anthropic 收購 Stainless，SDK 工具進入戰局","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1779180252426-zkmj.png","2026-05-19T08:43:39.377553+00:00",[88,93,98,103,108,113,118,123,128,133],{"id":89,"slug":90,"title":91,"created_at":92},"de769291-4574-4c46-a76d-772bd99e6ec9","googles-biggest-gemini-launches-in-2026-zh","Google 2026 最大 Gemini 盤點","2026-03-26T07:26:39.21072+00:00",{"id":94,"slug":95,"title":96,"created_at":97},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":99,"slug":100,"title":101,"created_at":102},"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":104,"slug":105,"title":106,"created_at":107},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":109,"slug":110,"title":111,"created_at":112},"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":114,"slug":115,"title":116,"created_at":117},"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":119,"slug":120,"title":121,"created_at":122},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":124,"slug":125,"title":126,"created_at":127},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":129,"slug":130,"title":131,"created_at":132},"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":134,"slug":135,"title":136,"created_at":137},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00"]