LangChain已成过去式?深入浅出Semantic Kernel
SemanticKernel:重新定义企业级AI应用开发的新范式 微软推出的SemanticKernel正颠覆传统AI开发模式,以插件化架构取代LangChain的链式思维。该框架通过四大核心组件实现智能化开发:1)Kernel智能调度中心统一管理AI服务;2)模块化Plugins实现能力封装;3)Planners自动规划任务流程;4)Memories支持上下文记忆。实战案例显示,其规划优先的架构
·
引言:AI应用开发框架的演进
在AI应用开发领域,LangChain曾一度成为事实标准,但微软推出的Semantic Kernel正在重新定义AI应用的构建方式。与LangChain的"链式思维"不同,Semantic Kernel更强调将AI能力作为"插件"无缝集成到现有应用中。本文将深入解析这一新兴框架的核心优势。
一、Semantic Kernel vs LangChain:设计哲学对比
1.1 核心差异分析
| 特性 | LangChain | Semantic Kernel |
|---|---|---|
| 设计理念 | 链式编排,AI为中心 | 插件集成,应用为中心 |
| 架构思维 | 线性管道 | 规划器驱动 |
| 集成方式 | 包装现有应用 | 嵌入现有架构 |
| 学习曲线 | 相对陡峭 | 渐进式上手 |
| 企业友好度 | 中等 | 高度优化 |
1.2 为什么选择Semantic Kernel?
# 传统LangChain方式:以AI为中心
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# Semantic Kernel方式:以业务逻辑为中心
import semantic_kernel as sk
from semantic_kernel.planners import SequentialPlanner
二、Semantic Kernel核心概念解析
2.1 Kernel:智能调度核心
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
# 创建Kernel实例 - 智能调度中心
kernel = sk.Kernel()
# 配置AI服务
api_key = "your-openai-key"
model_id = "gpt-3.5-turbo"
kernel.add_chat_service(
"chat-gpt",
OpenAIChatCompletion(model_id, api_key)
)
print("Kernel初始化完成,Ready to orchestrate AI services!")
2.2 Plugins:能力模块化
# 创建自定义Plugin - 天气查询功能
import requests
from semantic_kernel.skill_definition import sk_function
class WeatherPlugin:
def __init__(self):
self.api_key = "your-weather-api-key"
@sk_function(
description="根据城市名称获取天气信息",
name="get_weather"
)
async def get_weather(self, city: str) -> str:
"""获取指定城市的天气信息"""
url = f"http://api.weatherapi.com/v1/current.json?key={self.api_key}&q={city}"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
current = data['current']
return f"{city}天气: {current['temp_c']}°C, {current['condition']['text']}"
else:
return f"无法获取{city}的天气信息"
# 注册Plugin到Kernel
weather_plugin = kernel.import_skill(WeatherPlugin(), "WeatherPlugin")
2.3 Planners:智能规划器
from semantic_kernel.planners import SequentialPlanner
from semantic_kernel.planning import StepwisePlanner
# 创建顺序规划器 - 按步骤执行任务
planner = SequentialPlanner(kernel)
# 定义复杂任务
ask = """
我需要完成以下任务:
1. 获取北京和上海的天气
2. 比较两地的温度差异
3. 给出穿衣建议
"""
# 生成执行计划
plan = await planner.create_plan_async(ask)
print("生成的执行计划:")
for step in plan._steps:
print(f"- {step.description}")
# 执行计划
result = await plan.invoke_async()
print(f"最终结果: {result}")
2.4 Memories:上下文记忆
from semantic_kernel.memory import SemanticTextMemory
from semantic_kernel.connectors.memory.azure_cognitive_search import AzureCognitiveSearchMemoryStore
# 配置记忆存储
memory = SemanticTextMemory(
storage=AzureCognitiveSearchMemoryStore(
vector_size=1536,
search_service_name="your-search-service",
api_key="your-search-key"
)
)
# 存储重要信息
await memory.save_information_async(
collection="user_preferences",
id="user_001",
text="用户喜欢喝绿茶,对咖啡因敏感"
)
# 检索相关信息
relevant_memories = await memory.search_async(
collection="user_preferences",
query="用户饮料偏好",
limit=3
)
for memory in relevant_memories:
print(f"相关记忆: {memory.text} (相关性: {memory.relevance})")
三、实战案例:智能旅行助手
3.1 项目架构设计
# travel_assistant.py
import semantic_kernel as sk
from semantic_kernel.planners import SequentialPlanner
from datetime import datetime, timedelta
class TravelAssistant:
def __init__(self):
self.kernel = sk.Kernel()
self.setup_services()
self.setup_plugins()
def setup_services(self):
"""配置AI服务"""
self.kernel.add_chat_service(
"gpt-4",
OpenAIChatCompletion("gpt-4", "your-api-key")
)
def setup_plugins(self):
"""注册功能插件"""
# 天气插件
self.kernel.import_skill(WeatherPlugin(), "Weather")
# 航班查询插件
self.kernel.import_skill(FlightPlugin(), "Flights")
# 酒店推荐插件
self.kernel.import_skill(HotelPlugin(), "Hotels")
# 本地知识插件
self.kernel.import_skill(LocalKnowledgePlugin(), "LocalInfo")
async def plan_trip(self, user_request: str):
"""智能规划旅行"""
planner = SequentialPlanner(self.kernel)
# 创建执行计划
plan = await planner.create_plan_async(user_request)
# 添加上下文记忆
context = self.kernel.create_new_context()
context["current_date"] = datetime.now().strftime("%Y-%m-%d")
context["user_id"] = "travel_user_001"
# 执行计划
result = await plan.invoke_async(context=context)
return result
3.2 航班查询插件实现
# flight_plugin.py
import aiohttp
from semantic_kernel.skill_definition import sk_function, sk_function_context_parameter
from semantic_kernel import SKContext
class FlightPlugin:
def __init__(self):
self.api_key = "your-flight-api-key"
@sk_function(
description="查询航班信息",
name="search_flights"
)
@sk_function_context_parameter(
name="departure_city",
description="出发城市"
)
@sk_function_context_parameter(
name="arrival_city",
description="到达城市"
)
@sk_function_context_parameter(
name="departure_date",
description="出发日期(YYYY-MM-DD)"
)
async def search_flights(self, context: SKContext) -> str:
"""智能航班搜索"""
departure = context["departure_city"]
arrival = context["arrival_city"]
date = context["departure_date"]
# 模拟API调用
flights = await self._call_flight_api(departure, arrival, date)
if flights:
result = f"找到{len(flights)}个航班:\n"
for flight in flights[:3]: # 显示前3个结果
result += f"- {flight['airline']} {flight['flight_no']}: {flight['price']}元\n"
return result
else:
return f"未找到从{departure}到{arrival}的航班"
async def _call_flight_api(self, departure: str, arrival: str, date: str):
"""调用航班API(模拟实现)"""
# 实际项目中替换为真实的API调用
return [
{"airline": "中国国航", "flight_no": "CA1234", "price": 1200},
{"airline": "东方航空", "flight_no": "MU5678", "price": 1100},
{"airline": "南方航空", "flight_no": "CZ9012", "price": 1050}
]
3.3 智能规划执行
# 使用示例
async def main():
assistant = TravelAssistant()
# 复杂旅行规划请求
user_request = """
我需要规划一个北京到上海的3天商务旅行:
1. 查询本周五从北京到上海的航班
2. 查看上海周末的天气情况
3. 推荐浦东机场附近的商务酒店
4. 提供上海本地的商务晚餐推荐
5. 周日的返程航班建议
"""
result = await assistant.plan_trip(user_request)
print("旅行规划结果:")
print(result)
# 运行示例
if __name__ == "__main__":
import asyncio
asyncio.run(main())
四、高级特性:技能组合与推理
4.1 动态技能组合
from semantic_kernel.planners import ActionPlanner
class DynamicSkillOrchestrator:
def __init__(self, kernel):
self.kernel = kernel
self.action_planner = ActionPlanner(kernel)
async def dynamic_execution(self, goal: str):
"""动态技能组合执行"""
# 分析目标并选择最佳技能组合
plan = await self.action_planner.create_plan_async(goal)
# 添加执行监控
execution_context = self.kernel.create_new_context()
execution_context["execution_start"] = datetime.now().isoformat()
# 分步执行并收集中间结果
intermediate_results = []
for step in plan._steps:
step_result = await step.invoke_async(context=execution_context)
intermediate_results.append({
"step": step.description,
"result": step_result.result
})
# 将中间结果添加到上下文
execution_context[step.name] = step_result.result
final_result = await plan.invoke_async(context=execution_context)
return {
"final_result": final_result.result,
"execution_steps": intermediate_results,
"total_steps": len(plan._steps)
}
4.2 语义内存集成
class KnowledgeEnhancedPlugin:
def __init__(self, kernel, memory):
self.kernel = kernel
self.memory = memory
@sk_function(description="基于历史记忆的个性化回复")
async def personalized_response(self, query: str, user_id: str) -> str:
"""结合用户历史的智能回复"""
# 检索相关记忆
memories = await self.memory.search_async(
collection="user_interactions",
query=query,
filter=user_id,
limit=5
)
# 构建上下文提示
context = "用户历史信息:\n"
for memory in memories:
context += f"- {memory.text}\n"
# 调用AI服务生成个性化回复
prompt = f"""
{context}
当前查询: {query}
请基于以上用户历史信息生成个性化回复:
"""
response = await self.kernel.invoke_semantic_function_async(
prompt, max_tokens=500
)
# 保存本次交互到记忆
await self.memory.save_information_async(
collection="user_interactions",
id=f"{user_id}_{datetime.now().timestamp()}",
text=f"查询: {query} - 回复: {response}",
description=f"用户{user_id}的交互记录"
)
return response.result
五、企业级部署最佳实践
5.1 配置管理
# config_manager.py
import os
from typing import Dict, Any
import yaml
class ConfigManager:
def __init__(self, config_path: str = "config/semantic_kernel.yaml"):
self.config = self._load_config(config_path)
def _load_config(self, path: str) -> Dict[str, Any]:
with open(path, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
def get_plugin_config(self, plugin_name: str) -> Dict[str, Any]:
return self.config.get("plugins", {}).get(plugin_name, {})
def get_ai_service_config(self, service_name: str) -> Dict[str, Any]:
return self.config.get("ai_services", {}).get(service_name, {})
# 配置文件示例 (semantic_kernel.yaml)
"""
ai_services:
openai:
api_key: ${OPENAI_API_KEY}
model: gpt-4
timeout: 30
azure_openai:
api_key: ${AZURE_OPENAI_KEY}
endpoint: ${AZURE_ENDPOINT}
plugins:
weather:
api_key: ${WEATHER_API_KEY}
cache_ttl: 3600
flights:
api_key: ${FLIGHT_API_KEY}
max_results: 10
"""
5.2 监控与日志
# monitoring.py
import logging
from datetime import datetime
from prometheus_client import Counter, Histogram, generate_latest
class SemanticKernelMonitor:
def __init__(self):
self.setup_metrics()
self.setup_logging()
def setup_metrics(self):
"""设置性能监控指标"""
self.request_counter = Counter(
'sk_requests_total',
'Total requests',
['plugin', 'status']
)
self.execution_time = Histogram(
'sk_execution_seconds',
'Execution time by plugin',
['plugin']
)
self.error_counter = Counter(
'sk_errors_total',
'Total errors',
['error_type']
)
def setup_logging(self):
"""配置结构化日志"""
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
self.logger = logging.getLogger("SemanticKernel")
def log_execution(self, plugin_name: str, duration: float, success: bool):
"""记录执行日志"""
status = "success" if success else "failure"
self.request_counter.labels(plugin=plugin_name, status=status).inc()
self.execution_time.labels(plugin=plugin_name).observe(duration)
self.logger.info(
f"Plugin {plugin_name} executed in {duration:.2f}s - {status}"
)
六、迁移指南:从LangChain到Semantic Kernel
6.1 概念映射表
| LangChain概念 | Semantic Kernel对应 | 迁移建议 |
|---|---|---|
| Chains | Planners | 将线性链转换为规划器任务 |
| Agents | Plugins + Planners | 分解为独立插件+规划器 |
| Memory | Semantic Memory | 使用向量化记忆存储 |
| Tools | Plugins | 直接转换为SK插件格式 |
6.2 代码迁移示例
# LangChain版本
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
def langchain_implementation():
llm = OpenAI(temperature=0)
tools = [
Tool(
name="Weather",
func=get_weather,
description="获取天气信息"
)
]
agent = initialize_agent(tools, llm, agent="zero-shot-react-description")
return agent.run("北京今天天气怎么样?")
# Semantic Kernel版本
async def semantic_kernel_implementation():
kernel = sk.Kernel()
kernel.add_chat_service("gpt", OpenAIChatCompletion("gpt-3.5-turbo", api_key))
# 注册天气插件
kernel.import_skill(WeatherPlugin(), "Weather")
# 使用规划器自动选择功能
planner = SequentialPlanner(kernel)
plan = await planner.create_plan_async("北京今天天气怎么样?")
return await plan.invoke_async()
结论:为什么Semantic Kernel更适合未来?
Semantic Kernel的核心优势在于其规划优先的架构设计,这更符合企业级应用的现实需求:
- 更好的集成性:以现有应用为中心,而非以AI为中心
- 更强的可扩展性:插件化架构便于功能扩展
- 更高的可靠性:规划器能够处理复杂的工作流
- 更优的性能:智能的任务调度和资源管理
对于需要将AI能力深度集成到现有业务系统中的企业来说,Semantic Kernel提供了更成熟、更稳定的解决方案。虽然LangChain在快速原型开发上仍有优势,但Semantic Kernel在企业级应用场景中展现出了更强的生命力。
立即开始:访问Semantic Kernel官方文档,探索更多高级特性和实战案例!
更多推荐


所有评论(0)