RunnableSequence(SimpleSequentialChain 的现代替代品)

RunnableSequence(SimpleSequentialChain 的现代替代品)
前置重要结论SimpleSequentialChain已经被官方标记 Deprecated废弃LangChain v0.1 推荐彻底迁移到RunnableSequenceLCEL 管道|它就是新版替代 SimpleSequentialChain 的标准实现。 旧版SimpleSequentialChain基于LLMChain 新版等价物RunnableSequenceLCEL 原生一、旧版 SimpleSequentialChain 原理回顾理解迁移必须看懂1. 核心定义SimpleSequentialChain单输入 → 单输出线性流水线执行规则初始输入传入第一条子链上一条链字符串输出直接作为下一条链{input}的输入所有子链只能接收单个变量链式传递字符串只支持LLMChain作为子单元不能直接放 Prompt、Parser、自定义函数。2. 旧版标准参数SimpleSequentialChain( chains[chain1, chain2, chain3], # 有序子链列表只能是 LLMChain verboseFalse, # 打印链路日志 strip_outputsFalse, # 自动修剪每一步首尾空白 input_keyinput, output_keyoutput )3. 旧版完整示例过时写法仅用于对比from langchain_openai import ChatOpenAI from langchain_core.prompts import PromptTemplate from langchain.chains import LLMChain, SimpleSequentialChain llm ChatOpenAI(modelgpt-4o-mini) # Step1根据主题写标题 prompt1 PromptTemplate.from_template(给{input}写一个吸引人文章标题) chain1 LLMChain(llmllm, promptprompt1) # Step2根据标题写简介 prompt2 PromptTemplate.from_template(根据标题{input}写一段100字简介) chain2 LLMChain(llmllm, promptprompt2) # 串联 seq_chain SimpleSequentialChain(chains[chain1, chain2], verboseTrue) result seq_chain.invoke({input: 人工智能发展趋势}) print(result[output])4. 旧版致命缺陷为什么被废弃强绑定 LLMChain无法直接串联输出解析器、自定义函数、Retriever只能传递纯字符串不支持字典多参数传递原生不支持流式 stream ()、batch ()组合能力弱很难和并行链、分支链嵌套样板代码极多可读性差不兼容 LangSmith 完整追踪、重试、回调高级特性。二、新版本RunnableSequenceSimpleSequentialChain 的现代替代品2.1 核心定位RunnableSequenceLCEL 标准顺序执行流水线对应旧概念SimpleSequentialChain单数据流串行 底层所有|管道运算符内部自动构造RunnableSequence执行模型相比旧版重大升级任意Runnable均可串联Prompt / ChatModel / Parser / RunnableLambda / 子 Chain / Retriever数据类型不再限制字符串dict 字典、字符串、对象自由流转统一接口invoke / stream / batch / ainvoke / astream开箱即用支持嵌套、并行混合、重试、fallback、中间日志数据流转规则r1 | r2 | r3r1 输出 → 传给 r2 输入r2 输出 → 传给 r3 输入2.2 三种创建 RunnableSequence 写法等价from langchain_core.runnables import RunnableSequence, RunnableLambda from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI(modelgpt-4o-mini) parser StrOutputParser() prompt1 PromptTemplate.from_template(给{topic}写吸引人标题) prompt2 PromptTemplate.from_template(根据标题{title}写100字简介) # --------------------------- # 写法1管道符 |【官方推荐最简】 # --------------------------- chain1 prompt1 | llm | parser # 注意chain1输出是字符串我们需要包装成字典喂给prompt2 full_chain chain1 | RunnableLambda(lambda title: {title: title}) | prompt2 | llm | parser # --------------------------- # 写法2显式构造 RunnableSequence # --------------------------- full_chain RunnableSequence( prompt1 | llm | parser, RunnableLambda(lambda title: {title: title}), prompt2 | llm | parser ) # --------------------------- # 写法3from_list 列表传入适合动态步骤数组 # --------------------------- steps [ prompt1 | llm | parser, RunnableLambda(lambda title: {title: title}), prompt2 | llm | parser ] full_chain RunnableSequence.from_list(steps) # 调用输入字典 res full_chain.invoke({topic: 人工智能发展趋势}) print(res)✅ 上面这段代码完全等价旧版 SimpleSequentialChain 业务逻辑。2.3 关键难点新旧数据格式差异90% 踩坑点旧 SimpleSequentialChain链输出字符串自动把字符串封装{input: xxx}传给下一条链内部隐式做了格式转换开发者无感新版 RunnableSequence不会自动包装字典完全显式流转如果前一步输出字符串下一步 Prompt 需要字典{key: value}必须手动用 RunnableLambda 转换# 典型转换模板 RunnableLambda(lambda text: {input: text})如果你想要复刻旧 SimpleSequentialChain 的自动转发行为加上这一层即可。2.4 RunnableSequence 常用内置能力旧版完全没有# 1. 流式输出原生支持 async for chunk in full_chain.astream({topic: 大模型应用}): print(chunk, end) # 2. 批量执行 full_chain.batch([{topic: 汽车}, {topic: 云计算}]) # 3. 添加重试策略 from langchain_core.runnables import RunnableRetry retry_chain full_chain.with_retry(max_attempts2) # 4. 获取链路图LangSmith可视化 full_chain.get_graph() # 5. pipe() 等价 | chainA.pipe(chainB).pipe(chainC)三、SimpleSequentialChain → RunnableSequence 迁移对照表表格特性SimpleSequentialChain旧RunnableSequence新版 LCEL子单元仅支持 LLMChain任意 RunnablePrompt、LLM、Parser、函数、检索器传递数据强制字符串自动封装 {input: str}str/dict/ 对象格式完全手动可控调用接口invoke /runrun 逐步废弃invoke / ainvoke / stream / astream / batch流式输出不原生支持原生支持组合嵌套困难只能链套链自由和 RunnableParallel、RunnableBranch 组合状态追踪简陋完整 LangSmith 追踪代码风格大量样板代码ABC 极简声明式维护状态Deprecated未来移除持续迭代LCEL 核心原语四、两种典型业务场景迁移模板场景 1复刻原版 SimpleSequentialChain 行为字符串自动传递旧逻辑A 输出字符串 → 自动作为下一级 {input}from langchain_core.runnables import RunnableSequence, RunnableLambda from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI(modelgpt-4o-mini) # 步骤1 step1 PromptTemplate.from_template(写{input}的标题) | llm | StrOutputParser() # 步骤2 step2 PromptTemplate.from_template(扩写{input}) | llm | StrOutputParser() # 模拟旧SimpleSequentialChain自动把字符串转为 {input: xxx} def wrap_input(text: str): return {input: text} seq RunnableSequence( step1, RunnableLambda(wrap_input), step2 ) result seq.invoke({input: 低碳经济}) print(result)场景 2进阶改进保留中间变量旧 SimpleSequentialChain 做不到旧链无法保存中间结果Runnable 搭配RunnablePassthrough轻松实现from langchain_core.runnables import RunnablePassthrough seq_advance ( PromptTemplate.from_template(写{topic}标题) | llm | StrOutputParser(), {title: RunnablePassthrough(), desc: PromptTemplate.from_template(简述 {}) | llm | parser} )五、常见坑汇总❌ 报错KeyError: input原因上一步输出字符串下一个 Prompt 期待字典缺少格式转换 ✅ 修复插入RunnableLambda(lambda s: {input: s})❌ 继续使用 LLMChain 搭建流水线 建议新版本直接抛弃 LLMChain使用prompt | model | parser原生写法❌ 混用旧链与 LCEL Runnable 可以临时兼容但长期全部统一为 LCEL 结构❌ 认为RunnableSequence.from_list([...])和管道符行为不一致 二者底层完全等价管道符更推荐日常开发。六、最终总结不要再新项目使用 SimpleSequentialChain官方废弃路线已定它的现代替代方案 RunnableSequence日常直接使用|LCEL 管道核心变化不再自动完成字符串→字典封装数据流显式可控换取极强灵活性旧单输入线性流水线通过增加一层RunnableLambda数据适配器即可无缝迁移。

最新新闻

日新闻

周新闻

月新闻