LangChain Agent v0.2.0简明教程 (上)

快速入门指南 – LangChain中文网
langchain源码剖析系列课程
九天玩转Langchain!

    • 1. LangChain是什么
    • 2. LangChain Expression Language (LCEL)
        • Runnable 接口
    • 3. Model I/O
        • 3.1 Prompt Templates
        • 3.2 Language Model
        • 3.3 Output Parsers
    • Use case(Q&A with RAG)

1. LangChain是什么

LangChain是一个基于LLM开发应用程序的框架,把调用LLM的过程组成一条链的形式,具体要执行哪些函数是由LLM的推理结果决定的。(区别于传统程序是写死的)同时LangChain也是一个丰富的工具生态系统的一部分,我们可以在此框架集成并在其之上构建自己的Agent。

在这里插入图片描述

LangChain的模块组成Model I/O(与语言模型进行接口)、Retriever(与特定于应用程序的数据进行接口)、Memory(在Pipeline运行期间保持记忆状态)、Chain(构建调用序列链条)、Agent(让管道根据高级指令选择使用哪些工具)、Callback(记录和流式传输任何管道的中间步骤)
在这里插入图片描述

在这里插入图片描述

快速安装:

pip install langchain

2. LangChain Expression Language (LCEL)

LangChain应用程序的核心构建模块是LLMChain。它结合了三个方面:

  • LLM: 语言模型是核心推理引擎。要使用LangChain,您需要了解不同类型的语言模型以及如何使用它们。
  • Prompt Templates: 提供语言模型的指令。这控制了语言模型的输出,因此了解如何构建提示和不同的提示策略至关重要。
  • Output Parsers: 将LLM的原始响应转换为更易处理的格式,使得在下游使用输出变得容易。

每个Langchain组件都是LCEL对象,我们可以使用LangChain 表达式语句(LCEL)轻松的将各个组件链接在一起,如下实现prompt + model + output parser的chain = prompt | llm | output_parser,其中| 符号可以实现将数据从一个组件提供的输出,输入到下一个组件中:

from langchain_community.llms import vllm   # this LLM class can be everyone
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParserprompt = ChatPromptTemplate.from_messages([("system", "You are world class technical documentation writer."),("user", "{input}")
])llm = vllm.VLLM(model="/data1/huggingface/LLM/Mistral-7B-Instruct-v0.2")output_parser = StrOutputParser()chain = prompt | llm | output_parserprint(chain.invoke({"input": "how can langsmith help with testing?"}))

接下来仔细看一些下着三个组件:

prompt是一个 BasePromptTemplate,这意味着它接受模板变量的字典并生成 PromptValuePromptValue是完整提示的包装器,可以传递给 LLM (将字符串作为输入)或ChatModel(将一系列消息作为输入)。它可以与任何一种语言模型类型一起使用,因为它定义了生成BaseMessages 和生成字符串的逻辑。

prompt_value = prompt.invoke({"input": "how can langsmith help with testing?"})

打印出来可以看到,prompt_value 是一个ChatPromptValue对象,里面的message是一个list,包含不同角色message的对话信息

ChatPromptValue(messages=[SystemMessage(content='You are world class technical documentation writer.'), HumanMessage(content='how can langsmith help with testing?')])

如果model为 ChatModel,这意味着它将输出 a BaseMessage。而如果我们的model是 LLM,它将输出一个字符串

最后,我们将model输出传递给output_parser,这意味着 BaseOutputParser它需要字符串或 BaseMessage 作为输入。StrOutputParser是将任何输入转换为字符串。

LCEL 可以轻松地从基本组件构建复杂的链条。它通过提供以下功能来实现此目的: 每个 LCEL 对象都实现该Runnable接口,该接口定义了一组通用的调用方法invokebatchstreamainvoke、 …)。这使得 LCEL 对象链也可以自动支持这些调用,大大简化了调用方式。也就是说,每个 LCEL 对象的chain 本身就是一个 LCEL 对象。

而且每个组件都内置了与 LangSmith 的集成。如果我们设置以下两个环境变量,所有链跟踪都会记录到 LangSmith。

import os
os.environ["LANGCHAIN_API_KEY"] = "..."
os.environ["LANGCHAIN_TRACING_V2"] = "true"
Runnable 接口

