雨立(Ametatsu) - Tech Blog

技術に関して様々なものを試して共有!

プロンプト管理を劇的に効率化する方法【Prompty】

はじめに

LLMでの実験を多く行っていると、プロンプトの管理に悩まされることが多かったです。テキストファイルで管理しようとすると、ファイルの呼び出しや複数メッセージでのパーサーを独自実装する必要があったり、コードで管理すると、コード全体が増えて見づらくなることがありました。

また、LangChainを本番で実装しようとすると、ライブラリ自体が大きく、古さがあるため取り扱いづらさもありました。個人の場合はGroqを利用しているため、独自実装した方が早いのでは…と考えることもありました。

そんな中、最近話題になっているPromptyを試してみたところ、バージョン管理を含めて管理が楽そうだと感じました。そのため、この記事では個人の備忘録として記録しておくことにしました。

結論

Promptyのprepareを利用して、メッセージを抽出すると、独自実装でも便利に使用できました。

prompty.prepare(prompt, inputs)

実装方法

あくまで動かせればOKとして、出力が變動しないよう、top_ptemplatureは0にして渡すようにしました。

---
name: デモプロンプト
description: とりあえず確かめてみるためのプロンプト設定
authors:
  - ametatsu
model:
  api: chat
  parameters:
    top_p: 0
    templature: 0
sample:
  userName: 田中太郎
  question: 明日のお昼ご飯を考えてください。
---
system:こちらはデモで作成しているプロンプトです。ユーザーの姓名は {{userName}} になります。ユーザーの質問に、チョコレートのように可愛く答えてください。

user:
{{question}}

assistant:
私がお答えします!!

また、userNamequestionなど、外部から挿入可能な状態を作り、実際に試してみました。

プロンプトの設定ファイルをexample.promptyとして、下記のように実装しました。

import os
import prompty
from rich import print
from prompty import Prompty
from typing import Any, Dict

from groq import Groq
from groq.types.chat import ChatCompletion

class GroqLLM:
    def __init__(self, model_name: str):
        self.model_name = model_name
        super().__init__()

    def _client(self):
        return Groq(
            api_key=os.environ.get("GROQ_API_KEY"),
        )
    
    def chat(self, prompt: Prompty, inputs: Dict[str, Any]={}) -> ChatCompletion:
        messages = prompty.prepare(prompt, inputs)
        response = self._client().chat.completions.create(
            model=self.model_name,
            messages=messages,
            top_p=prompt.model.parameters.get('top_p'),
            temperature=prompt.model.parameters.get('temperature')
        )
        return response

llm = GroqLLM('mixtral-8x7b-32768')
prompt = prompty.load("./example.prompty")
inputs = {'userName': '雨立', 'question': '美味しいスイーツを考えてください。'}
response = llm.chat(prompt, inputs)

print(prompt)
print('=' * 80)
print(prompty.prepare(prompt, inputs))
print('=' * 80)
print(response)

この実装を動かした際の出力例は、以下のようになります。

まとめ

これは欲しかった機能でした。 やはり、コード外にプロンプトがあると、メインストリームの処理が見やすくなり、ロジックに集中できる為大変便利でした。

VSCodeプラグインを利用すると、カラー付けやバリデーション機能を使えるため、ミスが減るのではないかと思います。

今後も、この機能を試しながら、様々な開発で利用していきたいと思います。

References

Prompty