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

Semantic Kernel+Ollama llama3.1流式工具调用异常问题咨询

Semantic Kernel流式调用不执行插件的问题解决

为啥非流式能自动执行,流式不行?

这不是Bug,是Semantic Kernel的设计差异:

  • GetChatMessageContentAsync是非流式方法,会等模型返回完整的工具调用指令后,自动触发插件执行,这是内置的同步处理逻辑。
  • GetStreamingChatMessageContentsAsync是流式返回,模型输出是分段传输的,SK没法在没收到完整JSON的情况下判断要不要执行函数,所以默认只返回原始内容,不会自动处理工具调用。

要让流式也执行插件,得手动处理

你需要自己把流式返回的片段拼起来,解析出工具调用指令,再手动触发插件执行,步骤如下:

  1. 把流式返回的每一段内容拼接成完整的工具调用JSON。
  2. 用SK的解析器把JSON转成可识别的函数调用对象。
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:27:04