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" istemmy_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.