按照微软官方帮助文档 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>
通过 Semantic Kernel 的源码 ClientCore.cs#L289 知道了,原来需要在实现 IChatCompletionService
接口时自己实现
看来还需要模型本身的支持,即使换成 OpenAIChatCompletionService
,借助 one-api 调用 DashScope api 也是同样的问题
使用 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"
}
@dudu: 是one-api的问题还是阿里千问的问题,我感觉one-api这种模式的问题,需要自己去实现IChatCompletionService,Microsoft.SemanticKernel.Connectors.OpenAI是可以调用[KernelFunction] 方法的(AzureOpenAI和OpenAI用gpt-4-1106-Preview都可以调用)
@selfimprover: 是 DashScope 的问题,当时还不支持 function calling,后来支持了
@dudu: 感谢dudu回复,现在我们也在用sk对接国内大模型,支持function calling的sdk有推荐的么?
@selfimprover: 我们自己实现的 dashscope sdk 已经支持,欢迎试用,有问题提交 issue https://github.com/cnblogs/dashscope-sdk
需要注意的是 dashscope 本身对 function calling 的支持还不完善,目前不支持 incremental output, 详见 https://github.com/cnblogs/semantic-kernel-dashscope/issues/17
@dudu: 感谢贡献,我这边接入千问时使用下。
@dudu:
你好,function calling调用的话,需要引用Cnblogs.DashScope.Sdk包,且必须以图中的方式进行调用么?
@selfimprover: 这两天我们发一篇示例博文
@dudu:我已经基于您这边的包,测试了function calling调用,是可以的
@selfimprover: 嗯,解决了就好