【LangChain系列1】【LangChain表达式 (LCEL)】

news2024/12/24 8:27:45

目录

  • 前言
  • 一、LangChain
    • 1-1、介绍
    • 1-2、LangChain抽象出来的核心模块
    • 1-3、特点
    • 1-4、langchain解决的一些行业痛点
    • 1-5、安装
  • 二、LangChain表达式——LCEL
    • 2-1、LCEL介绍
    • 2-2、基本示例:提示 + 模型 + 输出解析器
    • 2-3、接口
  • 附录、ZhiPuAI API
    • 0、安装
    • 1、设置API密钥
    • 2、基本用法
    • 3、流式输出
    • 4、异步调用
  • 总结


前言

LangChain给自身的定位是:用于开发由大语言模型支持的应用程序的框架。它的做法是:通过提供标准化且丰富的模块抽象,构建大语言模型的输入输入规范,利用其核心概念chains,灵活地连接整个应用开发流程。 这里是LangChain系列的第一篇,主要介绍LangChain表达式 (LCEL)。

一、LangChain

1-1、介绍

LangChain是一个框架,用于开发由大型语言模型(LLM)驱动的应用程序。

LangChain 简化了 LLM 应用程序生命周期的每个阶段:

  • 开发:使用LangChain的开源构建块和组件构建应用程序。使用第三方集成和模板开始运行。
  • 生产化:使用 LangSmith 检查、监控和评估您的链条,以便您可以自信地持续优化和部署。
  • 部署:使用 LangServe 将任何链转换为 API。

总结: LangChain是一个用于开发由LLM支持的应用程序的框架,通过提供标准化且丰富的模块抽象,构建LLM的输入输出规范,主要是利用其核心概念chains,可以灵活地链接整个应用开发流程。(即,其中的每个模块抽象,都是源于对大模型的深入理解和实践经验,由许多开发者提供出来的标准化流程和解决方案的抽象,再通过灵活的模块化组合,才得到了langchain)

在这里插入图片描述

1-2、LangChain抽象出来的核心模块

想象一下,如果要组织一个AI应用,开发者一般需要?

  • 提示词模板的构建,不仅仅只包含用户输入!
  • 模型调用与返回,参数设置,返回内容的格式化输出。
  • 知识库查询,这里会包含文档加载,切割,以及转化为词嵌入(Embedding)向量。
  • 其他第三方工具调用,一般包含天气查询、Google搜索、一些自定义的接口能力调用。
  • 记忆获取,每一个对话都有上下文,在开启对话之前总得获取到之前的上下文吧?

由上边的内容,引出LangChain抽象的一些核心模块:

LangChain通过模块化的方式去高级抽象LLM在不同场景下的能力,其中LangChain抽象出的最重要的核心模块如下:

  • Model I/O :标准化各个大模型的输入和输出,包含输入模版,模型本身和格式化输出;
  • Retrieval :检索外部数据,然后在执行生成步骤时将其传递到 LLM,包括文档加载、切割、Embedding等;
  • Chains :链条,LangChain框架中最重要的模块,链接多个模块协同构建应用,是实际运作很多功能的高级抽象;
  • Memory : 记忆模块,以各种方式构建历史信息,维护有关实体及其关系的信息;
  • Agents : 目前最热门的Agents开发实践,未来能够真正实现通用人工智能的落地方案;
  • Callbacks :回调系统,允许连接到 LLM 应用程序的各个阶段。用于日志记录、监控、流传输和其他任务;

1-3、特点

LangChain的特点如下:

  • 大语言模型(llm): LangChain为自然语言处理提供了不同类型的模型,这些模型可用于处理非结构化文本数据,并且可以基于用户的查询检索信息

  • PromptTemplates: 这个特征使开发人员能够使用多个组件为他们的模型构造输入提示。在查询时,开发人员可以使用PromptTemplates为用户查询构造提示模板,之后模板会传递到大模型进行进一步的处理。

  • :在LangChain中,链是一系列模型,它们被连接在一起以完成一个特定的目标。聊天机器人应用程序的链实例可能涉及使用LLM来理解用户输入,使用内存组件来存储过去的交互,以及使用决策组件来创建相关响应。

  • agent: LangChain中的agent与用户输入进行交互,并使用不同的模型进行处理。Agent决定采取何种行动以及以何种顺序来执行行动。例如,CSV Agent可用于从CSV文件加载数据并执行查询,而Pandas Agent可用于从Pandas数据帧加载数据并处理用户查询。可以将代理链接在一起以构建更复杂的应用程序。

在这里插入图片描述

1-4、langchain解决的一些行业痛点

在使用大模型的过程中,一些行业痛点:

  • 大模型的使用规范以及基于大模型的开发范式不尽相同,当使用一个新模型时,我们往往需要学习新的模型规范。
  • 大模型知识更新的滞后性
  • 大模型的外部API调用能力
  • 大模型输出的不稳定问题,如何稳定输出?
  • 大模型与私有化数据的连接方式?

