Firebase Genkit предоставляет простой интерфейс для создания контента с помощью LLM.
Модели
Модели в Firebase Genkit — это библиотеки и абстракции, которые обеспечивают доступ к различным LLM от Google и сторонних разработчиков.
Модели полностью оснащены инструментами для наблюдения и оснащены интеграцией инструментов, предоставляемых пользовательским интерфейсом разработчика Genkit — вы можете опробовать любую модель с помощью средства запуска моделей.
При работе с моделями в Genkit сначала необходимо настроить модель, с которой вы хотите работать. Конфигурация модели осуществляется системой плагинов. В этом примере вы настраиваете плагин Vertex AI, который предоставляет модели Gemini.
Идти
import "github.com/firebase/genkit/go/ai"
import "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
}
Чтобы использовать модели, предоставляемые плагином, вам нужна ссылка на конкретную модель и версию:
Идти
gemini15pro := vertexai.Model("gemini-1.5-pro")
Поддерживаемые модели
Genkit обеспечивает поддержку моделей через свою систему плагинов. Официально поддерживаются следующие плагины:
Плагин | Модели |
---|---|
Генеративный искусственный интеллект Google | Близнецы Про, Близнецы Про Видение |
Google Вертекс ИИ | Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2 |
Оллама | Многие местные модели, в том числе Gemma, Llama 2, Mistral и другие. |
Информацию о настройке и использовании см. в документации каждого плагина.
Как генерировать контент
Genkit предоставляет простую вспомогательную функцию для создания контента с помощью моделей.
Чтобы просто вызвать модель:
Идти
request := ai.GenerateRequest{Messages: []*ai.Message{
{Content: []*ai.Part{ai.NewTextPart("Tell me a joke.")}},
}}
response, err := gemini15pro.Generate(ctx, &request, nil)
if err != nil {
return err
}
responseText, err := response.Text()
if err != nil {
return err
}
fmt.Println(responseText)
Вы можете передавать параметры вместе с вызовом модели. Поддерживаемые параметры зависят от модели и ее API.
Идти
request := ai.GenerateRequest{
Messages: []*ai.Message{
{Content: []*ai.Part{ai.NewTextPart("Tell me a joke about dogs.")}},
},
Config: ai.GenerationCommonConfig{
Temperature: 1.67,
StopSequences: []string{"abc"},
MaxOutputTokens: 3,
},
}
Потоковая передача ответов
Genkit поддерживает потоковую передачу ответов модели по частям:
Идти
Чтобы использовать потоковую передачу по частям, передайте функцию обратного вызова в Generate()
:
request := ai.GenerateRequest{Messages: []*ai.Message{
{Content: []*ai.Part{ai.NewTextPart("Tell a long story about robots and ninjas.")}},
}}
response, err := gemini15pro.Generate(
ctx,
&request,
func(ctx context.Context, grc *ai.GenerateResponseChunk) error {
text, err := grc.Text()
if err != nil {
return err
}
fmt.Printf("Chunk: %s\n", text)
return nil
})
if err != nil {
return err
}
// You can also still get the full response.
responseText, err := response.Text()
if err != nil {
return err
}
fmt.Println(responseText)
Мультимодальный ввод
Если модель поддерживает мультимодальный ввод, вы можете передавать подсказки изображения:
Идти
imageBytes, err := os.ReadFile("img.jpg")
if err != nil {
return err
}
encodedImage := base64.StdEncoding.EncodeToString(imageBytes)
request := ai.GenerateRequest{Messages: []*ai.Message{
{Content: []*ai.Part{
ai.NewTextPart("Describe the following image."),
ai.NewMediaPart("", "data:image/jpeg;base64,"+encodedImage),
}},
}}
gemini15pro.Generate(ctx, &request, nil)
Точный формат запроса изображения (URL-адрес https
, URL-адрес gs
, URI data
) зависит от модели.
Вызов функций (инструменты)
Модели Genkit предоставляют интерфейс для вызова функций для моделей, которые его поддерживают.
Идти
myJoke := &ai.ToolDefinition{
Name: "myJoke",
Description: "useful when you need a joke to tell",
InputSchema: make(map[string]any),
OutputSchema: map[string]any{
"joke": "string",
},
}
ai.DefineTool(
myJoke,
nil,
func(ctx context.Context, input map[string]any) (map[string]any, error) {
return map[string]any{"joke": "haha Just kidding no joke! got you"}, nil
},
)
request := ai.GenerateRequest{
Messages: []*ai.Message{
{Content: []*ai.Part{ai.NewTextPart("Tell me a joke.")},
Role: ai.RoleUser},
},
Tools: []*ai.ToolDefinition{myJoke},
}
response, err := gemini15pro.Generate(ctx, &request, nil)
Это автоматически вызовет инструменты для выполнения запроса пользователя.
Запись истории сообщений
Модели Genkit поддерживают ведение истории сообщений, отправленных модели, и ее ответов, которые можно использовать для создания интерактивных возможностей, например чат-ботов.
Идти
В первом приглашении сеанса «история» — это просто приглашение пользователя:
history := []*ai.Message{{
Content: []*ai.Part{ai.NewTextPart(prompt)},
Role: ai.RoleUser,
}}
request := ai.GenerateRequest{Messages: history}
response, err := gemini15pro.Generate(context.Background(), &request, nil)
Когда вы получите ответ, добавьте его в историю:
history = append(history, response.Candidates[0].Message)
Вы можете сериализовать эту историю и сохранить ее в базе данных или хранилище сеансов. Для последующих запросов пользователя добавьте их в историю перед вызовом Generate()
:
history = append(history, &ai.Message{
Content: []*ai.Part{ai.NewTextPart(prompt)},
Role: ai.RoleUser,
})
request = ai.GenerateRequest{Messages: history}
response, err = gemini15pro.Generate(ctx, &request, nil)
Если используемая вами модель поддерживает системную роль, вы можете использовать исходную историю для установки системного сообщения:
Идти
history = []*ai.Message{{
Content: []*ai.Part{ai.NewTextPart("Talk like a pirate.")},
Role: ai.RoleSystem,
}}