콘텐츠 생성

Firebase Genkit는 LLM으로 콘텐츠를 생성할 수 있는 간편한 인터페이스를 제공합니다.

모델

Firebase Genkit의 모델은 다양한 Google 및 타사 LLM에 대해 살펴보겠습니다

모델은 관측 가능성을 위해 완전히 계측되고 도구와 함께 제공됩니다. 통합하지 않아도 됩니다. 모델 실행기입니다.

Genkit에서 모델을 사용할 때는 먼저 커스텀 모델을 선택할 수 있습니다 모델 구성은 플러그인 시스템에서 수행합니다. 포함 이 예시에서는 Gemini를 제공하는 Vertex AI 플러그인을 구성합니다. 모델을 학습시키는 작업도 반복해야 합니다

Go

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
}

플러그인에서 제공하는 모델을 사용하려면 특정 모델에 대한 참조가 필요합니다. 버전:

Go

gemini15pro := vertexai.Model("gemini-1.5-pro")

지원되는 모델

Genkit는 플러그인 시스템을 통해 모델 지원을 제공합니다. 다음 플러그인 공식적으로 지원됩니다.

플러그인 모델
Google 생성형 AI Gemini Pro, Gemini Pro Vision
Google Vertex AI Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
올라마 Gemma, Llama 2, Mistral 등 다양한 로컬 모델

설정 및 사용 정보는 각 플러그인의 문서를 참조하세요.

콘텐츠 생성 방법

Genkit는 모델로 콘텐츠를 생성하는 간단한 도우미 함수를 제공합니다.

모델을 호출하기만 하면 됩니다.

Go

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에 따라 다릅니다

Go

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는 모델 응답의 청크 스트리밍을 지원합니다.

Go

분할된 스트리밍을 사용하려면 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)

멀티모달 입력

모델이 멀티모달 입력을 지원하는 경우 이미지 프롬프트를 전달할 수 있습니다.

Go

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)

이미지 프롬프트의 정확한 형식 (https URL, gs URL, data URI)은 다음과 같습니다. 의존하지 않습니다.

함수 호출 (도구)

Genkit 모델은 있습니다.

Go

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 모델은 모델로 전송된 메시지의 기록 유지 관리를 지원합니다. 이러한 정보를 바탕으로 다음과 같은 양방향 환경을 구축하는 데 사용할 수 있습니다. 챗봇

Go

세션의 첫 번째 프롬프트에서 '기록'은 사용자 프롬프트입니다.

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)

사용 중인 모델이 시스템 역할을 지원하는 경우 기록을 사용하여 시스템 메시지를 설정합니다.

Go

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