C产品如何满足特定用户需求?

2026-04-29 07:582阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计799个文字,预计阅读时间需要4分钟。

C产品如何满足特定用户需求?

直接输出结果如下:

初始化 Kernel 时必须注册 ChatCompletionService

SK 的 Kernel 不是“造好就能用”的容器,它默认不带任何 AI 能力——所有 LLM 调用都依赖你手动注入的服务实现。哪怕只是测试,也得选一个:云端或本地。

  • 用 OpenAI:调 AddOpenAIChatCompletion("gpt-4o", apiKey),注意 endpoint 默认是 "https://api.openai.com/v1",国内需配代理或换源
  • 用 Azure OpenAI:必须传 deploymentNameendpointapiKey,三者缺一不可;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 的异步流实现差异。

标签:AIC

本文共计799个文字,预计阅读时间需要4分钟。

C产品如何满足特定用户需求?

直接输出结果如下:

初始化 Kernel 时必须注册 ChatCompletionService

SK 的 Kernel 不是“造好就能用”的容器,它默认不带任何 AI 能力——所有 LLM 调用都依赖你手动注入的服务实现。哪怕只是测试,也得选一个:云端或本地。

  • 用 OpenAI:调 AddOpenAIChatCompletion("gpt-4o", apiKey),注意 endpoint 默认是 "https://api.openai.com/v1",国内需配代理或换源
  • 用 Azure OpenAI:必须传 deploymentNameendpointapiKey,三者缺一不可;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 的异步流实现差异。

标签:AIC