C产品如何满足特定用户需求?
- 内容介绍
- 文章标签
- 相关推荐
本文共计799个文字,预计阅读时间需要4分钟。
直接输出结果如下:
初始化 Kernel 时必须注册 ChatCompletionService
SK 的 Kernel 不是“造好就能用”的容器,它默认不带任何 AI 能力——所有 LLM 调用都依赖你手动注入的服务实现。哪怕只是测试,也得选一个:云端或本地。
- 用 OpenAI:调
AddOpenAIChatCompletion("gpt-4o", apiKey),注意 endpoint 默认是"https://api.openai.com/v1",国内需配代理或换源 - 用 Azure OpenAI:必须传
deploymentName、endpoint、apiKey,三者缺一不可;deploymentName不是模型名,是你在 Azure 门户里部署时填的名称(比如"gpt-4o-us-east") - 用 Ollama 本地模型:得走
AddOllamaChatCompletion("llama3.2", "http://localhost:11434"),包名是Microsoft.SemanticKernel.Connectors.Ollama,别只装主包 - 不注册服务就调
InvokePromptAsync,运行时报错位置在KernelExtensions.InvokePromptAsync内部,堆栈不提示具体缺啥,容易卡住排查
InvokePromptAsync 是最简验证路径,但返回值要手动取
别一上来就写 plugin 或 planning,先确认 token、网络、权限全通。用 InvokePromptAsync 直连模型最快,但它返回的是 FunctionResult 对象,不是字符串。
-
result.GetValue<string>()才拿到实际文本,不加泛型会编译失败 - 如果 prompt 返回空或 JSON 解析异常,
GetValue<string>()可能抛InvalidOperationException,建议包一层result.ToString()做兜底 - 该方法绕过 SK 的函数编排机制,不走
Planner,也不触发Filter,适合纯推理场景,不适合需要结构化输出的流程
定义 Semantic Function 必须带 description,且只收字符串参数
语义函数本质是带元信息的 prompt 模板,不是 C# 方法封装。SK 靠 description 字段做自动规划(planning),没它就无法被 Planner 识别和调用。
- 模板里用
{{input}}接主输入,用{{userName}}这类命名占位符接额外参数,传参必须是new() { ["userName"] = "张三" }这种字典形式 - 不能传对象、不能重载、不能有默认参数——所有输入最终都会被转成字符串拼进 prompt
- 函数注册后,名字(
functionName)和插件名(pluginName)共同构成唯一标识,重复注册会静默覆盖,调试时留意日志里是否真加载成功
最容易被忽略的是:SK v1.0+ 已放弃对 .NET Framework 的支持,所有项目必须基于 .NET 6/7/8 SDK;哪怕 dotnet --list-sdks 显示有多个版本,也要确认 csproj 里 <TargetFramework> 明确指向 net6.0 或更高。否则编译通过、运行时报 MissingMethodException,根源在底层 connector 的异步流实现差异。
本文共计799个文字,预计阅读时间需要4分钟。
直接输出结果如下:
初始化 Kernel 时必须注册 ChatCompletionService
SK 的 Kernel 不是“造好就能用”的容器,它默认不带任何 AI 能力——所有 LLM 调用都依赖你手动注入的服务实现。哪怕只是测试,也得选一个:云端或本地。
- 用 OpenAI:调
AddOpenAIChatCompletion("gpt-4o", apiKey),注意 endpoint 默认是"https://api.openai.com/v1",国内需配代理或换源 - 用 Azure OpenAI:必须传
deploymentName、endpoint、apiKey,三者缺一不可;deploymentName不是模型名,是你在 Azure 门户里部署时填的名称(比如"gpt-4o-us-east") - 用 Ollama 本地模型:得走
AddOllamaChatCompletion("llama3.2", "http://localhost:11434"),包名是Microsoft.SemanticKernel.Connectors.Ollama,别只装主包 - 不注册服务就调
InvokePromptAsync,运行时报错位置在KernelExtensions.InvokePromptAsync内部,堆栈不提示具体缺啥,容易卡住排查
InvokePromptAsync 是最简验证路径,但返回值要手动取
别一上来就写 plugin 或 planning,先确认 token、网络、权限全通。用 InvokePromptAsync 直连模型最快,但它返回的是 FunctionResult 对象,不是字符串。
-
result.GetValue<string>()才拿到实际文本,不加泛型会编译失败 - 如果 prompt 返回空或 JSON 解析异常,
GetValue<string>()可能抛InvalidOperationException,建议包一层result.ToString()做兜底 - 该方法绕过 SK 的函数编排机制,不走
Planner,也不触发Filter,适合纯推理场景,不适合需要结构化输出的流程
定义 Semantic Function 必须带 description,且只收字符串参数
语义函数本质是带元信息的 prompt 模板,不是 C# 方法封装。SK 靠 description 字段做自动规划(planning),没它就无法被 Planner 识别和调用。
- 模板里用
{{input}}接主输入,用{{userName}}这类命名占位符接额外参数,传参必须是new() { ["userName"] = "张三" }这种字典形式 - 不能传对象、不能重载、不能有默认参数——所有输入最终都会被转成字符串拼进 prompt
- 函数注册后,名字(
functionName)和插件名(pluginName)共同构成唯一标识,重复注册会静默覆盖,调试时留意日志里是否真加载成功
最容易被忽略的是:SK v1.0+ 已放弃对 .NET Framework 的支持,所有项目必须基于 .NET 6/7/8 SDK;哪怕 dotnet --list-sdks 显示有多个版本,也要确认 csproj 里 <TargetFramework> 明确指向 net6.0 或更高。否则编译通过、运行时报 MissingMethodException,根源在底层 connector 的异步流实现差异。

