Génération de contenu...

Firebase Genkit offre une interface simple pour générer du contenu à l'aide des LLM.

Modèles

Dans Firebase Genkit, les modèles sont des bibliothèques et des abstractions qui donnent accès avec divers LLM Google et autres.

Les modèles sont entièrement instrumentés pour l'observabilité et sont fournis avec des intégrations d'outils fournies par l'UI du développeur Genkit. Vous pouvez essayer n'importe quel modèle à l'aide du moteur d'exécution de modèles.

Lorsque vous travaillez avec des modèles dans Genkit, vous devez d'abord configurer le modèle avec lequel vous souhaitez travailler. La configuration du modèle est effectuée par le système de plug-in. Dans Dans cet exemple, vous configurez le plug-in Vertex AI, qui fournit à Gemini des modèles de ML.

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
}

Pour utiliser les modèles fournis par le plug-in, vous avez besoin d'une référence au modèle spécifique et sa version:

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

Modèles compatibles

Genkit est compatible avec les modèles via son système de plug-in. Les plug-ins suivants sont officiellement prises en charge:

Plug-in Modèles
IA générative de Google Gemini Pro, Gemini Pro Vision
Google Vertex AI Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
Ollama De nombreux modèles locaux, y compris Gemma, Llama 2, Mistral et plus

Pour en savoir plus sur la configuration et l'utilisation de chaque plug-in, consultez la documentation correspondante.

Générer du contenu

Genkit fournit une fonction d'assistance simple pour générer du contenu à l'aide de modèles.

Pour appeler le modèle, procédez comme suit:

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

Vous pouvez transmettre des options avec l'appel du modèle. Les options compatibles dépendent du modèle et de son 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,
	}))

Réponses en streaming

Genkit est compatible avec la diffusion fragmentée des réponses du modèle. Pour utiliser les flux fragmentés, transmettez une fonction de rappel à 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())

Saisie multimodale

Si le modèle est compatible avec l'entrée multimodale, vous pouvez transmettre des requêtes d'image:

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))))

Le format exact de la requête image (URL https, URL gs, URI data) est dépend du modèle.

Appel de fonction (outils)

Les modèles Genkit fournissent une interface pour les appels de fonction, pour les modèles qui les acceptent.

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))

Les outils sont alors automatiquement appelés pour répondre à l'invite de l'utilisateur.

Enregistrement de l'historique des messages

Les modèles Genkit permettent de conserver un historique des messages envoyés au modèle et ses réponses, que vous pouvez utiliser pour créer des expériences interactives, telles que chatbots.

Dans la première requête d'une session, "history" correspond simplement à la requête utilisateur :

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

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

Lorsque vous recevez une réponse, ajoutez-la à l'historique:

history = append(history, response.Message)

Vous pouvez sérialiser cet historique et le conserver dans une base de données ou un espace de stockage de session. Pour les invites utilisateur suivantes, ajoutez-les à l'historique avant d'appeler 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...))

Si le modèle que vous utilisez est compatible avec le rôle système, vous pouvez utiliser le rôle pour définir le message système:

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