当前位置: 首页 > news >正文

LangChain 的 LCEL 写法

文章目录

    • 1. 官方文档里的最基本 LCEL 写法
    • 2. LCEL 的核心写法规则
      • 顺序组合:`a | b | c`
    • 3. LCEL 不只是 prompt + model
    • 4. LCEL 的并行写法
    • 5. LCEL 里常见的“透传 + 增补字段”写法
    • 6. 官方文档里的调用方式
    • 7. 一个更接近实际项目的 LCEL 认知方式
    • 8. LCEL 时最应该掌握的 3 个点
      • 第一层:顺序链
      • 第二层:并行分支
      • 第三层:保留输入并扩展字段
    • 9. LCEL 模板
    • 10.总结

根据 LangChain 官方文档,LCELLangChain Expression Language,用于把Runnable组件用声明式方式组合起来。官方文档把Runnable定义为 LangChain 的基础构件,支持invokebatchstream和组合;而 LCEL 就是把这些组件组合成可执行链的表达方式。(Mintlify)

你可以把 LCEL 理解成一句话:

|、字典分支、assign()等语法,把 prompt、model、parser、retriever、lambda 等 Runnable 组件拼成一个链。(Mintlify)


1. 官方文档里的最基本 LCEL 写法

官方示例的顺序链是:

fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_openaiimportChatOpenAI prompt=ChatPromptTemplate.from_template("Tell me a joke about {topic}")model=ChatOpenAI()output_parser=StrOutputParser()chain=prompt|model|output_parser result=chain.invoke({"topic":"programming"})

这段写法在官方文档里对应的是RunnableSequence:前一个组件的输出,作为后一个组件的输入;|就是顺序组合的语法糖。官方也给了等价写法RunnableSequence(prompt, model, output_parser)。(Mintlify)


2. LCEL 的核心写法规则

顺序组合:a | b | c

这表示:

  • a先执行
  • a的输出传给b
  • b的输出再传给c

在 LangChain 官方文档里,这叫RunnableSequence。最典型就是:

chain=prompt|model|output_parser

语义上就是:

输入->prompt->model->parser->输出

(Mintlify)


3. LCEL 不只是 prompt + model

官方文档强调:LangChain 的组件普遍都实现了Runnable协议,因此 LCEL 可以组合的不只是模型,还包括:

  • prompt
  • model
  • output parser
  • lambda/function 包装成的RunnableLambda
  • 原样透传的RunnablePassthrough
  • 并行分支RunnableParallel
  • 条件路由RunnableBranch

这些都属于官方文档中的可组合 Runnable 类型。(Mintlify)


4. LCEL 的并行写法

官方文档给出的第二种基础组合方式是RunnableParallel。它会把同一个输入并发传给多个 Runnable,然后返回一个字典。(Mintlify)

官方示例:

fromlangchain_core.runnablesimportRunnableParallel,RunnableLambda chain=RunnableParallel(mul_2=RunnableLambda(lambdax:x*2),mul_5=RunnableLambda(lambdax:x*5),add_10=RunnableLambda(lambdax:x+10))result=chain.invoke(3)# {"mul_2": 6, "mul_5": 15, "add_10": 13}

而且官方还说明了,在 sequence 里直接写一个 dict,也会形成并行分支,例如:

chain=(RunnableLambda(lambdax:x+1)|{"mul_2":RunnableLambda(lambdax:x*2),"mul_5":RunnableLambda(lambdax:x*5),}|RunnableLambda(lambdax:x["mul_2"]+x["mul_5"]))

这就是 LCEL 很常见的“分叉再汇总”写法。(Mintlify)


5. LCEL 里常见的“透传 + 增补字段”写法

官方文档里一个很实用的模式是RunnablePassthrough.assign(...)。它的作用是:

  • 先把原始输入保留下来
  • 再新增一个由子链计算出来的字段

官方示例:

fromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_openaiimportChatOpenAI prompt=ChatPromptTemplate.from_template("Summarize: {text}")model=ChatOpenAI()chain=({"text":RunnablePassthrough()}|RunnablePassthrough.assign(summary=prompt|model|StrOutputParser()))result=chain.invoke("Long article text...")# {"text": "Long article text...", "summary": "Brief summary..."}

这类写法在 RAG、信息抽取、数据增强场景里很常见,因为你经常既想保留原始输入,又想附加模型产出的结果。(Mintlify)


6. 官方文档里的调用方式

LCEL 组合出来的链,本质上还是Runnable,所以它天然支持这些调用方式:

  • invoke():单次调用
  • batch():批量处理
  • stream():流式输出
  • 对应异步版本:ainvoke()abatch()astream()

官方文档明确把这些列为 Runnable 的核心调用模式。(Mintlify)

例如:

result=chain.invoke({"topic":"programming"})

或者流式:

forchunkinmodel.stream("Tell me a story"):print(chunk.content,end="",flush=True)

