Optunaベースの内製フレームワーク × Work Suite:ユーザーフィードバック駆動型プロンプト最適化による新機能
Preferred Networksは、Optunaベースの内製フレームワークとユーザフィードバック駆動型アルゴリズムを組み合わせ、生成AIプラットフォーム「Work Suite」において複数LLMブロックのプロンプト群を自動最適化する新機能を開発した。
キーポイント
ユーザフィードバック駆動型プロンプト最適化手法
ユーザがワークフロー全体に対して与える定性的フィードバック(accept/rejectとその理由)を基に、複数のLLMブロックのプロンプト群を同時に自動改善するアルゴリズムを考案した。
Optunaベースの内製フレームワークの拡張
PFNが開発するOSS「Optuna」をベースにした内製フレームワークを拡張し、試行履歴の管理・可視化・永続化機能を活用しながら新機能を実装した。
テキスト勾配を用いたプロンプト生成
新たなプロンプト群を生成する際に「テキスト勾配」と呼ばれる手法を用いており、プロンプトの探索空間を効率的に探索している。
履歴管理による探索効率化
accept時はそのプロンプト群を新たな親として採用し過去履歴をクリア、reject時は理由を履歴保持する設計により、改善方向性のブレを防ぎつつ探索効率を高めている。
業務効率化プラットフォームへの実装
社内データ活用による業務のAI効率化・自動化を支援するプラットフォーム「PreferredAI Work Suite」の「ワークフロー」機能に、この自動プロンプト最適化機能を実装した。
プロンプト群の個別制御
ワークフロー内の複数LLMブロックに対し、フィードバックが全体向けでも、識別子と明示的な関係性判断により、関係ないプロンプトへの破壊的変更を防ぐ仕組みがある。
履歴を活用した改善
過去のフィードバック履歴を保持し、曖昧な指示(例:「検索は日本語でしたい」)でも、以前の意図(「出力結果を英語にしたい」)を考慮して適切にプロンプトを改善できる。
影響分析・編集コメントを表示
影響分析
この技術は、複雑なワークフローにおけるプロンプト調整の負荷を大幅に軽減し、生成AIの実業務適用を加速させる可能性がある。Optunaエコシステムとの親和性から、同様のアプローチが他社・他プロダクトにも波及する示唆的な事例となっている。
編集コメント
プロンプトエンジニアリングの自動化において、ユーザインタラクションと履歴管理を巧妙に組み合わせた実用的なアプローチ。Optunaコミュニティへの還流も期待できる技術開発だ。
はじめに
Preferred Networks の加藤です。AI プロダクト・ソリューションチーム所属で、AutoML チームも兼務しています。PFN では Preferred AI という生成 AI を活用したプロダクト群を開発しており、その 1 つである PreferredAI Work Suite (以下、Work Suite) に自動プロンプト最適化を行える新機能を実装しました (※画面は開発中のものです)。
image図 1: 自動プロンプト最適化を行える新機能の紹介 GIF
Work Suite は、社内データを活用し、業務の AI による効率化・自動化を支援するプラットフォームです。Work Suite の機能の 1 つとして、「ワークフロー」機能があります。ユーザは自動化したい業務フローを、複数のステップに分解し、各ステップの処理を「ブロック」として定義して組み合わせることでワークフローを構築することができます。以下は、「与えられた質問に対し、必要な情報を Web 検索し、その情報をもとに回答を生成する」ワークフローの例です:
image図 2: 与えられた質問に対し、必要な情報を Web 検索し、その情報をもとに回答を生成するワークフローの例
ブロックの一種である「LLM ブロック」は、ユーザが任意のプロンプトを入力し、汎用的に利用することができますが、簡潔に記述したプロンプトでは望み通りの働きをしてくれない場合があるため、ユーザは自身のプロンプトを手作業で改善する必要がありました。特にワークフロー全体のブロック数が増えてくると、全てのプロンプトを人手で直していくのは骨が折れる作業になります。
そこで今回、LLM ブロックが複数存在するワークフローにおいて、ユーザがワークフロー全体に対して単一に与えるフィードバックをもとに、自動でプロンプトを最適化する仕組みを考案し、実装を行いました。本ブログでは、この新機能の技術詳細についてご紹介します。
Optuna ベースでプロンプト最適化を行う内製フレームワーク
PFN 社内では、自動プロンプト最適化を行うためのフレームワークを内製しています。このフレームワークは、PFN が開発・公開している OSS である Optuna をベースにしており、Optuna と同様のインターフェースで利用できるように設計されています [1] 。
例えば、最適化対象(プロンプトの探索空間)を定義し、各 trial で候補プロンプトを生成して評価し、その結果をもとに次の候補を提案する、といった基本的な流れは Optuna と同じです。加えて、Optuna が提供している試行履歴の管理・可視化・永続化といった機能をそのまま活用できるため、実運用上の利点もあります。今回 Work Suite に実装した新機能は、この内製フレームワークを拡張することで実現しました。
ユーザフィードバック駆動型のプロンプト最適化手法の考案
今回考案したのは、「ユーザがワークフロー全体に対して与える、定性的なフィードバック」から出発して、複数の LLM ブロックのプロンプト(複数のプロンプトをまとめて「プロンプト群」と呼ぶことにします)を自動で改善していくアルゴリズムです。このアルゴリズムは、以下の特徴を持ちます:
ユーザの定性的フィードバックに基づいて改善を行う
評価値は accept / reject (「この結果でよい」か「まだ直したい」か)の 2 値
accept された候補が出たら、直ちにその候補へ遷移する。以降は accept されたプロンプト群を親として探索することとし、それまでの履歴をクリアする。こうすることで、不必要に履歴が膨大になり、改善の方向性がブレることを防ぐ。
reject の場合はユーザから reject 理由を受け取り、プロンプトと reject 理由の履歴を保持しながら次の候補を探索
プロンプト群を同時に最適化できる
アルゴリズムの流れ
最適化対象となる初期プロンプト群を prompt_set_0 とします。なお、プロンプト群は 1 つ以上のプロンプト (prompt_set_0 の 1 つ目、prompt_set_0 の 2 つ目、…) で構成されます。Work Suiteであれば、1 つ以上の「LLM ブロック」のプロンプトを合わせてここでは「プロンプト群」と呼んでいることに注意してください。

