核心概念 #

架构概览 #

Semantic Kernel 采用分层架构设计,每一层都有明确的职责:

text
┌─────────────────────────────────────────────────────────────┐
│                    Semantic Kernel 架构                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                   应用层                             │   │
│  │              (Your Application)                      │   │
│  └─────────────────────────┬───────────────────────────┘   │
│                            │                                │
│  ┌─────────────────────────▼───────────────────────────┐   │
│  │                  Kernel 层                          │   │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐   │   │
│  │  │Plugins  │ │Functions│ │Planners │ │ Memory  │   │   │
│  │  └─────────┘ └─────────┘ └─────────┘ └─────────┘   │   │
│  └─────────────────────────┬───────────────────────────┘   │
│                            │                                │
│  ┌─────────────────────────▼───────────────────────────┐   │
│  │                Connectors 层                        │   │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐   │   │
│  │  │ OpenAI  │ │ Azure   │ │ Hugging │ │ Others  │   │   │
│  │  │         │ │ OpenAI  │ │ Face    │ │         │   │   │
│  │  └─────────┘ └─────────┘ └─────────┘ └─────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Kernel(内核) #

什么是 Kernel? #

Kernel 是 Semantic Kernel 的核心引擎,负责:

  1. 服务管理:管理 AI 服务和其他服务的注册与获取
  2. 插件管理:管理插件的注册与获取
  3. 函数执行:协调函数的调用与执行
  4. 依赖注入:提供依赖注入容器

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 中封装可复用功能的基本单元。每个插件可以包含多个函数,这些函数可以是:

  1. 语义函数:基于提示词的 AI 函数
  2. 原生函数:用代码实现的本地函数

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 服务通信的桥梁,负责:

  1. API 调用:封装不同 AI 服务的 API 调用
  2. 请求转换:将统一格式转换为特定服务格式
  3. 响应解析:将服务响应转换为统一格式

连接器架构 #

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 的智能编排组件,能够:

  1. 理解目标:分析用户的复杂请求
  2. 分解任务:将复杂任务分解为子任务
  3. 选择函数:选择合适的函数执行子任务
  4. 编排执行:按顺序或并行执行函数

规划器工作流程 #

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 的记忆系统,用于:

  1. 对话记忆:存储多轮对话历史
  2. 语义记忆:存储知识并支持语义检索
  3. 向量存储:存储文本的向量表示

记忆系统架构 #

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