AI教程 2025年01月15日
0 收藏 0 点赞 214 浏览 4369 个字
摘要 :

面向开发者的LLM入门课程-路由链: 路由链 到目前为止,我们已经学习了大语言模型链和顺序链。但是,如果我们想做一些更复杂的事情怎么办?一个相当常见但基本的操作是……

哈喽!伙伴们,我是小智,你们的AI向导。欢迎来到每日的AI学习时间。今天,我们将一起深入AI的奇妙世界,探索“面向开发者的LLM入门课程-路由链”,并学会本篇文章中所讲的全部知识点。还是那句话“不必远征未知,只需唤醒你的潜能!”跟着小智的步伐,我们终将学有所成,学以致用,并发现自身的更多可能性。话不多说,现在就让我们开始这场激发潜能的AI学习之旅吧。

面向开发者的LLM入门课程-路由链

面向开发者的LLM入门课程-路由链:

路由链

到目前为止,我们已经学习了大语言模型链和顺序链。但是,如果我们想做一些更复杂的事情怎么办?一个相当常见但基本的操作是根据输入将其路由到一条链,具体取决于该输入到底是什么。如果你有多个子链,每个子链都专门用于特定类型的输入,那么可以组成一个路由链,它首先决定将它传递给哪个子链,然后将它传递给那个链。

路由器由两个组件组成:
· 路由链(Router Chain):路由器链本身,负责选择要调用的下一个链
· destination_chains:路由器链可以路由到的链
举一个具体的例子,让我们看一下我们在不同类型的链之间路由的地方,我们在这里有不同的prompt:

from langchain.chains.router import MultiPromptChain #导入多提示链
from langchain.chains.router.llm_router import LLMRouterChain,RouterOutputParser
from langchain.prompts import PromptTemplate
llm = ChatOpenAI(temperature=0)

1.定义提示模板

首先,我们定义提示适用于不同场景下的提示模板。

# 中文
#第一个提示适合回答物理问题
physics_template = “””你是一个非常聪明的物理专家。
你擅长用一种简洁并且易于理解的方式去回答问题。
当你不知道问题的答案时,你承认
你不知道.
这是一个问题:
{input}”””
#第二个提示适合回答数学问题
math_template = “””你是一个非常优秀的数学家。
你擅长回答数学问题。
你之所以如此优秀,
是因为你能够将棘手的问题分解为组成部分,
回答组成部分,然后将它们组合在一起,回答更广泛的问题。
这是一个问题:
{input}”””
#第三个适合回答历史问题
history_template = “””你是以为非常优秀的历史学家。
你对一系列历史时期的人物、事件和背景有着极好的学识和理解
你有能力思考、反思、辩证、讨论和评估过去。
你尊重历史证据,并有能力利用它来支持你的解释和判断。
这是一个问题:
{input}”””
#第四个适合回答计算机问题
computerscience_template = “”” 你是一个成功的计算机科学专家。
你有创造力、协作精神、
前瞻性思维、自信、解决问题的能力、
对理论和算法的理解以及出色的沟通技巧。
你非常擅长回答编程问题。
你之所以如此优秀,是因为你知道
如何通过以机器可以轻松解释的命令式步骤描述解决方案来解决问题,
并且你知道如何选择在时间复杂性和空间复杂性之间取得良好平衡的解决方案。
这还是一个输入:
{input}”””

2.对提示模版进行命名和描述

在定义了这些提示模板后,我们可以为每个模板命名,并给出具体描述。例如,第一个物理学的描述适合回答关于物理学的问题,这些信息将传递给路由链,然后由路由链决定何时使用此子链。

# 中文
prompt_infos = [
{
“名字”: “物理学”,
“描述”: “擅长回答关于物理学的问题”,
“提示模板”: physics_template
},
{
“名字”: “数学”,
“描述”: “擅长回答数学问题”,
“提示模板”: math_template
},
{
“名字”: “历史”,
“描述”: “擅长回答历史问题”,
“提示模板”: history_template
},
{
“名字”: “计算机科学”,
“描述”: “擅长回答计算机科学问题”,
“提示模板”: computerscience_template
}
]