标准接口包括:
stream:流回响应块(流式调用)
invoke:在输入上调用链(单次调用)
batch:在输入列表上调用链(批调用)
这些也有相应的异步方法:
astream:异步流回响应块
ainvoke:在输入异步上调用链
abatch:在输入列表上调用异步链
astream_log:除了最终响应之外,还实时流回发生的中间步骤
astream_events:链中发生的betalangchain-core流事件( 0.1.14 中引入)

各种组件的输入输出格式:
在这里插入图片描述

3. Model I/O

首先我们从最基本面的部分讲起,Model I/O 指的是和LLM直接进行交互的过程。

在这里插入图片描述
在langchain的Model I/O这一流程中,LangChain抽象的组件主要有三个:

  • Language models: 语言模型是核心推理引擎。要使用LangChain,您需要了解不同类型的语言模型以及如何使用它们。
  • Prompt Templates: 提供语言模型的指令。这控制了语言模型的输出,因此了解如何构建提示和不同的提示策略至关重要。
  • Output Parsers: 将LLM的原始响应转换为更易处理的格式,使得在下游使用输出变得容易。

下面我们展开介绍一下.

3.1 Prompt Templates

Prompt指用户的一系列指令和输入,是决定Language Model输出内容的唯一输入,主要用于帮助模型理解上下文,并生成相关和连贯的输出,如回答问题、拓写句子和总结问题。在LangChain中的相关组件主要有Prompt TemplateExample selectors,以及后面会提到的辅助/补充Prompt的一些其它组件

  • Prompt Template: 预定义的一系列指令输入参数的prompt模版(默认使用str.fromat格式化),支持更加灵活的输入,如支持output instruction(输出格式指令), partial input(提前指定部分输入参数), examples(输入输出示例)等;LangChain提供了大量方法来创建Prompt Template,有了这一层组件就可以在不同Language Model和不同Chain下大量复用Prompt Template了,Prompt Template中也会有下面将提到的Example selectors, Output Parser的参与
  • Example selectors: 在很多场景下,单纯的instruction + input的prompt不足以让LLM完成高质量的推理回答,这时候我们就还需要为prompt补充一些针对具体问题的示例(in-context learning),LangChain将这一功能抽象为了Example selectors这一组件,我们可以基于关键字,相似度(通常使用MMR/cosine similarity/ngram来计算相似度, 在后面的向量数据库章节中会提到)。为了让最终的prompt不超过Language Model的token上限(各个模型的token上限见下表),LangChain还提供了LengthBasedExampleSelector,根据长度来限制example数量,对于较长的输入,它会选择包含较

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

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

相关文章

