知识模块
🤖 Agent 知识模块
六、主流 Agent 框架
Semantic Kernel

Semantic Kernel

Semantic Kernel 是微软推出的轻量级 SDK,旨在让开发者轻松地将 LLM 与传统编程语言结合。它采用"技能"(Skills)和"规划器"(Planner)的设计,特别适合企业级应用开发。


一、核心原理

1.1 设计哲学

Semantic Kernel 的设计理念是"语义代码融合":

┌─────────────────────────────────────────────────────────────┐
│                    Semantic Kernel 设计哲学                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   核心理念:让 AI 与代码无缝协作                             │
│                                                             │
│   传统开发:                                                 │
│   ┌─────────────────────────────────────────────────────┐  │
│   │  程序员编写代码 → 编译执行 → 输出结果                │  │
│   │  (代码逻辑固定,无法灵活应对变化)                  │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   Semantic Kernel:                                          │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                                                      │  │
│   │   ┌───────────┐     ┌───────────┐                  │  │
│   │   │  自然语言 │     │  传统代码 │                  │  │
│   │   │  (Ask)    │     │  (Code)   │                  │  │
│   │   └─────┬─────┘     └─────┬─────┘                  │  │
│   │         │                 │                         │  │
│   │         └────────┬────────┘                         │  │
│   │                  │                                   │  │
│   │                  ↓                                   │  │
│   │         ┌───────────────┐                           │  │
│   │         │    Kernel     │                           │  │
│   │         │  (语义内核)   │                           │  │
│   │         └───────┬───────┘                           │  │
│   │                 │                                    │  │
│   │         ┌───────┴───────┐                           │  │
│   │         ↓               ↓                            │  │
│   │   ┌──────────┐   ┌──────────┐                       │  │
│   │   │  Skills  │   │ Planner  │                       │  │
│   │   │  技能库  │   │  规划器  │                       │  │
│   │   └──────────┘   └──────────┘                       │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   优势:                                                     │
│   • AI 理解自然语言意图                                     │
│   • 自动组合技能完成任务                                    │
│   • 代码和 AI 无缝协作                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 核心概念

概念英文作用类比
Kernel内核管理所有组件的容器操作系统
Skill技能可被 AI 调用的功能单元函数/方法
Planner规划器将目标分解为技能调用序列编排引擎
Memory记忆存储上下文和嵌入向量数据库
Connector连接器连接外部 AI 服务和 API适配器

1.3 架构图

┌─────────────────────────────────────────────────────────────┐
│                    Semantic Kernel 架构                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    应用层                           │  │
│   │  ┌──────────┐  ┌──────────┐  ┌──────────┐          │  │
│   │  │  Copilot │  │  Chatbot │  │ Workflow │          │  │
│   │  └──────────┘  └──────────┘  └──────────┘          │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              Semantic Kernel (SDK)                  │  │
│   │                                                      │  │
│   │  ┌─────────────────────────────────────────────┐    │  │
│   │  │              Kernel Core                     │    │  │
│   │  │  ┌─────────┐  ┌─────────┐  ┌─────────┐     │    │  │
│   │  │  │ Skills  │  │ Planner │  │ Memory  │     │    │  │
│   │  │  │ Manager │  │ Manager │  │ Manager │     │    │  │
│   │  │  └─────────┘  └─────────┘  └─────────┘     │    │  │
│   │  └─────────────────────────────────────────────┘    │  │
│   │                         │                            │  │
│   │  ┌─────────────────────────────────────────────┐    │  │
│   │  │              Connectors                      │    │  │
│   │  │  ┌─────────┐  ┌─────────┐  ┌─────────┐     │    │  │
│   │  │  │OpenAI   │  │ Azure    │  │ Hugging  │     │    │  │
│   │  │  │Connector│  │ OpenAI   │  │ Face     │     │    │  │
│   │  │  └─────────┘  └─────────┘  └─────────┘     │    │  │
│   │  └─────────────────────────────────────────────┘    │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              外部服务 & 数据源                       │  │
│   │  ┌──────────┐  ┌──────────┐  ┌──────────┐          │  │
│   │  │ OpenAI   │  │  Azure   │  │ Database │          │  │
│   │  │   API    │  │ Services │  │  Storage │          │  │
│   │  └──────────┘  └──────────┘  └──────────┘          │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

二、核心组件详解

