在Azure AI Foundry上使用DeepSeek-R1时无法调用Semantic Kernel插件
问题:Semantic Kernel插件在DeepSeek-R1上无法生效
问题背景
通过Semantic Kernel的OpenAI连接器对接Azure部署的DeepSeek-R1大模型,已成功建立连接并获取模型响应,但自定义插件(如包含GetCurrentDate函数的DatePlugin)完全被忽略。询问"当前日期是什么?"时,模型返回"您好!建议您联网获取实时信息。如果您有其他问题,请随时告诉我!",而非调用插件函数获取本地日期。
可能原因
- 模型工具调用支持不足:部分兼容OpenAI接口的模型可能未原生支持工具调用(Function Calling),或对工具描述的格式识别存在差异。
- Semantic Kernel配置遗漏:使用
ChatCompletionAgent时,可能未正确触发工具调用的自动执行逻辑;或FunctionChoiceBehavior配置未被模型正确识别。 - Azure端点API版本不匹配:Semantic Kernel的OpenAI连接器依赖特定API版本(如支持工具调用的
2024-02-15-preview),若端点使用旧版本可能导致工具调用失效。
解决方案
1. 验证模型的工具调用能力
先通过直接API请求验证DeepSeek-R1是否支持工具调用:
- 构造如下请求发送到Azure模型端点(替换占位符为实际信息):
POST https://<your-azure-endpoint>/openai/deployments/DeepSeek-R1/chat/completions?api-version=2024-02-15-preview Headers: Content-Type: application/json api-key: <your-api-key> Body: { "messages": [{"role": "user", "content": "当前日期是什么?"}], "tools": [ { "type": "function", "function": { "name": "GetCurrentDate", "description": "返回当前UTC日期,格式为完整日期字符串", "parameters": { "type": "object", "properties": {}, "required": [] } } } ], "tool_choice": "auto" }
- 若响应包含
tool_call字段,说明模型支持工具调用;若返回普通文本,需确认模型部署是否开启工具调用能力,或联系模型提供商确认支持情况。
2. 调整Semantic Kernel代码配置
替换ChatCompletionAgent为直接调用IChatCompletionService,并明确配置工具调用逻辑:
// 原代码中ChatCompletionAgent相关部分替换为: var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>(); var executionSettings = new OpenAIPromptExecutionSettings { // 自动选择是否调用工具,测试阶段可改为强制调用指定函数 FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(), // FunctionChoiceBehavior = FunctionChoiceBehavior.ForceFunction("GetCurrentDate") }; // 启用自动工具调用 var result = await chatCompletionService.GetChatMessageContentAsync( history, executionSettings, kernel); Console.WriteLine(result.Content);
3. 指定兼容的API版本
在添加OpenAI连接器时明确指定支持工具调用的API版本:
builder.AddOpenAIChatCompletion( modelId: "DeepSeek-R1", endpoint: new Uri(MY_AZURE_OPENAI_ENDPOINT), apiKey: MY_API_KEY, apiVersion: "2024-02-15-preview"); // 确保版本支持工具调用
4. 优化插件函数描述
确保插件函数的描述足够清晰,帮助模型识别用途:
public class DatePlugin { [KernelFunction()] [Description("获取当前UTC日期,返回格式为完整的日期字符串(例如:2024年5月20日)")] [return: Description("当前UTC日期的字符串表示")] public string GetCurrentDate() => DateOnly.FromDateTime(DateTime.UtcNow).ToString("D"); }
5. 查看日志排查流程
利用已配置的Trace日志,查看以下关键信息:
- 是否有工具描述被发送到模型的日志
- 模型响应是否包含
tool_call指令 - Semantic Kernel是否尝试执行插件函数
结论
该场景是可行的,核心前提是DeepSeek-R1模型支持工具调用能力,同时Semantic Kernel的配置需匹配模型的接口要求。通过上述步骤逐一排查,可解决插件被忽略的问题。
内容的提问来源于stack exchange,提问作者jbl
相关产品推荐
相关产品推荐

