將提示儲存至檔案
在上述單元中,您了解如何透過呼叫 kernel.InvokePromptAsync
來建立可重複使用的提示。 例如:
Console.WriteLine(
await kernel.InvokePromptAsync(generateNamesOfPrompt, new() {{ "input", "fantasy characters" }})
);
建立內嵌提示很有用,但對於較大型的專案,您可能想要將提示組織成個別的檔案並將其匯入核心。 這個方式類似於內建外掛程式的使用方式。 若要建立自己的提示外掛程式,最佳做法是為您的提示建立個別的資料夾。
如何建立語意外掛程式
語意核心 SDK 支援具有一些簡單語法規則的提示範本化語言。 您不需要撰寫程式瑪或匯入任何外部程式庫,只需使用大括弧 {{...}} 在提示中內嵌運算式。
若要建立語意外掛程式,您需要包含此兩個檔案的資料夾:skprompt.txt
檔案和 config.json
檔案。 skprompt.txt
檔案包含大型語言模型 (LLM) 的提示,類似於到目前為止所撰寫的所有提示。 config.json
檔案包含提示的組態詳細資料。
config.json
檔案支援下列參數:
type
:提示的類型。 您通常會使用聊天完成提示類型。description
:提示所執行作業的描述。 核心可以使用此描述來自動叫用提示。input_variables
:定義提示內所使用的變數。execution_settings
:完成模型的設定。 針對 OpenAI 模型,這些設定包括max_tokens
和temperature
屬性。
例如,假設您想要建立一個音樂教師代理程式。 您想要支援一項功能,在可能的和弦進展中建議加入的和弦。 在此案例中,使用者會提供起始和弦,而外掛程式會建議適合的和弦。
若要建立此外掛程式,您必須先在專案中建立 'Prompts' 資料夾,然後建立名為 'SuggestChords' 的子資料夾。 之後,您會將 'skprompt.txt' 和 'config.json' 檔案新增至 'SuggestChords' 資料夾。
'skprompt.txt' 檔案範例:
<message role="system">Instructions: You are a helpful music theory assistant.
Provide the user with several chords that they could add to a chord progression
based on some starting chords they provide</message>
<message role="user">Am Em</message>
<message role="assistant">
C major, F major, G major, D major, E major, B minor
</message>
<message role="user"> {{$startingChords}}</message>
'config.json' 檔案範例:
{
"schema": 1,
"type": "completion",
"description": "Recommends chords to the user based on starting chords",
"execution_settings": {
"default": {
"max_tokens": 1000,
"temperature": 0
}
},
"input_variables": [
{
"name": "startingChords",
"description": "The starting chords provided by the user",
"required": true
},
]
}
在此範例中,temperature
是一個參數,可控制要隨機產生的多少文字。 該值必須介於 0 到 2 之間。 溫度較低會產生更專注和更精確的輸出,而溫度較高會產生更多樣化和更有創造性的輸出。
在目前的模型中,要求最多可以使用提示和完成之間共用的 4,097 個權杖。 這表示如果提示是 4,000 個權杖,則聊天完成最多可以是 97 個權杖。 您可以在 LLM 的文件中找到微調參數的詳細資訊。
若要使用自訂語意外掛程式,您可以將提示目錄匯入核心,並依其資料夾名稱呼叫外掛程式。 例如:
var plugins = kernel.CreatePluginFromPromptDirectory("Prompts");
string input = "G, C";
var result = await kernel.InvokeAsync(
plugins["SuggestChords"],
new() {{ "startingChords", input }});
Console.WriteLine(result);
在此範例中,CreatePluginFromPromptDirectory
會傳回 KernelPlugin
物件。 此物件代表函式的集合。 CreatePluginFromPromptDirectory
會接受指定之外掛程式目錄的路徑,而每個子資料夾的名稱會當做函式名稱使用。
例如,如果您將 [SuggestChords] 巢狀於名為 [ChordProgressions] 的資料夾內,您會使用提示目錄 [Prompts/ChordProgressions],且函式名稱會維持不變。 或者,您可以使用 'Prompt' 目錄,並將 'ChordProgressions/SuggestChords' 當作函式名稱來參照。
// Example of nested prompt folders
var chordProgressionPlugin = kernel.CreatePluginFromPromptDirectory("Prompts/ChordProgressions");
string input = "G, C";
var result = await kernel.InvokeAsync(
chordProgressionPlugin["SuggestChords"],
new() {{ "startingChords", input }});
Console.WriteLine(result);
執行此程式碼應該會產生類似下列輸出的回應:
D major, A minor, E minor, B minor, F major, G7
將提示儲存至檔案是組織程式碼並使其更易於維護的絕佳方式。 組態檔也可讓您進一步微調提示,以取得更可預測的使用者體驗。