langchain-runnable底层原理

news2024/9/21 21:42:22

文章目录

  • langchain
    • langchain生态介绍
    • langchain
    • LCEL
    • runnable
      • runnable基础能力介绍
        • invoke
        • batch
        • stream
        • ainvoke
        • abatch
        • astream
        • __or__、__ror__
        • pipe
        • get_name
        • InputType (属性)
        • OutputType (属性)
        • input_schema (属性)
        • output_schema (属性)

langchain

langchain生态介绍

在这里插入图片描述

langchain是一个用于开发以大模型作为底层能力支持的应用的框架,你如果要开发一个基于大模型的的应用,那么选择langchain会方便很多。 因为它为大模型应用产品提供了全生命周期管理方案。

  1. 应用的全生命周期管理
    2. 应用开发:用langchain提供的组件进行项目开发,或者用langGraph提供有状态的应用开发
    3. 项目监控:用langsmith提供实时的调试、监控和评估,为项目的迭代提供依据
    4. 项目部署:使用LangServe或者langchain cloud部署项目,对外暴露REST API风格接口

上面所讲的langchain其实是一整个生态,包括了langchain模块、langsmith模块、langGraph模块、LangServe模块,以及langchain cloud,每个模块都提供了不一样的能力
而langchain是我们从无到有开发产品时要用到的开发框架,那下面就具体来说langchain模块

langchain

langchain是提供大模型应用开发的开发框架,其主要有两个大块组成

  1. langchain-core : langchain底层的抽象框架,以及为lagnchain自家标榜的LCEL表达语言提供支持
  2. langchian-community:第三方的集成,其中诸如openai、google、阿里等等第三方公司的能力的集成,这个能力包括大模型能力、搜索能力、embedding能力等等,不局限于大模型的能力
    还有一个需要注意的是,有些第三方的支持会被独立的抽取出来,提供更轻量化的支持,比如langchain-openai,langchain-anthropic

本质上来说,langchian-community只是继承了langchain-core,实现了底层定义的抽象,所以langchian的核心的核心都在langchain-core,
langchain-core既为第三方的扩展提供了标准,也为langchain自身设计奠定了基调,那langchain的设计基调是什么呢?是LCEL

LCEL

LCEL是langchain所标榜的一个设计原则,它以一种以声明式的形式将langchain的各个组件链接起来,这里讲一下声明式,声明式意思就是说你只用关心输入和输出
关于模块本身的实现细节,并不需要你去关心,举个例子哈,比如在langchain中的llm,它有一个方法是invoke,它接受一个字符串,返回一个字符串,用户在使用的过程中
根本不需要知道太多的细节,只需要知道invoke是输入一个字符串然后传给llm得到一个字符串就可以了。同时这样还有一个好处,在langchain中设计了很多的组件,
只要一个组件的输出格式满足另一个组件的输入,就可以把它串行起来组成一个runnableSequence。而这些关于LCEL的底层支持都来自于runnable,runnable是一个类,几乎在langchain中的所有组件都继承了这个类。

runnable

runnable是langchain的一基类,几乎所有的核心组件都是runnable的子类,包括聊天模型、LLM、输出解析器、检索器、提示模板等,甚至你组成的chain也是
runnable的子类:RunnableSequence或者是RunnableParalle,总之,几乎所有的组件都是runnable的子类。

而runnable本身定义了一些标准的接口,用于子类去实现,其中比较重要的几个标准接口包括
invoke:提供单个输入,得到单个输出
batch:提供多个输入,得到多个输出
stream:提供单个输入,得到流式输出

ainvoke:invoke的异步
abatch:batch的异步
astream:stream的异步

下面稍微丢一小部分,底层的runnable的框架图,这些都是lcel的基石
在这里插入图片描述

runnable基础能力介绍

invoke

作用: 传递单个输入得到单个输出

步骤:

  1. 子类去实现
batch

作用: 传递多个输入得到多个输出

步骤:

  1. 校验配置文件
    2. 如果没有传入配置文件,则初始化最小4个参数,

            empty = RunnableConfig(
            tags=[],
            metadata={},
            callbacks=None,
            recursion_limit=25,)
    
    1. 如果输入是多个,则配置文件要copy到同样长度,得到一个配置文件列表
    2. 配置文集列表中只有第一个要设置run_id,其他的需要删除,便于trace追踪
  2. 创建一个线程池,并行调用invoke

stream

作用:

  1. 流式输出

步骤:

  1. yield输出invoke结果
ainvoke

作用: 传递单个单个输入,异步的得到单个输出

步骤:

  1. 创建一个事件循环;
  2. 使用一个默认的执行器,通常就是一个线程池,来执行同步的invoke方法
  3. 将执行器交给事件循环,实现异步功能
    注意:如果子类不重写,其实本质只要你的runnable支持invoke,就会支持ainvoke
abatch

作用: 传递多个输入,异步的得到多个输出

