콘텐츠 생성

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

모델

Firebase Genkit의 모델은 다양한 Google 및 Google 이외 LLM에 액세스를 제공하는 라이브러리와 추상화입니다.

모델은 관측 가능성을 위해 완전히 계측되고 Genkit 개발자 UI에서 제공하는 통합 도구와 함께 제공됩니다. 모델 실행기를 사용하여 원하는 모델을 시도해 보세요.

Genkit에서 모델을 사용할 때는 먼저 작업할 모델을 구성해야 합니다. 모델 구성은 플러그인 시스템에서 실행합니다. 이 예시에서는 Gemini 모델을 제공하는 Vertex AI 플러그인을 구성합니다.

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 생성형 AI Gemini Pro, Gemini Pro Vision
Google Vertex AI Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
Ollama 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))))

이미지 프롬프트의 정확한 형식(https URL, gs URL, data URI)은 모델에 의존합니다.

함수 호출(도구)

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