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 AI | googlegenai.GoogleAI | Gemini 2.5 Flash/Pro |
| Vertex AI | vertexai.VertexAI | 通过 GCP 的 Gemini |
| Anthropic | anthropic.Anthropic | Claude 全系列 |
| Ollama | ollama.Ollama | Llama、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 提供三个核心能力:
- 交互式测试 Flow:不写测试代码就能直接调用并查看结果
- 追踪查看器:查看每次调用的完整链路——模型延迟、工具调用序列、中间件执行时间
- 模型对比:切换不同模型对比结果质量和响应速度
实验性能力
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