第一个应用 #

概述 #

本节将带你创建第一个 Semantic Kernel 应用,通过一个简单的示例了解:

  1. 如何创建 Kernel
  2. 如何配置 AI 服务
  3. 如何执行提示词
  4. 如何处理返回结果

C# 版本 #

1. 创建基础应用 #

csharp
using Microsoft.SemanticKernel;

// 创建 Kernel 构建器
var builder = Kernel.CreateBuilder();

// 添加 OpenAI 聊天服务
builder.AddOpenAIChatCompletion(
    modelId: "gpt-4",
    apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")!
);

// 构建 Kernel
var kernel = builder.Build();

// 执行简单提示词
var result = await kernel.InvokePromptAsync("你好,请用一句话介绍自己");

// 输出结果
Console.WriteLine(result);

2. 运行结果 #

text
你好!我是一个 AI 助手,致力于帮助用户解决问题、提供信息和支持。

3. 完整示例代码 #

csharp
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;

var builder = Kernel.CreateBuilder();

// 方式一:使用 OpenAI
builder.AddOpenAIChatCompletion(
    modelId: "gpt-4o-mini",
    apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")!
);

// 方式二:使用 Azure OpenAI
// builder.AddAzureOpenAIChatCompletion(
//     deploymentName: "gpt-4",
//     endpoint: Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!,
//     apiKey: Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY")!
// );

var kernel = builder.Build();

Console.WriteLine("=== Semantic Kernel 第一个应用 ===\n");

// 示例 1:简单提示词
Console.WriteLine("示例 1:简单提示词");
var result1 = await kernel.InvokePromptAsync("什么是 Semantic Kernel?用一句话回答");
Console.WriteLine($"结果:{result1}\n");

// 示例 2:带参数的提示词
Console.WriteLine("示例 2:带参数的提示词");
var arguments = new KernelArguments
{
    ["topic"] = "人工智能",
    ["language"] = "中文"
};
var result2 = await kernel.InvokePromptAsync(
    "请用{{$language}}写一段关于{{$topic}}的简短介绍",
    arguments
);
Console.WriteLine($"结果:{result2}\n");

// 示例 3:获取更多信息
Console.WriteLine("示例 3:获取更多信息");
var result3 = await kernel.InvokePromptAsync("列举三种编程语言的名称");
Console.WriteLine($"结果:{result3}");

// 获取 token 使用情况
var usage = result3.Metadata?["Usage"] as Dictionary<string, object>;
if (usage != null)
{
    Console.WriteLine($"Prompt Tokens: {usage["PromptTokens"]}");
    Console.WriteLine($"Completion Tokens: {usage["CompletionTokens"]}");
    Console.WriteLine($"Total Tokens: {usage["TotalTokens"]}");
}

Console.WriteLine("\n应用执行完成!");

Python 版本 #

1. 创建基础应用 #

python
import asyncio
import os
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion

async def main():
    # 创建 Kernel
    kernel = sk.Kernel()
    
    # 添加 OpenAI 服务
    kernel.add_service(OpenAIChatCompletion(
        service_id="gpt-4",
        ai_model_id="gpt-4o-mini",
        api_key=os.getenv("OPENAI_API_KEY")
    ))
    
    # 执行简单提示词
    result = await kernel.invoke_prompt("你好,请用一句话介绍自己")
    
    # 输出结果
    print(result)

asyncio.run(main())

2. 运行结果 #

text
你好!我是一个 AI 助手,致力于帮助用户解决问题、提供信息和支持。

3. 完整示例代码 #

python
import asyncio
import os
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.contents.chat_history import ChatHistory

async def main():
    # 创建 Kernel
    kernel = sk.Kernel()
    
    # 添加 OpenAI 服务
    kernel.add_service(OpenAIChatCompletion(
        service_id="gpt-4",
        ai_model_id="gpt-4o-mini",
        api_key=os.getenv("OPENAI_API_KEY")
    ))
    
    print("=== Semantic Kernel 第一个应用 ===\n")
    
    # 示例 1:简单提示词
    print("示例 1:简单提示词")
    result1 = await kernel.invoke_prompt("什么是 Semantic Kernel?用一句话回答")
    print(f"结果:{result1}\n")
    
    # 示例 2:带参数的提示词
    print("示例 2:带参数的提示词")
    result2 = await kernel.invoke_prompt(
        "请用{{$language}}写一段关于{{$topic}}的简短介绍",
        language="中文",
        topic="人工智能"
    )
    print(f"结果:{result2}\n")
    
    # 示例 3:多轮对话
    print("示例 3:多轮对话")
    chat = ChatHistory()
    chat.add_user_message("你好,我叫小明")
    chat.add_user_message("你还记得我的名字吗?")
    
    result3 = await kernel.invoke_prompt("{{chat}}", chat=chat)
    print(f"结果:{result3}\n")
    
    print("应用执行完成!")

asyncio.run(main())

代码解析 #

核心流程 #