步骤:

  1. 校验配置文件
    2. 如果没有传入配置文件,则初始化最小4个参数,
    empty = RunnableConfig(
    tags=[],
    metadata={},
    callbacks=None,
    recursion_limit=25,)
    3. 如果输入是多个,则配置文件要copy到同样长度,得到一个配置文件列表
    4. 配置文集列表中只有第一个要设置run_id,其他的需要删除,便于trace追踪

  2. 创建一个事件循环,并行根据每一个输入调用ainvoke,(有最大输入调用次数限制:max_concurrency)

astream

作用:

  1. 异步流式输出

步骤:

  1. yield输出ainvoke结果
orror

作用: 重写|符号,将两个runnablelike拼接成runablesequence

步骤:

  1. 检查输入的对象other是否是runnablelike
    2. runnablelike包括
    RunnableLike = Union[
                          Runnable[Input, Output],
                          Callable[[Input], Output],
                          Callable[[Input], Awaitable[Output]],
                          Callable[[Iterator[Input]], Iterator[Output]],
                          Callable[[AsyncIterator[Input]], AsyncIterator[Output]],
                          Mapping[str, Any],
                      ]
    
    1. 如果输入对象是一个runnable,则直接返回
    2. 如果输入对象是一个异步生成器或者是一个生成器,则将输入转为RunnableGenerator返回
    3. 如果输入对象是一个可调用对象,则将输入转为一个RunnableLamabda
    4. 如果输入是一个字典,则将输入转为一个RunnableParallel
  2. 将原始的runnable和转化后的输入拼接成一个新的runnableSequence
pipe

作用:和__or__完全相同

get_name

作用:获取runnable的名字

步骤:

  1. name获取:
    1. 如果传入了name,则就用传入的;
    2. 如果没有传入,就用runnable初始化时复制的name
    3. 如果都没有,就用runnable的类名作为name
  2. name相关属性返回:
    1. 如果传入suffix:则返回结果为suffix_name
    2. 如果没有传入name,则返回name
InputType (属性)

作用:返回Runnable的input类型

步骤:

  1. 直接获取此类的参数,第一个参数为输入参数,返回出入参数的类型
OutputType (属性)

作用:返回Runnable的output类型

步骤:

  1. 直接获取此类的返回参数
input_schema (属性)

作用:获取输入的schema

步骤:

  1. 获取输入schema:
    1. 如果输入类型是一个类,且是继承了BaseModel,则直接返回输入类型
    2. 否则,根据输入类型创建一个pydantic的数据模型
output_schema (属性)

作用:获取输出schema

步骤:

  1. 获取输出schema:
    1. 如果输出类型是一个类,且是继承了BaseModel,则直接返回输入数据类型
    2. 否则,根据输入类型创建一个pydantic的数据模型

注意:原则上说,子类只要重写了invoke,其他的诸如ainvoke,batch,abatch等都可以使用,这是子类的最小化实现方式,特殊情况下其他的方法也会被一定程度的重写

附上筋斗云,会有完整教程和代码:https://github.com/traveler-leon/langchain-learning.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Min P Sampling: Balancing Creativity and Coherence at High Temperature阅读笔记

上一篇文章是关于大语言模型的调参数,写了temperature这个参数近期的一个工作。那接下来,就不得不再来讲讲top-p这个参数啦。首先还是上文章,同样是非常新的一个工作,2024年7月1日submit的呢。 文章链接:https://arxi…

NLP任务:情感分析、看图说话

我可不向其他博主那样拖泥带水,我有代码就直接贴在文章里,或者放到gitee供你们参考下载,虽然写的不咋滴,废话少说,上代码。 gitee码云地址: 卢东艺/pytorch_cv_nlp - 码云 - 开源中国 (gitee.com)https:/…

LED显示屏中什么是亮度检测?什么是亮度调节?

在夜幕降临的城市中,一套套璀璨夺目的LED显示屏如同现代生活的万花筒,展示着五彩斑斓的信息世界。从繁华的商业街区到繁忙的交通枢纽,再到家庭影院,LED显示屏以其高亮度、长寿命和灵活性,在数字时代的大潮中迅速崛起&a…

Drv8434s芯片两相步进电机驱动程序+硬件解决方案

一、Drv8434s芯片介绍 PWM 微步进电机驱动器 – 具有 STEP/DIR 引脚的 SPI 接口 – 最高 1/256 的微步进分度器 • 集成电流检测功能 – 无需检测电阻 – 4% 满量程电流精度 • 智能调优、慢速和混合衰减选项 • 工作电源电压范围为 4.5V 至 48V • 低 RDS(ON):24V…

最小二乘算法的解

最小二乘法(Least Squares)是一种用于寻找线性回归模型的最佳拟合直线的标准方法。它通过最小化数据点与拟合直线之间的平方差来找到最佳拟合的线性模型。 线性回归模型 假设我们有一组数据点 (xi,yi),线性回归模型的目标是找到系数 w 和截…

一个很变态但是有用的变现手段:用AI技术搞电商模特图,接单接到手软~

前言 今天带大家拆解一个特别有趣的项目,必须得跟大家分享一下:用AI技术搞电商模特图。 是不是感觉挺科幻的?但这真不是科幻小说里的情节,而是咱们现实生活中已经实现的事情。 想想看,咱们平常在网上看到的那些漂亮…

