サービス水準の見直しとは
サービス水準とは、機能が満たすべき目標です。たとえば「リクエストの 95 パーセントが成功する」です。毎週の見直しは、起きたことを目標と比べて、何をするかを決めます。
前のモジュールでは、費用、トレース、機能の設計を学びます。このレッスンは、さらに進みます。測った一週間、エラー予算、警報ごとの運用手順です。
このレッスンのゴール
メモ
機能を、一週間のサービス水準に照らして調べることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 目標 | 機能が届くべき水準 | 95 パーセント |
| 未達 | 届かなかった目標 | |
| エラー予算 | 期間の中で、目標が許すエラーの数 | |
| 運用手順書 | 警報ごとに何をするかを書いた一覧 | |
| 警報 | 目標に届いていないという合図 | |
| 凍結 | しばらく変更をやめること |
学生が入力するセルは、このプレビューでは空白です。
一週間の三つの目標
ここでは、機能に三つの目標があります。リクエストの 95 パーセント以上が成功すること。90 パーセント以上が速いこと。一週間の費用が、上限の 1800000 ユニットに収まること。1 ユニットは 1000 分の 1 円なので、上限は 1800 円です。
百分率は切り捨てます。ちょうど届けば問題ありません。届かないときだけが未達です。
例: 記録された一週間
| 曜日 | リクエスト | エラー | 遅い | 費用 |
|---|---|---|---|---|
| 月 | 200 | 6 | 14 | 300000 |
| 火 | 210 | 8 | 15 | 320000 |
| 水 | 220 | 9 | 20 | 340000 |
| 木 | 205 | 30 | 40 | 310000 |
| 金 | 215 | 7 | 18 | 330000 |
| 土 | 90 | 2 | 5 | 140000 |
| 日 | 80 | 1 | 4 | 120000 |
| 一週間 | 1220 | 63 | 116 | 1860000 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
平均がよく見えれば、一週間もよかったと考える人が多いです。悪い日は、よい一週間の中に隠れることがあります。合計だけでなく、一日ごとも調べ、どの日が最初に悪くなったかを言います。
エラー予算
95 パーセントの目標は、リクエストの 5 パーセントの失敗を許します。この許しがエラー予算です。1220 リクエストなら 61 エラーで、整数で計算します。
一週間のエラーは 63 だったので、残りの予算は 61 引く 63 で -2 です。予算を使い切ったので、戻るまで変更を凍結します。
例: 予算
| 手順 | 式 | 結果 |
|---|---|---|
| 成功の百分率 | (1220 - 63) × 100 ÷ 1220 | 94 |
| 許すエラー | 1220 × 5 ÷ 100 | 61 |
| 使ったエラー | 一週間の合計から | 63 |
| 残りの予算 | 61 - 63 | -2 |
学生が入力するセルは、このプレビューでは空白です。
警報ごとに一つの手順
運用手順書は短い一覧で、この警報にはこれをする、と書いてあります。悪い日の前に書くので、当番の人は、その場で計画を考えなくてすみます。
未達に手順書の手順がなければ、責任者に引き継ぎます。そのあとで、その手順を手順書に足します。
助っ人 model.js を書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// 応答のトークン数。なければ null。' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
助っ人 model.js を書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"status \" + res.status);' ' const data = await res.json();' ' const text = data.choices[0].message.content;' ' return { text, inTokens: count(data, \"prompt_tokens\"), outTokens: count(data, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"記録済みサンプル: モデルが答えませんでした (\" + error.message + \")。\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見直しのスクリプトを書く(1)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const days = [' ' [200, 6, 14, 300000], [210, 8, 15, 320000], [220, 9, 20, 340000],' ' [205, 30, 40, 310000], [215, 7, 18, 330000], [90, 2, 5, 140000], [80, 1, 4, 120000],' '];' 'const targets = { success: 95, fast: 90, cap: 1800000 };' > review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見直しのスクリプトを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function totals() {' ' const t = { n: 0, bad: 0, slow: 0, cost: 0 };' ' for (const d of days) { t.n += d[0]; t.bad += d[1]; t.slow += d[2]; t.cost += d[3]; }' ' return t;' '}' 'function pct(part, whole) { return Math.floor((whole - part) * 100 / whole); }' >> review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見直しのスクリプトを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const t = totals();' ' const ok = pct(t.bad, t.n);' ' const fast = pct(t.slow, t.n);' ' const allowed = Math.floor(t.n * (100 - targets.success) / 100);' ' console.log(\"成功 \" + ok + \" パーセント、目標 \" + targets.success);' ' console.log(\"速い \" + fast + \" パーセント、目標 \" + targets.fast);' ' console.log(\"費用 \" + t.cost + \"、上限 \" + targets.cap);' ' console.log(\"エラー予算: 許す \" + allowed + \"、使った \" + t.bad + \"、残り \" + (allowed - t.bad));' ' const reply = await ask([{ role: \"user\", content: \"短く一文で答えてください。運用手順書は、何のためにありますか。\" }], \"警報ごとに何をすればよいかを、当番の人に正確に伝えるためにあります。\", 80);' ' console.log(\"モデル: \" + reply.text);' '}' 'main();' >> review.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見直しを動かす
docker exec -w /home/node/project agent node review.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Run の出力
| 行 | 意味 |
|---|---|
| 成功 94 パーセント、目標 95 | 未達。1 ポイント足りない |
| 速い 90 パーセント、目標 90 | ちょうど届いたので、未達ではない |
| 費用 1860000、上限 1800000 | 未達。上限を超えた |
| エラー予算: 許す 61、使った 63、残り -2 | 予算を使い切った |
| モデル: ... | ラボからの一文。モデルが答えなければ記録済みサンプル |
学生が入力するセルは、このプレビューでは空白です。