ユーザは prompt_set_0 に対して「どう変更したいか」を表す定性的なフィードバックを入力します。アルゴリズムはそのフィードバックをもとに prompt_set_1 を生成します。なお、新たにプロンプト群を生成する際には、プロンプト群に含まれる各プロンプトに「テキスト勾配 [2] (text gradient)」と呼ばれる手法を用いています。

ユーザは prompt_set_1 をもとに、accept / reject を選びます。ここから分岐します。
accept の場合
prompt_set_1 を新たな親プロンプト群として採用し、今後の探索は prompt_set_1 から再開します。これ以降、prompt_set_0 やここで得たフィードバックを使うことはありません。「そのフィードバックは満たせた」とみなして、次の改善(別のフィードバック)へ進む、もしくは、これ以上のフィードバックがなければ探索(改善作業)を終了します。
reject の場合
ユーザは同時に reject した理由を入力します。アルゴリズム側はこの reject 理由を履歴として保持します。次の候補 prompt_set_2 を生成する際には、次のものを材料にして、prompt_set_2 を生成します:
prompt_set_1 およびユーザが入力した reject 理由
0→1 の遷移の際に用いたフィードバック
参照元の親プロンプト群(prompt_set_0)

翻訳全文
こちらのワークフローを実行すると、次のような出力となりました:
申し訳ありませんが、
検索結果にはPreferred Networksの具体的な住所に関する情報は含まれていませんでした。
そのため、Preferred Networksの住所についてお答えすることはできません。 ...
(後略)
正しく検索結果を得られていないようです。そこでキーワード生成LLM(大規模言語モデル)の出力を見てみると、以下のような結果が返ってきていました:
Preferred Networksの住所を調べるための Web 検索のキーワードとしては、
以下のようなものが適切でしょう:
- 「Preferred Networks 本社 住所」
- 「Preferred Networks 所在地」
- 「Preferred Networks 会社住所 東京都」(Preferred Networksは東京都に本社があるため)
- **「Preferred Networks アクセス」 ...
(後略)
Web 検索ではこちらの出力がそのまま入力として使われます。追加の説明等は不要で、キーワードのみを出力して欲しいので、そのようにフィードバックをしてみます。
image図4: 「キーワード生成側ではキーワードだけ出して欲しい」とフィードバックをする様子
すると、以下のようなプロンプト群に改善されました:
image図5: 1度目のプロンプト改善結果
キーワード生成 LLM(大規模言語モデル)のプロンプトに、キーワードのみを出力する旨が追加されています。また、回答生成 LLM の方では、今回のフィードバックは関係なかったものと判断され、(一般的な改善を施す微修正は入ったものの) とくに大きな変更はありません。このように、フィードバックの内容に応じて、本質的に変えるべき部分はどこなのかを自動で判断して、プロンプトが最適化されていきます。「提案を適用」ボタンを押し、変更を適用します (左側ボタン「プロンプトを再生成」を押すこと、右側ボタン「提案を適用」を押すことが、それぞれ、アルゴリズムにおける reject / accept に対応しています) 。
次に、出力結果を英語に変更してみたいと思います。新たに「出力結果を英語にしたい」というフィードバックを送ります。
image図6: 「出力結果を英語にしたい」とフィードバックをした結果
キーワード生成の方も英語で検索をするようになってしまったので、「検索は日本語でしたい」という理由で reject してみます。
image図7: 2度目のプロンプト改善結果
必ず JSON 形式で返してください。translation フィールドのみ。他のフィールド(technical_terms 等)は一切追加しないこと — 余計なフィールドを書こうとして本文翻訳がトークン上限で打ち切られる事故を防ぐため:
{"translation": "翻訳全文"}
これで正しい結果が得られました。このように、「検索は日本語でしたい」という曖昧な指示に対しても、以前「出力結果を英語にしたい」というフィードバックをユーザが送っていたことを履歴として保持しているため、明示的に「検索は日本語で、出力は英語で」と言わなくても正しくプロンプトを改善することができました。
また、プロンプトの最適化の履歴は、ツリー形式でみることができるようになっています:
image図 8: プロンプト最適化の履歴をツリー構造で表す UI の様子
おわりに
本稿では、Work Suite のワークフロー機能において、ユーザがワークフロー全体に対して与える単一の定性的フィードバックを起点に、複数の LLM ブロックのプロンプト群を自動で最適化する新機能について、アルゴリズムの概要と画面上での具体例を紹介しました。
本機能は Work Suite 開発チーム単独の取り組みにとどまらず、チームの垣根を越えて、社内で育ててきた基盤技術をプロダクトへ取り込んだ事例でもあります。ベースとなった Optuna は PFN が開発する OSS で、研究用途に限らず社内の多様なプロジェクトで活用され、実運用に耐える形へ継続的に磨き込まれてきました。今回もその資産を活かしつつ、要件に合わせた拡張を行うことで、スムーズに実装へつなげることができました。
今後も、PFN の技術力をプロダクト価値の向上に結びつけ、そこで得られた知見を基盤技術へ還元する、そのような相乗効果を持つ循環を通じて、プロダクトと技術の双方をさらに発展させていきたいと考えています。
参考文献
[1] 水野 尚人,柳瀬 利彦,佐野 正太郎,自動プロンプト最適化のソフトウェア設計,言語処理学会第30回年次大会 (NLP2024), P9-2, 2024.
[2] Pryzant, Reid, et al. "Automatic Prompt Optimization with "Gradient Descent" and Beam Search." The 2023 Conference on Empirical Methods in Natural Language Processing.
投稿 Optunaベースの内製フレームワーク × Work Suite: ユーザフィードバック駆動型プロンプト最適化を用いた新機能について は Preferred Networks Tech Blog に最初に表示されました。
原文を表示
はじめに
Preferred Networksの加藤です。AIプロダクト・ソリューションチーム所属で、AutoMLチームも兼務しています。PFNでは Preferred AI という生成AIを活用したプロダクト群を開発しており、その1つである PreferredAI Work Suite (以下、Work Suite) に自動プロンプト最適化を行える新機能を実装しました (※画面は開発中のものです)。
image図1: 自動プロンプト最適化を行える新機能の紹介GIF
Work Suite は、社内データを活用し、業務のAIによる効率化・自動化を支援するプラットフォームです。Work Suite の機能の1つとして、「ワークフロー」機能があります。ユーザは自動化したい業務フローを、複数のステップに分解し、各ステップの処理を「ブロック」として定義して組み合わせることでワークフローを構築することができます。以下は、「与えられた質問に対し、必要な情報をWeb検索し、その情報をもとに回答を生成する」ワークフローの例です:
image図2: 与えられた質問に対し、必要な情報をWeb検索し、その情報をもとに回答を生成するワークフローの例
ブロックの一種である「LLMブロック」は、ユーザが任意のプロンプトを入力し、汎用的に利用することができますが、簡潔に記述したプロンプトでは望み通りの働きをしてくれない場合があるため、ユーザは自身のプロンプトを手作業で改善する必要がありました。特にワークフロー全体のブロック数が増えてくると、全てのプロンプトを人手で直していくのは骨が折れる作業になります。
そこで今回、LLMブロックが複数存在するワークフローにおいて、ユーザがワークフロー全体に対して単一に与えるフィードバックをもとに、自動でプロンプトを最適化する仕組みを考案し、実装を行いました。本ブログでは、この新機能の技術詳細についてご紹介します。
Optunaベースでプロンプト最適化を行う内製フレームワーク
PFN社内では、自動プロンプト最適化を行うためのフレームワークを内製しています。このフレームワークは、PFNが開発・公開しているOSSである Optuna をベースにしており、Optuna と同様のインターフェースで利用できるように設計されています [1] 。
例えば、最適化対象(プロンプトの探索空間)を定義し、各 trial で候補プロンプトを生成して評価し、その結果をもとに次の候補を提案する、といった基本的な流れは Optuna と同じです。加えて、Optuna が提供している試行履歴の管理・可視化・永続化といった機能をそのまま活用できるため、実運用上の利点もあります。今回 Work Suite に実装した新機能は、この内製フレームワークを拡張することで実現しました。
ユーザフィードバック駆動型のプロンプト最適化手法の考案
今回考案したのは、「ユーザがワークフロー全体に対して与える、定性的なフィードバック」から出発して、複数の LLM ブロックのプロンプト(複数のプロンプトをまとめて「プロンプト群」と呼ぶことにします)を自動で改善していくアルゴリズムです。このアルゴリズムは、以下の特徴を持ちます:
ユーザの定性的フィードバックに基づいて改善を行う
評価値は accept / reject (「この結果でよい」か「まだ直したい」か)の2値
accept された候補が出たら、直ちにその候補へ遷移する。以降は accept されたプロンプト群を親として探索することとし、それまでの履歴をクリアする。こうすることで、不必要に履歴が膨大になり、改善の方向性がブレることを防ぐ。
reject の場合はユーザからreject 理由を受け取り、プロンプトとreject理由の履歴を保持しながら次の候補を探索
プロンプト群を同時に最適化できる
アルゴリズムの流れ
最適化対象となる初期プロンプト群を prompt_set_0 とします。なお、プロンプト群は1つ以上のプロンプト (prompt_set_0 の1つ目、prompt_set_0 の 2つ目、…) で構成されます。Work Suiteであれば、1つ以上の「LLMブロック」のプロンプトを合わせてここでは「プロンプト群」と呼んでいることに注意してください。

