Semantic Kernel Agent流程事件流问题:条件生成图片需求
解决Semantic Kernel代理系统条件生成图片的问题
核心问题是ImageCreatorStep无法正确读取UserInputState中的图片偏好,导致流程无条件执行图片生成。以下是针对性解决方案:
1. 确认状态类定义与赋值逻辑
首先确保状态类包含明确的图片偏好字段,且在询问用户的步骤中正确更新状态:
// 定义全局共享状态类 public class UserInputState { public string UserRequest { get; set; } = string.Empty; // 标记是否需要图片 public bool NeedImage { get; set; } = false; } // 询问用户是否需要图片的步骤函数 [KernelFunction] public async Task<string> AskImagePreferenceStep(Kernel kernel, UserInputState state) { // 获取用户输入的图片偏好 var userResponse = await kernel.InvokePromptAsync("请回答是否需要为你的请求生成图片(是/否)"); var needImage = userResponse.ToString().Trim().Equals("是", StringComparison.OrdinalIgnoreCase); // 将偏好写入共享状态 state.NeedImage = needImage; return needImage ? "确认需要图片" : "确认无需图片"; }
2. 在图片生成步骤中添加条件判断
修改ImageCreatorStep,先读取状态中的NeedImage字段,仅当值为true时执行图片生成逻辑:
[KernelFunction] public async Task<string> ImageCreatorStep(Kernel kernel, UserInputState state) { // 先判断状态中的图片偏好 if (!state.NeedImage) { return "无需生成图片,将直接返回文本响应"; } // 仅当需要图片时执行生成逻辑 var imageGenerationResult = await kernel.InvokePromptAsync( $"生成与以下内容相关的图片:{state.UserRequest}", new PromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions } ); return $"生成的图片链接:{imageGenerationResult}"; }
3. 配置流程的条件分支(针对Planner场景)
如果使用Semantic Kernel的Planner组件,需要为图片生成步骤添加执行条件,确保仅当状态满足时才执行:
var planner = new FunctionCallingStepwisePlanner(kernel); var planOptions = new PlanCreationOptions { Goal = "处理用户请求,根据用户偏好决定是否生成图片", InitialState = new UserInputState { UserRequest = "用户的具体请求内容" }, // 定义步骤的执行条件 Steps = new List<Step> { new Step { FunctionName = nameof(AskImagePreferenceStep) }, new Step { FunctionName = nameof(ImageCreatorStep), // 绑定条件:仅当NeedImage为true时执行 Condition = (state) => ((UserInputState)state).NeedImage } } }; var plan = await planner.CreatePlanAsync(planOptions); await plan.InvokeAsync(kernel);
4. 调试状态传递问题
如果仍然无法读取状态,可在步骤中添加调试输出,确认状态是否正确传递:
[KernelFunction] public async Task<string> ImageCreatorStep(Kernel kernel, UserInputState state) { // 调试输出当前状态值,排查是否传递成功 Console.WriteLine($"当前状态中NeedImage的值:{state.NeedImage}"); if (!state.NeedImage) { return "无需生成图片"; } // 图片生成逻辑... }
内容的提问来源于stack exchange,提问作者hanushi-thana
相关产品推荐
相关产品推荐

