GPT-3.5に簡単な自然言語処理をさせてアプリに機能として組み込んだ話

趣味で Furigana Studio というふりがなに強い字幕動画ソフトをつくっています。かなりニッチ分野ですが少しずつ利用者が増えています。

今回はバックエンドに GPT-3.5 を使用して機能を開発した事例をまとめましたので共有させてください。

Furigana Studio では字幕ファイルを読み込むと自動で漢字にふりがなが付与されます。

「自動販売機」のような長い単語はまとめてふりがなが付きますが、下のように漢字一文字ずつふりがなを振りたいことがあります(漢字ごとの読みを強調したい場合など)

描画結果も変わります。分割後は漢字一文字ごとにふりがなが配置されるようになっています。

分割前 分割後

手動でも分割できるようになっていますが、この分割作業を自動で行いたいという要望がありました。ふりがなが、どの漢字に対応するかという情報が無いため大変そうだなと思っていましたが、GPT に分割させてみたらどうだろうと思い、やってみました。

環境は PHP (Laravel 9) です。 role:system で入出力のフォーマットを指定し、role:user で実際に分割したいテキストを指定しています。

$systemPrompt = <<<"EOT"
熟語:読み のリストを与えるので、読みを漢字ごとに区切って変換してください。以下の条件を厳密に守ってください。

## 条件
- 読みにあるひらがな以外は使用しないでください。
- 以下のフォーマット通りに出力してください。
- 出力結果以外は出力しないでください。

以下はサンプルです。
入力例:
四字熟語:よじじゅくご,情報発信局:じょうほうはっしんきょく

出力例:
四字熟語:よ|じ|じゅく|ご,情報発信局:じょう|ほう|はっ|しん|きょく
EOT;

$json = Http::withHeaders([
  'Authorization' => 'Bearer APIキー',
  'Content-Type' => 'application/json'
])
  ->accept('application/json')
  ->post('https://api.openai.com/v1/chat/completions', [
    "model" => "gpt-3.5-turbo",
    "messages" => [
      ["role" => "system", "content" => $systemPrompt],
      ["role" => "user", "content" => $query],
    ],
    "temperature" => 0.7
  ])
  ->json();

事前に入力の検証と、出力結果も下記の辺りで検証を行っています。 ・ふりがなの分割数が漢字の文字数と一致するか ・分割したふりがなを結合した時に元のふりがなと完全に一致するか

精度は、件数が多すぎなければかなり高いです。一気に100単語近く渡すと急激に精度が悪くなるので、ある程度分割して渡すようにしています。 コストも1リクエストあたり0.07円前後で許容範囲内でした(現状この機能は一部のユーザーのみに公開しています)

最近 Fine-tuning の API が公開されて気になっています(すでに実用レベルの精度なのもあってまだ試していません)

最新AIの無駄遣い感も若干ありますが、作業がだいぶ効率化できたようです。 プロンプトに対する助言などもあればご教示いただけましたら幸いです。