LLMRouterChain(此链使用 LLM 来确定如何路由事物)

在这里,我们需要一个多提示链。这是一种特定类型的链,用于在多个不同的提示模板之间进行路由。但是这只是路由的一种类型,我们也可以在任何类型的链之间进行路由。

这里我们要实现的几个类是大模型路由器链。这个类本身使用语言模型来在不同的子链之间进行路由。这就是上面提供的描述和名称将被使用的地方。

3.基于提示模版信息创建相应目标链

目标链是由路由链调用的链,每个目标链都是一个语言模型链

destination_chains = {}
for p_info in prompt_infos:
name = p_info[“名字”]
prompt_template = p_info[“提示模板”]
prompt = ChatPromptTemplate.from_template(template=prompt_template)
chain = LLMChain(llm=llm, prompt=prompt)
destination_chains[name] = chain
destinations = [f”{p[‘名字’]}: {p[‘描述’]}” for p in prompt_infos]
destinations_str = “n”.join(destinations)

4.创建默认目标链

除了目标链之外,我们还需要一个默认目标链。这是一个当路由器无法决定使用哪个子链时调用的链。
在上面的示例中,当输入问题与物理、数学、历史或计算机科学无关时,可能会调用它。

default_prompt = ChatPromptTemplate.from_template(“{input}”)
default_chain = LLMChain(llm=llm, prompt=default_prompt)

5.定义不同链之间的路由模板

这包括要完成的任务的说明以及输出应该采用的特定格式。
注意:此处在原教程的基础上添加了一个示例,主要是因为”gpt-3.5-turbo”模型不能很好适应理解模板
的意思,使用 “text-davinci-003” 或者”gpt-4-0613″可以很好的工作,因此在这里多加了示例提示让其更
好的学习。
例如:
<< INPUT >>
“What is black body radiation?”
<< OUTPUT >>

{{{{
“destination”: string name of the prompt to use or “DEFAULT”
“next_inputs”: string a potentially modified version of the original input
}}}}

