はじめに
こんにちは!データ戦略室データアナリストのブライソンです。最近、生成AIを用いた業務効率化や機能開発などをすることが増えてきました。生成AIを用いたツールを作成する際、必ずあたる壁が、「出力の評価」です。プロンプトエンジニアリングをするにあたり、出力物を評価し、そのフィードバックをもとに改良します。この評価方法次第で、プロンプトエンジニアリングの効率や品質が大きく左右されると言っても過言ではありません。今回は、自分が実際に使用したプロンプト評価ツールである「promptfoo」について紹介しようと思います。
promptfooとは?
概要
promptfooは、LLMの出力品質を評価・改善するためのオープンソースソフトウェア(OSS)です。あらかじめ設定したテストケースを使用して体系的にテストし、LLMのアウトプットの評価結果を可視化することができます。単純なプロンプトの評価だけでなく、RAGの評価もできる上、複数モデルの出力結果を比較することもできます!

特徴
promptfooには以下のような特徴があります。
多様なモデルのサポート
OpenAI、Anthropic、Azure、Google、Bedrock、Ollamaなど、基本的に思いつく生成AIサービスはほぼ網羅しています!CLIとGUIの両方に対応
コマンドライン上で実行することも、GUIでぽちぽち実行することも可能です。個人的には、GUIで見やすく可視化されることにこのツールの破壊力を感じていますが、裏側の処理だけを取り出し、CI/CDに組み込むこともできます。バージョン管理
プロンプト及びそのテスト結果をバージョン管理することができます。プロンプトに改良を加えた結果、テスト結果が悪くなってしまった場合にも、過去のものを参照することができます。テスト結果の共有
テスト結果のURLを発行し、他人に共有することが可能です。もちろん、バージョンごとに発行でき、チームメンバーなどに簡単に共有できます。ただ、この機能はクラウド環境などにセルフホストした場合に限りますので、ローカルで実行する場合などは使うことができないことに注意が必要です。
テスト機能
promptfooのメインの機能は、テストです。テストケースで期待する結果を定義すると、生成された出力を正誤に分け、定量的に評価をすることができます。また、正誤の割合がスコアとして算出されるため、テストに対する「精度」も見ることができます。

具体的には、入出力一覧のファイル(CSV、JSON、YAMLなど)と、それに対するプロンプトと評価方法の一覧のファイル(CSV、JSON、YAMLなど)をそれぞれ作成し、promptfooに読み込ませて実行します。実行すると、各テストケースに対して、プロンプトが設定したLLMのAPIに投げられ、結果が返されます。実行結果は、評価されて、一覧にまとめられます。正誤結果は、一目瞭然であり、参照情報、プロンプトを見ながらなぜ間違えているのかを考察しやすい形で表示されます。下に示した画像の例では、完全一致とリストに含まれるか(ありえない答えを出していないか)の2つのテストを設定しており、2PASSはどちらも通った、1FAIL1PASSは片方は通ったが片方は通っていないことになります。

