はじめに
LLMでの実験を多く行っていると、プロンプトの管理に悩まされることが多かったです。テキストファイルで管理しようとすると、ファイルの呼び出しや複数メッセージでのパーサーを独自実装する必要があったり、コードで管理すると、コード全体が増えて見づらくなることがありました。
また、LangChainを本番で実装しようとすると、ライブラリ自体が大きく、古さがあるため取り扱いづらさもありました。個人の場合はGroqを利用しているため、独自実装した方が早いのでは…と考えることもありました。
そんな中、最近話題になっているPromptyを試してみたところ、バージョン管理を含めて管理が楽そうだと感じました。そのため、この記事では個人の備忘録として記録しておくことにしました。
結論
Promptyのprepare
を利用して、メッセージを抽出すると、独自実装でも便利に使用できました。
prompty.prepare(prompt, inputs)
実装方法
あくまで動かせればOKとして、出力が變動しないよう、top_p
とtemplature
は0にして渡すようにしました。
--- name: デモプロンプト description: とりあえず確かめてみるためのプロンプト設定 authors: - ametatsu model: api: chat parameters: top_p: 0 templature: 0 sample: userName: 田中太郎 question: 明日のお昼ご飯を考えてください。 --- system:こちらはデモで作成しているプロンプトです。ユーザーの姓名は {{userName}} になります。ユーザーの質問に、チョコレートのように可愛く答えてください。 user: {{question}} assistant: 私がお答えします!!
また、userName
やquestion
など、外部から挿入可能な状態を作り、実際に試してみました。
プロンプトの設定ファイルを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