ユーザは prompt_set_0 に対して「どう変更したいか」を表す定性的なフィードバックを入力します。アルゴリズムはそのフィードバックをもとに prompt_set_1 を生成します。なお、新たにプロンプト群を生成する際には、プロンプト群に含まれる各プロンプトに「テキスト勾配 [2] 」と呼ばれる手法を用いています。

ユーザは prompt_set_1 をもとに、 accept / reject を選びます。ここから分岐します。
accept の場合
prompt_set_1 を新たな親プロンプト群として採用し、今後の探索は prompt_set_1 から再開します。これ以降、 prompt_set_0 やここで得たフィードバックを使うことはありません。「そのフィードバックは満たせた」とみなして、次の改善(別のフィードバック)へ進む、もしくは、これ以上のフィードバックがなければ探索(改善作業)を終了します。
reject の場合
ユーザは同時にreject した理由を入力します。アルゴリズム側はこの reject 理由を履歴として保持します。次の候補 prompt_set_2 を生成する際には、次のものを材料にして、 prompt_set_2 を生成します:
prompt_set_1およびユーザが入力したreject 理由
0→1 の遷移の際に用いたフィードバック
参照元の親プロンプト群(prompt_set_0)

ユーザは、prompt_set_2 をもとに、再び accept / reject を判断します。
この手順を繰り返します。reject されたプロンプト群とその理由は、ユーザが accept するまで履歴として保持されます。
たとえば prompt_set_2 を親として 2→3 の遷移をした後に prompt_set_3, prompt_set_4, prompt_set_5 が連続で reject された場合、次の prompt_set_6 生成では prompt_set_2, 3, 4, 5 および 3/4/5 の reject 理由の履歴、そして 2→3 の際のフィードバックが材料となります。過去の失敗を蓄積しながら探索を進めつつ、accept が出た時点で素早く状態が更新されていく仕組みです。