text
┌─────────────────────────────────────────────────────────────┐
│                    应用执行流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 创建 Kernel                                             │
│     ┌─────────────────────────────────────────────────┐    │
│     │  var builder = Kernel.CreateBuilder();          │    │
│     │  builder.AddOpenAIChatCompletion(...);          │    │
│     │  var kernel = builder.Build();                  │    │
│     └─────────────────────────────────────────────────┘    │
│                            │                                │
│                            ▼                                │
│  2. 准备提示词                                              │
│     ┌─────────────────────────────────────────────────┐    │
│     │  var prompt = "你好,请介绍自己";                │    │
│     │  var arguments = new KernelArguments {...};     │    │
│     └─────────────────────────────────────────────────┘    │
│                            │                                │
│                            ▼                                │
│  3. 执行调用                                                │
│     ┌─────────────────────────────────────────────────┐    │
│     │  var result = await kernel.InvokePromptAsync(); │    │
│     └─────────────────────────────────────────────────┘    │
│                            │                                │
│                            ▼                                │
│  4. 处理结果                                                │
│     ┌─────────────────────────────────────────────────┐    │
│     │  Console.WriteLine(result);                     │    │
│     │  var metadata = result.Metadata;                │    │
│     └─────────────────────────────────────────────────┘    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Kernel 创建详解 #

csharp
// Kernel 是 Semantic Kernel 的核心
// 它管理所有服务和插件的协调

var builder = Kernel.CreateBuilder();

// 添加 AI 服务(至少需要一个)
builder.AddOpenAIChatCompletion(
    modelId: "gpt-4",           // 模型 ID
    apiKey: "your-api-key",      // API 密钥
    orgId: "your-org-id"         // 组织 ID(可选)
);

// 可以添加多个服务
builder.AddAzureOpenAIChatCompletion(
    deploymentName: "gpt-4",
    endpoint: "https://your-resource.openai.azure.com/",
    apiKey: "your-azure-key"
);

// 构建不可变的 Kernel 实例
var kernel = builder.Build();

提示词执行详解 #

csharp
// 方式 1:直接执行简单提示词
var result = await kernel.InvokePromptAsync("你的问题");

// 方式 2:带参数的提示词
var arguments = new KernelArguments
{
    ["name"] = "小明",
    ["age"] = 25
};
var result = await kernel.InvokePromptAsync(
    "你好,{{$name}},你今年{{$age}}岁",
    arguments
);

// 方式 3:指定服务 ID(当有多个服务时)
var result = await kernel.InvokePromptAsync(
    "你的问题",
    arguments,
    serviceName: "gpt-4"
);

结果处理详解 #

csharp
// 获取字符串结果
string text = result.ToString();

// 获取完整结果对象
var functionResult = result;

// 获取元数据
var metadata = result.Metadata;
if (metadata != null)
{
    // Token 使用情况
    var usage = metadata["Usage"];
    
    // 模型 ID
    var modelId = metadata["ModelId"];
    
    // 完成原因
    var finishReason = metadata["FinishReason"];
}

// 获取原始响应
var rawResponse = result.GetValue<object>();

进阶示例 #

使用设置参数 #

csharp
using Microsoft.SemanticKernel.Connectors.OpenAI;

var executionSettings = new OpenAIPromptExecutionSettings
{
    MaxTokens = 500,
    Temperature = 0.7,
    TopP = 0.9,
    FrequencyPenalty = 0.5,
    PresencePenalty = 0.5
};

var arguments = new KernelArguments(executionSettings)
{
    ["topic"] = "机器学习"
};

var result = await kernel.InvokePromptAsync(
    "写一篇关于{{$topic}}的短文",
    arguments
);

错误处理 #

csharp
try
{
    var result = await kernel.InvokePromptAsync("你的问题");
    Console.WriteLine(result);
}
catch (HttpOperationException ex)
{
    Console.WriteLine($"HTTP 错误: {ex.StatusCode}");
    Console.WriteLine($"响应内容: {ex.ResponseContent}");
}
catch (KernelException ex)
{
    Console.WriteLine($"Kernel 错误: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"未知错误: {ex.Message}");
}

异步流式输出 #

csharp
await foreach (var chunk in kernel.InvokePromptStreamingAsync("写一首诗"))
{
    Console.Write(chunk);
}

运行应用 #

C# 运行 #

bash
# 设置环境变量
export OPENAI_API_KEY=your-api-key

# 运行应用
dotnet run

Python 运行 #

bash
# 设置环境变量
export OPENAI_API_KEY=your-api-key

# 运行应用
python main.py

常见问题 #

Q1: API Key 无效 #

text
错误信息:Invalid API Key
解决方案:
1. 检查 API Key 是否正确复制
2. 确认 API Key 未过期
3. 检查环境变量是否正确设置

Q2: 网络连接失败 #

text
错误信息:Connection refused
解决方案:
1. 检查网络连接
2. 配置代理(如需要)
3. 检查防火墙设置

Q3: 模型不存在 #

text
错误信息:Model not found
解决方案:
1. 确认模型 ID 正确
2. 检查账户是否有权限访问该模型
3. Azure OpenAI 需要确认部署名称

下一步 #

恭喜你完成了第一个 Semantic Kernel 应用!接下来学习 核心概念,深入了解 Semantic Kernel 的架构设计。

最后更新:2026-04-04