<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Structured Output on YennJ12 Engineering Blog</title><link>https://yennj12.js.org/yennj12_blog_V4/tags/structured-output/</link><description>Recent content in Structured Output on YennJ12 Engineering Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 11 Sep 2026 13:00:00 +0800</lastBuildDate><atom:link href="https://yennj12.js.org/yennj12_blog_V4/tags/structured-output/feed.xml" rel="self" type="application/rss+xml"/><item><title>vLLM Intro Part 5 — 生產部署與服務化 — 從 vllm serve 到一份可被驗收的 SLO</title><link>https://yennj12.js.org/yennj12_blog_V4/posts/vllm-intro-part5-production-serving-zh/</link><pubDate>Fri, 11 Sep 2026 13:00:00 +0800</pubDate><guid>https://yennj12.js.org/yennj12_blog_V4/posts/vllm-intro-part5-production-serving-zh/</guid><description>大多數人上線 LLM 服務的方式，是把 vllm serve 包進 Dockerfile，接上 LB，看到 200 就宣布完成。 真正的答案是：一個推論服務的難度不在啟動，在於你能不能回答三個問題——現在慢在哪裡、加一張卡能買到多少、以及這個數字明天還會不會是真的。 能回答，你有一個服務。不能回答，你有一個會在流量尖峰當天讓你熬夜的黑箱。
前言 前四篇拆完了引擎：記憶體 、排程 、平行化與量化 。這一篇處理最後一段路——把引擎變成服務。
這段路上有五件事：對外的 API 面要長什麼樣、一個模型怎麼服務多個租戶、怎麼保證輸出格式可被程式解析、怎麼知道系統現在的狀態、以及怎麼在成本與 SLO 之間找到那個點。
本篇的目標：讀完之後，你有一份可以直接照抄的生產檢查清單，以及一套從 Grafana 指標反推根因的方法。
一、核心問題：從「跑得起來」到「可被驗收」 ┌──────────────────────────────────────────────────────────────┐ │ vllm serve &amp;lt;model&amp;gt; │ │ ✓ 跑起來了 │ └──────────────────────────────────────────────────────────────┘ │ ┌─────────────────────┼─────────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌────────────────┐ ┌────────────────┐ │ 問題 ① │ │ 問題 ② │ │ 問題 ③ │ │ 「現在慢在 │ │ 「加一張卡能 │ │ 「這個數字明天 │ │ 哪裡？」 │ │ 買到多少？」 │ │ 還算數嗎？」 │ ├───────────────┤ ├────────────────┤ ├────────────────┤ │ 需要： │ │ 需要： │ │ 需要： │ │ · 分階段指標 │ │ · 可信的 │ │ · 回歸測試 │ │ (queue/ │ │ benchmark │ │ · 版本鎖定 │ │ prefill/ │ │ · 容量模型 │ │ · 品質監控 │ │ decode) │ │ · 飽和曲線 │ │ · 金絲雀發布 │ │ · 症狀→根因鏈 │ │ │ │ │ └───────────────┘ └────────────────┘ └────────────────┘ 這三個問題對應本篇的第六、八、九節。在那之前，先把服務面補齊。</description></item></channel></rss>