提示词函数 #
概述 #
提示词函数(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