核心概念 #
架构概览 #
Semantic Kernel 采用分层架构设计,每一层都有明确的职责:
text
┌─────────────────────────────────────────────────────────────┐
│ Semantic Kernel 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 应用层 │ │
│ │ (Your Application) │ │
│ └─────────────────────────┬───────────────────────────┘ │
│ │ │
│ ┌─────────────────────────▼───────────────────────────┐ │
│ │ Kernel 层 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Plugins │ │Functions│ │Planners │ │ Memory │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────┬───────────────────────────┘ │
│ │ │
│ ┌─────────────────────────▼───────────────────────────┐ │
│ │ Connectors 层 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ OpenAI │ │ Azure │ │ Hugging │ │ Others │ │ │
│ │ │ │ │ OpenAI │ │ Face │ │ │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Kernel(内核) #
什么是 Kernel? #
Kernel 是 Semantic Kernel 的核心引擎,负责:
- 服务管理:管理 AI 服务和其他服务的注册与获取
- 插件管理:管理插件的注册与获取
- 函数执行:协调函数的调用与执行
- 依赖注入:提供依赖注入容器
Kernel 结构图 #
text
┌─────────────────────────────────────────────────────────────┐
│ Kernel │
├─────────────────────────────────────────────────────────────┤
│ │
│ Services (服务) Plugins (插件) │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ OpenAI Chat │ │ MathPlugin │ │
│ │ Azure OpenAI Chat │ │ TextPlugin │ │
│ │ Embedding Service │ │ FilePlugin │ │
│ │ ... │ │ ... │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
│ Functions (函数) Planners (规划器) │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ Semantic Functions │ │ Handlebars Planner │ │
│ │ Native Functions │ │ Function Calling │ │
│ │ ... │ │ ... │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
创建 Kernel #
csharp
// 方式 1:使用 Builder 模式
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("gpt-4", "api-key");
var kernel = builder.Build();
// 方式 2:使用依赖注入
var services = new ServiceCollection();
services.AddKernel()
.AddOpenAIChatCompletion("gpt-4", "api-key");
var serviceProvider = services.BuildServiceProvider();
var kernel = serviceProvider.GetRequiredService<Kernel>();
// 方式 3:直接实例化
var kernel = new Kernel();
kernel.AddOpenAIChatCompletion("gpt-4", "api-key");
Kernel 配置 #
csharp
var builder = Kernel.CreateBuilder();
// 添加多个 AI 服务
builder.AddOpenAIChatCompletion(
serviceId: "openai-gpt4",
modelId: "gpt-4",
apiKey: "openai-key"
);
builder.AddAzureOpenAIChatCompletion(
serviceId: "azure-gpt4",
deploymentName: "gpt-4-deployment",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "azure-key"
);
// 添加嵌入服务
builder.AddOpenAITextEmbeddingGeneration(
modelId: "text-embedding-3-small",
apiKey: "api-key"
);
var kernel = builder.Build();
Plugin(插件) #
什么是 Plugin? #
Plugin 是 Semantic Kernel 中封装可复用功能的基本单元。每个插件可以包含多个函数,这些函数可以是:
- 语义函数:基于提示词的 AI 函数
- 原生函数:用代码实现的本地函数
Plugin 架构 #
text
┌─────────────────────────────────────────────────────────────┐
│ Plugin │
├─────────────────────────────────────────────────────────────┤
│ │
│ Plugin Name: "MathPlugin" │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Functions: │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Add │ │ Subtract │ │ Multiply │ │ │
│ │ │ (Native) │ │ (Native) │ │ (Native) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Explain │ │ Solve │ │ │
│ │ │ (Semantic) │ │ (Semantic) │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
创建原生插件 #
csharp
public class MathPlugin
{
[KernelFunction("add")]
[Description("将两个数字相加")]
public double Add(
[Description("第一个数字")] double a,
[Description("第二个数字")] double b)
{
return a + b;
}
[KernelFunction("multiply")]
[Description("将两个数字相乘")]
public double Multiply(
[Description("第一个数字")] double a,
[Description("第二个数字")] double b)
{
return a * b;
}
}
// 注册插件
kernel.Plugins.AddFromType<MathPlugin>("Math");
创建语义插件 #
csharp
// 方式 1:从提示词创建
var summarizeFunction = kernel.CreateFunctionFromPrompt(
promptTemplate: "请总结以下文本:{{$input}}",
functionName: "Summarize",
description: "总结文本内容"
);
kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions(
"TextPlugin",
new[] { summarizeFunction }
));
// 方式 2:从文件加载
// Prompts/Summarize/config.json
// Prompts/Summarize/skprompt.txt
var plugin = kernel.ImportPluginFromPromptDirectory("./Prompts", "TextPlugin");
Function(函数) #
什么是 Function? #
Function 是 Semantic Kernel 中最小的执行单元,分为两类:
| 类型 | 描述 | 特点 |
|---|---|---|
| Semantic Function | 基于提示词的 AI 函数 | 使用 LLM 处理 |
| Native Function | 代码实现的本地函数 | 直接执行代码 |
函数调用流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 函数调用流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 调用函数 │
│ kernel.InvokeAsync("Plugin", "Function", arguments) │
│ │ │
│ ▼ │
│ 2. 查找函数 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ kernel.Plugins["Plugin"]["Function"] │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 3. 准备参数 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ KernelArguments + Context │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 4. 执行函数 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Semantic: 调用 LLM │ │
│ │ Native: 执行代码 │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 5. 返回结果 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ FunctionResult │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
调用函数 #
csharp
// 方式 1:通过 Kernel 调用
var result = await kernel.InvokeAsync(
pluginName: "Math",
functionName: "Add",
arguments: new KernelArguments
{
["a"] = 5,
["b"] = 3
}
);
// 方式 2:获取函数后调用
var function = kernel.Plugins["Math"]["Add"];
var result = await kernel.InvokeAsync(function, new KernelArguments
{
["a"] = 5,
["b"] = 3
});
// 方式 3:链式调用
var result = await kernel
.Plugins["Math"]["Add"]
.InvokeAsync(kernel, new KernelArguments { ["a"] = 5, ["b"] = 3 });
函数组合 #
csharp
// 将一个函数的输出作为另一个函数的输入
var text = "这是一段需要处理的文本...";
// 步骤 1:翻译
var translated = await kernel.InvokeAsync(
"Translate", "ToEnglish",
new KernelArguments { ["input"] = text }
);
// 步骤 2:摘要
var summarized = await kernel.InvokeAsync(
"Text", "Summarize",
new KernelArguments { ["input"] = translated.ToString() }
);
// 步骤 3:翻译回中文
var result = await kernel.InvokeAsync(
"Translate", "ToChinese",
new KernelArguments { ["input"] = summarized.ToString() }
);
Connector(连接器) #
什么是 Connector? #
Connector 是 Semantic Kernel 与外部 AI 服务通信的桥梁,负责:
- API 调用:封装不同 AI 服务的 API 调用
- 请求转换:将统一格式转换为特定服务格式
- 响应解析:将服务响应转换为统一格式
连接器架构 #
text
┌─────────────────────────────────────────────────────────────┐
│ Connector 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Kernel │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ AI Service Interface │ │
│ │ - IChatCompletionService │ │
│ │ - ITextEmbeddingGenerationService │ │
│ │ - ITextToImageService │ │
│ └─────────────────────────┬───────────────────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ OpenAI │ │ Azure │ │ Hugging │ │
│ │ Connector │ │ OpenAI │ │ Face │ │
│ │ │ │ Connector │ │ Connector │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
使用连接器 #
csharp
// OpenAI 连接器
builder.AddOpenAIChatCompletion(
modelId: "gpt-4",
apiKey: "api-key",
orgId: "org-id" // 可选
);
// Azure OpenAI 连接器
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4-deployment",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "api-key",
modelId: "gpt-4" // 可选,用于标识
);
// 嵌入生成连接器
builder.AddOpenAITextEmbeddingGeneration(
modelId: "text-embedding-3-small",
apiKey: "api-key"
);
Planner(规划器) #
什么是 Planner? #
Planner 是 Semantic Kernel 的智能编排组件,能够:
- 理解目标:分析用户的复杂请求
- 分解任务:将复杂任务分解为子任务
- 选择函数:选择合适的函数执行子任务
- 编排执行:按顺序或并行执行函数
规划器工作流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 规划器工作流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户请求:"帮我写一首关于春天的诗,然后翻译成英文" │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 1. 理解目标 │ │
│ │ - 写诗(关于春天) │ │
│ │ - 翻译(中文到英文) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 2. 生成计划 │ │
│ │ Step 1: Call PoemPlugin.Write(topic="春天") │ │
│ │ Step 2: Call TranslatePlugin.ToEnglish(text) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 3. 执行计划 │ │
│ │ 执行 Step 1 → 获取结果 │ │
│ │ 执行 Step 2 → 获取最终结果 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
使用规划器 #
csharp
using Microsoft.SemanticKernel.Planning;
// 创建规划器
var planner = new FunctionCallingStepwisePlanner();
// 执行计划
var result = await planner.ExecuteAsync(
kernel,
"帮我写一首关于春天的诗,然后翻译成英文"
);
Console.WriteLine(result);
Memory(记忆) #
什么是 Memory? #
Memory 是 Semantic Kernel 的记忆系统,用于:
- 对话记忆:存储多轮对话历史
- 语义记忆:存储知识并支持语义检索
- 向量存储:存储文本的向量表示
记忆系统架构 #
text
┌─────────────────────────────────────────────────────────────┐
│ 记忆系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Memory Store │ │
│ └─────────────────────────┬───────────────────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Volatile │ │ Redis │ │ Qdrant │ │
│ │ Memory │ │ Memory │ │ Memory │ │
│ │ (内存) │ │ (Redis) │ │ (向量数据库) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 功能: │
│ - SaveInformationAsync() 保存信息 │
│ - SearchAsync() 语义搜索 │
│ - GetCollectionsAsync() 获取集合 │
│ │
└─────────────────────────────────────────────────────────────┘
使用记忆 #
csharp
// 保存信息
await kernel.Memory.SaveInformationAsync(
collection: "knowledge",
text: "Semantic Kernel 是微软开源的 AI SDK",
id: "sk-intro"
);
// 语义搜索
var results = kernel.Memory.SearchAsync(
collection: "knowledge",
query: "什么是 Semantic Kernel",
limit: 5
);
await foreach (var result in results)
{
Console.WriteLine($"{result.Metadata.Text} (Relevance: {result.Relevance})");
}
组件关系图 #
text
┌─────────────────────────────────────────────────────────────┐
│ 组件协作关系 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ User │ │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Kernel │◀─────────────────┐ │
│ └────┬────┘ │ │
│ │ │ │
│ ┌──────────────┼──────────────┐ │ │
│ │ │ │ │ │
│ ▼ ▼ ▼ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ Plugins │ │ Planners │ │ Connectors│ │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ ▼ │ │ │ │
│ ┌──────────┐ │ │ │ │
│ │Functions │ │ │ │ │
│ └────┬─────┘ │ │ │ │
│ │ │ │ │ │
│ └──────────────┼──────────────┘ │ │
│ │ │ │
│ ▼ │ │
│ ┌──────────┐ │ │
│ │ Memory │─────────────────┘ │
│ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
下一步 #
现在你已经理解了 Semantic Kernel 的核心概念,接下来学习 Kernel 内核,深入了解内核的高级用法!
最后更新:2026-04-04