LangChain 表达式语言 (LCEL):从序列链接到并行执行

LangChain 表达式语言 (LCEL):从序列链接到并行执行
LangChain 表达式语言 (LCEL)从序列链接到并行执行引言什么是 LCELLangChain 表达式语言LangChain Expression Language简称 LCEL是 LangChain 框架中的一种声明式编程方式它允许开发者通过直观的管道运算符|来组合各种组件如模型、提示模板、输出解析器、检索器等从而构建复杂的 AI 工作流。LCEL 的核心优势在于它让代码变得简洁、可读性强同时天然支持并行执行、流式输出和错误处理等高级特性。## 基础概念管道运算符与链式调用LCEL 最基础的概念就是管道运算符|它类似于 Unix 中的管道命令将前一个组件的输出作为后一个组件的输入。这种设计模式被称为链式调用Chaining它让代码的流程一目了然。### 一个简单的序列链示例让我们从一个最基础的例子开始创建一个简单的问答链包含提示模板、语言模型和输出解析器。python# 示例 1基础序列链from langchain_core.prompts import ChatPromptTemplatefrom langchain_openai import ChatOpenAIfrom langchain_core.output_parsers import StrOutputParser# 1. 创建提示模板定义用户输入和系统指令prompt ChatPromptTemplate.from_messages([ (system, 你是一位精通科技的助手请用简洁的语言回答问题。), (human, {question})])# 2. 初始化语言模型这里使用 OpenAI实际使用时需设置 API Keymodel ChatOpenAI(modelgpt-3.5-turbo, temperature0)# 3. 创建输出解析器将模型输出转换为字符串output_parser StrOutputParser()# 4. 使用 LCEL 的管道运算符组合组件chain prompt | model | output_parser# 5. 执行链式调用result chain.invoke({question: 什么是 LangChain 表达式语言})print(链式调用结果)print(result)在这个例子中prompt | model | output_parser形成了一条数据流用户输入的question首先被填入提示模板生成完整的消息然后传递给模型得到原始输出最后经过解析器转换为纯文本字符串。整个过程清晰简洁避免了传统编程中繁琐的中间变量和函数调用嵌套。## 中级应用添加条件逻辑与记忆功能当我们需要更复杂的逻辑时LCEL 提供了RunnablePassthrough、RunnableBranch等工具来实现条件判断和数据传递。### 添加会话记忆的问答链下面的代码展示了如何结合记忆组件Memory和 LCEL 构建一个能记住对话上下文的聊天机器人。python# 示例 2带记忆的对话链from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_openai import ChatOpenAIfrom langchain_core.runnables import RunnablePassthroughfrom langchain_core.output_parsers import StrOutputParserfrom langchain.memory import ConversationBufferMemoryfrom langchain_core.messages import HumanMessage, AIMessage# 1. 初始化记忆组件用于存储对话历史memory ConversationBufferMemory(return_messagesTrue)# 2. 创建提示模板包含对话历史和当前输入prompt ChatPromptTemplate.from_messages([ (system, 你是一位友好的助手根据对话历史回答用户的问题。), MessagesPlaceholder(variable_namehistory), # 动态插入历史消息 (human, {input})])# 3. 初始化模型model ChatOpenAI(modelgpt-3.5-turbo, temperature0.7)# 4. 定义输出解析器output_parser StrOutputParser()# 5. 使用 LCEL 构建链并嵌入记忆功能chain ( RunnablePassthrough.assign(historylambda x: memory.chat_memory.messages) | prompt | model | output_parser)# 6. 模拟多轮对话def chat_with_memory(user_input): # 调用链 response chain.invoke({input: user_input}) # 更新记忆保存用户输入和模型回复 memory.chat_memory.add_user_message(user_input) memory.chat_memory.add_ai_message(response) return response# 测试对话print(第一轮对话)resp1 chat_with_memory(你好我是小明。)print(f用户你好我是小明。\n助手{resp1})print(\n第二轮对话记忆测试)resp2 chat_with_memory(你还记得我的名字吗)print(f用户你还记得我的名字吗\n助手{resp2})这个例子中RunnablePassthrough.assign()用于动态注入历史消息到提示模板中而记忆组件则负责维护对话历史。LCEL 的管道设计让这个原本复杂的记忆集成变得异常简洁。## 高级用法并行执行与合并结果LCEL 最强大的特性之一是其对并行执行的天然支持。通过RunnableParallel或RunnableMap我们可以同时执行多个独立的任务然后将结果合并输出。### 并行处理多个数据源假设我们想要同时从两个不同角度分析一个文本总结内容和提取关键词。这两个任务可以并行执行最后将结果合并。python# 示例 3并行执行与结果合并from langchain_core.prompts import ChatPromptTemplatefrom langchain_openai import ChatOpenAIfrom langchain_core.runnables import RunnableParallel, RunnablePassthroughfrom langchain_core.output_parsers import StrOutputParser# 初始化模型model ChatOpenAI(modelgpt-3.5-turbo, temperature0.3)# 定义两个并行任务的任务链# 任务1文本总结summary_prompt ChatPromptTemplate.from_template( 请用一句话总结以下内容\n{text})summary_chain summary_prompt | model | StrOutputParser()# 任务2关键词提取keyword_prompt ChatPromptTemplate.from_template( 请从以下内容中提取3个关键词用逗号分隔\n{text})keyword_chain keyword_prompt | model | StrOutputParser()# 使用 RunnableParallel 并行执行两个任务parallel_chain RunnableParallel( summarysummary_chain, keywordskeyword_chain)# 组合成完整的工作流先传递文本再并行处理full_chain ( RunnablePassthrough.assign(textlambda x: x[article]) | parallel_chain)# 测试并行执行test_article LangChain 是一个用于开发基于大语言模型LLM的应用程序的框架。它提供了模块化组件和表达式语言帮助开发者快速构建复杂的 AI 工作流。LCEL 支持链式调用、并行执行和流式输出大大简化了开发过程。result full_chain.invoke({article: test_article})print(并行执行结果)print(f总结{result[summary]})print(f关键词{result[keywords]})在这个例子中RunnableParallel同时启动了summary_chain和keyword_chain它们各自独立处理相同的输入文本。模型调用是并行进行的如果底层 API 支持并发最终结果以字典形式返回包含了两个任务的输出。这种方式特别适合需要多维度分析的场景如文档分类、情感分析和信息抽取的组合应用。## 总结LCEL 作为 LangChain 的核心表达方式从基础的序列链接到高级的并行执行为 AI 应用开发提供了强大而优雅的解决方案。通过本文的三个示例我们看到了1.序列链用|运算符构建简单的数据流适合问答、翻译等线性任务。2.条件与记忆结合RunnablePassthrough和记忆组件实现有状态的对话系统。3.并行执行利用RunnableParallel同时处理多个任务提升效率并简化代码结构。LCEL 的核心理念是组合优于继承它让开发者能够像搭积木一样构建复杂的 AI 工作流同时保持代码的可读性和可维护性。随着 LangChain 生态系统的发展LCEL 将会支持更多高级特性成为 AI 应用开发不可或缺的工具。