编程 Genkit Go:Google官方AI SDK让Go成为AI应用开发优选语言

2026-05-16 11:22:09 +0800 CST views 5

Genkit Go:Google 官方 AI SDK 让 Go 成为 AI 应用开发优选语言

标签: 开源项目 / AI SDK / Go语言 / Google
原文: 微信公众号「源自开发者」https://mp.weixin.qq.com/s/g7akRaHr3pKaTpChWVGj5Q


核心亮点

Go 在 AI 基础设施层已经站稳脚跟——Docker、Kubernetes、LangChain、Milvus、Chromadb 的核心都用 Go 构建。但在应用层,Go 开发者一直缺少一个官方的、一体化的 AI 开发工具包。Google 推出的 Genkit Go 填补了这个空白。


为什么是 Genkit Go?

TypeScript 有 LangChain、Python 有 LlamaIndex、Java 有 Spring AI——Go 呢?

2025 年,Google 推出了 Genkit,一个面向 AI 应用开发的全栈框架。Genkit Go 是这个框架的 Go 语言 SDK,目标是把 Go 在并发、类型安全和部署效率上的优势,带入 AI 应用开发的领域。

不是实验性库:已迭代到 v1.8.0,支持 Gemini、Claude、Ollama 等多种模型提供商,持续保持每周到双周的发布节奏。


一分钟上手

安装一条命令:

go get github.com/firebase/genkit/go

然后就可以调用模型了:

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()
    g := genkit.Init(ctx, genkit.WithPlugins(&googlegenai.GoogleAI{}))

    answer, err := genkit.GenerateText(ctx, g,
        ai.WithModelName("googleai/gemini-flash-latest"),
        ai.WithPrompt("Go 在 AI 应用开发中有哪些优势?"),
    )
    if err != nil {
        fmt.Println("生成失败:", err)
    }
    fmt.Println(answer)
}

设置环境变量后即可运行:

export GEMINI_API_KEY="your-api-key"
go run main.go

API 风格对 Go 开发者很亲切:函数选项模式配置参数,明确的错误返回,类型安全。


类型安全的结构化输出

调用 LLM 后拿回结构化数据是 AI 应用中最常见的需求之一。传统做法是让模型返回 JSON,然后手动解析、验证、处理错误。Genkit Go 通过泛型直接解决了这个问题:

type Recipe struct {
    Title       string   `json:"title"`
    Ingredients []string `json:"ingredients"`
    Steps       []string `json:"steps"`
}

recipe, err := genkit.GenerateData[Recipe](ctx, g,
    ai.WithModelName("googleai/gemini-flash-latest"),
    ai.WithPrompt("给一个番茄鸡蛋面的做法"),
)

GenerateData 内部会告诉模型需要输出 JSON 格式,自动解析响应并映射到目标类型。如果解析失败,会返回明确的错误信息。


Tool Calling 也是类型化的

一个简单的天气预报工具:

genkit.DefineTool(g, "getWeather", "获取指定城市的天气",
    func(ctx context.Context, city string) (string, error) {
        return callWeatherAPI(city)
    },
)

工具函数的参数类型、返回值类型都由 Go 编译器检查。模型需要调用工具时,Genkit 自动序列化参数、调用函数、把结果传回模型。


Flows:可观测的执行单元

Genkit 定义了一个核心抽象叫 Flow——一个可观测、可调试、可暴露为 HTTP 端点的 AI 工作流:

jokeFlow := genkit.DefineFlow(g, "jokeFlow",
    func(ctx context.Context, subject string) (string, error) {
        return genkit.GenerateText(ctx, g,
            ai.WithModelName("googleai/gemini-flash-latest"),
            ai.WithPrompt(fmt.Sprintf("讲一个关于 %s 的笑话", subject)),
        )
    },
)

HTTP 暴露

mux := http.NewServeMux()
mux.HandleFunc("POST /joke", genkit.Handler(jokeFlow))
http.ListenAndServe(":8080", mux)

当通过 HTTP 访问时,每个 Flow 执行都会自动生成追踪链路,包含输入、输出、延迟、模型调用细节等全部信息。

流式输出

Flow 还支持流式输出,对聊天类 AI 应用至关重要:

jokeFlow := genkit.DefineStreamingFlow(g, "jokeFlow",
    func(ctx context.Context, subject string, stream func(context.Context, string) error) (string, error) {
        return genkit.GenerateText(ctx, g,
            ai.WithModelName("googleai/gemini-flash-latest"),
            ai.WithPrompt(fmt.Sprintf("讲一个关于 %s 的笑话", subject)),
            ai.WithStreaming(stream),
        )
    },
)

中间件系统

v1.7 引入了中间件支持,构建生产级 AI 应用的关键机制:

