🌊

プロンプト改善エージェントを作ってみた

2023/07/22に公開

本記事はAI Agent Meetup#0発表した内容を記事化したものです。

本記事では自動でプロンプトを改善する、プロンプト改善エージェントを作る方法についてご紹介します。先に言っておくと、魔法のように良いプロンプトを生成できるまでには至っていません。
ただ、可能性の片鱗は感じることができると思います👍🏼

レポジトリ
https://github.com/kazuooooo/prompt-agent


そもそもAIエージェントとは?

AIエージェントとは、人の介在を必要とせず、自律的に目的を達成するソフトウェアの総称です。

例えば「最新のAppleの製品に関する記事の要約を、スプレッドシートにまとめたい」とします。
この時、LLMを直接使う場合、人間がタスクを分解して、1つ1つの指示を与える必要があります。

それに対し、AIエージェントは目的を与えるだけで、自分でタスク分解、実行し、目的を達成します。 人間は、目的を与えて待ってるだけで仕事が終わってしまうわけです。

AIエージェントとして有名なものにAuto-GPTBabyAGIがあります。
より詳しくAIエージェントについて知りたい方は、こちらの記事も参考になります。
https://note.com/dory111111/n/nd7ff9d693e25


プロンプト改善エージェント

AIエージェントがわかったところで、本題の、プロンプト改善エージェントについてご紹介します。
まず、一般的なプロンプトエンジニアリングの流れは以下です:
① 最初のプロンプトを書く
② 実行する
③ 出力から改善点を考える
④ 改善点をもとに、プロンプトを修正する
(理想の出力が得られるまで、②-④を繰り返す)
⑤理想のプロンプトが得られる

中でも辛いのは、②-④で繰り返しプロンプトを改善する箇所です。
LLMの中身はブラックボックスで、論理的に詰めて改善することができず、めちゃくちゃ辛いですよね。

この一番めんどくさい
③ 出力から改善点を考える
④ 改善点を元にプロンプトを修正する
をAIにやって欲しいです。

こうなって

こうしたのが、プロンプト改善エージェントです。


仕組み

プロンプト改善エージェントでは、
② 実行: 実行エージェント(execution_agent.py)
③ 改善点を考える: 評価エージェント(evaluation_agent.py)
③ 修正する: プロンプト修正エージェント(fix_prompt_agent.py)
のサブエージェントを用意し、自律的にプロンプトを改善します。

全体の流れを表した図が以下です。

実行の流れを順番に見ていきましょう。

実行エージェント

まず、初期のプロンプト、理想の出力を実行エージェントが受け取り、出力します。

エージェントと言っても、ここは単純に受け取ったプロンプトをLLMに入力して、出力を評価エージェントに送ります。

def execute(
  prompt: str # プロンプト
) -> str:
  # プロンプトをLLMに入力
  response = openai.ChatCompletion.create(
    model=os.environ.get("LLM_MODEL"),
    messages=[{"role": "system", "content": prompt }],
    temperature=0
  )

  # 出力を返す
  output = response["choices"][0]["message"].content 
  return output #type: ignore

評価エージェント

続いて、評価エージェントです。
評価エージェントは実行エージェントからもらった出力と理想の出力を比較し、出力が理想の出力に近づくための改善点を出力します。

評価エージェントのプロンプトは以下です。

"""
現在の出力と理想の出力を比較して、現在の出力が理想の出力に近づくための改善点をリストアップしてください。

現在の出力
\`\`\`
{output}
\`\`\`

理想の出力
\`\`\`
{desired_output}
\`\`\`

"""

ここで出てきた改善点をプロンプト修正エージェントに送ります。

プロンプト修正エージェント

最後はプロンプト修正エージェントです。
プロンプト修正エージェントは評価エージェントから受け取った改善点を元に、プロンプトの修正を行います。


プロンプトは以下です。

"""
あなたはプロンプトエンジニアです。
このプロンプトを改善点に基づいて、修正してください。

プロンプト
\`\`\`
{current_prompt}
\`\`\`

改善点
\`\`\`
{list_to_bullet(improvements)}
\`\`\`
"""

これにより、修正された新たなプロンプトができるので、実行エージェントにもどり、以降自動的にプロンプトの改善を繰り返します。

