AI应用开发框架对比:LangChain vs. Semantic Kernel vs. DSPy 深度解析

本文为微信公众号 敏叔的技术札记 原创文章,版权归 敏叔的技术札记 所有。

如需转载或引用本文内容,请务必注明原文出处、作者以及原文链接

欢迎关注我的微信公众号 「敏叔的技术札记」 ,获取最新技术分享与深度解析。

对于任何未注明来源的转载、摘编、修改或商业使用行为,本人保留追究法律责任的权利。

前言

最近在搞AI应用开发,发现市面上框架是真不少,一开始我也懵,到底用哪个好呢?

我用下来之后发现,LangChain、Semantic Kernel、DSPy这三个是现在最火的,但各有各的脾气。今天就跟大家唠唠我的实际使用体验,不整那些虚的,直接上干货。

环境准备

先不说框架,环境得先搭好。这三个都是Python的,所以虚拟环境走起:

bash 复制代码
python3 -m venv ai-frameworks
source ai-frameworks/bin/activate

附赠安装小技巧,国内用阿里云镜像,速度飞起:

bash 复制代码
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

框架一:LangChain - 老大哥也有烦恼

安装

bash 复制代码
pip install langchain langchain-openai

LangChain算是这里面资格最老的,生态也最全。我用下来发现最大的好处就是文档多、例子多,新手友好。

基本使用

bash 复制代码
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

# 初始化模型
llm = ChatOpenAI(
    api_key="your-api-key",
    base_url="https://api.openai.com/v1",
    model="gpt-4"
)

# 创建提示模板
prompt = ChatPromptTemplate.from_template("请用{language}写一个{function}函数")

# 链式调用
chain = prompt | llm
result = chain.invoke({"language": "Python", "function": "快速排序"})
print(result.content)

踩坑经验

  1. 版本兼容性:LangChain更新太快,有时候今天能跑的代码明天就报错。建议锁定版本:

    bash 复制代码
    pip install langchain==0.1.0
  2. 内存泄漏 :长时间运行要注意,特别是用ConversationBufferMemory的时候,记得定期清理。

  3. 国内网络问题:调用OpenAI API需要科学上网,不然干瞪眼。

框架二:Semantic Kernel - 微软的亲儿子

安装

bash 复制代码
pip install semantic-kernel

这是微软出的,跟Azure集成得特别好。我发现它最大的特点是"插件化"设计,用起来很灵活。

基本使用

bash 复制代码
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion

# 创建内核
kernel = sk.Kernel()

# 添加服务
api_key = "your-api-key"
kernel.add_chat_service(
    "chat_completion",
    OpenAIChatCompletion("gpt-4", api_key)
)

# 定义技能(其实就是函数)
sk_prompt = """
请用{{$language}}写一个{{$function}}函数
要求:{{$requirement}}
"""

summarize_function = kernel.create_semantic_function(
    sk_prompt,
    max_tokens=1000,
    temperature=0.7
)

# 执行
context = kernel.create_new_context()
context["language"] = "Python"
context["function"] = "二分查找"
context["requirement"] = "要有详细注释"

result = await summarize_function.invoke_async(context=context)
print(result.result)

实用技巧

  1. 本地技能:可以写Python函数当技能用,这个很实用:

    bash 复制代码
    @sk_function(
        description="计算两个数的和",
        name="add_numbers"
    )
    def add_numbers(context: SKContext) -> str:
        num1 = float(context["num1"])
        num2 = float(context["num2"])
        return str(num1 + num2)
    
    kernel.import_skill(MySkills(), "math")
  2. 规划器:这个功能很强,能让AI自己规划任务步骤,但配置有点复杂,需要多调试。

  3. 配置文件 :建议用config.json管理配置,别硬编码在代码里。

框架三:DSPy - 学术派的新贵

安装

bash 复制代码
pip install dspy-ai

这是斯坦福搞出来的,理念很新。最大的特点是"用程序优化提示",不用手动调prompt了,这个我试了确实香!

