基础链的使用

文章目录

基础链类型

基础链的类型分为4种:LLM链(LLMChain)、路由器链(RouterChain)、顺序链(Sequential Chain)和转换链(Transformation Chain)。

  1. LLM链是一种简单的链。它在LangChain中被广泛应用,包括在其他链和代理中。LLM链由提示词模板和模型包装器(可以是LLM或Chat Model模型包装器)组成。它使用提供的输人键值格式化提示词模板,然后将格式化的字符串传递给LLM模型包装器,并返回LLM模型包装器的输出。上一节中的示例代码便使用了LLM链。
  2. 路由器链是一种使用路由器创建的链,它可以动态地选择给定输入的下一条链。路由器链由两部分组成:路由器链本身(负责选择要调用的下一条链)和目标链(路由器链可以路由到的链)。
  3. 顺序链在调用语言模型后的下一步使用,它特别适合将一次调用的输出作为另一次调用的输人的场景。顺序链允许我们连接多个链并将它们组成在特定场景下执行的流水线。顺序链有两种类型:SimpleSequentialChain(最简单形式的顺序链,其中每一步都有一个单一的输入/输出,一个步骤的输出是下一个步骤的输人)和SequentialChain(一种更通用的顺序链,允许多个输人/输出)。
  4. 转换链是一个用于数据转换的链,开发者可以自定义transform函数来执行任何数据转换逻辑。这个函数接受一个字典(其键由input variables指定)作为参数并返回另一个字典(其键由output_variables指定)。

工具链类型

在LangChain中,链其实就是由一系列工具链构成的,每一个工具都可以被视为整个链中的一个环节。这些环节执行的操作可能非常简单,例如将一个提示词模板和一个大语言模型链接起来,形成一个大语言模型链。然而,也可能比较复杂,例如在整个流程中,通过多个环节进行多个步骤的连接。这可能还涉及多个大语言模型及各种不同的实用工具等。在工具链中,一个链的输出将成为下一个链的输人,这就形成了一个输人/输出的链式流程。例如,从大语言模型的输出中提取某些内容,作为Wolfram Alpha查询的输人,然后返回查询结果,并再次通过大语言模型生成返回给用户的响应。这就是一个典型的工具链的示例。

常见工具链的功能与应用在实际的应用中,一些常见的工具链如APIChain、ConversationalRetrievalQA等已经被封装好了。APIChain使得大语言模型可以与API进行交互,以获取相关的信息。构建该链时,需要提供一个与指定API文档相关的问题。ConversationalRetrievalQA链在问答链的基础上提供了一个聊天历史组件。它首先将聊天历史(要么明确传入,要么从提供的内存中检索)和问题合并成一个独立的问题,然后从检索器中查找相关的文档,最后将这些文档和问题传递给一个问答链,用以返回响应。

对于需要将多个文档进行合并的任务,可以使用文档合并链,如MapReduceDocumentsChain或StuffDocumentsChain等。对于需要从同一段落中提取多个实体及其属性的任务,则可以使用提取链。还有一些专门设计用来满足特定需求的链,如ConstitutionalChain,这是一个保证大语言模型输出遵循一定原则的链,通过设定特定的原则和指导方针,使得大语言模型生成的内容符合这些原则,从而提供更受控、符合伦理和上下文的回应内容。

工具链的使用方法,工具链的使用方法通常是先使用类方法实例化,然后通过run方法调用,输出结果是一个字符串,然后将这个字符串传递给下一个链。类方法通常以"from"和下画线开始,比较常见的有from_llm()和from_chain_type(),它们都接受外部的数据来源作为参数。

from_llm()方法的名称意味着实例化时,传递的LLM模型包装器在内部已被包装为LLMChain。而只有在需要设置combine documents chain属性的子类时才使用fom-chain-type()方法构造链。目前只有文档问答链使用这个类方法,比如load qa_with_sources_chain和load ga chain。也只有这些文档问答链才需要对文档进行合并处理。

下面以SQLDatabaseChain为例,介绍如何使用工具链。SQLDatabaseChain就是一个通过from llm0方法实例化的链,用于回答SQL数据库上的问题。

from langchain import OpenAI,SQLDatabase,SQLDatabaseChain
db =SQLDatabase.from uri("sqlite:///../../../../notebooks/Chinook.db")
llm= OpenAI(temperature=0,verbose=True)
db_chain SQLDatabaseChain.from llm(llm,db,verbose=True)
db_chain.run ("How many employees are there?")

运行的结果是:

Entering new SQLDatabaseChain chain...
How many employees are there?
SOLQuery:
/workspace/LangChain/LangChain/sql_database.py:191:SAWarning:Dialect
sqlite+pysqlite does *not*support Decimal objects natively,and SQLAlchemy must
convert from floating point rounding errors and other issues may occur.Please
consider storing Decimal numbers as strings or integers on this platform forlossless storage.
sample rows connection.execute(command)SELECT COUNT (*FROM "Employee";SQLResult:[(8,)Answer:There are 8 employees.
Finished chain.
'There are 8 employees.'

细说基础链

基础链是整个运行链的基础。这一节详细说明最常使用的基础链:LLM链、路由器链和顺序链。

LLM链

LLM链是一个非常简单的链组件。这是我们最常见到的链组件。它的作用只是将一个大语言模型包装器与提示词模板连接在一起。使用提示词模板来接收用户输入,并使用模型包装器发出聊天机器人的响应。以下是在文章的事实提取场景下,使用LLM链的示例代码。首先安装库:

pip install openai LangChain huggingface hub

还需要设置密钥:

import os
os.environ['OPENAI_API KEY']='填人你的OPENAI平台的密钥!"
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

设置OpenAI text-davinci--003模型,将温度设置为0。

llm =OpenAI (model name='text-davinci-003',
	temperature=0,
	max_tokens =256)

下面对一篇关于Coinbase的文章进行事实提取:

article ="""Coinbase,the second-largest crypto exchange by trading volume,released its Q4 2022 earnings on Tuesday,giving shareholders and market playersalike an updated look into its financials.In response to the report,the company'sshares are down modestly in early after-hours trading.In the fourth quarter of2022,Coinbase generated $605 million in total revenue,down sharply from $2.49bi11 ion in the year-ago quarter..(完整文档可在本书代码仓库找到)

提示词模板的大意是,从文本中提取关键事实,不包括观点,给每个事实编号,并保持它们的句子简短。

fact_extraction_prompt PromptTemplate
input_variables=['text_input'],
template=(
	'Extract the key facts out of this text.Don't include opinions.'
	'Give each fact a number and keep them short sentences.:\n\n
	'(text input)'))

制作链组件实际上非常简单,只需为LLMChain类设置Ilm和prompt参数,然后,进行函数式调用,这样就实例化了一个LLMChain组件。将需要处理的文本字符串传递给这个链组件。使用run方法可以运行这个链组件,将用于提取任务的提示词发送给聊天机器人,聊天机器人进行响应。

fact_extraction_chain= LLMChain(llm=llm,prompt=fact_extraction_prompt)
facts=fact_extraction chain.run(article)
print (facts)

可以看到,在运行该链组件之后,提取了10个关键事实。

1.Coinbase released its Q4 2022 earnings on Tuesday.
2.Coinbase generated $605 million in total revenue in Q4 2022.
3.Coinbase lost $557 million in the three-month period on a GAAP basis.
4.Coinbase's stock had risen 86%year-to-date before its Q4 earnings were released.
5.Consumer trading volumes fell from $26 billion in Q3 2022 to $20 billioninQ42022.
6.Institutional volumes across the same timeframe fell from $133 billion to $125 billion.
7.The overall crypto market capitalization fell about 648,or $1.5 trillion during 2022.
8.Trading revenue at Coinbase fell from $365.9 million in Q3 2022 to $322.1 million in Q4 2022.
9.Coinbase's "subscription and services revenue"rose from $210.5 million in Q3 2022 to $282.8 million in Q4 2022.
10.Monthly active developers in crypto have more than doubled since 2020toover20,000.

该链组件从这篇文章中提取了10个事实。这对于用户来说,原本要看3500字的原文,现在压缩为了10个关键事实,极大地节约了用户的阅读时间。

路由器链

路由器链是一种编程范式,用于动态选择下一个要使用的链来处理给定的输入。在LangChain中,路由器链主要由两部分构成:一是路由器链自身,它的任务是负责选择下一个要调用的链;二是所有目标链的字典集合。LLMRouterChain是路由器链的一种具体实现,其负责根据某种逻辑或算法来选择下一个要调用的链。路由器链是利用提示词指导模型的能力,让模型按照某种评估或匹配机制选择下一个链。路由器链使用LLM模型包装器来决定如何路由,如下例所示:

from langchain.chains.router.llm router import LLMRouterChain
#创建LLMRouterChain
router_chain =LLMRouterChain.from llm(llm,router_prompt)
destination_chains (
	for p_info in prompt infos:
	name p_info["name"]
	prompt_template p_info["prompt template"]
	prompt=PromptTemplate (template=prompt template,input variables=["input"])
	chain =LLMChain (llm=llm,prompt=prompt)
	destination_chains[name]=chain

destination chains是一个字典,其中的键通常是目标链的名称或标识符,值则是这些目标链的实例。值得注意的是,因为destination chains是一个字典结构,所以可以在运行时动态地添加或删除目标链,而无须修改代码。

顺序链

顺序链是多个链组件的组合,并且按照某种预期的顺序执行其中的链组件。制作了一个可以提取10个文章事实的LLM链,这里为了说明顺序链是如何工作的,增加一个新的链。下面制作一个新的链。然后把其中一些链组合在一起,所以我们新构建一个LLM链。提取10个文章事实的示例,把它们改写成投资者报告的形式。提示词可写为:"你是高盛的分析师,接受以下事实列表,并用它们为投资者撰写一个简短的段落,不要遗漏关键信息。也可以放一些东西在这里,不要杜撰信息,应该是要传入的事实。"其中,{fcts}是模板字符串的占位符,也就是提示词模板的input_variables的一个值:input variables=["facts'"]。

investor_update_prompt =PromptTemplate(
	input_variables=["facts"],
	template="You are a Goldman Sachs analyst.Take the following list of facts
	and use them to write a short paragrah for investors.Don't leave out key info:\n\n (facts)")

再次强调,这是一个LLM链,传人LLM链,仍然使用上面定义的原始模型,这里的区别在于,传入提示词已经不同了。然后可以运行(run方法)它。

investor_update_chain =LLMChain(llm=llm,prompt=investor_update_prompt)
investor_update =investor _pdate_chain.run(facts)
print (investor update)
len(investor_update)

输出结果如下。可以看到,文章内容和文章的字符串长度值都打印出来了。

Coinbase released its Q4 2022 earnings on Tuesday,revealing total revenue
of $605 million and a GAAP loss of $557 million.Despite the losses,Coinbase's
stock had risen 86%year-to-date before its Q4 earnings were released.Consumer
trading volumes fell from $26 billion in Q3 2022 to $20 billion in Q4 2022,while
institutional volumes fell from $133 billion to $125 billion.The overall crypto
market capitalization fell about 648,or $1.5 trillion during 2022.Trading revenue
at Coinbase fell from $365.9 million in Q3 2022 to $322.1 million in Q4 2022,
while its "subscription and services revenue"rose from $210.5 million in Q3 2022
to $282.8 million in Q4 2022.Despite the market downturn,monthly active
developers in crypto have more than doubled since 2020 to over 20,000.
788

该示例写了一篇相当连贯的好文章,字符长度为788。比之前的文章要短得多。下面使用简单的顺序链(SimpleSequentialChain)来完成提炼10个文章事实和写摘要的两个任务。简单的顺序链就像PyTorch中的标准顺序模型一样,它只是从A到B到C,没有做任何复杂的操作。顺序链的便利性在于,它接收包含多个链组件的数组。并合并多个链组件。比如提炼10个文章事实和写摘要的两个任务链,使用顺序链将它们合并之后,运行得到的响应是两个任务的答案。本来需要运行两次链组件,而使用顺序链后只需运行一次。

from langchain.chains import SimpleSequentialChain,SequentialChain
full_chain =SimpleSequentialChain(
	chains=[fact_extraction_chain,investor_update_chain],
	verbose=True)
response=full_chain.run (article)

通过使用顺序链,成功地将原本需要手动执行的两步操作简化为了一步。在这个顺序链组件内部,数据的流动和管理都被自动处理了,开发者并不需要关心这些细节。需要做的只是指定任务以及任务的执行顺序,顺序链会按照要求,将任务有序地组织起来并执行,最后返回预期的结果。

相关推荐
聚合菌22 分钟前
【转载】震惊的对话式开发:聚合数据 API+deepseek+Cursor+让你成为全栈工程师
人工智能·github·全栈
小赖同学啊39 分钟前
深度学习-交易预测
人工智能·深度学习
Swift社区41 分钟前
【DeepSeek】从文本摘要到对话生成:DeepSeek 在 NLP 任务中的实战指南
人工智能·深度学习·自然语言处理
liruiqiang0541 分钟前
机器学习 - 理解偏差-方差分解
人工智能·算法·机器学习
是十一月末43 分钟前
机器学习之数据清洗及六种缺值处理方式
人工智能·python·机器学习·数据清洗·数据处理
dxt_snow1 小时前
Centos7系统安装redis
数据库·redis·缓存
百家方案1 小时前
2025年智慧城市解决方案下载:AI-超脑中台,体系架构整体设计
人工智能·架构·智慧城市
云罗张晓_za8986681 小时前
抖音“碰一碰”发视频:短视频社交的新玩法
android·c语言·网络·线性代数·矩阵·php
世界级小趴菜1 小时前
综合实验练习实验报告
网络
WSSWWWSSW1 小时前
能够复刻人类意识并实现永生的虚拟生态系统
人工智能