プロンプト群(複数 LLM ブロック)対応のための工夫
前節にて説明した通り、Work Suite のワークフローでは、1つのワークフローの中に複数の LLM ブロックが存在することもあります。
一方で、ユーザが与えるフィードバックは「ワークフロー全体に対して1つ」です。そのため、例えば、「与えられた質問に対し、必要な情報をWeb検索し、その情報をもとに回答を生成する」ワークフローにおいて、ユーザが「クエリ生成側ではキーワードだけ出してほしい」という意図でフィードバックを書いたとしても、何も工夫がなければ回答生成側のプロンプトまで同時に変化してしまい、改善がブレてしまいます。
この問題に対して、「ワークフロー全体としての改善」という枠組みは維持しつつ、意図しないプロンプトの破壊的変更を抑える仕組みを導入しています。具体的には、全てのプロンプトに内部的な識別子(採番)を付与し、各プロンプトを更新する際に「ユーザのフィードバックはプロンプト群全体に対するものであり、必ずしもこのパラメータ(= このプロンプト)に関係するとは限らない」ことを明示しています。これにより、ユーザのフィードバックに直接関係しないプロンプトには更新の影響が及ばないように制御しています。
プロンプト最適化の具体例
実際のプロンプト最適化の様子を、Work Suiteの画面上で説明します。ここでも、「与えられた質問に対し、必要な情報をWeb検索し、その情報をもとに回答を生成する」ワークフローを説明の例として用います。「Preferred Networks の住所は?」という入力を質問とします。
image図3: 「Preferred Networks の住所は?」という入力を入れる様子
初期状態のプロンプト群 (= prompt_set_0) は、以下の通りです:
キーワード生成LLM (= prompt_set_0 の1つ目のプロンプト):「以下の質問に対し、それに答えるためのWeb検索のキーワードを作成してください。質問: {{ ユーザの入力 }} 」
回答生成LLM (= prompt_set_0 の2つ目のプロンプト):「以下の検索結果をもとに、次の質問に答えてください。 検索結果:{{ ウェブ検索の結果 }} 質問:{{ ユーザの入力 }}」
こちらのワークフローを実行すると、次のような出力となりました:
申し訳ありませんが、
検索結果にはPreferred Networksの具体的な住所に関する情報は含まれていませんでした。
そのため、Preferred Networksの住所についてお答えすることはできません。 ...
(後略)
正しく検索結果を得られていないようです。そこでキーワード生成LLMの出力を見てみると、以下のような結果が返ってきていました:
Preferred Networksの住所を調べるためのWeb検索のキーワードとしては、
以下のようなものが適切でしょう:
- 「Preferred Networks 本社 住所」
- 「Preferred Networks 所在地」
- 「Preferred Networks 会社住所 東京都」(Preferred Networksは東京都に本社があるため)
- **「Preferred Networks アクセス」 ...
(後略)
Web検索ではこちらの出力がそのまま入力として使われます。追加の説明等は不要で、キーワードのみを出力して欲しいので、そのようにフィードバックをしてみます。
image図4: 「キーワード生成側ではキーワードだけ出して欲しい」とフィードバックをする様子
すると、以下のようなプロンプト群に改善されました:
image図5: 1度目のプロンプト改善結果
キーワード生成LLMのプロンプトに、キーワードのみを出力する旨が追加されています。また、回答生成LLMの方では、今回のフィードバックは関係なかったものと判断され、(一般的な改善を施す微修正は入ったものの) とくに大きな変更はありません。このように、フィードバックの内容に応じて、本質的に変えるべき部分はどこなのかを自動で判断して、プロンプトが最適化されていきます。「提案を適用」ボタンを押し、変更を適用します (左側ボタン「プロンプトを再生成」を押すこと、右側ボタン「提案を適用」を押すことが、それぞれ、アルゴリズムにおける reject / accept に対応しています) 。
次に、出力結果を英語に変更してみたいと思います。新たに「出力結果を英語にしたい」というフィードバックを送ります。
image図6: 「出力結果を英語にしたい」とフィードバックをした結果
キーワード生成の方も英語で検索をするようになってしまったので、「検索は日本語でしたい」という理由でrejectしてみます。
image図7: 2度目のプロンプト改善結果
これで正しい結果が得られました。このように、「検索は日本語でしたい」という曖昧な指示に対しても、以前「出力結果を英語にしたい」というフィードバックをユーザが送っていたことを履歴として保持しているため、明示的に「検索は日本語で、出力は英語で」と言わなくても正しくプロンプトを改善することができました。
また、プロンプトの最適化の履歴は、ツリー形式でみることができるようになっています:
image図8: プロンプト最適化の履歴をツリー構造で表すUIの様子
おわりに
本稿では、Work Suite のワークフロー機能において、ユーザがワークフロー全体に対して与える単一の定性的フィードバックを起点に、複数の LLM ブロックのプロンプト群を自動で最適化する新機能について、アルゴリズムの概要と画面上での具体例を紹介しました。
本機能は Work Suite 開発チーム単独の取り組みにとどまらず、チームの垣根を越えて、社内で育ててきた基盤技術をプロダクトへ取り込んだ事例でもあります。ベースとなった Optuna は PFN が開発する OSS で、研究用途に限らず社内の多様なプロジェクトで活用され、実運用に耐える形へ継続的に磨き込まれてきました。今回もその資産を活かしつつ、要件に合わせた拡張を行うことで、スムーズに実装へつなげることができました。
今後も、 PFN の技術力をプロダクト価値の向上に結びつけ、そこで得られた知見を基盤技術へ還元する、そのような相乗効果を持つ循環を通じて、プロダクトと技術の双方をさらに発展させていきたいと考えています。
参考文献
[1] 水野 尚人, 柳瀬 利彦, 佐野 正太郎, 自動プロンプト最適化のソフトウェア設計, 言語処理学会第30回年次大会(NLP2024), P9-2, 2024.
[2] Pryzant, Reid, et al. “Automatic Prompt Optimization with “Gradient Descent” and Beam Search.” The 2023 Conference on Empirical Methods in Natural Language Processing.
投稿 Optunaベースの内製フレームワーク × Work Suite: ユーザフィードバック駆動型プロンプト最適化を用いた新機能について は Preferred Networks Tech Blog に最初に表示されました。
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み