掘金 人工智能 06月08日 13:08
LangChain Core架构解析:模块化设计与LCEL原语实现原理
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入解析了LangChain Core的架构,重点介绍了其模块化设计和LCEL(LangChain表达式语言)原语的实现原理。LangChain Core是LangChain生态的核心,定义了关键的抽象和LCEL原语。其设计遵循模块化和极简风格,通过接口、协议和语法三位一体的设计,实现了组件的标准化交互和组合。核心概念包括Runnable接口和LCEL,前者提供了统一的调用接口,支持并行化、异步和可组合性,后者是一种声明式语言,用于组合Runnable,构建复杂的AI应用。文章还通过实例展示了RunnableSequence和RunnableParallel的使用方法,阐述了LCEL的高效执行机制。

🧩 LangChain Core 采用模块化设计,核心抽象包括LM、Document Loader、Embedding、VectorStore、Retriever等,这些组件相互独立,不与特定LLM绑定。

⚙️ Runnable 接口是LangChain设计的基石,实现了与所有组件的标准化交互。它提供了统一的调用接口,支持并行化、异步和可组合性,通过invoke/ainvoke、stream/astream、batch/abatch等方法提供一致的使用体验。

💡 LCEL(LangChain Expression Language)是一种声明式语言,用于组合LangChain Core的Runnable。它将LCEL编译为优化的执行计划,并自动支持并行化、流式传输、过程跟踪和异步执行。

➡️ RunnableSequence 允许按顺序依次调用一系列runnables,上一个Runnable的输出作为下一个Runnable的输入,构建方式可以通过 | 运算符连接或传入Runnable实例列表。

⏩ RunnableParallel 允许并发调用一系列runnables,所有runnables共享相同的输入,同样可以通过 | 运算符连接或传入Runnable实例列表构建。

[LangChain Core架构解析:模块化设计与LCEL原语实现原理]

LangChain Core架构解析:模块化设计与LCEL原语实现原理

 本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!

 

LangChain Core Introduction

LangChain Core定义了LangChain生态中最核心的最基础的抽象和LCEL原语(LangChain表达式语言)。

设计原则

遵循 模块化设计 和 极简风格

设计哲学:约定优于配置(Convention Over Configuration)

优势: 任何provider都可以实现相关接口然后加入LangChain生态系统

核心抽象

核心抽象包括: 接口 + 协议 + 语法

三位一体的设计架构:

Runnable接口

主要作用

使用方式
Runnable接口的使用方式包括: 声明式 和 立即执行

主要抽象类家族

编辑

LCEL

LCEL全称 LangChain Expression Language ,是一种声明式语言,用来组合LangChain Core的Runnable成各种序列或DAG,满足由LLM驱动的AI应用的常用组合模式的开发。
LangChain Core会将LCEL编译为优化的执行计划,并自动支持并行化、流式传输、过程跟踪和异步执行。

    1. 自动优化:编译时合并操作符,减少调用开销2. 透明并行:自动检测可并行执行的组件3. 错误传播:异常处理链路贯穿整个工作流

主要组合原语是RunnableSequence和RunnableParallel。
RunnableSequence 按顺序依次调用一系列runnables。并且用上一个Runnable的输出作为下一个Runnable的输入
构建方式

RunnableSequence 实例

from langchain_core.runnables import RunnableLambda

示例1:创建简单计算流水线

通过 | 创建 RunnableSequence 实例

sequence = RunnableLambda(lambda x: x + 1) | RunnableLambda(lambda x: x * 2)

print(type(sequence))

输出: <class 'langchain_core.runnables.base.RunnableSequence'>

单个输入调用 invoke

invoke_result = sequence.invoke(1)

print(type(invoke_result), invoke_result)

输出: <class 'int'> 4

批处理 batch

batch_result = sequence.batch([1, 2, 3])

print(type(batch_result), batch_result)

输出: <class 'list'> [4, 6, 8]

RunnableParallel 并发调用一系列runnables。并且用同样的输入作为每一个Runnable的输入
构建方式

RunnableParallel实例

from langchain_core.runnables import RunnableLambda

示例2:创建并行计算分支

使用 dict 创建 RunnableParallel 实例

sequence = RunnableLambda(lambda x: x + 1) | {

    'mul_2': RunnableLambda(lambda x: x * 2),

    'mul_5': RunnableLambda(lambda x: x * 5),

}

print(type(sequence))

输出: <class 'langchain_core.runnables.base.RunnableSequence'>

单个输入调用 invoke

invoke_result = sequence.invoke(1)

print(type(invoke_result), invoke_result)

输出: <class 'dict'> {'mul_2': 4, 'mul_5': 10}

::: tip 小提示
RunnableLambda是一个可以将一个python callable转换成一个Runnable实例的类。上述实例用来转换lambda函数。
:::

Reference

LangChain Core架构解析:模块化设计与LCEL原语实现原理

用真话讲AI,回归技术本质,拒绝神话或妖魔化。搜索 "大千AI助手" 关注我,一起撕掉过度包装,学习真实的AI技术!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangChain LCEL 模块化设计 Runnable
相关文章