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

如何让Semantic Kernel插件方法返回原文字符串而非重写内容?

问题

我开发了一个调用各类插件方法的C# Semantic Kernel应用,每个方法均返回字符串值,期望将该字符串原封不动返回给用户,但Semantic Kernel会对其重新措辞并生成自定义响应。请问是否可以关闭该功能?

示例场景:预期输出应为ChangeStateAsync()的返回值I turned the Table lamp on,但实际返回的是类似The table lamp has been turned off的改写内容。同时希望了解其他仍能让OpenAI判断调用函数的建议。


解决方案

方法1:配置执行设置强制返回原始函数结果

Semantic Kernel默认会让大模型改写函数返回结果,可通过调整OpenAIPromptExecutionSettings的参数跳过这一步,直接提取函数的原始输出:

修改核心配置与结果处理逻辑:

// 修改执行设置,启用自动调用并强制返回原始结果
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
    FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),
    // 启用自动调用Kernel函数
    ToolCallBehavior = ToolCallBehavior.EnableAutoInvokeKernelFunctions(kernel),
    // 要求模型直接返回文本格式的原始结果
    ResponseFormat = "text"
};

// 获取响应并提取原始函数输出
var result = await chatCompletionService.GetChatMessageContentAsync(
    history,
    executionSettings: openAIPromptExecutionSettings,
    kernel: kernel);

string rawResponse = result.Content ?? string.Empty;
// 针对新版SK,从附件中提取函数调用的原始结果
if (result.Attachments.Any(a => a is FunctionResultAttachment functionResult))
{
    rawResponse = functionResult.Result.ToString();
}

Console.WriteLine("Assistant > " + rawResponse);

方法2:自定义系统提示词约束模型行为

通过添加明确的系统提示,强制大模型原封不动返回函数输出,不得改写:

// 创建对话历史时注入系统提示
var history = new ChatHistory(@"你是工具调用助手,调用工具后必须直接返回工具的原始输出内容,绝对不能进行任何改写、措辞调整或补充说明。");

方法3:使用KernelFunctionResult明确控制输出

在插件方法中返回KernelFunctionResult类型,替代直接返回字符串,让Semantic Kernel明确识别这是无需改写的最终结果:

[KernelFunction("change_state")]
[Description("Changes the state of the light")]
[return: Description("The updated state of the light; will return null if the light does not exist.")]
public Task<KernelFunctionResult> ChangeStateAsync([Description("the identifier of the light")] int id, bool isOn)
{
    var light = lights.FirstOrDefault(l => l.Id == id);

    if (light == null)
    {
        return Task.FromResult(KernelFunctionResult.CreateSuccess("I couldn't locate that light"));
    }

    light.IsOn = isOn;
    var onOrOffString = isOn ? "on" : "off";
    var response = $"I turned the {light.Name} {onOrOffString}";
    
    return Task.FromResult(KernelFunctionResult.CreateSuccess(response));
}

其他优化OpenAI函数判断的建议
  • 细化插件描述:优化[Description]属性的表述,让大模型清晰理解函数用途。例如将change_state的描述改为"根据灯光ID切换指定灯光的开关状态,参数isOn为true时打开灯光,为false时关闭灯光"。
  • 添加参数校验:在插件方法中增加参数合法性检查(如ID范围验证),减少无效调用,同时让大模型更明确参数要求。
  • 启用日志排查:保留示例中的日志配置(LogLevel.Trace),通过日志查看大模型的工具调用决策过程,针对性优化提示词或插件定义。

内容的提问来源于stack exchange,提问作者jc116

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:43:13