2.1 Kernel(内核)

Kernel 是 Semantic Kernel 的核心容器:

"""
Semantic Kernel 初始化示例
Python 版本
"""
 
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import (
    OpenAIChatCompletion,
    OpenAITextEmbedding
)
 
 
# ========== 1. 创建 Kernel ==========
 
def create_kernel():
    """创建基础 Kernel"""
    kernel = sk.Kernel()
    
    # 配置 AI 服务
    api_key = "your-openai-api-key"
    
    # 添加聊天模型
    kernel.add_chat_service(
        "chat-gpt",
        OpenAIChatCompletion(
            model_id="gpt-4",
            api_key=api_key
        )
    )
    
    # 添加嵌入模型
    kernel.add_text_embedding_generation_service(
        "embedding",
        OpenAITextEmbedding(
            model_id="text-embedding-ada-002",
            api_key=api_key
        )
    )
    
    return kernel
 
 
# ========== 2. 配置多模型 ==========
 
def configure_multi_model():
    """配置多模型 Kernel"""
    kernel = sk.Kernel()
    
    # 主力模型:GPT-4
    kernel.add_chat_service(
        "gpt4",
        OpenAIChatCompletion(model_id="gpt-4", api_key="...")
    )
    
    # 快速模型:GPT-3.5
    kernel.add_chat_service(
        "gpt35",
        OpenAIChatCompletion(model_id="gpt-3.5-turbo", api_key="...")
    )
    
    # 不同模型用于不同场景
    # gpt4 用于复杂推理
    # gpt35 用于快速响应
    
    return kernel
 
 
# ========== 3. 使用 Azure OpenAI ==========
 
def create_azure_kernel():
    """使用 Azure OpenAI"""
    kernel = sk.Kernel()
    
    from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
    
    kernel.add_chat_service(
        "azure-gpt4",
        AzureChatCompletion(
            deployment_name="gpt-4-deployment",
            endpoint="https://your-resource.openai.azure.com/",
            api_key="your-azure-api-key",
            api_version="2024-02-15-preview"
        )
    )
    
    return kernel

2.2 Skills(技能)

Skills 是 Semantic Kernel 的核心概念,分为两类:

┌─────────────────────────────────────────────────────────────┐
│                    Skills 类型                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              Semantic Skills (语义技能)              │  │
│   │                                                      │  │
│   │  特点:使用自然语言定义,由 LLM 执行                 │  │
│   │                                                      │  │
│   │  示例:                                              │  │
│   │  • SummarizeSkill: "总结以下文本"                    │  │
│   │  • TranslateSkill: "将文本翻译成中文"                │  │
│   │  • QASkill: "回答问题"                               │  │
│   │                                                      │  │
│   │  实现:Prompt Template                               │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              Native Skills (原生技能)                │  │
│   │                                                      │  │
│   │  特点:使用编程语言实现,执行确定性行为              │  │
│   │                                                      │  │
│   │  示例:                                              │  │
│   │  • FileSkill: 文件读写                               │  │
│   │  • HttpSkill: HTTP 请求                              │  │
│   │  • MathSkill: 数学计算                               │  │
│   │  • TimeSkill: 时间操作                               │  │
│   │                                                      │  │
│   │  实现:Python/C# 函数                                │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   两者协作:                                                 │
│   Semantic Skills ←→ Native Skills                         │
│   AI 能力            代码能力                               │
│         ↘            ↙                                      │
│           组合完成复杂任务                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

代码示例:

"""
Semantic Kernel Skills 示例
"""
 
from semantic_kernel.skill_definition import sk_function, sk_function_context_parameter
from semantic_kernel.orchestration.sk_context import SKContext
 
 
# ========== 1. Native Skills (原生技能) ==========
 
class MathSkills:
    """数学计算技能"""
    
    @sk_function(
        description="计算两个数的和",
        name="add"
    )
    @sk_function_context_parameter(
        name="a",
        description="第一个数字"
    )
    @sk_function_context_parameter(
        name="b",
        description="第二个数字"
    )
    def add(self, context: SKContext) -> str:
        a = float(context["a"])
        b = float(context["b"])
        return str(a + b)
    
    @sk_function(
        description="计算两个数的乘积",
        name="multiply"
    )
    def multiply(self, context: SKContext) -> str:
        a = float(context["a"])
        b = float(context["b"])
        return str(a * b)
    
    @sk_function(
        description="计算平方根",
        name="sqrt"
    )
    def sqrt(self, context: SKContext) -> str:
        import math
        n = float(context["input"])
        return str(math.sqrt(n))
 
 
