はじめに
社内でNestJSとOpenAI APIを用いてチーム開発をするという取り組みを実施し、
自分のチームではセンシティブな文章かを判定するAPIを作りました。
その中で、OpenAI APIでプロンプトをカスタマイズして気付いたことや学んだことを書こうかなと思います。
株式会社mofmofは受託開発会社ですが、メンバー自らがオーナーとなってプロダクト開発にチャレンジしています。
この記事は、NestJS, 生成AIにチャレンジする「金曜日のチーム開発」の成果です。
サービス概要
文章に対してセンシティブかどうかを判定してくれるAPIです。
判定して欲しい文章をリクエストすることで、センシティブかどうかをBooleanで返却してくれます。
センシティブな内容であると判定された場合は判定された理由も返却されます。
プロンプトカスタマイズ
判定の精度を高めるためにプロンプトをカスタマイズしましたが、
判定を厳しくするとセンシティブではない文章がセンシティブだと判定され、緩めると逆にセンシティブな文章がスルーされるという問題に苦労しました。
modelはgpt-4-1106-preview
を使用しましたが、ChatGPT4と相談したりもしましたが、判定結果が異なったりとなかなかうまくいきませんでした。
単語ではなく文章全体の文脈を重視して判定してください
というような文言を追加することで少し精度を高められましたが、
目標とする精度に達することはできておらず、まだまだカスタマイズが必要という状況です。
token計測
プロンプトをカスタマイズすることで精度を高めることができますが、プロンプトの長さはコストに直結します。
- OpenAI APIのモデル毎の費用
https://openai.com/pricing#language-models - tokenの簡易計測
https://platform.openai.com/tokenizer
正確に計測するには、レスポンスに含まれるusageを確認するのが良さそうでした。
https://platform.openai.com/docs/guides/text-generation/chat-completions-response-format
実際にtoken数を計測してみました。
# gpt-4-1106-preview
{ prompt_tokens: 728, completion_tokens: 173, total_tokens: 901 }
completion_tokensはOpenAI APIが生成する内容なので、全く同じ内容のリクエストでもtoken数は変動します。
しかし、上記の計測方法だと実際にリクエストを送るのでtokenを消費します。
試していませんが、tokenを消費したくないという場合は、Pythonライブラリで計測用のものがありました。
https://cookbook.openai.com/examples/how_to_count_tokens_with_tiktoken
その他
レスポンス速度
GPT4-TurboよりGPT3.5-Turboの方が速かったです。
- GPT4-Turboにアクセスが集中している?
- GPT4-Turboの方が裏側の処理が重い?
JSONモード
新しいモデルにJSONモードというレスポンスをJSONに変換してくれる機能が追加されていました。
プロンプトに「JSONで返却すること」のような命令分は追加する必要があるので、
できればそれも不要にして欲しい感がありました。
token数
日本語でプロンプトを作っていくとどうしてもtoken数が嵩むので、最終的にプロンプトを英語に変換したり等の対策が必要だと感じました。
実際に変換してみるとtoken数は抑えることができました。
しかし、単純に英語に変換するだけでは判定の精度が下がったので、ニュアンスを変えずに変換する必要がありそうでした。
さいごに
- 初めてOpenAI APIを触りましたが、プロンプトエンジニアリングの難しさを学びました
- 同じ文章でも結果が異なることがあるので、常に100%の精度で判定し続けるのは難しいのかなと感じました
- GPT4のmodelだとturboでもレスポンス速度が遅い(数十秒かかる時もある)と感じることも多く、今後の新modelのリリースでその辺りの改善も期待したいです
- GPT3.5とGPT4を比較して精度の差は体感ですがそこまで大きくなかったのかなと思います。コストは約10倍差があるので、最新の情報を取得したいというのがなければ基本的にはGPT3.5を使用するで良いのかなと感じました。