Semantic Kernel+Ollama llama3.1流式工具调用异常问题咨询
Semantic Kernel流式调用不执行插件的问题解决
为啥非流式能自动执行,流式不行?
这不是Bug,是Semantic Kernel的设计差异:
GetChatMessageContentAsync是非流式方法,会等模型返回完整的工具调用指令后,自动触发插件执行,这是内置的同步处理逻辑。GetStreamingChatMessageContentsAsync是流式返回,模型输出是分段传输的,SK没法在没收到完整JSON的情况下判断要不要执行函数,所以默认只返回原始内容,不会自动处理工具调用。
要让流式也执行插件,得手动处理
你需要自己把流式返回的片段拼起来,解析出工具调用指令,再手动触发插件执行,步骤如下:
- 把流式返回的每一段内容拼接成完整的工具调用JSON。
- 用SK的解析器把JSON转成可识别的函数调用对象。
- 调用
Kernel.InvokeAsync执行对应的插件函数。
给你个代码示例参考:
var streamingResults = kernel.GetStreamingChatMessageContentsAsync(chatHistory); StringBuilder toolCallJson = new StringBuilder(); await foreach (var content in streamingResults) { if (content.Role == AuthorRole.Assistant) { toolCallJson.Append(content.Content); // 尝试解析完整的工具调用JSON try { var functionCall = JsonSerializer.Deserialize<FunctionCallContent>(toolCallJson.ToString()); if (functionCall != null && !string.IsNullOrEmpty(functionCall.Name)) { // 执行插件函数 var execResult = await kernel.InvokeAsync(functionCall.Name, functionCall.Parameters); // 把执行结果加回对话历史,继续后续交互 chatHistory.AddUserMessage(execResult.ToString()); toolCallJson.Clear(); } } catch (JsonException) { // 还没收到完整的JSON,继续拼接就行 continue; } } }
最后检查下配置
确保这几点没弄错:
- Ollama启动时加了
--enable-function-calling参数,开启了工具调用支持。 - 插件已经正确注册到Kernel,而且模型返回的
name字段(LightPlugin-ChangeState)和插件函数的名称完全一致。 - 对话历史里已经添加了让模型知晓可调用插件的系统提示,别漏了。
内容的提问来源于stack exchange,提问作者ZorgoZ
相关产品推荐
相关产品推荐

