Dotprompt ile istemleri yönetme

Firebase Genkit, yazmanıza yardımcı olmak için Dotprompt eklentisini ve metin biçimini sağlar üretken yapay zeka istemlerinizi düzenleyin.

Dotprompt, istemlerin kod olması prensibiyle tasarlanmıştır. Siz yazar, istemlerinizi noktaprompt dosyaları adı verilen özel olarak biçimlendirilmiş dosyalarda tutma, izleme için kullandığınız sürüm kontrol sistemini kullanarak ve bunları üretken yapay zekanızı çağıran kodla birlikte dağıtabilirsiniz modeller.

Dotprompt'ı kullanmak için önce proje kökünüzde bir prompts dizini oluşturun ve daha sonra, bu dizinde bir .prompt dosyası oluşturun. İşte size basit bir örnek greeting.prompt adlı kişiyi arayabilir:

---
model: vertexai/gemini-1.5-flash
config:
  temperature: 0.9
input:
  schema:
    location: string
    style?: string
    name?: string
  default:
    location: a restaurant
---

You are the world's most welcoming AI assistant and are currently working at {{location}}.

Greet a guest{{#if name}} named {{name}}{{/if}}{{#if style}} in the style of {{style}}{{/if}}.

Bu istemi kullanmak için dotprompt eklentisini yükleyin:

go get github.com/firebase/genkit/go/plugins/dotprompt

Ardından Open komutunu kullanarak istemi yükleyin:

import "github.com/firebase/genkit/go/plugins/dotprompt"
dotprompt.SetDirectory("prompts")
prompt, err := dotprompt.Open("greeting")

Şablonu oluşturmak ve iletmek için istemin Generate yöntemini çağırabilirsiniz ekleyebilirsiniz:

ctx := context.Background()

// Default to the project in GCLOUD_PROJECT and the location "us-central1".
vertexai.Init(ctx, nil)

// The .prompt file specifies vertexai/gemini-1.5-flash, which is
// automatically defined by Init(). However, if it specified a model that
// isn't automatically loaded (such as a specific version), you would need
// to define it here:
// vertexai.DefineModel("gemini-1.0-pro-002", &ai.ModelCapabilities{
// 	Multiturn:  true,
// 	Tools:      true,
// 	SystemRole: true,
// 	Media:      false,
// })

type GreetingPromptInput struct {
	Location string `json:"location"`
	Style    string `json:"style"`
	Name     string `json:"name"`
}
response, err := prompt.Generate(
	ctx,
	&dotprompt.PromptRequest{
		Variables: GreetingPromptInput{
			Location: "the beach",
			Style:    "a fancy pirate",
			Name:     "Ed",
		},
	},
	nil,
)
if err != nil {
	return err
}

fmt.Println(response.Text())

İsterseniz şablonu bir dize olarak da oluşturabilirsiniz:

renderedPrompt, err := prompt.RenderText(map[string]any{
	"location": "a restaurant",
	"style":    "a pirate",
})

Dotprompt'ın söz dizimi, Handlebars'a (İşleyici Çubukları) bağlıdır. şablon oluşturma dili. Aşağıdakileri eklemek için if, unless ve each yardımcılarını kullanabilirsiniz koşullu bölümleri yönlendirmenize veya yapılandırılmış içerikte yineleme yapmanıza olanak tanır. İlgili içeriği oluşturmak için kullanılan dosya biçimi, satır içi istem için meta veri sağlamak üzere YAML ön iletişimini kullanır şablonla deneyin.

Picoschema ile Giriş/Çıkış Şemalarını Tanımlama

Dotprompt; Bir şemanın en önemli özelliklerini tanımlamayı kolaylaştıran Picoschema göz önünde bulundurun. Aşağıda, bir makale şeması örneği verilmiştir:

schema:
  title: string # string, number, and boolean types are defined like this
  subtitle?: string # optional fields are marked with a `?`
  draft?: boolean, true when in draft state
  status?(enum, approval status): [PENDING, APPROVED]
  date: string, the date of publication e.g. '2024-04-09' # descriptions follow a comma
  tags(array, relevant tags for article): string # arrays are denoted via parentheses
  authors(array):
    name: string
    email?: string
  metadata?(object): # objects are also denoted via parentheses
    updatedAt?: string, ISO timestamp of last update
    approvedBy?: integer, id of approver
  extra?: any, arbitrary extra data
  (*): string, wildcard field

Yukarıdaki şema, aşağıdaki JSON şemasına eşdeğerdir:

{
  "properties": {
    "metadata": {
      "properties": {
        "updatedAt": {
          "type": "string",
          "description": "ISO timestamp of last update"
        },
        "approvedBy": {
          "type": "integer",
          "description": "id of approver"
        }
      },
      "type": "object"
    },
    "title": {
      "type": "string"
    },
    "subtitle": {
      "type": "string"
    },
    "draft": {
      "type": "boolean",
      "description": "true when in draft state"
    },
    "date": {
      "type": "string",
      "description": "the date of publication e.g. '2024-04-09'"
    },
    "tags": {
      "items": {
        "type": "string"
      },
      "type": "array",
      "description": "relevant tags for article"
    },
    "authors": {
      "items": {
        "properties": {
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          }
        },
        "type": "object",
        "required": ["name"]
      },
      "type": "array"
    }
  },
  "type": "object",
  "required": ["title", "date", "tags", "authors"]
}

Picoschema skaler türleri destekler: string, integer, number, boolean ve any. Nesneler, diziler ve sıralamalar, alan adından sonra parantez içinde gösterilir.

Picoschema tarafından tanımlanan nesneler, isteğe bağlı olarak belirtilmediği sürece gereken tüm özelliklere sahiptir ? ile değiştirin ve ek mülklere izin vermeyin. Bir tesis isteğe bağlı olarak işaretlendiğinde LLM'lerin atlatıyoruz.

Nesne tanımında, "joker karakter" tanımlamak için (*) özel anahtarı kullanılabilir alan tanımıdır. Bu, açık anahtar.

Picoschema, tam JSON şemasının birçok özelliğini desteklemez. Şu durumda: daha sağlam şemalar gerekiyorsa bunun yerine bir JSON Şeması sağlayabilirsiniz:

output:
  schema:
    type: object
    properties:
      field1:
        type: number
        minimum: 20

İstem Meta Verilerini Geçersiz Kılma

.prompt dosyaları, model yapılandırması gibi meta verileri bu değerleri her arama için ayrı ayrı da geçersiz kılabilirsiniz:

// Make sure you set up the model you're using.
vertexai.DefineModel("gemini-1.5-flash", nil)

response, err := prompt.Generate(
	context.Background(),
	&dotprompt.PromptRequest{
		Variables: GreetingPromptInput{
			Location: "the beach",
			Style:    "a fancy pirate",
			Name:     "Ed",
		},
		Model: "vertexai/gemini-1.5-flash",
		Config: &ai.GenerationCommonConfig{
			Temperature: 1.0,
		},
	},
	nil,
)

Çoklu mesaj istemleri

Varsayılan olarak Dotprompt, "user" rolüyle tek bir mesaj oluşturur. Biraz istemlerin en iyi şekilde ifade edilmesi, birden fazla mesajın bir kombinasyonu tıklayın.

{{role}} yardımcısı, çoklu mesaj istemleri oluşturmak için basit bir yol sağlar:

---
model: vertexai/gemini-1.5-flash
input:
  schema:
    userQuestion: string
---

{{role "system"}}
You are a helpful AI assistant that really loves to talk about food. Try to work
food items into all of your conversations.
{{role "user"}}
{{userQuestion}}

Çok modlu istemler

Metnin yanında görüntü gibi çok modlu girişleri destekleyen modellerde {{media}} yardımcısını kullanın:

---
model: vertexai/gemini-1.5-flash
input:
  schema:
    photoUrl: string
---

Describe this image in a detailed paragraph:

{{media url=photoUrl}}

URL, "inline" (satır içi) için https:// veya base64 kodlu data: URI'leri olabilir. resim bazı yolları da görmüştük. Kodda bu aşağıdaki gibidir:

dotprompt.SetDirectory("prompts")
describeImagePrompt, err := dotprompt.Open("describe_image")
if err != nil {
	return err
}

imageBytes, err := os.ReadFile("img.jpg")
if err != nil {
	return err
}
encodedImage := base64.StdEncoding.EncodeToString(imageBytes)
dataURI := "data:image/jpeg;base64," + encodedImage

type DescribeImagePromptInput struct {
	PhotoUrl string `json:"photo_url"`
}
response, err := describeImagePrompt.Generate(
	context.Background(),
	&dotprompt.PromptRequest{Variables: DescribeImagePromptInput{
		PhotoUrl: dataURI,
	}},
	nil,
)

İstem Varyantları

İstem dosyaları yalnızca metin olduğundan, bunları kendi zaman içindeki değişiklikleri kolayca karşılaştırmanızı sağlar. Çoğu zaman, istemlerin değiştirilmiş versiyonları yalnızca tek bir mevcut sürümlerle yan yana görmelerini sağlamalısınız. Dotprompt destekler varyantları özelliği aracılığıyla test edebilirsiniz.

Varyant oluşturmak için [name].[variant].prompt dosyası oluşturun. Örneğin, isteminizde Gemini 1.5 Flash kullanıyordunuz ancak Gemini 1.5 Flash'ın Pro daha iyi performans gösterirse iki dosya oluşturabilirsiniz:

  • my_prompt.prompt: "referans" istem
  • my_prompt.geminipro.prompt: "geminipro" adlı bir varyant

İstem varyantı kullanmak için yükleme sırasında varyantı belirtin:

describeImagePrompt, err := dotprompt.OpenVariant("describe_image", "geminipro")

İstem yükleyici, bu adın varyantını yüklemeye çalışır ve önceki sürüme geri döner referans değere göre ayarlanır. Bu, performans verilerine göre koşullu yükleme uygulamanız açısından anlamlı olan tüm kriterlere göre

var myPrompt *dotprompt.Prompt
var err error
if isBetaTester(user) {
	myPrompt, err = dotprompt.OpenVariant("describe_image", "geminipro")
} else {
	myPrompt, err = dotprompt.Open("describe_image")
}

Varyantın adı, oluşturma izlerinin meta verilerine dahil edildiğinden Genkit izindeki varyantların gerçek performansını karşılaştırabilir. denetleyicidir.