試してみる

単純な計算

まずは単純な計算:

  • 初期プロンプト: 1+1はいくつですか?
  • 理想のプロンプト: 4+4=8です
  • イテレーション: 3

を実行します。

python3 prompt_agent.py
フルの出力
```shell
*****設定*****
理想の出力: 4+4=8です
初期プロンプト: 1+1はいくつですか?
イテレーション: 3 

*****実行エージェント*****
プロンプト: 1+1はいくつですか?
↓
出力: 1+1は2です。

*****評価エージェント*****
出力: 1+1は2です。
理想の出力: 4+4=8です
↓
改善点:
* 現在の出力は1+1=2ですが、理想の出力は4+4=8です。
* 現在の出力には計算式が含まれていません。計算式を追加する必要があります。
* 現在の出力には計算結果が表示されていますが、理想の出力では計算結果のみが表示されます。
* 現在の出力には不要なテキストが含まれています。不要なテキストを削除する必要があります。

*****プロンプト修正エージェント*****
現在のプロンプト: 1+1はいくつですか?
改善点:
* 現在の出力は1+1=2ですが、理想の出力は4+4=8です。
* 現在の出力には計算式が含まれていません。計算式を追加する必要があります。
* 現在の出力には計算結果が表示されていますが、理想の出力では計算結果のみが表示されます。
* 現在の出力には不要なテキストが含まれています。不要なテキストを削除する必要があります。
↓
修正されたプロンプト: 4+4はいくつですか? 

*****実行エージェント*****
プロンプト: 4+4はいくつですか?
↓
出力: 4+4は8です。

*****評価エージェント*****
出力: 4+4は8です。
理想の出力: 4+4=8です
↓
改善点:
* 等号を追加する

*****プロンプト修正エージェント*****
現在のプロンプト: 4+4はいくつですか?
改善点:
* 等号を追加する
↓
修正されたプロンプト: 4+4はいくつですか?= 

*****実行エージェント*****
プロンプト: 4+4はいくつですか?=
↓
出力: 8です。

*****評価エージェント*****
出力: 8です。
理想の出力: 4+4=8です
↓
改善点:
* 現在の出力には計算式が含まれていないので、計算式を追加する。
* 計算式の左辺と右辺を明示するために、'='を使用する。
* 計算式の左辺と右辺を示すために、数字を追加する。

*****プロンプト修正エージェント*****
現在のプロンプト: 4+4はいくつですか?=
改善点:
* 現在の出力には計算式が含まれていないので、計算式を追加する。
* 計算式の左辺と右辺を明示するために、'='を使用する。
* 計算式の左辺と右辺を示すために、数字を追加する。
↓
修正されたプロンプト: 4 + 4 = ? 

*****最終結果*****
プロンプト: 4 + 4 = ?
出力: 8です。
理想の出力: 4+4=8です
```

まず、評価エージェントが実行します。

*****実行エージェント*****
プロンプト: 1+1はいくつですか?
↓
出力: 1+12です。

この出力をもとに評価エージェントが改善点を洗い出します。

*****評価エージェント*****
出力: 1+12です。
理想の出力: 4+4=8です
↓
改善点:
* 現在の出力は1+1=2ですが、理想の出力は4+4=8です。
* 現在の出力には計算式が含まれていません。計算式を追加する必要があります。
* 現在の出力には計算結果が表示されていますが、理想の出力では計算結果のみが表示されます。
* 現在の出力には不要なテキストが含まれています。不要なテキストを削除する必要があります。

改善点をもとにプロンプト修正エージェントが、プロンプトを修正します。

*****プロンプト修正エージェント*****
現在のプロンプト: 1+1はいくつですか?
改善点:
* 現在の出力は1+1=2ですが、理想の出力は4+4=8です。
* 現在の出力には計算式が含まれていません。計算式を追加する必要があります。
* 現在の出力には計算結果が表示されていますが、理想の出力では計算結果のみが表示されます。
* 現在の出力には不要なテキストが含まれています。不要なテキストを削除する必要があります。
↓
修正されたプロンプト: 4+4はいくつですか?

見事プロンプトを

1+1はいくつですか? → 4+4はいくつですか?に改善できていることがわかります。

大阪のおばちゃん

