Создание контента

Firebase Genkit предоставляет простой интерфейс для создания контента с помощью LLM.

Модели

Модели в Firebase Genkit — это библиотеки и абстракции, которые обеспечивают доступ к различным LLM от Google и сторонних разработчиков.

Модели полностью оснащены инструментами для наблюдения и оснащены интеграцией инструментов, предоставляемой пользовательским интерфейсом разработчика Genkit — вы можете опробовать любую модель с помощью средства запуска моделей.

При работе с моделями в Genkit сначала необходимо настроить модель, с которой вы хотите работать. Конфигурация модели осуществляется системой плагинов. В этом примере вы настраиваете плагин Vertex AI, который предоставляет модели Gemini.

import {
       
"github.com/firebase/genkit/go/ai"
       
"github.com/firebase/genkit/go/plugins/vertexai"
}
// 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 := vertexai.Init(ctx, nil); err != nil {
       
return err
}

Чтобы использовать модели, предоставляемые плагином, вам нужна ссылка на конкретную модель и версию:

model := vertexai.Model("gemini-1.5-flash")

Поддерживаемые модели

Genkit обеспечивает поддержку моделей через свою систему плагинов. Официально поддерживаются следующие плагины:

Плагин Модели
Генеративный искусственный интеллект Google Близнецы Про, Близнецы Про Видение
Google Вертекс ИИ Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
Оллама Многие местные модели, в том числе Gemma, Llama 2, Mistral и другие.

Информацию о настройке и использовании см. в документации каждого плагина.

Как генерировать контент

Genkit предоставляет простую вспомогательную функцию для создания контента с помощью моделей.

Чтобы просто вызвать модель:

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

Вы можете передавать параметры вместе с вызовом модели. Поддерживаемые параметры зависят от модели и ее API.

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

Потоковая передача ответов

Genkit поддерживает потоковую передачу ответов модели по частям. Чтобы использовать потоковую передачу по частям, передайте функцию обратного вызова в Generate() :

response, err := ai.Generate(ctx, gemini15pro,
        ai
.WithTextPrompt("Tell a long story about robots and ninjas."),
       
// stream callback
        ai
.WithStreaming(
                func
(ctx context.Context, grc *ai.GenerateResponseChunk) 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())

Мультимодальный ввод

Если модель поддерживает мультимодальный ввод, вы можете передавать подсказки изображения:

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

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

Точный формат запроса изображения (URL-адрес https , URL-адрес gs , URI data ) зависит от модели.

Вызов функций (инструменты)

Модели Genkit предоставляют интерфейс для вызова функций для моделей, которые его поддерживают.

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

response
, err := ai.Generate(ctx, gemini15pro,
        ai
.WithTextPrompt("Tell me a joke."),
        ai
.WithTools(myJokeTool))

Это автоматически вызовет инструменты для выполнения запроса пользователя.

Запись истории сообщений

Модели Genkit поддерживают ведение истории сообщений, отправленных модели, и ее ответов, которые можно использовать для создания интерактивных возможностей, например чат-ботов.

В первом приглашении сеанса «история» — это просто приглашение пользователя:

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

response
, err := ai.Generate(context.Background(), gemini15pro, ai.WithMessages(history...))

Когда вы получите ответ, добавьте его в историю:

history = append(history, response.Candidates[0].Message)

Вы можете сериализовать эту историю и сохранить ее в базе данных или хранилище сеансов. Для последующих запросов пользователя добавьте их в историю перед вызовом Generate() :

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

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

Если используемая вами модель поддерживает системную роль, вы можете использовать исходную историю для установки системного сообщения:

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