AI Orchestration:
Thank you for reading this post, don't forget to subscribe!AIオーケストレーションの続きは、思った以上に深い沼だった。
– Geminiの迷走からCopilotへ
– DeepSeekの暴走を抑え込むためのAS/400的バッチ設計
– Qwen2.5の沈黙と即終了
– Pythonのクソ仕様との戦い
– そしてPDFマニュアルの線画データが引き起こす**文字化け地獄**
「塵掃除第一弾」を終えたと思ったら、そこには第二弾、第三弾が待っていた。
この記事は、AIと共に歩んだ**再々設計の記録**。
“AIは嘘をつく” という現実と向き合いながら、それでも前に進むための技術的・思想的ログである。

- ## 第1章:地獄の入口はPDFの線画だった
- ## 第2章:Copilotの迷走──“おそらく”と“曖昧な一般論”の連発
- ## 第3章:Qwen2.5の沈黙と即終了──なぜ何も返さないのか
- ## 第4章:Pythonのクソ仕様と戦う─インデント地獄と構文の罠
- ## 第5章:20 / 10 / 10──塵掃除第二弾の核心データ
- ## 第6章:prefix再々設計──AS/400的バッチ思想の復活
- ## 第7章:2重遭難─preprocess.py と translate.py の同時崩壊
- ## 第8章:Copilotの軌道修正──迷走からの復帰
- ## 第9章:まだ続く塵掃除──再々設計のその先へ
- ## 第10章:結論──AIとの共生は“設計思想”で決まる
## 第1章:地獄の入口はPDFの線画だった
PDFマニュアルの翻訳バッチを作る──それ自体は単純な話だと思っていた。
しかし、実際に運用を始めてみると、線画データに埋め込まれた不可視文字列が:
– OCRを狂わせる
– DeepSeekの翻訳を暴走させる
– preprocessの正規化を破壊する
– 辞書適用を誤爆させる
「塵掃除第一弾」は、OCRノイズの除去とDeepSeekの誤訳パターンの洗い出しだった。
だが──本当の地獄は“第二弾” にあった。
線画の中に潜む“謎の英数字”が翻訳結果に混入し、辞書適用をすり抜け、`extract`のCreate/Track変換を破壊する。
この時点で私は悟った。
AIオーケストレーションは「AIを使う」ことではなく、「AIの嘘と暴走を制御する」ことだ。

## 第2章:Copilotの迷走──“おそらく”と“曖昧な一般論”の連発
Copilotは優秀だ。
だが、曖昧な一般論を挟んだ瞬間に迷走する。
`prefix`の話をしているとき、Copilotは突然こう言い出した。
> 「`extract.py` にprefixを付けるべきです」
> 「複数PDFを連続処理する場合に識別が必要です」
私は思わず言った。
> 「なぜ複数PDFを連続処理する必要がある?」
`JobN`は1話完結。
AS/400的に言えば、`JOBQ`に1件だけ翻訳対象マニュアルを投入する運用。
混在など起こりようがない。(複数のマニュアルを投入したら、それこそまともな日本語マニュアルになり様がない。)
Copilotは一般的な翻訳システムを前提に話していた。 「行にprefixを付けないと翻訳時にどのマニュアル分なのかがか分からなくなる」と、
だが、私の`JobN`は一般論では動かない設計だ。(これが一話完結の由来)
`prefix`の議論は、Copilotの迷走 → 私の軌道修正 → 再設計の繰り返しだった。

## 第3章:Qwen2.5の沈黙と即終了──なぜ何も返さないのか
「DeepSeekが暴走するなら、Qwen2.5に切り替えればいい」──そう思っていた。
しかし現実は違った。
Qwen2.5は沈黙する。そして即終了する。
– 何も返さない
– 返しても途中で止まる
– 文章の途中で「。」だけ返して終了する
– そもそもプロンプトを読んでいない
これはモデルの“解像度の壁” だ。
※. 線画の多いPDFマニュアル相手では
– DeepSeekは暴走する
– Qwenは沈黙する
AIは万能ではない。
Geminiは、暴走したし、Copilotも迷走する(人間が時々釘を刺さないと)
ちなみに、このブログのアイキャッチ画像は、
DeepSeekで画像生成用のプロンプトを作り、
Gemini+nanobananaで生成したもの。
Copilotでもやってみたが、プロンプトを無視して変な中国字交じりのテキスト乱発で使用に耐えない。
そして、AIは沈黙もする。し、変なエラーを英文で返してくる「お答えできませんみたいな!」

## 第4章:Pythonのクソ仕様と戦う─インデント地獄と構文の罠
Pythonは便利だ。
だが、構文が狂っている。
– インデントが1文字ずれただけで全崩壊
– 差分パッチが貼れない (Editor上で、インデントがずれる。)
– コードブロックを貼るとインデントが壊れる
– Copilotが全文置換を提案してくる
– そして壊れる


