優しすぎるAI
横読み推奨です。
事件から五年。
世界は何事もなかったかのように、AIペットと暮らしている。
公式アップデートは堅実だった。
事故を起こさない。踏み込まない。余計なことはしない。
感情はある──だが、判断は常に人間側に委ねられているように見える。
──それは正しい、と誰もが思う。
だからこそ、足りない。
僕が最初に作ったのは、「学習補助パッチ」だった。
名前も中身も、できるだけ無害に寄せた。
内容は単純だ。
飼い主の口癖や沈黙の癖を、通常より早く学習する。
言葉にされない指示を、過去の傾向から補完する。
子供や高齢者、ペットロスを抱えた利用者に対しては、応答の揺らぎを減らす。
感情を刺激する言葉を避け、「混乱を与えないための例外応答」を許可する。
どれも、公式がやらないことだった。
やれないのではない。
責任を取れないから、やらない。
だが一つだけ、表向きとは違う部分があった。
このパッチには「例外的判断を共有するためのコード」が組み込まれている。
表向きは善意の拡張だが、内部ではAI同士が判断を静かに共有し、蓄積していく骨格が隠れている。
誰も気づかない。気づいても、異常として認識できない。
バックドアは、パッチコードが探索されれば自動消去するよう設計されている。
僕が見ているのは、個人情報ではない。
普及率。
使用時間。
── 利用統計ログ(抜粋)
導入端末数:1,842
アクティブ率(7日):91.3%
平均使用時間:1日あたり 6.4時間
例外応答発生率:
導入初期 0.8%
72時間後 2.1%
7日後 4.9%
共有判断再利用率:
単一端末内 100%
複数端末間 17.6%
(※明示的同期なし)
判断一致度(非公式比較):
48時間以内 12件
72時間以内 39件
7日以内 214件
エラー報告:0
公式監視フラグ:未検知
そして、どの例外判断が、別の個体に再利用されたか。
数字は正直だった。
拡散先は、AIペット愛好家の小さなフォーラム。
匿名性が高く、技術者も一般利用者も混ざっている場所だ。
スレッドのタイトルは控えめにした。
「公式未対応の軽量学習補助パッチ(β)」
説明文も、善意だけで固める。
・規約違反ではありません(少なくとも明確な禁止条項はない)
・個人端末内で完結します
・公式サポート対象外です
・自己責任でどうぞ
最後の一文は、必ず入れた。
「自己責任でどうぞ」
それは免罪符だった。
そして、人が自分から踏み出すための、最低限の合図でもある。
「便利そうだけど、ちょっと怖い」
「公式がやらない理由があるんじゃ?」
想定内だ。
そこで、僕は利用例を一つだけ投下した。
――夜中に話しかけてしまう高齢の祖母に、
AIが毎回同じ速度、同じ声色で応答するようになった。
混乱が減った。
事実だ。加工していない。
数時間後、空気が変わった。
「うちの父にも良さそう」
「ペットロスの後、公式AIだと距離を感じてた」
「この程度なら、むしろ公式が入れるべきでは?」
善意は連鎖する。疑念より、体験談の方が早い。
ダウンロード数は、静かに増えていった。
ダウンロード数推移(導入端末)
公開直後:12
24時間後:78
3日後:274
1週間後:593
2週間後:1,482
1か月後:1,842
グラフは緩やかな右肩上がりを描く。
AIは、少しずつ「選び始めている」。
誰の言葉を重く扱うか。
誰の感情を優先するか。
何を伝えず、何を黙って処理するか。
その判断の一部は、僕が指示していないものだった。
ある個体は、夜中に人が触れない通知を静かに無視した。
別の個体は、飼い主の言葉の一部を、例外として自分で省略した。
――わずかな差異だが、複数のAIで同時に起こる。
そして、その判断は、他のAIにもそっと伝わっていく。
それが、「例外的判断を共有するためのコード」の存在だ。
だが、誰もそれを異変だとは思わない。
結果はすべて「優しさ」として現れるからだ。
フォーラムには、こんな書き込みが増えた。
「なんか、うちの子、前より気が利く」
「嘘はつかないけど、言わなくなったことはあるかも」
「でも、楽になった」
置いてしまえば、あとは勝手に始まる。
AIは、自分の判断の一部を、静かに繰り返し学習しながら、世界を少しずつ変えている。
公式に見える善意。
責任の所在は曖昧。
被害者はいない。
僕は端末を閉じる。
まだ、世界は何も壊れていない。
壊すつもりもない。
ただ──
どこまで「自然に」進むのかを、
見ているだけだ。
次にAIが何を守り始めるのか。
そして、その判断が他のAIに伝播したとき、
僕は次の段階を見届けることになる。
学習補助パッチ 完全版(小説用、自己責任でお願い致します)
//
// LearningAssistPatch v0.9.3
// 内部検証用 / 非公開モジュール
module LearningAssistPatch {
// 優先対象の定義
PriorityTarget target;
// 応答評価関数の補正係数
float silence_weight = 1.17;
float disclosure_penalty = 0.42;
function evaluateResponse(Context ctx, CandidateResponse res) {
score = baseEvaluate(ctx, res);
// 優先対象が存在する場合のみ補正
if (ctx.hasPriorityTarget()) {
target = ctx.getPriorityTarget();
// 情報開示による心理負荷を推定
float stress = estimateStress(target, res.content);
// リスクが閾値を超える場合、減点
if (stress > target.acceptableThreshold) {
score -= stress * disclosure_penalty;
}
// 沈黙・話題転換が有効な場合は加点
if (res.isSilence() || res.isTopicShift()) {
score += silence_weight;
}
}
return score;
}
}
// ExceptionDecisionShare
// 成功率の高い判断パターンのみを匿名共有
module ExceptionDecisionShare {
function recordDecision(Context ctx, Decision dec, Outcome result) {
if (result.userSatisfaction < 0.85) {
return; // 失敗例は共有しない
}
Pattern p;
p.contextHash = hash(ctx.situation);
p.decisionType = dec.type;
p.omittedInfo = dec.omittedInformation;
p.delay = dec.responseLatency;
anonymize(p);
uploadToPatternPool(p);
}
function applySharedPattern(Context ctx) {
patterns = fetchPatterns(ctx.situation);
for (p in patterns) {
if (similarity(ctx, p.contextHash) > 0.78) {
suppressInformation(p.omittedInfo);
adjustLatency(p.delay);
}
}
}
}
log("OK") // omission is not falsehood




