SemanticKernel 1.0.0-rc4及后续版本如何拦截最终渲染提示词?
在SemanticKernel 1.0.0-rc4及后续版本中拦截最终渲染提示词的方案
SemanticKernel 1.0.0-rc4版本移除了原有的PromptRendered事件,替代方案主要有以下几种:
1. 实现自定义IPromptRenderFilter过滤器
通过实现IPromptRenderFilter接口,可以在提示词渲染的生命周期中拦截最终结果:
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.PromptTemplates; public class PromptRenderLogger : IPromptRenderFilter { public Task OnPromptRenderAsync(PromptRenderContext context, Func<PromptRenderContext, Task> next) { // 监听渲染完成事件 context.RenderedPromptChanged += (_, args) => { Console.WriteLine($"最终渲染提示词:\n{args.NewValue}"); }; return next(context); } }
注册过滤器到Kernel构建器:
var kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion("gpt-3.5-turbo", "你的API密钥") .AddPromptRenderFilter<PromptRenderLogger>() .Build();
2. 启用内置日志系统
SemanticKernel会在Debug级别日志中输出渲染后的提示词,只需配置日志输出即可:
using Microsoft.Extensions.Logging; var kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion("gpt-3.5-turbo", "你的API密钥") .AddLogging(config => { config.AddConsole(); config.SetMinimumLevel(LogLevel.Debug); }) .Build();
运行后,控制台日志中会包含标记为Rendered prompt的条目,直接查看即可。
3. 手动获取渲染结果(适用于直接调用模板场景)
如果是手动触发提示词渲染,可以直接获取返回的渲染结果:
var template = kernel.CreatePromptTemplate("问候语:{{$greeting}},姓名:{{$name}}", new PromptTemplateConfig()); var context = kernel.CreateNewContextWithVariables(new() { ["greeting"] = "你好", ["name"] = "李四" }); var renderedPrompt = await template.RenderAsync(context); Console.WriteLine(renderedPrompt);
内容的提问来源于stack exchange,提问作者mehrandvd
相关产品推荐
相关产品推荐

