Generazione di contenuti in corso...

Firebase Genkit offre un'interfaccia semplice per la generazione di contenuti con gli LLM.

Modelli

I modelli in Firebase Genkit sono librerie e astrazioni che forniscono l'accesso vari LLM Google e non Google.

I modelli sono completamente strumentati per l'osservabilità e sono dotati di integrazioni degli strumenti fornite dall'interfaccia utente per gli sviluppatori di Genkit. Puoi provare qualsiasi modello utilizzando il runner del modello.

Quando lavori con i modelli in Genkit, devi prima configurare il modello con cui vuoi lavorare. La configurazione del modello viene eseguita dal sistema dei plug-in. In questo esempio configuri il plug-in Vertex AI, che fornisce i modelli Gemini.

import {
	"github.com/firebase/genkit/go/ai"
	"github.com/firebase/genkit/go/genkit"
	"github.com/firebase/genkit/go/plugins/googlegenai"
}
// Default to the value of GCLOUD_PROJECT for the project,
// and "us-central1" for the location.
// To specify these values directly, pass a vertexai.Config value to Init.
if err := (&googlegenai.VertexAI{}).Init(ctx, g); err != nil {
	return err
}

Per utilizzare i modelli forniti dal plug-in, è necessario un riferimento al modello specifico e versione:

model := googlegenai.VertexAIModel(g, "gemini-1.5-flash")

Modelli supportati

Genkit fornisce il supporto del modello attraverso il proprio sistema di plug-in. I seguenti plug-in sono ufficialmente supportati:

Plug-in Modelli
IA generativa di Google Gemini Pro, Gemini Pro Vision
Google Vertex AI Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
Ollama Molti modelli locali, tra cui Gemma, Llama 2, Mistral e altri

Per informazioni sulla configurazione e sull'utilizzo, consulta la documentazione di ciascun plug-in.

Come generare contenuti

Genkit fornisce una semplice funzione helper per la generazione di contenuti con modelli.

Per chiamare solo il modello:

responseText, err := genkit.GenerateText(ctx, g, ai.WithModel(model), ai.WithPromptText("Tell me a joke."))
if err != nil {
	return err
}
fmt.Println(responseText)

Puoi passare le opzioni insieme alla chiamata del modello. Opzioni supportate dipendono dal modello e dall'API.

response, err := genkit.Generate(ctx, g,
	ai.WithModel(model),
	ai.WithPromptText("Tell me a joke about dogs."),
	ai.WithConfig(&ai.GenerationCommonConfig{
		Temperature:     1.67,
		StopSequences:   []string{"cat"},
		MaxOutputTokens: 3,
	}))

Risposte dinamiche

Genkit supporta flussi di dati suddivisi in blocchi delle risposte del modello. Per usare il flusso di dati in blocchi, passa una funzione di callback a Generate():

response, err := genkit.Generate(ctx, g,
	ai.WithModel(gemini15pro),
	ai.WithPromptText("Tell a long story about robots and ninjas."),
	// stream callback
	ai.WithStreaming(
		func(ctx context.Context, grc *ai.ModelResponseChunk) error {
			fmt.Printf("Chunk: %s\n", grc.Text())
			return nil
		}))
if err != nil {
	return err
}

// You can also still get the full response.
fmt.Println(response.Text())

Input multimodale

Se il modello supporta l'input multimodale, puoi passare i prompt di immagini:

imageBytes, err := os.ReadFile("img.jpg")
if err != nil {
	return err
}
encodedImage := base64.StdEncoding.EncodeToString(imageBytes)

resp, err := genkit.Generate(ctx, g,
	ai.WithModel(gemini15pro),
	ai.WithMessages(
		ai.NewUserMessage(
			ai.NewTextPart("Describe the following image."),
			ai.NewMediaPart("", "data:image/jpeg;base64,"+encodedImage))))

Il formato esatto del prompt dell'immagine (URL https, URL gs, URI data) dipende dal modello.

Chiamata di funzioni (strumenti)

I modelli Genkit forniscono un'interfaccia per le chiamate di funzione, per i modelli che supportano li annotino.

myJokeTool := genkit.DefineTool(
	g,
	"myJoke",
	"useful when you need a joke to tell",
	func(ctx *ai.ToolContext, input *any) (string, error) {
		return "haha Just kidding no joke! got you", nil
	},
)

response, err := genkit.Generate(ctx, g,
	ai.WithModel(gemini15pro),
	ai.WithPromptText("Tell me a joke."),
	ai.WithTools(myJokeTool))

In questo modo gli strumenti verranno chiamati automaticamente per soddisfare la richiesta dell'utente.

Registrazione della cronologia dei messaggi

I modelli Genkit supportano la conservazione di una cronologia dei messaggi inviati al modello e le sue risposte, che puoi utilizzare per creare esperienze interattive, come i chatbot.

Nel primo prompt di una sessione, la "cronologia" è semplicemente il prompt dell'utente:

history := []*ai.Message{{
	Content: []*ai.Part{ai.NewTextPart(prompt)},
	Role:    ai.RoleUser,
}}

response, err := genkit.Generate(ctx, g,
	ai.WithModel(gemini15pro),
	ai.WithMessages(history...))

Quando ricevi una risposta, aggiungila alla cronologia:

history = append(history, response.Message)

Puoi serializzare questa cronologia e conservarla in un database o nello spazio di archiviazione della sessione. Per i successivi prompt dell'utente, aggiungili alla cronologia prima di chiamare Generate():

history = append(history, &ai.Message{
	Content: []*ai.Part{ai.NewTextPart(prompt)},
	Role:    ai.RoleUser,
})

response, err = genkit.Generate(ctx, g,
	ai.WithModel(gemini15pro),
	ai.WithMessages(history...))

Se il modello che utilizzi supporta il ruolo di sistema, puoi utilizzare la cronologia iniziale per impostare il messaggio di sistema:

history = []*ai.Message{{
	Content: []*ai.Part{ai.NewTextPart("Talk like a pirate.")},
	Role:    ai.RoleSystem,
}}