Microsoft Semantic Kernel¶
为什么要学¶
Semantic Kernel 是微软官方的 AI 编排 SDK,是构建企业级 AI 应用的首选:
- 微软官方:与 Azure OpenAI、Microsoft 365 深度集成
- 多语言:C#、Python、Java 三语言支持
- 企业级:内置安全、监控、可靠性模式
- 插件系统:可复用的 AI 能力模块
- Agent 框架:内置多 Agent 编排能力
- 渐进式:从简单调用到复杂 Agent,平滑升级
如果你在 .NET/Java 生态工作,或需要与 Azure/Microsoft 服务集成,Semantic Kernel 是最自然的选择。
核心概念¶
白话解释¶
Semantic Kernel 的设计哲学:"让 AI 成为你应用的一个可靠组件"
- Kernel(内核):中央协调器,管理所有 AI 服务和插件
- Plugin(插件):一组相关的 AI 函数
- Function(函数):一个具体的 AI 能力(可以是 prompt 或原生代码)
- Planner(规划器):让 AI 自动编排函数调用顺序
核心概念对照表¶
| 概念 | 说明 | 类比 |
|---|---|---|
| Kernel | 核心运行时,管理服务和插件 | 操作系统内核 |
| Plugin | 一组相关函数的集合 | 应用/模块 |
| KernelFunction | 单个可调用的函数 | API端点 |
| Prompt Function | 用prompt模板定义的函数 | 模板化的AI调用 |
| Native Function | 用代码实现的函数 | 普通代码函数 |
| Connector | 连接AI服务(OpenAI/Azure等) | 数据库驱动 |
| Memory | AI的记忆系统 | 缓存/数据库 |
| Planner | 自动规划执行步骤 | 任务调度器 |
| Agent | 能自主行动的AI实体 | 自动化员工 |
安装配置¶
Python 安装¶
pip install semantic-kernel
# 额外连接器
pip install semantic-kernel[openai]
pip install semantic-kernel[azure]
pip install semantic-kernel[hugging_face]
C# 安装¶
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Plugins.Core
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
环境配置¶
# OpenAI
export OPENAI_API_KEY="sk-..."
# Azure OpenAI
export AZURE_OPENAI_API_KEY="..."
export AZURE_OPENAI_ENDPOINT="https://xxx.openai.azure.com/"
export AZURE_OPENAI_DEPLOYMENT_NAME="gpt-4o-mini"
快速上手¶
Python 基础用法¶
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
async def main():
# 1. 创建Kernel
kernel = Kernel()
# 2. 添加AI服务
kernel.add_service(OpenAIChatCompletion(
service_id="chat",
ai_model_id="gpt-4o-mini"
))
# 3. 创建Prompt函数
summarize = kernel.add_function(
plugin_name="TextPlugin",
function_name="summarize",
prompt="用一句话总结以下文本:\n{{$input}}\n总结:"
)
# 4. 调用
result = await kernel.invoke(summarize, input="人工智能是计算机科学的一个分支,它试图理解智能的实质,并生产出一种能以与人类智能相似的方式做出反应的智能机器。")
print(result)
asyncio.run(main())
C# 基础用法¶
using Microsoft.SemanticKernel;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o-mini", Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
.Build();
var result = await kernel.InvokePromptAsync(
"用一句话总结: {{$input}}",
new() { ["input"] = "人工智能是计算机科学的一个分支..." }
);
Console.WriteLine(result);
创建插件¶
from semantic_kernel.functions import kernel_function
class MathPlugin:
"""数学计算插件"""
@kernel_function(name="add", description="计算两个数的和")
def add(self, a: float, b: float) -> float:
return a + b
@kernel_function(name="multiply", description="计算两个数的积")
def multiply(self, a: float, b: float) -> float:
return a * b
@kernel_function(name="factorial", description="计算阶乘")
def factorial(self, n: int) -> int:
if n <= 1:
return 1
return n * self.factorial(n - 1)
# 注册插件
kernel.add_plugin(MathPlugin(), plugin_name="Math")
# AI可以自动调用这些函数
进阶用法¶
1. 自动函数调用(Tool Use)¶
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior
from semantic_kernel.contents import ChatHistory
async def auto_function_calling():
kernel = Kernel()
kernel.add_service(OpenAIChatCompletion(service_id="chat", ai_model_id="gpt-4o-mini"))
kernel.add_plugin(MathPlugin(), "Math")
# 启用自动函数调用
settings = kernel.get_prompt_execution_settings_from_service_id("chat")
settings.function_choice_behavior = FunctionChoiceBehavior.Auto()
chat_history = ChatHistory()
chat_history.add_user_message("计算 15 * 7 + 23 的结果")
result = await kernel.invoke_prompt(
"{{$chat_history}}",
chat_history=chat_history,
settings=settings
)
print(result) # AI会自动调用Math插件的函数
2. Prompt 模板¶
# 使用Handlebars语法的模板
prompt_template = """
{{#system~}}
你是一位{{$role}}专家,请用中文回答。
{{~/system}}
{{#user~}}
请分析以下{{$type}}:
{{$content}}
要求:
1. 列出要点
2. 给出建议
{{~/user}}
"""
analysis_function = kernel.add_function(
plugin_name="Analysis",
function_name="analyze",
prompt=prompt_template,
template_format="handlebars"
)
result = await kernel.invoke(
analysis_function,
role="数据科学",
type="代码",
content="import pandas as pd\ndf = pd.read_csv('data.csv')\nprint(df.describe())"
)
3. Agent 系统¶
from semantic_kernel.agents import ChatCompletionAgent, AgentGroupChat
# 创建多个Agent
coder = ChatCompletionAgent(
kernel=kernel,
service_id="chat",
name="Coder",
instructions="你是一位Python开发者,负责编写代码"
)
reviewer = ChatCompletionAgent(
kernel=kernel,
service_id="chat",
name="Reviewer",
instructions="你是代码审查专家,负责审查代码质量和安全性"
)
# Agent协作
group_chat = AgentGroupChat(agents=[coder, reviewer])
async for message in group_chat.invoke("实现一个用户认证系统"):
print(f"[{message.name}]: {message.content}")
4. 记忆系统¶
from semantic_kernel.memory import SemanticTextMemory
from semantic_kernel.connectors.memory.chroma import ChromaMemoryStore
from semantic_kernel.connectors.ai.open_ai import OpenAITextEmbedding
# 创建记忆存储
memory = SemanticTextMemory(
storage=ChromaMemoryStore(persist_directory="./memory_db"),
embeddings_generator=OpenAITextEmbedding(ai_model_id="text-embedding-3-small")
)
# 存储记忆
await memory.save_information(
collection="knowledge",
id="fact1",
text="Python 3.12 于2023年10月发布,引入了更好的错误消息和性能提升"
)
# 检索记忆
results = await memory.search(
collection="knowledge",
query="Python最新版本有什么新特性?",
limit=3
)
for r in results:
print(f"相关度: {r.relevance} | {r.text}")
5. Planner(自动规划)¶
from semantic_kernel.planners import FunctionCallingStepwisePlanner
# 注册多个插件
kernel.add_plugin(MathPlugin(), "Math")
kernel.add_plugin(WebSearchPlugin(), "Search")
kernel.add_plugin(FilePlugin(), "File")
# 创建规划器
planner = FunctionCallingStepwisePlanner(
service_id="chat",
max_iterations=10
)
# AI自动规划执行步骤
result = await planner.invoke(
kernel,
"搜索Python 3.12的新特性,计算从3.10到3.12有几个版本,然后把总结保存到文件"
)
6. 过滤器(中间件)¶
from semantic_kernel.filters import FunctionInvocationContext
# 函数调用过滤器(类似中间件)
@kernel.filter(filter_type="function_invocation")
async def logging_filter(context: FunctionInvocationContext, next):
print(f"调用函数: {context.function.name}")
print(f"参数: {context.arguments}")
await next(context) # 执行函数
print(f"结果: {context.result}")
# 提示渲染过滤器
@kernel.filter(filter_type="prompt_rendering")
async def prompt_filter(context, next):
await next(context)
print(f"渲染后的Prompt: {context.rendered_prompt}")
7. Azure OpenAI 集成¶
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
kernel.add_service(AzureChatCompletion(
service_id="azure-chat",
deployment_name="gpt-4o-mini",
endpoint="https://myresource.openai.azure.com/",
api_key="..."
))
常见问题¶
Q1: SK vs LangChain?¶
| 方面 | Semantic Kernel | LangChain |
|---|---|---|
| 语言 | C#/Python/Java | Python/JS |
| 生态 | Microsoft/Azure | 开源社区 |
| 设计 | 插件+内核 | Chain+Agent |
| 企业 | 微软级别 | 创业公司级 |
| 适合 | .NET/企业/Azure | Python/快速原型 |
Q2: 支持哪些 AI 服务?¶
- OpenAI (GPT-4o, GPT-4o-mini)
- Azure OpenAI
- HuggingFace
- Ollama (本地模型)
- Google AI (Gemini)
- Mistral
Q3: 如何处理长对话?¶
# 自动截断历史
chat_history = ChatHistory()
chat_history.add_system_message("...")
# 设置最大token限制
settings = OpenAIPromptExecutionSettings(
max_tokens=2000,
# SK会自动管理历史截断
)
Q4: C# 和 Python 功能一样吗?¶
C# 是第一公民,功能最完整。Python 紧随其后,大部分功能同步。Java 版本相对滞后。
参考资源¶
- Semantic Kernel 文档 - 官方文档
- SK GitHub - 源代码
- Python 示例 - Python 代码示例
- C# 示例 - .NET 示例
- SK Blog - 官方博客