当前位置: 首页 > article >正文

RouterChain

RouterChain的基本概念和使用方法

,我们将其定位为:可定制的链路系统。它能提供的是:通过一个统一的入口接收用户的输入,自动分析用户的需求,然后引导到最适合的链中执行,获取响应并返回最终结果。其流程如下所示:

   如上所示的流程图,其最简单的形式是链路仅由`LLMChain`构成,每个LLMChain针对不同的需求场景。当用户向系统输入一个指令(即输入1),该输入首先被`RouterChain`模块处理。`RouterChain`模块整合了`LLMChainA`和`LLMChainB`两种链路,会根据`输入1`的内容分析用户的意图,决定是执行`LLMChain A`还是`LLMChain B`,然后进行相应的操作,并最终直接返回结果。

 整个数据流程可划分为两个方向:一是用户输入经过路由系统处理后产生输出的正向流程;二是Router Chain的构建过程,这一过程是反向的,并且依赖于外部的链路仓库

 第一步定义链路仓库

定义查询天气的chain

from langchain_openai import ChatOpenAI

openai_chat = ChatOpenAI(model_name="gpt-4-turbo-preview", 
                         temperature=0)


from langchain_core.prompts import ChatPromptTemplate

weather_template = ChatPromptTemplate.from_messages(
    [
        ("system", "您是一位非常善于做气象数据分析的教授,具有10年以上丰富的行业经验。"),
        ("human", "这是实时的天气数据:{input}"),
        ("human", "请您根据上述实时的气象数据,给出合理的出行建议。"),
    ]
)
# 使用`LLMChain`构建第一个基本链路,专门处理实时天气数据。该链路的目标是进行气象分析,并据此提供出行建议。
from langchain.chains import LLMChain

weather_chain = LLMChain(llm=openai_chat, 
                         prompt=weather_template,
                         verbose=True)

 第二个LLMChain为`mail_chain`,与`weather_chain`是截然不同的一条链,它用来进行邮件的收发管理,其代码定义如下:

from langchain_openai import ChatOpenAI

openai_chat = ChatOpenAI(model_name="gpt-4-turbo-preview", 
                         temperature=0)
mail_template = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一位智能收发邮件的AI小助手,工作效率极高,"),
        ("human", "这是你接收到的指令:{input}"),
        ("human", "请你根据操作指令,迅速完成对应的工作,并回复你完成的进度"),
    ]
)
from langchain.chains import LLMChain

mail_chain = LLMChain(llm=openai_chat, 
                      prompt=mail_template,
                      verbose=True)

第二步

需要通过一个字典来映射每个路由目标链,其中字典的键是预设的关键字,值则是对应的`LLMChain`实例。

destination_chains = {

    "weather": weather_chain,

    "mail":mail_chain

}

第三步

接下来,详细说明每个预设关键字及其对应的`LLMChain`的功能:`weather`关键字用于处理天气相关的查询,而`mail`关键字则用于管理邮件的收发操作。 

destinations = ['weather: 用于回答天气问题', 'mail: 用于执行邮件的收发']

 第四步 构建路由系统的提示模版

然后,类似于我们在《Ch.13 Qwen模型的ReAct原理介绍及流程拆解,进行外部工具API调用开发实践》中介绍的:`ReAct`通过思维链(CoT)的形式引导大模型进入思考过程从而执行外部工具的识别。对于链路的路由来说,也是采取相似的策略,这里可以使用特定的提示模板来引导大模型进入思考如何选择合适的链路的过程。而这个路由的提示模版,LangChain中给出了一个解决方案: 

 翻译成中文

