LLMChain使用 | RouterChain的使用 - 用本地大模型搭建多Agents

单个本地大模型搭建参考博客

  • 单个Chain:面对一个需求,我们需要创建一个llmchain,设置一个prompt模板,这个chain能够接收一个用户input,并输出一个结果;
  • 多个Chain:考虑到同时面对多个需求,我们需要设置多个Chain。
    Router Chain往往会配合下游的destination chain一起使用,成为“一个网关路由+多个下子链”的架构,实现根据用户输入,自动路由到最相关的下游chain
    在这里插入图片描述

下图中是一个RouterChian使用场景的示意图,我们可以看到,一个RouterChain连接了多个下游的子链,每个链都是一个小应用,当RouterChain接收用户的输入,其可以根据用户输入路由到和输入最相关的子链上,并由子链产生输出;

例如,用户输入是“请帮我写一首诗”,当RouterChain接收后,会自动路由到“诗人”这个子链,由它来输出结果。

在这里插入图片描述

2.RouterChain构成

根据Langchain的介绍,标准的RouterChain应用应包含两个标准组成部分:

  1. 路由链RouterChain:其本身就是一个chain应用,能够根据用户输入进行下游子链的选择;Langchain框架提供了多种RouterChain,其中着重介绍了LLMRouterChainEmbeddingRouterChain两种:
    • LLMRouterChain 将用户输入放进大语言模型,通过Prompt的形式让大语言模型来进行路由
    • EmbeddingRouterChain 通过向量搜索的方式,将用户输入
  2. 子链DestinationChain:直译为目标链,即可路由到的链,按照上图,我们会存在4个目标链,分别是lawyer chain,sales chain,english teacher chain 和 poet chain

3.MultiPromptChain构成

MultiPromptChain应用应包含两个标准组成部分

  • router_chain:接收一个RouterChain实例,作为路由链进行路由
    default_chain:接收一个LLMChain实例,当Router Chain无法找到合适的下游子链时,会自动路由到的默认链,可以认为是一个兜底备选链
  • destination_chains:接收一个Mapping[str, LLMChain] 字典,key为可以路由到的destination chain的名称,value为该destination chain的LLMChain实例

此外,还有其他主要的可选参数:

  • memory: 接收一个BaseMemory实例,能为路由链添加上下文记忆
  • verbose: bool值,若为True则会打印该链的调用过程

4.代码示例

下面我们以“园丁” 和 “插花大师”为例,子链DestinationChain分别是 园丁的chain插花大师的chain

《代码流程》
1.【Step1】初始化语言模型("qwen:7b")
2.【Step2】构建提示信息(json格式),包括:key、description 和 template
- 【Step2.1】构建两个场景的模板
- 【Step2.2】构建提示信息
3.【Step3】构建目标链chain_map(json格式),以提示信息prompt_infos中的key为key,以Chain为value
4.【Step4】构建路由链router_chain
5.【Step5】构建默认链 default_chain 
6.【Step6】构建多提示链 MultiPromptChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RounterTemplate## 【Step1】初始化语言模型
# from langchain.llms import OpenAI
# llm = OpenAI()
# llm = AzureChatOpenAI(deployment_name="GPT-4", temperature=0)ollama_llm = Ollama(model="qwen:7b")## 【Step2】构建提示信息(json格式),包括:key、description 和 template
# 【Step2.1】构建两个场景的模板
flower_care_template = """
你是一个经验丰富的园丁,擅长解答关于养花育花的问题。
下面是需要你来回答的问题:
{input}
"""flower_deco_template = """
你是一位网红插花大师,擅长解答关于鲜花装饰的问题。
下面是需要你来回答的问题:
{input}
"""# 【Step2.2】构建提示信息
prompt_infos = [{"key": "flower_care","description": "适合回答关于鲜花护理的问题","template": flower_care_template,},{"key": "flower_decoration","description": "适合回答关于鲜花装饰的问题","template": flower_deco_template,}
]## 【Step3】构建目标链chain_map(json格式),以提示信息prompt_infos中的key为key,以Chain为value
chain_map = {}for info in prompt_infos:prompt = PromptTemplate(template=info['template'],input_variables=["input"])print("目标提示:\n", prompt)chain = LLMChain(llm=ollama_llm,prompt=prompt,verbose=True)chain_map[info["key"]] = chain## 【Step4】构建路由链router_chain
destinations = [f"{p['key']}: {p['description']}" for p in prompt_infos]
router_template = RounterTemplate.format(destinations="\n".join(destinations))
print("路由模板:\n", router_template)router_prompt = PromptTemplate(template=router_template,input_variables=["input"],output_parser=RouterOutputParser(),
)
print("路由提示:\n", router_prompt)router_chain = LLMRouterChain.from_llm(ollama_llm,router_prompt,verbose=True
)## 【Step5】构建默认链 default_chain 
from langchain.chains import ConversationChain
default_chain = ConversationChain(llm=ollama_llm,output_key="text",verbose=True
)## 【Step6】构建多提示链 MultiPromptChain
from langchain.chains.router import MultiPromptChainchain = MultiPromptChain(router_chain=router_chain,destination_chains=chain_map,default_chain=default_chain,verbose=True
)# 测试1
print(chain.run("如何为玫瑰浇水?"))

