You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:52:14