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

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,
  }}