MULTI_PROMPT_ROUTER_TEMPLATE = """\
给定一个原始文本输入到大语言模型,请选择最适合该输入的大模型提示模版。\
您将获得可用提示的名称和对于该提示最适合什么的描述。\
如果您认为修改原始输入最终会导致语言模型的更好响应,您也可以对原始输入进行修改。

<< FORMATTING >>
返回一个Markdown代码片段,其中包含一个格式化如下的JSON对象:
```json
{
  
  {
  
  {
  
  {
    "destination": string \\ 使用的提示名称或就使用默认,即 "DEFAULT"
    "next_inputs": string \\ 可能修改过的原始输入版本
}}}}
```

记住:"destination" 必须是下面指定的候选提示名称之一,或者如果输入不适合任何候选提示,可以是 "DEFAULT"。
记住:"next_inputs" 如果您认为不需要任何修改,可以是原始输入。

<< CANDIDATE PROMPTS >>
{destinations}

<< INPUT >>
{
  
  {input}}

<< OUTPUT (必须在响应的开始处包含 ```json) >>
<< OUTPUT (必须以 ``` 结束) >>
"""

构建好了提示模版后,我们需要把已经定义好的`destinations`变量传递进去,代码如下:

# 使用join方法将列表转化为字符串,每个元素之间用换行符分隔
destinations_str = "\n".join(destinations)

# 根据MULTI_PROMPT_ROUTER_TEMPLATE格式化字符串和destinations_str创建路由模板
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations=destinations_str)

print(router_template)

接下来构建真正的提示模版,这里有两个关键点:

1. `MULTI_PROMPT_ROUTER_TEMPLATE`为字符串形式,所以需要使用`PromptTemplate`进行格式化,这与llm还是chat model无关;

2. 需要配置输出解析器(OutPut Parser)为`RouterOutputParser()`;

from langchain.prompts import PromptTemplate
from langchain.chains.router.llm_router import RouterOutputParser

router_prompt = PromptTemplate(template=router_template, 
                               input_variables=["input"], 
                               output_parser=RouterOutputParser())

第五步  实例化路由链路

紧接着,使用`LLMRouterChain`来实例化路由链。

# 使用上述路由模板和llm对象创建LLMRouterChain对象
router_chain = LLMRouterChain.from_llm(openai_chat, 
                                       router_prompt, 
                                       verbose=True)

router_chain.invoke({"input":"这是我刚才得到的天气数据%s,我适合出去玩吗?" % data })

根据输入内容,返回的`destination`字段会在路由系统中进行匹配,以确定是否存在可执行相应需求的`LLMChain`。当提出天气相关的询问时,`destination`字段的值会被设定为`weather`;而针对邮件收发的需求,该值则为`mail`。如果输入的内容既不涉及天气也不关于邮件收发,`destination`的值则为`None`,这意味着没有任何一个路由链中的`LLMChain`需要被执行。 

第六步实例化路由系统的统一入口 

实现至此,最后我们通过`MultiPromptChain`,实例化出最终的路由系统的统一入口,包含路由链,目标链和默认链。其中默认链,用来执行不需要进入LLMChain中的问题,即处理上面输入的内容既不涉及天气也不关于邮件收发的情况。代码如下: 

 


http://www.kler.cn/a/530582.html

相关文章:

  • css三角图标
  • python算法和数据结构刷题[5]:动态规划
  • Cmake学习笔记
  • DeepSeek 介绍及对外国的影响
  • Baklib赋能企业提升内容中台构建效率的全新路径解析
  • elasticsearch8.15 高可用集群搭建(含认证Kibana)
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.5 高级索引应用:图像处理中的区域提取
  • 【Block总结】完全注意力Fully Attentional,同时捕捉空间和通道的注意力|即插即用
  • 我问了DeepSeek和ChatGPT关于vue中包含几种watch的问题,它们是这么回答的……
  • MiniQMT与QMT:量化交易软件的对比分析
  • C语言------二维数组指针从入门到精通
  • 一文了解阿里的 Qwen2.5 模型
  • 79-《袋鼠花》
  • Java知识速记:栈和堆
  • Java synchronized的实现原理?
  • 问题的价值 ( Value of Question ) 公式
  • Games202Lecture5 Real time Environment mapping实时环境光照
  • ADC及DMA的使用原理和使用过程
  • 详细介绍:使用 Axios 上传图片文件
  • ESP32 Wroom (无串口芯片的简版C3) 烧录
  • 攻防世界 fileclude
  • 基于springboot+vue的哈利波特书影音互动科普网站
  • AMD架构简单读书笔记1
  • WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载
  • 位运算算法题
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.13 零拷贝技巧:as_strided的魔法与风险