![[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战](http://pic.xiahunao.cn/yaotu/[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战)
核心结论TL;DRLCEL 灵魂LangChain 表达式语言LCEL通过重载管道符|将实现了Runnable协议的组件模型、解析器等像积木一样串联实现优雅的链式编程。动态切换利用init_chat_model结合configurable_fields可以在不修改底层代码的情况下在运行时动态切换大模型厂商如 OpenAI 切 DeepSeek并调整参数。组件解耦通过 LCEL 组装Prompt、Model、Parser各司其职极大地提高了代码的复用性和可维护性。 一、 原理图解与核心概念1. 什么是 Runnable 协议在 LangChain 中能使用|符号连接的前提是该组件必须实现Runnable协议。它规定了组件必须具备的核心能力invoke单次同步调用。batch批量并行调用。stream流式输出打字机效果。大语言模型ChatOpenAI、输出解析器StrOutputParser、甚至提示词模板PromptTemplate全部实现了此协议。2. LCEL 的链式魔法# 将模型输出直接传给字符串解析器 chain model | parser底层相当于调用了RunnableSequence(firstmodel, lastparser)。数据像流水线一样从上游流向下游。 二、 精选核心代码片段1. 基础链式调用以 DeepSeek 为例from langchain_openai import ChatOpenAI from langchain_core.messages import SystemMessage, HumanMessage from langchain_core.output_parsers import StrOutputParser model ChatOpenAI( modeldeepseek-chat, api_keyyour_api_key, base_urlhttps://api.deepseek.com, # 注意目前官方推荐使用根路径无需 /v1 ) messages [ SystemMessage(content请补全一段故事100个字以内), HumanMessage(content一只猫正在__) ] # 使用 LCEL 构建链 chain model | StrOutputParser() print(chain.invoke(messages))2. 进阶运行时动态切换模型DeepSeek 与 Ollama 无缝切换通过configurable_alternatives实现极高的灵活性且无需安装额外的模型集成包。from langchain_openai import ChatOpenAI from langchain_ollama import ChatOllama from langchain_core.messages import HumanMessage from langchain_core.runnables import ConfigurableField # 1. 定义默认的基础模型云端 DeepSeek base_model ChatOpenAI( modeldeepseek-chat, api_keyyour_deepseek_api_key, base_urlhttps://api.deepseek.com, temperature0.3 ) # 2. 挂载备选模型本地 Ollama model base_model.configurable_alternatives( ConfigurableField(idllm_provider), default_keydeepseek, ollamaChatOllama( modeldeepseek-r1:1.5b, # 确保你本地已拉取该模型 base_urlhttp://127.0.0.1:11434, temperature0.3 ) ) messages [HumanMessage(content请用一句话介绍你自己。)] # # 场景一使用云端 DeepSeek默认走 default_key # print( 使用云端 DeepSeek ) result_cloud model.invoke(messages) print(result_cloud.content) # # 场景二动态切换到本地 Ollama # print(\n 动态切换到本地 Ollama ) result_local model.invoke( messages, config{ configurable: { llm_provider: ollama # 这里指定走备选模型 } } ) print(result_local.content)(完整的包含多轮对话与异常处理的代码已上传至 Gitee 仓库)⚠️ 三、 踩坑排查排雷报错UnicodeEncodeError: ascii codec cant encode charactershttpx默认用 ASCII 编码 HTTP 请求头。如果 API Key 里混入了中文空格、全角字符或不可见字符就会崩溃。排查重新复制纯 ASCII 的 Key或在代码中使用key.encode(ascii, errorsignore).decode(ascii)清洗。报错Unsupported model_providerdeepseekinit_chat_model需要安装langchain-deepseek集成包才能识别。排查若因 Python 版本限制无法安装直接用ChatOpenAI并指定base_url即可完美兼容。Connection Error或Timeout如果你在国内直连 OpenAI 会报错或者本地 Ollama 服务没有启动。排查检查代理设置或确保终端执行过ollama run model_name启动本地服务。链最后输出了AIMessage对象而非字符串忘了在链的最后加StrOutputParser()。大模型原生返回的是包含元数据的AIMessage解析器负责提取纯文本。