İçerik oluşturuluyor

Firebase Genkit, LLM'lerle içerik oluşturmak için kolay bir arayüz sağlar.

Modeller

Firebase Genkit'teki modeller, çeşitli Google ve Google dışı LLM'ler.

Modeller gözlemlenebilirlik için eksiksiz donanıma sahiptir ve çeşitli aletlerle birlikte gelir entegrasyonları entegre edebilirsiniz. Herhangi bir modeli rolünüzün ne olduğunu tartışacağız.

Genkit'te modellerle çalışırken öncelikle oluşturduğunuz modeli yapılandırmanız gerekir. tercih edebilirsiniz. Model yapılandırma, eklenti sistemi tarafından gerçekleştirilir. İçinde Bu örnekte, Gemini'ın yapay zekayı kullanmasını sağlayan Vertex AI eklentisini modeller.

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
}

Eklenti tarafından sağlanan modelleri kullanmak için ilgili modele referans vermeniz gerekir ve sürüm:

Go

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

Desteklenen modeller

Genkit, eklenti sistemi aracılığıyla model desteği sağlar. Aşağıdaki eklentiler resmi olarak desteklenmektedir:

Eklenti Modeller
Google Üretken Yapay Zeka Gemini Pro, Gemini Pro, Vizyon
Google Vertex Yapay Zeka Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
Ollama Gemma, Llama 2, Mistral gibi birçok yerel model ve daha fazlası

Kurulum ve kullanım bilgileri için her eklentinin dokümanlarına bakın.

İçerik oluşturma

Genkit, modellerle içerik üretmek için basit bir yardımcı işlev sunar.

Yalnızca modeli çağırmak için:

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)

Model çağrısıyla birlikte seçenekleri de iletebilirsiniz. Desteklenen seçenekler modele ve API'sine bağlıdır.

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

Yanıtların akış şeklinde gösterilmesi

Genkit, model yanıtlarının parçalı akışını destekler:

Go

Parçalı akışı kullanmak için Generate() öğesine bir geri çağırma işlevi iletin:

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)

Çok modlu giriş

Model, çok modlu girişi destekliyorsa resim istemlerini iletebilirsiniz:

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)

Resim isteminin tam biçimi (https URL'si, gs URL, data URI) deneyime bağlıdır.

İşlev çağırma (araçlar)

Genkit modelleri, şunları destekleyen modeller için işlev çağrısı için bir arayüz sağlar: somut olarak ortaya koyar.

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)

Bu komut, kullanıcı istemini yerine getirmek için araçları otomatik olarak çağırır.

Mesaj geçmişi kaydediliyor

Genkit modelleri, modele gönderilen mesajların geçmişinin korunmasını destekler. Bu bilgileri kullanarak etkileşimli deneyimler oluşturmak için kullanabilirsiniz. chatbot'lardan ibarettir.

Go

Bir oturumun ilk isteminde "geçmiş" basitçe kullanıcı istemi:

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)

Aldığınız yanıtları geçmişe ekleyin:

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

Bu geçmişi serileştirebilir ve bir veritabanında veya oturum depolama alanında saklayabilirsiniz. Sonraki kullanıcı istemleri için, aramadan önce bunları geçmişe ekleyin 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)

Kullandığınız model sistem rolünü destekliyorsa sistem mesajını ayarlayın:

Go

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