実際に使ってみた
背景
弊社サービスの一つであるレバテックでは、取引先企業からいただいた案件情報を自社の営業システムに登録する業務があります。案件情報はメモ書きのようにフリーテキストでまとめられていて、その内容を確認しながらシステムに手作業で登録しています。これを、1件あたり10分で、月1,000件ほど対応していました。
作りたいもの
簡単に言うと、案件メモから、必要な情報をLLMによって抽出し、営業システムに登録する機能を作ろう!という取り組みになります。入力例のようなフリーテキストを投げたら出力例のように構造化された形で返され、自動的に営業システムに登録されるというような機構です。
入力例
=========================== 案件名:hogehoge案件(Java) 単価:スキル見合い(MAX〇〇万円) 場所:fugafuga(出社) 期間:即日〜 精算:140~180h 面談:1回(WEB) 時間:10:00-19:00 <概要> piyopiyoサービスの開発のバックエンド開発に携わっていただきます。 プラットフォームの開発・保守 Javaを使ったサーバーサイド開発 ・新機能追加 ・機能改修 ・リファクタリング など <必須スキル> ・Javaでの開発経験3.4年以上 ・AWSでの開発経験 <尚可スキル> ・React/TypeScriptでの開発経験 ===========================
出力例
{
"使用技術": "Java(BtoB)",
"契約種類": "業務委託契約",
"稼働時間下限": 140,
"稼働時間上限": 180,
"受取金上限": 〇〇,
"作業内容": "・Javaを用いたpiyopiyoサービス開発に携わっていただきます。\n・主に下記作業をご担当いただきます。\n -基本設計\n -詳細設計\n -製造\n -テスト\n -運用\n -保守",
"要求スキル_必要": "・Javaでの開発経験(4年程度)\n・AWS環境下での開発経験\n",
"要求スキル_尚可": "・ReactおよびTypeScriptを用いた開発経験",
"作業場所最寄駅": "fugafuga",
"作業開始時間": "10:00",
"作業終了時間": "19:00"
}
やったこと
上記機能を作るにあたり、各項目を抽出するためのプロンプトが必要でした。担当者に洗い出してもらったところ、最低限必要な項目は40個ほどあったため、プロンプトを40個作る必要がありました。(もちろんもっと少ないプロンプトでまとめて抽出することも可能ですが、確実に構造化させるには各項目に対して個別にプロンプトを作る方が良いと判断しました)しかし、40ものプロンプトを作成し、それらを評価しながらプロンプトエンジニアリングをするのは骨が折れます。そのため、promptfooを使おうと思いました。弊社のテクノロジー戦略室という組織が、promptfooを社内で使える環境を整えてくれたので、すんなり利用することができました。
↓テクノロジー戦略室のやっていること↓
tech.leverages.jp
BigQueryから過去の案件情報を引っ張り出し、入力と出力、そして各項目のテスト方法を定義し、プロンプトの初期バージョンを作成しました。試算したところ、全項目の正解率が60%を超えれば工数の削減ができることがわかったため、目標は60%の精度としました。初期バージョンの結果は、60%に届きませんでしたが、どの項目の正解率が低いのかが一目瞭然で、その項目のプロンプトエンジニアリングのみ対応しました。結果として、全体の精度は75%を超えたため、無事に機能開発へと移行しました!
感想
自分としては、下記のように良かった点がたくさんあり、スムーズにプロンプトエンジニアリングをすることができました。特に評価ルールを複数設定することにより、改良の方向性が考えやすかったことが、進めやすさに大きく寄与したかと思います。
- テストデータをCSVにしてツールに入力すれば一気に実行してくれて、すぐにテストが終わる
- テスト結果が一覧で表示され、どこに問題があるのかが見やすい
- テスト結果を他メンバーに共有しやすい
- バージョン管理がされるので、悪化した場合に元に戻しやすい
ただ一方で、llm-as-a-judgeへの限界も感じました。出力結果が文章になるものについては、評価をLLMにさせていたのですが、どう見ても正解のケースを不正解にしたり、逆のケースも多々見受けられました。評価結果を手動で直すことができるので、その機能で対応していましたが、結局全ての出力に目を通す羽目になることもありました。評価のプロンプトエンジニアリングをするという本質的ではない作業も発生しました。
さいごに
近年、生成AIが台頭してきたことにより、生成AIを使ったプロダクトやサービスが増えてきました。とりあえず情報としてはインプットするけど、実際に業務に使うことはないということが多かったのですが、今回は新しいツールを試しに使ってみて、実際に業務が捗ったので非常に良い経験でした。今後プロンプトエンジニアリングをする機会が多くなるかと思いますが、皆さんもぜひpromptfooを使って効率よく進めていきましょう!
データ戦略室は、随時メンバーの募集をしておりますので、興味を持った方はぜひ求人もご覧ください!