【参考链接】

  1. 【LangChain系列 31】Chains——基础链:LLMChain和RouterChain
  2. Langchain Chain - RouterChain 根据输入相关性进行路由的路由链
  3. 精华笔记:吴恩达 x LangChain《基于LangChain的大语言模型应用开发》(上)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484869.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue保留用户在列表的操作记录, beforeRouteLeave离开当前组件缓存数据即可

最近遇到一个需求,用户在列表页的查询输入框输入条件后,点击查询,然后此时切换菜单,再回到之前的页面,希望能停留在上一次输入的结果上,如下例子,用户管理页面,输入yangfan这个关键词搜索后,结果如下图: 当我此时点击权限管理后,再点击用户管理切回来,结果依旧如上…

【Webpack】处理字体图标和音视频资源

处理字体图标资源 1. 下载字体图标文件 打开阿里巴巴矢量图标库open in new window选择想要的图标添加到购物车,统一下载到本地 2. 添加字体图标资源 src/fonts/iconfont.ttf src/fonts/iconfont.woff src/fonts/iconfont.woff2 src/css/iconfont.css 注意字体…

用 Python 自动化处理无聊的事情

“编程最棒的部分就是看到机器做一些有用的事情而获得的胜利。用 Python 将无聊的事情自动化将所有编程视为这些小小的胜利;它让无聊变得有趣。” Hilary Mason,数据科学家兼 Fast Forward Labs 创始人 “我很享受打破东西然后把它们重新组合起来的乐趣…

Studio One 6免费下载安装激活教程

一、Studio One 6安装 1.双击Studio One6安装包(见文章尾部),如下图,可以切换语言,点击【OK】。 2.根据安装导航,点击【下一步】 3.阅读许可证协议后,点击【我接受】。 4.选择安装位置&#xf…

【C++】STL容器之string(一)

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

SQL注入漏洞解析--less-2

首先我们进入第二关 思路: 1.先判断是什么类型的注入 2.根据类型我们在找注入点 步骤: 1.提示我们输入id数字,那我们先输入1猜一下 2.这里正常回显,当我们后边加上时可以看到报错,且报错信息看不到数字&#xff0…

五、使用脚手架

五、使用脚手架 5.1 简单的实现 创建一个 School 组件 <template> <div><h2>学校名称&#xff1a;{{name}}</h2><h2>学校地址&#xff1a;{{address}}</h2> </div> </template><script> export default {name: "S…

想高薪就业鸿蒙HarmonyOS 开发岗位,到底该学习些啥?

鸿蒙是什么&#xff1f; 经过十多年的发展&#xff0c;传统移动互联网的增长红利已渐见顶。万物互联时代正在开启&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿 IoT 设备。GSMA 预测到 2025 年&#xff0c;全球物联网终端连接数量将达 246 亿个&#xff0c;其中消费物…

CSP-J 2023 T3 一元二次方程

文章目录 题目题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题目传送门题解思路总代码 提交结果尾声 题目 题目背景 众所周知&#xff0c;对一元二次方程 a x 2 b x c 0 , ( a ≠ 0 ) ax ^ 2 bx c 0, (a \neq 0) ax2bxc0,(a0)&#xff0c;可…

React 事件处理 ( this问题 参数传递 ref)

React事件的命名采用小驼峰方式&#xff08;cameCase&#xff09;,而不是小写 使用JSX语法时你需要传入一个函数作为事件处理函数&#xff0c;而不是一个字符串 你不能通过返回false 的方式阻止默认行为。你必须显示式的使用preventDefault 1 this 需要谨慎对待JSX回调函数中的…

HubSpot数据驱动的网站优化策略

当涉及到HubSpot数据驱动的网站优化策略时&#xff0c;下面是一些具体且详细的描述&#xff1a; 1. 数据收集与分析&#xff1a; HubSpot提供了一系列数据收集和分析工具&#xff0c;让客户能够深入了解外贸网站的表现。这些工具包括网站分析、访客追踪、转化追踪等。客户可以…

【刷题】牛客 JZ64 求1+2+3+...+n

刷题 题目描述思路一 &#xff08;暴力递归版&#xff09;思路二 &#xff08;妙用内存版&#xff09;思路三 &#xff08;快速乘法版&#xff09;思路四 &#xff08;构造巧解版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01…