《数据科学与工程》课程结课报告

目录 作业要求: 一、数据预处理(包括数据扩展、数据过滤、数据加载等) 1.数据查看 2.上传数据 3.查看数据读取情况 4.时间维度的切割 二、单维度数据描述分析 2.1 条数统计 (1)查询数据的总条数 (2)非空查询条数 (3)查询无重复总条数 (4)查询UID唯一的条…

ARM功耗管理之功耗数据与功耗收益评估

安全之安全(security)博客目录导读 思考:功耗数据如何测试?功耗曲线?功耗收益评估? UPF的全称是Unified Power Format,其作用是把功耗设计意图(power intent)传递给EDA工具, 从而帮…

Vue3 使用 Vue Router 时,prams 传参失效和报错问题

Discarded invalid param(s) “id“, “name“, “age“ when navigating 我尝试使用 prams 传递数据 <script setup> import { useRouter } from vue-routerconst router useRouter() const params { id: 1, name: ly, phone: 13246566476, age: 23 } const toDetail…

XSS: 原理 反射型实例[入门]

原理 服务器未对用户输入进行严格校验&#xff0c;使攻击者将恶意的js代码&#xff0c;拼接到前端代码中&#xff0c;从而实现恶意利用 XSS攻击危害 窃取用户Cookie和其他敏感信息&#xff0c;进行会话劫持或身份冒充后台增删改文章进行XSS钓鱼攻击利用XSS漏洞进行网页代码的…

ARM功耗管理之唤醒源与组合唤醒源

安全之安全(security)博客目录导读 思考&#xff1a;什么是睡眠锁&#xff1f;什么是唤醒源&#xff1f;什么是组合唤醒源&#xff1f; DynamIQ系统下的唤醒源 Redistributor中包含了一个GICR_WAKER寄存器&#xff0c;用于记录connected PE的状态是onLine还是offline. 如果让P…

数电基础 - 组合逻辑电路

目录 一. 简介 二. 分析方法 三. 设计方法 四. 常用的逻辑组合电路 五. 冒险现象 六. 消除冒险现象 七. 总结 一. 简介 组合逻辑电路是数字电路中的一种类型&#xff0c;它在任何时刻的输出仅仅取决于当时的输入信号组合&#xff0c;而与电路过去的状态无关。 组合逻辑…

C#实现最短路径算法

创建点集 double r 200 * 500;double width 1920;double height 1080;int col (int)(r / width);int row (int)(r / height);List<(double, double)> list1 new List<(double, double)>();for (int i 0; i < row; i){var y i * height;if (y < r){va…

[web]-图片上传、文件包含-图片上传

题目内容提示&#xff1a;上传图片试试吧&#xff0c;注意统一时区问题 打开页面如图&#xff0c;源码没有过滤&#xff0c;随便输入&#xff0c;进入上传目录 根据链接可以看到是文件包含&#xff0c;可以利用编码读取源码&#xff0c;这里只列出有用页面的编码&#xff08;?…

数据结构:链表详解 (c++实现)

前言 对于数据结构的线性表&#xff0c;其元素在逻辑结构上都是序列关系&#xff0c;即数据元素之间有前驱和后继关系。 但在物理结构上有两种存储方式&#xff1a; 顺序存储结构&#xff1a; 使用此结构的线性表也叫 顺序表物理存储上是连续的&#xff0c;因此可以随机访问…

Redis 中Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

Sorted Set 类型 文章目录 Sorted Set 类型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

秋招Java后端开发冲刺——Mybatis使用总结

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目&#xff0c;它封装了 JDBC&#xff0c;使开发者只需要关注 SQL 语句本身&#xff0c;而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO&#xff08;Plain …

服务器数据恢复—2块硬盘离线且热备盘未完全激活的raid5数据恢复案例

服务器存储数据恢复环境&#xff1a; 北京某企业一台EMC FCAX-4存储上搭建一组由12块成员盘的raid5磁盘阵列&#xff0c;其中包括2块热备盘。 服务器存储故障&#xff1a; raid5阵列中两块硬盘离线&#xff0c;热备盘只有一块成功激活&#xff0c;raid瘫痪&#xff0c;上层LUN…

Sentinel限流算法:滑动时间窗算法、漏桶算法、令牌桶算法。拦截器定义资源实现原理

文章目录 滑动时间窗算法基本知识源码算法分析 漏桶算法令牌桶算法拦截器处理web请求 滑动时间窗算法 基本知识 限流算法最简单的实现就是使用一个计数器法。比如对于A接口来说&#xff0c;我要求一分钟之内访问量不能超过100&#xff0c;那么我们就可以这样来实现&#xff1…

学习C++,应该循序渐进的看哪些书?

学习C是一个循序渐进的过程&#xff0c;需要根据自己的基础和目标来选择合适的书籍。以下是一个推荐的学习路径&#xff0c;包含了从入门到进阶的书籍&#xff1a; 1. 入门阶段 《C Primer Plus 第6版 中文版》 推荐理由&#xff1a;这本书同样适合C零基础的学习者&#xff0…