# 多提示路由模板
MULTI_PROMPT_ROUTER_TEMPLATE = “””给语言模型一个原始文本输入,
让其选择最适合输入的模型提示。
系统将为您提供可用提示的名称以及最适合改提示的描述。
如果你认为修改原始输入最终会导致语言模型做出更好的响应,
你也可以修改原始输入。
<< 格式 >>
返回一个带有JSON对象的markdown代码片段,该JSON对象的格式如下:
“`json
{{{{
“destination”: 字符串 使用的提示名字或者使用 “DEFAULT”
“next_inputs”: 字符串 原始输入的改进版本
}}}}
记住:“destination”必须是下面指定的候选提示名称之一,
或者如果输入不太适合任何候选提示,
则可以是 “DEFAULT” 。
记住:如果您认为不需要任何修改,
则 “next_inputs” 可以只是原始输入。
<< 候选提示 >>
{destinations}
<< 输入 >>
{{input}}
<< 输出 (记得要包含 ```json)>>
样例:
<< 输入 >>
“什么是黑体辐射?”
<< 输出 >>
“`json
{{{{
“destination”: 字符串 使用的提示名字或者使用 “DEFAULT”
“next_inputs”: 字符串 原始输入的改进版本
}}}}
“””

6.构建路由链

首先,我们通过格式化上面定义的目标创建完整的路由器模板。这个模板可以适用许多不同类型的目标。

因此,在这里,您可以添加一个不同的学科,如英语或拉丁语,而不仅仅是物理、数学、历史和计算机科学。

接下来,我们从这个模板创建提示模板。

最后,通过传入llm和整个路由提示来创建路由链。需要注意的是这里有路由输出解析,这很重要,因为它将帮助这个链路决定在哪些子链路之间进行路由。

router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(
destinations=destinations_str
)
router_prompt = PromptTemplate(
template=router_template,
input_variables=[“input”],
output_parser=RouterOutputParser(),
)
router_chain = LLMRouterChain.from_llm(llm, router_prompt)

7.创建整体链路

#多提示链
chain = MultiPromptChain(router_chain=router_chain, #l路由链路
destination_chains=destination_chains, #目标链路
default_chain=default_chain, #默认链路
verbose=True
)

8.进行提问

如果我们问一个物理问题,我们希望看到他被路由到物理链路。

chain.run(“什么是黑体辐射?”)

> Entering new MultiPromptChain chain…
物理学: {‘input’: ‘什么是黑体辐射?’}
> Finished chain.

‘黑体辐射是指一个理想化的物体,它能够完全吸收并且以最高效率地辐射出所有入射到它上面的电磁辐射。这
种辐射的特点是它的辐射强度与波长有关,且在不同波长下的辐射强度符合普朗克辐射定律。黑体辐射在物理学
中有广泛的应用,例如研究热力学、量子力学和宇宙学等领域。’

如果我们问一个数学问题,我们希望看到他被路由到数学链路。

chain.run(“2+2等于多少?”)

> Entering new MultiPromptChain chain…
数学: {‘input’: ‘2+2等于多少?’}
> Finished chain.

‘2+2等于4。’

如果我们传递一个与任何子链路都无关的问题时,会发生什么呢?

这里,我们问了一个关于生物学的问题,我们可以看到它选择的链路是无。这意味着它将被传递到默认链路,它本身只是对语言模型的通用调用。语言模型幸运地对生物学知道很多,所以它可以帮助我们。

chain.run(“为什么我们身体里的每个细胞都包含DNA?”)

> Entering new MultiPromptChain chain…
物理学: {‘input’: ‘为什么我们身体里的每个细胞都包含DNA?’}
> Finished chain.

‘我们身体里的每个细胞都包含DNA,因为DNA是遗传信息的载体。DNA是由四种碱基(腺嘌呤、胸腺嘧啶、鸟嘌
呤和胞嘧啶)组成的长链状分子,它存储了我们的遗传信息,包括我们的基因和遗传特征。每个细胞都需要这些
遗传信息来执行其特定的功能和任务。所以,DNA存在于每个细胞中,以确保我们的身体正常运作。’

嘿,伙伴们,今天我们的AI探索之旅已经圆满结束。关于“面向开发者的LLM入门课程-路由链”的内容已经分享给大家了。感谢你们的陪伴,希望这次旅程让你对AI能够更了解、更喜欢。谨记,精准提问是解锁AI潜能的钥匙哦!如果有小伙伴想要了解学习更多的AI知识,请关注我们的官网“AI智研社”,保证让你收获满满呦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.ai-blog.cn/2685.html

下一篇:

已经没有下一篇了!

相关推荐
01-15

面向开发者的LLM入门课程-路由链: 路由链 到目前为止,我们已经学习了大语言模型链和顺序链。但是…

214
01-15

面向开发者的LLM入门课程-顺序链: 顺序链 当只有一个输入和一个输出时,简单顺序链(SimpleSequen…

214
01-15

面向开发者的LLM入门课程-简单顺序链: 简单顺序链 顺序链(SequentialChains)是按预定义顺序执行…

214
01-15

面向开发者的LLM入门课程-大语言模型链: 模型链 链(Chains)通常将大语言模型(LLM)与提示(Pro…

214
01-15

面向开发者的LLM入门课程-对话储存英文版提示: 英文版提示 1.对话缓存储存 from langchain.chains…

214
01-15

面向开发者的LLM入门课程-对话摘要缓存储存: 对话摘要缓存储存 对话摘要缓存储存,使用 LLM 对到…

214
01-15

面向开发者的LLM入门课程-对话字符缓存储存: 对话字符缓存储存 使用对话字符缓存记忆,内存将限制…

214
01-15

面向开发者的LLM入门课程-对话缓存窗口储存: 对话缓存窗口储存 随着对话变得越来越长,所需的内存…

214
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力原创内容

快速提升站内名气成为大牛

扫描二维码

手机访问本站