自然语言处理从入门到应用——LangChain:链(Chains)-[基础知识]
分类目录:《自然语言处理从入门到应用》总目录
在本文中,我们将学习如何在LangChain中创建简单的链式连接并添加组件以及运行它。链式连接允许我们将多个组件组合在一起,创建一个统一的应用程序。例如,我们可以创建一个链式连接,接收用户输入,使用PromptTemplate对其进行格式化,然后将格式化后的响应传递给LLM。我们可以通过将多个链式连接组合在一起或将链式连接与其他组件组合来构建更复杂的链式连接。
快速入门:使用LLMChain
LLMChain是一个简单的链式连接,它接收一个prompt模板,使用用户输入对其进行格式化,并返回LLM的响应。要使用LLMChain,首先创建一个prompt模板。
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAIllm = OpenAI(temperature=0.9)
prompt = PromptTemplate(input_variables=["product"],template="What is a good name for a company that makes {product}?",
)
现在,我们可以创建一个非常简单的链式连接,它将接收用户输入,使用它来格式化prompt,并将其发送到LLM。
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)# 仅指定输入变量运行链式连接。
print(chain.run("colorful socks"))
输出:
Colorful Toes Co.
如果有多个变量,我们可以使用字典一次输入它们。
prompt = PromptTemplate(input_variables=["company", "product"],template="What is a good name for {company} that makes {product}?",
)
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run({'company': "ABC Startup",'product': "colorful socks"}))
输出:
Socktopia Colourful Creations.
我们也可以在LLMChain中使用聊天模型:
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)
chain = LLMChain(llm=chat, prompt=chat_prompt_template)
print(chain.run("colorful socks"))
输出:
Rainbow Socks Co.
调用链式连接的不同方式
所有继承自Chain的类都提供了几种运行链式连接逻辑的方式。其中最直接的一种方式是使用 __call__:
chat = ChatOpenAI(temperature=0)
prompt_template = "Tell me a {adjective} joke"
llm_chain = LLMChain(llm=chat,prompt=PromptTemplate.from_template(prompt_template)
)llm_chain(inputs={"adjective":"corny"})
输出:
{'adjective': 'corny','text': 'Why did the tomato turn red? Because it saw the salad dressing!'}
默认情况下,__call__ 方法会返回输入和输出的键值对。我们可以通过将return_only_outputs设置为True来配置它仅返回输出的键值对。
llm_chain("corny", return_only_outputs=True)
{'text': 'Why did the tomato turn red? Because it saw the salad dressing!'}
如果Chain只输出一个输出键(即其output_keys中只有一个元素),则可以使用run方法。需要注意的是,run方法输出一个字符串而不是字典。
# llm_chain only has one output key, so we can use run
llm_chain.output_keys
输出:
['text']
输入:
llm_chain.run({"adjective":"corny"})
输出:
'Why did the tomato turn red? Because it saw the salad dressing!'
在只有一个输入键的情况下,我们可以直接输入字符串,无需指定输入映射。
# These two are equivalent
llm_chain.run({"adjective":"corny"})
llm_chain.run("corny")# These two are also equivalent
llm_chain("corny")
llm_chain({"adjective":"corny"})
输出:
{'adjective': 'corny','text': 'Why did the tomato turn red? Because it saw the salad dressing!'}
我们可以通过Chain对象的run方法将其作为Agent中的Tool进行简单集成。
为链式连接添加记忆
Chain支持将BaseMemory对象作为其memory参数,从而使Chain对象能够在多次调用之间保留数据。换句话说,memory参数使Chain成为一个有状态的对象。
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemoryconversation = ConversationChain(llm=chat,memory=ConversationBufferMemory()
)conversation.run("Answer briefly. What are the first 3 colors of a rainbow?")
# -> The first three colors of a rainbow are red, orange, and yellow.
conversation.run("And the next 4?")
# -> The next four colors of a rainbow are green, blue, indigo, and violet.
输出:
'The next four colors of a rainbow are green, blue, indigo, and violet.'
基本上,BaseMemory定义了langchain存储记忆的接口。它允许通过load_memory_variables方法读取存储的数据,并通过save_context方法存储新数据。我们可以在《自然语言处理从入门到应用——LangChain:记忆(Memory》系列文章了解更多信息。
调试链式连接
仅从输出中调试Chain对象可能会很困难,因为大多数Chain对象涉及相当数量的输入prompt预处理和LLM输出后处理。将verbose设置为True将在运行时打印出Chain对象的一些内部状态。
conversation = ConversationChain(llm=chat,memory=ConversationBufferMemory(),verbose=True
)
conversation.run("What is ChatGPT?")
日志输出:
> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.Current conversation:Human: What is ChatGPT?
AI:> Finished chain.
输出:
'ChatGPT is an AI language model developed by OpenAI. It is based on the GPT-3 architecture and is capable of generating human-like responses to text prompts. ChatGPT has been trained on a massive amount of text data and can understand and respond to a wide range of topics. It is often used for chatbots, virtual assistants, and other conversational AI applications.'
使用SequentialChain将链式连接组合起来
在调用语言模型之后的下一步是对语言模型进行一系列的调用。我们可以使用顺序链式连接来实现这一点,顺序链式连接按照预定义的顺序执行其链接。具体而言,我们将使用SimpleSequentialChain。这是最简单的顺序链式连接类型,其中每个步骤都具有单个输入/输出,一个步骤的输出是下一个步骤的输入。在本文中,我们的顺序链式连接将首先为产品创建一个公司名称,我们将重用之前初始化的LLMChain来创建这个公司名称。然后再为产品创建一个口号。我们将初始化一个新的LLMChain来创建这个口号:
second_prompt = PromptTemplate(input_variables=["company_name"],template="Write a catchphrase for the following company: {company_name}",
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)
现在我们可以将这两个LLMChain结合起来,这样我们就可以一步创建一个公司名称和一个标语。
from langchain.chains import SimpleSequentialChain
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)# Run the chain specifying only the input variable for the first chain.
catchphrase = overall_chain.run("colorful socks")
print(catchphrase)
日志输出:
> Entering new SimpleSequentialChain chain...
Rainbow Socks Co."Put a little rainbow in your step!"> Finished chain.
输出:
"Put a little rainbow in your step!"
使用Chain类创建自定义链式连接
LangChain提供了许多现成的链式连接,但有时我们可能希望为特定的用例创建自定义链式连接。在这个例子中,我们将创建一个自定义链式连接,它将两个LLMChain的输出连接起来。
要创建一个自定义链式连接:
- 创建一个
Chain类的子类 - 填写
input_keys和output_keys属性 - 添加
_call方法,展示如何执行链式连接
下面的示例演示了这些步骤:
from langchain.chains import LLMChain
from langchain.chains.base import Chainfrom typing import Dict, Listclass ConcatenateChain(Chain):chain_1: LLMChainchain_2: LLMChain@propertydef input_keys(self) -> List[str]:# Union of the input keys of the two chains.all_input_vars = set(self.chain_1.input_keys).union(set(self.chain_2.input_keys))return list(all_input_vars)@propertydef output_keys(self) -> List[str]:return ['concat_output']def _call(self, inputs: Dict[str, str]) -> Dict[str, str]:output_1 = self.chain_1.run(inputs)output_2 = self.chain_2.run(inputs)return {'concat_output': output_1 + output_2}
现在,我们可以尝试运行我们调用的链:
prompt_1 = PromptTemplate(input_variables=["product"],template="What is a good name for a company that makes {product}?",
)
chain_1 = LLMChain(llm=llm, prompt=prompt_1)prompt_2 = PromptTemplate(input_variables=["product"],template="What is a good slogan for a company that makes {product}?",
)
chain_2 = LLMChain(llm=llm, prompt=prompt_2)concat_chain = ConcatenateChain(chain_1=chain_1, chain_2=chain_2)
concat_output = concat_chain.run("colorful socks")
print(f"Concatenated output:\n{concat_output}")
输出:
Concatenated output:Funky Footwear Company"Brighten Up Your Day with Our Colorful Socks!"
参考文献:
[1] LangChain官方网站:https://www.langchain.com/
[2] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/
[3] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/
相关文章:
自然语言处理从入门到应用——LangChain:链(Chains)-[基础知识]
分类目录:《自然语言处理从入门到应用》总目录 在本文中,我们将学习如何在LangChain中创建简单的链式连接并添加组件以及运行它。链式连接允许我们将多个组件组合在一起,创建一个统一的应用程序。例如,我们可以创建一个链式连接&a…...
[ubuntu]linux服务器每次重启anaconda环境变量失效
云服务器每次重启后conda不能用了,应该是系统自动把设置环境变量清除了。如果想继续使用,则可以运行一下 minconda3激活方法: source ~/miniconda3/bin/activate anaconda3激活方法: source ~/anaconda3/bin/activate 你也修改b…...
【数据结构】如何用栈实现队列?图文解析(LeetCode)
LeetCode链接:232. 用栈实现队列 - 力扣(LeetCode) 注:本文默认读者已掌握栈与队列的基本操作 可以看这篇文章熟悉知识点:【数据结构】栈与队列_字节连结的博客-CSDN博客 目录 做题思路 代码实现 1. MyQueue 2. …...
蓝桥杯上岸每日N题 (闯关)
大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 不清楚蓝桥杯考什么的点点下方👇 考点秘籍 想背纯享模版的伙伴们点点下方👇 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…...
基于Python3 的 简单股票 可转债 提醒逻辑
概述 通过本地的定时轮训,结合本地建议数据库。检查股票可转债价格的同事,进行策略化提醒 详细 前言 为什么会有这么个东西出来呢,主要是因为炒股软件虽然有推送,但是设置了价格之后,看到推送也未必那么及时&#…...
Python“牵手”京东工业商品详情数据采集方法,京东工业商数据API申请步骤说明
京东工业平台介绍 京东工业平台是京东集团旗下的一个B2B电商平台,主要面向企业客户提供一站式的采购服务。京东工业平台依托京东强大的供应链和配送能力,为企业用户提供全品类、全渠道、全场景的采购解决方案,涵盖电子元器件、机械配件、办公…...
【LeetCode-中等题】3. 无重复字符的最长子串
题目 题解一:单指针,滑动窗口 思路: 设置一个左指针,来判断下一个元素是否在set集合中,如果不在,就加入集合,right继续,如果在,就剔除重复的元素,计算串的长度…...
【教程】Java 集成Mongodb
【教程】Java 集成Mongodb 依赖 <dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.12.14</version></dependency> <dependency><groupId>cn.hutool</groupId…...
ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能)
1.实验目的:实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反; key1 ----> LED3灯状态取反; key2 ----> LED2灯状态取反; key3 ----> LED1灯状态取反; 2.分析框图: …...
kafka常用命名
kafka服务启动 $KAFKA_HOME/bin/kafka-server-start.sh -daemon config/server.properties 创建Topic $KAFKA_HOME/bin/kafka-topics.sh --create --topic test0--zookeeper 127.0.0.1:2181 --config max.message.bytes12800000 --config flush.messages1 --partitions 5 …...
华为云开发工具CodeArts IDE for C/C++ 开发使用指南
简介 CodeArts IDE是一个集成开发环境(IDE),它提供了开发语言和调试服务。本文主要介绍CodeArts IDE for C/C的基本功能。 1.下载安装 CodeArts IDE for C/C 已开放公测,下载获取免费体验 2.新建C/C工程 CodeArts IDE for C/…...
如何选择最适合你的SOLIDWORKS版本 硕迪科技
SOLIDWORKS是一款广泛应用于工程设计领域的三维计算机辅助设计(CAD)软件,因其强大的功能和易学易用的界面而备受工程师们的青睐。面对众多的SOLIDWORKS版本,比如SW专业版、白金版,租赁订阅版,以及solidwork…...
通过双层负载均衡实现HTTPS代理的高并发处理和容错能力
在互联网应用中,HTTPS代理服务器是承担用户请求的重要角色。当网站面临高并发请求时,单一的服务器可能无法满足需求,会导致性能下降和容错能力不足。为了解决这个问题,我们可以通过双层负载均衡技术来实现高并发处理和容错能力的提…...
Redis 整合中 Redisson 的使用
大家好 , 我是苏麟 , 今天带来 Redisson 使用 . 官方文档 : GitHub - redisson/redisson: Redisson - Easy Redis Java client with features of In-Memory Data Grid. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, Sorte…...
数据结构(5)
堆 堆可以看作一颗完全二叉树的数组对象。 特性: 1.堆是完全二叉树,除了树最后一层不需要满,其余层次都需要满,如果最后一层不是满的,那么要求左满右不满 2.通常使用数组实现,将二叉树结点依次放入数组中…...
R语言实现网状Meta分析(1)
#R语言实现网状Meta library(gemtc) help(package"gemtc") data<-gemtc::smoking #注意按照实例格式编写数据 net<-mtc.network(data$data.ab) #网状图 plot(net,mode"circle",displaylabelsT,boxed.labelF) summary(net) #网状model model<-mtc…...
Reactor 第十篇 定制一个生产的WebClient
1 为什么要用 WebClient 刚开始尝试使用 Spring WebFlux 的时候,很多人都会使用 Mono.fromFuture() 将异步请求转成 Mono 对象,或者 Mono.fromSupplier() 将请求转成 MOno 对象,这两种方式在响应式编程中都是不建议的,都会阻塞当…...
桃子叶片病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)
1.分为三类 健康的桃子叶片 ,251张 桃疮痂病一般,857张 桃疮痂病严重,770 张 2. GUI界面识别效果和predict.py识别效果如视频所示桃子叶片病害识别(Python代码,pyTorch框架,深度卷积网络模型࿰…...
matlab使用教程(21)—求函数最值
1. 求函数最优值 1.1求一元函数的最小值 如果给定了一个一元数学函数,可以使用 fminbnd 函数求该函数在给定区间中的局部最小值。例如,请考虑 MATLAB 提供的 humps.m 函数。下图显示了 humps 的图。 x -1:.01:2; y humps(x); plot(x,y) xlabel(x)…...
Redis中 为什么Lua脚本可以保证原子性?
Redis中 为什么Lua脚本可以保证原子性?...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
