📕

Promptyに入門したい

2025/01/06に公開

はじめに

この記事は、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つの要素から構成されています

  • 仕様
  • ツール
  • およびランタイム

https://prompty.ai/

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となります。

basic.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エージェントにアクセスします。

main.py
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で細かいところを見ていくと実はたくさんのプロパティがありますが、ここではapiparametersのみを見ていきます。

api

apiはPromptyが使うAPIを指定します。今回はchatを指定していますが、completionも指定できます。

他に指定できるものとしてはAzureのexecutor.pyを見ると以下のようなものがあることが確認できます。

  • chat
  • completion
  • embedding
  • image

https://github.com/microsoft/prompty/blob/951f44a5d7857b344c585640a9e3197f5f1476fd/runtime/prompty/prompty/azure/executor.py#L83-L139

具体例としては以下のように指定します。

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-previewgpt-3.5-turbo-1106と互換性がある{type": 「json_object" } に設定すると、JSONモードが有効になります。
これはモデルが生成するメッセージが有効な JSON であることを保証します。

max_tokens

モデルが生成するトークンの最大数を指定します。これは、モデルが生成するメッセージの長さを制御するために使用されます。

temperature

モデルが生成するメッセージの多様性を制御するためのパラメータです。値が高いほど、モデルが生成するメッセージが多様になります。

tools_choice

モデルによって呼び出される(もしあれば)関数を制御する。どのように使うかは調査が必要かも。
デフォルトではautoが指定されています。

tools

AIが使うツールの指定。使い方はGitHubのリポジトリを見ると以下のようになっています。

https://github.com/microsoft/prompty/blob/951f44a5d7857b344c585640a9e3197f5f1476fd/runtime/prompty/tests/prompts/funcfile.prompty#L10-L11

${file:funcfile.json}は以下のとおりです。

https://github.com/microsoft/prompty/blob/951f44a5d7857b344c585640a9e3197f5f1476fd/runtime/prompty/tests/prompts/funcfile.json#L1-L28

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エージェントを実際に作成しながら今回確認できなかった細かい仕様についても確認していきたいと思います。

参考

関連記事

Discussion