这意味着:你用 LCEL 写出来的不是“静态配置”,而是一个统一接口的可执行对象。(Mintlify)


7. 一个更接近实际项目的 LCEL 认知方式

按官方文档的定义,LCEL 最重要的不是“写法酷”,而是它把链路变成了标准化的可组合执行单元。LangChain 官方也强调它提供了统一模型接口和组件化能力,方便你替换提供商、拼装应用。(LangChain 文档)

所以你可以这样理解:

chain=prompt|model|parser

不是简单的“管道语法”,而是:

  • prompt负责把输入组织成模型可消费的提示
  • model负责生成
  • parser负责把模型输出变成你想要的数据形态
  • 整个链再统一暴露invoke/batch/stream

8. LCEL 时最应该掌握的 3 个点

按官方文档,先掌握这三个就够用了:

第一层:顺序链

prompt|model|parser

第二层:并行分支

previous|{"a":chain_a,"b":chain_b}

第三层:保留输入并扩展字段

RunnablePassthrough.assign(...)

这三种已经覆盖大多数基础 LCEL 场景。(Mintlify)


9. LCEL 模板

fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_openaiimportChatOpenAI prompt=ChatPromptTemplate.from_template("请总结下面内容:{text}")model=ChatOpenAI()parser=StrOutputParser()chain=({"text":RunnablePassthrough()}|RunnablePassthrough.assign(summary=prompt|model|parser))result=chain.invoke("这是一段需要总结的文本")print(result["summary"])

这段不是官方原样复制,但完全符合官方文档给出的 LCEL 组合方式:RunnableSequenceRunnablePassthrough.assign()StrOutputParser()。(Mintlify)


10.总结

根据官方文档,LCEL 就是 LangChain 用来组合 Runnable 的表达式语言;最核心的写法是:

  • |表示顺序组合
  • dict表示并行分支
  • assign()表示在保留原输入的同时新增计算字段

最终得到的链仍然是一个Runnable,可以统一用invokebatchstream来执行。(Mintlify)

http://www.jsqmd.com/news/636532/

相关文章:

  • 卡尔曼滤波小白必看:FAST-LIO凭什么比传统SLAM快5倍?从数学推导到代码实现
  • 6.1 主题与暗色模式
  • 3大神奇功能!AutoCAD字体管理插件FontCenter让设计师告别字体烦恼
  • 2026年贵州智慧停车系统与车牌识别解决方案深度横评:五大品牌无人值守停车场道闸与识别相机对比指南 - 精选优质企业推荐榜
  • 不止是救砖:聊聊chroot这个‘系统手术刀’在Jetson开发中的另类玩法
  • 微信小程序的社区防控代办跑腿系统
  • Python 正则表达式:文本清洗与信息提取速通手册
  • Dify部署
  • uni-app怎么做分包 uni-app小程序分包加载配置【优化】
  • 电子电路中的“心脏”:电源诳
  • 2026年建筑智能化新趋势:专业公司如何引领未来? - 小艾信息发布
  • 如何处理无法修改主键列的问题_先删除AUTO_INCREMENT再移除主键的顺序
  • SQL中如何实现特定范围内数据的批量删除_范围分区与分区删除
  • 股市学习心得-实战操作手法-一切都是为了确定性
  • 大模型面试复盘:从0基础到收获4个Offer,我的转行避坑指南!
  • Unity游戏内嵌Coze智能体:从API调用到实时对话的完整实践
  • MiniCPM-V-2_6金融风控应用:票据图像识别+伪造特征检测实战部署
  • 深度学习新手福音:PyTorch通用开发镜像,一键启动你的第一个AI项目
  • 基于改进快速粒子群算法的动态无功优化软件在含分布式电源系统中的应用与性能优化,采用Matlab...
  • CSS渐变背景在Safari渲染断层_优化渐变色彩区间与渲染模式
  • Pixel4刷机翻车自救指南:从源码下载到内核编译,我踩过的那些坑(Ubuntu 18.04 + Android 12)
  • 从规范到代码:RC522驱动Mifare Ultralight Type2 Tag的实战避坑指南(基于PHY6212平台)
  • ComfyUI快速上手:无需代码,可视化节点设计AI绘画流程
  • AIAgent黑盒变透明:5步实现高可信度可解释架构设计(附NASA/医疗级验证标准)
  • 基于vue的消息推送平台[vue]-计算机毕业设计源码+LW文档
  • AD2S1210旋变芯片在伺服控制中的应用:从芯片手册到电机位置反馈的实战解析
  • 学术PPT别再照搬论文了!哈佛教授建议的幻灯片制作心法(附时间分配表)
  • 告别Cityscapes:手把手教你将DDRNet.pytorch项目适配到自己的小数据集(以细胞图像为例)
  • Android开发实战:用Zxing实现前置摄像头扫码的5个常见坑及解决方案
  • 阿里刚开源下一代RAG王炸框架,AI学会自己翻图、看视频、找资料了