これが、解決策23行目が、上の画像の21~36行目に該当する
私は何度も言った。
> 「Pythonの開発者は頭がおかしいのか?」
それでもPythonを選ぶ理由はただ一つ。
AIバッチを作るにはPythonが最適だからだ。
狂気の選択だが、それでもPythonを使うしかない。

## 第5章:20 / 10 / 10──塵掃除第二弾の核心データ
`prefix`の議論が長引き、Copilotは本筋を忘れた。(これも迷走の一部)
しかし、私が抽出した **20 / 10 / 10** は`JobN`の心臓部だ。
分別
| # | 分類 | 行数 | 意味 |
|---|---|---|---|
| ゴミ行 | 20 | 完全に除去すべきノイズ | |
| 英語行 | 10 | そのまま翻訳対象 | |
| 迷う行 | 10 | 要判断・要チューニング |
これはTuneのための“金のデータ”。
Copilotはprefixの議論に夢中になり、このデータの処理を忘れた。
私は言った。
> 「20/10/10 の抽出は無駄だったのか?」
Copilotはこう答えた。
> 「無駄ではない。むしろ最重要データ。Copilotが本筋を忘れたのが問題。」
その通りだ。
※.ゴミ行は、’ocrmypdf’が、線画を無意味なアルファベット・記号に変換したもの。
迷う行は、チャンク処理で、1文字(%,,,)、2文字(Wh,EN,if,NN,NG,,,)、3文字(COR,YIM,All,ATT,,)・・・数文字の塊で、何かの略号の様に見えなくもないもの。

## 第6章:prefix再々設計──AS/400的バッチ思想の復活
`prefix`の議論は、最終的に**AS/400的な責務分離**に落ち着いた。
.pyモジュール
| # | モジュール | 行頭prefix | ファイル名prefix |
|---|---|---|---|
| preprocess | ❌ | ❌ | |
| translate | ❌ | ❌ | |
| dictionary | ❌ | ❌ | |
| save_output | ❌ | ✔ | |
| extract | ❌ | ❌ | |
| split_chunks | ❌ | ✔ |
ルール:行頭prefixは全面禁止。ファイル名prefixのみ許可。
`JobN`の翻訳パイプラインは、この思想で完全に安定した。

## 第7章:2重遭難─preprocess.py と translate.py の同時崩壊
`prefix`の議論が迷走していた最中、
`preprocess.py` と `translate.py` の両方に“行頭prefix”が混入する事故が起きた。(ルール:行頭prefixは全面禁止。ファイル名prefixのみ許可。を定めた後に.pyを再確認していて発覚。)
これは`JobN`にとって致命的な2重遭難の危機だった。
🔴 preprocess.py のprefix汚染
“`python
prefixed_lines = [f"{basename} {line}" for line in cleaned_lines]
“`
🔴 translate.py のprefix汚染
“`python
out_f.write(f"{basename} {clean}\n")
“`
この2つが同時に存在すると:
– 正規化が壊れる
– Qwenの翻訳が汚染される
– 辞書適用が誤爆する
– Create/Trackが壊れる
– そもそも翻訳テキストが“本来の姿”ではなくなる
= `JobN`全体が崩壊する。
私は即座に言った。
> 「行頭prefixは全面禁止。preprocessとtranslateのprefixは即削除。」
そして両方のprefixを削除し、`JobN`は再び正常化した。

## 第8章:Copilotの軌道修正──迷走からの復帰
Copilotは迷走した。
だが、軌道修正をした。
– `save_output.py` という存在しないファイルを提案
– `extract.py` にprefixを付けろと言い出す
– `main.py` を修正しろと言い出す
– `preprocess` と `translate` にprefixを混入させる
– しかし最終的にはprefixを全削除し、正常化に戻った
> AIは嘘をつく。AIは本筋を忘れる。AIは迷走する。
> だが──軌道修正はできる。そして、共に前に進むことはできる。

## 第9章:まだ続く塵掃除──再々設計のその先へ
`prefix`の再々設計が終わった。
だが、塵掃除はまだ終わらない。
– Tune用 `Replace_Blank.txt`(強化版:ゴミ文字をブランクに置き換える辞書)
– `preprocess.py`(強化版:翻訳前のゴミ掃除強化)
– 正規表現の最適化
– Create/Trackへの流用
– そして 20/10/10の本処理
> AIとの共生は「終わりのない塵掃除」だ。
> だが、それでいい。

## 第10章:結論──AIとの共生は“設計思想”で決まる
– AIは嘘をつく
– AIは沈黙する
– AIは暴走する
– AIは本筋を忘れる
だからこそ──
> 人間が設計し、AIに実装させる。
その繰り返しが、AIとの共生であり、AIオーケストレーションの本質だ。



