Promptyに入門したい
はじめに
この記事は、Promptyに入門したい人向けの記事です。Promptyについての理解を深めるため
さまざまな資料やリポジトリを参照しながら、Promptyの仕組みを確認します。
誤りなどがありましたら、逐一修正する予定です。
対象読者
- Promptyに興味がある人
(問題提起)AIチャット作る時もろもろの設定どうしてる
Promptyを深く知るためにまずはAIによるチャットシステム、とりわけAIエージェントについて改めて振り返ってみましょう。
AIチャットシステムを作る時に必要なこと
まず、AIチャットシステムの基本としてはAIエージェントをどのように作成するかが重要です。AIエージェントはユーザーからの入力を受け取り、適切な応答を返すためのプログラムです。このエージェントがチャットシステムの裏側にいることで、ユーザとの対話を実現します。
ユーザからの質問はさまざまな場合があります。たとえば
- 社内の情報について質問する(RAGの実装)
- 今日の天気を聞く(ツールの実装)
などです。これらの質問に対して、AIエージェントは適切な応答を返す必要がありますが
そのためにはエージェントが質問に対する情報を持っておくあるいはAIが適切なタイミングでツールを実行できるようになっておく必要があります。
また、AIエージェントは不適切な回答や倫理に欠ける情報を返さないようにする必要があります。さらに、エージェントがどれくらいの精度で応答を返すかも重要です。
これらの要件を満たすために従来の方法では、AIエージェントの設定と定義は単一のプログラムで開発する必要があります。
あるいは独自に設定ファイルを作成して読み込ませることも手段としてあると思います。
これらは実際にAIエージェントを開発したことがある人であれば、なんとなく理解できるかもしれません。
※AIエージェントの設定を変更するたびにプログラムを変更する必要があることを理解しているでしょう。
そこでPromptyを使うことによってAIエージェントの設定を分離することができます。これによりAIエージェントの振る舞いを変更する際、プログラムの変更を行わずに設定ファイルを変更するだけで済むようになります。
Promptyとは
簡単に説明するとAIエージェントの設定をコンフィグとして管理できるOSSです。
公式サイトでは以下のように説明されています。
Prompty は、開発者に可視性、理解可能性、移植性を提供することを目的とした LLM プロンプトのアセット クラスおよび形式です。主な目的は、開発者の内部ループを高速化することです。
Promptyは3つの要素から構成されています
- 仕様
- ツール
- およびランタイム
Promptyを使うことによってAIの振る舞いを変更する際に設定ファイルを修正するだけで済むようになり、エージェントの設定に再利用性を持たせることができます。
使い方
Promptyのコンセプトとしては利用するプログラミング言語に依存しないことが挙げられます。
主な手順としては以下の通りです。
- Promptyのインストール
- 設定ファイルの作成
- Promptyを使ってAIにアクセス(Invoke)
具体的には以下のような手順で進めることができます。
1. Promptyのインストール
まずはPromptyをインストールします。
今回はLangChainを使ってAIエージェントを作成するため、LangChainにバインドされているPromptyをインストールします。
pip install -U langchain langchain-prompty google-cloud-aiplatform langchain_google_vertexai
2. 設定ファイルの作成
次に設定ファイルを作成します。設定ファイルはYAML形式で記述し、拡張子は.prompty
となります。
---
name: ExamplePrompt
description: A prompt that uses context to ground an incoming question
authors:
- Kento.Yamada
model:
api: chat
parameters:
max_tokens: 3000
sample:
firstName: Kento
---
system:
あなたは LangChain の質問に答える AI アシスタントです。
user:
{{question}}
3. Promptyを使ってAIにアクセス(Invoke)
最後にPromptyを使ってAIエージェントにアクセスします。
import os
from langchain_google_vertexai import VertexAI
from langchain_prompty import create_chat_prompt
PROJECT_ID = os.environ.get("PROJECT_ID", "")
LOCATION = os.environ.get("LOCATION", "asia-northeast1")
USE_CHAT_MODEL_NAME = os.environ.get(
"USE_CHAT_MODEL_NAME",
"gemini-1.5-flash-001"
)
if __name__ == "__main__":
cwd = os.getcwd()
try:
prompt = create_chat_prompt(f'{cwd}/basic.prompty')
prompt_text = prompt.invoke(
{
'question': "LangChainとはなんですか?"
}
)
chat = VertexAI(model_name=USE_CHAT_MODEL_NAME, temperature=0)
answer = chat.invoke(prompt_text)
print(answer)
except Exception as e:
print(str(e))
以下のコマンドを実行することでAIエージェントにアクセスできます。
python main.py
では実行した.prompty
ファイルの内容を読み解いてみましょう。
ここからはyamlの解説をプロパティ毎に行います。
name
name
はPromptyの名前を指定します。もし使うのであれば、エージェント名を入力しておくと良さそうです。
description
description
はPromptyの説明を指定します。今回はA prompt that uses context to ground an incoming question
が説明になります。
authors
authors
はPromptyファイルの作者を指定します。
model
次にmodel
プロパティを見ていきます。prompty-specificationで細かいところを見ていくと実はたくさんのプロパティがありますが、ここではapi
とparameters
のみを見ていきます。
api
api
はPromptyが使うAPIを指定します。今回はchat
を指定していますが、completion
も指定できます。
他に指定できるものとしてはAzureのexecutor.pyを見ると以下のようなものがあることが確認できます。
chat
completion
embedding
image
具体例としては以下のように指定します。
model: # モデルの設定
api: completion
parameters
parameters
はAPIに渡すパラメータを指定します。今回はmax_tokens
を指定していますが、他にも指定できるものがあります。
model: # モデルの設定
parameters:
response_format: json # レスポンスのフォーマット
max_tokens: 3000 # 最大トークン数
temperature: 0.0 # 温度
tools_choice: # どのように使うかは調査が必要かも。
tools: # AIが使うツールの指定
frequency_penalty:
presence_penalty:
stop:
items:
- "。"
- "!"
- "?"
- "..."
top_p: 1.0 # トークンの確率
sample: # サンプル
firstName: Kento
messages:
- role: user
content: where is the nearest coffee shop?
- role: system
content: I'm sorry, I don't know that. Would you like me to look it up for you?
response_format
モデルが出力しなければならないフォーマットを指定するオブジェクト。
gpt-4-1106-preview
と gpt-3.5-turbo-1106
と互換性がある{type": 「json_object" }
に設定すると、JSONモードが有効になります。
これはモデルが生成するメッセージが有効な JSON であることを保証します。
max_tokens
モデルが生成するトークンの最大数を指定します。これは、モデルが生成するメッセージの長さを制御するために使用されます。
temperature
モデルが生成するメッセージの多様性を制御するためのパラメータです。値が高いほど、モデルが生成するメッセージが多様になります。
tools_choice
モデルによって呼び出される(もしあれば)関数を制御する。どのように使うかは調査が必要かも。
デフォルトではautoが指定されています。
tools
AIが使うツールの指定。使い方はGitHubのリポジトリを見ると以下のようになっています。
${file:funcfile.json}
は以下のとおりです。
frequency_penalty
過去に同じトークンが現れた回数が増えれば増えるほど、大きなペナルティを課す。
-2.0から2.0まで。数値が高いと同じことを繰り返しにくくなります。
presence_penalty
過去に同じトークンが現れたか否かによって、一定のペナルティを課す。
-2.0から2.0まで。数値が高いと新しい話題に触れやすくなります。
stop
トークンの生成を止めるためのシーケンスを指定します。
APIがさらなるトークンの生成を停止する最大4つのシーケンス。
Up to 4 sequences where the API will stop generating further tokens.
top_p
上位_p個の確率質量を持つトークンの結果を考慮する。
An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.
We generally recommend altering this or temperature but not both.
sample
インラインでデータを提供するためのプロパティです。サンプルデータを提供することで、AIエージェントがどのように振る舞うかを確認することができます。
具体的な仕様ではrole毎にメッセージを指定できるようになっています。
まとめ
PromptyはAIエージェントの設定をコンフィグとして管理できるOSSです。
公式サイトではPromptyの仕様について詳しく説明されていますが、まだtodo
となっている部分があり、細かい仕様についてはよくわからない部分が多いです。
今回はGitHubのリポジトリや公式ドキュメントを参照しながら、Promptyの仕組みを確認しました。
次回はAIエージェントを実際に作成しながら今回確認できなかった細かい仕様についても確認していきたいと思います。
参考
- Prompty
- prompty-specification
- microsoft/prompty: Prompty makes it easy to create, manage, debug, and evaluate LLM prompts for your AI applications. Prompty is an asset class and format for LLM prompts designed to enhance observability, understandability, and portability for developers.
- createTranslation
Discussion