了解 Langchain️是个啥?:第 1 部分
一、说明
在日常生活中,我们主要致力于构建端到端的应用程序。我们可以使用许多自动 ML 平台和 CI/CD 管道来自动化 ml 管道。我们还有像Roboflow和Andrew N.G.的登陆AI这样的工具来自动化或创建端到端的计算机视觉应用程序。
如果我们想在OpenAI或拥抱脸的帮助下创建一个LLM应用程序,那么以前,我们想手动完成。出于同样的目的,我们有两个最著名的库,Haystack 和 LangChain,它们帮助我们为 LLM 模型创建端到端的应用程序或管道。让我们更多地了解Langchain。
二、什么是LangChain链?
LangChain 是一个创新的框架,它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则,LangChain正在重新定义通过传统API可以实现的极限。此外,LangChain应用程序是代理的,使语言模型能够轻松交互并适应其环境。
Langchain由几个模块组成。顾名思义,将不同的模块链接在一起是Langchain的主要目的。这里的想法是将每个模块链接在一个链中,最后使用该链一次调用所有模块。
这些模块包括以下内容:
- 型
- 提示
- 记忆
- 链
- 代理
- 回调
- 指标
让我们从,
2.1 模型
如简介中所述,模型主要涵盖大型语言模型。相当大的大型语言模型是由具有众多参数的神经网络组成的模型,并在大量未标记的文本上进行训练。科技巨头有各种各样的LLM,比如,
- 谷歌的伯特
- OpenAI 的 GPT-3
- 谷歌的拉MDA
- PaLM by Google
- LLaMA by Meta AI
- OpenAI 的 GPT-4
- 还有更多...
在语言链的帮助下,与大型语言模型的交互变得更加容易。Langchain提供的界面和功能有助于轻松地将LLM的强大功能集成到您的工作应用程序中。LangChain通过利用asyncio库为LLM提供异步支持。
还有 Langchain 提供的异步支持[通过释放处理请求的线程,服务器可以将其分配给其他任务,直到准备好响应,从而最大限度地提高资源利用率。目前、、、 和 受支持,但对其他 LLM 的异步支持已在路线图上。您可以使用该方法异步调用 OpenAI LLM。您还可以编写自定义 LLM 包装器,而不是 LangChain 中支持的包装器。OpenAI
PromptLayerOpenAI
ChatOpenAI
Anthropic
agenerate
我在应用程序中使用了OpenAI,并且主要使用Davinci,Babbage,Curie和Ada模型来陈述问题。每个模型都有自己的优点、令牌使用计数和用例。您可以在此处阅读有关这些模型的更多信息。
2.1.1 示例 1
# Importing modules
from langchain.llms import OpenAI#Here we are using text-ada-001 but you can change it
llm = OpenAI(model_name="text-ada-001", n=2, best_of=2)#Ask anything
llm("Tell me a joke")
2.1.2 产出1:
'\n\nWhy did the chicken cross the road?\n\nTo get to the other side.'
示例 2:
llm_result = llm.generate(["Tell me a poem"]*15)
产出2:
[Generation(text="\n\nWhat if love neverspeech\n\nWhat if love never ended\n\nWhat if love was only a feeling\n\nI'll never know this love\n\nIt's not a feeling\n\nBut it's what we have for each other\n\nWe just know that love is something strong\n\nAnd we can't help but be happy\n\nWe just feel what love is for us\n\nAnd we love each other with all our heart\n\nWe just don't know how\n\nHow it will go\n\nBut we know that love is something strong\n\nAnd we'll always have each other\n\nIn our lives."),Generation(text='\n\nOnce upon a time\n\nThere was a love so pure and true\n\nIt lasted for centuries\n\nAnd never became stale or dry\n\nIt was moving and alive\n\nAnd the heart of the love-ick\n\nIs still beating strong and true.')]
2.2 提示
我们都知道,提示是我们提供给任何系统的输入,以根据我们的用例完善我们的答案,使其更准确或更具体。很多时候,您可能希望获得更多结构化的信息,而不仅仅是文本回复。许多新的目标检测和基于对比预训练和零镜头学习的分类算法包括提示作为结果的有效输入。举个例子,OpenAI的CLIP和META的Grounding DINO使用提示作为预测的输入。
在 Langchain 中,我们可以根据自己想要的答案设置一个提示模板,然后将其链接到主链进行输出预测。输出分析器还有一个工具来优化结果。输出解析器负责 (1) 指示模型应如何格式化输出,以及 (2) 将输出解析为所需的格式(包括在必要时重试)。
在 Langchain 中,我们可以提供提示作为模板。模板是指提示的蓝图或我们想要答案的特定格式。LangChain提供预先设计的提示模板,可以为不同类型的任务生成提示。但是,在某些情况下,默认模板可能无法满足您的要求。默认情况下,我们可以使用自定义提示模板。
2.2.1 例
from langchain import PromptTemplate
# This template will act as a blue print for prompttemplate = """
I want you to act as a naming consultant for new companies.
What is a good name for a company that makes {product}?
"""prompt = PromptTemplate(input_variables=["product"],template=template,
)
prompt.format(product="colorful socks")
# -> I want you to act as a naming consultant for new companies.
# -> What is a good name for a company that makes colorful socks?
2.3 记忆:
默认情况下,LangChain 中的链和代理以无状态模式运行,这意味着它们独立处理每个传入的查询。但是,在某些应用程序中,例如聊天机器人,在短期和长期内保留以前的交互非常重要。这就是“记忆”概念发挥作用的地方。
LangChain以两种形式提供内存组件。首先,LangChain 提供了用于管理和操作以前的聊天消息的辅助实用程序,这些消息被设计为模块化且有用,无论其用例如何。其次,LangChain提供了一种将这些实用程序集成到链中的简单方法。这使得它们具有高度的通用性和适应任何情况。
2.3.1 例
from langchain.memory import ChatMessageHistoryhistory = ChatMessageHistory()
history.add_user_message("hi!")history.add_ai_message("whats up?")
history.messages
2.3.2 输出
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">[HumanMessage(content='<span style="color:#c41a16">hi!</span>', additional_kwargs={}),AIMessage(content='<span style="color:#c41a16">whats up?'</span>, additional_kwargs={})]</span></span></span></span>
2.4 链:
链提供了一种将各种组件合并到统一应用程序中的方法。例如,可以创建一个链,该链接收来自用户的输入,使用提示模板对其进行格式化,然后将格式化的回复传输到LLM。通过将多个链与其他组件集成,可以生成更复杂的链。
LLMChain
被认为是查询 LLM 对象使用最广泛的方法之一。它根据提示模板格式化提供的输入键值以及内存键值(如果存在),然后将格式化的字符串发送到 LLM,然后生成返回的输出。
在调用语言模型之后,可以采取一系列步骤,其中可以对模型进行一系列调用。当希望将一个调用的输出用作另一个调用的输入时,这种做法特别有价值。在这一系列链中,每个单独的链都有一个输入和一个输出,一个步骤的输出用作下一个步骤的输入。
#Here we are chaining everything
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (ChatPromptTemplate,HumanMessagePromptTemplate,
)
human_message_prompt = HumanMessagePromptTemplate(prompt=PromptTemplate(template="What is a good name for a company that makes {product}?",input_variables=["product"],))
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
chat = ChatOpenAI(temperature=0.9)
# Temperature is about randomness in answer more the temp, random the answer
#Final Chainchain = LLMChain(llm=chat, prompt=chat_prompt_template)
print(chain.run("colorful socks"))
2.5 代理:
某些应用程序可能不仅需要预先确定的LLM /其他工具调用序列,还需要依赖于用户输入的不确定序列。这些类型的序列包括可以访问一系列工具的“代理”。根据用户输入,代理可以确定应调用哪些工具(如果有)。
根据文档,代理的高级伪代码如下所示:
收到一些用户输入
代理决定使用哪个工具(如果有),以及该工具的输入应该是什么
然后使用该工具输入调用该工具,并记录观察结果(这只是使用该工具输入调用该工具的输出。
工具、工具输入和观察的历史记录将传递回代理,并决定下一步要执行的步骤
重复此操作,直到代理决定不再需要使用工具,然后直接响应用户。
2.5.1 例:
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAIllm = OpenAI(temperature=0)tools = load_tools(["serpapi", "llm-math"], llm=llm)agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)agent.run("Who is Leo DiCaprio's girlfriend? What is her current age raised to the 0.43 power?")
让我们在下面附的一个快照中总结所有内容。
LangChain的高级思想[图片来源:作者]
了解所有模块和链接对于使用 Lang-Chain 为大型语言模型构建管道应用程序非常重要。这只是对 LangChain 的简单介绍,在本系列的下一部分,我们将研究真正的管道,例如制作 pdfGPT、制作对话机器人、回答文档和其他应用程序。这种基于应用程序的工作将使这些概念更加清晰。LangChain 的文档很好理解,但我添加了我自己的想法以使其更清晰。你可以在这里找到LangChain的文档。
[编辑:我在下面添加了LangChain系列的下一部分,这样你就不需要在我的个人资料中搜索它]
其它参考:
了解语言链🦜️🔗:第2部分
实际实施 LangChain 以构建自定义数据机器人涉及合并内存、提示模板和...
代币和模型:了解语言链 🦜️🔗 部分:3
了解令牌以及如何为您的用例选择 OpenAI 模型,API 密钥定价的工作原理
相关文章:

了解 Langchain️是个啥?:第 1 部分
一、说明 在日常生活中,我们主要致力于构建端到端的应用程序。我们可以使用许多自动 ML 平台和 CI/CD 管道来自动化 ml 管道。我们还有像Roboflow和Andrew N.G.的登陆AI这样的工具来自动化或创建端到端的计算机视觉应用程序。 如果我们想在OpenAI或拥抱脸的帮助下创…...

Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库
Axure RP移动端高保真CRM办公客户管理系统原型模板及元件库,一套典型的移动端办公工具型APP Axure RP原型模板,可根据实际的产品需求进行扩展,也可以作为移动端原型设计的参考案例。为提升本作品参考价值,在模板设计过程中尽量追求…...

【JAVA】我们常常谈到的方法是指什么?
个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言方法方法的分类方法的定义方法调用方法重载 前言 在之前的文章中我们总是会介绍到类中的各式各样的方法,也许在应用中我们对它已经有了初步的了解,今…...

今天来给大家聊一聊什么是Hierarchical-CTC模型
随着人工智能领域的不断发展,语音识别技术在日常生活和工业应用中扮演着越来越重要的角色。为了提高识别准确性和效率,研究人员不断探索新的模型和算法。在这个领域中,Hierarchical-CTC模型引起了广泛的关注和兴趣。本文将介绍什么是Hierarch…...
cout还是printf?C++教程 - How to C++系列专栏第4篇
关于专栏 这个专栏是优质的C教程专栏,如果你还没看过第一篇,点击这里去第0篇 本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C编译器:Clang 感谢一路相伴的朋友们,感谢…...

Linux NTP原理及配置使用
一、NTP简介 1.NTP简介 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的…...
SAP系统是什么呢?它有哪些优势?
SAP系统是全球知名的企业资源规划(ERP)解决方案供应商。它集成了财务、供应链管理、人力资源管理、销售和客户关系管理等多个功能模块,为企业提供全面、集成的管理体验。SAP系统已成为各行各业企业管理的智慧选择,极大地提升了管理…...
js数组学习(ES6+)
文章目录 js(ES6)数组学习1.Array.prototype.forEach(fn)2.Array.prototype.map(fn)3.Array.prototype.filter(fn)4.Array.prototype.reduce(fn)5.Array.prototype.some(fn) every6.Array.prototype.find(fn)7.Array.prototype.includes(item) js(ES6)数组学习 1.Array.protot…...

DoIP诊断入门
简介 DoIP(Diagnosis over Internet Protocol)是一种用于车辆诊断的网络通信协议。它基于现代互联网技术,允许通过以太网或IP网络进行车辆诊断和通信。 DoIP的背景是现代车辆中使用的电子控制单元(ECU)数量不断增加&…...

Amazon CloudFront 部署小指南(五)- 使用 Amazon 边缘技术优化游戏内资源更新发布...
内容简介 游戏内资源包括玩家的装备/弹药/材料等素材,对游戏内资源的发布和更新是游戏运营商的一个常规业务流程,使用频率会十分高,所以游戏运营商希望该流程可以做到简化和可控。针对这个需求,我们设计了 3 个架构,面…...

undefined reference to `dlopen‘ ‘SSL_library_init‘ `X509_certificate_type‘
使用Crow的时候需要注意crow依赖asio依赖OpenSSL,asio要求1.22以上版本,我使用的是1.26.0; 这个版本的asio要求OpenSSL是1.0.2,其他版本我得机器上编不过,ubuntu上默认带的OpenSSL是1.1.1; 所以我下载了OPENSSL1.2.0重…...

DHCPv6之GitHub项目Android侧验证
一、adb里面安装busybox 1、下载busybox 下载网址:Index of /downloads/binaries/1.21.1 (busybox.net),目前最新是1.21.1版本 根据项目选择busybox-armv7l ,右键另存为下载到本地目录,下载后去掉文件的后缀名,变成如…...

简单易懂的 Postman Runner 参数自增教程
目录 什么是 Postman Runner? Postman Runner 如何实现参数自增? 步骤一:设置全局参数 步骤二:将全局参数带入请求参数 步骤三:实现参数自增 资料获取方法 什么是 Postman Runner? Postman Runner 是…...

BeanFactory与Applicationcontext(1)
BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。BeanFactory是spring的“心脏”,核心容器,它也是Applicationcontext的父接口。 BeanFactory实质上并未提供过多的方法,spring容器的I…...

C++初阶之模板深化讲解
模板深化讲解 非类型模板模板的特化1.函数模板特化2.类模板特化 模板分离编译1.什么是分离编译2.模板的分离编译 模板总结 非类型模板 非类型模板(Non-Type Template)是 C 中的一种模板形式,它允许你在模板中传递除了类型以外的其他值&#x…...
Redis数据结构——整数集合
定义 整数集合是集合的实现方式之一,当一个集合只包含整数值元素时,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合的底层实现。 整数集合就是存放整数的一个数组,整数集合的结构体定义: typeof struc…...

背上大书包准备面试之CSS篇
目录 H5 新特性 css3新特性? 为什么要初始化css样式? 浏览器兼容性问题? css sprites(css精灵图)? css盒模型是什么样的? 页面中一个块元素的宽度包含了盒模型中的哪些部分?…...
linux系列基本介绍
虽然我们常说Linux操作系统,这种叫法是不正确的,严格意义上讲,Linux并不是操作系统,而是属于操作系统的一个内核,inux内核提供了操作系统的核心功能,如进程管理、内存管理、文件系统等。 Linux有很多不同的…...

vue.draggable浅尝
介绍 Vue.Draggable是一款基于Sortable.js实现的vue拖拽插件。支持移动设备、拖拽和选择文本、智能滚动,可以在不同列表间拖拽、不依赖jQuery为基础、vue 2过渡动画兼容、支持撤销操作,总之是一款非常优秀的vue拖拽组件。本篇将介绍如何搭建环境及简单的…...

Tree相关
1.树相关题目 1.1 二叉树的中序遍历(简单):递归 题目:使用中序遍历二叉树 思想:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历࿰…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...