【每日案例】一行代码切换大模型?LangChain LCEL 实战入门
大家在开发 AI 应用时,是不是经常头疼这几个问题:
- 想对比 DeepSeek 和 通义千问 的效果,代码要改两遍?
- 代码写得很乱,Prompt、LLM、解析器全都搅在一起?
今天我们用一个最简案例,只看核心逻辑,帮你理清 LangChain 的 LCEL 链式调用,并实现模型随心切换。
01 核心思路
我们要做三件事:
- 封装模型:用一个函数搞定 DeepSeek 和 Qwen 的切换。
- 定义 Prompt
- 串联 Chain:用 LangChain 最新的
| 语法把流程串起来。
先看效果,再拆解代码。
02 代码实战
第一步:环境准备与模型封装
首先加载环境变量,定义一个 get_llm 函数。
这里有个关键技巧:虽然我们调用的是 DeepSeek 和 Qwen,但都用的是 ChatOpenAI 这个类。因为 LangChain 做了标准化,只要接口兼容 OpenAI 格式,就可以无缝切换。
环境准备与模型封装Python
import osfrom dotenv import load_dotenvfrom langchain_openai import ChatOpenAIload_dotenv()# 定义一个函数来方便切换模型defget_llm(model_name="deepseek"):if model_name == "deepseek":return ChatOpenAI( model = "deepseek-chat", api_key = os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com/v1", temperature= 0.7 )elif model_name == "qwen":return ChatOpenAI( model = "qwen3-max-preview", api_key = os.getenv("DASHSCOPE_API_KEY"), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", temperature= 0.7 )
💡划重点
不同厂商的核心区别在于 base_url 和 api_key,封装后,业务代码就不需要关心底层是谁了。
第二步:构建 Prompt 和 Chain
这里是 LangChain 的精华所在。
我们使用 ChatPromptTemplate 定义模板,然后使用 LCEL (LangChain Expression Language) 语法——也就是那个竖线 |,把组件像管道一样连起来。
构建 Prompt 和 ChainPython
from langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParser# 1. 定义模板prompt = ChatPromptTemplate([ ("system","你是一个{role}"), ("user","{input}"),])# 2. 初始化模型(这里随意切换 "deepseek" 或 "qwen")llm = get_llm("qwen")# 3. 构建 Chain:提示词 | 模型 | 解析器chain = prompt | llm | StrOutputParser()
这个 | 符号的意思是:把左边的输出,作为右边的输入。
数据流向如下:
Prompt模板 → 填入变量 → 发给LLM → 解析成字符串
第三步:运行测试
最后,直接 invoke 调用,传入一个字典,字典的 key 要和 Prompt 模板里的 {role} 和 {input} 对应。
运行测试Python
print("--- 测试 Chain ---")response = chain.invoke({"role": "专业翻译","input":"LangChain is a framework for developing applications powered by large language models."})print("--- 输出结果 ---")print("翻译结果:", response)
运行结果
翻译结果: LangChain 是一个用于开发由大型语言模型驱动的应用程序的框架。
03 总结一下
今天的代码虽然短,但包含了三个最核心的 LangChain 概念:
- 统一接口:用
ChatOpenAI 兼容不同模型,方便切换和测试。 - Prompt 模板化:不要硬编码提示词,用
ChatPromptTemplate 管理动态变量。 - LCEL 链式调用:使用
| 符号串联逻辑,代码可读性极强,这也是目前 LangChain 推荐的主流写法。
动手试试
你可以试着把 get_llm("qwen") 改成 get_llm("deepseek"),看看结果有什么不同?