Semantic Kernel 的定位:企业 AI 编排层
Semantic Kernel(SK)不是 Agent 框架,而是AI 能力的编排内核。它的设计目标是在企业应用中嵌入 AI 能力,而不是构建独立的 Agent。这个定位决定了它的架构选择:
| 特征 | Semantic Kernel | LangChain | AutoGen |
|---|---|---|---|
| 定位 | AI 编排内核 | LLM 应用框架 | 多 Agent 对话框架 |
| 目标场景 | 企业应用集成 | 通用 LLM 应用 | Agent 协作 |
| 语言 | C# + Python | Python 为主 | Python |
| 核心抽象 | Plugin + Planner | Chain + Tool | Agent + GroupChat |
| 企业就绪 | 高(Azure 原生) | 中 | 中 |
Plugin 系统:SK 的核心
SK 的 Plugin 系统是它的灵魂。一个 Plugin 就是一组可被 AI 调用的函数:
Python 版
from semantic_kernel.functions import kernel_function
class SearchPlugin:
"""搜索插件"""
@kernel_function(description="搜索网络获取信息", name="search")
def search(self, query: str) -> str:
return web_search(query)
@kernel_function(description="搜索本地知识库", name="search_docs")
def search_docs(self, query: str, top_k: int = 3) -> list[dict]:
return vector_db.search(query, top_k)
class EmailPlugin:
"""邮件插件"""
@kernel_function(description="发送邮件", name="send_email")
def send_email(self, to: str, subject: str, body: str) -> str:
smtp.send(to, subject, body)
return f"邮件已发送至 {to}"
# 注册插件
kernel.add_plugin(SearchPlugin(), "Search")
kernel.add_plugin(EmailPlugin(), "Email")
C# 版
public class SearchPlugin
{
[KernelFunction("search")]
[Description("搜索网络获取信息")]
public string Search(string query)
{
return WebSearch(query);
}
[KernelFunction("search_docs")]
[Description("搜索本地知识库")]
public List<Dictionary<string, object>> SearchDocs(
string query,
[Description("返回结果数量")] int topK = 3)
{
return VectorDb.Search(query, topK);
}
}
// 注册
kernel.Plugins.AddFromType<SearchPlugin>("Search");
kernel.Plugins.AddFromType<EmailPlugin>("Email");
Python 和 C# 的 API 高度对称——这是 SK 的一个重要优势。C# 团队和 Python 团队可以共享设计文档,代码迁移成本低。
Plugin 设计要点
class DataAnalysisPlugin:
"""数据分析插件 - 展示好的插件设计"""
@kernel_function(description="分析CSV文件并生成统计摘要", name="analyze_csv")
def analyze_csv(
self,
file_path: str,
columns: str = "" # 可选参数
) -> str:
"""分析指定CSV文件,返回统计摘要
Args:
file_path: CSV文件路径
columns: 要分析的列名,逗号分隔,空则分析所有列
"""
import pandas as pd
df = pd.read_csv(file_path)
if columns:
cols = [c.strip() for c in columns.split(",")]
df = df[cols]
summary = df.describe(include='all')
return summary.to_string()
关键原则:description 是给 AI 看的——它决定了 AI 何时、如何调用这个函数。描述要精确,参数含义要清晰。
Planner:自动编排
SK 的 Planner 是从"插件集合"到"执行计划"的自动编排器:
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import KernelArguments
# 配置 LLM
kernel.add_service(OpenAIChatCompletion(
service_id="gpt4",
ai_model_id="gpt-4o"
))
# 创建 Planner
from semantic_kernel.planners.function_calling_stepwise_planner import (
FunctionCallingStepwisePlanner,
FunctionCallingStepwisePlannerOptions
)
planner = FunctionCallingStepwisePlanner(
service_id="gpt4",
options=FunctionCallingStepwisePlannerOptions(
max_iterations=10,
max_tokens=4000,
)
)
# 给一个目标,Planner 自动选择和调用 Plugin
result = await planner.invoke(kernel, "分析 sales.csv 文件,找出销售额最高的产品,然后发邮件给 manager@company.com 汇报结果")
# Planner 会自动: 1. 调用 analyze_csv 2. 解析结果 3. 调用 send_email
Planner 的演进
| 版本 | Planner 类型 | 状态 | 特点 |
|---|---|---|---|
| 早期 | Sequential Planner | 已弃用 | 生成 JSON 步骤序列 |
| 早期 | Action Planner | 已弃用 | 单步调用 |
| 当前 | Function Calling Stepwise | 推荐 | 基于 LLM function calling |
| 当前 | Handlebars Planner | 可选 | 生成 Handlebars 模板 |
当前版本基本统一到 Function Calling Stepwise Planner,利用 OpenAI/Anthropic 的原生 function calling 能力,比早期的文本解析方案可靠得多。
Memory:语义记忆
SK 的 Memory 不仅是聊天历史,而是语义记忆——可检索的知识存储:
from semantic_kernel.memory import SemanticTextMemory, VolatileMemoryStore
from semantic_kernel.connectors.ai.open_ai import OpenAITextEmbedding
# 配置语义记忆
memory = SemanticTextMemory(
storage=VolatileMemoryStore(),
embeddings_generator=OpenAITextEmbedding(service_id="embedding", ai_model_id="text-embedding-3-small")
)
# 保存记忆
await memory.save_information("MyChatBot", "用户偏好使用Python,擅长数据分析", id="user_pref_1")
await memory.save_information("MyChatBot", "项目使用FastAPI+PostgreSQL技术栈", id="project_stack")
# 语义搜索
results = await memory.search("MyChatBot", "用户的技术背景", limit=3)
for result in results:
print(f"[{result.relevance}]: {result.text}")
生产环境的 Memory
VolatileMemoryStore 只在内存中。生产环境用 Azure AI Search 或 ChromaDB:
from semantic_kernel.connectors.memory.azureaisearch import AzureAISearchMemoryStore
memory_store = AzureAISearchMemoryStore(
endpoint="https://your-search.search.windows.net",
api_key="your-api-key"
)
Connector:多模型接入
SK 的 Connector 层屏蔽了不同 LLM 的 API 差异:
# OpenAI
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
kernel.add_service(OpenAIChatCompletion(service_id="openai", ai_model_id="gpt-4o"))
# Azure OpenAI
from semantic_kernel.connectors.ai.open_ai import AzureOpenAIChatCompletion
kernel.add_service(AzureOpenAIChatCompletion(
service_id="azure",
deployment_name="gpt-4o",
endpoint="https://your-resource.openai.azure.com",
api_key="your-key"
))
# Ollama(本地模型)
from semantic_kernel.connectors.ai.ollama import OllamaChatCompletion
kernel.add_service(OllamaChatCompletion(service_id="ollama", ai_model_id="llama3"))
# 使用时指定 service_id
response = await kernel.invoke_prompt(
"总结以下内容: {{$input}}",
arguments=KernelArguments(input=long_text),
service_id="azure" # 指定用哪个模型
)
与 LangChain 对比
| 维度 | Semantic Kernel | LangChain |
|---|---|---|
| 插件/工具 | Plugin 系统,注解驱动 | Tool,继承/装饰器 |
| 编排 | Planner 自动编排 | Chain 手动编排 |
| 记忆 | Semantic Memory(可检索) | Memory(对话历史为主) |
| 语言 | C# + Python | Python + JS/TS |
| 企业集成 | Azure 原生,.NET 生态 | 需自行集成 |
| 社区规模 | 较小,微软主导 | 最大 |
| 学习曲线 | 中等(概念多) | 低(直觉化) |
| Agent 能力 | 弱(不是设计目标) | 强(AgentExecutor/LangGraph) |
SK 的优势场景
- .NET 企业应用:SK 的 C# SDK 是一等公民,这在 .NET 企业环境是决定性优势
- Azure 生态:与 Azure OpenAI、AI Search、Blob Storage 深度集成
- 插件复用:Plugin 设计清晰,适合大型团队的插件分工开发
- 合规要求:微软的合规认证体系对企业采购友好
SK 的劣势
- 不是 Agent 框架:构建真正的 Agent 需要 LangGraph 或 AutoGen 配合
- Python 生态弱于 LangChain:社区组件数量、第三方集成少
- 文档分散:C# 和 Python 文档经常不同步,示例不够丰富
- Planner 可控性差:自动编排的黑盒程度比 LangGraph 高
企业集成示例
# 企业场景:客服系统
# SK 负责意图识别 + 插件调用 + 记忆检索
class CustomerServicePlugin:
@kernel_function(description="查询订单状态", name="query_order")
def query_order(self, order_id: str) -> str:
return order_service.get_status(order_id)
@kernel_function(description="创建工单", name="create_ticket")
def create_ticket(self, customer_id: str, issue: str, priority: str = "normal") -> str:
return ticket_service.create(customer_id, issue, priority)
class KnowledgePlugin:
@kernel_function(description="搜索产品文档", name="search_kb")
def search_kb(self, query: str) -> str:
results = memory.search("products", query, limit=3)
return "\n".join([r.text for r in results])
# 注册插件
kernel.add_plugin(CustomerServicePlugin(), "CustomerService")
kernel.add_plugin(KnowledgePlugin(), "Knowledge")
# Planner 自动处理用户请求
response = await planner.invoke(kernel,
"我的订单 #12345 还没到,帮我查一下,如果延误了就创建一个加急工单")
结论
Semantic Kernel 是企业 .NET 生态的 AI 编排首选。如果你在 Azure/.NET 技术栈中工作,SK 的集成体验是其他框架无法比的。但如果你用 Python 构建 Agent 应用,LangChain/LangGraph 生态更成熟。
一句话:SK 是企业 AI 的"中间件"——它不帮你建 Agent,它帮你在企业应用中编排 AI 能力。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