中间件功能
Retry模型调用失败时自动重试
Fallback主模型不可用时切换到备用模型
Filesystem为模型提供受限的文件系统访问
Skills按需加载领域知识

组合方式和 Go 标准库的 HTTP 中间件类似:

genkit.DefineFlow(g, "robustFlow", genkit.WithMiddleware(
    middleware.Retry(3),
    middleware.Fallback("ollama/llama3"),
), func(ctx context.Context, input string) (string, error) {
    return genkit.GenerateText(ctx, g,
        ai.WithModelName("googleai/gemini-flash-latest"),
        ai.WithPrompt(input),
    )
})

模型提供商生态

统一接口对接不同模型提供商,不需要为每个厂商学习不同的 SDK:

提供商插件模型
Google AIgooglegenai.GoogleAIGemini 2.5 Flash/Pro
Vertex AIvertexai.VertexAI通过 GCP 的 Gemini
Anthropicanthropic.AnthropicClaude 全系列
Ollamaollama.OllamaLlama、Mistral 等本地模型
OpenAI 兼容compat_oai任意 OpenAI 兼容接口

多个提供商可以同时注册,在调用时通过模型名称选择:

g := genkit.Init(ctx, genkit.WithPlugins(
    &googlegenai.GoogleAI{},
    &anthropic.Anthropic{},
    &ollama.Ollama{ServerAddress: "http://localhost:11434"},
))

// 按需切换模型
genkit.GenerateText(ctx, g, ai.WithModelName("anthropic/claude-sonnet-latest"), ...)
genkit.GenerateText(ctx, g, ai.WithModelName("ollama/llama3"), ...)

开发工具链

Genkit 提供了配套的 CLI 工具和本地开发 UI:

curl -sL cli.genkit.dev | bash
genkit start -- go run main.go

本地开发 UI 提供三个核心能力:

  1. 交互式测试 Flow:不写测试代码就能直接调用并查看结果
  2. 追踪查看器:查看每次调用的完整链路——模型延迟、工具调用序列、中间件执行时间
  3. 模型对比:切换不同模型对比结果质量和响应速度

实验性能力

Durable Streaming

允许客户端断开后重新连接到一个正在进行的流式响应。客户端收到一个 X-Genkit-Stream-Id 头,可以用这个 ID 重连。对移动端或弱网环境下的 AI 应用很有意义。

Session 管理

在多次请求之间维护类型安全的状态,包括工具调用产生的状态变更:

store := session.NewInMemoryStore[CartState]()
sess, _ := session.New(ctx,
    session.WithID[CartState]("session-id"),
    session.WithStore(store),
    session.WithInitialState(CartState{}),
)
ctx = session.NewContext(ctx, sess)

构建多轮对话或长时间运行的 AI Agent 时,状态管理不再需要自己从头实现。


Genkit Go 的定位

把 Genkit Go 放到 Go 的 AI 生态坐标系里来看:

层次方案特点
底层直接调用 API灵活但缺乏抽象
中间层MCP SDK解决工具定义和通信协议,但不是应用框架
高层ADK Go聚焦 Agent 开发,抽象层次较高
中间层Genkit Go统一模型接口、类型安全输出、可观测执行单元

Genkit Go 在中间层提供了:统一的模型接口、类型安全的输出、可观测的执行单元,同时保留直接访问底层 API 的能力。


写在最后

Genkit Go 还很年轻,但它的设计方向是正确的:把 Go 的类型安全和编译期检查带到 AI 应用开发中,而不是在 Go 里重新发明一套 Python 式的动态编程体验。

对于偏好静态类型的开发者而言,这可能是现阶段最适合 Go 的 AI 开发方式。

安装go get github.com/firebase/genkit/go


本文整理自微信公众号「源自开发者」,原文链接:https://mp.weixin.qq.com/s/g7akRaHr3pKaTpChWVGj5Q

复制全文 生成海报 开源项目 AI SDK Go语言 Google

推荐文章

php curl并发代码
2024-11-18 01:45:03 +0800 CST
解决 PHP 中的 HTTP 请求超时问题
2024-11-19 09:10:35 +0800 CST
实现微信回调多域名的方法
2024-11-18 09:45:18 +0800 CST
Vue3中的Store模式有哪些改进?
2024-11-18 11:47:53 +0800 CST
404错误页面的HTML代码
2024-11-19 06:55:51 +0800 CST
html流光登陆页面
2024-11-18 15:36:18 +0800 CST
Vue3中的v-for指令有什么新特性?
2024-11-18 12:34:09 +0800 CST
JavaScript中设置器和获取器
2024-11-17 19:54:27 +0800 CST
支付宝批量转账
2024-11-18 20:26:17 +0800 CST
Rust 并发执行异步操作
2024-11-19 08:16:42 +0800 CST
程序员茄子在线接单