AIが「挨拶だけして終了」する日が続いた——原因は文字化けだった話
毎朝7時に動くはずのAIが、1週間ずっと「承知しました。何をすればよいでしょうか」とだけ返してきました。エラーは出ません。しかも3回に1回はちゃんと動く。
原因はAIではなく、AIに指示を渡す途中の経路でした。日本語が全部「?」に化けていたんです。
(連載『一人社長室』の第3回です。前回予告した、この文字化けの話を書きます。)
症状:毎朝のAIが「挨拶だけして終了」する
うちでは毎朝7時に、AI(Claude Code)が前日のAI業界ニュースを集めて要約し、メールで送ってくる仕組みが動いています。7時20分には、その日の予定とTODOを整理した「司令塔」メールも届きます。
ある時期から、これが変になりました。
動いてはいる。エラーも出ない。でも、届くメールの中身が空っぽ。
正確に言うと、空っぽですらなくて、「承知しました。何をすればよいでしょうか」みたいな挨拶だけが返ってくる。仕事をせずに、返事だけして終わっている状態です。
しかも毎回じゃない。3回に1回はちゃんと動く。この「たまに動く」が、いちばん厄介でした。
犯人探しで1週間:モデルもプロンプトも環境も外れだった
最初に疑ったのはAIの側です。モデルが変わったのか、プロンプトが悪いのか、指示が長すぎるのか。プロンプトを短くしたり、書き方を変えたり、モデルを変えたり——ぜんぶ効きませんでした。
次に疑ったのは実行環境です。タスクスケジューラの設定、権限、パスの通り方。ここも問題なし。
正直に言うと、この時点でわたしは「AIが不安定なんだな」と結論づけかけていました。これがいちばん危ない判断です。原因を「AIのせい」で止めると、そこで調査が終わってしまう。
真因:PowerShellの文字コード設定で、日本語が「?」に潰れていた
見つけたきっかけは、AIに渡している指示文そのものを、渡す直前で出力させてみたことでした。
????????????????????
全部これでした。
Windowsの PowerShell 5.1 には $OutputEncoding という設定があって、これが既定でASCIIになっています。ASCIIには日本語の文字がありません。だから、パイプ経由でAIに日本語のプロンプトを渡すと、通り道で全部「?」に潰される。
AIは、意味の分からない「?」の羅列を受け取って、それでも一応の返事をしていた。「承知しました、何をすればよいでしょうか」——文字化けした指示に対する、まっとうな反応だったわけです。
そして「3回に1回動く」の正体もこれで説明がつきました。化けた指示からでも、文脈で推測して復元できた回だけ成功していたんです。AIが優秀だったせいで、故障が半分隠れていた。

直し方:$OutputEncoding をUTF-8に固定する
# 自分の環境が該当するか確認(us-ascii と出たら、日本語はパイプの通り道で壊れる)
$OutputEncoding.BodyName# 直し方。$false はBOM(先頭に入る見えない印)を付けない指定。省くと、今度は受け取る側の先頭が汚れる
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)1週間悩んだ問題が、設定1行で完全に解消しました。最小再現を作って確認したので、これは間違いありません。

ついでに同じ経路で2つ直しました。ひとつは同時起動の衝突。PCを起動したタイミングで、遅れていたルーチンが一斉に走り出して同じ秒に重なる問題です。名前付きの排他ロックを入れて、1本ずつ順番に実行するようにしました。もうひとつは失敗時の再試行で、15分おきに最大3回まで自動でやり直します。
さらに後日、別のところでも同種の文字化けが出ました。実行ログをファイルに書き出す部分です。PowerShellのリダイレクトを使うと、コンソールの文字コードを経由してログの日本語が化ける。これはcmd.exe経由の生バイト書き出しに切り替えて解消しました。
つまり同じ「文字コード」という落とし穴に、経路を変えて2回落ちたことになります。
この失敗から決めた3つのこと
① AIを疑う前に、AIに何が届いているかを見る
これが最大の教訓です。AIの出力がおかしいとき、人はどうしてもモデルやプロンプトの内容を疑います。でも実際には、プロンプトが届くまでの経路が壊れていることがある。
いまは「AIに渡す直前の中身をそのまま出力させる」のを、調査の一番最初にやるようにしています。1分で終わるし、これで原因が分かるなら1週間が浮きます。
② 「たまに動く」は、直っていない
3回に1回動くと、人は「不安定だけど動くからいいか」と思ってしまいます。でも、たまに動くというのは故障が隠れているだけで、直ってはいない。むしろ全部止まってくれたほうが、原因究明は早い。
正常と異常が混ざっている状態は、全部異常より厄介です。
③ 日本語環境の自動化は、文字コードを最初に固定する
これは技術的な話ですが、日本語でAI自動化を組むなら、文字コードは最初に決めて固定するのが正解でした。あとから「なんか変だな」で辿ると、経路のどこで化けたのか特定するのに時間がかかります。
同じことが起きているかの3点チェック
・エラーが出ないのに、成果物が空(もしくは挨拶だけ返ってくる)
・たまに成功する。毎回失敗ではなく、3回に1回くらい動く
・日本語を含む指示のときだけ、結果がおかしい
3つとも当てはまるなら、AIではなく経路を疑ってください。$OutputEncoding.BodyName を1回叩けば数秒で分かります。

で、いま思うこと
創刊号で「AIは黙って死ぬ」と書きました。今回のはその変化球で、AIは黙って、仕事をしないまま返事だけする。
どちらも共通しているのは、エラーが出ないことです。エラーが出る故障は親切なんですよね。出ない故障は、こちらから探しにいくしかない。
一人で管理部門を回していると、この「探しにいく」時間がそのままコストになります。だから最近は、作るときよりも「壊れ方を想像する時間」のほうが長くなってきました。地味ですが、これが一番効いている気がします。
次回は、月次の支払い業務をどう仕組みにしたかを書きます。お金が動く工程なので、どこに人の承認を残したかが話の中心になります。フォローしておいてもらえると届きます。
日々の実務メモはX(@keisuke_musico)に書いています。そちらもよければ。
今回の姉妹編である創刊号「AIは黙って死ぬ」はこちらです。
連載は「一人社長室|ひとり+AIで会社実務を回す実録」にまとめています。