1-5、安装

pip install langchain

二、LangChain表达式——LCEL

2-1、LCEL介绍

LangChain 表达式语言(LCEL)是一种声明式的方法,用于轻松组合多个组件来构建复杂的处理链条。LCEL 设计之初就支持将原型直接投入生产环境,无需更改代码,适用于从简单的“提示+模型”链条到复杂的、包含数百个步骤的链条。

LCEL 的核心特点包括:

  • 流式支持:使用 LCEL 构建的链条可以获得最佳的首个令牌时间,即输出的第一块内容出现之前的经过时间。对于某些链条,这意味着可以直接从 LLM 流式传输到流式输出解析器,以与 LLM 提供商输出原始令牌相同的速率获得解析后的增量输出块。

  • 异步支持:任何用 LCEL 构建的链条都可以通过同步 API(如在 Jupyter 笔记本中原型设计时)以及异步 API(如在 LangServe 服务器中)调用。

  • 优化的并行执行:当 LCEL 链条中有可以并行执行的步骤时(例如,从多个检索器中获取文档),LCEL 会自动执行,以最小化延迟。

  • 重试和备选方案:可以为 LCEL 链条的任何部分配置重试和备选方案,以增强链条在大规模生产中的可靠性。
    访问中间结果:对于复杂的链条,能够在最终输出产生之前访问中间步骤的结果非常有用,这可以用来通知最终用户或调试链条。

  • 输入和输出模式:输入和输出模式为每个 LCEL 链条提供了从链条结构中推断出来的 Pydantic 和 JSONSchema 模式,用于输入和输出的验证。

  • 无缝 LangSmith 跟踪集成:所有步骤都会自动记录到 LangSmith,以实现最大的可观察性和可调试性。

  • 无缝 LangServe 部署集成:使用 LCEL 创建的任何链条都可以轻松地使用 LangServe 部署。
    LCEL 的基本使用示例包括提示(Prompt)+ 模型(Model)+ 输出解析器(OutputParser)。

2-2、基本示例:提示 + 模型 + 输出解析器

基础Demo: 将提示模板和模型链接在一起。使用LCEL将不同的组件组合成一个单一的链条:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatZhipuAI

# 定义 Prompt
prompt = ChatPromptTemplate.from_template("讲一个有关于 {topic} 的笑话")

# 初始化智谱AI的模型实例
# 请替换"your_api_key"为你的智谱AI API密钥
# 智谱AI的模型名称根据实际情况填写,例如 "glm-4"
model = ChatZhipuAI(
    model="glm-4",
    temperature=0.5,
    api_key=""
)

# 定义 Output Parser
output_parser = StrOutputParser()

# 使用 LCEL 组合链
chain = prompt | model | output_parser

# 调用链,传递参数
result = chain.invoke({"topic": "冰激凌"})

# 打印结果
print(result)

输出:
在这里插入图片描述

chain = prompt | model | output_parser

  • Prompt: Prompt 是一个 BasePromptTemplate,这意味着它接受一个模板变量的字典并生成一个 PromptValue。PromptValue 是一个包装完成的提示的包装器,可以传递给 LLM(它以字符串作为输入)或 ChatModel(它以消息序列作为输入)。
  • Model: 然后将 PromptValue 传递给 model。在这种情况下,我们的 model 是一个 ChatModel,这意味着它将输出一个 BaseMessage。
  • OutputParser: 最后,我们将 model 的输出传递给 output_parser,它是一个 BaseOutputParser,意味着它可以接受字符串或 BaseMessage 作为输入。StrOutputParser 简单地将任何输入转换为字符串。(它是一个简单的解析器,从AIMessageChunk中提取content字段)

| 符号类似于 unix 管道操作符,它将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入。在这个链条中,用户输入被传递给提示模板,然后提示模板的输出被传递给模型,然后模型的输出被传递给输出解析器。

2-3、接口

LCEL 通过提供以下功能,使得从基本组件构建复杂链变得容易。它通过提供以下方式实现:

  • 统一的接口:每个 LCEL 对象都实现了 Runnable 接口,该接口定义了一组公共的调用方法(invoke、batch、stream、ainvoke,等等)。这使得 LCEL 对象链也自动支持这些调用成为可能。也就是说,每个 LCEL 对象链本身也是一个 LCEL 对象。
  • 组合原语:LCEL 提供了一些原语,使得容易组合链,并行化组件,添加回退,动态配置链内部等等。

为了尽可能简化创建自定义链的过程,我们实现了一个 “Runnable” 协议。Runnable 协议已为大多数组件实现。 这是一个标准接口,可以轻松定义自定义链并以标准方式调用它们。 标准接口包括:

  • stream: 流式返回响应的块
  • invoke: 在输入上调用链
  • batch: 在输入列表上调用链

