前編では、AI(Gemini)と共にブラウザ完結型のPDFエディタ「Secure PDF Toolkit」の開発をスタートさせたものの、セキュリティの穴にまつわるAIの「ハルシネーション(嘘)」や、チャットが長引きすぎたことによる「文脈崩壊(先祖返り)」に直面しました。
そこで私は、これまでの経緯と完成したコードを携え、新たなチャット(別スレッド)を立ち上げる決断をしました。
もしこれが、最近流行りの「エージェント型AI(AIが自律的にコードを書き換えていく最新ツール)」であれば、エラーが起きてもAIが勝手に自己修正ループに入って解決してくれたかもしれません。正直に言えば、あっちの方が圧倒的に楽ですし、出力もめちゃくちゃ高度です(笑)。
ただ、エージェント型は全自動である分、中身がブラックボックスになりがちです。「AIが何をどう妥協して修正したのか」が、人間には見えにくくなる側面もあります。
だから今回は、あえて対話型AIを使い、人間が「今の状況」を整理して新スレッドに持ち込むという、少しアナログな手法をとってみました。AIに全部お任せするのではなく、あえて泥臭くプロジェクトの主導権を「人間が取り戻す」感覚を味わうのも、たまには悪くないものです。
後編となる今回は、新スレッドでの仕切り直しから、泥沼の「PDF回転・座標バグ」との死闘、そしてついにツールを公開するまでの軌跡をお届けします。
第5章:新スレッドでの仕切り直しと「AIのありがた迷惑」
コンテキスト(文脈)をリセットし、新たなスレッドにこれまでのLP(ランディングページ)、ソースコード検証ページ、そしてツール本体のコードを読み込ませました。
「現在の状況を把握し、今後の改修案を出してほしい」と指示を出したところ、AIはいきなり衝撃的なコードを生成してきました。
「ご提示いただいた3つのファイルを1つのHTMLファイルに統合しました!画面の表示・非表示を瞬時に切り替えるSPA(Single Page Application)構造にし、すべてがブラウザ内で完結するコンセプトを体現しました!」
なんと、AIが気を利かせすぎて、LPも検証ページもツール本体も、全部ごちゃ混ぜにした巨大な1つのファイルを作ってしまったのです。
将来のメンテナンス性を考え、ファイルごとに役割を分け、PHPでインクルード(部品化)して管理しやすくしようとしていた人間の意図は、完全に無視されていました。
「そうじゃないです。まずは読み込んで内容を把握してください。LPにはこのツールの方針とも言える内容が書かれています。勝手な改変はしないでください。指示に従って、改修内容を提案してください。」
AIは時として、指示されていないことまで「独自の最適化」しようと暴走することがあります。ここで「コードを書いてくれたし、まぁいいか」と妥協せず、人間がしっかりと手綱を引き直さなければなりません。
第6章:PDFエンジンの闇「回転バグ」との死闘
方針を正し、エディタ画面のUIの微調整を進めていく中で、実際の利用シーンを想定したテストを行いました。そこで、致命的なバグが発覚します。
「90度回転させたはずが、出力されたPDFは何故か180度反転してます。画面上では正しく見えているのに……」
私は、バグが起きている画面のスクリーンショット(画像)をAIにアップロードして状況を伝えました。
AIは修正コードを出してきますが、それを試すと今度は「出力PDFの向きは合ったが、追加した文字だけが回転せずに取り残される」という新たなバグが発生。
これを修正させるとまた別の場所がおかしくなる。完全にAIが堂々巡りに陥ってしまいました。
そしてAIは、何度目かわからない「完全に理解しました!」という言葉と共に、こんな言い訳(推論)を展開してきました。
「エラーの本当の原因がわかりました!使用しているライブラリの仕様で、ページ全体を回転させる関数は『時計回り』に動くのに対し、画像を配置して回転させるパラメータはなぜか『反時計回り』に動くという恐ろしい仕様になっています!」
人間による「ファクトチェック」でAIを導く
ここで私は、目の前でパニックになり修正ループに陥っているAIの言葉を、そのまま鵜呑みにはしませんでした。前編で学んだ「AIは平気で嘘をつく」という教訓があるからです。
かといって、私自身がライブラリの複雑なソースコードを読んで解明できるわけでもありません。しかし、私は「そのライブラリ(pdf-lib)にはソースコードや公式ドキュメントなどの『公開情報』が存在する」ということは知っていました。
そこで取った手法が、「別のAIを使って、開発AIの言い訳をファクトチェック(事実確認)させる」というアプローチです。
私は別のリサーチ用AIに、ライブラリの正確な公開情報(ソースコードなど)を読み込ませ、そこに開発AIの言い訳をぶつけました。余計なプロンプトは与えず、シンプルに「この仕様は事実か、間違っているか」だけを判定させたのです。
AIは曖昧な質問に対しては平気で嘘をつきますが、与えられたプログラムや文章を読み取って論理的に判定することに関しては、人間以上に優秀です。
結果、リサーチ用AIが出した答えは「開発AIの推論は事実である(実際にそのような仕様が存在する)」というものでした。
裏付けが取れた確実な情報を武器に、私はメインの開発AIに対して指示を出します。
「調べてみたところ、あなたの言う『時計回りと反時計回りが混在している仕様』は事実のようです。それが正しい原因なら、それを前提としてアフィン変換(行列計算)の符号を反転させるなどして、正しいロジックに修正してください。」
AIは「全知全能」ではありませんが、人間が使い方を間違えなければ最高のツールになります。
ひとつのAIが沼にハマった時は、人間が一次情報を見つけ出し、別のAIを裁判官にして「情報の裏付け」を取る。そして「正しい」と分かった前提条件を開発AIに与え直し、正解を導かせる。
この連携プレイによって、AIはようやく完璧な出力コードを書き上げることができました。
【AI開発の教訓4】
「AIが解決できないバグが出たら、人間が難しいコードを読まなければいけない」わけではありません。別のAIに一次情報を読み込ませて事実確認(ファクトチェック)をさせ、人間はプロジェクトマネージャーとして「正しい前提条件」を整理してあげるだけで良いのです。
第7章:「文字間隔」の沼と、AIの力技
回転バグを乗り越え、さらに「文字間隔(letter-spacing)」と「行間隔(line-height)」の微調整機能を追加した時のことです。またしても新たな問題が発生しました。
「文字間や行間を広げると、文字や行の『最後』にも透明なスペースができてしまい、枠の右端や下端にピタッと合わせる配置の微調整がやりにくいです。余白は、文字や行に『挟まれている部分のみ』を対象にすべきです。」
この指摘に対し、AIは「それなら、文字を1文字ずつ座標計算してバラバラに描き、最後の文字だけスペースを省きましょう!」という超絶複雑な独自エンジンを組んできました。
しかし、その結果……
「(スクリーンショットを添付しながら)編集画面では指定した枠内に収まっているのに、PDF出力すると文字が枠からはみ出したような形になってしまうという新たな問題が発生しました。シンプルに見た目などで誤魔化すのではなく、ブラウザ標準機能でなんとかできませんか?」
AIは時々、「問題を力技で解決しようとしてコードを過剰に複雑化させ、かえって二次災害的なバグを生み出す」という悪い癖を出します。
「ご報告ありがとうございます。最後の余白を無理やり消そうとして複雑なロジックを組み、深刻な不具合を引き起こしてしまいました。申し訳ありません。
小手先の誤魔化しをやめ、『ブラウザの標準仕様(余白ができる仕様)には素直に従いつつ、PDF出力側(Canvas)に、枠からはみ出した部分を完全に切り取る(クリッピングする)処理を追加する』という正しいアプローチに修正しました。」
clip() という標準的でシンプルな関数を使う王道のアプローチに戻したことで、見切れが美しくカットされ、ついにすべての描画バグが解消されたのです。
第8章:完成、そして「誠実さ」の追求
プレビュー画面への完全な焼き付け処理などを経て、ついに「Secure PDF Toolkit」のツール本体が完成しました。
最後に、LP(ランディングページ)のテキストを見直します。
私はAIが書いたLPのコピーの一部を修正するよう指示しました。
「LPの説明の一部に『完全に画像化されるため情報漏洩の心配はありません』とありますが、完全にというのは語弊がありますよね(編集をしたページのみの処理なので)。
『完全に』とか漠然な言い方はやめて、正確な表現にしましょう。無理に安心感を醸し出す必要はありません。情報を正確に、誠実に出すようにしましょう。」
これを受け、AIはテキストを以下のように修正しました。
- 「情報漏洩リスクをゼロに」 → 「情報漏洩リスクを低減」
- 「完全に画像化されるため」 → 「編集を行ったページは1枚の画像として書き出されるため」
過剰に安心感を煽る言葉は誠実さに欠け、逆にツールへの信頼を損ないます。事実を正確に、等身大の言葉で伝えることが、ユーザーへの誠意です。
こうして、すべてのファイルが完成。
検索エンジン(Google)にインデックスさせるため、サイトトップページとブログ記事のベースを作成し、サーバーにアップロードしました。
おわりに:AIは「魔法の杖」ではなく「最高の相棒」
前編・後編にわたる長い対話と試行錯誤の末に、「Secure PDF Toolkit」は産声を上げました。
エージェント型AIを使えば、確かにコードはもっと楽に、爆速で書けるでしょう。
しかし、「本当に使いやすいUIになっているか」「セキュリティに穴はないか」「ライブラリの裏をかいていないか」「誠実な言葉で伝えているか」を判断し、方向性を決定するのは、あくまで人間の役割です。
自動化のブラックボックスに頼り切るのではなく、AIがドツボにハマった時は、人間が別のAIを使ってファクトチェックを行い、助け舟を出す。一方で、人間が思いつかないシンプルなコードや数ピクセルの調整は、AIが高速でこなしてくれる。
「AIに丸投げ」するのではなく、まるで優秀なプログラマーと「ペアプログラミング」をするかのように、粘り強く対話を重ねること。
それこそが、AI時代において本当に価値のあるプロダクトを生み出し、「日常を未来化」するための秘訣なのだと、今回の開発を通じて強く実感しました。
私とAIが泥臭く作り上げた「Secure PDF Toolkit」、ぜひ一度触ってみてください。