class TimeSkills:
    """时间操作技能"""
    
    @sk_function(
        description="获取当前时间",
        name="now"
    )
    def now(self) -> str:
        from datetime import datetime
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    @sk_function(
        description="获取当前日期",
        name="today"
    )
    def today(self) -> str:
        from datetime import datetime
        return datetime.now().strftime("%Y-%m-%d")
    
    @sk_function(
        description="计算日期差",
        name="date_diff"
    )
    def date_diff(self, context: SKContext) -> str:
        from datetime import datetime
        date1 = datetime.strptime(context["date1"], "%Y-%m-%d")
        date2 = datetime.strptime(context["date2"], "%Y-%m-%d")
        delta = abs((date2 - date1).days)
        return str(delta)
 
 
class FileSkills:
    """文件操作技能"""
    
    @sk_function(
        description="读取文件内容",
        name="read"
    )
    def read(self, context: SKContext) -> str:
        filepath = context["filepath"]
        try:
            with open(filepath, 'r', encoding='utf-8') as f:
                return f.read()
        except Exception as e:
            return f"读取错误: {str(e)}"
    
    @sk_function(
        description="写入文件",
        name="write"
    )
    def write(self, context: SKContext) -> str:
        filepath = context["filepath"]
        content = context["content"]
        try:
            with open(filepath, 'w', encoding='utf-8') as f:
                f.write(content)
            return "写入成功"
        except Exception as e:
            return f"写入错误: {str(e)}"
 
 
# ========== 2. Semantic Skills (语义技能) ==========
 
# 语义技能通过 Prompt Template 定义
# 存储在 skills/ 目录下的 .txt 或 .json 文件中
 
# 示例:skills/SummarizeSkill/skill.txt
SUMMARIZE_PROMPT = """
请总结以下文本的要点:
 
{{$input}}
 
总结:
"""
 
# 示例:skills/TranslateSkill/skill.txt
TRANSLATE_PROMPT = """
将以下文本翻译成 {{$language}}
 
{{$input}}
 
翻译结果:
"""
 
 
# ========== 3. 注册和使用技能 ==========
 
async def register_and_use_skills():
    """注册和使用技能"""
    kernel = create_kernel()
    
    # 注册原生技能
    kernel.import_skill(MathSkills(), skill_name="math")
    kernel.import_skill(TimeSkills(), skill_name="time")
    kernel.import_skill(FileSkills(), skill_name="file")
    
    # 注册语义技能
    # kernel.import_semantic_skill_from_directory("./skills", "SummarizeSkill")
    
    # 使用原生技能
    math_skill = kernel.skills.get_function("math", "add")
    
    context = kernel.create_new_context()
    context["a"] = "10"
    context["b"] = "20"
    
    result = await kernel.run_async(math_skill, input_vars=context.variables)
    print(f"10 + 20 = {result}")  # 输出: 30
    
    # 使用时间技能
    time_skill = kernel.skills.get_function("time", "now")
    result = await kernel.run_async(time_skill)
    print(f"当前时间: {result}")

2.3 Planner(规划器)

Planner 是 Semantic Kernel 的核心特性,负责将用户意图转化为技能调用序列:

┌─────────────────────────────────────────────────────────────┐
│                    Planner 工作流程                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   用户请求:                                                 │
│   "今天是什么日期?计算今天到 2024-12-31 的天数差"          │
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    Planner                          │  │
│   │                                                      │  │
│   │  1. 分析请求:                                       │  │
│   │     • 需要获取当前日期                               │  │
│   │     • 需要计算日期差                                 │  │
│   │                                                      │  │
│   │  2. 匹配技能:                                       │  │
│   │     • time.today → 获取当前日期                     │  │
│   │     • time.date_diff → 计算日期差                   │  │
│   │                                                      │  │
│   │  3. 生成计划:                                       │  │
│   │     Step 1: result_1 = time.today()                 │  │
│   │     Step 2: result_2 = time.date_diff(              │  │
│   │         date1=result_1,                              │  │
│   │         date2="2024-12-31"                           │  │
│   │     )                                                │  │
│   │     Step 3: return result_2                          │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    执行计划                          │  │
│   │                                                      │  │
│   │  Step 1: time.today()                               │  │
│   │           → "2024-03-15"                            │  │
│   │                                                      │  │
│   │  Step 2: time.date_diff("2024-03-15", "2024-12-31") │  │
│   │           → "291"                                   │  │
│   │                                                      │  │
│   │  结果:距离 2024-12-31 还有 291 天                   │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