基本使用

bash 复制代码
import dspy
from dspy.datasets.gsm8k import GSM8K

# 配置LM
lm = dspy.OpenAI(model='gpt-4', api_key='your-api-key')
dspy.configure(lm=lm)

# 加载数据
gsm8k = GSM8K()
trainset, devset = gsm8k.train, gsm8k.dev

# 定义签名(相当于接口)
class CoT(dspy.Module):
    def __init__(self):
        super().__init__()
        self.prog = dspy.ChainOfThought("question -> answer")
    
    def forward(self, question):
        return self.prog(question=question)

# 训练优化器
from dspy.teleprompt import BootstrapFewShot

teleprompter = BootstrapFewShot(metric=gsm8k.metric)
compiled_cot = teleprompter.compile(CoT(), trainset=trainset[:10])

# 使用
question = "小明有5个苹果,吃了2个,又买了3个,现在有几个?"
pred = compiled_cot(question=question)
print(f"答案: {pred.answer}")
print(f"推理过程: {pred.rationale}")

发现的问题

  1. 学习曲线陡:概念比较新,得花时间理解"签名"、"优化器"这些。

  2. 数据依赖:需要训练数据来优化,如果没数据就白搭。

  3. 资源消耗:优化过程比较吃算力,本地跑慢。

对比总结

我做了个表格,大家一眼就能看清楚:

| 特性 | LangChain | Semantic Kernel | DSPy | | --- | --- | --- | --- | | 上手难度 | 容易 | 中等 | 较难 | | 生态丰富度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | 代码可读性 | 较好 | 好 | 一般 | | 提示优化 | 手动 | 半自动 | 自动 | | 企业级支持 | 好 | 非常好(微软) | 一般 | | 学习资料 | 极多 | 较多 | 较少 |

我的选择建议

场景一:快速原型开发

选LangChain,别犹豫。文档多、例子多,Stack Overflow上一堆答案,遇到问题好解决。

场景二:企业级应用,用Azure

选Semantic Kernel,跟微软全家桶集成得那叫一个丝滑,权限管理、监控啥的都现成的。

场景三:追求效果,有数据

选DSPy,特别是那种对输出质量要求高的场景。自动优化prompt真的能提升效果,我测试能提升10%-20%。

场景四:新手入门

还是LangChain,先把这个玩明白了,再去看别的。不然容易从入门到放弃。

后记

实际用下来,我发现没有哪个框架是完美的。

  • LangChain像是个啥都有的工具箱,但有点杂乱。

  • Semantic Kernel设计很工整,但不够灵活。

  • DSPy理念先进,但还不够成熟。

我的做法是:混着用。用LangChain搭基础架构,复杂逻辑用Semantic Kernel的规划器,关键模块用DSPy优化。

最后提醒一句:不管用哪个,一定要写测试!!AI应用的不确定性太大,没测试上线就是找骂。

祝各位开发顺利,少踩坑,多产出!

相关推荐
简离1 小时前
JS 函数参数默认值误区解析:传 null 为何不触发默认值?
前端
不想秃头的程序员1 小时前
vue3 Pinia 全解析:从入门到实战。
前端·javascript·vue.js
Mintopia1 小时前
提升 Canvas 2D 绘图技术:应对全面工业化场景的系统方法
前端
wuhen_n1 小时前
组件渲染:从组件到DOM
前端·javascript·vue.js
zhougl9961 小时前
Composition API 和 Options API
前端·javascript·vue.js
wuhen_n1 小时前
虚拟DOM:VNode的设计与创建
前端·javascript·vue.js
归叶再无青2 小时前
web服务安装部署、性能升级等(Apache、Nginx)
运维·前端·nginx·云原生·apache·bash
Lazy_zheng2 小时前
一文读懂:CommonJS 和 ES Module 的本质区别
前端·面试·前端工程化
你怎么知道我是队长2 小时前
前端学习---HTML---表单
前端·学习·html