Semantic Kernel .NET 架构学习指南 🚀
嗨,欢迎来到 Semantic Kernel 的世界!我是你的技术教练,接下来我会带你深入这个由微软打造的 AI 编排框架。别担心,我们会从零开始,一步步揭开它的神秘面纱。准备好了吗?让我们开始这段激动人心的旅程吧! 😊
第一部分:项目架构深度解析 🔍
1. 项目架构概览
用通俗的类比理解 Semantic Kernel 💡
想象一下,你在组织一场大型音乐会。Semantic Kernel 就像是这场音乐会的总指挥和协调中心:
- Kernel(内核) 是你的指挥台 🎭 - 协调所有资源和服务
- Plugins(插件) 是你的乐手们 🎸 - 每个人都有专长(搜索、计算、数据处理等)
- AI Connectors(AI连接器) 是你的音响设备 🔊 - 连接各种AI服务(OpenAI、Azure OpenAI、Google Gemini等)
- Functions(函数) 是你的乐谱 🎼 - 定义了具体要执行的动作
- Agents(代理) 是你的舞台剧演员 🎭 - 可以有状态、记忆和复杂行为的智能实体
整个框架的设计哲学就是:让开发者能够像编排一场演出一样,优雅地组合AI能力、业务逻辑和外部服务,创造出强大的AI应用。
核心设计特征 ⭐
Semantic Kernel 采用了插件化的微内核架构,具有以下突出特点:
高度可扩展的连接器生态 🔌
- 支持 10+ 种主流 AI 服务商(OpenAI、Azure OpenAI、Google、Amazon Bedrock、Ollama、Mistral AI等)
- 统一的抽象接口,切换AI提供商只需修改配置
- 内置向量存储支持(15+ 数据库: Qdrant、Pinecone、Redis、PostgreSQL、MongoDB等)
函数式编程范式 🎯
- 将业务逻辑封装为函数(Function)
- 支持原生C#方法函数和Prompt模板函数
- 函数可以被AI自动调用(Function Calling)
依赖注入友好 💉
- 深度集成 Microsoft.Extensions.DependencyInjection
- 支持标准ASP.NET Core服务生命周期管理
- 便于单元测试和模块化开发
多层过滤器机制 🛡️
- Prompt渲染过滤器:在提示词发送前拦截和修改
- 函数调用过滤器:控制函数执行流程
- 自动函数调用过滤器:拦截AI的function calling行为
- 可实现日志、性能监控、权限控制、内容安全等横切关注点
实验性Agent框架 🤖
- 支持OpenAI Assistants API
- 多Agent协同编排
- 内置对话管理和状态保持
同类项目对比 📊
| 特性 | Semantic Kernel | LangChain | AutoGen |
|---|---|---|---|
| 语言支持 | C#、Python、Java | Python、JavaScript | Python |
| 设计理念 | 企业级、类型安全 | 快速原型、链式调用 | 多Agent对话 |
| 依赖注入 | ✅ 原生支持 | ⚠️ 有限支持 | ❌ 不支持 |
| 函数调用 | ✅ 深度集成 | ✅ 支持 | ✅ 支持 |
| 向量存储 | ✅ 15+ 连接器 | ✅ 丰富 | ⚠️ 基础 |
| 企业级特性 | ✅ 完善 | ⚠️ 社区驱动 | ⚠️ 研究导向 |
| 适用场景 | .NET生态、企业应用 | Python快速开发 | Agent研究、自动化工作流 |
Semantic Kernel的独特优势:
- 类型安全:强类型语言带来的编译时检查和IDE智能提示
- 企业级成熟度:微软官方支持,遵循.NET最佳实践
- Azure深度集成:与Azure OpenAI、Azure AI Search等无缝对接
- 性能优化:支持Native AOT,启动快,内存占用小
技术栈分析 🔧
核心框架层 (SemanticKernel.Abstractions + SemanticKernel.Core)
Target Frameworks: net8.0, netstandard2.0 // 兼容性极佳 核心依赖: - Microsoft.Extensions.DependencyInjection (8.0+) // DI容器 - Microsoft.Extensions.AI (9.9.0) // 微软AI抽象层 - System.Numerics.Tensors (9.0+) // 向量运算 AI连接器层 (15+ Connectors)
OpenAI生态: ├─ Connectors.OpenAI → OpenAI官方API ├─ Connectors.AzureOpenAI → Azure OpenAI服务 └─ Connectors.AzureAIInference → Azure AI推理端点 开源/本地模型: ├─ Connectors.Ollama → 本地LLM运行 ├─ Connectors.Onnx → ONNX Runtime推理 └─ Connectors.HuggingFace → HuggingFace模型 云服务商: ├─ Connectors.Amazon → AWS Bedrock ├─ Connectors.Google → Google Gemini └─ Connectors.MistralAI → Mistral AI 数据持久化层 (VectorData)
向量数据库: ├─ AzureAISearch, Qdrant, Pinecone, Milvus, Weaviate, Chroma ├─ Redis, PostgreSQL(PgVector), MongoDB └─ SqlServer, Sqlite, CosmosDB 特点: ✅ 统一的IVectorStore接口 ✅ 支持向量相似度搜索 ✅ 支持混合搜索(向量+文本) 函数扩展层 (Functions)
- Functions.OpenApi → REST API转函数 - Functions.Grpc → gRPC服务转函数 - Functions.Yaml → YAML定义函数 - Functions.Prompty → Prompty格式(Azure AI Studio) 插件生态 (Plugins)
- Plugins.Core → 内置核心插件 - Plugins.Web → 网页搜索、爬虫 - Plugins.MsGraph → Microsoft 365集成 - Plugins.Document → 文档处理 架构流程描述 🌊
让我们跟随一个典型的AI问答请求,看看数据是如何在系统中流转的:
┌─────────────────────────────────────────────────────────────────┐ │ 1️⃣ 用户输入 "帮我查询今天的天气并生成一份天气报告" │ └────────────────┬────────────────────────────────────────────────┘ │ v ┌─────────────────────────────────────────────────────────────────┐ │ 2️⃣ Kernel.InvokePromptAsync(prompt) │ │ ↓ 触发 IPromptRenderFilter (Prompt渲染过滤器) │ │ ↓ 模板引擎解析变量、条件逻辑 │ │ ↓ 渲染成最终Prompt │ └────────────────┬────────────────────────────────────────────────┘ │ v ┌─────────────────────────────────────────────────────────────────┐ │ 3️⃣ 路由到 IChatCompletionService (如OpenAI) │ │ ↓ HttpClient发送请求到 https://api.openai.com │ │ ↓ 携带已注册的Functions元数据(function calling schema) │ └────────────────┬────────────────────────────────────────────────┘ │ v ┌─────────────────────────────────────────────────────────────────┐ │ 4️⃣ AI模型分析后决定调用 GetWeatherPlugin.GetCurrentWeather() │ │ ← 返回 FunctionCallContent: {name: "GetWeather", args: {...}}│ └────────────────┬────────────────────────────────────────────────┘ │ v ┌─────────────────────────────────────────────────────────────────┐ │ 5️⃣ 触发 IFunctionInvocationFilter (函数调用过滤器) │ │ ↓ 可在此进行权限检查、参数验证、日志记录 │ │ ↓ 实际调用 Plugin 中的 C# 方法 │ │ ↓ 方法内部调用天气API,获取数据 │ │ ← 返回 FunctionResult: {result: "北京,晴,25°C"} │ └────────────────┬────────────────────────────────────────────────┘ │ v ┌─────────────────────────────────────────────────────────────────┐ │ 6️⃣ 将函数执行结果重新提交给AI │ │ → AI基于实际数据生成最终回答 │ │ ← 返回 "今天北京天气晴朗,气温25°C,适宜外出活动..." │ └────────────────┬────────────────────────────────────────────────┘ │ v ┌─────────────────────────────────────────────────────────────────┐ │ 7️⃣ 返回给用户 (支持流式输出 StreamingChatMessageContent) │ └─────────────────────────────────────────────────────────────────┘ 关键交互点:
- Kernel 是整个流程的协调者,管理所有服务的生命周期
- Filters 提供了多个拦截点,实现横切关注点
- Function Calling 是核心能力,让AI能主动调用工具
- Plugin 是能力的封装单元,可热插拔
2. 目录结构与核心流程 📁
目录组织逻辑
项目采用按功能模块划分的组织方式,清晰易懂:
dotnet/ ├─ src/ # 核心源代码 │ ├─ SemanticKernel.Abstractions/ ⭐ 抽象接口层 │ │ ├─ AI/ # AI服务接口 │ │ │ ├─ ChatCompletion/ # 对话完成 │ │ │ ├─ Embeddings/ # 文本嵌入 │ │ │ ├─ TextToImage/ # 文本生成图像 │ │ │ └─ AudioToText/ # 语音转文本 │ │ ├─ Functions/ # 函数系统 │ │ │ ├─ KernelFunction.cs # 函数抽象 │ │ │ ├─ KernelPlugin.cs # 插件抽象 │ │ │ └─ KernelArguments.cs # 参数传递 │ │ ├─ Kernel.cs # 🔥 核心Kernel类 │ │ ├─ Events/ # 事件系统 │ │ └─ Filters/ # 过滤器接口 │ │ │ ├─ SemanticKernel.Core/ ⭐ 核心实现层 │ │ ├─ Functions/ # 函数工厂 │ │ │ ├─ KernelFunctionFromMethod.cs │ │ │ └─ KernelFunctionFromPrompt.cs │ │ ├─ PromptTemplate/ # 模板引擎 │ │ ├─ TemplateEngine/ # Liquid模板 │ │ └─ Memory/ # 记忆系统 │ │ │ ├─ Connectors/ # 🔌 AI服务连接器 │ │ ├─ Connectors.OpenAI/ │ │ ├─ Connectors.AzureOpenAI/ │ │ ├─ Connectors.Google/ │ │ ├─ Connectors.Ollama/ │ │ └─ ... (15+ connectors) │ │ │ ├─ VectorData/ # 💾 向量数据层 │ │ ├─ VectorData.Abstractions/ # 统一接口 │ │ ├─ Qdrant/ # Qdrant实现 │ │ ├─ Pinecone/ # Pinecone实现 │ │ ├─ Redis/ # Redis实现 │ │ └─ ... (15+ vector stores) │ │ │ ├─ Agents/ # 🤖 Agent框架 │ │ ├─ Abstractions/ # Agent接口 │ │ ├─ Core/ # 核心Agent实现 │ │ ├─ OpenAI/ # OpenAI Assistants │ │ └─ Orchestration/ # Agent编排 │ │ │ ├─ Plugins/ # 🧩 插件库 │ │ ├─ Plugins.Core/ # 核心插件 │ │ ├─ Plugins.Web/ # 网页插件 │ │ └─ Plugins.MsGraph/ # Microsoft 365 │ │ │ ├─ Functions/ # 🔧 函数扩展 │ │ ├─ Functions.OpenApi/ # OpenAPI → Function │ │ ├─ Functions.Grpc/ # gRPC → Function │ │ └─ Functions.Yaml/ # YAML定义 │ │ │ └─ Experimental/ # 🧪 实验性功能 │ ├─ Process.Abstractions/ # 流程框架抽象 │ └─ Orchestration.Flow/ # 流程编排 │ ├─ samples/ # 📚 示例代码 │ ├─ GettingStarted/ # ⭐ 入门教程(从这里开始!) │ ├─ Concepts/ # 概念示例(按功能分类) │ ├─ Demos/ # 综合演示项目 │ │ ├─ VectorStoreRAG/ # RAG实现 │ │ ├─ AgentFrameworkWithAspire/ # Agent + Aspire │ │ └─ ProcessWithDapr/ # 分布式Process │ └─ GettingStartedWithAgents/ # Agent专题教程 │ ├─ test/ # 🧪 测试 │ └─ VectorData/ # 向量存储一致性测试 │ └─ notebooks/ # 📒 Jupyter笔记本 └─ 00-getting-started.ipynb # 交互式入门 关键文件定位 🎯
第一个应阅读的文件 (构建心智模型):
src/SemanticKernel.Abstractions/Kernel.cs(核心入口)// 这是整个框架的"心脏",理解它就理解了60%的设计 public sealed class Kernel { public IServiceProvider Services { get; } // DI容器 public KernelPluginCollection Plugins { get; } // 插件集合 public Task<FunctionResult> InvokeAsync(...); // 调用入口 }src/SemanticKernel.Abstractions/Functions/KernelFunction.cs// 理解"函数"是什么,它如何被调用 public abstract class KernelFunction { public KernelFunctionMetadata Metadata { get; } public Task<FunctionResult> InvokeAsync(...); }samples/GettingStarted/Step1_Create_Kernel.cs(最小示例)// 5分钟就能运行的第一个程序! Kernel kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion("gpt-4", apiKey) .Build(); Console.WriteLine(await kernel.InvokePromptAsync("讲个笑话"));
核心业务逻辑所在 (深入理解):
- 函数调用链路:
SemanticKernel.Core/Functions/KernelFunctionFromMethod.cs - Prompt渲染:
SemanticKernel.Core/PromptTemplate/KernelPromptTemplate.cs - OpenAI集成:
Connectors/Connectors.OpenAI/ - 向量搜索:
VectorData/VectorData.Abstractions/VectorStoreRecordCollection.cs
模块依赖关系 📊
graph TB A[应用层: samples/] -->|依赖| B[API层: SemanticKernel.Core] B -->|依赖| C[抽象层: SemanticKernel.Abstractions] C -->|依赖| D[向量抽象: VectorData.Abstractions] B -->|实现| E[Connectors.*] E -->|依赖| C B -->|实现| F[Plugins.*] F -->|依赖| C B -->|实现| G[Functions.*] G -->|依赖| C H[Agents.*] -->|依赖| C H -->|依赖| B I[VectorData实现] -->|依赖| D style C fill:#ff6b6b style B fill:#4ecdc4 style A fill:#95e1d3 依赖流向特点:
✅ 单向依赖: 所有模块都依赖Abstractions,不存在循环依赖
✅ 接口隔离: 连接器之间完全独立,互不影响
✅ 可替换性: 实现层可以随时替换而不影响上层
典型业务流程:智能客服机器人 🤖
场景:用户询问订单状态,AI自动查询数据库并回答
sequenceDiagram participant U as 用户 participant K as Kernel participant A as OpenAIChatCompletion participant P as OrderPlugin participant DB as 数据库 U->>K: "我的订单#12345现在什么状态?" K->>K: PromptRenderFilter拦截 K->>A: 发送Prompt + 注册的Functions A->>A: AI理解意图,决定调用GetOrderStatus A-->>K: 返回FunctionCallContent K->>K: FunctionInvocationFilter拦截 K->>P: 调用 GetOrderStatus("12345") P->>DB: SQL查询 DB-->>P: 返回{status: "已发货", eta: "明天"} P-->>K: FunctionResult K->>A: 提交函数执行结果 A->>A: 生成自然语言回答 A-->>K: "您的订单已发货,预计明天送达" K-->>U: 返回结果 实现文件索引:
- 入口:
samples/Concepts/FunctionCalling/FunctionCalling.cs - Plugin定义: 自定义类,使用
[KernelFunction]特性标记 - Kernel构建:
KernelBuilder.AddOpenAIChatCompletion(...).AddPlugin<OrderPlugin>().Build() - 过滤器注入:
builder.Services.AddSingleton<IFunctionInvocationFilter, LoggingFilter>()
3. 代码结构观察 🔍
代码组织模式
Semantic Kernel 遵循了现代C#最佳实践,代码质量非常高:
✅ 清晰的领域模型
// 核心概念都有明确的类型表达 Kernel → 编排中心 KernelFunction → 可执行的函数 KernelPlugin → 函数的集合 KernelArguments → 参数传递容器 FunctionResult → 执行结果 ✅ 接口与实现分离
IChatCompletionService (接口) ↑ 实现 ├─ OpenAIChatCompletionService ├─ AzureOpenAIChatCompletionService └─ GoogleGeminiChatCompletionService 切换AI提供商只需修改DI注册,代码无需改动!
✅ 异步优先设计
// 所有IO操作都是异步的,避免线程阻塞 Task<FunctionResult> InvokeAsync(...) IAsyncEnumerable<StreamingChatMessageContent> GetStreamingChatMessageContentsAsync(...) ✅ 泛型和约束
// 类型安全的服务获取 T GetRequiredService<T>() where T : IAIService IReadOnlyKernelPluginCollection Plugins { get; } 设计模式识别 🎨
1. 建造者模式 (Builder Pattern) - 随处可见
var kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion(modelId, apiKey) .AddAzureOpenAIEmbedding(deploymentName, endpoint, apiKey) .Plugins.AddFromType<TimePlugin>() .Build(); 2. 策略模式 (Strategy Pattern) - AI服务替换
// 通过接口IChatCompletionService抽象策略 // 运行时可动态选择不同实现 kernel.GetRequiredService<IChatCompletionService>(); 3. 装饰器模式 (Decorator Pattern) - 过滤器链
// 每个Filter都可以包装原始行为 public class LoggingFilter : IFunctionInvocationFilter { public async Task OnFunctionInvocationAsync( FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next) { _logger.LogInformation("调用前"); await next(context); // 调用下一个Filter或实际函数 _logger.LogInformation("调用后"); } } 4. 工厂模式 (Factory Pattern) - 函数创建
KernelFunctionFactory.CreateFromMethod(...) KernelFunctionFactory.CreateFromPrompt(...) KernelPluginFactory.CreateFromType<T>() 5. 依赖注入 (Dependency Injection) - 核心基础设施
// 所有服务都通过DI容器管理 public class MyPlugin { public MyPlugin(ILogger<MyPlugin> logger, IHttpClientFactory factory) { // 自动注入依赖 } } 6. 观察者模式 (Observer Pattern) - 事件系统
kernel.FunctionInvoking += (sender, e) => { /* 订阅事件 */ }; kernel.FunctionInvoked += (sender, e) => { /* 订阅事件 */ }; 代码质量观察 ⭐
✅ 优秀之处:
完善的XML文档注释
/// <summary> /// Invokes the specified function with the specified arguments. /// </summary> /// <param name="function">The function to invoke.</param> /// <param name="arguments">The arguments to pass to the function.</param> /// <param name="cancellationToken">Cancellation token.</param> /// <returns>The result of the function invocation.</returns>Nullable引用类型启用
#nullable enable public KernelFunction? GetFunction(string? pluginName, string functionName)编译时就能发现潜在的空引用问题!
Source Generator应用
[JsonSerializable(typeof(ChatMessageContent))] internal sealed partial class AbstractionsJsonContext : JsonSerializerContextAOT友好,性能优化
单元测试覆盖
SemanticKernel.UnitTests/包含大量测试- 使用 xUnit + Moq + FluentAssertions
- 测试覆盖率 > 80%
代码风格一致性
- 使用
.editorconfig统一格式 - 启用 Roslyn Analyzers
- 强制code review流程
- 使用
⚠️ 可以改进的地方 (学习机会):
部分方法较长
- 文件:
Connectors.OpenAI/ChatCompletion/OpenAIChatCompletionService.cs GetChatMessageContentsAsync方法超过100行- 💡 学习点: 可以提炼为更小的私有方法,提高可读性
- 文件:
复杂的泛型约束
- 文件:
VectorData.Abstractions/ - 泛型参数链过长,理解成本高
- 💡 学习点: 如何在类型安全和简洁性之间权衡
- 文件:
实验性功能标注
- 大量使用
[Experimental("SKEXP0XXX")]特性 - 代码:
src/Experimental/Process.Abstractions/ - 💡 学习点: 如何在开源项目中管理API稳定性
- 大量使用
TODO和FIXME
# 在代码中搜索这些标记,可以发现待改进点 git grep -n "// TODO" git grep -n "// FIXME"
潜在改进点(学习机会) 🎓
🔍 值得探索的重构机会:
向量存储一致性测试套件
- 路径:
test/VectorData/VectorData.ConformanceTests/ - 机会: 学习如何设计跨多个实现的一致性测试
- 思考: 如果增加新的向量存储,如何确保行为一致?
- 路径:
OpenAPI函数生成
- 路径:
Functions/Functions.OpenApi/ - 机会: OpenAPI spec → C# function 的代码生成逻辑
- 思考: 如何处理复杂的API认证? 如何优化生成代码的性能?
- 路径:
Agent编排复杂度
- 路径:
Agents/Orchestration/ - 机会: 多Agent协同的状态管理
- 思考: 如何避免Agent间的死循环? 如何实现超时和回退?
- 路径:
Prompt模板引擎
- 路径:
SemanticKernel.Core/TemplateEngine/ - 机会: 支持更多模板语法(Handlebars、Liquid已支持)
- 思考: 如何在安全性和灵活性之间权衡? 如何防止模板注入攻击?
- 路径:
第二部分:技能需求清单 📚
1. 基础技能要求 (必备) ✅
C# 编程语言
必须掌握的语法特性:
.NET 8.0 新特性
- Primary Constructors (主构造函数)
- Collection expressions (
[1, 2, 3]) required修饰符
异步编程 (Async/Await)
await foreach (var item in GetDataAsync()) { } IAsyncEnumerable<T>LINQ 和 Lambda表达式
plugins.Where(p => p.Name.StartsWith("Time")) .Select(p => p.Functions) .SelectMany(f => f);泛型和约束
T GetRequiredService<T>() where T : class特性 (Attributes)
[KernelFunction] [Description("Gets the current time")] public string GetTime() => DateTime.Now.ToString();
.NET框架核心
必须了解的组件:
依赖注入 (DI)
// 掌握三种生命周期 services.AddSingleton<IMyService, MyService>(); services.AddScoped<IMyService, MyService>(); services.AddTransient<IMyService, MyService>();配置系统
IConfiguration configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .AddEnvironmentVariables() .AddUserSecrets<Program>() .Build();日志系统 (ILogger)
_logger.LogInformation("Processing {Count} items", items.Count);HttpClient & HttpClientFactory
var client = _httpClientFactory.CreateClient("OpenAI");
具体版本要求 📦
从 Directory.Packages.props 分析:
<!-- 核心依赖 --> <PackageVersion Include="Microsoft.Extensions.AI" Version="9.9.0" /> <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" /> <PackageVersion Include="System.Text.Json" Version="8.0.6" /> <!-- AI SDK --> <PackageVersion Include="Azure.AI.OpenAI" Version="[2.3.0-beta.2]" /> <PackageVersion Include="OpenAI" Version="[2.4.0]" /> <!-- 测试框架 --> <PackageVersion Include="xunit" Version="2.9.3" /> <PackageVersion Include="Moq" Version="[4.18.4]" /> <PackageVersion Include="FluentAssertions" Version="8.2.0" /> ⚠️ 版本兼容性重要提示:
- Semantic Kernel 支持 .NET 8.0 和 .NET Standard 2.0
- 如果使用 Azure OpenAI,确保版本 >= 2.3.0-beta.2
- OpenAI官方SDK必须使用
[2.4.0](方括号表示精确版本)
基础工具和概念 🛠️
开发工具:
- ✅ Visual Studio 2022 / Rider / VS Code
- ✅ .NET CLI (
dotnet build,dotnet test,dotnet run) - ✅ Git (基本的 commit、branch、pull request)
- ✅ NuGet Package Manager
AI基础概念 (不需要深度数学,但要理解):
- Embedding (向量嵌入): 文本 → 数字向量
- Token: LLM的"单词"单位,影响成本
- Temperature: 控制输出随机性 (0=确定, 1=创造性)
- Function Calling: AI主动调用外部工具的能力
- RAG (检索增强生成): 结合知识库的问答
2. 进阶技能要求 (深入掌握) 🚀
架构模式和设计原则
必须理解的模式:
插件架构 (Plugin Architecture)
- 如何设计可热插拔的模块?
- Semantic Kernel 的
KernelPlugin实现
管道模式 (Pipeline Pattern)
- 过滤器链的实现原理
- 中间件的概念 (类似ASP.NET Core中间件)
SOLID原则实践
- SRP: 每个Plugin只做一件事
- OCP: 通过扩展Connector支持新AI,而非修改核心
- LSP: 所有
IChatCompletionService可互换 - ISP: 接口细分 (IAudioToText, ITextToImage 等)
- DIP: 依赖抽象而非具体实现
依赖倒置实践
// 业务层依赖接口,而非具体的OpenAI public class MyService { private readonly IChatCompletionService _chat; public MyService(IChatCompletionService chat) => _chat = chat; }
AI应用特有模式
Prompt Engineering:
- 如何编写清晰的System Message
- 如何使用Few-Shot Learning (提供示例)
- 如何处理上下文窗口限制
Function Calling最佳实践:
- 函数描述必须清晰明确
- 参数类型和枚举值要详细标注
- 使用
[Description]特性引导AI理解
向量搜索优化:
- Chunk Size (分块大小) 的选择
- Top-K 和相似度阈值的调优
- 混合搜索 (Hybrid Search) 的应用
领域特定知识
如果开发特定领域的AI应用,需要了解:
企业应用开发:
- Azure Active Directory 认证集成
- API密钥安全管理 (Azure Key Vault)
- 成本控制和配额管理
对话式AI:
- 对话状态管理
- 多轮对话的上下文维护
- 意图识别和槽位填充
RAG系统构建:
- 文档解析 (PDF、Word、Markdown)
- 文本分块策略
- 向量数据库选型
3. 技能掌握程度建议 🎯
根据不同学习目标,我给你制定了三条路径:
初学者路径 (1-2周) 🌱
目标: 能运行示例,修改Prompt,调用基本功能
必学内容:
- ✅ C# 基础语法 (async/await, LINQ)
- ✅ 如何使用 Kernel.CreateBuilder() 创建Kernel
- ✅ 如何调用 InvokePromptAsync()
- ✅ 如何创建简单的Plugin (使用
[KernelFunction]) - ✅ 如何配置 OpenAI API Key
跳过内容 (暂时不需要):
❌ 向量数据库
❌ Agent编排
❌ 自定义Connector
❌ 过滤器高级用法
实践项目: 构建一个"智能助手"聊天机器人,能回答问题并查询天气
有经验的开发者路径 (2-4周) 🌳
目标: 能独立构建生产级AI应用,处理复杂场景
必学内容:
- ✅ 深入理解 Function Calling 机制
- ✅ 掌握多种AI服务的切换 (OpenAI ↔ Azure OpenAI ↔ Ollama)
- ✅ 向量数据库集成 (选一个: Qdrant / Redis / PostgreSQL)
- ✅ 过滤器系统 (实现日志、性能监控、内容审核)
- ✅ 依赖注入最佳实践
- ✅ 单元测试和集成测试
进阶内容:
- RAG (检索增强生成) 实现
- Streaming (流式输出) 处理
- 错误处理和重试策略
- Token管理和成本优化
实践项目: 构建一个"企业知识库问答系统",支持文档上传、向量检索、多轮对话
意欲贡献代码的进阶者路径 (持续学习) 🌟
目标: 理解源码设计,能为开源社区贡献代码
必学内容:
- ✅ 阅读核心源码 (Kernel.cs, KernelFunction.cs)
- ✅ 理解所有设计模式的应用
- ✅ 掌握 Source Generator 和 Native AOT
- ✅ 了解性能优化技巧 (benchmarking, profiling)
- ✅ 熟悉开源协作流程 (GitHub PR, Code Review)
深度探索:
- 实现自定义Connector (如接入国产大模型)
- 扩展Prompt模板引擎
- 贡献向量存储适配器
- 优化Agent编排算法
参与方式:
- 在 GitHub 上认领
good first issue标签的问题 - 改进文档和示例
- 提交 bug 报告和 feature 请求
第三部分:学习路径规划 🎯
1. 项目运行入口定位 (快速上手) 🚀
让我们先跑起来!我保证你在 30分钟内 就能看到第一个AI应用运行起来。
环境配置清单 ✅
步骤1: 安装.NET SDK
# Windows (使用 winget) winget install Microsoft.DotNet.SDK.9 # macOS (使用 Homebrew) brew install dotnet-sdk # 验证安装 dotnet --version # 应输出 9.0.xxx 步骤2: 克隆仓库
cd D:\Work\_projects\ git clone https://github.com/microsoft/semantic-kernel.git cd semantic-kernel/dotnet 步骤3: 配置API密钥
方式A: 使用 Secret Manager (推荐)
cd samples/GettingStarted dotnet user-secrets init dotnet user-secrets set "OpenAI:ApiKey" "sk-your-key-here" dotnet user-secrets set "OpenAI:ChatModelId" "gpt-4" 方式B: 使用环境变量
# PowerShell $env:OpenAI__ApiKey = "sk-your-key-here" $env:OpenAI__ChatModelId = "gpt-4" 步骤4: 运行第一个示例
cd samples/GettingStarted dotnet run --filter Step1_Create_Kernel ⚠️ 常见配置陷阱及解决方案
陷阱1: "OpenAI API key not configured"
# 原因: 密钥未正确配置 # 解决: 再次执行 dotnet user-secrets set "OpenAI:ApiKey" "your-key" # 验证: dotnet user-secrets list 陷阱2: "Target framework not supported"
# 原因: .NET SDK版本过低 # 解决: 确保安装了 .NET 8.0 或更高版本 # 检查: dotnet --list-sdks 陷阱3: "Rate limit exceeded"
// 原因: OpenAI免费额度耗尽或请求过快 // 解决: 添加重试策略 var kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion(modelId, apiKey) .Build(); // 或使用本地模型 (Ollama) var kernel = Kernel.CreateBuilder() .AddOllamaChatCompletion("llama3.2", new Uri("http://localhost:11434")) .Build(); 陷阱4: "Connector not found"
# 原因: 缺少NuGet包 # 解决: 手动添加连接器包 dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI 验证成功标志 ✅
运行成功后,你应该能看到类似输出:
What color is the sky? The sky is typically blue during the day... What color is the sea? The sea can appear blue, green, or even gray... 如果看到以上输出,恭喜你! 🎉 你已经成功运行了第一个Semantic Kernel程序!
2. 循序渐进学习计划 (四阶段法) 📖
阶段一: 环境搭建和项目启动 (1-2天) 🌱
学习目标:
- ✅ 成功运行至少3个示例
- ✅ 理解 Kernel 的基本概念
- ✅ 会修改 Prompt 并观察输出变化
学习路径:
Day 1 上午: 运行Getting Started示例
cd samples/GettingStarted dotnet test --logger "console;verbosity=detailed" --filter "FullyQualifiedName~Step1" dotnet test --filter "FullyQualifiedName~Step2" dotnet test --filter "FullyQualifiedName~Step3" 在IDE中打开这些文件,逐行阅读代码和注释:
Step1_Create_Kernel.cs- 理解Kernel的创建Step2_Add_Plugins.cs- 理解Plugin的概念Step3_Yaml_Prompt.cs- 理解Prompt模板
Day 1 下午: 修改示例进行实验
挑战1: 修改 Step1,让AI回答你的自定义问题
Console.WriteLine(await kernel.InvokePromptAsync("用一句话介绍量子计算")); 挑战2: 创建你的第一个Plugin
public class CalculatorPlugin { [KernelFunction] [Description("计算两个数的和")] public int Add(int a, int b) => a + b; } // 注册并使用 kernel.Plugins.AddFromType<CalculatorPlugin>(); await kernel.InvokeAsync("CalculatorPlugin", "Add", new() { ["a"] = 5, ["b"] = 3 }); Day 2: 理解核心概念
阅读官方文档(边读边运行代码):
尝试使用Jupyter Notebook:
cd notebooks # 安装Jupyter: pip install jupyter jupyter notebook 00-getting-started.ipynb 阶段成果: 能独立创建一个Kernel,添加Plugin,执行基本的AI调用
阶段二: 核心流程理解 (3-5天) 🌳
学习目标:
- ✅ 深入理解 Function Calling 机制
- ✅ 掌握多种AI服务的使用
- ✅ 能追踪完整的请求流程并画出流程图
学习路径:
Day 3-4: Function Calling深度实践
精读示例:
cd samples/Concepts/FunctionCalling # 运行所有function calling相关示例 dotnet test --filter "FullyQualifiedName~FunctionCalling" 关键示例:
FunctionCalling.cs- 基础function callingFunctionCalling_ReturnMetadata.cs- 理解执行结果OpenAI_FunctionCalling.cs- OpenAI特定用法
实践任务: 构建一个多功能助手
// 需求: AI助手能查天气、翻译文本、计算数学表达式 public class WeatherPlugin { [KernelFunction, Description("获取指定城市的天气")] public string GetWeather(string city) => $"{city}: 晴天, 25°C"; } public class TranslatorPlugin { [KernelFunction, Description("将文本翻译成指定语言")] public async Task<string> Translate(string text, string targetLang) { // 这里可以调用翻译API return $"[{targetLang}] {text}"; } } // 组合使用 var kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion("gpt-4", apiKey) .Plugins.AddFromType<WeatherPlugin>() .Plugins.AddFromType<TranslatorPlugin>() .Build(); var result = await kernel.InvokePromptAsync( "北京天气怎么样? 然后把结果翻译成英文" ); Day 5: 多AI服务切换实践
尝试所有连接器:
cd samples/Concepts/ChatCompletion # OpenAI dotnet test --filter "OpenAI_ChatCompletion" # Azure OpenAI dotnet test --filter "AzureOpenAI_ChatCompletion" # Ollama (本地) dotnet test --filter "Ollama_ChatCompletion" # Google Gemini dotnet test --filter "Google_GeminiChatCompletion" 实践任务: 实现AI Provider降级
// 目标: OpenAI失败时自动切换到Ollama var openAI = kernel.Services.GetService<IChatCompletionService>("openai"); var ollama = kernel.Services.GetService<IChatCompletionService>("ollama"); try { return await openAI.GetChatMessageContentsAsync(...); } catch (HttpRequestException) { _logger.LogWarning("OpenAI失败,切换到Ollama"); return await ollama.GetChatMessageContentsAsync(...); } 阶段成果:
- 能画出完整的Function Calling流程图
- 理解不同AI服务的差异和选型依据
- 能调试Kernel的执行流程
阶段三: 模块深入和定制开发 (1-2周) 🚀
学习目标:
- ✅ 掌握向量数据库和RAG
- ✅ 实现自定义过滤器
- ✅ 能构建完整的AI应用
Week 1: 向量数据库和RAG
Day 1-2: 向量存储基础
cd samples/GettingStartedWithVectorStores dotnet run 关键概念:
- Embedding: 文本 → 向量
- 向量相似度搜索
- 数据导入和检索
实践: 选择一个向量数据库深入学习
// 推荐新手使用 InMemory (无需额外服务) var vectorStore = new InMemoryVectorStore(); var collection = vectorStore.GetCollection<string, Hotel>("hotels"); // 导入数据 await collection.UpsertAsync(new Hotel { Id = "h1", Name = "海景酒店", Description = "位于海边,视野开阔,环境优美" }); // 搜索 var results = await collection.SearchAsync("我想找海边的酒店", top: 3); Day 3-4: 构建RAG系统
精读示例:
cd samples/Concepts/RAG dotnet test --filter "WithPlugins" cd samples/Demos/VectorStoreRAG dotnet run 实践项目: 个人知识库问答
功能需求: 1. 支持上传TXT/PDF/Markdown文档 2. 自动分块并存储到向量数据库 3. 用户提问时检索相关片段 4. AI基于检索结果回答问题 技术栈: - 向量存储: Qdrant / InMemory - 文本分块: TextChunker - Embedding: OpenAI text-embedding-3-small - LLM: GPT-4 Week 2: 过滤器和高级特性
Day 1-2: 实现自定义过滤器
cd samples/Concepts/Filtering dotnet test --filter "FunctionInvocationFiltering" 实践: 实现一个完整的监控过滤器
public class MonitoringFilter : IFunctionInvocationFilter { private readonly ILogger _logger; private readonly Histogram<double> _durationHistogram; public async Task OnFunctionInvocationAsync( FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next) { var sw = Stopwatch.StartNew(); try { await next(context); _logger.LogInformation( "Function {Name} succeeded in {Duration}ms", context.Function.Name, sw.ElapsedMilliseconds); } catch (Exception ex) { _logger.LogError(ex, "Function {Name} failed", context.Function.Name); throw; } finally { _durationHistogram.Record(sw.Elapsed.TotalMilliseconds); } } } Day 3-5: 综合项目实战
选择一个Demo深入研究并改进:
cd samples/Demos # 推荐项目: # 1. VectorStoreRAG - RAG完整实现 # 2. ContentSafety - 内容安全审核 # 3. AgentFrameworkWithAspire - Agent + 微服务 阶段成果:
- 能独立构建一个RAG应用
- 理解过滤器的最佳实践
- 掌握性能监控和日志记录
阶段四: 架构理解和贡献指南 (2周+) 🌟
学习目标:
- ✅ 理解源码设计和架构决策
- ✅ 能优化性能和处理边缘情况
- ✅ 具备贡献开源代码的能力
Week 1: 源码深度阅读
Day 1-3: 核心类源码分析
按顺序阅读以下文件(在IDE中打开,添加注释):
Kernel.cs- 理解Kernel的初始化和生命周期KernelFunction.cs- 理解函数抽象KernelFunctionFromMethod.cs- 理解如何将C#方法转为FunctionKernelFunctionFromPrompt.cs- 理解Prompt如何被执行
阅读技巧:
- 使用 "Find All References" 查看调用关系
- 用调试器单步执行示例代码
- 画出类图和调用时序图
Day 4-5: Connector实现分析
深入一个Connector源码:
cd src/Connectors/Connectors.OpenAI # 重点阅读: - OpenAIChatCompletionService.cs - ClientCore.cs 学习重点:
- HTTP请求是如何构建的
- 流式响应如何处理
- 错误重试机制
- Token计算逻辑
Week 2: 实践与贡献
Day 1-3: 性能优化实践
使用BenchmarkDotNet进行性能测试:
[MemoryDiagnoser] public class KernelBenchmarks { [Benchmark] public async Task InvokePrompt() { await _kernel.InvokePromptAsync("Hello"); } } 优化方向:
- 减少不必要的对象分配
- 使用
ObjectPool复用对象 - 优化字符串拼接
- 使用
Span<T>避免数组复制
Day 4-7: 开源贡献
阅读贡献指南
# 查看项目根目录的CONTRIBUTING.md认领Issue
- 访问 https://github.com/microsoft/semantic-kernel/issues
- 筛选
good first issue标签 - 在Issue下评论表示愿意处理
提交PR
git checkout -b feature/my-improvement # 修改代码 dotnet test git commit -m "feat: add xxx support" git push origin feature/my-improvement # 在GitHub上创建Pull Request
阶段成果:
- 能阅读并理解核心源码
- 提交至少1个PR (即使是文档改进)
- 理解项目的架构演进方向
3. 学习路径流程图 🗺️
graph TD Start[开始学习] --> Env[阶段一: 环境搭建<br/>1-2天] Env --> Check1{能运行示例?} Check1 -->|否| Debug1[检查.NET版本<br/>检查API Key<br/>查看错误日志] Debug1 --> Env Check1 -->|是| Core[阶段二: 核心流程<br/>3-5天] Core --> Learn1[学习Function Calling] Core --> Learn2[学习多AI服务] Core --> Check2{能画流程图?} Check2 -->|否| Practice1[运行更多示例<br/>添加日志输出<br/>使用调试器] Practice1 --> Core Check2 -->|是| Advanced[阶段三: 模块深入<br/>1-2周] Advanced --> RAG[RAG实现] Advanced --> Vector[向量数据库] Advanced --> Filter[过滤器] Advanced --> Check3{完成项目?} Check3 -->|否| Practice2[选择更小的目标<br/>参考Demos<br/>寻求社区帮助] Practice2 --> Advanced Check3 -->|是| Expert[阶段四: 架构理解<br/>2周+] Expert --> Source[阅读源码] Expert --> Optimize[性能优化] Expert --> Contribute[开源贡献] Expert --> Check4{准备好贡献?} Check4 -->|否| Practice3[继续学习设计模式<br/>参与社区讨论<br/>改进个人项目] Practice3 --> Expert Check4 -->|是| End[🎉 成为SK专家!] style Start fill:#a8e6cf style End fill:#ffd3b6 style Env fill:#ffaaa5 style Core fill:#ff8b94 style Advanced fill:#a8e6cf style Expert fill:#dcedc1 第四部分:实践建议和进阶指导 💡
1. 调试技巧和常见陷阱 🐛
推荐的调试方法
方法1: 启用详细日志
var builder = Kernel.CreateBuilder(); builder.Services.AddLogging(c => c .AddConsole() .SetMinimumLevel(LogLevel.Trace)); // 显示所有日志 var kernel = builder.Build(); 方法2: 使用IFunctionInvocationFilter记录所有调用
public class DebugFilter : IFunctionInvocationFilter { public async Task OnFunctionInvocationAsync( FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next) { Console.WriteLine($"[调用] {context.Function.Name}"); Console.WriteLine($"[参数] {JsonSerializer.Serialize(context.Arguments)}"); await next(context); Console.WriteLine($"[结果] {context.Result}"); } } 方法3: 使用Fiddler/Postman抓包
// 配置HTTP代理,查看实际的API请求 var handler = new HttpClientHandler { Proxy = new WebProxy("http://localhost:8888") }; builder.Services.AddHttpClient("OpenAI") .ConfigurePrimaryHttpMessageHandler(() => handler); 新人常见陷阱 (Top 5)
陷阱1: API密钥泄露到GitHub
❌ 错误做法: 直接写在代码里 var apiKey = "sk-proj-..."; ✅ 正确做法: 使用环境变量或Secret Manager var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY"); # 并确保 .gitignore 包含 appsettings.*.json 陷阱2: 忘记处理异常
❌ 裸调用,生产环境崩溃 await kernel.InvokePromptAsync(prompt); ✅ 捕获并处理 try { return await kernel.InvokePromptAsync(prompt); } catch (HttpOperationException ex) when (ex.StatusCode == HttpStatusCode.TooManyRequests) { _logger.LogWarning("Rate limited, retry after {Seconds}s", ex.RetryAfter); await Task.Delay(ex.RetryAfter); return await kernel.InvokePromptAsync(prompt); // 重试 } 陷阱3: Function描述不清晰导致AI调用失败
❌ 模糊的描述 [KernelFunction, Description("Get data")] public string GetData(string input) => "..."; ✅ 清晰的描述 [KernelFunction] [Description("根据城市名称获取实时天气信息,包括温度、湿度和天气状况")] public string GetWeather( [Description("城市名称,例如: 北京, 上海")] string cityName) => "..."; 陷阱4: 上下文窗口溢出
❌ 无限制累积对话历史 history.AddUserMessage(input); var response = await chat.GetChatMessageContentAsync(history); history.AddAssistantMessage(response); // 几十轮对话后超出token限制! ✅ 使用ChatHistoryReducer var reducer = new ChatHistoryTruncationReducer(maxTokens: 4000); var reducedHistory = await reducer.ReduceAsync(history); 陷阱5: 忘记Dispose
❌ 资源泄漏 var kernel = Kernel.CreateBuilder()...Build(); // 使用后忘记释放 ✅ 使用using语句 (虽然Kernel不需要Dispose,但HttpClient等资源需要) await using var serviceProvider = services.BuildServiceProvider(); 2. 扩展练习建议 (从易到难) 🎯
初级练习 (1-2天)
练习1: 修改Prompt模板
# 修改 samples/GettingStarted/Resources/GenerateStory.yaml template: | 写一个关于{ {$topic}}的{ {$style}}故事, 故事长度为{ {$length}}字。 练习2: 创建天气查询Plugin
public class WeatherPlugin { private readonly HttpClient _http; [KernelFunction, Description("查询指定城市的天气")] public async Task<string> GetWeather(string city) { // 调用真实的天气API (如 wttr.in) var response = await _http.GetStringAsync($"https://wttr.in/{city}?format=3"); return response; } } 中级练习 (3-5天)
练习3: 实现多轮对话机器人
// 需求: 维护对话历史,支持上下文理解 var history = new ChatHistory(); history.AddSystemMessage("你是一个友好的助手"); while (true) { Console.Write("用户: "); var input = Console.ReadLine(); if (input == "exit") break; history.AddUserMessage(input); var response = await chat.GetChatMessageContentAsync(history, kernel: kernel); history.AddAssistantMessage(response); Console.WriteLine($"助手: {response}"); } 练习4: 构建PDF文档问答系统
步骤: 1. 使用PdfPig库解析PDF 2. 使用TextChunker分块 3. 生成Embedding并存储到向量数据库 4. 用户提问时检索Top 3相关块 5. 将检索结果注入Prompt,让AI回答 高级练习 (1-2周)
练习5: 实现Agent工作流
场景: 旅行规划助手 Agent1: 搜索目的地信息 Agent2: 查询酒店和机票价格 Agent3: 生成行程建议 Agent4: 整合所有信息生成最终方案 挑战: Agent间的消息传递,状态管理,错误恢复 练习6: 优化RAG性能
任务: 1. 实现混合搜索(BM25 + 向量搜索) 2. 添加重排序(Rerank) 3. 实现查询扩展 4. 测量检索准确率(Recall@10) 3. 参与贡献的途径 🤝
找到适合的Issue
步骤1: 浏览Issue列表
访问: https://github.com/microsoft/semantic-kernel/issues 筛选条件: ✅ is:open ✅ label:"good first issue" ✅ label:"help wanted" 推荐的Issue类型 (新手友好):
- 文档改进 (Documentation)
- 示例代码添加 (Samples)
- 单元测试补充 (Tests)
- 小的Bug修复 (Bugs)
步骤2: 评论表达意愿
Hi! I'd like to work on this issue. I'm familiar with C# and [相关技术]. Could you assign this to me? 代码规范要求
项目使用 .editorconfig 和 Roslyn Analyzers 强制代码风格:
必须遵守的规范:
// 1. Nullable reference types 必须正确标注 public string? GetOptionalValue() => null; // ✅ public string GetOptionalValue() => null; // ❌ 警告 // 2. 异步方法必须以Async结尾 public async Task<string> FetchDataAsync() { } // ✅ public async Task<string> FetchData() { } // ❌ // 3. 使用表达式主体 (简短方法) public int Add(int a, int b) => a + b; // ✅ // 4. 接口以I开头 public interface IChatService { } // ✅ // 5. 使用 file-scoped namespace namespace Microsoft.SemanticKernel; // ✅ 运行代码检查:
# 格式化代码 dotnet format # 运行所有测试 dotnet test # 检查编译警告 dotnet build /warnaserror 提交流程
步骤1: Fork仓库
# 在GitHub上点击Fork按钮 # 克隆你的Fork git clone https://github.com/YOUR_USERNAME/semantic-kernel.git cd semantic-kernel/dotnet 步骤2: 创建分支
git checkout -b feature/add-custom-connector 步骤3: 提交代码
git add . git commit -m "feat: add support for Anthropic Claude connector" # 提交信息格式: feat/fix/docs/test/refactor: description 步骤4: 推送并创建PR
git push origin feature/add-custom-connector # 访问GitHub,点击 "Create Pull Request" PR描述模板:
## 变更说明 添加了对Anthropic Claude的支持 ## 变更类型 - [ ] Bug修复 - [x] 新功能 - [ ] 文档更新 - [ ] 测试改进 ## 测试 - [x] 添加了单元测试 - [x] 手动测试通过 ## 相关Issue Closes #1234 社区互动
推荐渠道:
- 💬 GitHub Discussions: 提问和讨论
- 🐦 Twitter: 关注 @MSSemanticKernel
- 📺 YouTube: Microsoft Semantic Kernel频道
- 📝 博客: https://devblogs.microsoft.com/
第五部分:技术栈学习指引 🌐
1. 官方文档定位 📚
Semantic Kernel核心文档
必读文档:
官方文档中心 ⭐⭐⭐⭐⭐
- 链接: https://learn.microsoft.com/semantic-kernel/
- 重点章节:
- Overview → Concepts (理解核心概念)
- Quickstart → Get Started (快速入门)
- AI Services → Connectors (连接器选型)
- Agents → Building Agents (Agent开发)
GitHub Wiki ⭐⭐⭐⭐
- 链接: https://github.com/microsoft/semantic-kernel/wiki
- 内容: 架构决策记录(ADR),设计文档
API文档 ⭐⭐⭐
- 链接: https://learn.microsoft.com/dotnet/api/microsoft.semantickernel
- 用途: 查询详细的API签名和用法
项目自身文档
项目包含丰富的README和示例:
必读文档索引: ├─ README.md (项目根目录) ⭐ 5分钟快速开始 ├─ dotnet/README.md ⭐ .NET SDK概览 ├─ dotnet/samples/README.md ⭐ 示例导航 ├─ dotnet/samples/GettingStarted/README.md ⭐ 入门教程 ├─ dotnet/samples/Concepts/README.md ⭐ 概念示例索引 ├─ dotnet/docs/EXPERIMENTS.md ⚠️ 实验性功能清单 └─ dotnet/docs/TELEMETRY.md 📊 遥测和监控 权威技术书籍
推荐书籍:
《Building LLM Apps: Create Intelligent Apps and Agents with Large Language Models》 ⭐⭐⭐⭐⭐
- 作者: Valentina Alto
- 内容: 使用Semantic Kernel构建LLM应用的完整指南
- 适合: 有一定.NET基础的开发者
《Generative AI with LangChain》 ⭐⭐⭐⭐
- 作者: Ben Auffarth
- 内容: 虽然是LangChain,但AI应用架构思想通用
- 适合: 理解AI编排框架的设计理念
《Designing Data-Intensive Applications》 ⭐⭐⭐⭐⭐
- 作者: Martin Kleppmann
- 内容: 向量数据库、分布式系统基础
- 适合: 构建生产级AI系统
2. 学习路径建议 🛤️
技能学习顺序
Phase 1: 基础夯实 (2-3周)
Week 1: C# + .NET 基础 ├─ async/await 深入理解 ├─ LINQ 和 Lambda ├─ 依赖注入原理 └─ 泛型和反射 Week 2: AI基础概念 ├─ LLM工作原理(不需要数学) ├─ Token和上下文窗口 ├─ Prompt Engineering └─ Function Calling原理 Week 3: Semantic Kernel入门 ├─ 运行所有GettingStarted示例 ├─ 阅读核心类源码 └─ 完成第一个完整项目 Phase 2: 进阶提升 (4-6周)
Week 4-5: 向量数据库和RAG ├─ Embedding原理 ├─ 向量相似度计算 ├─ RAG系统设计 └─ 至少掌握一个向量数据库 Week 6-7: Agent和编排 ├─ Agent架构模式 ├─ 多Agent协同 ├─ 状态管理 └─ 错误处理和重试 Week 8-9: 生产化 ├─ 监控和日志 ├─ 性能优化 ├─ 成本控制 └─ 安全和合规 Phase 3: 专家之路 (持续)
深度方向选择: ├─ 方向A: AI Infra (基础设施) │ ├─ 向量数据库内核 │ ├─ 模型推理优化 │ └─ 分布式训练 │ ├─ 方向B: AI Application (应用) │ ├─ 垂直领域AI助手 │ ├─ 多模态应用 │ └─ AI Agent产品化 │ └─ 方向C: AI Framework (框架) ├─ 参与Semantic Kernel开发 ├─ 设计新的编排模式 └─ 贡献核心功能 核心概念优先级
🔥 优先掌握 (前2周):
- Kernel的生命周期
- Function和Plugin的概念
- Prompt模板语法
- 基本的依赖注入
- 如何调用OpenAI API
⭐ 重要概念 (第3-4周):
- Function Calling机制
- 向量Embedding和相似度搜索
- ChatHistory管理
- 流式输出处理
- 多AI服务切换
💡 进阶概念 (第5-8周):
- Agent编排模式
- 过滤器链设计
- 自定义Connector开发
- RAG系统优化
- 性能调优技巧
🚀 高级概念 (长期):
- 分布式Agent架构
- Source Generator应用
- Native AOT优化
- 大规模部署策略
- AI系统可观测性
实践项目推荐
新手项目:
- 智能TODO列表 - 使用自然语言添加任务
- 天气查询机器人 - Function Calling入门
- Markdown笔记助手 - 总结、提取关键词
进阶项目:
- 企业知识库问答 - RAG完整实现
- Code Review助手 - 分析代码并提供建议
- 多语言客服系统 - 多AI服务 + 翻译
专家项目:
- 垂直领域Agent平台 - 金融/医疗/法律
- AI应用市场 - Plugin生态
- 低代码AI编排平台 - 可视化Flow设计
3. 工具与环境配置指南 🔧
开发环境搭建
IDE推荐:
方案A: Visual Studio 2022 (Windows推荐)
下载: https://visualstudio.microsoft.com/ 版本: Community (免费) 必装扩展: ✅ ReSharper (可选,提升开发效率) ✅ GitHub Copilot (AI代码助手) ✅ Markdown Editor 方案B: JetBrains Rider (跨平台,性能最佳)
下载: https://www.jetbrains.com/rider/ 优势: 更快的索引,更好的重构工具 学生免费: 使用教育邮箱申请 方案C: Visual Studio Code (轻量级)
下载: https://code.visualstudio.com/ 必装扩展: ✅ C# Dev Kit ✅ .NET Install Tool ✅ REST Client (测试API) 常用工具使用
1. HTTP调试工具
Postman (测试AI API)
# 示例: 测试OpenAI API POST https://api.openai.com/v1/chat/completions Headers: Authorization: Bearer sk-... Content-Type: application/json Body: { "model": "gpt-4", "messages": [{ "role": "user", "content": "Hello"}] } 2. 向量数据库工具
Qdrant Web UI
docker run -p 6333:6333 qdrant/qdrant # 访问 http://localhost:6333/dashboard 3. 日志查看器
Seq (结构化日志)
docker run -d -p 5341:80 datalust/seq # 在代码中配置 builder.Services.AddLogging(c => c.AddSeq("http://localhost:5341")); 4. 性能分析
dotnet-counters (实时监控)
dotnet tool install -g dotnet-counters dotnet-counters monitor --process-id <PID> BenchmarkDotNet (性能测试)
[MemoryDiagnoser] public class MyBenchmarks { [Benchmark] public async Task TestKernel() { } } 4. 进阶拓展方向 🚀
技术博客与专家观点
官方博客:
- Microsoft DevBlogs: https://devblogs.microsoft.com/semantic-kernel/
- Azure AI Blog: https://techcommunity.microsoft.com/azure-ai
推荐博主:
- Stephen Toub (微软性能专家,异步编程)
- Scott Hanselman (.NET生态)
- John Maeda (AI产品思考)
中文资源:
- 知乎专栏: 搜索 "Semantic Kernel"
- B站视频: 微软Reactor系列讲座
- 博客园: .NET + AI 标签
相关技术大会
必看会议:
Microsoft Build ⭐⭐⭐⭐⭐
- 时间: 每年5月
- 内容: Azure AI新功能,Semantic Kernel路线图
- 链接: https://build.microsoft.com/
.NET Conf ⭐⭐⭐⭐
- 时间: 每年11月
- 内容: .NET新特性,最佳实践
- 链接: https://www.dotnetconf.net/
AI Engineer Summit ⭐⭐⭐⭐
- 内容: AI应用工程实践
- 链接: https://www.ai.engineer/
会议录像资源:
YouTube频道: ├─ Microsoft Developer (官方) ├─ dotNET (社区) └─ GOTO Conferences (高质量技术分享) 社区与论坛
官方社区:
- GitHub Discussions: https://github.com/microsoft/semantic-kernel/discussions
- 提问、分享项目、讨论新特性
技术论坛:
- Stack Overflow: 标签
semantic-kernel - Reddit: r/dotnet, r/MachineLearning
- Discord: Microsoft AI Community
国内社区:
- 掘金: .NET专栏
- SegmentFault: AI技术标签
- 开源中国: Semantic Kernel镜像仓库
总结与寄语 🎓
亲爱的学习者,恭喜你读到这里! 🎉
你现在手上拥有的,是一份凝结了Semantic Kernel精华的完整学习地图。记住,学习AI开发不是百米冲刺,而是一场马拉松。这个框架背后蕴含的不仅是代码,更是微软在AI编排领域的深度思考和工程实践。
最后的建议 💡:
- 动手实践胜过千遍阅读 - 每学一个概念就写代码验证
- 不要畏惧源码 - 最好的文档就是代码本身
- 积极参与社区 - 在帮助别人的过程中你会学得更快
- 保持好奇心 - AI领域每天都在进化,保持学习的热情
如果在学习过程中遇到困难,记住:
- 所有的专家都是从新手走来的
- GitHub Issues是你的朋友
- 社区永远欢迎你的问题
现在,关掉这份文档,打开IDE,开始你的第一行代码吧! 🚀
cd samples/GettingStarted dotnet run 愿你在AI开发的道路上越走越远,创造出改变世界的应用! ✨