AI原生应用开发框架比较:LangChain vs Semantic Kernel

关键词:LangChain、Semantic Kernel、AI原生应用、大语言模型(LLM)、提示工程、智能代理、企业级开发

摘要:随着大语言模型(LLM)的爆发式发展,"AI原生应用"成为技术圈的新宠——这类应用以LLM为核心驱动力,结合传统工具和数据,能完成更复杂的智能任务。本文将聚焦两大主流开发框架LangChain与Semantic Kernel(SK),通过生活化比喻、代码实战和场景对比,带您理解它们的核心差异与适用场景,帮您在实际项目中做出更优选择。


背景介绍:为什么需要AI原生应用开发框架?

想象一下,你想做一个"智能旅行助手":它能根据用户偏好生成行程,调用地图API查路线,连接天气服务提醒带伞,甚至用邮件自动发送方案。如果直接用LLM(如GPT-4)写提示词,你需要手动处理:

  1. 如何让LLM理解用户需求并拆分任务?
  2. 如何安全调用外部工具(如地图API)?
  3. 如何记住用户之前说过的话(比如"讨厌爬山")?
  4. 如何处理多轮对话中的错误(比如LLM胡编乱造路线)?

这些问题单靠"调API+写提示词"很难解决。于是,AI原生应用开发框架应运而生——它们像"AI应用的脚手架",帮我们快速组装LLM、工具、记忆和逻辑,让开发更高效、可靠。

本文范围与读者

  • 范围:聚焦LangChain(最流行的开源框架)与Semantic Kernel(微软推出的企业级框架)的核心设计、关键组件与实战对比。
  • 读者:对LLM有基础了解(能调用OpenAI API),想开发AI原生应用的开发者/架构师。

文档结构

本文将按"概念→对比→实战→选择"的逻辑展开:

  1. 用"搭积木"和"瑞士军刀"的比喻,讲清两个框架的核心设计;
  2. 通过代码示例对比它们的开发流程;
  3. 结合"智能客服"实战案例,分析各自的优缺点;
  4. 总结不同场景下的框架选择建议。

核心概念:LangChain是"AI乐高",Semantic Kernel是"智能工具箱"

故事引入:做蛋糕的两种方式

假设你要开一家"智能蛋糕店",需要一个系统帮用户:

  • 用自然语言描述口味(如"喜欢芒果,不喜欢太甜");
  • 调用供应商API查芒果库存;
  • 生成蛋糕设计图;
  • 记录用户历史偏好(下次直接推荐)。

开发这个系统时,LangChain和Semantic Kernel会怎么帮你?

  • LangChain:像"乐高套装"——你有各种标准化的积木块(提示模板、LLM调用、工具连接、记忆存储),可以自由拼接出想要的结构,甚至自己设计新积木。
  • Semantic Kernel:像"瑞士军刀"——自带常用工具(AI能力+传统代码),强调"技能(Skills)"的模块化,企业级场景下更注重安全、合规和与现有系统的兼容。

核心概念解释(用小学生能懂的比喻)

1. LangChain的三大核心组件(乐高积木块)
  • Chains(链条):把多个步骤串起来,比如"用户输入→提示模板填充→LLM生成→结果处理"。就像用乐高拼接一条流水线,每个环节(积木)负责特定任务。
  • Agents(智能体):让LLM自己决定"下一步做什么"。比如用户问"北京今天天气如何",Agents会判断:需要调用天气API,于是自动生成调用指令。这像给乐高机器人装了"大脑",能自主决策。
  • Memory(记忆):保存对话历史或中间结果。比如用户说"我之前说过喜欢芒果",Memory能记住这句话,下次生成推荐时自动带入。这像给乐高盒子加了一个"小抽屉",存重要东西。
