ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AI Agent白手起家39: LangChain 的链式开发核心:Runnable 接口与 LCEL

AI Agent白手起家39: LangChain 的链式开发核心:Runnable 接口与 LCEL 纲要Runnable接口统一的组件输入输出类型基于Pydantic标准调用方法invoke、batch、stream等RunnableConfig运行时动态配置回调、元数据、标签等LCELLangChain Expression Language管道操作符|实现顺序组合RunnableSequence与RunnableParallel并行执行与顺序执行的编排使用场景简单链提示词 模型 解析器LCEL 最佳场景复杂分支/循环/多智能体推荐LangGraph旧版预制链迁移思路完整可运行代码顺序链与并行链示例使用模拟模型无需 API Key引言LangChain 的名字来源于“Language Chain”其核心设计理念就是将不同的处理单元提示词模板、大模型、输出解析器等像链条一样串联起来。在 v0.2 之后框架引入了一套统一的组件协议——Runnable接口并基于它构建了简洁的表达语言 LCEL。理解这两者是高效编排 LLM 工作流的关键也是从旧版“预制链”平滑过渡到现代链式开发的桥梁。Runnable 接口组件通信的标准协议统一的输入输出约定LangChain 中所有标准组件提示词、聊天模型、LLM、输出解析器、检索器、工具等都实现了Runnable接口。它对每个组件的输入和输出类型做了严格规定例如提示词模板接受dict输出PromptValue聊天模型接受string/Message/PromptValue输出ChatMessage输出解析器输入为上一环节的输出如AIMessage输出取决于解析器类型dict、str、Pydantic Model等这种强制类型约定基于Pydantic实现能够在开发阶段就发现类型不匹配的问题避免运行时因数据格式错误导致崩溃。标准调用方法Runnable暴露了一套统一的调用入口所有实现该接口的组件都支持invoke(input)同步单次调用batch(inputs)批量处理stream(input)流式输出astream、ainvoke等异步版本这些方法使得任意组件都能够被无缝替换和组合开发者无需关心内部实现差异。RunnableConfig运行时动态配置每个Runnable的方法都可接收第二个参数——RunnableConfig。它允许在调用时注入回调函数、标签、元数据、最大并发数等信息甚至动态覆盖某些可配置的字段。例如可以在运行时改变提示词模板中的部分内容为追踪和调试提供了极大便利。Runnableinvoke(input, config?)batch(inputs, config?)stream(input, config?)astream(input, config?)PromptTemplateformat(**kwargs) : PromptValueChatModelinvoke(messages) : ChatMessageOutputParserparse(text) : AnyLCEL简洁的链式编排语言LCEL 是建立在Runnable之上的领域特定语言核心目标是让多个组件的组合变得像写表达式一样自然。管道操作符与顺序组合使用|管道符可以将任意Runnable串联成一个顺序执行链。数据从左至右依次经过每个组件chainprompt|model|parser上述代码等价于RunnableSequence(firstprompt, middle[model], lastparser)也等价于prompt.pipe(model).pipe(parser)。无论链有多长最终的chain仍然是一个Runnable可以继续与其他组件组合或直接调用。并行组合RunnableParallel可以将多个分支并行执行最后汇总结果。它接受一个字典每个键值对都是独立的Runnable。输入会同时传给所有分支各分支结果被合并为一个字典。例如同时让模型生成中文和英文回答fromlangchain_core.runnablesimportRunnableParallel parallel_chainRunnableParallel(chinesechinese_chain,englishenglish_chain)使用场景与工具选择简单链提示词 → 模型 → 解析器这类线性流程最适合用 LCEL 实现代码简洁且易于维护。复杂流程包含循环、条件分支或多智能体协作时推荐使用LangGraph基于图的流程编排。LCEL 本身也能处理一些条件路由但对于复杂控制流支持有限。预制链迁移旧版LLMChain、ConversationChain等预制链虽然仍兼容但提示词固化、定制困难官方建议用 LCEL 或 LangGraph 重新实现以获得完全的灵活性和可观测性。完整可运行代码以下示例使用FakeListChatModel模拟大模型无需真实 API Key可直接运行体验链式编排。安装依赖pipinstalllangchain langchain-core langchain-community示例代码fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnableParallelfromlangchain_community.chat_models.fakeimportFakeListChatModel# ---------- 准备模拟模型 ----------# 预设回答列表第一次中文第二次英文responses[AI Agent 是能够感知环境并采取行动以实现目标的智能体。,An AI Agent is an intelligent entity that perceives its environment and takes actions to achieve goals.]modelFakeListChatModel(responsesresponses)# ---------- 顺序链提示词 - 模型 - 解析器 ----------chinese_promptChatPromptTemplate.from_template(用中文简单解释{topic})chinese_chainchinese_prompt|model|StrOutputParser()english_promptChatPromptTemplate.from_template(Briefly explain in English: {topic})english_chainenglish_prompt|model|StrOutputParser()# ---------- 并行链中英文同时解释 ----------parallel_chainRunnableParallel(chinesechinese_chain,englishenglish_chain)# 调用并行链resultparallel_chain.invoke({topic:AI Agent})print(并行输出)print(中文,result[chinese])print(英文,result[english])# 也可以单独调用顺序链print(\n顺序链单独调用)print(chinese_chain.invoke({topic:Runnable 接口}))代码运行后可以看到RunnableParallel将同一个输入同时分发给中英文两条链并返回一个包含chinese和english字段的字典。这展示了 LCEL 编排的灵活性和简洁性。总结Runnable接口为 LangChain 提供了标准化的组件通信协议而 LCEL 则让这些组件的组合变得如搭积木般直观。对于线性流程管道符|一行代码即可完成编排对于需要并行的场景RunnableParallel让多任务同时执行。当流程变得非常复杂时LangGraph 可以无缝接替。掌握这一套组合拳将极大提升构建 LLM 应用的效率和可维护性。
返回列表