🐕

Foundry LocalのローカルLLMは、CLI以外からもOpenAI API互換で手軽に呼び出せてお手軽(C#向けSDKもある)

に公開

概要

Foundry Local は、ローカル LLMを Winodows 上でコマンド数個を打つだけで手軽に使えてキャッシュも共通化できる便利な仕組みです。次の記事でもその辺りに触れています。

https://zenn.dev/suusanex/articles/a1a3dae3da02ca

その記事では、CLIで手軽に使えるという視点で紹介したので、むりやり複数行のプロンプトを渡す工夫をしました。しかしそこまでやるのなら、C#等でプログラムを書いた方が便利です。

Foundry Local のデモ等では CLI ですぐチャットできるという便利さが目立ちますが、それだけではありません。 OpenAI API 互換のエンドポイントを公開するのでC#等のプログラムからも手軽に呼べる、というのも便利なところです。

C#で実装してみたらCLIと同じくらい手軽に使えてとても便利だったので、この記事ではその実装例を紹介します。

※ Foundry Local は記事投稿時点ではまだプレビュー版です

最初に結論まとめ

.NET向けのSDK (Microsoft.AI.Foundry.Local) を使用してモデル選択・ロードを行い、それを Semantic Kernel 経由で呼び出してチャットをする簡単なアプリを GitHub へ置きました。説明はいらないからコードを見たい、という人はこちらを見てください。

https://github.com/suusanex/sample_azure_ai_foundry_local_chat

また、 MS Learn の説明は次のページです。

https://learn.microsoft.com/ja-jp/azure/ai-foundry/foundry-local/get-started?wt.mc_id=MVP_452751

説明

構成の説明

まず、 Foundry Local でCLIチャットを行えるようにすると、実はCLI単独で動いているわけではなく、次の図のような構成で動いている状態になります。

@startuml

component "Foundry Local の Windows サービス" as service
component "OpenAI API互換のエンドポイント" as ep

component "CLI(コマンドプロンプト上のチャット)" as cli

actor "ユーザー" as user

service --> ep : エンドポイントを公開
cli -u-> ep : エンドポイントと通信してチャット
user --> cli : CLIでチャット

@enduml

そのため、CLIは必須ではありません。 Foundry Local のサービスがモデルをロードして動いている状態であれば、クラウドのOpenAI APIを呼び出すのと同じコードで、 Foundry Local のローカルLLMを呼び出すことができます。

Foundry Local を .NET 向け SDK で操作

NuGet で Microsoft.AI.Foundry.Local を入れます。これが .NET 向けの SDK です。

API の使い方は、 CLI のものとほとんど同じです。 CLI の例に触れておくと、 CLI では次のようにコマンドを打ちます。

  • インストール
    • winget install Microsoft.FoundryLocal
  • 使えるモデルをリスト表示
    • foundry model list
  • モデルを指定して実行
    • foundry model run <モデル名>

インストールは別に実行してもらうものとして、モデルのリスト表示や実行はC#でも同じように実行します。

ただし、 CLI では「run」だけでキャッシュのダウンロードからモデルのロードまで全て自動で行いますが、C#では API を使い分ける必要があります。次のようになります。

var manager = new FoundryLocalManager();

//使えるモデルの一覧を取得
var catalogModels = await manager.ListCatalogModelsAsync();

//ここでは例として、1つ目のモデルを使用
var modelInfo = catalogModels.First();

//モデルをダウンロード(すでにキャッシュが有る場合は不要)
await manager.DownloadModelAsync(modelInfo.ModelId);

//モデルをロード
await manager.LoadModelAsync(modelInfo.ModelId);

ここまでの処理を呼び出すと、 Foundry Local のサービスがモデルをロードしてエンドポイントを公開している状態になります。 CLI と同じくらいのシンプルさで使えます。

省略した部分の補足

  1. サービスが停止している場合、最初にサービスを起動する必要があります。 SCM などを使わなくても、FoundryLocalManager.StartServiceAsync()で起動できます。
  2. モデルのキャッシュ有無を判定する処理は、この記事では省略しました。
  3. モデルをロードした時点で Foundry Local のサービスがCPU・GPUなどを使用した処理を始める場合があります。これは Foundry Local 側で自動で要否を判断しているようなので、確実に止めるにはサービスを再起動する必要があります。

Foundry Local のエンドポイントを呼び出し

上の説明で作成した変数「manager」「model」を使用すれば、 OpenAI API 互換のエンドポイントの呼び出しができます。

Semantic Kernel の例で言うと、それらを次のように使用します。


var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
    model.ModelId,
    manager.Endpoint,
    "unused"
);
var kernel = builder.Build();

例では第3引数のAPIキーに"unused"と渡していますが、 Foundry Local のエンドポイントは認証不要なので、ここは何でもOKです。

これで呼び出しができるので、チャットなどの処理を組む上で、エンドポイントが Foundry Local だということを意識する必要はありません。 OpenAI API を呼び出している既存のアプリがあれば、パラメータを変更するだけで Foundry Local の呼び出しへ切り替えることができます。

この先の実装は Foundry Local と関係ないので、この記事では省略します。

コードサンプル

以上の内容を含めた動くコードのサンプルは次のリポジトリにあります。(記事冒頭に書いたものと同じです)

https://github.com/suusanex/sample_azure_ai_foundry_local_chat

このサンプルでは、 WinUI 3 の画面から Foundry Local のモデルをロードし、 Semantic Kernel でチャットを実現しています。

まとめ

Foundry Local をC#のコードから呼び出す場合も、CLIと同じくらい手軽に書けると思います。

ローカルLLMであれば契約も課金もAPIキーの取得なども不要ですぐに使えるので、ここまで手軽にローカルLLMを使えるのであれば、思いついたことをすぐに試してみるなど色々な用途に使えると思います。

クラウドのLLMと上手く使い分けて、便利に使っていきましょう!

Discussion