【踩坑】PyTorch中指定GPU不生效和GPU编号不一致问题

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 指定GPU不生效问题 解释:就是使用os.environ["CUDA_VISIBLE_DEVICES"] "1"后,后面使用起来仍然是cuda0. 解决:在最开头就使用 import os os.environ[&…

sentinel整合nacos在gateway中实现限流

sentinel整合nacos在gateway中实现限流 一、应用层面完成网关整合nacos和sentinel实现限流 前沿 启动nacos与sentinel的jar的启动,这里不细讲 sentinel官网 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 sentinel 下载地址 https://github.com/…

车载电子电器架构 —— 电气架构开发计划

车载电子电器架构 —— 电气架构开发计划 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

实现KingSCADA系统按钮弹窗出现位置随点击位置变化。

哈喽,你好啊,我是雷工! 在用KingSCADA做项目时,当我们点击不同的控制按钮,都可以弹出对应的控制弹窗。 在常规不做设置的情况下弹窗都是出现在固定的位置,要么一直出现在左上角,要么一直出现在…

【Java】常用实用类及java集合框架(实验六)

目录 一、实验目的 二、实验内容 三、实验小结 3.1 常用实用类 3.2 Java集合框架 一、实验目的 1、掌握java常用类的方法 2、掌握String类与数值类型数据的相互转化 3、掌握正则表达式的应用 4、掌握常用集合的创建和操作方法 二、实验内容 1、菜单的内容如下&#x…

南邮概率统计与随机过程练习册答案

**南京邮电大学** **概率统计与随机过程练习册答案简介** 本文档是一份精心整理的南京邮电大学概率统计与随机过程课程的练习册答案集。它旨在为学习该课程的学生提供一个详尽的解题参考,帮助他们更好地理解和掌握概率论与统计学的基本概念和方法。 **内容概览:** - **章节…

抖音视频评论数据提取软件|抖音数据抓取工具

一、开发背景: 在业务需求中,我们经常需要下载抖音视频。然而,在网上找到的视频通常只能通过逐个复制链接的方式进行抓取和下载,这种操作非常耗时。我们希望能够通过关键词自动批量抓取并选择性地下载抖音视频。因此,为…

git 拉取远程分支到本地

背景: 我的 github 上的远程仓库上除了 main 分支外还提交了好几个别的分支,现在我换机器了,git clone 原仓库后只剩 main 分支,我要把其他分支拉下来到本地。 1. 查看所有远程remote分支 git branch -r 比如我这里&#xff1…

深入浅出:探究过完备字典矩阵

在数学和信号处理的世界里,我们总是在寻找表达数据的最佳方式。在这篇博文中,我们将探讨一种特殊的矩阵——过完备字典矩阵,这是线性代数和信号处理中一个非常有趣且实用的概念。 什么是过完备字典矩阵? 首先,我们先…

认识K8S

K8S K8S 的全称为 Kubernetes (K12345678S) 是一个跨主机容器编排工具 作用 用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群…

unity学习(40)——创建(create)角色脚本(panel)——UI

1.点击不同的头像按钮,分别选择职业1和职业2,create脚本中对应的函数。 2.调取inputfield中所输入的角色名(限制用户名长度为7字符),但愿逆向的服务器可以查重名: 3.点击头衔,显示选择的职业&a…

SpringBootWeb请求响应

SpringBootWeb请求响应 这里写目录标题 SpringBootWeb请求响应前言1. 请求1.1 Postman1.1.1 介绍1.1.2 安装 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 …

前端解析后端返回文件流格式数据

当后端接口返回数据是一个文件流数据时,如下后端返回给我的是一个pdf文件流数据 methods: {gotoPri() {protocolApi().then(res > {this.createPdf(res.data,XXX协议)})},createPdf(res, name) {// Blob构造函数返回一个新的 Blob 对象并指定type类型。let blob …

js设计模式:外观模式

作用: 将复杂的功能封装成可以简单调用的方法,无需知道内部的具体逻辑,只需要知道怎么去使用 类似于一把枪,你可以不知道内部的枪机,击发机,复进簧,枪管,导气装置,弹夹是怎么合作配合完成发射和自动填弹,你只需要知道你扣动扳机就能完成这一系列复杂的操作,而那个扳机就是外观…

k8s学习笔记-基础概念

(作者:陈玓玏) deployment特别的地方在于replica和selector,docker根据镜像起容器,pod控制容器,job、cronjob、deployment控制pod,job做离线任务,pod大多一次性的,cronj…

pstree命令

pstree 是一个在类 Unix 系统中广泛使用的命令行工具,主要用于以树状结构可视化当前系统中进程之间的关系。这个命令显示的是进程间的父子关系,从一个初始进程(通常是 init 或 systemd)开始,逐级展示每个进程及其子进程…

【大数据】Flink 内存管理(三):TaskManager 内存分配(理论篇)

Flink 内存管理(三):TaskManager 内存分配 1.配置 Total Memory2.配置 Heap and Managed Memory2.1 Task (Operator) Heap Memory2.2 Managed Memory 3.配置 Off-Heap Memory(Direct or Native)4.详细内存模型5.Framew…

广联达Linkworks GetAllData 信息泄露漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

!!!Python虚拟环境改名后的坑!!!!

搞了一晚上终于弄好这python虚拟环境的问题了!真的是坑啊! 本来用的纯python环境下的虚拟环境,一时心血来潮,把电脑重新装了一遍,虚拟环境的目录也改了一下,结果虚拟环境再vscode中是可以使用,…

0基础JAVA期末复习最终版

啊啊啊啊啊啊啊啊啊啊,根据网上各位大佬的复习资料,看了很多大多讲的是基础但对内容的整体把握上缺乏系统了解。但是很不幸最终挂科了,那个出题套路属实把我整神了,所以我决定痛改前非,酣畅淋漓的写下这篇文章。。。。…