LangChain框架入门:手把手带你玩转LCEL表达

LangChain框架入门:手把手带你玩转LCEL表达

LangChain 是当前大模型应用开发中最热门的框架之一,而 LCEL(LangChain Expression Language,LangChain 表达式语言)则是其核心的“魔法棒”。它让我们能够用简洁、可读、可组合的方式,将提示词、模型、输出解析器等组件“串联”成一条条强大的处理流水线。本文将带你从零开始,循序渐进地掌握 LCEL 的核心概念与实战技巧。### 一、为什么需要 LCEL?在 LCEL 出现之前,我们通常需要编写大量的样板代码来调用模型、处理中间结果、解析输出。比如,你需要手动管理 prompt 模板的填充、调用model.generate()、再手动提取文本。这种代码不仅冗长,而且难以复用和扩展。LCEL 的核心设计理念是**“一切皆表达式”**。它提供了一种统一的管道操作符|,让不同的组件像 Unix 管道命令一样无缝连接。数据流从左侧流向右侧,每一步的输入就是上一步的输出。这种设计极大地简化了代码,提升了可读性和可维护性。### 二、LCEL 基础:三大核心组件LCEL 的三大核心组件是:1.Prompt 模板:负责将用户输入和固定指令组合成最终的提示词。2.模型(Model):通常是 ChatOpenAI 或其它大语言模型,负责接收提示词并生成回复。3.输出解析器:将模型的原始文本输出,解析为结构化的数据(如字典、列表、Pydantic 对象)。我们来写第一个 LCEL 表达式,完成一个最简单的“翻译官”功能。python# 导入必要的库from langchain.prompts import ChatPromptTemplatefrom langchain.chat_models import ChatOpenAIfrom langchain.schema import StrOutputParser# 1. 创建 Prompt 模板prompt = ChatPromptTemplate.from_template( "请将以下英文翻译成中文:{english_text}")# 2. 初始化模型(请设置你的 OPENAI_API_KEY 环境变量)model = ChatOpenAI(model="gpt-4o-mini", temperature=0)# 3. 初始化输出解析器(直接返回字符串)parser = StrOutputParser()# 4. 使用管道符构建 LCEL 链chain = prompt | model | parser# 5. 调用链,传入输入参数result = chain.invoke({"english_text": "Hello, LangChain!"})# 输出翻译结果print(result) # 输出:你好,LangChain!代码解读:-prompt是一个模板,它接受一个变量english_text。-model是核心的语言模型。-parser将模型返回的AIMessage对象提取为纯字符串。-chain.invoke()是执行 LCEL 链的统一入口。数据流是:输入字典 → prompt 生成完整提示词 → 模型生成回复 → 解析器输出字符串。### 三、进阶:链式调用与 RunnablePassthroughLCEL 的强大之处在于它可以组合多个链,并且可以在链中传递和变换数据。RunnablePassthrough允许我们直接传递未修改的输入,或者配合itemgetter提取特定字段。下面我们构建一个更复杂的链,它先进行关键词提取,再进行回答,同时保留原始输入。pythonfrom langchain.prompts import ChatPromptTemplatefrom langchain.chat_models import ChatOpenAIfrom langchain.schema import StrOutputParserfrom langchain.schema.runnable import RunnablePassthrough, RunnableParallel# 子链1:提取关键词keyword_prompt = ChatPromptTemplate.from_template("从以下文本中提取3个关键词,用逗号分隔:{text}")keyword_chain = keyword_prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser()# 子链2:基于关键词和原文生成摘要summarize_prompt = ChatPromptTemplate.from_template( "以下是用户输入:{text}\n\n提取的关键词:{keywords}\n\n请基于这些信息生成一份简洁的总结。")summarize_chain = summarize_prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser()# 组合链:并行执行关键词提取,并保留原始输入chain = ( RunnableParallel( { "keywords": keyword_chain, "text": lambda x: x["text"] # 直接传递原始文本 } ) | summarize_prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser())# 执行result = chain.invoke({"text": "LangChain 是一个强大的框架,它简化了 LLM 应用的开发流程。"})print(result)关键点:-RunnableParallel可以并行执行多个子链(例如keyword_chain),并将结果组装成一个字典。- 我们使用lambda x: x["text"]将原始输入传递给后续步骤,而keywords则由子链生成。- 这样,最终链能同时使用关键词和原文,生成更高质量的总结。### 四、高级技巧:条件分支与自定义函数LCEL 还支持条件逻辑和自定义函数,这让它几乎可以处理任何复杂的业务逻辑。#### 1. 条件分支使用RunnableBranch,可以根据输入内容动态选择不同的处理路径。pythonfrom langchain.schema.runnable import RunnableBranch, RunnableLambda# 定义一个函数判断文本长度def is_long(text: str) -> bool: return len(text) > 50# 定义两个分支long_chain = RunnableLambda(lambda x: f"处理长文本:{x[:10]}...")short_chain = RunnableLambda(lambda x: f"处理短文本:{x}")# 构建分支链branch_chain = RunnableBranch( (lambda x: is_long(x["text"]), long_chain), # 如果条件为True,执行long_chain short_chain # 否则执行short_chain)result = branch_chain.invoke({"text": "这是一个很短的文本"})print(result) # 输出:处理短文本:这是一个很短的文本#### 2. 自定义函数通过RunnableLambda,我们可以将普通 Python 函数无缝嵌入到 LCEL 链中。pythonfrom langchain.schema.runnable import RunnableLambdadef add_score(text: str) -> str: """自定义函数:给文本添加评分""" score = len(text) * 2 return f"{text} (得分:{score})"chain = ( RunnableLambda(lambda x: x["input_text"]) # 提取输入 | RunnableLambda(add_score) # 应用自定义函数)print(chain.invoke({"input_text": "你好"})) # 输出:你好 (得分:4)### 五、与 LangSmith 集成:调试与监控在实际开发中,调试 LCEL 链非常方便。你可以使用chain.invoke()直接运行,也可以通过chain.batch()批量处理。更重要的是,LCEL 原生支持 LangSmith 追踪,你可以查看每一步的输入输出,快速定位问题。python# 开启 LangSmith 追踪(需要环境变量 LANGCHAIN_TRACING_V2=true)# 然后你的链会自动记录所有运行日志# 批量调用示例results = chain.batch([{"input_text": "你好"}, {"input_text": "世界"}])print(results)### 六、总结LCEL 是 LangChain 中极具革命性的设计,它让复杂的大模型应用变得像拼积木一样简单。通过|管道符,我们可以轻松组合 Prompt、模型、解析器、Runnable 等组件,构建出可读性高、可扩展性强的 AI 应用。从简单的翻译,到并行处理、条件分支、自定义函数,LCEL 都提供了优雅的解决方案。掌握 LCEL 不仅提升了开发效率,也为构建更复杂的 Agent、RAG 系统打下了坚实的基础。希望本文能为你打开 LangChain 世界的大门,赶快动手试试吧!