ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Prompty を使って生成 AI アプリケーション開発のプロンプトを管理する

Build 2024 のいくつかのセッションで取り上げていた Prompty が良さそうです。先日の Azure Travelers 勉強会 の LT でも紹介しましたが、ブログにもまとめておきます。
gooner.hateblo.jp

Prompty とは

Prompty は、プロンプトを管理するためのフォーマットです。

---
name: ExamplePrompt
description: A prompt that uses context to ground an incoming question
authors:
  - Seth Juarez
model:
  api: chat
  configuration:
    type: azure_openai
    azure_endpoint: https://<your-endpoint>.openai.azure.com
    azure_deployment: <your-deployment>
  parameters:
    max_tokens: 3000
sample:
  firstName: Seth
  context: >
    The Alpine Explorer Tent boasts a detachable divider for privacy, 
    numerous mesh windows and adjustable vents for ventilation, and 
    a waterproof design. It even has a built-in gear loft for storing 
    your outdoor essentials. In short, it's a blend of privacy, comfort, 
    and convenience, making it your second home in the heart of nature!
  question: What can you tell me about your tents?
---

system:
You are an AI assistant who helps people find information. As the assistant, 
you answer questions briefly, succinctly, and in a personable manner using 
markdown and even add some personal flair with appropriate emojis.

# Customer
You are helping {{firstName}} to find answers to their questions.
Use their name to address them in your responses.

# Context
Use the following context to provide a more personalized response to {{firstName}}:
{{context}}

user:
{{question}}

{{ }} で囲まれた firstName、context、question は変数になっており、アプリケーションへ組み込む際には値を引き渡すことができます。

Azure AI Studio などのプレイグラウンドでプロンプトを試行錯誤するなら、VS Code 拡張機能をインストールしてローカルで Prompty を使ったほうが便利です。
marketplace.visualstudio.com

VS Code から .prompty 拡張子のファイルを実行できるようになります。

接続先の LLM 資格情報は、settingsjson に定義します。Microsoft Entra ID で認証することもできます。

{
    "prompty.modelConfigurations": [
        {
            "name": "default",
            "type": "azure_openai",
            "api_version": "2023-12-01-preview",
            "azure_endpoint": "https://xxx.openai.azure.com/",
            "azure_deployment": "gpt-35-turbo-16k",
            "api_key": "xxx",
        },
        {
            "name": "gpt-3.5-turbo",
            "type": "openai",
            "api_key": "",
            "organization": ""
        }
    ],
}

アプリケーションへの組み込み

Prompty は、Prompt flow、Langchain、Semantic Kernel とも統合されているので、ソースコードに文字列でプロンプトをハードコーディングする必要がなくなります。

assistant.prompty というファイルを作成し、プロンプトを定義しておきます。

---
name: AssistantPrompt
description: AI assistant のサンプルプロンプトです。
model:
  api: chat
  configuration:
    type: azure_openai
    azure_deployment: gpt-4o
  parameters:
    max_tokens: 3000
    temperature: 0.7
sample:
  question: Microsoft Azure とは?
---

system:
You are an AI assistant that helps people find information.

user:
{{question}}

Semantic Kernel の場合、下記のようなコードで assistant.prompty からプロンプトを読み込んで実行できます。

#pragma warning disable SKEXP0040
using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using prompty_console_app;

var settings = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build()
    .GetSection(nameof(AzureOpenAISettings)).Get<AzureOpenAISettings>() ?? throw new NullReferenceException();

var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(settings.DeploymentName, settings.Endpoint, settings.ApiKey);
var kernel = builder.Build();

var prompty = kernel.CreateFunctionFromPromptyFile("assistant.prompty");

while (true)
{
    Console.Write("You: ");
    var text = Console.ReadLine();
    if (string.IsNullOrWhiteSpace(text))
    {
        break;
    }

    Console.WriteLine("Assistant:");
    await foreach (var result in kernel.InvokeStreamingAsync<string>(prompty, new() { ["question"] = text }))
    {
        Console.Write(result);
    }
    Console.WriteLine("");
}

このコードを実行すると、AOAI を使った簡単なチャットができます。

また、評価用プロンプトを Prompty にしておいて、使いまわしても良さそうです。
learn.microsoft.com

まとめ

Prompty を使うと、生成 AI アプリケーション開発のプロンプト管理が捗りそうです。
Langchain などのオーケストレーターだけでなく、AOAI の標準ライブラリでも対応してほしいですね。
まだ発表されたばかりのプロダクトなので、今後のアップデートに期待したいです。

今回のサンプルアプリは、こちらで公開しています。
github.com