機能の中でデータを追う
データの流れの見直しは、個人情報が入ってくるところから終わるところまでを追います。どこへ行くか、誰が見るか、どれだけ残るか、なぜ使うかを問います。
見直しは、機能を出す前に、紙の上で問題を見つけます。考え方の道具であり、何かが決まりに合っているという証明ではありません。
このレッスンのゴール
メモ
機能のデータの流れを、チェックリストに照らして見直すことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| データの流れ | 個人情報が機能の中を通る道 | |
| チェックリスト | 各手順が答えるべき問いの一覧 | |
| 承認した場所 | データが行ってよいと、自分で決めた場所 | 自社データベース |
| 読める人 | そのデータを見られる人や集まり | |
| 目的 | その手順がデータを使う理由 |
学生が入力するセルは、このプレビューでは空白です。
流れは手順の一覧
旅の一つ一つの手順を、一行に書きます。手順には、名前、使うデータ、行き先、そこで誰が読めるかがあります。
残す日数、先に伏せたかどうか、使う理由もあります。この行に五つの問いをかけると、見直しになります。
五つの確認
| 確認 | 失敗するとき | 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 件 | まとめ |
| モデル: ... | 一文。言葉は毎回変わる |
学生が入力するセルは、このプレビューでは空白です。