クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

モデルのバージョンを固定する

このレッスンのあとで: モデルが機能の下で勝手に変わるのを、止めることができる。

60分のレッスンコマンド6件AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

モデルが勝手に変わってはいけない

モデルを固定するとは、機能が使うバージョンを、一つに決めて書くことです。いつも最新を指す名前は、固定ではありません。

月曜に動いた機能が、こちらは何もしないのに、火曜には違う動きをすることがあります。このレッスンは、誰も選んでいないのに起きるこの変更を止めます。

このレッスンのゴール

メモ

モデルが機能の下で勝手に変わるのを、止めることができる。

キーワード

ことばいみれい
固定バージョンを一つに決めて書くこと
別名動くことのあるバージョンを指す名前chat-latest
設定機能がどのモデルを使うかを書いたファイル
廃止予告あるバージョンが使えなくなると知らせる通知
退役の日そのバージョンが答えなくなる日

学生が入力するセルは、このプレビューでは空白です。

別名は動き、バージョンは動かない

設定には、機能が呼ぶモデルの名前を書きます。chat-latest と書くと、それが何を指すかは、提供元が決めます。ある日、新しいバージョンを指すようになります。

chat-v3 と書けば、そのバージョンだけを指します。機能が変わるのは、設定を直したときだけです。

例: 五つの名前

設定の名前固定?理由
chat-v3はいv と整数で終わる
chat-v10はい10 は整数
chat-latestいいえlatest は言葉で、数ではない
chatいいえバージョンがない
chat-v2bいいえ2b は整数ではない

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

固定すれば、ずっと安心だと考える人が多いです。そうではありません。固定したバージョンも、提供元が決めた日に退役します。固定が与えるのは、自分の都合で移る時間です。それも、退役の日の前に動いたときだけです。

通知は、移る日を教える

廃止予告は、バージョンと退役の日を知らせます。残りの日数は、その日から今日を引いた数です。

警告の窓を、たとえば 30 日と決めます。窓の中なら、退役が近いので、今すぐ移る計画を立てます。その日かそれ以降なら、退役ずみで、すでに動いていません。

例: 今日は 100 日目

バージョン退役の日残りの日数30 日の窓での状態
chat-v190-10退役ずみ
chat-v212525退役が近い
chat-v4300200ok
chat-v5通知なしなしok

学生が入力するセルは、このプレビューでは空白です。

助っ人 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 today = 100;' 'const configs = [' '  { feature: \"summary\", model: \"chat-v3\" },' '  { feature: \"search\", model: \"chat-latest\" },' '  { feature: \"triage\", model: \"chat-v2\" },' '  { feature: \"tags\", model: \"chat-v1\" },' '  { feature: \"draft\", model: \"chat\" },' '];' 'const notices = { \"chat-v2\": 125, \"chat-v1\": 90 };' > pin.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

固定の検査を書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function pinned(model) {' '  const tail = model.split(\"-\").pop();' '  const rest = tail.slice(1);' '  return tail.length > 1 && tail[0] === \"v\" && String(Number(rest)) === rest;' '}' 'function status(c) {' '  if (pinned(c.model) === false) return \"固定なし\";' '  const end = notices[c.model];' '  if (end === undefined) return \"ok\";' '  if (end <= today) return \"退役ずみ\";' '  return end - today <= 30 ? \"あと\" + (end - today) + \"日で退役\" : \"ok\";' '}' >> pin.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

固定の検査を書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  let bad = 0;' '  configs.forEach(function (c) {' '    const s = status(c);' '    if (s > \"ok\" || s < \"ok\") bad = bad + 1;' '    console.log(c.feature + \" \" + c.model + \": \" + s);' '  });' '  console.log(\"対応が必要: \" + configs.length + \" 件中 \" + bad + \" 件\");' '  const q = \"短く一文で答えてください。モデルをバージョンに固定するのは、なぜですか。\";' '  const sample = \"固定したバージョンは機能の下で変わらないので、移る時期を自分で決められるからです。\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 80);' '  console.log(\"モデル: \" + reply.text);' '}' 'main();' >> pin.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

固定の検査を動かす

コマンド
docker exec -w /home/node/project agent node pin.js

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

検査の出力

行意味
summary chat-v3: ok固定され、通知もない
search chat-latest: 固定なし別名なので、動くことがある
triage chat-v2: あと25日で退役固定でも、終わりが近い
tags chat-v1: 退役ずみ退役の日を過ぎた
draft chat: 固定なしバージョンがない
対応が必要: 5 件中 4 件決まりで数えた。モデルは使わない
モデル: ...ラボからの一文。モデルが答えなければ記録済みサンプル

学生が入力するセルは、このプレビューでは空白です。

このラボとソースについて: AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。