2. Semantic Kernel的三大核心组件(瑞士军刀工具)
  • Semantic Functions(语义函数):用自然语言写的"AI能力",比如用提示词定义的"生成蛋糕描述"功能。就像军刀上的"开瓶器",专门用AI解决特定问题。
  • Native Functions(原生函数):用传统代码(如C#/Python)写的功能,比如调用库存API的函数。这像军刀上的"小刀",用传统方法解决确定问题。
  • Planning(规划):让系统自动规划"先做什么,后做什么"。比如用户要"定制蛋糕并配送",Planning会拆解为"生成配方→查库存→生成配送方案"。这像军刀的"指南针",帮你理清步骤。

核心概念关系:积木 vs 工具包的协作逻辑

  • LangChain:Chains是基础结构,Agents基于Chains实现自主决策,Memory为Chains/Agents提供上下文。三者像"乐高流水线":链条(Chains)是主线,智能体(Agents)是控制器,记忆(Memory)是缓存库。
  • Semantic Kernel:Semantic Functions(AI能力)和Native Functions(传统代码)组成"技能包",Planning基于这些技能自动规划任务。三者像"瑞士军刀组合":具体工具(技能)是核心,规划(Planning)是使用指南。

架构示意图

LangChain架构:
用户输入 → [Memory(取历史)] → [Prompt Template(填提示)] → [LLM(生成)] → [Tool(调用API)] → 输出
(Chains串联各环节,Agents动态选择Tool)

Semantic Kernel架构:
用户输入 → [Planning(拆任务)] → [Semantic Function(AI处理)/Native Function(代码调用)] → 输出
(技能(Skills)封装AI+代码能力)

Mermaid流程图(LangChain典型流程)

用户输入

Memory取历史

Prompt模板填充

LLM生成

是否需要工具?

调用外部工具(如API)

输出结果


核心差异对比:从设计哲学到代码实现

1. 设计哲学:灵活扩展 vs 企业适配

  • LangChain:开源社区驱动,强调"模块化+灵活性"。就像"乐高",用户可以自由替换组件(比如换用Anthropic的LLM代替OpenAI),甚至自己开发新的Chains/Agents。适合快速原型开发、研究型项目。
  • Semantic Kernel:微软主导,强调"企业级+工程化"。就像"瑞士军刀",自带安全策略(如控制AI生成内容的风险)、多语言支持(C#/Python/JS)、与Azure服务(如认知服务、存储)的深度集成。适合需要合规、与现有系统对接的企业项目。

2. 核心组件对比:积木块 vs 技能包

组件 LangChain Semantic Kernel 比喻对比
任务组织 Chains(手动拼接流程)+Agents(自动决策) Planning(自动规划技能调用) 手动搭积木 vs 按指南用工具
AI与代码结合 需手动用Chains连接LLM和工具代码 内置Semantic(AI)+Native(代码)技能,自动调度 用绳子绑积木 vs 工具自带卡槽
记忆管理 提供多种Memory(如对话记忆、向量记忆) 通过上下文对象(Context Variables)管理 多个小抽屉 vs 一个多功能背包
生态支持 社区活跃(数千个集成工具/LLM) 微软生态(Azure、Copilot)深度整合 开源市场 vs 品牌专卖店

3. 代码实现对比:用"智能客服"示例感受差异

假设要开发一个"智能客服",功能:

  • 回答产品问题(如"手机电池续航多久?");
  • 调用库存API查商品是否有货;
  • 记住用户之前问过的问题(如"上次问过X型号手机")。
LangChain实现(Python)

LangChain的思路是:用Chains拼接"提示模板→LLM→工具调用→记忆存储"的流程。

from langchain import OpenAI, LLMChain, PromptTemplate
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory

# 1. 初始化LLM和工具(库存API工具)
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)  # 假设库存API通过serpapi模拟

# 2. 定义记忆(保存对话历史)
memory = ConversationBufferMemory(memory_key="chat_history")

# 3. 初始化智能体(自动决定是否调用工具)
agent = initialize_agent(
    tools, llm, agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION, verbose=True, memory=memory
)

# 4. 运行对话
print(agent.run(input="X型号手机还有货吗?"))
# 输出:正在调用库存API... 查得X型号手机有货。

代码解读

  • 通过initialize_agent创建智能体,它会根据用户问题自动判断是否需要调用工具(如库存API);
  • ConversationBufferMemory保存对话历史,LLM生成回答时会自动带入上下文;
  • 社区提供了大量预集成工具(如serpapi搜索、llm-math计算),可快速拼接。
Semantic Kernel实现(Python)

SK的思路是:定义"技能(Skills)",包含AI能力(Semantic Functions)和代码能力(Native Functions),通过Planning自动规划调用流程。

import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion

# 1. 初始化内核(连接OpenAI)
kernel = sk.Kernel()
kernel.add_chat_service("gpt-4", OpenAIChatCompletion("gpt-4", "YOUR_API_KEY"))

# 2. 定义"客服技能":包含AI函数和代码函数
skills_dir = "skills"
customer_service_skill = kernel.import_semantic_skill_from_directory(skills_dir, "CustomerService")

# 3. 定义Native函数(调用库存API的代码)
async def check_stock(item: str) -> str:
    # 实际调用库存API,这里模拟返回
    return f"{item}库存:有货"

# 4. 注册Native函数到技能
customer_service_skill.add_native_function("CheckStock", check_stock)

# 5. 运行规划(自动决定用哪个技能)
plan = await kernel.planner.create_plan("查X型号手机是否有货,并回答用户")
result = await plan.invoke()
print(result)
# 输出:X型号手机库存:有货。

代码解读

  • 通过import_semantic_skill_from_directory导入用自然语言定义的AI函数(如CustomerService中的"回答产品问题"提示词);
  • 手动注册check_stock作为Native函数(传统代码),与AI函数共同组成技能;
  • planner.create_plan自动分析用户需求,规划"先调用CheckStock,再生成回答"的流程。

4. 关键差异总结(用表格更清晰)

维度 LangChain Semantic Kernel
学习曲线 需理解Chains/Agents/Memory等概念,社区文档丰富但较分散 强调"技能"和"规划",微软文档结构化更好,企业友好
灵活性 高(可自定义Chains/Agents,支持任意LLM) 中(依赖微软生态,对非Azure服务集成需额外代码)
企业特性 需自行实现安全/权限(如控制工具调用白名单) 内置安全策略(如限制AI生成内容)、多语言支持(C#/Python)
性能 依赖社区优化(部分组件可能有延迟) 微软优化(如与Azure认知服务的低延迟连接)
适用场景 快速原型、研究型项目、需要高度定制的场景 企业级应用、需与现有系统对接、注重安全合规的场景

项目实战:用两个框架开发"智能旅行助手"

需求定义

开发一个"智能旅行助手",功能:

  1. 用户输入目的地和偏好(如"带小孩,喜欢自然景观");
  2. 生成3天行程(含景点、餐饮推荐);
  3. 调用天气API获取目的地未来3天天气;
  4. 提醒携带物品(如"下雨需带伞");
  5. 记住用户历史偏好(下次直接推荐类似行程)。

LangChain实现步骤

1. 环境搭建
  • 安装依赖:pip install langchain openai python-dotenv
  • 配置OpenAI API Key(.env文件)。
2. 核心代码与解读
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.agents import Tool, initialize_agent
from langchain.utilities import SerpAPIWrapper  # 用SerpAPI模拟天气API
from langchain.memory import ConversationSummaryMemory

# 1. 初始化工具(天气查询)
serpapi = SerpAPIWrapper()
tools = [
    Tool(
        name="Weather Search",
        func=serpapi.run,
        description="查询目的地未来3天天气,输入应为具体城市(如'北京')"
    )
]

# 2. 定义记忆(总结对话历史,避免过长)
memory = ConversationSummaryMemory(llm=OpenAI(), memory_key="chat_history")

# 3. 定义提示模板(生成行程的LLM提示)
prompt_template = """
用户想去{destination}旅行,偏好是{preference}。请生成3天行程,包含景点、餐饮推荐。
已知天气:{weather}。请根据天气提醒携带物品。
历史对话:{chat_history}
"""
prompt = PromptTemplate(
    template=prompt_template,
    input_variables=["destination", "preference", "weather", "chat_history"]
)

# 4. 初始化LLM链(生成行程)
llm_chain = LLMChain(prompt=prompt, llm=OpenAI(temperature=0.7))

# 5. 初始化智能体(协调工具调用和LLM生成)
agent = initialize_agent(
    tools, llm_chain.llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True, memory=memory
)

# 6. 运行示例
user_input = "我想去杭州带小孩玩,喜欢自然景观"
response = agent.run(user_input)
print(response)

关键逻辑

  • 智能体(Agent)先判断需要查询天气(调用Weather Search工具),获取天气后填充到提示模板;
  • 记忆(Memory)保存用户历史偏好(如"带小孩,自然景观"),下次对话时自动带入;
  • LLM链(LLMChain)根据提示生成行程和携带物品建议。

Semantic Kernel实现步骤

1. 环境搭建
  • 安装依赖:pip install semantic-kernel openai
  • 配置OpenAI API Key(代码中或环境变量)。
2. 核心代码与解读
import asyncio
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion

async def main():
    # 1. 初始化内核
    kernel = sk.Kernel()
    kernel.add_chat_service("gpt-4", OpenAIChatCompletion("gpt-4", "YOUR_API_KEY"))

    # 2. 定义"旅行技能"目录结构(技能存放在skills/TripPlanner下)
    # - 目录下有semantic_functions(AI函数)和native_functions(代码函数)
    # - 例如,semantic_functions/GenerateItinerary的prompt.txt内容:
    #   "用户想去{{$destination}},偏好{{$preference}},天气{{$weather}}。生成3天行程(景点、餐饮)和携带物品建议。"

    # 3. 导入语义函数(AI生成行程)
    trip_skill = kernel.import_semantic_skill_from_directory("skills", "TripPlanner")

    # 4. 定义Native函数(调用天气API的代码)
    async def get_weather(city: str) -> str:
        # 实际调用天气API,这里模拟返回
        return "杭州未来3天:晴(25-30℃),局部小雨"

    # 5. 注册Native函数到技能
    trip_skill.add_native_function("GetWeather", get_weather)

    # 6. 创建规划(自动拆解任务)
    plan = await kernel.planner.create_plan(
        "用户想去杭州带小孩玩,喜欢自然景观,需要生成行程并提醒携带物品"
    )

    # 7. 执行规划
    result = await plan.invoke()
    print(result)

if __name__ == "__main__":
    asyncio.run(main())

关键逻辑

  • 技能(TripPlanner)包含AI函数(GenerateItinerary,用提示词定义生成逻辑)和代码函数(GetWeather,调用天气API);
  • 规划(Planner)自动分析用户需求,拆解为"调用GetWeather获取天气→调用GenerateItinerary生成行程";
  • 微软的Planner支持更复杂的任务依赖(如先查天气再生成行程),适合企业级流程控制。

实际应用场景:何时选LangChain?何时选Semantic Kernel?

LangChain更适合:

  • 快速原型开发:比如创业公司需要在1周内验证"AI旅行助手"想法,LangChain的灵活组件和社区工具能快速拼接功能。
  • 研究型项目:比如实验不同LLM(GPT-4、Claude、LLaMA)的效果差异,LangChain的适配器(LLM wrappers)支持快速切换。
  • 需要高度定制:比如开发一个"AI代码审查助手",需要自定义Agents逻辑(只调用代码分析工具),LangChain的可扩展性更优。

Semantic Kernel更适合:

  • 企业级应用:比如银行开发"智能客服",需要集成内部系统(如客户数据库、工单系统),SK的Native Functions支持直接调用C#/.NET代码,与现有系统无缝对接。
  • 注重安全合规:比如医疗行业的"AI问诊助手",需要控制AI生成内容的风险(如避免错误医疗建议),SK的"技能权限控制"(可限制某些Semantic Functions的调用)更易实现。
  • 多语言支持:比如企业已有Java后端,SK支持Java(即将发布)、C#、Python,可避免技术栈迁移成本。

工具与资源推荐

  • LangChain

    • 官方文档:docs.langchain.com
    • 社区集成库:LangChain Hub(含数千个Chains/Agents示例)
    • 学习资源:《LangChain for LLM Application Development》(Andrew Ng课程配套)
  • Semantic Kernel


未来趋势与挑战

趋势

  1. 多模态集成:两大框架都在加强对图像、语音的支持(如LangChain的ImageCaption链,SK的AudioTranscription技能)。
  2. 自主智能体(Autonomous Agents):未来框架可能内置更强大的Planning/Reasoning能力,让AI应用能处理更复杂的长任务(如"策划一场婚礼")。
  3. 企业级标准化:随着AI应用进入企业核心系统,框架可能增加更多工程化特性(如监控、日志、版本控制)。

挑战

  • 性能优化:LLM调用延迟+工具调用延迟,可能导致应用响应慢(如LangChain的Agents有时需要多次调用LLM做决策)。
  • 跨LLM兼容性:不同LLM的提示词格式差异大(如GPT-4需要[user]/[assistant]标签,Claude需要\n\nHuman:),框架需更好地抽象这些差异。
  • 安全与伦理:如何防止AI生成有害内容(如SK的"内容审核技能")、保护用户隐私(如记忆存储的加密),是框架需要解决的关键问题。

总结:学到了什么?

核心概念回顾

  • LangChain:像"AI乐高",核心是Chains(拼接流程)、Agents(自主决策)、Memory(保存上下文),适合灵活快速开发。
  • Semantic Kernel:像"智能工具箱",核心是Semantic Functions(AI能力)、Native Functions(代码能力)、Planning(自动规划),适合企业级工程化开发。

概念关系回顾

两者都解决"LLM与工具/数据结合"的问题,但路径不同:

  • LangChain强调"模块化+社区扩展",用户是"积木设计师";
  • SK强调"技能+企业适配",用户是"工具组合师"。

思考题:动动小脑筋

  1. 如果你要开发一个"AI论文助手"(功能:读论文→提关键点→生成摘要→查相关研究),你会选LangChain还是SK?为什么?
  2. LangChain的Agents有时会"循环调用工具"(比如反复查天气),你觉得可能是什么原因?如何解决?
  3. SK的Planning依赖LLM生成任务规划,可能出现"错误规划"(比如该调用A工具却调用了B),你有什么优化思路?

附录:常见问题与解答

Q:LangChain和SK支持哪些LLM?
A:LangChain支持几乎所有主流LLM(OpenAI、Anthropic、Hugging Face、本地部署的LLaMA等);SK目前主要支持OpenAI和Azure OpenAI,未来计划支持更多(如Anthropic)。

Q:学习哪个框架更快?
A:如果熟悉Python和LLM基础,LangChain的社区教程更丰富;如果是企业开发者(熟悉C#/.NET),SK的文档更结构化,学习曲线更平缓。

Q:可以同时用两个框架吗?
A:可以!比如用LangChain快速开发原型,验证需求后用SK重构为企业级应用;或者用LangChain的Memory组件和SK的Planning结合(需写桥接代码)。


扩展阅读 & 参考资料

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