ROMANCE DAWN for the new world

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

Azure Functions の Azure OpenAI Extension を使ってコンテンツを要約する

Azure Functions では、Azure OpenAI 向けの拡張機能(Preview)が提供されています。
learn.microsoft.com

今回は、拡張機能の Text completion input binding を使って、コンテンツを要約してみました。
その他の拡張機能については、別記事を参照してください。
gooner.hateblo.jp
gooner.hateblo.jp
gooner.hateblo.jp

Text completion input binding とは

Text completion input binding を使うことで、Azure OpenAI Service の Text Completions API を呼び出して、結果を取得できます。
learn.microsoft.com

前準備

Azure Functions を Isolated worker model で作成し、NGet ライブラリをインストールします。インストールする前に、Visual Studio などのテンプレートで作成されたプロジェクトのライブラリ群を最新版に更新しておくことをお勧めします。

$ dotnet add package Microsoft.Azure.Functions.Worker.Extensions.OpenAI --version 0.16.0-alpha

local.settings.json において、Azure OpenAI Service の エンドポイントとキーを定義しておきます。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
    "AZURE_OPENAI_ENDPOINT": "https://xxx.openai.azure.com/",
    "AZURE_OPENAI_KEY": "xxx",
    "CHAT_MODEL_DEPLOYMENT_NAME": "gpt-4o"
  }

Function を実装する

TextCompletionInput のバインディングを使うことで HTTP リクエストの prompt という JSON のテキストを AOAI に渡す部分の繋ぎ込みを行ってくれます。AOAI からのレスポンスは、TextCompletionResponse から取得できます。

public class Text
{
    private readonly ILogger<Text> _logger;

    public Text(ILogger<Text> logger)
    {
        _logger = logger;
    }

    [Function(nameof(GenerateText))]
    public IActionResult GenerateText(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "text")] HttpRequest req,
        [TextCompletionInput("{prompt}", Model = "%CHAT_MODEL_DEPLOYMENT_NAME%")] TextCompletionResponse response)
    {
        _logger.LogInformation("Text completion input binding function processed a request.");

        return new OkObjectResult(response.Content);
    }
}

なお、TextCompletionInput のバインディングでは、Temperature や MaxTokens なども指定できます。


動作確認

VS Code 拡張機能の REST Client を使って、2024/25 Premier League の Arsenal の開幕戦の Match Report を要約してみます。

@function_app_HostAddress = http://localhost:7074

### Text completion input binding
POST {{function_app_HostAddress}}/api/text HTTP/1.1
Accept: application/json

{
  "prompt": "
  Kai Havertz got the scoring started when he nodded home a Bukayo Saka cross after 25 minutes, 
  but the visitors would cause us some nervy moments either side of the break with David Raya needing to be at his best to keep us in front.
  However Saka added a goal to his afternoon’s work when he blasted home at the near post to ensure we recorded a seventh-straight win against the Molineux side, 
  and see the superb form from the final few months of last season flow into the new campaign.

  One line TLDR with the fewest words."
}
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Sat, 07 Sep 2024 01:43:00 GMT
Server: Kestrel
Transfer-Encoding: chunked

"Arsenal wins 2-0 against Molineux with goals from Havertz and Saka."

ハバーツとサカのゴールで勝利したことが分かります。


まとめ

Azure Functions 拡張機能の Text completion input binding を使って、コンテンツを要約してみました。
AOAI の SDK を使った定型のコードが不要となり、シンプルな実装で Text Completions API を呼び出すことができて便利だと感じました。

今回のソースコードは、こちらのリポジトリで公開しています。
github.com