代码示例:

"""
Semantic Kernel Planner 示例
"""
 
from semantic_kernel.planning import (
    SequentialPlanner,
    ActionPlanner,
    StepwisePlanner
)
 
 
# ========== 1. Sequential Planner ==========
 
async def sequential_planner_example(kernel):
    """
    Sequential Planner
    生成线性执行的计划
    """
    # 导入技能
    kernel.import_skill(MathSkills(), skill_name="math")
    kernel.import_skill(TimeSkills(), skill_name="time")
    
    # 创建规划器
    planner = SequentialPlanner(kernel)
    
    # 生成计划
    plan = await planner.create_plan(
        "计算 10 加 20 的结果,然后计算这个结果的平方根"
    )
    
    # 执行计划
    result = await plan.invoke_async()
    print(f"结果: {result}")
    
    # 查看计划步骤
    print("\n计划步骤:")
    for step in plan.steps:
        print(f"  - {step.description}")
 
 
# ========== 2. Action Planner ==========
 
async def action_planner_example(kernel):
    """
    Action Planner
    选择最合适的单个技能执行
    """
    planner = ActionPlanner(kernel)
    
    # 分析并选择最佳技能
    plan = await planner.create_plan(
        "告诉我现在是什么时间"
    )
    
    result = await plan.invoke_async()
    print(f"结果: {result}")
 
 
# ========== 3. Stepwise Planner ==========
 
async def stepwise_planner_example(kernel):
    """
    Stepwise Planner
    逐步执行,支持条件判断和循环
    """
    planner = StepwisePlanner(kernel)
    
    plan = await planner.create_plan(
        "帮我分析当前日期,计算距离年底还有多少天"
    )
    
    result = await plan.invoke_async()
    print(f"结果: {result}")
 
 
# ========== 4. 自定义 Planner ==========
 
class CustomPlanner:
    """
    自定义规划器
    可以实现特定的规划逻辑
    """
    
    def __init__(self, kernel):
        self.kernel = kernel
    
    async def create_plan(self, goal: str):
        """
        创建自定义计划
        
        Args:
            goal: 用户目标
            
        Returns:
            执行计划
        """
        # 1. 分析目标
        analysis = await self._analyze_goal(goal)
        
        # 2. 选择技能
        skills = self._select_skills(analysis)
        
        # 3. 排序技能
        ordered = self._order_skills(skills)
        
        # 4. 创建计划
        plan = self._build_plan(ordered)
        
        return plan
    
    async def _analyze_goal(self, goal):
        """分析目标"""
        # 使用 LLM 分析目标
        # 返回需要的操作类型
        pass
    
    def _select_skills(self, analysis):
        """选择技能"""
        # 根据分析结果选择合适的技能
        pass
    
    def _order_skills(self, skills):
        """排序技能"""
        # 确定执行顺序
        pass
    
    def _build_plan(self, skills):
        """构建计划"""
        # 创建执行计划
        pass

2.4 Memory(记忆)

"""
Semantic Kernel Memory 示例
"""
 
from semantic_kernel.memory.semantic_text_memory import SemanticTextMemory
from semantic_kernel.memory.volatile_memory_store import VolatileMemoryStore
 
 
# ========== 1. 基础记忆 ==========
 
async def basic_memory_example(kernel):
    """基础记忆使用"""
    # 创建记忆存储
    memory = SemanticTextMemory(
        storage=VolatileMemoryStore(),
        embeddings_generator=kernel.get_ai_service("embedding")
    )
    
    # 保存信息
    await memory.save_information_async(
        collection="my_knowledge",
        text="Python 是一种高级编程语言",
        id="python_intro"
    )
    
    await memory.save_information_async(
        collection="my_knowledge",
        text="机器学习是 AI 的一个分支",
        id="ml_intro"
    )
    
    # 检索相关信息
    results = await memory.search_async(
        collection="my_knowledge",
        query="什么是 AI",
        limit=3
    )
    
    for result in results:
        print(f"- {result.text} (相关度: {result.relevance})")
 
 
