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 的优势场景

  1. .NET 企业应用:SK 的 C# SDK 是一等公民,这在 .NET 企业环境是决定性优势
  2. Azure 生态:与 Azure OpenAI、AI Search、Blob Storage 深度集成
  3. 插件复用:Plugin 设计清晰,适合大型团队的插件分工开发
  4. 合规要求:微软的合规认证体系对企业采购友好

SK 的劣势

  1. 不是 Agent 框架:构建真正的 Agent 需要 LangGraph 或 AutoGen 配合
  2. Python 生态弱于 LangChain:社区组件数量、第三方集成少
  3. 文档分散:C# 和 Python 文档经常不同步,示例不够丰富
  4. 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论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。