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.rhkb.cn/news/263720.html

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

相关文章

C++多线程同步(上)

多线程同步 引言总述详情互斥锁示例运行结果分析条件变量示例一实现分析优化运行结果示例二实现代码运行结果示例三实现代码运行结果读写锁示例实现代码注意分析运行结果附言实现运行结果运行结果个人心得引言 项目中使用多线程,会遇到两种问题,一种是对共享资源的访问时需要…

《高效使用Redis》- 由面试题“Redis是否为单线程”引发的思考

由面试题“Redis是否为单线程”引发的思考 很多人都遇到过这么一道面试题:Redis是单线程还是多线程?这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程,说复杂是因为这个答案其实并不准确。 难道Redis不是单线程&#xff1f…

redis哨兵机制

目录 前言 1.基本概念 2.安装部署(基于docker) 3.重新选举 4.选举原理 5.总结 前言 Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一…

MATLAB:数组与矩阵

2.1 数组运算 数组运算时MATLAB计算的基础。由于MATLAB面向对象的特性,这种数值数组称为MATLAN最重要的一种内建数据类型,而数组运算就是定义这种数据结果的方法。 2.1.1 数组的创建和操作 在MATLAB中一般使用方括号“[]”、逗号“,”、空格和分号“;…

详解 CSS 选择器

详解 CSS 选择器 选择器的功能 选中页面中指定的标签元素。 要先选中元素,才能设置元素的属性,就好比策略类指挥游戏,比如海岛奇兵这类的, 需要先选中单位, 再指挥该单位行动。 CSS 选择器的种类 注:以下介绍的选择器只是CSS2标…

Redis分布式锁的正确使用姿势

前言 分布式锁在日常开发中,用处非常的多。包括但不限于抢红包,秒杀,支付下单,幂等,等等场景。 分布式锁的实现方式有多种,包括redis实现,mysql实现,zookeeper实现等等。而其中redis…

【生活】浅浅记录

各位小伙伴们好鸭,今天不是技术文章,浅浅记录一下最近几个月的收获😊 新的一年,一起努力,加油加油!

解决IDEA搜不到插件

File -> Settings -> Plugins https://plugins.jetbrains.com/ 完成以上操作即可搜到插件

R cox回归 ggDCA报错

临床预测模型的决策曲线分析(DCA):基于ggDCA包 决策曲线分析法(decision curve analysis,DCA)是一种评估临床预测模型、诊断试验和分子标记物的简单方法。 我们在传统的诊断试验指标如:敏感性&a…

OpenGL ES (OpenGL) Compute Shader 计算着色器是怎么用的?

OpenGL ES (OpenGL) Compute Shader 是怎么用的? Compute Shader 是 OpenGL ES(以及 OpenGL )中的一种 Shader 程序类型,用于在GPU上执行通用计算任务。与传统的顶点着色器和片段着色器不同,Compute Shader 被设计用于在 GPU 上执行各种通用计算任务,而不是仅仅处理图形…

压缩感知常用的测量矩阵

测量矩阵的基本概念 在压缩感知(Compressed Sensing,CS)理论中,测量矩阵(也称为采样矩阵)是实现信号压缩采样的关键工具。它是一个通常为非方阵的矩阵,用于将信号从高维空间映射到低维空间&…

二蛋赠书十六期:《高效使用Redis:一书学透数据存储与高可用集群》

很多人都遇到过这么一道面试题:Redis是单线程还是多线程?这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程,说复杂是因为这个答案其实并不准确。 难道Redis不是单线程?我们启动一个Redis实例,验证一…

深度学习系列59:文字识别

1. 简单文本: 使用google加的tesseract,效果不错。 首先安装tesseract,在mac直接brew install即可。 python调用代码: import pytesseract from PIL import Image img Image.open(1.png) pytesseract.image_to_string(img, lan…

【算法与数据结构】1971、LeetCode寻找图中是否存在路径

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题应用并查集的理论直接就可以解决:【算法与数据结构】回溯算法、贪心算法、动态规划、图…

相机图像质量研究(35)常见问题总结:图像处理对成像的影响--运动噪声

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

Oracle迁移到mysql-表结构的坑

1.mysql中id自增字段必须是整数类型 id BIGINT AUTO_INCREMENT not null, 2.VARCHAR2改为VARCHAR 3.NUMBER(16)改为decimal(16,0) 4.date改为datetime 5.mysql范围分区必须int格式,不能list类型 ERROR 1697 (HY000): VALUES value for partition …

为什么在MOS管开关电路设计中使用三极管容易烧坏?

MOS管作为一种常用的开关元件,具有低导通电阻、高开关速度和低功耗等优点,因此在许多电子设备中广泛应用。然而,在一些特殊情况下,我们需要在MOS管控制电路中加入三极管来实现一些特殊功能。然而,不同于MOS管&#xff…

redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案

缓存穿透 问题原因 解决方案 缓存并发 缓存雪崩 缓存失效时间设置一致导致的。 解决方案: 1)方案一 2)方案二 如何设计一个缓存策略,缓存热点数据?

网卡本质,网络发展(局域网,广域网概念)

目录 引入 网卡的本质 网络的发展 引入 早期 局域网LAN(Local Area Network) 广域网WAN(Wide Area Network) 注意 引入 前面我们已经学习了很多关于linux系统的知识,其中文件系统和线程尤为繁杂 而网络其实也算系统的一部…

C/C++暴力/枚举/穷举题目持续更新(刷蓝桥杯基础题的进!)

目录 前言 一、百钱买百鸡 二、百元兑钞 三、门牌号码(蓝桥杯真题) 四、相乘(蓝桥杯真题) 五、卡片拼数字(蓝桥杯真题) 六、货物摆放(蓝桥杯真题) 七、最短路径(蓝…