🐿️

Prompt Engine: プロンプトの改良と最適なモデル選定を行う

2024/12/07に公開

何気なくHacker Newsを見ていたら、面白そうな記事を見つけました。
https://news.ycombinator.com/item?id=42339302

Promptを元に最適なLLMモデルを選んでくれるとのこと。早速アカウントを作成して使ってみました。

はじめに

適用したい場面やジャンルによって最適なモデルは異なります。例えば、GPT-4oはカスタマーサポートのチャットに向いているがClaudeの方がコード理解の分野では優れている、などなど...

ある一つのワークフローを構築する場合でも、各プロセスに最適なモデルは異なるはず。しかし一つ一つ選定していたのではコストと時間がかかりすぎます。それだけではなくプロンプトもそのワークフローに適したものを試行錯誤しながら改良していかなければなりません。

そんな課題を解決してくれるのがPrompt Engineです。消費トークンの削減などを考慮したプロンプトの改良、そのプロンプトに最適なモデルの選定、プロンプトの実行までを行うことができます。

要点・概要

ある課題に対して、一つのモデルを使うのではなく用途やプロセス毎に適切なAIを組み合わせることで良い結果を出すことが出来ます。(Mixture-Of-Agents: MoA

一方で、コストと精度を考慮してモデルを選んでいくことはコストと時間の面からも難しいことがほとんど。
そこでJigsawStackはPrompt Engineを開発。用途を簡単に伝えることで面倒な問題を処理してくれるようになりました。

Prompt Engineは二つのStepから構成されています。

  1. Create Prompt
    プロンプトの改良と最適なモデルの選定
  2. Run Prompt
    保存されたプロンプト(Prompt ID)を元に推論を実行。

Create Prompt


Create Prompt Engineは三つの入力を受け付けます。Prompt, Dynamic Variables, Response Structureです。(Promptのみ必須であとの二つは任意)

  1. 渡されたプロンプトをエンジンは精度を高め、トークンの使用量を減らし、出力構造の破損を防ぐように修正を行います。
  2. 50以上のLLMリストからプロンプトの内容に適したモデルの上位5つを選定、Bucketとしてまとめておきます。
  3. 改良されたプロンプトとLLM BucketをPrompt IDとして保存。

Run Prompt


作成されたPrompt IDと先に定義した任意のDynamic Variablesを渡すことでエンジンを実行することが可能になります。

  1. Prompt Engineを実行すると、先にバケット化された5つのLLMが同時並行で実行されます。
  2. 各出力は、ランキング用のSLMによって順位づけされます。このSLMはプロンプトと出力の類似性によって評価を行なっています。
  3. return_promptフィールドで設定した条件を維持したまま、上位2~3の出力が1つの出力に統合されます。

エンジンを実行するうちに、プロンプトでよりよく機能する傾向のある一般的なLLMをエンジンが学習するため、LLMのバケットは減少し、より高速で高品質な出力が得られるようになるそうです。

実行してみる

Create Prompt

import os
from jigsawstack import JigsawStack
from dotenv import load_dotenv

load_dotenv()

jigsawstack = JigsawStack(api_key=os.environ['JIGSAWSTACK_API_KEY'])

params = {
    "prompt": "Tell me a story about {about}",
    "inputs": [
        {
            "key": "about",
            "optional": False,
            "initial_value": "Leaning Tower of Pisa",
        },
    ],
    "return_prompt": "Return the result in a markdown format",
    "prompt_guard": ["sexual_content", "defamation"]
}
result = jigsawstack.prompt_engine.create(params)

print(result)
{
    'success': True,
    'prompt_engine_id': '5735d61c-a714-43d0-926b-2725de9c1db8', 
    'optimized_prompt': 'Create an engaging and imaginative story centered around the theme of {about}, incorporating vivid descriptions and compelling characters.'
}

Engineが保存されprompt_engine_idが返されました。このidを使ってPrompt Engineを実行していきます。

ちなみに、LLMのリストからどのモデルが選ばれたのかは確認が出来ませんでした。。。
裏側でどのモデルが動いているのか、気になるところではあります。

Run Prompt

import os
from jigsawstack import JigsawStack
from dotenv import load_dotenv

load_dotenv()

jigsawstack = JigsawStack(api_key=os.environ['JIGSAWSTACK_API_KEY'])

params = {
    "prompt": "Tell me a story about {about}",
    "inputs": [
        {
            "key": "about",
            "optional": False,
            "initial_value": "Leaning Tower of Pisa",
        },
    ],
    "return_prompt": "Return the result in a markdown format",
    "prompt_guard": ["sexual_content", "defamation"]
}
result = jigsawstack.prompt_engine.create(params)

res = jigsawstack.prompt_engine.run(
  {
    'id': result['prompt_engine_id'],
    'input_values': {
      'about': 'The Eiffel Tower'
    }
  }
)

print(res)
{
    'success': True,
    'result': '**The Eiffel Tower\'s Secret**\n\nDecember 7, 2024, 12:04 PM\n\nAs the sun rose over the City of Light, a sense of magic filled the air. The Eiffel Tower, that iconic iron giant, stood tall and proud, its latticework beams glistening in the morning dew. It was a day like any other, yet for Sophie, a young and ambitious journalist, it was the start of an adventure that would change her life forever.\n\nSophie had always been fascinated by the Eiffel Tower\'s rich history. She had spent countless hours researching its construction, its designers, and the secrets it held. As she stood at the base of the tower, she felt an inexplicable connection to the iron giant. It was as if the tower was calling to her, whispering secrets only she could hear.\n\nAs she began to climb the stairs, Sophie met a charming and enigmatic stranger, Léon. He was a local artist, with a passion for the tower\'s intricate details and a talent for capturing its essence on canvas. Together, they ascended the tower, their footsteps echoing off the metal beams.\n\nAt the top, they found themselves face to face with a breathtaking view of the city. The Seine River sparkled like a ribbon of diamonds, and the rooftops of Paris stretched out as far as the eye could see. Sophie felt a sense of awe wash over her, and Léon smiled knowingly, as if he had seen it all before.\n\nAs they gazed out at the view, Sophie noticed a small, hidden compartment in the tower\'s structure. It was cleverly disguised, but Léon seemed to know exactly where to look. He produced a small key and unlocked the compartment, revealing a treasure trove of secrets and stories.\n\n Inside, they found a collection of letters, written by Gustave Eiffel himself, detailing the tower\'s construction and the struggles he faced. There were also sketches of the tower\'s original design, and notes from the engineers who had worked tirelessly to bring it to life.\n\nSophie\'s eyes widened as she read through the letters, her mind racing with the stories and secrets she had uncovered. Léon smiled, his eyes twinkling with amusement, as if he had known all along that the tower held such treasures.\n\nAs they descended the tower, Sophie felt a sense of gratitude towards Léon. He had shared with her a piece of the tower\'s history, and in doing so, had given her a glimpse into the city\'s soul. She knew that she would never look at the Eiffel Tower in the same way again, and that their encounter would stay with her forever.\n\nAs they parted ways, Sophie turned to Léon and asked, "What\'s the secret of the Eiffel Tower?" Léon smiled, his eyes glinting with mischief, and replied, "The secret is not what you see, but what you feel. The tower is a symbol of hope, of dreams, and of the human spirit. It\'s a reminder that even in the darkest of times, there is always beauty to be found."\n\nSophie smiled, knowing that she had uncovered a piece of the tower\'s magic, and that she would carry it with her for the rest of her life.\n\n**Epilogue**\n\nYears later, Sophie became a renowned journalist, known for her captivating stories and her ability to uncover the secrets of the past. She never forgot the Eiffel Tower, and the lessons she had learned from Léon. And whenever she looked up at the tower\'s iron beams, she felt a sense of connection to the city, and to the magic that lay within its heart.'
}

かなりの長文で結果が出力されました。指定した通り、JSON形式になっていますね。
英語だと出力結果の良し悪しが分からなかったので、プロンプトを日本語にして出力させてみました。


エッフェル塔の秘密

物語のテーマ
エッフェル塔の秘密は、愛、友情、そして夢の物語です。主なテーマは、人生の目的と、自分自身の価値を見つけることです。

登場人物
ガブリエル: エッフェル塔の設計者、ギュスターヴ・エッフェル。彼は、塔の建設を通じて、愛と友情を求め、そしてそれを得ることの重要性を学びます。
ソフィ: ガブリエルの娘。彼女は、父親の塔の建設を通じて、夢と希望を求めます。
ルイ: ガブリエルの友人。彼は、塔の建設を通じて、ガブリエルの夢を支え、そして彼を励まします。

設定
物語は、1889年のパリ万博の際に、エッフェル塔が完成した時期に始まります。ガブリエルは、塔の設計者として、塔の建設を指揮しています。ソフィは、父親の塔の建設を通じて、夢と希望を求めます。ルイは、ガブリエルの友人として、塔の建設を支えます。

物語の展開
第一章: ガブリエルは、塔の設計を完成させ、建設を始めます。ソフィは、父親の塔の建設を通じて、夢と希望を求めます。
第二章: ルイは、ガブリエルの友人として、塔の建設を支えます。ガブリエルは、塔の建設を通じて、愛と友情を求めます。
第三章: ガブリエルは、塔の完成を目指して、建設を進めます。ソフィは、父親の塔の完成を待ちます。
第四章: ガブリエルは、塔の完成を達成します。ソフィは、父親の塔の完成を喜びます。ルイは、ガブリエルの友人として、塔の完成を祝います。

物語の結び
物語は、エッフェル塔の完成を通じて、愛、友情、そして夢の物語を伝えます。ガブリエルは、塔の建設を通じて、愛と友情を求め、そしてそれを得ることの重要性を学びます。ソフィは、父親の塔の完成を通じて、夢と希望を求めます。ルイは、ガブリエルの友人として、塔の完成を支えます。

結果
エッフェル塔の秘密は、愛、友情、そして夢の物語です。物語は、人生の目的と、自分自身の価値を見つけることの重要性を伝えます。ガブリエル、ソフィ、ルイの三人の登場人物は、物語を動かす重要な役割を果たします。物語の展開は、塔の建設を通じて、愛、友情、そして夢の物語を伝えます。物語の結びは、エッフェル塔の完成を通じて、愛、友情、そして夢の物語を伝えます。


流石に内容が淡白すぎるでしょうか...
もう少し詳細な場面設定を投げる必要はありそうです。Prompt Engineはコスト・トークン消費を意識してプロンプトを改善してくれますが、内容までは直してくれないかと思いますので。

最後に

Prompt Engineを試してみました。サービス化しているもの、OSSも入り混じってLLMが乱立し、AIエージェントがトレンドになりつつある現在では、モデル選定は頭を悩ませるポイントかと思います。AIがAIを選ぶような仕組みが出来ていくと面白そうだなあと感じました。

Discussion