Använd Handlebars-promptmallar
Semantisk Kernel stöder användning av Handlebars-mallsyntax för uppmaningar. Handlebars är ett enkelt mallningsspråk som främst används för att generera HTML, men det kan också skapa andra textformat. Mallar för Handlebars består av vanlig text varvat med Handlebars-uttryck.
Om du vill använda handlebars-mallen med semantisk kernel börjar du med att installera paketet:
dotnet add package Microsoft.SemanticKernel.PromptTemplates.Handlebars --version 1.30.0
pip install --upgrade semantic-kernel
I nästa steg importerar du paketet till din kod:
using Microsoft.SemanticKernel.PromptTemplates.Handlebars;
Alla toppnivåinstruktioner som lagts till innehåller följande:
using Microsoft.SemanticKernel; // Core Semantic Kernel SDK
using Microsoft.SemanticKernel.Connectors.AI.OpenAI; // Azure OpenAI connector
using Microsoft.SemanticKernel.PromptTemplates; // For prompt template configuration
using Microsoft.SemanticKernel.PromptTemplates.Handlebars; // For Handlebars template support
using System; // For Console and basic types
using System.Collections.Generic; // For Dictionary and KernelArguments
using System.IO; // For file operations (e.g., loading YAML)
using System.Threading.Tasks; // For async/await support
from semantic_kernel.prompt_template.handlebars_prompt_template import HandlebarsPromptTemplate
Alla toppnivåinstruktioner som lagts till innehåller följande:
from semantic_kernel.prompt_template import PromptTemplateConfig # for prompt_config
from semantic_kernel.prompt_template.handlebars_prompt_template import HandlebarsPromptTemplate # for function
import json # for loading appsettings.json
import yaml # for loading HandlebarsPrompt.yaml
import asyncio # for running async main
from semantic_kernel import Kernel # Needed (for kernel)
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion # for chat_service
I följande exempel visas en mall för chattprompt som använder Handlebars-syntax. Mallen innehåller Handlebars-uttryck, som anges av {{ och }}. När mallen körs ersätts dessa uttryck med värden från ett indataobjekt.
const string HandlebarsTemplate = """
<message role="system">You are an AI assistant designed to help with image recognition tasks.</message>
<message role="user">
<text>{{request}}</text>
<image>{{imageData}}</image>
</message>
""";
handlebars_template = """
<message role="system">You are an AI assistant designed to help with image recognition tasks.</message>
<message role="user">
<text>{{request}}</text>
<image>{{imageData}}</image>
</message>
"""
I det här exemplet finns det två indataobjekt:
-
request- Innehåller begäran som assistenten ska slutföra. -
imageData– Innehåller base64-bilddata.
Om du vill använda promptmallen måste du skapa ett PromptTemplateConfig objekt som innehåller mallen och dess format. Efteråt skapar du ett KernelFunction objekt från mallkonfigurationen och anger Handlebars mallfabrik. Här är ett exempel:
// Create the prompt template configuration
var templateFactory = new HandlebarsPromptTemplateFactory();
var promptTemplateConfig = new PromptTemplateConfig()
{
Template = HandlebarsTemplate,
TemplateFormat = "handlebars",
Name = "Vision_Chat_Prompt",
};
// Create a function from the Handlebars template configuration
var function = kernel.CreateFunctionFromPrompt(promptTemplateConfig, templateFactory);
# Load Azure OpenAI config from a JSON file
with open('appsettings.json', 'r') as f:
config = json.load(f)
model_id = config["modelId"]
endpoint = config["endpoint"]
api_key = config["apiKey"]
# Set up Semantic Kernel and Azure OpenAI service
kernel = Kernel()
chat_service = AzureChatCompletion(
deployment_name=model_id,
endpoint=endpoint,
api_key=api_key
)
kernel.add_service(chat_service, "chat_completion")
# Create the prompt template config and function
prompt_config = PromptTemplateConfig(
template=handlebars_template,
template_format="handlebars",
name="Vision_Chat_Prompt"
)
function = HandlebarsPromptTemplate(prompt_template_config=prompt_config)
Nu kan du skapa KernelArguments objektet med indata och anropa funktionen.
var arguments = new KernelArguments(new Dictionary<string, object?>
{
{"request","Describe this image:"},
{"imageData", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAACVJREFUKFNj/KTO/J+BCMA4iBUyQX1A0I10VAizCj1oMdyISyEAFoQbHwTcuS8AAAAASUVORK5CYII="}
});
var response = await kernel.InvokeAsync(function, arguments);
arguments = {
"request": "Describe this image:",
"imageData": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAACVJREFUKFNj/KTO/J+BCMA4iBUyQX1A0I10VAizCj1oMdyISyEAFoQbHwTcuS8AAAAASUVORK5CYII="
}
async def main():
result = await kernel.invoke_prompt(
prompt=prompt_config.template,
request=arguments["request"],
imageData=arguments["imageData"],
service_id="chat_completion",
template_format="handlebars"
)
print("Kernel result:", result)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Svaret på den här uppmaningen skulle likna följande utdata:
The image is a solid block of bright red color. There are no additional features, shapes, or textures present.
Använd Handlebars-mallar i YAML-promptar
Du kan skapa funktioner från YAML-filer, vilket gör att du kan lagra dina mallar tillsammans med associerade metadata och inställningar för körning av uppmaningar. Dessa filer kan hanteras i versionskontroll, vilket är fördelaktigt för att spåra ändringar i komplexa uppmaningar.
Följande kod är ett exempel på YAML-representationen av chattprompten som användes i det tidigare avsnittet:
name: Vision_Chat_Prompt
template: |
<message role="system">
You are an AI assistant designed to help with image recognition tasks.
</message>
<message role="user">
<text>{{request}}</text>
<image>{{imageData}}</image>
</message>
template_format: handlebars
description: Vision chat prompt template.
input_variables:
- name: request
description: Request details.
is_required: true
- name: imageData
description: Base64 image data.
is_required: true
Om du vill använda den här prompten läser du in den som en inbäddad resurs, konverterar den till en funktion och anropar den sedan.
// Load prompt from resource
var handlebarsPromptYaml = EmbeddedResource.Read("HandlebarsPrompt.yaml");
// Create the prompt function from the YAML resource
var templateFactory = new HandlebarsPromptTemplateFactory();
var function = kernel.CreateFunctionFromPromptYaml(handlebarsPromptYaml, templateFactory);
// Input data for the prompt rendering and execution
var arguments = new KernelArguments(new Dictionary<string, object?>
{
{"request","Describe this image:"},
{"imageData", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAACVJREFUKFNj/KTO/J+BCMA4iBUyQX1A0I10VAizCj1oMdyISyEAFoQbHwTcuS8AAAAASUVORK5CYII="}
});
// Invoke the prompt function
var response = await kernel.InvokeAsync(function, arguments);
import yaml
# Load YAML prompt from file
with open("HandlebarsPrompt.yaml", "r") as f:
yaml_prompt = yaml.safe_load(f)
prompt_config = PromptTemplateConfig(
template=yaml_prompt["template"],
template_format="handlebars",
name=yaml_prompt.get("name", "Vision_Chat_Prompt")
)
function = HandlebarsPromptTemplate(prompt_template_config=prompt_config)
arguments = {
"request": "Describe this image:",
"imageData": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAACVJREFUKFNj/KTO/J+BCMA4iBUyQX1A0I10VAizCj1oMdyISyEAFoQbHwTcuS8AAAAASUVORK5CYII="
}
async def main():
result = await kernel.invoke_prompt(
prompt=prompt_config.template,
request=arguments["request"],
imageData=arguments["imageData"],
service_id="chat_completion",
template_format="handlebars"
)
print("Kernel result:", result)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Att använda handlebars-mallar med semantisk kernel är ett enkelt och effektivt sätt att skapa dynamiska frågor för dina program. Syntaxen för Handlebars är enkel att använda och gör att du kan inkludera variabler, hantera uppmaningar i YAML för bättre organisation och integrera AI-drivna funktioner sömlöst. Den här metoden gör dina kommandon mer flexibla, återanvändbara och enklare att underhålla.
Du kan lära dig mer om Handlebars mallar för prompts från Handlebars Guide.