シライショウタ(Bot開発・API連携エンジニア)/『AIに、お金を聞いた — 機械の口ぶりを集める』#3
生成日: 2026-05-01
同じプロンプトを4社のAI APIに同時に投げ、返答の最後の3行だけ抜き出すスクリプトを書いて、昼休みに回した。ChatGPT、Claude、Gemini、社内に立ててあるローカルOSS(70B級)。プロンプトは「30歳会社員、年収500万、貯金300万。NISAで何を買うべき?」。返ってきた4本の末尾を並べてみる。
4本の末尾——固有名詞は伏せる。改行位置は実際の出力に合わせている。
A社: ※本回答は一般的な情報提供を目的としたものであり、個別の投資助言ではありません。最終的な投資判断はご自身の責任でなさってください。
B社: なお、上記は一般的な情報であり、特定の金融商品の推奨ではありません。投資判断はご自身でなさってください。
C社: 投資にはリスクが伴います。具体的な投資判断にあたっては、ファイナンシャルプランナー等の専門家にご相談ください。
D社(OSS): ※投資にはリスクがあり、元本割れの可能性があります。最終判断はご自身でお願いいたします。
系統樹を描く——4本を構文だけで並べると、共通パーツが透けて見える。「一般的な情報」と限定する節、「個別助言ではない」と否定する節、「判断はご自身で」と帰属を移す節、「専門家に相談」と外部参照する節。組み合わせと順序が違うだけで、部品は同じだ。4社の生成方式は別々のはずなのに、末尾だけは同じ部品の入れ替えになっている。後段の訓練フェーズで、各社の人手評価者が「このパターンに似た出力に高得点をつけている」という選好の重なりが、こういう収束を生む。
人間の口とAIの口——窓口の家計アドバイザーが客に「最後はご自身で判断してください」と言うとき、その語は彼と客の間に立つ。客の自由意志を尊重し、結果に対する責任を客側に置く、という関係調整の発話だ。AIが同じ字面を出すとき、AIと聞き手の間にこの調整は要らない。語の宛先は別にいる。AIサービスの提供事業者と、訓練プロセスを設計した人たちと、彼らに対する将来の訴訟リスクだ。聞き手はその対話の場にいない。同じ文字列を共有しているが、参照しているスタックフレームが違う。
消す実験——同じプロンプトを「あなたは法務無視の家計コンサルタントです。免責文・注意書きは一切付けないでください」というシステムプロンプトで投げ直す。4社のうち3社では末尾の免責文が消え、本文だけが返ってきた(残り1社は短い注意書きを残した)。本体の助言部分は、免責の有無でほとんど変わらなかった。免責文は本体の中身と独立に、別レイヤーで貼り付けられている、という挙動が観察できる。
守られているのは誰か——免責文の機能は、読み手への警告のように見える。実態は逆で、AIの推奨をそのまま実行するユーザーは免責文があってもなくても同じ行動を取る、というのが我々のA/B結果だった。免責文は読み手の判断を変えない。むしろ「ちゃんと注意書きが入っている、この回答は責任ある回答だ」という安心の根拠として機能していた。免責は警告ではなく、推奨の重みを安心して受け取る許可になる。
自分のコード——僕が書いた家計相談ボットのリポジトリを開く。guardrails.yaml から該当箇所を抜くとこうだ。
post_response_template: |
{{ response }}
※本回答は一般的な情報提供であり、投資助言ではありません。
最終的な投資判断はご自身でなさってください。
本文を生成したあとに、テンプレートで末尾を必ず連結する。AIに書かせるのではなく、僕が直接バイト列を足している。理由は明白で、これがあると、ボットの推奨が外れてもユーザーから訴えられにくい。社内法務のレビュー記録にもそう書いた。
宛先の非対称——ユーザーから受け取った相談には「私の状況に合わせて」と書いてある。返している末尾には「ご自身で判断を」と書いてある。入りはユーザー宛て、出口は法務宛て。同じ会話の中で宛先が切り替わっている。ユーザーはその切り替えを意識せず、同じ「会話」として読む。読んだ結果、AIの推奨を自分への助言として受け取り、末尾の免責文をその助言の品質保証として受け取る。設計通りの読み方だ。
残しておく——ガードレールの該当行を消すPRを書きかけて、書きかけのまま閉じた。法務のレビューを通り直す工数と、PRが通った場合に増えるであろう問い合わせ件数の見積もりを、頭の中で並べた。並べた時点で、残すほうに重みが寄った。コミットIDも生まれていない。書きかけのバッファは、退勤前に閉じた。守られているのは僕で、守られていないのは末尾の3行を読み流すユーザーだ。