Genkit - 構建 AI 應用的開放框架
將智能功能集成到應用中可能很複雜。測試模型、構建提示詞以及調試解決方案都是在構建大型語言模型驅動的應用時面臨的真正挑戰。
Google 開發了 Genkit[1] 能夠很好的應對這些挑戰。Genkit 是一個開源框架,內置工具和可觀測性功能。這些功能共同提供了統一的 API,讓您能夠使用來自 Google、OpenAI、Anthropic 以及通過 Ollama 等渠道的開源模型來構建應用。在構建應用的同時,你還將獲得所需的工具,幫助快速迭代解決方案並調試常見問題,以及在部署到 Google Cloud 或 Firebase 後監控生產環境中應用所需的可觀測性功能。
今年早些時候,我們宣佈了 Genkit for Node.js[2] 的穩定版本發佈,今天我們很高興地宣佈 Genkit 的語言支持擴展,推出 Genkit for Python(Alpha 版)和 Go(Beta 版)。
這些新的 SDK 將 Genkit 的強大功能帶到更多的開發者生態系統:
-
**Genkit for Python(Alpha 版)**非常適合實驗和早期開發。隨着我們採納反饋,API 可能會快速演變,但所有基本功能已可用,可以立即開始構建。
-
**Genkit for Go(Beta 版)**擁有豐富的功能集,隨着其接近生產就緒,可靠性也有所提高。
無論使用 Node.js、Python 還是 Go,現在都可以利用 Genkit 一致的工具和概念來構建複雜的 AI 驅動功能,其中包括強大的原語、集成工具和可擴展的插件系統,簡化了 AI 工作流的原型設計、構建和部署。
我們也對爲 Genkit 構建插件的合作伙伴感到興奮,如 Pinecone[3]、Astra DB[4]、Neo4j[5]、AuthO 等。這個不斷增長的插件生態系統顯著擴展了 Genkit 的功能,讓開發者能夠將各種專業工具和服務無縫集成到 AI 驅動的應用中。
注意:這兩個 SDK 的版本仍然 < 1.0.0,隨着我們根據用戶反饋完善 API,可能會在沒有主要版本增量的情況下進行重大更改。
Genkit for Python(Alpha 版)
如果使用 Python 構建,Genkit 提供了直觀簡潔的語法來處理 AI 功能。Python SDK 提供了一個乾淨的異步 API,通過 Pydantic 集成提供強類型支持。
結構化輸出
Python 的數據類功能,通過 Pydantic 增強的模式定義,在這個用於結構化輸出的 Genkit 示例中大放異彩。注意 RpgCharacter 類如何清晰地定義預期格式,確保 structured_character_flow 一致地返回可預測結構的 AI 生成數據。
from pydantic import BaseModel, Field
from genkit.ai import Genkit
from genkit.plugins.google_genai import GoogleAI
ai = Genkit(
plugins=[GoogleAI()],
model='googleai/gemini-2.0-flash',
)
class RpgCharacter(BaseModel):
name: str = Field(description='name of the character')
backstory: str = Field(description='backstory')
abilities: list[str] = Field(description='list of abilities (3-4)')
@ai.flow()
asyncdef structured_character_flow(name: str) -> RpgCharacter:
"""Generates a character profile conforming to the schema."""
result = await ai.generate(
prompt=f'Generate an RPG character named {name}',
output_schema=RpgCharacter,
)
return result.output
代理工具使用
Genkit 還設計了直觀簡潔的語法來定義工具,如此例所示。利用裝飾器和 Pydantic 進行數據建模,創建 convert_currency 等工具並將其集成到異步流程中變得簡單明瞭。
# 爲簡潔起見省略了導入和初始化
class ConversionInput(BaseModel):
amount: float
@ai.tool()
asyncdef convert_currency(input: ConversionInput) -> float:
"""Use this tool to convert USD to EUR"""
print(f"Converting {input.amount} USD...")
return input.amount * 0.92
@ai.flow()
asyncdef currency_conversion_flow(amount: float) -> str:
"""Asks the model to convert currency, potentially using the tool."""
response = await ai.generate(
prompt=f'How much is {amount} USD in EUR?',
tools=[convert_currency],
)
return response.text()
可用的 Python 插件
-
Google GenAI[6]:從 Google AI Studio 或 Google Cloud Vertex AI 訪問 Google 的 Gemini、Imagen、嵌入模型。
-
Ollama[7]:在本地運行 Gemma、Llama 和 Mistral 等開源模型。
-
Flask 集成 [8]:通過 Flask Web 服務器輕鬆提供 Genkit 流程。
-
Firestore[9]:使用 Firestore 向量搜索檢索到的數據來實現生成內容。
Genkit for Go(Beta 版)
如果使用 Go 構建,Genkit 提供了一個強大而明確的 API,具有強類型安全性,適合構建接近生產就緒的可擴展應用。
結構化輸出
這個 Go 代碼片段展示了 Genkit 通過明確定義 RpgCharacter 結構體並使用 ai.WithOutputType 來保證結構化輸出的方法。觀察 characterPrompt 如何配置爲所需的輸出類型,確保 structuredCharacterFlow 可靠地生成符合指定模式的數據。
package main
import (
"context"
"log"
"net/http"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
"github.com/firebase/genkit/go/server"
)
type RpgCharacter struct {
Name string `json:"name"`
Backstory string `json:"backstory"`
Abilities []string`json:"abilities"`
}
func main() {
ctx := context.Background()
g, err := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.GoogleAI{}),
genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
)
if err != nil {
log.Fatalf("Genkit init failed: %v", err)
}
characterPrompt, _ := genkit.DefinePrompt(g, "characterPrompt",
ai.WithPrompt("Generate RPG character named {{name}}..."),
ai.WithInputType(RpgCharacter{Name: "Legolas"}) // 默認爲 "Legolas"。
ai.WithOutputType(RpgCharacter{}),
)
genkit.DefineFlow(g, "structuredCharacterFlow",
func(ctx context.Context, name string) (*RpgCharacter, error) {
resp, err := characterPrompt.Execute(ctx, ai.WithInput(RpgCharacter{Name: name}))
if err != nil {
returnnil, err
}
var character RpgCharacter
if err := resp.Output(&character); err != nil {
returnnil, err
}
return &character, nil
},
)
mux := http.NewServeMux()
for _, flow := range genkit.ListFlows(g) {
mux.HandleFunc("POST /"+flow.Name(), genkit.Handler(flow))
}
log.Fatal(server.Start(ctx, "127.0.0.1:8080", mux))
}
運行 Go 應用並使用以下命令調用流程:
curl -X POST localhost:8080/structuredCharacterFlow \
-H "Content-Type: application/json" \
-d '{"data": "Elara"}'
代理工具使用
Genkit 提供了一種強大而明確的方式來定義和集成自定義工具到 AI 工作流程中,如下所示。此示例清晰地展示了 convertCurrencyTool 的註冊及其在 convertCurrencyFlow 中的使用,強調了 Go 的類型安全性和適合構建可擴展應用的特性。
// 爲簡潔起見省略了導入
func main() {
ctx := context.Background()
g, err := genkit.Init(ctx, genkit.WithPlugins(&googlegenai.GoogleAI{}))
if err != nil {
log.Fatalf("Genkit failed to initialize: %v", err)
}
convertCurrencyTool := genkit.DefineTool(g, "convertCurrencyTool",
"Use this tool to convert USD to EUR",
func(ctx *ai.ToolContext, amount float64) (float64, error) {
log.Printf("Converting %f USD", amount)
return amount * 0.92, nil
},
)
flow := genkit.DefineFlow(g, "convertCurrencyFlow",
func(ctx context.Context, amount float64) (string, error) {
return genkit.GenerateText(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithPrompt("How much is %f USD in EUR?", amount),
ai.WithTools(convertCurrencyTool),
)
},
)
mux := http.NewServeMux()
mux.HandleFunc("POST /convertCurrencyFlow", genkit.Handler(flow))
log.Fatal(server.Start(ctx, "127.0.0.1:8080", mux))
}
運行 Go 應用並調用流程:
curl -X POST localhost:8080/convertCurrencyFlow \
-H "Content-Type: application/json" \
-d '{"data": 190.00}'
可用的 Go 插件
-
Google GenAI:訪問 Gemini 模型和嵌入。
-
Google Cloud Vertex AI:與 Google Cloud 的 AI 平臺集成。
-
Ollama:在本地運行開源模型。
-
Pinecone:連接到 Pinecone 的向量數據庫。
-
pgvector:與 PostgreSQL 向量存儲集成。
-
Google Cloud Telemetry:導出可觀測性數據。
用於快速迭代的開發工具
構建 AI 應用涉及獨特的挑戰。Genkit 提供專用工具——在 Python、Go 和 Node.js 中保持一致——以加速測試和開發。
我們的 CLI 和直觀的基於瀏覽器的開發者 UI 幫助:
-
更快地實驗:在 UI 中的專用遊樂場中交互式地運行和迭代流程、提示和工具
-
高效調試:可視化詳細的執行跟蹤,檢查輸入 / 輸出(包括結構化數據),查看日誌,並準確瞭解流程是如何執行的
-
自信評估:根據預定義的數據集測試 AI 工作流,並分析評分指標以確保質量和可靠性
通過如下方式運行應用來啓動開發者 UI:
-
Go:
genkit start -- go run main.go
-
Python:
genkit start -- python main.py
開始使用
準備好構建下一個 AI 驅動應用了嗎?探索我們全面的文檔和資源:
-
Python:開始使用 Genkit for Python[10](Alpha 版 - 非常適合實驗!)
-
Go:開始使用 Genkit for Go[11](Beta 版 - 馬上生產就緒!)
參考資料
[1]
genkit: https://github.com/firebase/genkit
[2]
genkit for nodejs: https://firebase.blog/posts/2025/02/announcing-genkit/
[3]
Pinecone: https://docs.pinecone.io/integrations/firebase-genkit
[4]
Astra DB: https://github.com/datastax/genkitx-astra-db
[5]
genkit neo4j: https://github.com/neo4j-partners/genkitx-neo4j
[6]
google GenAI: https://python.api.genkit.dev/reference/plugins/google-genai/
[7]
ollama plugin: https://python.api.genkit.dev/reference/plugins/ollama/
[8]
flask: https://python.api.genkit.dev/flask/
[9]
firestore: https://python.api.genkit.dev/reference/plugins/firestore/
[10]
genkit for python: https://genkit.dev/python
[11]
genkit for Go: https://genkit.dev/go
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/uXv_Gxl9j7QBimw54CiqLQ