Firebase Genkit 提供 Dotprompt 外掛程式和文字格式,可協助你編寫 及整理生成式 AI 提示
Dotprompt 的設計宗旨是提示。您編寫 會將提示維持在特殊格式的檔案,稱為 dotprompt 檔案,追蹤 您可以使用 也可以與呼叫生成式 AI 的程式碼一起部署 我們來看評估分類模型成效時 的喚回度和精確度指標
如要使用 Dotprompt,請先在專案根目錄中建立 prompts
目錄,並
然後在該目錄中建立 .prompt
檔案這裡舉了一個簡單的例子
可能會呼叫 greeting.prompt
:
---
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}}.
如要使用這則提示,請安裝 dotprompt
外掛程式:
go get github.com/firebase/genkit/go/plugins/dotprompt
然後使用 Open
載入提示:
import "github.com/firebase/genkit/go/plugins/dotprompt"
dotprompt.SetDirectory("prompts")
prompt, err := dotprompt.Open("greeting")
您可以呼叫提示的 Generate
方法,以算繪範本並傳送
通往模型 API
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())
或是直接將範本轉譯為字串:
renderedPrompt, err := prompt.RenderText(map[string]any{
"location": "a restaurant",
"style": "a pirate",
})
點號的語法以處理常式為基礎
範本語言您可以使用 if
、unless
和 each
輔助程式新增
條件部分加進提示,或反覆修改結構化內容
檔案格式會使用 YAML 前端,為內嵌提示提供中繼資料
與範本互動
使用 Picoschema 定義輸入/輸出結構定義
Dotprompt 包含以 YAML 為基礎的精簡結構定義格式,稱為 Picoschema 可讓您輕鬆定義最重要的結構定義來源 適合 LLM 用量以下為文章的結構定義範例:
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
上述結構定義相當於下列 JSON 結構定義:
{
"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 支援純量類型 string
、integer
、number
、boolean
和 any
。
如果是物件、陣列和列舉,欄位名稱後面會以括號表示。
Picoschema 定義的物件包含所有必要屬性,除非另有註明
,且不允許其他屬性。?
屬性標示為選用時
也能讓 LLM 傳回空值
因此可能會略過欄位
在物件定義中,您可以使用特殊鍵 (*)
宣告「萬用字元」
欄位定義。這將與
明確金鑰。
Picoschema 不支援完整 JSON 結構定義的許多功能。如果發生以下情況: 如需更完整的結構定義,您可以改為提供 JSON 結構定義:
output:
schema:
type: object
properties:
field1:
type: number
minimum: 20
覆寫提示中繼資料
雖然 .prompt
檔案可讓您將模型設定等中繼資料嵌入
檔案本身,您也可以在每次呼叫上覆寫這些值:
// 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,
)
多重訊息提示
根據預設,Dotprompt 會使用 "user"
角色建構單一訊息。只有部分通知
提示最好由多則訊息組成,例如
系統提示
{{role}}
輔助工具可讓您輕鬆建構多訊息提示:
---
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}}
多模態提示
如果是支援多模態輸入的模型 (例如圖片和文字旁邊),您可以
使用 {{media}}
輔助程式:
---
model: vertexai/gemini-1.5-flash
input:
schema:
photoUrl: string
---
Describe this image in a detailed paragraph:
{{media url=photoUrl}}
「內嵌」的網址可以是 https://
或 Base64 編碼的 data:
URI圖片
。在程式碼中,這會是:
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,
)
提示變化版本
由於提示檔案只有文字,您可以 (也應該) 提交 版本管控系統,方便您比較不同時期的變更。 修改過的提示通常只能在 實際工作環境和現有版本。Dotprompt 支援 透過變化版本功能達成這個目標
如要建立變化版本,請建立 [name].[variant].prompt
檔案。舉例來說
您是否在提示中使用 Gemini 1.5 Flash,但想瞭解 Gemini 1.5
否則,您可以製作兩個檔案:
my_prompt.prompt
:「基準」提示my_prompt.geminipro.prompt
:名為「geminipro」的變化版本
如要使用提示變化版本,請在載入時指定變化版本:
describeImagePrompt, err := dotprompt.OpenVariant("describe_image", "geminipro")
提示載入器會嘗試載入該名稱的變化版本 就會加入基準。也就是說,您可以使用以條件式載入 選擇適合你的應用程式
var myPrompt *dotprompt.Prompt
var err error
if isBetaTester(user) {
myPrompt, err = dotprompt.OpenVariant("describe_image", "geminipro")
} else {
myPrompt, err = dotprompt.Open("describe_image")
}
產生追蹤記錄的中繼資料會包含變化版本名稱,因此 可以比較 Genkit 追蹤記錄中各變化版本的實際成效 檢查工具