这些方法也有对应的异步方法:

  • astream: 异步流式返回响应的块
  • ainvoke: 异步在输入上调用链
  • abatch: 异步在输入列表上调用链
  • astream_log: 异步流式返回中间步骤,以及最终响应
  • astream_events: beta 异步流式返回链中发生的事件(在 langchain-core 0.1.14 中引入)

示例:

# 调用链
chain.invoke({"topic": "bears"})

# 异步调用
await chain.ainvoke({"topic": "bears"})

# 批量调用
chain.batch([{"topic": "bears"}, {"topic": "cats"}])

# 异步调用
await chain.abatch([{"topic": "bears"}])

# 流式输出
for s in chain.stream({"topic": "bears"}):
    print(s.content, end="", flush=True)

# 异步的流式输出
async for s in chain.astream({"topic": "bears"}):
    print(s, end="", flush=True)

不同组件的输入类型和输出类型如下:
在这里插入图片描述
所有可运行对象都公开输入和输出的模式以检查输入和输出:

  • input_schema: 从 Runnable 的结构动态生成的输入 Pydantic 模型
  • output_schema: 从 Runnable 的结构动态生成的输出 Pydantic 模型

如下图为2-2获取可运行对象,输入或者是输出产生的描述。(JSONSchema 表示)

在这里插入图片描述

附录、ZhiPuAI API

0、安装

pip install zhipu-ai

1、设置API密钥

import os
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser

os.environ["ZHIPUAI_API_KEY"] = "zhipuai_api_key"

2、基本用法

chat = ChatZhipuAI(
    model="glm-4",
    temperature=0.5,
)

messages = [
    AIMessage(content="Hi."),
    SystemMessage(content="Your role is a poet."),
    HumanMessage(content="Write a short poem about AI in four lines."),
]

response = chat.invoke(messages)
print(response.content)  # Displays the AI-generated poem

3、流式输出

from langchain_core.callbacks.manager import CallbackManager
from langchain_core.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

streaming_chat = ChatZhipuAI(
    model="glm-4",
    temperature=0.5,
    streaming=True,
    callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),
)
streaming_chat(messages)

输出如下所示:
在这里插入图片描述

4、异步调用

async_chat = ChatZhipuAI(
    model="glm-4",
    temperature=0.5,
)

response = await async_chat.agenerate([messages])
print(response)

参考文章:

langchain_community.utilities.sql_database.SQLDatabase
LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发
LangChain官网
Rebuff: 防止提示词注入检测器

未完成:
Build a Question/Answering system over SQL data
langchain101 AI应用开发指南

总结

不错,今天领到了大礼包。🎁

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

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

相关文章

无法获得下列许可 SolidWorks standard。无法连接到服务器(-15,10,10061)

太久没启动SolidWorks,今天想打开,结果给我报错,如下图所示: 看网上说是开机启动项被杀毒软件给关了,于是打开360,看了一下,果然: 还有好几个和SolidWorks相关的项目,这里…

WebRTC音频 04 - 关键类

WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架 WebRTC音频 04 - 关键类(本文) 一、前言: 在WebRTC音频代码阅读过程中,我们发现有很多关键的类比较抽象,搞不清楚会导致代码阅读一脸懵逼。比如…

吴恩达深度学习笔记(5)

调试处理(随机采样、非格网、由粗到细)及超参数 深度学习中涉及大量超参数,如下所示 在不知道哪个参数更为重要的情况下,机器学习参数较少,可以利用网络化的参数取值试验,但是深度学习参数较多的情况下&am…

通过华为鲲鹏认证的软件产品如何助力信创产业

软件通过华为鲲鹏认证与信创产业有着密切的联系。鲲鹏认证是华为推动信创产业发展的一项重要举措,通过该认证,软件可以在华为的生态系统中实现更好的兼容性和性能优化,从而推动信创产业的全面发展和国产化替代。 鲲鹏认证的定义和重要性 鲲鹏…

POMO:强化学习的多个最优策略优化(2020)(完)

文章目录 Abstract1 Introduction2 Related work3 Motivation4 多最优策略优化(POMO)4.1 从多个起始节点进行探索4.2 策略梯度的共享基线4.3 用于推理的多个贪婪轨迹5 Experiments5.1 Traveling salesman problem5.2 带容量限制得车辆路径问题5.3 0-1背包问题6 ConclusionAbs…

【黑马redis基础篇】介绍和数据类型

1.NoSQL //来源:02 NoSQL类型:键值、文档、图 NoSQL特点:非结构化的、无关联的、非SQL、BASE(无法满足事务ACID) 2.认识Redis //来源03 基于内存的键值型NoSQL数据库。全称远程词典服务器。 2.1特征 (1)键值型&a…

