LCEL(LangChain Expression Language)语法全解
LCELLangChain Expression Language语法全解LCEL 是 LangChain 推出的声明式链式编排语法基于统一的Runnable接口标准通过管道符|拼接提示词、大模型、输出解析器、工具等组件构建完整的大模型应用链路。它替代了早期LLMChain、SequentialChain等面向对象的繁琐写法是当前 LangChain 构建应用的官方标准范式。一、核心底层原理统一 Runnable 接口LangChain 中所有可执行组件提示词、模型、解析器、工具、自定义函数都实现了Runnable基类拥有完全一致的调用规范这是组件可以自由拼接的底层基础。管道符|语法糖它本质是对 Python__or__方法的重载作用是将左侧组件的输出自动作为右侧组件的输入和 Unix Shell 的管道逻辑完全一致数据流严格从左向右流动。二、基础语法标准三段式链路最经典、最常用的 LCEL 结构是「提示词模板 → 大模型 → 输出解析器」对应「填模板→调用模型→解析结果」的标准流程。fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_openaiimportChatOpenAI# 1. 定义单个组件promptChatPromptTemplate.from_template(请用通俗语言解释{concept}不超过100字)modelChatOpenAI(modelgpt-3.5-turbo,temperature0)parserStrOutputParser()# 2. LCEL 管道拼接成链chainprompt|model|parser# 3. 统一调用resultchain.invoke({concept:LCEL})print(result)执行逻辑输入字典{concept: LCEL}传入提示词模板填充变量生成完整 Prompt填充后的 Prompt 自动传入大模型生成 AI 消息对象消息对象传入字符串解析器提取纯文本内容作为最终结果三、统一调用方法所有 LCEL 链都共享同一套调用接口无需针对不同组件修改写法调用方法说明适用场景.invoke(input)同步单次调用阻塞等待完整结果常规问答、短文本生成.stream(input)流式逐块返回结果无需等待全文聊天界面、长文本生成.batch([input1, input2])批量并发处理多个输入批量数据处理、批量生成.ainvoke(input)异步单次调用高并发 Web 服务.astream(input)异步流式调用异步聊天接口四、常用基础组件1. 输入透传RunnablePassthrough原样保留输入内容常用于并行链路中传递原始参数是 RAG 等场景的必备组件。fromlangchain_core.runnablesimportRunnablePassthrough# 原始输入会被原样透传chainRunnablePassthrough()|(lambdax:f收到{x})print(chain.invoke(你好))# 输出收到你好2. 自定义逻辑RunnableLambda将普通 Python 函数包装为 Runnable 组件无缝接入管道实现自定义数据清洗、格式转换等逻辑。fromlangchain_core.runnablesimportRunnableLambdadefclean_text(text):returntext.strip().replace(\n,)# 自定义清洗 → 提示词 → 模型 → 解析器chainRunnableLambda(clean_text)|prompt|model|parser3. 结构化输出解析将模型输出转为结构化数据三类最常用的解析器StrOutputParser提取模型输出的纯文本日常开发最常用JsonOutputParser将模型输出解析为字典/JSON 格式PydanticOutputParser强制输出符合 Pydantic 定义的数据结构五、进阶编排语法1. 并行执行RunnableParallel同时运行多个独立子链路最终将所有分支结果合并为字典返回常用于 RAG、多维度分析场景。支持两种写法字典简写更常用# 写法1字典简写LCEL 会自动转为 RunnableParallelparallel_chain{双倍:lambdax:x[num]*2,加十:lambdax:x[num]10}print(parallel_chain.invoke({num:5}))# 输出: {双倍: 10, 加十: 15}典型 RAG 场景用法# 检索分支 原始问题透传两路结果一同传给提示词rag_chain{context:retriever,# 分支1检索知识库返回上下文question:RunnablePassthrough()# 分支2保留原始用户问题}|prompt|model|parser2. 条件分支RunnableBranch根据输入内容动态选择执行链路实现路由逻辑类似代码里的if-elif-else结构。fromlangchain_core.runnablesimportRunnableBranch route_chainRunnableBranch((lambdax:x[type]数学,lambdax:f数学题{x[question]}),(lambdax:x[type]语文,lambdax:f语文题{x[question]}),lambdax:f通用问题{x[question]}# 默认兜底分支)3. 容错降级with_fallbacks给主链路添加备用方案主链路调用失败时自动切换到备用链路是生产环境提升稳定性的标准手段。main_modelChatOpenAI(modelgpt-4)backup_modelChatOpenAI(modelgpt-3.5-turbo)# 主模型调用失败时自动走备用模型reliable_chainprompt|main_model.with_fallbacks([backup_model])|parser4. 工具调用绑定通过bind_tools将工具函数绑定到模型让模型可以自主判断是否调用工具、生成调用参数。fromlangchain_core.toolsimporttooltooldefget_weather(city:str)-str:查询指定城市的实时天气returnf{city}今日晴气温25℃# 绑定工具到模型model_with_toolsmodel.bind_tools([get_weather])# 接入管道tool_chainprompt|model_with_tools六、核心优势总结声明式、可读性强代码即数据流从左到右一目了然比嵌套类写法更易维护组件高度解耦所有组件遵循统一标准可自由替换、组合无需修改链路代码原生工程能力零额外开发天然支持流式、批量、异步、容错降级可观测性友好无缝对接 LangSmith 调试平台自动追踪每一步执行状态生产级适配可直接通过 LangServe 部署为 API 接口快速落地importosfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthrough,RunnableLambdafromlangchain_openaiimportChatOpenAI,OpenAIEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_text_splittersimportRecursiveCharacterTextSplitter# 1. 基础配置 # 替换为自己的 API Key兼容所有 OpenAI 协议的模型os.environ[OPENAI_API_KEY]sk-你的API密钥# 如需使用本地/第三方兼容模型可配置代理地址# os.environ[OPENAI_BASE_URL] https://你的接口地址/v1# 2. 准备知识库文档 # 模拟业务知识库可替换为 PDF/Word/网页等读取的文本内容raw_knowledge MLCC片式多层陶瓷电容器是被动元件的核心品类被称为电子大米核心作用是稳压、滤波、储能广泛应用于消费电子、汽车电子、AI服务器等领域。 MLCC的核心上游材料是陶瓷粉体、金属内电极浆料国内主流厂商包括风华高科、三环集团、火炬电子等。 PCB印制电路板是电子元器件的承载基板负责电气连接是所有电子设备的基础部件被称为电子系统之母。 PCB按层数可分为单面板、双面板、多层板高阶HDI、封装载板是当前高端PCB的核心方向国内主流厂商包括沪电股份、深南电路、鹏鼎控股。 CPO共封装光学是一种光封装技术将光引擎与交换芯片共同封装在同一块基板上可大幅降低功耗、提升传输密度是AI高速互联的核心技术路线。 CPO产业链中PCB作为高速承载基板规格要求显著升级MLCC作为电源滤波元件单机用量随功耗提升而增加。 # 文档切片将长文本切分为适合检索的小块text_splitterRecursiveCharacterTextSplitter(chunk_size200,# 单块最大字符数chunk_overlap30,# 块间重叠字符数避免语义断裂separators[\n\n,\n,。, ]# 优先按语义分割)doc_splitstext_splitter.create_documents([raw_knowledge])# 3. 构建向量库与检索器 # 使用 Chroma 内存向量库无需额外安装数据库如需持久化可加 persist_directory 参数vectorstoreChroma.from_documents(documentsdoc_splits,embeddingOpenAIEmbeddings(modeltext-embedding-3-small))# 创建检索器召回最相关的 Top 3 文档片段retrievervectorstore.as_retriever(search_kwargs{k:3})# 工具函数将检索到的文档对象拼接为纯文本供大模型读取defformat_docs(docs):return\n\n.join(doc.page_contentfordocindocs)# 4. 定义提示词与模型组件 # RAG 专用提示词模板强制基于上下文回答抑制幻觉rag_promptChatPromptTemplate.from_template( 你是专业的电子行业知识库助手仅可基于下方提供的上下文回答问题。 如果上下文中没有对应答案请直接回答「知识库中暂无相关信息」禁止编造内容。 【参考上下文】 {context} 【用户问题】 {question} 【正式回答】 )# 初始化大模型与输出解析器llmChatOpenAI(modelgpt-3.5-turbo,temperature0)output_parserStrOutputParser()# 5. 核心LCEL 搭建 RAG 链路 rag_chain(# 并行执行两路分支最终合并为字典传入提示词{context:retriever|RunnableLambda(format_docs),# 分支1检索格式化上下文question:RunnablePassthrough()# 分支2原样透传用户原始问题}|rag_prompt# 填充提示词模板|llm# 调用大模型生成答案|output_parser# 提取纯文本结果)# 6. 调用测试 if__name____main__:# 方式1同步阻塞调用一次性返回完整结果question_1MLCC和PCB在CPO产业链中分别有什么作用resultrag_chain.invoke(question_1)print( 同步调用结果 )print(result)print(\n-*60\n)# 方式2流式调用逐字返回适配聊天界面场景question_2国内MLCC的主流厂商有哪些print( 流式调用结果 )forchunkinrag_chain.stream(question_2):print(chunk,end,flushTrue)