首页 新闻 会员 周边

Semantic Kernel 结合通义千问遇到 AutoInvokeKernelFunctions 不能正常工作的问题

0
悬赏园豆:30 [待解决问题]

按照微软官方帮助文档 What is Semantic Kernel? 中的代码,以阿里云灵积 DashScope 作为 chat completion service 调用通义千问大模型,却没有执行 LightPlugin 中的 [KernelFunction] 方法,也就是 ToolCallBehavior.AutoInvokeKernelFunctions 设置没有起作用,请问如何解决?

实现代码如下

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Plugins;

var builder = Kernel.CreateBuilder();
builder.AddDashScopeChatCompletion("qwen-max", "sk-xxxxxx");
builder.Plugins.AddFromType<LightPlugin>();
var kernel = builder.Build();

ChatHistory history = [];

var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

while (true)
{
    Console.Write("User > ");
    history.AddUserMessage(Console.ReadLine()!);

    OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
    {
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
    };

    var result = await chatCompletionService.GetChatMessageContentAsync(
        history,
        executionSettings: openAIPromptExecutionSettings,
        kernel: kernel);

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

    history.AddMessage(result.Role, result.Content);
}

引用的 nuget 包

<ItemGroup>
  <PackageReference Include="Cnblogs.SemanticKernel.Connectors.DashScope" Version="0.1.2" />
  <PackageReference Include="Microsoft.SemanticKernel" Version="1.3.1" />
</ItemGroup>
dudu的主页 dudu | 高人七级 | 园豆:30994
提问于:2024-02-15 10:29
< >
分享
所有回答(1)
0

通过 Semantic Kernel 的源码 ClientCore.cs#L289 知道了,原来需要在实现 IChatCompletionService 接口时自己实现

dudu | 园豆:30994 (高人七级) | 2024-02-15 16:08

看来还需要模型本身的支持,即使换成 OpenAIChatCompletionService ,借助 one-api 调用 DashScope api 也是同样的问题

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2024-02-16 12:09

使用 OpenAIChatCompletionService 时,请求时会包含下面的 json

{
  "tools": [
    {
      "function": { "name": "LightPlugin-GetState", "description": "Gets the state of the light.", "parameters": { "type": "object", "required": [], "properties": {} } },
      "type": "function"
    },
    {
      "function": {
        "name": "LightPlugin-ChangeState",
        "description": "Changes the state of the light.\u0027",
        "parameters": { "type": "object", "required": ["newState"], "properties": { "newState": { "type": "boolean" } } }
      },
      "type": "function"
    }
  ],
  "tool_choice": "auto"
}
支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2024-02-17 08:46

@dudu: 是one-api的问题还是阿里千问的问题,我感觉one-api这种模式的问题,需要自己去实现IChatCompletionService,Microsoft.SemanticKernel.Connectors.OpenAI是可以调用[KernelFunction] 方法的(AzureOpenAI和OpenAI用gpt-4-1106-Preview都可以调用)

支持(0) 反对(0) selfimprover | 园豆:200 (初学一级) | 2024-04-11 14:15

@selfimprover: 是 DashScope 的问题,当时还不支持 function calling,后来支持了

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2024-04-11 15:05

@dudu: 感谢dudu回复,现在我们也在用sk对接国内大模型,支持function calling的sdk有推荐的么?

支持(0) 反对(0) selfimprover | 园豆:200 (初学一级) | 2024-04-11 16:54

@selfimprover: 我们自己实现的 dashscope sdk 已经支持,欢迎试用,有问题提交 issue https://github.com/cnblogs/dashscope-sdk

需要注意的是 dashscope 本身对 function calling 的支持还不完善,目前不支持 incremental output, 详见 https://github.com/cnblogs/semantic-kernel-dashscope/issues/17

支持(1) 反对(0) dudu | 园豆:30994 (高人七级) | 2024-04-11 17:10

@dudu: 感谢贡献,我这边接入千问时使用下。

支持(0) 反对(0) selfimprover | 园豆:200 (初学一级) | 2024-04-11 17:16

@dudu:
你好,function calling调用的话,需要引用Cnblogs.DashScope.Sdk包,且必须以图中的方式进行调用么?

支持(0) 反对(0) selfimprover | 园豆:200 (初学一级) | 2024-04-17 17:13

@selfimprover: 这两天我们发一篇示例博文

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2024-04-17 20:07

@dudu:我已经基于您这边的包,测试了function calling调用,是可以的

支持(1) 反对(0) selfimprover | 园豆:200 (初学一级) | 2024-04-18 14:20

@selfimprover: 嗯,解决了就好

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2024-04-18 16:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册