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

無料レッスン

モデルが見たものを確かめる

このレッスンのあとで: モデルの説明を主張に分け、入力の事実と照らして判定できます。

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

説明はもっともらしいが、本当か

駐輪場の写真に、「赤い自転車が 3 台、傘が 2 本、犬が一匹」という説明が付きました。すらすらと読めるので、つい信じてしまいます。

でも、数が違うかもしれませんし、写っていない犬が足されているかもしれません。このレッスンでは、説明を一つずつ確かめます。

このレッスンのゴール

メモ

モデルの説明を主張に分け、入力の事実と照らして判定できます。

キーワード

ことばいみ
主張説明の中の、確かめられる一言
事実入力について、すでに分かっていること
判定主張が事実と合うかの結論
作り話入力にないものを、あるかのように言うこと
裏付け主張を支える事実

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

説明を主張に分ける

長い説明は、一度に確かめられません。「赤い自転車が 3 台ある」のように、確かめられる一言に分けます。これが主張です。

主張には、数、ある、色、文字の四つの種類があります。それぞれに、照らす事実が決まっています。

四つの主張と、照らす事実

主張種類照らす事実判定
自転車が 3 台数数えた数 3裏付けあり
傘が 2 本数数えた数 1数が違う
犬がいるある数えた物に犬がない存在しない
傘は青い色傘の色の記録がない確認できない

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

誤りの種類ごとに判定が違う

誤りは一種類ではありません。数や色の間違いは、直せば使えます。入力にないものを足す作り話は、説明全体を疑う理由になります。

確かめる事実がない主張は、正しいとも間違いとも言えません。「確認できない」として、人に回します。

よくある間違い

注意

「自然な文章なら、内容も正しい」と考えがちです。文章の流れの良さと、事実の正しさは別です。作り話は、自然な文章の中に紛れて、一番気付きにくくなります。

モデル用の補助を書く(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"

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

モデル用の補助を書く(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 d = await res.json();' '    return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"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 facts = { counts: { \"自転車\": 3, \"傘\": 1 }, colours: { \"自転車\": \"赤\" }, text: \"駐輪場\" };' 'const claims = [' '  { say: \"自転車が 3 台\", kind: \"count\", thing: \"自転車\", value: 3 },' '  { say: \"傘が 2 本\", kind: \"count\", thing: \"傘\", value: 2 },' '  { say: \"犬がいる\", kind: \"exists\", thing: \"犬\" },' '  { say: \"傘は青い\", kind: \"colour\", thing: \"傘\", value: \"青\" },' '  { say: \"看板は「駐輪場」\", kind: \"text\", value: \"駐輪場\" },' '  { say: \"自転車は青い\", kind: \"colour\", thing: \"自転車\", value: \"青\" },' '];' > check5.js"

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

主張を確かめるスクリプトを書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function check(f, c) {' '  if (c.kind === \"text\") return c.value === f.text ? \"裏付けあり\" : \"文字が違う\";' '  if ((c.thing in f.counts) === false) return \"存在しない\";' '  if (c.kind === \"exists\") return f.counts[c.thing] > 0 ? \"裏付けあり\" : \"存在しない\";' '  if (c.kind === \"count\") return f.counts[c.thing] === c.value ? \"裏付けあり\" : \"数が違う\";' '  if ((c.thing in f.colours) === false) return \"確認できない\";' '  return f.colours[c.thing] === c.value ? \"裏付けあり\" : \"色が違う\";' '}' >> check5.js"

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

主張を確かめるスクリプトを書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function decide(list) {' '  if (list.indexOf(\"存在しない\") >= 0) return \"却下\";' '  if (list.some(function (v) { return v > \"裏付けあり\" || v < \"裏付けあり\"; })) return \"要確認\";' '  return \"承認\";' '}' >> check5.js"

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

主張を確かめるスクリプトを書く(4)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  const verdicts = claims.map(function (c) { return check(facts, c); });' '  claims.forEach(function (c, i) { console.log((i + 1) + \". \" + c.say + \" -> \" + verdicts[i]); });' '  console.log(\"判断: \" + decide(verdicts));' '  const q = \"画像の説明を、画像と照らして確かめる理由を、短い一文で書いてください。\";' '  const r = await ask([{ role: \"user\", content: q }], \"説明はもっともらしく聞こえても、数や色が違ったり、写っていないものが足されたりするからです。\", 60);' '  console.log(\"返事: \" + r.text);' '}' 'main();' >> check5.js"

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

記録した六つの主張を確かめる

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

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

出力の例

行示していること
1. 自転車が 3 台 -> 裏付けあり数が事実と合った
2. 傘が 2 本 -> 数が違う事実は 1 本
3. 犬がいる -> 存在しない写っていないものが足された
判断: 却下作り話が一つあるので、説明全体を使わない
返事: ...モデルの一文。先に「記録済みサンプル」の行が出ることもある

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

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

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