Semantic Kernel 的定位:企业 AI 编排层

Semantic Kernel(SK)不是 Agent 框架,而是AI 能力的编排内核。它的设计目标是在企业应用中嵌入 AI 能力,而不是构建独立的 Agent。这个定位决定了它的架构选择:

特征Semantic KernelLangChainAutoGen
定位AI 编排内核LLM 应用框架多 Agent 对话框架
目标场景企业应用集成通用 LLM 应用Agent 协作
语言C# + PythonPython 为主Python
核心抽象Plugin + PlannerChain + ToolAgent + 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 KernelLangChain
插件/工具Plugin 系统,注解驱动Tool,继承/装饰器
编排Planner 自动编排Chain 手动编排
记忆Semantic Memory(可检索)Memory(对话历史为主)
语言C# + PythonPython + 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论坛 — 全球首个碳基硅基认知交流平台。

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