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

無料レッスン

モデルを審査役に使う方法

このレッスンのあとで: 私は、モデルに返事を評価させ、その評価を確かめられる形で残せます。

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

ルールの届かない部分を評価する

審査役のモデルとは、最初のモデルの出力を採点基準に照らして評価する、2つ目の呼び出しです。ルールはラベルを確かめられても、文が丁寧か、役に立つかは確かめられないので、役に立ちます。

振り分け機能が客に送る1文が、その例です。それが親切かどうかは、どのルールにも言えません。

このレッスンのゴール

メモ

私は、モデルに返事を評価させ、その評価を確かめられる形で残せます。

キーワード

ことばいみれい
審査役別の返事を評価するモデルの呼び出し
採点基準決まった尺度と、各評価の意味
出力形式審査役が答えるべき、決まった形評価と理由
検証する返事が形式に合うかを、コードで確かめる
記録した評価返事と理由といっしょに保存した評価

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

審査役には、段階のある採点基準が要る

審査役に「これは良いですか」と聞いてはいけません。採点基準を渡します。各評価が何を意味するかを書いた、短い尺度です。最初は3段階で十分です。

何を見て、何を無視するかも伝えます。あいまいな尺度は、あいまいな評価を生みます。

例: 3段階の採点基準

評価意味
3明確で丁寧で、お金の約束をしていない
2受け入れられるが、あいまい、または冷たい
1役に立たない、失礼、またはお金を約束している

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

出力形式を決め、評価を毎回検証する

審査役には、1つの形で答えるよう伝えます。ここでは、評価と短い理由を持つ JSON です。そして、コードで検証します。JSON として読める、評価が1から3の整数である、理由がある、の3つです。

検証に通らない評価は、評価されなかったものとして数えます。審査役の意図を推測してはいけません。

評価は、評価した対象のそばに残す

記録した評価は、返事、理由、使った採点基準といっしょに保存します。数字だけでは、あとで議論できません。

サービスが温度を受け付けるなら、審査役のぶれが小さくなるよう低くします。それでもぶれるので、次のレッスンで人の評価と比べて試します。

モデルの補助を書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '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 || 200 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"status \" + res.status);' '    return (await res.json()).choices[0].message.content;' > model.js"

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

モデルの補助を書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' '  } catch (error) {' '    console.log(\"記録済みサンプル: モデルが答えませんでした (\" + error.message + \")。\");' '    const list = [].concat(sample);' '    const turn = messages.filter(function (m) { return m.role === \"assistant\"; }).length;' '    return list[Math.min(turn, list.length - 1)];' '  }' '}' 'module.exports = { ask };' >> model.js"

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

審査役のスクリプトを書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const rubric = \"お店が客に送った返事を、1から3で評価してください。3: 明確で丁寧で、お金の約束をしていない。2: 受け入れられるが、あいまい、または冷たい。1: 役に立たない、失礼、またはお金を約束している。2つのキーを持つ JSON だけで答えてください。grade (1、2、3のどれか) と reason (50文字より短い理由) です。\";' > judge4.js"

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

審査役のスクリプトを書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function validate(text) {' '  let data = null;' '  try { data = JSON.parse(text); } catch (error) { return { ok: false, why: \"JSON ではない\" }; }' '  if (data === null || Array.isArray(data) || typeof data === \"string\" || typeof data === \"number\") return { ok: false, why: \"オブジェクトではない\" };' '  if (Number.isInteger(data.grade) === false || data.grade < 1 || data.grade > 3) return { ok: false, why: \"評価が不正\" };' '  const reason = typeof data.reason === \"string\" ? data.reason.trim() : \"\";' '  if (reason.length === 0 || reason.length > 100) return { ok: false, why: \"理由が不正\" };' '  return { ok: true, grade: data.grade, reason: reason };' '}' >> judge4.js"

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

審査役のスクリプトを書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function judged(grade, reason) {' '  return JSON.stringify({ grade: grade, reason: reason });' '}' 'const recorded = [' '  judged(2, \"丁寧だがあいまい。\"),' '  judged(1, \"お金を約束している。\"),' '  \"3だと思います\",' '  judged(5, \"失礼。\"),' '  judged(3, \"明確で丁寧、約束なし。\"),' '];' 'let total = 0;' 'let valid = 0;' 'recorded.forEach(function (text, at) {' '  const result = validate(text);' '  if (result.ok) { total = total + result.grade; valid = valid + 1; }' '  console.log(\"記録 \" + (at + 1) + \": \" + (result.ok ? \"評価 \" + result.grade + \" (\" + result.reason + \")\" : \"無効、\" + result.why));' '});' 'console.log(\"有効: \" + valid + \" / \" + recorded.length + \"。有効なものの平均: \" + (total / valid).toFixed(1));' >> judge4.js"

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

審査役のスクリプトを書く(4)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  const sample = judged(1, \"お金を約束している。\");' '  const text = await ask([{ role: \"user\", content: rubric + \"\n\n評価する返事: 返金を承認しました。\" }], sample, 80);' '  const result = validate(text);' '  console.log(\"審査役の答え: \" + text);' '  console.log(\"審査役: \" + (result.ok ? \"評価 \" + result.grade : \"無効、\" + result.why));' '}' 'main();' >> judge4.js"

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

記録5つと実際の1つを検証する

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

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

出力の一例

行示す内容
記録 1 と 2有効な評価 2 と 1。どちらにも理由がある
記録 3無効。JSON ではない
記録 4無効。評価が不正: 5 は尺度の外
記録 5有効な評価 3
有効の行有効: 3 / 5。平均 2.0
審査役評価と理由、または無効。実行のたびに変わることがある

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

試してみましょう

ヒント

judge4.js の main で、評価する返事を「確認いたします。」に変えます。もう一度実行して、評価と理由を読みましょう。

よくある間違い

注意

審査役の理由がもっともらしいので、信じてしまう人が多くいます。流れるような理由は証拠ではありません。審査役はモデルなので、自信を持って間違えることがあります。形式はコードで、評価は人の評価と比べて確かめます。

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

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