想象你是一家公司的创始人,请来了一位代号“老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 应用开发的一条捷径。

目录
  1. 可视化演示
  2. 核心架构:管家的大脑与工具箱
  3. 插件开发:给工具箱添新工具
  4. 规划器设计:拆解任务的小能手
  5. 记忆系统:管家的小本本
  6. Agent构建:从顾问到跑腿
  7. 企业落地:把管家带进公司
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示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来说,向量数据库就像一本“可以按意思翻页”的活页本:不用记住页码,只要把问题变成向量,就能找到最相近的那一页。这比人类管家翻本子更快,也更适合企业海量知识。

similarity(v,u)=v⋅u∥v∥∥u∥=cos⁡(θ)\displaystyle similarity(\mathbf{v}, \mathbf{u}) = \frac{\mathbf{v} \cdot \mathbf{u}}{\lVert \mathbf{v} \rVert \lVert \mathbf{u} \rVert} = \cos(\theta)
两个向量的夹角越小,说明提问和记忆在语义上越接近;分数越高,记忆越值得被召回。
  1. 向量 \(\mathbf{v}\) 与 \(\mathbf{u}\)一条记忆和一个问题都会被模型编码成相同长度的数字列表。
    v=[v1,v2,…,vn],u=[u1,u2,…,un]\mathbf{v} = [v_1, v_2, \dots, v_n], \quad \mathbf{u} = [u_1, u_2, \dots, u_n]
  2. 点积 \(\mathbf{v} \cdot \mathbf{u}\)把两个向量对应位置相乘再求和,衡量它们在同一方向上的重合度。
    v⋅u=∑i=1nvi×ui\mathbf{v} \cdot \mathbf{u} = \sum_{i=1}^{n} v_i \times u_i
  3. 范数 \(\lVert \mathbf{v} \rVert\)向量自身的长度,相当于把每个分量平方、求和、再开根号。
    ∥v∥=∑i=1nvi2\lVert \mathbf{v} \rVert = \sqrt{\sum_{i=1}^{n} v_i^2}
  4. 余弦相似度将点积除以两个长度,结果越接近 1 表示方向越一致,越接近 -1 表示方向越相反。
    similarity∈[−1,1]similarity \in [-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 演示

python80 行
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()
目的:用一段 Python 代码模拟 Semantic Kernel 的 Kernel+Plugin+Function 编排思想,并演示一个简单 Planner 如何按目标调用函数。
  1. self.functions[function.name] = function把函数登记进插件,等价于给老K的工具箱贴标签。
  2. self.plugins[plugin.name] = plugin把插件挂到 Kernel 上,老K才知道家里有哪些工具箱。
  3. self.plugins[plugin_name].functions[function_name]按“插件名。函数名”两级路径找到目标工具。
  4. planner.get(goal, [])模拟 Planner 根据目标选择函数调用序列。
  5. func.invoke(goal=goal)真正执行函数,也就是管家拿起工具干活。
  6. kernel.memory[full_name] = result把结果写进记忆,方便下次直接复用。
  7. kernel.add_plugin(birthday).add_plugin(catering)一次注册多个插件,Kernel 统一管理。
  8. 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 应用中的核心职责是什么?

单选题 · easy

  • A.训练大模型的参数
  • B.编排模型插件与函数← 正确答案
  • C.替代关系型数据库存储
  • D.编译前端页面代码

答案:B。老K管家的大脑负责调度,而不是训练或存储。Kernel 把大模型、Plugin、Function 串起来,让它们协同完成用户请求。

Q2. 在 SK 中,Plugin 插件的主要作用是什么?

单选题 · easy

  • A.将多个函数按场景归组← 正确答案
  • B.存储用户长期偏好
  • C.负责拆解用户目标
  • D.提供模型推理能力

答案:A。Plugin 是函数的集合,像工具箱一样把相关工具归组。用户偏好属于 Memory,目标拆解属于 Planner。

Q3. 原生函数与语义函数的区别是什么?

单选题 · mid

  • A.一个跑代码一个调模型
  • B.一个执行代码一个调用模型← 正确答案
  • C.一个在云端运行一个在本地
  • D.一个同步执行一个异步执行

答案:B。原生函数执行开发者写的代码,确定性高;语义函数通过 Prompt 调用大模型,适合开放生成任务。二者不在于语言、位置或同步方式。

Q4. 关于 Planner 规划器,下列说法正确的是?

单选题 · mid

  • A.它能代替开发者写全部代码
  • B.它只能手动编排步骤
  • C.它可生成步骤并调度函数← 正确答案
  • D.它只在模型训练阶段使用

答案:C。Planner 把目标转成函数调用序列,再交给 Kernel 执行。它不会凭空写代码,也不只用于训练,更不仅限手动。

Q5. SK 的记忆系统通常依赖哪类技术实现语义检索?

单选题 · mid

  • A.向量检索← 正确答案
  • B.哈希索引
  • C.全文索引
  • D.数据压缩

答案:A。语义记忆先把文本转成向量,再用余弦相似度找相近内容。哈希、全文、压缩都不是语义相似度匹配的核心。

Q6. 让 Agent 能连续自主调用多个工具,最关键的是?

单选题 · hard

  • A.提高显卡显存
  • B.完善上下文与规划← 正确答案
  • C.扩大数据库表
  • D.使用更低时延网络

答案:B。Agent 自主行动依赖完整上下文和 Planner 的步骤拆解。硬件或网络只是辅助,不能决定智能体能否连续调用工具。

Q7. Semantic Kernel 目前官方支持哪两种开发语言?

单选题 · easy

  • A.Java 和 Go
  • B.C# 和 Rust
  • C.C# 和 Python← 正确答案
  • D.Python 和 Java

答案:C。SK 官方支持 C# 与 Python,方便 .NET 和 Python 生态接入。Rust、Java、Go 不在官方主推列表中。

Q8. 以下哪些属于 Semantic Kernel 的核心组成?

多选题 · mid

  • A.Kernel 内核← 正确答案
  • B.Plugin 插件← 正确答案
  • C.Function 函数← 正确答案
  • D.GPU 驱动

答案:ABC。Kernel、Plugin、Function 是 SK 的三层核心。GPU 驱动属于硬件基础设施,不属于应用框架组成。

Q9. Planner 常用的规划策略包括哪些?

多选题 · hard

  • A.顺序规划← 正确答案
  • B.并行规划← 正确答案
  • C.手动规划← 正确答案
  • D.数据压缩

答案:ABC。SK Planner 支持按依赖关系顺序执行、互不依赖时并行执行,也允许开发者手动指定步骤。数据压缩与规划无关。

Q10. SK 在企业落地时需要重点考虑哪些问题?

多选题 · extreme

  • A.模型选择与切换← 正确答案
  • B.安全合规与日志← 正确答案
  • C.插件管理与版本← 正确答案
  • D.忽略成本与性能

答案:ABC。企业落地要关注模型可替换、安全审计、插件版本治理,同时必须重视成本与性能;完全忽略成本是明显错误。