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

無料レッスン

AI機能のデータの流れを見直す

このレッスンのあとで: 機能のデータの流れを、チェックリストに照らして見直すことができる。

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

機能の中でデータを追う

データの流れの見直しは、個人情報が入ってくるところから終わるところまでを追います。どこへ行くか、誰が見るか、どれだけ残るか、なぜ使うかを問います。

見直しは、機能を出す前に、紙の上で問題を見つけます。考え方の道具であり、何かが決まりに合っているという証明ではありません。

このレッスンのゴール

メモ

機能のデータの流れを、チェックリストに照らして見直すことができる。

キーワード

ことばいみれい
データの流れ個人情報が機能の中を通る道
チェックリスト各手順が答えるべき問いの一覧
承認した場所データが行ってよいと、自分で決めた場所自社データベース
読める人そのデータを見られる人や集まり
目的その手順がデータを使う理由

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

流れは手順の一覧

旅の一つ一つの手順を、一行に書きます。手順には、名前、使うデータ、行き先、そこで誰が読めるかがあります。

残す日数、先に伏せたかどうか、使う理由もあります。この行に五つの問いをかけると、見直しになります。

五つの確認

確認失敗するときRun の例
伏せずに外へ送信承認していない場所へ、伏せずに送るアプリからモデル
読める人が多すぎる読める人に全員が入っているログに書く
期限なし残す日数が決まっていないログに書く
保存が長すぎる日数が自分の上限より大きい毎週の書き出し、400 日
目的なし理由が書かれていない毎週の書き出し

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

見直しは、失敗を一つずつ報告する

手順を順に確かめ、失敗をすべて一覧にします。一つの手順が、いくつもの確認に失敗することがあります。何にも失敗しない手順は、一覧に何も足しません。

確認ごとに失敗を数えます。たとえば三つの手順に期限がないと分かれば、まとめて直せます。

よくある間違い

注意

チェックリストに通った流れは、決まりに合っている、と考える人が多いです。そうではありません。五つの問いに答えがある、というだけです。決まりは、国や使い方で違うので、分かる人が決めます。このレッスンは法律の助言ではありません。

助っ人 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 approved = [\"自社アプリ\", \"自社データベース\"];' 'const limit = 90;' 'const flow = [' '  { step: \"フォームからアプリ\", data: [\"email\", \"message\"], to: \"自社アプリ\", who: [\"サポート\"], keep: 30, redacted: false, why: \"お客様に答える\" },' '  { step: \"アプリからモデル\", data: [\"message\"], to: \"モデルの事業者\", who: [\"モデルの事業者\"], keep: 0, redacted: false, why: \"返事を書く\" },' '  { step: \"ログに書く\", data: [\"email\"], to: \"自社データベース\", who: [\"全員\"], keep: null, redacted: false, why: \"不具合を調べる\" },' '];' > review.js"

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

流れを見直す道具を書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'flow.push({ step: \"毎週の書き出し\", data: [\"email\"], to: \"分析の委託先\", who: [\"分析担当\"], keep: 400, redacted: true, why: \"\" });' 'flow.push({ step: \"キャッシュ\", data: [], to: \"自社アプリ\", who: [\"サポート\"], keep: 1, redacted: false, why: \"速くする\" });' 'function check(s) {' '  const out = [];' '  if (s.data.length > 0 && approved.indexOf(s.to) < 0 && s.redacted === false) out.push(\"伏せずに外へ送信\");' '  if (s.who.indexOf(\"全員\") >= 0) out.push(\"読める人が多すぎる\");' '  if (s.keep === null) out.push(\"期限なし\");' '  else if (s.keep > limit) out.push(\"保存が長すぎる\");' '  if (s.why.trim().length === 0) out.push(\"目的なし\");' '  return out;' '}' >> review.js"

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

流れを見直す道具を書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  let failing = 0;' '  flow.forEach(function (s) {' '    const f = check(s);' '    if (f.length > 0) failing = failing + 1;' '    console.log(s.step + \" -> \" + (f.length === 0 ? \"合格\" : f.join(\"、\")));' '  });' '  console.log(\"不合格の手順: \" + flow.length + \" 件のうち \" + failing + \" 件\");' '  const q = \"短く一文で答えてください。個人情報を使う手順ごとに、目的を書き留めるのは、なぜですか。\";' '  const sample = \"目的が書いてあれば、何のために使うかが分かり、理由のない手順が目立つからです。\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 80);' '  console.log(\"モデル: \" + reply.text);' '}' 'main();' >> review.js"

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

流れを見直す道具を動かす

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

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

Run の出力

行意味
フォームからアプリ -> 合格承認した場所で、理由も期限もある
アプリからモデル -> 伏せずに外へ送信メッセージが伏せずに出た
ログに書く -> 読める人が多すぎる、期限なし一つの手順に失敗が二つ
毎週の書き出し -> 保存が長すぎる、目的なしもう二つの失敗
不合格の手順: 5 件のうち 3 件まとめ
モデル: ...一文。言葉は毎回変わる

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

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

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