想象你是一家公司的创始人,请来了一位代号“老K”的智能管家。老K的过人之处不是力气大,而是会安排:接到“筹备生日派对”的任务后,他会翻开小本本确认主人的甜点喜好,从工具箱里挑选派对装饰和蛋糕预订两样工具,在计划板上排出“先订场地、再生请柬、最后买蛋糕”的顺序,再一步步执行到位。这,就是微软开源的 AI 应用开发框架 Semantic Kernel 的日常。 Semantic Kernel 并不是大模型,也不是聊天机器人,而是一个把大模型、传统代码和记忆系统“编排”起来的管家大脑。它用 Kernel 控制全局,用 Plugin 收纳技能,用 Function 执行动作,用 Planner 拆解任务,用 Memory 记住偏好,最终让开发者用少量代码搭出企业级 AI Agent。本文将用老K管家的一天,带你认识这位最懂编排的 AI 管家。
学完本文,你将理解 SK 的 Kernel-Plugin-Function 三层架构与 Planner 规划原理,掌握用 C#/Python 搭建带工具调用和记忆系统的 AI Agent 的基本方法,是切入企业级 AI 应用开发的一条捷径。
目录
可视化演示
动态演示Semantic Kerne的核心机制,通过采集/分析/决策/反馈四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Semantic Kerne:Sema Semantic Kernel Kernel-Plugin-F 核心机制可视化 Semantic Kerne整体架构与关键组件
核心架构:管家的大脑与工具箱
老K要管好一个家,首先得有个清晰的“班子结构”:大脑负责决策,工具箱负责收纳工具,工具负责具体干活。在 Semantic Kernel 里,这个班子就是 Kernel、Plugin、Function 三层结构。
Kernel 是整个框架的心脏,所有 AI 服务、模型连接、插件注册都汇总到这里;Plugin 是技能包,可以按业务域分成“餐饮技能包”“日程技能包”;Function 是技能包里的最小动作,比如“查询菜谱”“预订蛋糕”。
技术上,Kernel 通过依赖注入把聊天模型、嵌入模型等组装起来。开发者用 KernelFunction 特性标出方法,Kernel 启动时扫描并注册这些函数。调用关系通常是:用户请求进入 Kernel,Kernel 把任务交给 Function 或 Planner,最后由 Function 返回结果。
老K的故事告诉我们:三层架构的妙处在于“各司其职”——大脑不亲自下厨,工具箱不抢角色的活,工具只管把事干完。
插件开发:给工具箱添新工具
想让老K会新技能,就往他工具箱里加一件“工具”。SK 的插件开发有两种常见的“工具”:原生函数和语义函数。
原生函数是一段传统代码,例如用 C# 的 HttpClient 查询订单、用 Python 的 datetime 计算日期,适合确定性强的任务;语义函数则是一段带提示词模板的自然语言描述,让大模型来生成结果,适合开放性任务,比如“帮我写一段生日致辞”。
开发时,开发者只需要定义一个普通类,类里的方法标注为 KernelFunction,然后把这个类作为 Plugin 注册到 Kernel。Kernel 会自动收集可用函数,并在后续调用中按“插件名。函数名”定位。
这就好比给老K的说明书上写清“拉环朝上、按三秒”,工具的作用和用法都清清楚楚,管家才敢放心下单。
规划器设计:拆解任务的小能手
生日派对不会自己办,老K会在计划板上写下:先订场地,再生请柬,最后安排蛋糕。SK 的 Planner 就是这个计划板。
Planner 拿到用户目标后,会利用大模型把目标翻译成一组函数调用步骤。它不像固定接线那样写死流程,而是根据当前可用插件动态生成计划。常见的规划策略包括顺序规划、并行规划和手动规划:顺序规划适合步骤有先后的场景,并行规划适合相互独立的工具调用,手动规划则让开发者显式指定步骤。
实现时,开发者把 Kernel 和插件列表交给 Planner,Planner 返回一个 Plan 对象。这个 Plan 可以被继续嵌套、组合,最终在 Kernel 中逐步执行。步骤越多,Planner 越需要精准的上下文,否则容易“拆错方案”。
老K的计划板不是万能魔法:它只负责“计划”,真正动手还是工具箱里的工具。
记忆系统:管家的小本本
老K能猜中主人想吃巧克力蛋糕,不是因为他聪明到能掐指一算,而是因为他有一个写满偏好记录的小本本。SK 的记忆系统就是这个本本。
SK 把记忆分成两类:对话记忆负责记住对话过程中的线索,比如“刚才说过不吃花生”;语义记忆负责保存长期知识,比如客户偏好、项目资料。语义记忆通常先把文本交给嵌入模型转成向量,再存入向量数据库,检索时同样把提问转为向量,通过相似度找出最相关的记忆。
构建记忆时,常见的做法是切分文本、向量化、写入索引。检索打分用余弦相似度,公式如下:
对老K来说,向量数据库就像一本“可以按意思翻页”的活页本:不用记住页码,只要把问题变成向量,就能找到最相近的那一页。这比人类管家翻本子更快,也更适合企业海量知识。
- 向量 \(\mathbf{v}\) 与 \(\mathbf{u}\)一条记忆和一个问题都会被模型编码成相同长度的数字列表。
- 点积 \(\mathbf{v} \cdot \mathbf{u}\)把两个向量对应位置相乘再求和,衡量它们在同一方向上的重合度。
- 范数 \(\lVert \mathbf{v} \rVert\)向量自身的长度,相当于把每个分量平方、求和、再开根号。
- 余弦相似度将点积除以两个长度,结果越接近 1 表示方向越一致,越接近 -1 表示方向越相反。
Agent构建:从顾问到跑腿
如果说前三部分是能力,那么 Agent 就是把能力串起来独立跑腿的老K。Agent 可以理解用户上下文、规划步骤、调用插件、查记忆,最后反馈结果。
SK 构建 Agent 时,通常用聊天模式把 Planner、插件和记忆聚合到一个循环里:大模型每轮根据对话历史决定调用哪个函数,函数结果再作为上下文传回模型。若任务更复杂,还可以拆成多个 Agent 协作,比如一个 Agent 负责查资料,另一个负责写总结,最后由主 Agent 汇总。
上下文管理是 Agent 稳定运转的关键。函数返回的中间结果、历史对话和记忆片段必须结构化地塞进上下文,否则模型容易被无关信息带偏。
老K从一个“只能听懂命令”的管家,变成了“能自己跑腿办事”的管家;AI Agent 也是如此,关键在于把调度、工具和记忆这三样东西缝合在一起。
企业落地:把管家带进公司
老K的个人能力再强,进入公司也要遵守考勤、保密和汇报制度。SK 能在企业落地,靠的正是这类“制度保障”。
首先,SK 同时支持 C# 与 Python,能融入 .NET 和 Python 两大生态;其次,模型层通过连接器解耦,可以从 Azure OpenAI 切换到其他兼容模型,避免供应商锁定。安全合规方面,SK 提供日志、过滤器、权限校验等机制,让每个函数调用都可审计、可控。性能优化上,则要注意函数粒度、缓存和并发策略,避免大模型重复推理拖慢响应。
更进一步,企业可以把 SK 接入内部知识库、工单系统、CRM,让老K在不越权的前提下帮忙查资料、填工单、写摘要。
老K进公司后终于明白:真正让 AI 生产力落地的,不是单个模型的聪明程度,而是框架对流程、权限和集成的精细管理。
AI 应用场景
企业知识库智能问答
阶段:记忆召回与工具调用
解决的问题:传统知识库靠人工维护 FAQ,检索慢、更新难;SK 用 Memory 把文档向量化,再通过 Plugin 接入内部权限系统。用户提问时,Agent 先召回相关片段,再由大模型生成答案,既准确又可溯源。
具体案例:某制造企业把设备维修手册灌入 SK,现场工程师用自然语言询问“传送带异响怎么办”,Agent 自动定位维修章节,并调用库存插件查询配件编号。
工单自动处理助手
阶段:Planner 规划与函数编排
解决的问题:传统工单分发依赖人工判断,工作量大且容易错;SK 的 Planner 把“处理一张报销工单”拆成“识别类别、核对预算、发送结果”三个函数调用,业务规则用原生函数保证。
具体案例:某 IT 服务台上线 SK Agent,收到“VPN 连不上”的工单后,Plan 先调用账号状态查询函数,再调用生成临时密码的函数,最后自动回填工单系统。
智能会议助理
阶段:多智能体协作与上下文管理
解决的问题:会议纪要和待办整理耗时;SK 支持一个“会议管家” Agent 同时调度语音转写函数、摘要函数和日程插件,并把每个人的偏好存入记忆。
具体案例:某咨询团队每次复盘会后,SK Agent 自动生成纪要、提取行动项,还会根据每个人历史职责分配负责人,并同步到 OA 日程。
Python 演示
class Function: """单个技能动作.""" def __init__(self, name, fn, description=""): self.name = name self.fn = fn self.description = description def invoke(self, **kwargs): return self.fn(**kwargs) class Plugin: """一组相关技能.""" def __init__(self, name): self.name = name self.functions = {} def add(self, function): self.functions[function.name] = function return self class Kernel: """核心调度器.""" def __init__(self): self.plugins = {} self.memory = {} def add_plugin(self, plugin): self.plugins[plugin.name] = plugin return self def get_function(self, full_name): plugin_name, function_name = full_name.split(".", 1) return self.plugins[plugin_name].functions[function_name] def build_planner(): """用映射模拟 Planner 按目标选函数.""" plan_map = { "birthday": ["birthday.generate_card", "catering.order_cake"], "meeting": ["meeting.summarize", "meeting.schedule"], } return plan_map def plan_and_run(kernel, planner, goal): kernel.memory["last_goal"] = goal for full_name in planner.get(goal, []): func = kernel.get_function(full_name) result = func.invoke(goal=goal) kernel.memory[full_name] = result print(f"[{full_name}] -> {result}") def main(): kernel = Kernel() birthday = Plugin("birthday") birthday.add(Function("generate_card", lambda goal, **kw: "卡片: 祝你生日快乐!", "生成祝福卡片")) catering = Plugin("catering") catering.add(Function("order_cake", lambda goal, **kw: "已订草莓蛋糕.", "预订蛋糕")) meeting = Plugin("meeting") meeting.add(Function("summarize", lambda goal, **kw: "会议纪要: 3条待办.", "生成纪要")) meeting.add(Function("schedule", lambda goal, **kw: "已安排会议室.", "安排日程")) kernel.add_plugin(birthday).add_plugin(catering).add_plugin(meeting) planner = build_planner() plan_and_run(kernel, planner, "birthday") print("记忆:", kernel.memory) if __name__ == "__main__": main()
self.functions[function.name] = function把函数登记进插件,等价于给老K的工具箱贴标签。self.plugins[plugin.name] = plugin把插件挂到 Kernel 上,老K才知道家里有哪些工具箱。self.plugins[plugin_name].functions[function_name]按“插件名。函数名”两级路径找到目标工具。planner.get(goal, [])模拟 Planner 根据目标选择函数调用序列。func.invoke(goal=goal)真正执行函数,也就是管家拿起工具干活。kernel.memory[full_name] = result把结果写进记忆,方便下次直接复用。kernel.add_plugin(birthday).add_plugin(catering)一次注册多个插件,Kernel 统一管理。plan_and_run(kernel, planner, "birthday")从用户目标出发,跑通“计划-调用-记忆”全链路。
常见误区
误区我听说 Semantic Kernel 是微软的 AI 框架,以为它就是像 GPT 一样的模型,装好后直接能聊天。
正解SK 是编排框架,不是模型本身。老K管家再聪明,也得先外接一个“大脑”(比如 OpenAI 或本地模型)才能理解对话;SK 负责把模型、插件、记忆串起来。
为何常见:“Kernel”听上去像底层引擎,加上微软 AI 的光环,初学者很容易把它当成模型产物。
误区文档里一会儿 Plugin 一会儿 Function,我感觉它们就是同一个概念,只是叫法不同。
正解Plugin 是收纳箱,Function 是箱子里的一件件工具。调用时写的是“插件名。函数名”,先找箱子再找工具,层次分明。
为何常见:SK 文档常把 Plugin 和 Function 放在一起展示,初学者容易把组合物和成员混为一谈。
误区Planner 既然能规划任务,那开发者只需要写一句“帮我办一场派对”,它就能自己完成所有事情。
正解Planner 只负责拆解步骤,真正执行还是要靠提前写好的 Function。老K计划得再漂亮,没有工具箱里对应的工具,也只能望洋兴叹。
为何常见:“规划”听起来很智能,导致人们高估了 Planner 的边界,忽略了插件和函数的实现成本。
误区这是微软出的框架,应该只能配合 C# 和 Azure OpenAI,其他语言和模型可能用不了。
正解SK 官方同时支持 C# 和 Python,模型层也有连接器,可以换成 OpenAI、开源模型甚至内部部署的模型,不是锁死在 Azure 上。
为何常见:常见大厂的框架容易让人误以为绑定自家云服务,何况 SK 最初以 C# 为主,中文资料少,加深了这种印象。
面试题
Q1. Semantic Kernel 在 AI 应用中的核心职责是什么?
- A.训练大模型的参数
- B.编排模型插件与函数← 正确答案
- C.替代关系型数据库存储
- D.编译前端页面代码
答案:B。老K管家的大脑负责调度,而不是训练或存储。Kernel 把大模型、Plugin、Function 串起来,让它们协同完成用户请求。
Q2. 在 SK 中,Plugin 插件的主要作用是什么?
- A.将多个函数按场景归组← 正确答案
- B.存储用户长期偏好
- C.负责拆解用户目标
- D.提供模型推理能力
答案:A。Plugin 是函数的集合,像工具箱一样把相关工具归组。用户偏好属于 Memory,目标拆解属于 Planner。
Q3. 原生函数与语义函数的区别是什么?
- A.一个跑代码一个调模型
- B.一个执行代码一个调用模型← 正确答案
- C.一个在云端运行一个在本地
- D.一个同步执行一个异步执行
答案:B。原生函数执行开发者写的代码,确定性高;语义函数通过 Prompt 调用大模型,适合开放生成任务。二者不在于语言、位置或同步方式。
Q4. 关于 Planner 规划器,下列说法正确的是?
- A.它能代替开发者写全部代码
- B.它只能手动编排步骤
- C.它可生成步骤并调度函数← 正确答案
- D.它只在模型训练阶段使用
答案:C。Planner 把目标转成函数调用序列,再交给 Kernel 执行。它不会凭空写代码,也不只用于训练,更不仅限手动。
Q5. SK 的记忆系统通常依赖哪类技术实现语义检索?
- A.向量检索← 正确答案
- B.哈希索引
- C.全文索引
- D.数据压缩
答案:A。语义记忆先把文本转成向量,再用余弦相似度找相近内容。哈希、全文、压缩都不是语义相似度匹配的核心。
Q6. 让 Agent 能连续自主调用多个工具,最关键的是?
- A.提高显卡显存
- B.完善上下文与规划← 正确答案
- C.扩大数据库表
- D.使用更低时延网络
答案:B。Agent 自主行动依赖完整上下文和 Planner 的步骤拆解。硬件或网络只是辅助,不能决定智能体能否连续调用工具。
Q7. Semantic Kernel 目前官方支持哪两种开发语言?
- A.Java 和 Go
- B.C# 和 Rust
- C.C# 和 Python← 正确答案
- D.Python 和 Java
答案:C。SK 官方支持 C# 与 Python,方便 .NET 和 Python 生态接入。Rust、Java、Go 不在官方主推列表中。
Q8. 以下哪些属于 Semantic Kernel 的核心组成?
- A.Kernel 内核← 正确答案
- B.Plugin 插件← 正确答案
- C.Function 函数← 正确答案
- D.GPU 驱动
答案:ABC。Kernel、Plugin、Function 是 SK 的三层核心。GPU 驱动属于硬件基础设施,不属于应用框架组成。
Q9. Planner 常用的规划策略包括哪些?
- A.顺序规划← 正确答案
- B.并行规划← 正确答案
- C.手动规划← 正确答案
- D.数据压缩
答案:ABC。SK Planner 支持按依赖关系顺序执行、互不依赖时并行执行,也允许开发者手动指定步骤。数据压缩与规划无关。
Q10. SK 在企业落地时需要重点考虑哪些问题?
- A.模型选择与切换← 正确答案
- B.安全合规与日志← 正确答案
- C.插件管理与版本← 正确答案
- D.忽略成本与性能
答案:ABC。企业落地要关注模型可替换、安全审计、插件版本治理,同时必须重视成本与性能;完全忽略成本是明显错误。