Go言語でLLMアプリ開発、オープンソースフレームワーク「Genkit」の導入と動作検証のプロセスが公開
要点
- ABEJAのエンジニアが、AIアプリ開発フレームワーク「Genkit」のGo SDKを使用した入門手順を公開した。
- GoおよびNode.jsによる検証環境の構築と、最小コードで開発者ツールを立ち上げる手順が解説されている。
- プログラム終了時のプロセス残留を防ぐシグナル処理の実装など、実用上の注意点が示された。
- Azure OpenAIプラグインを用い、モデル定義やプロンプト設定、入力スキーマの連携を行う手法が紹介されている。
- Genkitの設計により、プラグインの差し替えだけで異なるLLMへの変更や別モデルへのフォールバックが可能という。
リード文
AI(人工知能)搭載アプリケーション向けのオープンソースフレームワーク「Genkit」のGo SDKを活用し、LLM(大規模言語モデル)の呼び出しや検証環境を構築するための手順が、株式会社ABEJAの平原氏によって公開された。同氏が担当する店舗解析サービス「ABEJA Insight for Retail」の開発・保守業務を踏まえ、応答待ち時間が長くなりやすいLLMの処理を、並列処理に強みを持つGo言語で実装するためのキャッチアップ内容をまとめている。
開発環境の構築とプロジェクトの初期化
平原氏が紹介する検証は、macOS上で動作するバージョン管理ツール「mise(バージョン2026.7.11)」を利用して開始された。Goと言語環境であるNode.jsが動作すれば、WindowsやLinuxなどの異なるOSでも同様に動作するとしている。
具体的な環境構築の手順として、まず「go@1.26.5」および「node@24.18.0」をインストールし、Goプロジェクトの初期化(go mod init test-genkit)を行っている。続いて、GenkitのGo SDKパッケージである「github.com/firebase/genkit/go」のバージョン1.10.0をインストールし、開発時に使用するCLIツール「genkit-cli」のバージョン1.37.0を導入した。
最小構成による「Hello, Genkit」と開発者ツールの起動
最初の動作検証として、LLMを実際に呼び出す前に、Genkitが提供する「開発者ツール(Developer tools)」を起動するための最小限のプログラム(main.go)の実装方法が解説されている。平原氏は、開発者ツールを正常に起動し、外部からの実行要求を受け付ける状態を維持するために、以下の3つの処理が必要であると述べている。
- Genkit構造体の初期化:
genkit.Initを呼び出し、アプリケーションのベースとなる構造体を初期化する。 - Flowの定義:
genkit.DefineStreamingFlowなどを使い、LLMのワークフローや前後の処理をまとめる関数ラッパーである「Flow」を定義する。このFlowが開発者ツールやAPIから呼び出される実行単位となる。 - プロセスの終了待機: Ctrl+Cによる強制終了(SIGINT)などを検知するまでプログラムを起動させ続ける仕組み(
waitForSignal)を実装する。
特に、プロセスの終了待機については、終了処理を行わずに開発者ツールを閉じるとGoのプロセスがバックグラウンドに残ってしまう課題があるため、OSのシグナル(SIGINT、SIGTERM)をチャネルで監視し、安全に終了させる設計を取り入れることを推奨している。開発者ツールからプログラムが呼び出される際には環境変数 GENKIT_ENV=dev が設定されるため、この変数を検知した場合のみ終了待機プロセスを動かすように制御している。
プログラムの実装完了後、genkit start -- go run main.go コマンドを実行することで、ローカル環境のポート4000(localhost:4000)でGenkitの開発者ツールが起動する。ブラウザからアクセスすると、定義した「echo」フローの動作テストが可能になり、インプットにJSONを入力して実行した結果や、入出力の過程で実行された処理のトレース(実行履歴)を確認できるようになるという。
Azure OpenAIプラグインを使用したLLM of Call
続いて、開発者ツールから実際にLLM(Azure OpenAI)を呼び出してテキストを生成する手法が説明されている。
GenkitでAzure OpenAIを動作させるため、平原氏は「github.com/xavidop/genkit-azure-foundry-go」プラグインをプロジェクトに追加した。環境変数としてエンドポイントを示す AZURE_OPENAI_ENDPOINT と、APIキーを示す AZURE_OPENAI_API_KEY を用意した上で、プラグインの初期化とGenkitへの登録を行う。
Genkitの大きな特徴として、プラグイン設計による高い柔軟性が挙げられている。Go SDKのパッケージにはAnthropicや互換性のあるOpenAI(compat_oai)などのプラグインが存在し、AWS Bedrock用のプラグイン実装も公開されている。モデルを変更する際は、プラグインの記述を差し替えるだけで済み、複数のプラグインを組み合わせて他のモデルへフォールバックさせる構成も可能であると説明している。
具体的なプログラムコードでは、init 関数内でAzure AI Foundryのプラグインを genkit.WithPlugins オプションを通じてGenkitに登録し、azurePlugin.DefineModel メソッドを使用してデプロイメント名(モデル名そのものではなく「gpt-5.4-mini」などの指定)とチャットタイプ(ModelTypeChat)を定義する。
メインの処理(Flow)の中では、入力データを受け取るための構造体(chatInput)を定義し、構造体のメンバーである Prompt にJSONタグ(`json:"prompt"`)を付与している。このように定義することで、開発者ツールの入力画面におけるスキーマや、APIのハンドラとしてFlowを公開する際のリクエストJSONスキーマに自動的に反映される仕組みとなっている。
LLMへの指示とテキスト生成には genkit.Generate 関数が使われる。この関数に対して、定義したモデル(models.gpt54Mini)や、最初のメッセージとして送信されるシステムプロンプト(ai.WithSystem)、ユーザーからの入力を渡すプロンプト(ai.WithPrompt)などをオプションとして指定して呼び出しを行う。