语义内核 Semantic Kernel:微软的 AI 编排框架
什么是语义内核
语义内核(Semantic Kernel,简称 SK)是微软推出的一款轻量级开源软件开发工具包(SDK),旨在帮助开发者将大型语言模型(LLM)与传统编程语言无缝结合,构建智能应用。它不是一个独立的 AI 模型,而是一个 AI 编排框架,让你可以用 C#、Python 或 Java 等语言“编排”复杂的 AI 工作流,召唤各种 AI 服务完成实际任务。
与直接调用 OpenAI、Azure OpenAI 等 API 不同,语义内核提供了一套更高层次的抽象:插件(Plugins)、内核(Kernel)、规划器(Planner) 和 记忆(Memory)。通过这些组件,你可以把 AI 能力像搭积木一样组合起来,让程序不仅能“聊天”,还能执行具体操作,例如发送邮件、查询数据库、调用外部 API 等。
简单比喻:如果说大语言模型是“大脑”,语义内核就是连接大脑与“身体”(业务系统)的 神经系统。它负责把用户意图翻译成可执行的步骤,然后调用相应的技能。
为什么需要语义内核
在生成式 AI 应用开发中,仅靠“提示词 + 模型回答”的模式存在明显局限:
- 缺乏结构化行动:模型只能返回文本,无法直接操作实际系统。
- 难以组合复杂流程:一个真实任务往往需要多步推理、多次调用不同工具。
- 上下文记忆管理繁琐:需要手动维护对话历史和外部知识。
- 多模型、多服务异构:不同服务接口各异,集成成本高。
语义内核正是为了解决这些痛点而设计。它的核心价值包括:
- 统一编排层:将 OpenAI、Azure OpenAI、Hugging Face 等模型,与自定义代码、API、数据库等作为可复用的“技能”统一管理。
- 原生集成 LLM:通过“语义函数”自然描述任务,由 AI 理解并生成执行计划。
- 可扩展插件生态:轻松封装现有业务逻辑,让 AI 能够调用。
- 自动规划与执行:给定目标,内核可以自动生成多步计划并在运行时动态选择插件。
- 多语言支持:目前支持 C#、Python、Java,未来会扩展到更多语言。
核心架构概览
语义内核的整体架构分为以下几个核心层,从上到下依次是:
-
表现形式层(Orchestration Layer)
负责理解用户意图、规划任务流程、调用相关技能。核心组件是内核(Kernel)和规划器(Planner)。 -
技能层(Skills / Plugins Layer)
可复用的功能单元,分为两大类:语义技能(用自然语言描述,由 LLM 生成)和原生技能(用代码实现的函数)。 -
AI 连接器层(AI Connectors Layer)
封装对各类 AI 服务的调用,例如 Completion(文本生成)、Embedding(嵌入)、Chat(对话)等。支持 OpenAI、Azure OpenAI 等,并保持接口一致。 -
记忆层(Memory Layer)
提供长期和短期记忆能力,支持向量嵌入、语义搜索、键值存储等,让 AI 应用能记住上下文和外部知识。 -
基础抽象层(Kernel Core)
包括日志、诊断、配置、管线等基础设施,保障框架轻量、可观测、易扩展。
这些层协同工作,使开发者可以聚焦于业务逻辑,而不用操心底层 AI 调用的细节。
快速上手:从零搭建一个智能应用
以下以 Python 版本为例,演示如何用语义内核构建一个简单的“天气预报助手”应用,该应用能理解用户问题并调用外部天气 API 获取实时天气。
准备工作
- 安装 Python 3.10 及以上版本。
- 安装语义内核包及其 OpenAI 连接器:
pip install semantic-kernel
- 获取 Azure OpenAI 或 OpenAI 的 API Key 及相应端点。在本例中,我们使用 OpenAI 的 GPT-3.5 Turbo 模型。
步骤一:初始化内核
创建 kernel.py 文件,导入必要模块并配置 AI 服务:
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
# 初始化内核
kernel = sk.Kernel()
# 配置 OpenAI 聊天服务(也可使用 Azure OpenAI)
api_key = "你的OpenAI密钥"
org_id = "" # 可为空
service_id = "chat-gpt"
kernel.add_service(
OpenAIChatCompletion(service_id=service_id, api_key=api_key, org_id=org_id)
)
print("内核初始化完成")
步骤二:创建原生插件(调用天气 API)
创建一个模拟的天气函数,实际应用中可接入真实 API。定义原生插件:
from typing import Annotated
from semantic_kernel.functions import kernel_function
class WeatherPlugin:
"""天气查询插件"""
@kernel_function(
description="根据城市名称获取当前天气信息",
name="get_weather"
)
def get_weather(
self,
city: Annotated[str, "城市名称,例如 '北京'"]
) -> str:
"""模拟返回天气数据"""
# 实际应调用API,这里返回静态示例
return f"{city}今天晴,气温15-25℃,微风。"
# 将插件注册到内核
weather_plugin = WeatherPlugin()
kernel.add_plugin(weather_plugin, plugin_name="WeatherPlugin")
kernel_function 装饰器将普通函数标记为可被内核调用的“技能”,description 参数会帮助 LLM 理解该函数的功能,以便在规划时自动选择。
步骤三:创建并运行对话
现在可以让内核根据用户输入自动决定是否调用天气插件,并生成最终回答。
async def main():
# 获取聊天服务
chat = kernel.get_service(service_id="chat-gpt")
# 设置对话上下文,可以让模型知道可用的插件
settings = kernel.get_prompt_execution_settings_from_service("chat-gpt")
settings.function_call_behavior = sk.FunctionCallBehavior.Auto() # 自动调用函数
# 用户问题
user_input = "请问上海今天天气怎么样?"
print(f"用户: {user_input}")
# 调用聊天完成,内核会自动处理函数调用
response = await kernel.invoke(
chat,
prompt=user_input,
settings=settings
)
print(f"助手: {response}")
# 运行异步主函数
import asyncio
asyncio.run(main())
运行时,语义内核会自动分析用户意图,识别出需要查询天气这一事实,然后调用 WeatherPlugin 中的 get_weather 函数,并将返回结果交给 LLM 整理成自然语言回复。最终输出类似:
用户: 请问上海今天天气怎么样?
助手: 根据查询,上海今天晴,气温15-25℃,微风。
如果用户只是闲聊,没有触发插件的需要,内核会直接由 LLM 生成回答,不会调用任何函数。
关键概念详解
插件
插件是语义内核中最核心的功能单元,分为两种:
- 原生函数:直接用编程语言(如 Python/C#)编写,使用
@kernel_function装饰,可以操作数据库、文件系统、第三方 API 等。 - 语义函数:用自然语言描述任务的“提示词模板”。内核会将其发送给 LLM,由 AI 生成结果。语义函数本质上是 Prompt 模板 + 配置 的封装,支持变量输入。
两种函数都可以通过内核统一调用,并且可以组合成复杂流程。
规划器
规划器是语义内核的“大脑”,它能够根据用户的目标,自动创建一个多步骤计划并执行。例如,用户说“帮我整理明天的会议纪要,然后发邮件给团队”,规划器会生成计划:1) 从日历中获取会议信息;2) 总结要点;3) 调用邮件插件发送。规划器有多种实现:
- StepwisePlanner:逐步推理,类似于 ReAct 模式,在每一步观察结果后决定下一步动作。
- SequentialPlanner:基于 LLM 一次性生成线性步骤列表,然后顺序执行。
- ActionPlanner:仅选择一个最合适的函数并执行。
规划器极大简化了复杂任务的编排,开发者通常只需定义好原子技能,剩下的组合工作交给内核。
记忆
记忆功能让 AI 应用具备上下文存储和检索能力。语义内核提供了两个层面的记忆:
- 对话历史:短期记忆,通过
ChatHistory对象维护。 - 长期记忆:基于向量数据库的持久存储。可以利用
TextMemoryPlugin将文本、事实等保存为向量嵌入,之后通过语义相似度检索相关信息。
记忆通常与嵌入服务(如 OpenAI Embedding)及向量存储(如内存、Chroma、Pinecone 等)配合使用。这为 RAG(检索增强生成)等模式提供了开箱即用的支持。
进阶用法:结合规划器与记忆
让我们构建一个稍复杂的例子:一个“读书笔记助手”,它可以记录书名、作者和读后感想,并根据用户提问回忆以前的笔记。我们将使用顺序规划器和文本记忆。
创建笔记插件
from semantic_kernel.functions import kernel_function
from semantic_kernel.memory import VolatileMemoryStore
from semantic_kernel.core_plugins import TextMemoryPlugin
from semantic_kernel.connectors.ai.open_ai import OpenAITextEmbedding
class NotePlugin:
@kernel_function(description="保存一条读书笔记,包含书名、作者和感想")
async def save_note(
self,
title: Annotated[str, "书名"],
author: Annotated[str, "作者"],
feeling: Annotated[str, "个人感想"]
) -> str:
# 这里我们会用记忆保存,所以此函数只返回确认信息
return f"笔记已记录:《{title}》- {author},感想:{feeling}"
@kernel_function(description="搜索之前保存的读书笔记,基于查询描述")
async def search_notes(
self,
query: Annotated[str, "查询描述"]
) -> str:
# 实际搜索由记忆层完成,此函数仅作为触发点
return query # 规划器会将其结果传给记忆
配置记忆并注册插件
kernel = sk.Kernel()
# ... 添加 OpenAI 聊天和嵌入服务
# 设置嵌入服务
embedding_gen = OpenAITextEmbedding(ai_model_id="text-embedding-ada-002", api_key=api_key)
kernel.add_service(embedding_gen)
# 使用易失性内存存储(实际项目建议用持久化存储)
memory_store = VolatileMemoryStore()
memory = TextMemoryPlugin(memory_store=memory_store, embedding_generator=embedding_gen)
kernel.add_plugin(memory, "Memory")
kernel.add_plugin(NotePlugin(), "Notes")
当用户说“保存《百年孤独》的笔记”时,规划器会生成计划:调用 save_note 并获得确认文本,同时记忆插件可进一步将内容存入长期记忆。当用户问“我保存过哪本关于孤独的书?”时,会触发 search_notes,再由记忆进行语义检索。
与传统开发方式的对比
| 方面 | 直接调用 LLM API | 使用语义内核 |
|---|---|---|
| 工具调用 | 需手动解析函数调用,编写大量胶水代码 | 自动函数选择与调用,声明式定义 |
| 多步流程 | 需要自己管理状态、循环、错误处理 | 规划器自动生成并执行计划 |
| 记忆管理 | 自己实现嵌入、检索、对话历史维护 | 内置记忆插件,一键集成 |
| 可维护性 | 业务逻辑与 AI 调用交织,复杂后难维护 | 插件化架构,职责清晰,易于测试 |
| 多模型支持 | 每个模型单独编写适配器 | 统一连接器接口,切换模型只需改配置 |
语义内核通过将“做什么”与“怎么做”解耦,让开发者聚焦于定义能力(插件),而让 AI 模型自行决定如何组合这些能力。
生态与资源
- 官方仓库:microsoft/semantic-kernel —— 包含 C#、Python、Java SDK。
- 文档:learn.microsoft.com/en-us/semantic-kernel —— 详尽的入门指南、概念解释和 API 参考。
- 示例项目:仓库中提供了大量 Copilot、Chat、RAG 等示例。
- 社区:通过 Discord 或 GitHub Issues 获取支持。
微软将语义内核定位为“AI 时代的操作系统内核”,希望它成为连接 AI 服务与真实世界的通用中间件。随着版本迭代,内置插件和规划器会越来越丰富,未来甚至可能集成更多模态(视觉、语音等)。
总结
语义内核为 AI 应用开发提供了一个成熟且高度可延伸的编排框架。它让开发者不必再从零开始拼凑提示工程、工具调用和状态管理,而是站在巨人的肩膀上,用插件、规划器、记忆等抽象快速构建具有实际行动能力的智能系统。无论是创建简单的聊天机器人,还是构建能操作数十种业务系统的 Agent,语义内核都能显著降低复杂度,提升开发效率。
如果你想立即尝试,推荐从官方示例“Copilot Chat”开始,感受语义内核如何将自然语言转化为切实行动。在这个 LLM 驱动的时代,掌握语义内核将成为 .NET/Python/Java 开发者构建下一代应用的关键技能。