本文为微信公众号 敏叔的技术札记 原创文章,版权归 敏叔的技术札记 所有。
如需转载或引用本文内容,请务必注明原文出处、作者以及原文链接 。
欢迎关注我的微信公众号 「敏叔的技术札记」 ,获取最新技术分享与深度解析。
对于任何未注明来源的转载、摘编、修改或商业使用行为,本人保留追究法律责任的权利。
前言
最近在搞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)
踩坑经验
-
版本兼容性:LangChain更新太快,有时候今天能跑的代码明天就报错。建议锁定版本:
bashpip install langchain==0.1.0 -
内存泄漏 :长时间运行要注意,特别是用
ConversationBufferMemory的时候,记得定期清理。 -
国内网络问题:调用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)
实用技巧
-
本地技能:可以写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") -
规划器:这个功能很强,能让AI自己规划任务步骤,但配置有点复杂,需要多调试。
-
配置文件 :建议用
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}")
发现的问题
-
学习曲线陡:概念比较新,得花时间理解"签名"、"优化器"这些。
-
数据依赖:需要训练数据来优化,如果没数据就白搭。
-
资源消耗:优化过程比较吃算力,本地跑慢。
对比总结
我做了个表格,大家一眼就能看清楚:
| 特性 | LangChain | Semantic Kernel | DSPy | | --- | --- | --- | --- | | 上手难度 | 容易 | 中等 | 较难 | | 生态丰富度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | 代码可读性 | 较好 | 好 | 一般 | | 提示优化 | 手动 | 半自动 | 自动 | | 企业级支持 | 好 | 非常好(微软) | 一般 | | 学习资料 | 极多 | 较多 | 较少 |
我的选择建议
场景一:快速原型开发
选LangChain,别犹豫。文档多、例子多,Stack Overflow上一堆答案,遇到问题好解决。
场景二:企业级应用,用Azure
选Semantic Kernel,跟微软全家桶集成得那叫一个丝滑,权限管理、监控啥的都现成的。
场景三:追求效果,有数据
选DSPy,特别是那种对输出质量要求高的场景。自动优化prompt真的能提升效果,我测试能提升10%-20%。
场景四:新手入门
还是LangChain,先把这个玩明白了,再去看别的。不然容易从入门到放弃。
后记
实际用下来,我发现没有哪个框架是完美的。
-
LangChain像是个啥都有的工具箱,但有点杂乱。
-
Semantic Kernel设计很工整,但不够灵活。
-
DSPy理念先进,但还不够成熟。
我的做法是:混着用。用LangChain搭基础架构,复杂逻辑用Semantic Kernel的规划器,关键模块用DSPy优化。
最后提醒一句:不管用哪个,一定要写测试!!AI应用的不确定性太大,没测试上线就是找骂。
祝各位开发顺利,少踩坑,多产出!