# ========== 2. 持久化记忆 ==========
 
async def persistent_memory_example(kernel):
    """持久化记忆"""
    from semantic_kernel.connectors.memory.chroma import ChromaMemoryStore
    
    # 使用 Chroma 作为持久化存储
    memory = SemanticTextMemory(
        storage=ChromaMemoryStore(persist_directory="./chroma_db"),
        embeddings_generator=kernel.get_ai_service("embedding")
    )
    
    # 保存和检索...

三、与 LangChain 对比

┌─────────────────────────────────────────────────────────────┐
│                    Semantic Kernel vs LangChain              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    设计理念                          │  │
│   ├─────────────────────────────────────────────────────┤  │
│   │                                                      │  │
│   │  Semantic Kernel:                                    │  │
│   │  • 代码优先,轻量级 SDK                              │  │
│   │  • 强调技能组合和规划                                │  │
│   │  • 微软生态,Azure 集成                              │  │
│   │                                                      │  │
│   │  LangChain:                                          │  │
│   │  • LLM 优先,功能丰富                                │  │
│   │  • 强调链式调用和 Agent                              │  │
│   │  • 社区驱动,生态广泛                                │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    功能对比                          │  │
│   ├─────────────────────────────────────────────────────┤  │
│   │                                                      │  │
│   │  特性                │ Semantic Kernel │ LangChain  │  │
│   │  ────────────────────┼─────────────────┼────────────│  │
│   │  技能/工具管理       │ Skills          │ Tools      │  │
│   │  自动规划            │ Planner         │ Agent      │  │
│   │  记忆系统            │ Memory          │ Memory     │  │
│   │  模板引擎            │ 内置            │ PromptTemplate │
│   │  向量存储            │ 连接器          │ 集成       │  │
│   │  流式输出            │ 支持            │ 支持       │  │
│   │  多语言支持          │ C#, Python      │ Python, JS │  │
│   │  Azure 集成          │ 原生            │ 需配置     │  │
│   │  社区规模            │ 较小            │ 大         │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   适用场景:                                                 │
│   • 企业级 .NET 应用 → Semantic Kernel                      │
│   • Azure 云服务集成 → Semantic Kernel                      │
│   • Python 生态项目 → LangChain                             │
│   • 快速原型开发 → LangChain                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

四、面试问答

Q1: Semantic Kernel 的核心组件有哪些?

回答要点:

  1. Kernel:核心容器,管理所有组件
  2. Skills:技能,分为 Semantic Skills(语义)和 Native Skills(原生)
  3. Planner:规划器,自动组合技能完成任务
  4. Memory:记忆系统,存储上下文和向量
  5. Connectors:连接器,连接外部 AI 服务

Q2: Semantic Skills 和 Native Skills 有什么区别?

回答要点:

对比维度Semantic SkillsNative Skills
定义方式自然语言 Prompt编程语言函数
执行方式LLM 执行代码直接执行
确定性不确定确定
适用场景语义理解、生成计算、IO 操作

Q3: Planner 如何选择和组合技能?

回答要点:

  1. 分析用户意图:理解用户想要什么
  2. 匹配可用技能:从技能库中找到相关技能
  3. 生成执行计划:确定技能调用顺序和参数传递
  4. 执行计划:按顺序执行各步骤

Q4: Semantic Kernel 与微软 Copilot 的关系?

回答要点:

  • Semantic Kernel 是微软 Copilot 的底层技术之一
  • Copilot 使用 SK 的技能和规划能力
  • SK 为开发者提供了构建类似 Copilot 应用的能力

五、小结

Semantic Kernel 是微软的企业级 Agent 框架:

核心优势

  • 轻量级 SDK:易于集成到现有代码
  • 技能系统:清晰的技能定义和组合
  • 自动规划:Planner 自动生成执行计划
  • 微软生态:与 Azure 服务无缝集成

关键要点

  1. Skills 是核心:合理组织技能是关键
  2. Planner 是灵魂:自动规划能力体现智能
  3. Memory 是基础:上下文管理支撑对话

下一步学习

  • 学习 框架对比与选型
  • 实践 Semantic Kernel 与 Azure 服务集成
  • 探索自定义 Planner 的实现