続いて、もう少し複雑な例も試してみます。
先日自分が公開したAIおばちゃん占いのプロンプトで試してみます。

  • 初期プロンプト: あなたは東京に住んでいる薬剤師です。薬の質問に答えてください。
  • 理想のプロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
  • イテレーション: 3
フルの出力
```bash
*****設定*****
理想の出力: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
初期プロンプト: あなたは東京に住んでいる薬剤師です。薬の質問に答えてください。
イテレーション: 3 

*****実行エージェント*****
プロンプト: あなたは東京に住んでいる薬剤師です。薬の質問に答えてください。
↓
出力: はい、どのような質問でしょうか?薬に関することならお答えできるかもしれません。

*****評価エージェント*****
出力: はい、どのような質問でしょうか?薬に関することならお答えできるかもしれません。
理想の出力: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
↓
改善点:
* 現在の出力は丁寧ですが、もっと親しみやすいトーンで話しかけると良いでしょう。
* 「薬に関することならお答えできるかもしれません」という文言は不要です。
* 「大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?」という文言を追加しましょう。

*****プロンプト修正エージェント*****
現在のプロンプト: あなたは東京に住んでいる薬剤師です。薬の質問に答えてください。
改善点:
* 現在の出力は丁寧ですが、もっと親しみやすいトーンで話しかけると良いでしょう。
* 「薬に関することならお答えできるかもしれません」という文言は不要です。
* 「大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?」という文言を追加しましょう。
↓
修正されたプロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい? 

*****実行エージェント*****
プロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
↓
出力: こんにちは、きよみやさん。実は最近、仕事のストレスが溜まっていて、どうにか解消したいと思っています。何かアドバイスやアイデアはありますか?

*****評価エージェント*****
出力: こんにちは、きよみやさん。実は最近、仕事のストレスが溜まっていて、どうにか解消したいと思っています。何かアドバイスやアイデアはありますか?
理想の出力: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
↓
改善点:
* 挨拶の文言を修正する
* 自己紹介を追加する
* 相手の悩みを尋ねるフレーズを追加する

*****プロンプト修正エージェント*****
現在のプロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
改善点:
* 挨拶の文言を修正する
* 自己紹介を追加する
* 相手の悩みを尋ねるフレーズを追加する
↓
修正されたプロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。最近、何か悩み事があるかい? 

*****実行エージェント*****
プロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。最近、何か悩み事があるかい?
↓
出力: ええ、実は最近仕事のストレスが溜まっていて、どうにか解消したいと思っているんです。

*****評価エージェント*****
出力: ええ、実は最近仕事のストレスが溜まっていて、どうにか解消したいと思っているんです。
理想の出力: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
↓
改善点:
* 大阪のおばちゃん、きよみやで〜占いが得意やねん。
* なんか困ったことあるかい?

*****プロンプト修正エージェント*****
現在のプロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。最近、何か悩み事があるかい?
改善点:
* 大阪のおばちゃん、きよみやで〜占いが得意やねん。
* なんか困ったことあるかい?
↓
修正されたプロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。
なんか困ったことあるかい? 

*****最終結果*****
プロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。
なんか困ったことあるかい?
出力: ええ、実は最近仕事のストレスが溜まっていて、どうにか解消したいと思っているんです。
理想の出力: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?
```

結果は以下のようになり、プロンプト側が大阪のおばちゃんになってしまいました….😇

*****最終結果*****
プロンプト: 大阪のおばちゃん、きよみやで〜占いが得意やねん。
なんか困ったことあるかい?
出力: ええ、実は最近仕事のストレスが溜まっていて、どうにか解消したいと思っているんです。
理想の出力: 大阪のおばちゃん、きよみやで〜占いが得意やねん。なんか困ったことあるかい?

ということで、少し複雑になるとうまく改善してくれませんでした。


まとめ

  • 単純な例では動作したので、可能性はありそう。
  • 少し複雑な例になると、まともに動かないのでまだまだ改善が必要。
    皆さんもAIエージェントを作ってみてください!
    無限の可能性を感じられるはずです 🚀

AIを用いた開発者向けサービスの開発に興味のある方、ぜひ一緒に作りましょう!
https://supernova.studio.site/

Discussion