挨拶
ども!半年ぶりのブログ執筆で言葉がうまく出てこない龍ちゃんです。ブログのデザインが無事変更されて良かったです。最近は、「Azure OpenAI Service(以降:AOAI)」のキャッチアップやそれに伴うアプリケーション開発などをしていました。
さて、今回のネタは「AOAIで遊んでみた!」という内容になります。タイトルにあるとおりに、送信した文章がポジティブよりかネガティブよりかを判別するアプリケーションを作ったので共有です。
モチベーション
今回のモチベーションは「Azure上でOpenAIを叩くことができるAOAIを使って、何か面白いものを作る!」というものです。社内で、AI Serviceのサービス提供の話もあったりなかったりで社内外問わず注目度が高かったので作ってみました。
要約すると、「最近話題だから遊びでキャッチアップしようや」というものですね。
作ったもの
まずはふんわりとした理解から始めましょう。やっていることはシンプルに2つです。
- 受け取った文章を文節ごとに(ポジティブ:100点)(ネガティブ:-100点)で採点
- 結果をJSONで返答
使用しているプロンプトについて紹介しますね。
性格付け
精度向上のために、条件とフォーマットを渡しています。実際のプロンプトとしては、以下になります。
以下の条件で文字列を採点してください。
- 文節ごとに区切って、文節ごとに得点をつけてください。
- ポジティブな単語ほど高い得点をつけてください。
- ネガティブな単語ほど低い得点をつけてください。
- 得点は100点から-100点までの範囲で評価してください。
- 得点が5の倍数にならないようにしてください。
- 同じ単語が複数回出てきた場合は、2つ目以降は得点を0にしてください。
- 文節ごとに得点を加算してください。
- 合計得点と文節ごとの得点を出力してください。
- 出力をJSON形式にしてフォーマットとしては以下に従ってください。また、このJSON以外は出力しないでください。
```json
{
"totalScore": 116,
"words": [
{"word": "美味しい", "score": 71},
{"word": "ご飯を", "score": 32},
{"word": "食べる", "score": 13},
],
}
Few Shot Learning
また、例題を入力と出力を二組与えています。データとしては、以下を与えました。
例:いつも色々と配慮して頂き本当に感謝です
{
"totalScore": 127,
"words": [
{"word": "いつも", "score": 3},
{"word": "色々と", "score": -7},
{"word": "配慮して", "score": 14},
{"word": "頂き", "score": 38},
{"word": "本当に", "score": 6},
{"word": "感謝です", "score": 73},
],
}
例:今週は忙しすぎてしんどい
{
"totalScore": -84,
"words": [
{"word": "今週は", "score": 19},
{"word": "忙しすぎて", "score": -21},
{"word": "しんどい", "score": -82},
],
}
成果物
入力すると、一定時間後に採点されたデータが返答されます。検証のために生のJsonデータも一緒に出力をしています。(ちゃんとJSONがハイライトされていて見やすい!)
システム構成図としては、以下になります。
サービスは、すべてAzure上に収まるように設計しました。ローカルで動けばよいのですが、デモをするときにURLを叩けばよいという状況にしておくのが一番良いですからね。
苦労話
ソースコードをそのまま乗っけてしまうと、膨大になってしまうので構築方法についてはまた別のブログで投稿しようと思います。
5の倍数になって数字が出力される
これは、採点ロジックの話です。出力される点数がどうしても、5の倍数になっていました。なので、キリの良い数字になって出力されてしまいます。ランダム性があまりないので、困りました。結果的に、Few Shot Learningとプロンプトに「得点が5の倍数にならないようにしてください」というプロンプトで解消しました。この辺の検証は後輩ズがやってくれていたので、きっとまとめてブログにしてくれるでしょう!
JSONデータとして出力されない
タイトルにもなっていますが、今回の苦労はすべてここに集約されています。今回はモデルにGPT-4oを使用していました。テキストを入力しても5回送信して、4回はJSONで読み込めない形で返答されて帰ってきました。デモとしては最悪ですね。
どうやらGPT-4oはJSONスキーマを尊重してくれないようです。検証していた時は、問題なく動いていたというのがさらにたちが悪いですね。
こちらは現在解決しました。解決方法としては、「Gpt-4oで生成した解答をGpt-3-TuroでJsonに生成しなおす」となります。実験したところ、30回送信しても、30回Jsonデータとして返答されました。
ここで面白い点は、「JSONに成型する単純なタスクには低いバージョンのほうが適している」という点です。実際、新しいバージョンのほうが高性能です。ですが、作業内容によっては高性能である必要がなかったりします。この辺は人間が判断しなければならない点ですね。
こんなこともあって、まだエンジニアの仕事がいきなりAIに切り替わることもないなと一安心しています。
終わりに
今回は、プロンプトエンジニアリングのちょっとした落とし穴についてお話しました。どこかの誰かの助けになれば幸いです。今回の内容は、「2024OSC京都」にて掲載していた内容になります。当日はライブデモで動かないを連発してしまって申し訳ありません。今後とも参加してより面白いデモを作っていくのでよろしくお願いします。
最近は、「プロジェクトの進め方」や「フロントエンド」のブログを書いていたので、ここにAIを挟み込んでいきますね!ではまた…