AIの回答の整形方法を修正した

何が起きていたか


このアプリでは、問題の解説をAIに生成してもらい、それをアプリの画面に表示している。AIには「回答が正しいかどうか自分で検証してから返してほしい」と指示していて、AIは検証作業の過程(手順1、手順2…といった思考の記録)も一緒に出力する仕組みになっていた。


本来この検証過程は画面に表示せず、選択肢の判定と理由だけを表示したかった。ところが実際には、検証過程の「手順1」「手順2」といった文字列が、そのままアプリの解説画面に表示されてしまう現象が起きていた。


仕組みの説明


まず前提として、アプリ側の仕組みを説明する。


AIからの回答はスマートフォンのクリップボード(コピー機能)経由でアプリに渡される。アプリはクリップボードの中身を監視していて、AIの回答らしき文字列が入ってきたら自動的に保存処理を行う。


AIの回答には「OK999」または「NG888」という特定の文字列が含まれている。これは「合格の印」「不合格の印」のようなもので、AI自身が自分の回答を検証した結果、正しいと判断すれば「OK999」、間違っていると判断すれば「NG888」を出力するように指示していた。


アプリはこの文字列を目印にして、「どこまでを保存する本文とするか」を決めていた。具体的には、文章の中で最初に「OK999」という文字が出てきた位置までを本文として切り取り、それより後ろは切り捨てる、という処理をしていた。


なぜ検証過程が表示されてしまったか


問題は、AIが毎回同じ順番で回答を出力するとは限らなかったことにある。


理想的には、AIは「選択肢の判定と理由 → OK999 → 検証過程」という順番で出力してほしかった。この順番なら、OK999より後ろを切り捨てる処理で検証過程はきれいに消える。


しかし実際のAIの出力は毎回バラバラだった。ある回では「検証過程 → 選択肢の判定 → OK999」という順番になり、別の回では「選択肢の判定 → 検証過程 → OK999」という順番になった。OK999が置かれる位置も、検証過程の途中だったり、一番最後だったりとまちまちだった。


アプリ側は「最初に出てきたOK999までを本文とする」という単純なルールで動いていたため、OK999が検証過程の途中にあると、選択肢の判定文と検証過程がまとめて本文として保存されてしまう。逆にOK999が検証過程の一番最後にあると、検証過程すべてが本文に含まれてしまう。これが、アプリの解説画面に「手順1」「手順2」といった文字列が表示されてしまった原因だった。


試した対処と、うまくいかなかった点


最初に試したのは、AIへの指示(プロンプト)を修正して、「選択肢の判定を書いたら、その直後にOK999を1個だけ置き、検証過程はその後ろに書くこと」と明確に指示する方法だった。


この指示を追加した後も、AIは毎回この順番を守るとは限らなかった。ある回は指示通りの順番で出力されたが、別の回では検証過程が先頭に来てしまったり、OK999が検証過程の途中にある「手順6」という項目の中にしか出てこなかったりした。


そこで、AIの出力順序に頼らない方法に切り替えた。具体的には、出力されたテキストを1行ずつ確認し、「検証速報」という文字で始まる行や、「手順1:」「手順2:」のように「手順」という文字で始まる行を、機械的に見つけて取り除く、という処理をアプリ側に追加した。この方法なら、AIがどんな順番で出力しても、検証に関する行だけを選んで消すことができる。


ただしこの方法にも限界があった。AIが検証の内容を「手順3:」のような決まった書き方ではなく、「1: ³H(β⁻) ── ¹¹C(β⁺) = 非該当」のような別の書き方で出力することがあり、そのたびに新しいパターンとして見分けるルールを追加する必要があった。


さらに、AIが1つの項目の説明を複数行に分けて出力するケースもあった。たとえば「手順1:問題の問い方を分類する。」という行の次に、内容の続きである「(A)該当する選択肢を直接選ぶ型」という行が来る場合、1行目は「手順」で始まるので検証行として消えるが、2行目は「手順」で始まっていないため検証行と判定されず、そのまま画面に残ってしまった。


この問題への対処として、最終的には「OK999という文字より後ろに『検証速報』という文字が見つかった場合は、その位置から後ろをまとめて全部消す」という処理を追加した。これにより、検証過程が複数行に分かれていても、まとめて取り除けるようになった。


表示の見た目に関する別の問題


検証過程を取り除く処理とは別に、画面の表示自体にも2つの問題が見つかった。


1つ目は、選択肢と選択肢の間に大きな空白ができてしまう問題。原因を調べると、改行を整理するはずのプログラムの1行が、本来使うべき「パターンを使った検索・置換」の書き方ではなく、「決まった文字列をそのまま探す」書き方になっていたため、実際には何も置き換えられていなかった。これを正しい書き方に直したことで、余分な空白が整理された。


2つ目は、選択肢の判定文が大きな文字や太字で表示されてしまう問題。これはAI回答をアプリの文字表示機能(TextMeshPro)向けに変換する処理の中で、見出しや強調の指定(サイズ指定タグや太字タグ)が本文にも適用されてしまっていたことが原因だった。対処として、日時や注意書きなど残したい部分と、選択肢の判定文などサイズを普通に戻したい部分を分けて、後者からだけサイズ指定タグと太字タグを取り除く処理を追加した。


現在の状態


現時点では、検証過程を行単位で判定して取り除く処理と、OK999より後ろに検証速報が見つかった場合の一括削除処理を組み合わせて運用している。AIの出力パターンが変わるたびに新しいケースが見つかることがあり、そのつど対処するパターンを追加している状況である。