提示词函数 #

概述 #

提示词函数(Prompt Function)是基于提示词模板创建的语义函数。它将提示词封装为可复用的函数单元,支持参数传递、执行配置和结果处理。

创建提示词函数 #

基本创建 #

csharp
var summarizeFunction = kernel.CreateFunctionFromPrompt(
    promptTemplate: "请总结以下文本:{{$input}}",
    functionName: "Summarize",
    description: "总结文本内容"
);

完整配置 #

csharp
using Microsoft.SemanticKernel.Connectors.OpenAI;

var function = kernel.CreateFunctionFromPrompt(
    promptTemplate: """
        请分析以下文本的情感:
        
        文本:{{$input}}
        
        请返回:positive、negative 或 neutral
        """,
    functionName: "AnalyzeSentiment",
    description: "分析文本情感倾向",
    executionSettings: new OpenAIPromptExecutionSettings
    {
        MaxTokens = 50,
        Temperature = 0.3
    },
    inputVariables: new[]
    {
        new InputVariable
        {
            Name = "input",
            Description = "需要分析的文本",
            IsRequired = true
        }
    }
);

从文件创建 #

text
Prompts/
└── Translate/
    ├── config.json
    └── skprompt.txt
csharp
var plugin = kernel.ImportPluginFromPromptDirectory("./Prompts", "TextPlugin");
var translateFunction = plugin["Translate"];

调用提示词函数 #

直接调用 #

csharp
var result = await kernel.InvokeAsync(
    summarizeFunction,
    new KernelArguments
    {
        ["input"] = "这是一段很长的文本..."
    }
);

Console.WriteLine(result);

通过插件调用 #

csharp
kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions(
    "TextPlugin",
    new[] { summarizeFunction }
));

var result = await kernel.InvokeAsync(
    "TextPlugin",
    "Summarize",
    new KernelArguments { ["input"] = "文本内容..." }
);

使用 InvokePromptAsync #

csharp
// 简单方式:直接执行提示词
var result = await kernel.InvokePromptAsync(
    "请总结:{{$input}}",
    new KernelArguments { ["input"] = "文本..." }
);

参数传递 #

基本参数 #

csharp
var function = kernel.CreateFunctionFromPrompt(
    "你好{{$name}},你今年{{$age}}岁,来自{{$city}}"
);

var result = await kernel.InvokeAsync(
    function,
    new KernelArguments
    {
        ["name"] = "小明",
        ["age"] = 25,
        ["city"] = "北京"
    }
);

复杂参数 #

csharp
public class UserInfo
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string[] Interests { get; set; }
}

var function = kernel.CreateFunctionFromPrompt(
    """
    用户信息:
    姓名:{{$name}}
    年龄:{{$age}}
    兴趣:{{$interests}}
    
    请为这位用户推荐合适的书籍。
    """
);

var user = new UserInfo
{
    Name = "小明",
    Age = 25,
    Interests = new[] { "编程", "AI", "阅读" }
};

var result = await kernel.InvokeAsync(
    function,
    new KernelArguments
    {
        ["name"] = user.Name,
        ["age"] = user.Age,
        ["interests"] = string.Join("、", user.Interests)
    }
);

默认参数值 #

csharp
var function = kernel.CreateFunctionFromPrompt(
    promptTemplate: "请用{{$language}}回答:{{$question}}",
    inputVariables: new[]
    {
        new InputVariable
        {
            Name = "question",
            Description = "问题",
            IsRequired = true
        },
        new InputVariable
        {
            Name = "language",
            Description = "回答语言",
            IsRequired = false,
            Default = "中文"
        }
    }
);

// 使用默认语言
var result1 = await kernel.InvokeAsync(
    function,
    new KernelArguments { ["question"] = "什么是 AI?" }
);

// 指定语言
var result2 = await kernel.InvokeAsync(
    function,
    new KernelArguments
    {
        ["question"] = "What is AI?",
        ["language"] = "English"
    }
);

执行配置 #

温度和 Token 限制 #

csharp
var creativeFunction = kernel.CreateFunctionFromPrompt(
    "写一首关于{{$topic}}的诗",
    executionSettings: new OpenAIPromptExecutionSettings
    {
        Temperature = 0.9,  // 更高的创造性
        MaxTokens = 500
    }
);

var preciseFunction = kernel.CreateFunctionFromPrompt(
    "翻译:{{$text}}",
    executionSettings: new OpenAIPromptExecutionSettings
    {
        Temperature = 0.1,  // 更精确
        MaxTokens = 200
    }
);

动态执行设置 #

csharp
var settings = new OpenAIPromptExecutionSettings
{
    Temperature = 0.7,
    MaxTokens = 500
};

var arguments = new KernelArguments(settings)
{
    ["input"] = "文本内容"
};

var result = await kernel.InvokeAsync(function, arguments);

多服务配置 #

csharp
// 为不同模型配置不同参数
var function = kernel.CreateFunctionFromPrompt(
    "分析:{{$input}}",
    executionSettings: new Dictionary<string, PromptExecutionSettings>
    {
        ["gpt-4"] = new OpenAIPromptExecutionSettings
        {
            MaxTokens = 2000,
            Temperature = 0.5
        },
        ["gpt-3.5-turbo"] = new OpenAIPromptExecutionSettings
        {
            MaxTokens = 1000,
            Temperature = 0.7
        }
    }
);

// 使用特定服务
var result = await kernel.InvokeAsync(
    function,
    arguments,
    serviceName: "gpt-4"
);

结果处理 #

获取字符串结果 #

csharp
var result = await kernel.InvokeAsync(function, arguments);
string text = result.ToString();

