3 min read

Genkit Go 1.0 — Google の AI フレームワークが本番対応

googlegenkitgoai-frameworkrag

Genkit とは

Google が開発したオープンソースの AI フレームワーク。2/4 に Go 版 1.0 がリリースされ、本番対応になった。

特徴:

  • マルチモデル対応: Google AI、Vertex AI、OpenAI、Anthropic、Ollama
  • 型安全: Go の struct で入出力を定義
  • 統一 API: RAG、Tool Calling、構造化出力を一貫したインターフェースで

セットアップ

# プロジェクト初期化
go mod init my-ai-app

# Genkit インストール
go get github.com/firebase/genkit/go

# CLI インストール(開発 UI 用)
npm install -g genkit-cli

基本: テキスト生成

package main

import (
    "context"
    "fmt"
    "github.com/firebase/genkit/go/ai"
    "github.com/firebase/genkit/go/genkit"
    "github.com/firebase/genkit/go/plugins/googlegenai"
)

func main() {
    ctx := context.Background()

    // Genkit 初期化
    g := genkit.Init(ctx,
        genkit.WithPlugins(&googlegenai.GoogleAI{}),
        genkit.WithDefaultModel("googleai/gemini-2.5-flash"),
    )

    // 生成
    resp, _ := genkit.Generate(ctx, g,
        ai.WithPrompt("Go の並行処理を3行で説明して"),
    )
    fmt.Println(resp.Text())
}

構造化出力: 型安全なレスポンス

LLM のレスポンスを Go の struct にマッピング。

// 出力スキーマを定義
type Recipe struct {
    Name        string   `json:"name"`
    Ingredients []string `json:"ingredients"`
    Steps       []string `json:"steps"`
}

func main() {
    // 型パラメータで出力型を指定
    recipe, _ := genkit.GenerateData[Recipe](ctx, g,
        ai.WithPrompt("カレーのレシピを教えて"),
    )

    // recipe.Name, recipe.Ingredients などに型安全にアクセス
    fmt.Printf("料理名: %s\n", recipe.Name)
}

Tool Calling: LLM に関数を使わせる

// ツール定義
weatherTool := genkit.DefineTool(g, "getWeather",
    "指定した都市の天気を取得",
    func(ctx context.Context, input struct {
        City string `json:"city"`
    }) (string, error) {
        // 実際の天気 API 呼び出し
        return fetchWeather(input.City), nil
    },
)

// ツール付きで生成
resp, _ := genkit.Generate(ctx, g,
    ai.WithPrompt("東京の天気を教えて"),
    ai.WithTools(weatherTool),
)

Flow: 再利用可能なワークフロー

// Flow 定義
summarizeFlow := genkit.DefineFlow(g, "summarize",
    func(ctx context.Context, url string) (string, error) {
        // URL からコンテンツ取得
        content := fetchContent(url)

        // LLM で要約
        resp, _ := genkit.Generate(ctx, g,
            ai.WithPrompt(fmt.Sprintf("要約して: %s", content)),
        )
        return resp.Text(), nil
    },
)

// Flow 実行
summary, _ := summarizeFlow.Run(ctx, "https://example.com/article")

RAG: 外部知識を組み込む

// Embedder と Retriever を設定
embedder := googlegenai.Embedder(g, "text-embedding-004")
retriever := localvec.DefineRetriever(g, "docs", embedder)

// ドキュメントをインデックス
indexer := localvec.DefineIndexer(g, "docs", embedder)
indexer.Index(ctx, documents)

// RAG で生成
resp, _ := genkit.Generate(ctx, g,
    ai.WithPrompt(query),
    ai.WithRetriever(retriever, query),
)

REST API として公開

mux := http.NewServeMux()
mux.Handle("/summarize", genkit.Handler(summarizeFlow))
http.ListenAndServe(":8080", mux)

開発ツール

# 開発 UI 起動
genkit start

# Flow テスト
genkit flow:run summarize '"https://example.com"'

所感

Go で AI アプリを書くなら第一選択肢。型安全なのが Go らしい。

OpenAI や Anthropic も同じ API で使えるので、モデル切り替えが楽。本番で使う場合の Flow → REST API 変換も便利。