如何让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
相关产品推荐
相关产品推荐