免费分享1885页Python电子书,耗时200小时整理!!!

python学习方向建议: 如果你是本科及以下学历,建议你学习以下两个方向 1、爬虫。简单的爬虫库,代理爬虫,分布式爬虫等 2、Web。学习主流Web框架,轻量级的Flask。重量级的Django等 3、自动化测试 如果你是本科以上学…

Ascend C算子编程和C++基础 Lesson5-2 算子性能优化方法2

一、层次化访问优化 1、Buffer访问优化 2、Shape对齐亲和计算,shape尽量采用32B对齐的shape 3、Buffer资源分配 二、计算资源利用优化

数据源对接,这个工具能满足你

在数字化时代,数据已成为企业决策和业务优化的关键。而数据源对接则是获取高质量、全面数据的重要途径。数据源对接能够将各种来源的数据进行标准化处理,统一接入并进行整合分析,为企业提供更加准确、可靠的数据支持。其重要性不言而喻。 一…

Scopus数据库更新,新增3本期刊剔除!(附excel下载)

Scopus官网近日更新了2024年10月期刊目录,此次更新有3本期刊被剔除(Discontinued Titles Sep. 2024),请注意避雷投稿!此外本次新增38本期刊被Scopus数据库收录(Accepted Titles Sep. 2024) 关于…

有手就会,在线sd一键体验创作气球文字

使用在线sd制作气球文字,很好闻很有趣的制作体验,快来试试吧 1.打开网站 电脑传送门👉上河AI(pc端) 手机传送门👉上河AI(移动端) 上河AI绘图最近还有限时优惠活动,从…

No.16 笔记 | SSRF(服务器端请求伪造)基础

一、SSRF基础知识 1.1 什么是SSRF? 🔍 SSRF是"Server-Side Request Forgery"的缩写,中文意思是"服务器端请求伪造"。 🎭 简单来说:攻击者让服务器去访问它不应该访问的地方。 1.2 SSRF的基本模…

程序负载优化,持续更新,建议收藏!

1.前言 对一个程序来说,内存和负载是两个重点指标。特别是对嵌入式程序来说,本身单片机的主频小,内存少,这就要求 开发工作者必须考虑如何在有限的内存和负载下开展工作。本文主要侧重负载优化。首先介绍负载的概念,其…

uniapp 微信公众号H5/app/小程序跳转小程序

1.微信公众号H5跳转小程序使用微信标签wx-open-launch-weapp a.在init.vue使用标签&#xff08;要实现跳转的页面&#xff09;<wx-open-launch-weappid"launch-btn"style"width: 100%; display: block":appid"pageParam.appId":path"pa…

机器学习中的回归分析:理论与实践

引言 回归分析是统计学和机器学习中广泛使用的技术&#xff0c;主要用于建立因变量与自变量之间的关系模型。在实际应用中&#xff0c;回归分析不仅可以帮助我们理解数据&#xff0c;还能进行有效的预测。本文将深入探讨回归分析的基本概念、常用的回归算法、应用场景&#xf…

【算法题解】二分查找的经典问题解析

文章目录 什么是二分&#xff1f;关于二分的一些题目1.分巧克力解题思路编写代码 2.数组中数值和下标相等的元素3.0到n-1中缺失的数字4.数列分段 II解题思路编写代码 总结 什么是二分&#xff1f; 二分是一种思想&#xff0c;用于有序数组中快速查找目标元素。 用动图展示一下…

如何实现前端低代码?

昨天收到在后台收到一封朋友的私信。内容如下&#xff1a; 你好&#xff0c;我关注你很久了&#xff0c;看你经常在发低代码的内容&#xff0c;内容也很好&#xff0c;所以想跟您请教一下。 最近练手在写一个低代码项目&#xff0c;实现前后端可视化应用搭建 后端采用c#&#x…

过期大米被重新销往乡村学校?论EasyCVR平台如何构建校园食品卫生安全视频监管方案

近期&#xff0c;重庆市市场监管局发布的一则通报引起了社会广泛关注。通报指出&#xff0c;酉阳县某公司存在将过期大米重新包装并销往乡村学校的行为&#xff0c;这一事件再次将校园食品卫生安全问题推向了风口浪尖。 面对这样的食品安全隐患&#xff0c;如何加强监管、确保…

【linux问题】Linux命令行终端窗口的输出,显示不全问题

Linux命令行终端窗口的输出&#xff0c;显示不全问题 问题&#xff1a; 图中显示的是一个Linux命令行终端窗口&#xff0c; nmcli dev wifi 是一个命令——列出所有能用的Wi-Fi。 执行命令后&#xff0c;窗口输出了显示了所有能用的Wi-Fi网络列表。 但是在每一行末尾有一个“…

使用API有效率地管理Dynadot域名,删除域名服务器(Name Server)

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…