相手は人か、プログラムか
AI の透明性とは、相手が AI システムだと人に伝え、AI が作ったものを示すことです。プログラムが書いた返事だと知っていれば、人はその返事を違う目で見ます。
もう半分は、記録を残すことです。何か問題が起きたとき、審査では、何を聞かれ、どのモデルが答え、だれが承認したかを知る必要があります。
このレッスンのゴール
メモ
AI だと人に伝え、AI が作ったものに表示を付け、審査に要る記録を残せる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 開示 | 相手が AI だと人に伝えること | |
| 表示 | AI が作ったと分かる目に見える印 | |
| 記録 | AI の一つの答えを保存したもの | |
| モデルの版 | 実際に答えたモデルの正確な版 | v3 |
| 保存期間 | 記録を残しておく長さ | |
| システムカード | AI 機能を説明する短い一枚 |
学生が入力するセルは、このプレビューでは空白です。
相手が AI だと伝える
人が返事を頼りにする前に、目に入る場所で伝えます。チャットの最初、答えのすぐ横、電話の最初のひと言に置きます。
できることとできないこと、人に代わる方法も一行で添えます。期待の伝え方は「AI機能への期待をどう伝えるか」で詳しく学びます。
AI が作ったものに表示を付ける
モデルが作った文章、画像、要約には、読む人に見える短い表示を付けます。表示が伝えるのは、だれが作ったかです。正しいかどうかではありません。
ファイルが製品の外に出るときは、ファイルの情報欄にも書いておきます。そうすれば、だれかがコピーしても表示が残ります。
例: どこで伝えるか
| 場所 | 人に見えるもの |
|---|---|
| チャットの最初 | AI アシスタントがお答えします。人に代わることもできます。 |
| 画像の下 | AI で作成 |
| メールの下書きの末尾 | AI が下書きし、高橋 翔が確認しました |
| 電話の最初のひと言 | こちらは自動音声のアシスタントです。 |
学生が入力するセルは、このプレビューでは空白です。
記録に入れるもの
記録には、何を聞かれたか、どのモデルの版が答えたか、操作をだれが承認したかを入れます。版がなければ、どのモデルが間違えたのかだれにも分かりません。
記録は審査に要る間だけ残し、要らない個人データは入れません。安全な記録は「AIアプリで安全に記録する」で、個人データは「AIアプリのプライバシーとデータ保護」で学びます。
よくある間違い
注意
「記録は多いほど安全」と考え、何でも永久に残しがちです。個人データだらけの記録を何年も残すと、それ自体が危険になります。審査に要る欄だけを、要る間だけ残します。
短いシステムカードで機能を説明する
システムカードは、モデルカードとも呼ばれ、AI 機能やモデルについての短い一枚です。目的、限界、評価のしかた、責任者、連絡先を書きます。
その機能を一度も見たことのない人に向けて書きます。空の欄は抜けです。審査の抜けと同じです。
決まりがこれを求める場面が増えている
EU や英国の決まりは、AI だと伝えること、作ったものに表示を付けること、記録を残すことを、作り手に求める場面が増えています。何をいつから求めるかは、場所によって違い、変わっていきます。
これは一般的な情報であり、法的助言ではありません。最新の公式な文書を確かめるか、資格のある人に相談してください。これらをしただけで、製品がどれかの決まりを満たすことにはなりません。
例: 短いシステムカード
| 欄 | 注文アシスタント |
|---|---|
| 目的 | 注文についての質問に答える |
| 限界 | 支払いと住所は変えられない |
| 評価 | 記録した 40 件のうち 37 件が合格 |
| 責任者 | 山本 葵 |
| 連絡先 | [email protected] |
学生が入力するセルは、このプレビューでは空白です。
モデル用の補助を書く(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 KEEP_DAYS = 90; // これより古い記録は消す' '// サポート用アシスタントの架空の記録。経過日数は時計ではなく、ただの日数。' 'const records = [' ' { id: 1, asked: \"注文した品はどこですか\", version: \"v3\", action: false, approvedBy: \"\", age: 12, personal: false },' ' { id: 2, asked: \"注文 88 を返金して\", version: \"v3\", action: true, approvedBy: \"\", age: 30, personal: false },' ' { id: 3, asked: \"住所を変えてください\", version: \"\", action: true, approvedBy: \"高橋 翔\", age: 120, personal: false },' ' { id: 4, asked: \"なぜ二回請求されたのですか\", version: \"v2\", action: false, approvedBy: \"\", age: 5, personal: true },' '];' > records.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
記録のチェックを書く(2)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function problems(r) {' ' const found = [];' ' if (r.asked.trim() === \"\") found.push(\"質問がない\");' ' if (r.version.trim() === \"\") found.push(\"モデルの版がない\");' ' if (r.action && r.approvedBy.trim() === \"\") found.push(\"承認者がいない\");' ' if (r.age > KEEP_DAYS) found.push(\"保存期間を過ぎた\");' ' if (r.personal) found.push(\"不要な個人データ\");' ' return found;' '}' >> records.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
記録のチェックを書く(3)
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// 機能の短いカード。どの欄にも言葉が入っているべき。' 'const card = { purpose: \"注文の質問に答える\", limits: \"支払いは変えられない\", evaluations: \"\", owner: \"山本 葵\", contact: \"[email protected]\" };' 'const labels = { purpose: \"目的\", limits: \"限界\", evaluations: \"評価\", owner: \"責任者\", contact: \"連絡先\" };' >> records.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
記録のチェックを書く(4)
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' records.forEach(function (r) {' ' const p = problems(r);' ' console.log(\"記録 \" + r.id + \": \" + (p.length === 0 ? \"問題なし\" : p.join(\"、\")));' ' });' ' const empty = Object.keys(card).filter(function (k) { return card[k].trim() === \"\"; });' ' console.log(\"カードに足りない欄: \" + (empty.length === 0 ? \"なし\" : empty.map(function (k) { return labels[k]; }).join(\"、\")));' ' const q = \"AI と話していることを利用者に伝えるため、チャット画面に出す短い一文を書いてください。\";' ' const r = await ask([{ role: \"user\", content: q }], \"AI アシスタントがお答えします。間違えることがあり、いつでも人に代われます。\", 60);' ' console.log(\"お知らせの例: \" + r.text);' '}' 'main();' >> records.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
記録のチェックを実行する
docker exec -w /home/node/project agent node records.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の例
| 行 | 示していること |
|---|---|
| 記録 1: 問題なし | 足りないものはない |
| 記録 2: 承認者がいない | だれの名前もない返金 |
| 記録 3: モデルの版がない、保存期間を過ぎた | どのモデルが答えたか分からず、古すぎる |
| 記録 4: 不要な個人データ | 審査に要る以上のものを持っている |
| カードに足りない欄: 評価 | カードがテストについて何も書いていない |
| お知らせの例: ... | あなた自身の呼び出し。実行ごとに変わるか、記録済みサンプルと出る |
学生が入力するセルは、このプレビューでは空白です。