获取元数据 #

csharp
var result = await kernel.InvokeAsync(function, arguments);

var metadata = result.Metadata;
if (metadata != null)
{
    var usage = metadata.GetValue<Dictionary<string, object>>("Usage");
    Console.WriteLine($"Prompt Tokens: {usage?["PromptTokens"]}");
    Console.WriteLine($"Completion Tokens: {usage?["CompletionTokens"]}");
    Console.WriteLine($"Total Tokens: {usage?["TotalTokens"]}");
}

获取结构化结果 #

csharp
public class AnalysisResult
{
    public string Sentiment { get; set; }
    public double Confidence { get; set; }
    public string[] Keywords { get; set; }
}

var function = kernel.CreateFunctionFromPrompt(
    """
    分析以下文本,返回 JSON 格式:
    {"sentiment": "positive/negative/neutral", "confidence": 0.0-1.0, "keywords": ["word1", "word2"]}
    
    文本:{{$input}}
    """
);

var result = await kernel.InvokeAsync(function, arguments);
var analysis = JsonSerializer.Deserialize<AnalysisResult>(result.ToString());

函数组合 #

链式调用 #

csharp
// 定义多个函数
var translateFunction = kernel.CreateFunctionFromPrompt(
    "翻译成英文:{{$input}}",
    functionName: "Translate"
);

var summarizeFunction = kernel.CreateFunctionFromPrompt(
    "总结以下内容:{{$input}}",
    functionName: "Summarize"
);

// 链式执行
var text = "这是一段中文文本...";
var translated = await kernel.InvokeAsync(
    translateFunction,
    new KernelArguments { ["input"] = text }
);

var summarized = await kernel.InvokeAsync(
    summarizeFunction,
    new KernelArguments { ["input"] = translated.ToString() }
);

使用管道 #

csharp
public static async Task<string> PipelineAsync(
    Kernel kernel,
    string input,
    params KernelFunction[] functions)
{
    var current = input;
    
    foreach (var function in functions)
    {
        var result = await kernel.InvokeAsync(
            function,
            new KernelArguments { ["input"] = current }
        );
        current = result.ToString();
    }
    
    return current;
}

// 使用
var result = await PipelineAsync(
    kernel,
    "原始文本",
    translateFunction,
    summarizeFunction,
    formatFunction
);

流式执行 #

基本流式 #

csharp
var function = kernel.CreateFunctionFromPrompt(
    "写一篇关于{{$topic}}的文章"
);

await foreach (var chunk in kernel.InvokeStreamingAsync(
    function,
    new KernelArguments { ["topic"] = "人工智能" }))
{
    Console.Write(chunk);
}

处理流式内容 #

csharp
var fullContent = new StringBuilder();

await foreach (var streamingContent in kernel.InvokeStreamingAsync<StreamingChatMessageContent>(
    function,
    arguments))
{
    if (streamingContent.Content != null)
    {
        Console.Write(streamingContent.Content);
        fullContent.Append(streamingContent.Content);
    }
}

Console.WriteLine("\n完整内容:");
Console.WriteLine(fullContent.ToString());

高级用法 #

条件执行 #

csharp
var function = kernel.CreateFunctionFromPrompt(
    """
    {{if detailed}}
    请提供详细的分析报告,包括:
    1. 概述
    2. 详细分析
    3. 结论和建议
    {{else}}
    请简要分析。
    {{end}}
    
    内容:{{$input}}
    """,
    inputVariables: new[]
    {
        new InputVariable { Name = "input", IsRequired = true },
        new InputVariable { Name = "detailed", IsRequired = false, Default = "false" }
    }
);

多语言支持 #

csharp
var function = kernel.CreateFunctionFromPrompt(
    """
    请用{{$language}}回答以下问题:
    {{$question}}
    
    回答要求:
    - 语言自然流畅
    - 内容准确专业
    - 适当举例说明
    """
);

var languages = new[] { "中文", "英文", "日文" };
var question = "什么是机器学习?";

foreach (var lang in languages)
{
    var result = await kernel.InvokeAsync(
        function,
        new KernelArguments
        {
            ["language"] = lang,
            ["question"] = question
        }
    );
    
    Console.WriteLine($"=== {lang} ===");
    Console.WriteLine(result);
}

最佳实践 #

1. 清晰的函数描述 #

csharp
var function = kernel.CreateFunctionFromPrompt(
    promptTemplate: "...",
    functionName: "AnalyzeSentiment",
    description: """
        分析文本的情感倾向。
        
        输入:文本内容
        输出:positive、negative 或 neutral
        
        适用场景:
        - 产品评论分析
        - 社交媒体监控
        - 客户反馈处理
        """
);

2. 合理的参数设计 #

csharp
var function = kernel.CreateFunctionFromPrompt(
    "...",
    inputVariables: new[]
    {
        new InputVariable
        {
            Name = "text",
            Description = "需要分析的文本,建议不超过 1000 字",
            IsRequired = true
        },
        new InputVariable
        {
            Name = "detail_level",
            Description = "分析详细程度:brief/normal/detailed",
            IsRequired = false,
            Default = "normal"
        }
    }
);

3. 错误处理 #

csharp
try
{
    var result = await kernel.InvokeAsync(function, arguments);
    return result.ToString();
}
catch (HttpOperationException ex)
{
    // API 错误
    return $"服务暂时不可用:{ex.Message}";
}
catch (KernelException ex)
{
    // Kernel 错误
    return $"处理失败:{ex.Message}";
}

下一步 #

现在你已经掌握了提示词函数,接下来学习 Handlebars 模板,了解更强大的模板功能!

最后更新:2026-04-04